Sophie

Sophie

distrib > Fedora > 18 > x86_64 > by-pkgid > 110492f5122731329f0db69a1df590c3 > files > 1450

kdepimlibs-apidocs-4.10.5-1.fc18.noarch.rpm

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
<head>
  <title>Integration in your Application</title>
<style type="text/css">
  .cp-doNotDisplay { display: none; }
  @media aural, braille, handheld, tty { .cp-doNotDisplay { display: inline; speak: normal; }}
  .cp-edit { text-align: right; }
  @media print, embossed { .cp-edit { display: none; }}
</style>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  <meta http-equiv="Content-Style-Type" content="text/css" />
  <link rel="meta" href="http://www.kde.org/labels.rdf" type="application/rdf+xml" title="ICRA labels" />
  <meta name="trademark" content="KDE e.V." />
  <meta name="description" content="K Desktop Environment Homepage, KDE.org" />
  <meta name="MSSmartTagsPreventParsing" content="true" />
  <meta name="robots" content="all" />
  <meta name="no-email-collection" content="http://www.unspam.com/noemailcollection" />
  <script type="text/javascript" src="jquery.js"></script>
  <script type="text/javascript" src="dynsections.js"></script>
  <link rel="shortcut icon" href="../../favicon.ico" /><link rel="icon" href="../../favicon.ico" />
  <link rel="stylesheet" media="screen" type="text/css" title="KDE Colors" href="../../kde.css" />
  <link rel="stylesheet" media="print, embossed" type="text/css" href="../../print.css" />
  <link rel="stylesheet" media="screen, aural, handheld, tty, braille" type="text/css" title="Flat" href="../../flat.css" />
  <link rel="stylesheet" type="text/css" href="../../doxygen.css" />
  <link rel="stylesheet" type="text/css" href="../../tabs.css" />
</head>
<body>
<ul class="cp-doNotDisplay">
  <li><a href="#cp-content" accesskey="2">Skip to content</a></li>
  <li><a href="#cp-menu" accesskey="5">Skip to link menu</a></li>
</ul>
<div id="container">
<div id="header">
  <div id="header_top"><div><div>
    <img alt ="" src="../../top-kde.jpg"/>
    </div></div></div>
  <div id="header_bottom">
    <div id="location">
      <ul>
        <li><a href="http://api.kde.org">KDE API Reference</a></li>
        <li><a href="../../index.html">kdepimlibs-4.10.5 API Reference</a></li>
      </ul>
    </div>
    <div id="menu">
<ul>
<li><a href="http://www.kde.org/">KDE Home</a></li>
<li><a href="http://kde.org/contact/">Contact Us</a></li>
</ul>
</div>
</div>
</div>
<!-- End page header -->
    <div id="body_wrapper">
      <div id="body">
        <!-- begin main content -->
        <div id="right">
          <div class="content">
          <div id="main">
            <div class="clearer">&nbsp;</div>
<h2><a name="content"></a>akonadi</h2>
<!-- BC -->
<div id="top">
<!-- Generated by Doxygen 1.8.3.1 -->
</div><!-- top -->
<div class="header">
  <div class="headertitle">
<div class="title">Integration in your Application </div>  </div>
</div><!--header-->
<div class="contents">
<div class="textblock"><p><a class="el" href="classAkonadi_1_1Control.html" title="Provides methods to control the Akonadi server process.">Akonadi::Control</a> provides ways to ensure that the <a class="el" href="namespaceAkonadi.html" title="FreeBusyManager::Singleton.">Akonadi</a> server is running, to monitor its availability and provide help on server-side errors.</p>
<p>A more low-level interface to the <a class="el" href="namespaceAkonadi.html" title="FreeBusyManager::Singleton.">Akonadi</a> server is provided by <a class="el" href="classAkonadi_1_1ServerManager.html" title="Provides methods to control the Akonadi server process.">Akonadi::ServerManager</a>.</p>
<p>A set of standard actions is provided by <a class="el" href="classAkonadi_1_1StandardActionManager.html" title="Manages generic actions for collection and item views.">Akonadi::StandardActionManager</a>. These provide consistent look and feel across applications.</p>
<p>This library provides classes for KDE applications to communicate with the <a class="el" href="namespaceAkonadi.html" title="FreeBusyManager::Singleton.">Akonadi</a> server. The most high-level interface to <a class="el" href="namespaceAkonadi.html" title="FreeBusyManager::Singleton.">Akonadi</a> is the Models and Views provided in this library. Ready to use models are provided for use with views to interact with a tree of collections, a list of items in a collection, or a combined tree of Collections and items.</p>
<p>In the <a class="el" href="namespaceAkonadi.html" title="FreeBusyManager::Singleton.">Akonadi</a> concept, Items are individual objects of PIM data, e.g. emails, contacts, events, notes etc. The data in an item is stored in a typed payload. For example, if an <a class="el" href="namespaceAkonadi.html" title="FreeBusyManager::Singleton.">Akonadi</a> Item holds a contact, the contact is available as a KABC::Addressee:</p>
<div class="fragment"><div class="line"><span class="keywordflow">if</span> (item.hasPayload&lt;KABC::Addressee&gt;())</div>
<div class="line">{</div>
<div class="line">  KABC::Addressee addr = item.payload&lt;KABC::Addressee&gt;();</div>
<div class="line">  <span class="comment">// use addr in some way...</span></div>
<div class="line">}</div>
</div><!-- fragment --><p>Additionally, an Item must have a mimetype which corresponds to the type of payload it holds.</p>
<p>Collections are simply containers of Items. A Collection has a name and a list of mimetypes that it may contain. A collection may for example contain events if it can contain the mimetype 'text/calendar'. A Collection itself (as opposed to its contents) has a mimetype, which is the same for all Collections. A Collection which can itself contain Collections must be able to contain the Collection mimetype.</p>
<div class="fragment"><div class="line">Collection col;</div>
<div class="line"><span class="comment">// This collection can contain events and nested collections.</span></div>
<div class="line">col.setContentMimetypes( QStringList() &lt;&lt; Collection::mimeType() &lt;&lt; <span class="stringliteral">&quot;text/calendar&quot;</span> );</div>
</div><!-- fragment --><p>This system makes it simple to create PIM applications. For example, to create an application for viewing and editing events, you simply need to tell Akonadi to retrieve all items matching the mimetype 'text/calendar'.</p>
<p>In order to avoid typos, improve readability, and to encapsulate the correct mimetypes for particular pim items, many of the standard classes have an accessor for the kind of mimetype the can handle. For example, you can use KMime::Message::mimeType() for emails, KABC::Addressee::mimeType() for contacts etc. It makes sense to define a similar static function in your own types.</p>
<div class="fragment"><div class="line">col.setContentMimetypes( QStringList() &lt;&lt; Collection::mimeType() &lt;&lt; KABC::Addressee::mimeType() &lt;&lt; KMime::Message::mimeType() );</div>
</div><!-- fragment --><h2>Models and Views</h2>
<p>Akonadi models and views are a high level way to interact with the Akonadi server. Most applications will use these classes. See the EntityTreeModel documentation for more information.</p>
<p>Models provide an interface for viewing, deleting and moving Items and Collections. New Items can also be created by dropping data of the appropriate type on a model. Additionally, the models are updated automatically if another application changes the data or inserts or deletes items etc.</p>
<p>Akonadi provides several models for particular uses, e.g. the MailModel is used for emails and the ContactsModel is used for showing contacts. Additional specific models can be implemented using EntityTreeModel as a base class.</p>
<p>A typical use of these would be to create a model and use proxy models to make the view show different parts of the model. For example, show a collection tree in on one side and show items in a selected collection in another view.</p>
<div class="fragment"><div class="line">mailModel = <span class="keyword">new</span> MailModel( session, monitor, <span class="keyword">this</span>);</div>
<div class="line"></div>
<div class="line">collectionTree = <span class="keyword">new</span> EntityMimeTypeFilterModel(<span class="keyword">this</span>);</div>
<div class="line">collectionTree-&gt;setSourceModel(mailModel);</div>
<div class="line"><span class="comment">// Filter out everything that is not a collection.</span></div>
<div class="line">collectionTree-&gt;addMimeTypeInclusionFilter( Collection::mimeType() );</div>
<div class="line">collectionTree-&gt;setHeaderSet(EntityTreeModel::CollectionTreeHeaders);</div>
<div class="line"></div>
<div class="line">collectionView = <span class="keyword">new</span> EntityTreeView(<span class="keyword">this</span>);</div>
<div class="line">collectionView-&gt;setModel(collectionTree);</div>
<div class="line"></div>
<div class="line">itemList = <span class="keyword">new</span> EntityMimeTypeFilterModel(<span class="keyword">this</span>);</div>
<div class="line">itemList-&gt;setSourceModel(mailModel);</div>
<div class="line"><span class="comment">// Filter out collections</span></div>
<div class="line">itemList-&gt;addMimeTypeExclusionFilter( Collection::mimeType() );</div>
<div class="line">itemList-&gt;setHeaderSet(EntityTreeModel::ItemListHeaders);</div>
<div class="line"></div>
<div class="line">itemView = <span class="keyword">new</span> EntityTreeView(<span class="keyword">this</span>);</div>
<div class="line">itemView-&gt;setModel(itemList);</div>
</div><!-- fragment --><div class="image">
<img src="mailmodelapp.png" alt="mailmodelapp.png"/>
<div class="caption">
An email application using MailModel</div></div>
<p> The content of the model is determined by the configuration of the Monitor passed into it. The examples below show a use of the EntityTreeModel and some proxy models for a simple heirarchical note collection. As the model is generic, the configuration and proxy models will also work with any other mimetype.</p>
<div class="fragment"><div class="line"><span class="comment">// Configure what should be shown in the model:</span></div>
<div class="line">Monitor *monitor = <span class="keyword">new</span> Monitor( <span class="keyword">this</span> );</div>
<div class="line">monitor-&gt;fetchCollection( <span class="keyword">true</span> );</div>
<div class="line">monitor-&gt;setItemFetchScope( scope );</div>
<div class="line">monitor-&gt;setCollectionMonitored( Collection::root() );</div>
<div class="line">monitor-&gt;setMimeTypeMonitored( MyEntity::mimeType() );</div>
<div class="line"></div>
<div class="line">Session *session = <span class="keyword">new</span> Session( QByteArray( <span class="stringliteral">&quot;MyEmailApp-&quot;</span> ) + QByteArray::number( qrand() ), <span class="keyword">this</span> );</div>
<div class="line">monitor-&gt;setSession(session);</div>
<div class="line"></div>
<div class="line">EntityTreeModel *entityTree = <span class="keyword">new</span> <a class="code" href="classAkonadi_1_1EntityTreeModel.html" title="A model for collections and items together.">Akonadi::EntityTreeModel</a>(monitor, <span class="keyword">this</span>);</div>
</div><!-- fragment --><div class="image">
<img src="entitytreemodel.png" alt="entitytreemodel.png"/>
<div class="caption">
A plain EntityTreeModel in a view</div></div>
<p> The EntityTreeModel can be further configured for certain behaviours such as fetching of collections and items.</p>
<p>To create a model of only a collection tree and no items, set that in the model. This is just like CollectionModel:</p>
<div class="fragment"><div class="line">entityTree-&gt;setItemPopulationStrategy(EntityTreeModel::NoItemPopulation);</div>
</div><!-- fragment --><div class="image">
<img src="entitytreemodel-collections.png" alt="entitytreemodel-collections.png"/>
<div class="caption">
A plain EntityTreeModel which does not fetch items.</div></div>
<p> Or, create a model of only items and not child collections. This is just like ItemModel:</p>
<div class="fragment"><div class="line">entityTree-&gt;setRootCollection(myCollection);</div>
<div class="line">entityTree-&gt;setCollectionFetchStrategy(EntityTreeModel::FetchNoCollections);</div>
</div><!-- fragment --><p>Or, to create a model which includes items and first level collections:</p>
<div class="fragment"><div class="line">entityTree-&gt;setCollectionFetchStrategy(EntityTreeModel::FetchFirstLevelCollections);</div>
</div><!-- fragment --><p>The items in the model can also be inserted lazily for performance reasons. The Collection tree is always built immediately.</p>
<p>Additionally, a KDescendantsProxyModel may be used to alter how the items in the tree are presented.</p>
<div class="fragment"><div class="line"><span class="comment">// ... Create an entityTreeModel</span></div>
<div class="line">KDescendantsProxyModel *descProxy = <span class="keyword">new</span> KDescendantsProxyModel(<span class="keyword">this</span>);</div>
<div class="line">descProxy-&gt;setSourceModel(entityTree);</div>
<div class="line">view-&gt;setModel(descProxy);</div>
</div><!-- fragment --><div class="image">
<img src="descendantentitiesproxymodel.png" alt="descendantentitiesproxymodel.png"/>
<div class="caption">
A KDescendantsProxyModel wrapping an EntityTreeModel</div></div>
<p> KDescendantsProxyModel can also display ancestors of each Entity in the list.</p>
<div class="fragment"><div class="line"><span class="comment">// ... Create an entityTreeModel</span></div>
<div class="line">KDescendantsProxyModel *descProxy = <span class="keyword">new</span> KDescendantsProxyModel(<span class="keyword">this</span>);</div>
<div class="line">descProxy-&gt;setSourceModel(entityTree);</div>
<div class="line"></div>
<div class="line"><span class="comment">// #### This is new</span></div>
<div class="line">descProxy-&gt;setDisplayAncestorData(<span class="keyword">true</span>, QString(<span class="stringliteral">&quot; / &quot;</span>));</div>
<div class="line"></div>
<div class="line">view-&gt;setModel(descProxy);</div>
</div><!-- fragment --><div class="image">
<img src="descendantentitiesproxymodel-withansecnames.png" alt="descendantentitiesproxymodel-withansecnames.png"/>
<div class="caption">
A DescendantEntitiesProxyModel with ancestor names.</div></div>
<p> This proxy can be combined with a filter to for example remove collections.</p>
<div class="fragment"><div class="line"><span class="comment">// ... Create an entityTreeModel</span></div>
<div class="line">DescendantEntitiesProxyModel *descProxy = <span class="keyword">new</span> DescendantEntitiesProxyModel(<span class="keyword">this</span>);</div>
<div class="line">descProxy-&gt;setSourceModel(entityTree);</div>
<div class="line"></div>
<div class="line"><span class="comment">// #### This is new.</span></div>
<div class="line">EntityMimeTypeFilterModel *filterModel = <span class="keyword">new</span> EntityMimeTypeFilterModel(<span class="keyword">this</span>);</div>
<div class="line">filterModel-&gt;setSourceModel(descProxy);</div>
<div class="line">filterModel-&gt;setExclusionFilter(QStringList() &lt;&lt; Collection::mimeType());</div>
<div class="line"></div>
<div class="line">view-&gt;setModel(filterModel);</div>
</div><!-- fragment --><div class="image">
<img src="descendantentitiesproxymodel-colfilter.png" alt="descendantentitiesproxymodel-colfilter.png"/>
<div class="caption">
An EntityMimeTypeFilterModel wrapping a DescendantEntitiesProxyModel wrapping an EntityTreeModel</div></div>
<p> It is also possible to show the root item as part of the selectable model:</p>
<div class="fragment"><div class="line">entityTree-&gt;setIncludeRootCollection(<span class="keyword">true</span>);</div>
</div><!-- fragment --><div class="image">
<img src="entitytreemodel-showroot.png" alt="entitytreemodel-showroot.png"/>
<div class="caption">
An EntityTreeModel showing Collection::root</div></div>
<p> By default the displayed name of the root collection is '[*]', because it doesn't require i18n, and is generic. It can be changed too.</p>
<div class="fragment"><div class="line">entityTree-&gt;setIncludeRootCollection(<span class="keyword">true</span>);</div>
<div class="line">entityTree-&gt;setRootCollectionDisplayName(i18nc(<span class="stringliteral">&quot;Name of top level for all collections in the application&quot;</span>, <span class="stringliteral">&quot;[All]&quot;</span>))</div>
</div><!-- fragment --><div class="image">
<img src="entitytreemodel-showrootwithname.png" alt="entitytreemodel-showrootwithname.png"/>
<div class="caption">
An EntityTreeModel showing Collection::root with an application specific name.</div></div>
<p> These can of course be combined to create an application which uses one EntityTreeModel along with several proxies and views.</p>
<div class="fragment"><div class="line"><span class="comment">// ... create an EntityTreeModel.</span></div>
<div class="line">EntityMimeTypeFilterModel *collectionTree = <span class="keyword">new</span> EntityMimeTypeFilterModel(<span class="keyword">this</span>);</div>
<div class="line">collectionTree-&gt;setSourceModel(entityTree);</div>
<div class="line"><span class="comment">// Filter to include collections only:</span></div>
<div class="line">collectionTree-&gt;setInclusionFilter(QStringList() &lt;&lt; Collection::mimeType());</div>
<div class="line">EntityTreeView *treeView = <span class="keyword">new</span> EntityTreeView(<span class="keyword">this</span>);</div>
<div class="line">treeView-&gt;setModel(collectionTree);</div>
<div class="line"></div>
<div class="line">EntityMimeTypeFilterModel *itemList = <span class="keyword">new</span> EntityMimeTypeFilterModel(<span class="keyword">this</span>);</div>
<div class="line">itemList-&gt;setSourceModel(entityTree);</div>
<div class="line"><span class="comment">// Filter *out* collections</span></div>
<div class="line">itemList-&gt;setExclusionFilter(QStringList() &lt;&lt; Collection::mimeType());</div>
<div class="line">EntityTreeView *listView = <span class="keyword">new</span> EntityTreeView(<span class="keyword">this</span>);</div>
<div class="line">listView-&gt;setModel(itemList);</div>
</div><!-- fragment --><div class="image">
<img src="treeandlistapp.png" alt="treeandlistapp.png"/>
<div class="caption">
A single EntityTreeModel with several views and proxies.</div></div>
<p> Or to also show items of child collections in the list:</p>
<div class="fragment"><div class="line"><span class="comment">// ... Create an entityTreeModel</span></div>
<div class="line">collectionTree = <span class="keyword">new</span> EntityMimeTypeFilterModel(<span class="keyword">this</span>);</div>
<div class="line">collectionTree-&gt;setSourceModel(entityTree);</div>
<div class="line"></div>
<div class="line"><span class="comment">// Include only collections in this proxy model.</span></div>
<div class="line">collectionTree-&gt;addMimeTypeInclusionFilter( Collection::mimeType() );</div>
<div class="line"></div>
<div class="line">treeview-&gt;setModel(collectionTree);</div>
<div class="line"></div>
<div class="line">descendedList = <span class="keyword">new</span> DescendantEntitiesProxyModel(<span class="keyword">this</span>);</div>
<div class="line">descendedList-&gt;setSourceModel(entityTree);</div>
<div class="line"></div>
<div class="line">itemList = <span class="keyword">new</span> EntityMimeTypeFilterModel(<span class="keyword">this</span>);</div>
<div class="line">itemList-&gt;setSourceModel(descendedList);</div>
<div class="line"></div>
<div class="line"><span class="comment">// Exclude collections from the list view.</span></div>
<div class="line">itemList-&gt;addMimeTypeExclusionFilter( Collection::mimeType() );</div>
<div class="line"></div>
<div class="line">listView = <span class="keyword">new</span> EntityTreeView(<span class="keyword">this</span>);</div>
<div class="line">listView-&gt;setModel(itemList);</div>
</div><!-- fragment --><div class="image">
<img src="treeandlistappwithdesclist.png" alt="treeandlistappwithdesclist.png"/>
<div class="caption">
Showing descendants of all Collections in the list</div></div>
<p> Note that it is important in this case to use the DescendantEntitesProxyModel before the EntityMimeTypeFilterModel. Otherwise, by filtering out the collections first, you would also be filtering out their child items.</p>
<p>A SelectionProxyModel can be used to simplify managing selection in one view through multiple proxy models to a representation in another view. The selectionModel of the initial view is used to create a proxied model which includes only the selected indexes and their children.</p>
<div class="fragment"><div class="line"><span class="comment">// ... Create an entityTreeModel</span></div>
<div class="line">collectionTree = <span class="keyword">new</span> EntityMimeTypeFilterModel(<span class="keyword">this</span>);</div>
<div class="line">collectionTree-&gt;setSourceModel(entityTree);</div>
<div class="line"></div>
<div class="line"><span class="comment">// Include only collections in this proxy model.</span></div>
<div class="line">collectionTree-&gt;addMimeTypeInclusionFilter( Collection::mimeType() );</div>
<div class="line"></div>
<div class="line">treeview-&gt;setModel(collectionTree);</div>
<div class="line"></div>
<div class="line"><span class="comment">// SelectionProxyModel can handle complex selections:</span></div>
<div class="line">treeview-&gt;setSelectionMode(QAbstractItemView::ExtendedSelection);</div>
<div class="line"></div>
<div class="line">SelectionProxyModel *selProxy = <span class="keyword">new</span> SelectionProxyModel(treeview-&gt;selectionModel(), <span class="keyword">this</span>);</div>
<div class="line">selProxy-&gt;setSourceModel(entityTree);</div>
<div class="line"></div>
<div class="line">EntityTreeView *selView = <span class="keyword">new</span> EntityTreeView(splitter);</div>
<div class="line">selView-&gt;setModel(selProxy);</div>
</div><!-- fragment --><div class="image">
<img src="selectionproxymodelsimpleselection.png" alt="selectionproxymodelsimpleselection.png"/>
<div class="caption">
A Selection in one view creating a model for use with another view.</div></div>
<p> The SelectionProxyModel can handle complex selections.</p>
<div class="image">
<img src="selectionproxymodelmultipleselection.png" alt="selectionproxymodelmultipleselection.png"/>
<div class="caption">
Non-contiguous selection creating a new simple model in a second view.</div></div>
<p> If an index and one or more of its descendants are selected, only the top-most selected index (including all of its descendants) are included in the proxy model. (Though this is configurable. See below)</p>
<div class="image">
<img src="selectionproxymodelmultipleselection-withdescendant.png" alt="selectionproxymodelmultipleselection-withdescendant.png"/>
<div class="caption">
Selecting an item and its descendant.</div></div>
<p> SelectionProxyModel allows configuration using the methods setStartWithChildTrees, setOmitDescendants, setIncludeAllSelected. See testapp/proxymodeltestapp to try out the 5 valid configurations.</p>
<p>Obviously, the SelectionProxyModel may be used in a view, or further processed with other proxy models. See the example_contacts application for example which uses a further DescendantEntitiesProxyModel and EntityMimeTypeFilterModel on top of a SelectionProxyModel.</p>
<p>The SelectionProxyModel orders its items in the same top-to-bottom order as they appear in the source model. Note that this order may be different to the order in the selection model if there is a QSortFilterProxyModel between the selection and the source model.</p>
<div class="image">
<img src="selectionproxymodel-ordered.png" alt="selectionproxymodel-ordered.png"/>
<div class="caption">
Ordered items in the SelectionProxyModel</div></div>
 <h2>Jobs and Monitors</h2>
<p>The lower level way to interact with <a class="el" href="namespaceAkonadi.html" title="FreeBusyManager::Singleton.">Akonadi</a> is to use Jobs and Monitors (This is what models use internally). Jobs are used to make changes to akonadi, and in some cases (e.g., a fetch job) emit a signal with data resulting from the job. A Monitor reports changes made to the data stored in <a class="el" href="namespaceAkonadi.html" title="FreeBusyManager::Singleton.">Akonadi</a> (e.g., creating, updating, deleting or moving an item or collection ) via signals.</p>
<p>Typically, an application will configure a monitor to report changes to a particular Collection, mimetype or resource, and then connect to the signals it emits.</p>
<p>Most applications will use some of the low level api for actions unrelated to a model-tree view, such as creating new items and collections.</p>
<h2>Tricky details</h2>
<h3>Change Conflicts</h3>
<p>It is possible that while an application is editing an item, that item gets updated in akonadi. <a class="el" href="namespaceAkonadi.html" title="FreeBusyManager::Singleton.">Akonadi</a> will notify the application that that item has changed via a Monitor signal. It is the responsibility of the application to handle the conflict by for example offering the user a dialog to resolve it. Alternatively, the application could ignore the dataChanged signal for that item, and will get another chance to resolve the conflict when trying to save the result back to akonadi. In that case, the ItemModifyJob will fail and report that the revision number of the item on the server differs from its revision number as reported by the job. Again, it is up to the application to handle this case.</p>
<p>This is something that every application using akonadi will have to handle.</p>
<h3>Using Entity::Id as an identifier</h3>
<p>Items and Collections have a id() member which is a unique identifier used by akonadi. It can be useful to use the id() as an identifier when storing Collections or Items.</p>
<p>However, as an item and a collection can have the same id(), if you need to store both Collections and Items together by a simple identifier, conflicts can occur.</p>
<div class="fragment"><div class="line">QString getRemoteIdById( Entity::Id <span class="keywordtype">id</span> )</div>
<div class="line">{</div>
<div class="line">  <span class="comment">// Note:</span></div>
<div class="line">  <span class="comment">// m_items is QHash&lt;Entity::Id, Item&gt;</span></div>
<div class="line">  <span class="comment">// m_collections is QHash&lt;Entity::Id, Collection&gt;</span></div>
<div class="line">  <span class="keywordflow">if</span> ( m_items.contains( <span class="keywordtype">id</span> ) )</div>
<div class="line">  {</div>
<div class="line">    <span class="comment">// Oops, we could accidentally match a collection here.</span></div>
<div class="line">    <span class="keywordflow">return</span> m_items.value( <span class="keywordtype">id</span> ).remoteId();</div>
<div class="line">  } <span class="keywordflow">else</span> <span class="keywordflow">if</span> ( m_collections.contains( <span class="keywordtype">id</span> ) )</div>
<div class="line">  {</div>
<div class="line">    <span class="keywordflow">return</span> m_collections.value( <span class="keywordtype">id</span> ).remoteId();</div>
<div class="line">  }</div>
<div class="line">  <span class="keywordflow">return</span> QString();</div>
<div class="line">}</div>
</div><!-- fragment --><p>In this case, it makes more sense to use a normal qint64 as the internal identifier, and use the sign bit to determine if the identifier refers to a Collection or an Item. This is done in the implementation of EntityTreeModel to tell Collections and Items apart.</p>
<div class="fragment"><div class="line">QString getRemoteIdByInternalIdentifier( qint64 internalIdentifier )</div>
<div class="line">{</div>
<div class="line">  <span class="comment">// Note:</span></div>
<div class="line">  <span class="comment">// m_items is QHash&lt;Entity::Id, Item&gt;</span></div>
<div class="line">  <span class="comment">// m_collections is QHash&lt;Entity::Id, Collection&gt;</span></div>
<div class="line"></div>
<div class="line">  <span class="comment">// If the id is negative, it refers to an Item</span></div>
<div class="line">  <span class="comment">// Otherwise it refers to a Collection.</span></div>
<div class="line"></div>
<div class="line">  <span class="keywordflow">if</span> ( internalIdentifier &lt; 0 )</div>
<div class="line">  {</div>
<div class="line">    <span class="comment">// Reverse the sign of the id before using it.</span></div>
<div class="line">    <span class="keywordflow">return</span> m_items.value( internalIdentifier * -1 ).remoteId();</div>
<div class="line">  } <span class="keywordflow">else</span></div>
<div class="line">  {</div>
<div class="line">    <span class="keywordflow">return</span> m_collections.value( internalIdentifier ).remoteId();</div>
<div class="line">  }</div>
<div class="line">}</div>
</div><!-- fragment --><h3>Unordered Lists</h3>
<p>Collection and Item both provide a ::List to represent groups of objects. However the objects in the list are usually not ordered in any particular way, even though the API provides methods to work with an ordered list. It makes more sense to think of it as a Set instead of a list in most cases.</p>
<p>For example, when using an ItemFetchJob to fetch the items in a collection, the items could be in any order when returned from the job. The order that a Monitor emits notices of changes is also indeterminate. By using a Transaction however, it is sometimes possible to retrieve objects in order. Additionally, using s constructor overload in the CollectionFetchJob it is possible to retrieve collections in a particular order.</p>
<div class="fragment"><div class="line">Collection::List getCollections(QList&lt;Collection::Id&gt; idsToGet)</div>
<div class="line">{</div>
<div class="line">  Collection::List getList;</div>
<div class="line">  <span class="keywordflow">foreach</span> ( Collection::Id <span class="keywordtype">id</span>, idsToGet ) {</div>
<div class="line">    getList &lt;&lt; Collection(<span class="keywordtype">id</span>);</div>
<div class="line">  }</div>
<div class="line">  CollectionFetchJob *job = CollectionFetchJob(getList);</div>
<div class="line">  <span class="keywordflow">if</span> (job-&gt;exec())</div>
<div class="line">  {</div>
<div class="line">     <span class="comment">// job-&gt;collections() is in the same order as the ids in idsToGet.</span></div>
<div class="line">  }</div>
<div class="line">}</div>
</div><!-- fragment --><h2>Resources</h2>
<p>The KDEPIM module includes resources for handling many types of PIM data, such as imap email, vcard files and vcard directories, ical event files etc. These cover many of the sources for your PIM data, but in the case that you need to use data from another source (for example a website providing a contacts storage service and an api), you simply have to write a new resource.</p>
<p><a href="http://techbase.kde.org/Development/Tutorials/Akonadi/Resources">http://techbase.kde.org/Development/Tutorials/Akonadi/Resources</a></p>
<h2>Serializers</h2>
<p>Serializers provide the functionality of converting raw data, for example from a file, to a strongly typed object of PIM data. For example, the addressee serializer reads data from a file and creates a KABC::Addressee object.</p>
<p>New serializers can also easily be written if the data you are dealing with is not one of the standard PIM data types.</p>
<h1>Implementation details</h1>
<h3>Updating <a class="el" href="namespaceAkonadi.html" title="FreeBusyManager::Singleton.">Akonadi</a> Models</h3>
<dl class="section note"><dt>Note</dt><dd>The details here are only relevant if you are writing a new view using EntityTreeModel, or writing a new model.</dd></dl>
<p>Because communication with akonadi happens asynchronously, and the models only hold a cached copy of the data on the akonadi server, some typical behaviours of models are not followed by <a class="el" href="namespaceAkonadi.html" title="FreeBusyManager::Singleton.">Akonadi</a> models.</p>
<p>For example, when setting data on a model via a view, most models syncronously update their internal store and notify akonadi to update its view of the data by returning <code>true</code>.</p>
<div align="center">
<img src="dot_inline_dotgraph_1.png" alt="dot_inline_dotgraph_1.png" border="0" usemap="#dot_inline_dotgraph_1.map"/>
<map name="dot_inline_dotgraph_1.map" id="dot_inline_dotgraph_1.map"></map>
</div>
<p><a class="el" href="namespaceAkonadi.html" title="FreeBusyManager::Singleton.">Akonadi</a> models only cache data from the akonadi server. To update data on an <a class="el" href="classAkonadi_1_1Entity.html" title="The base class for Item and Collection.">Akonadi::Entity</a> stored in a model, the model makes a request to the akonadi server to update the model data. At that point the data cached internally in the model is not updated, so <code>false</code> is always returned from setData. If the request to update data on the akonadi server is successful, an <a class="el" href="classAkonadi_1_1Monitor.html" title="Monitors an item or collection for changes.">Akonadi::Monitor</a> notifies the model that the data on that item has changed. The model then updates its internal data store and notifies the view that the data has changed. The details of how the Monitor communicates with akonadi are omitted for clarity.</p>
<div align="center">
<img src="dot_inline_dotgraph_2.png" alt="dot_inline_dotgraph_2.png" border="0" usemap="#dot_inline_dotgraph_2.map"/>
<map name="dot_inline_dotgraph_2.map" id="dot_inline_dotgraph_2.map"></map>
</div>
<p>Similarly, in drag and drop operations, most models would update an internal data store and return <code>true</code> from dropMimeData if the drop is successful.</p>
<div align="center">
<img src="dot_inline_dotgraph_3.png" alt="dot_inline_dotgraph_3.png" border="0" usemap="#dot_inline_dotgraph_3.map"/>
<map name="dot_inline_dotgraph_3.map" id="dot_inline_dotgraph_3.map"></map>
</div>
<p><a class="el" href="namespaceAkonadi.html" title="FreeBusyManager::Singleton.">Akonadi</a> models, for the same reason as above, always return false from dropMimeData. At the same time a suitable request is sent to the akonadi server to make the changes resulting from the drop (for example, moving or copying an entity, or adding a new entity to a collection etc). If that request is successful, the <a class="el" href="classAkonadi_1_1Monitor.html" title="Monitors an item or collection for changes.">Akonadi::Monitor</a> notifies the model that the data is changed and the model updates its internal store and notifies the view that the model data is changed.</p>
<div align="center">
<img src="dot_inline_dotgraph_4.png" alt="dot_inline_dotgraph_4.png" border="0" usemap="#dot_inline_dotgraph_4.map"/>
<map name="dot_inline_dotgraph_4.map" id="dot_inline_dotgraph_4.map"></map>
</div>
<h1><a class="anchor" id="lazy-model-population"></a>
Lazy Model Population</h1>
<dl class="section note"><dt>Note</dt><dd>This page is not part of the Akonadi API. It is provided as internal documentation for Akonadi maintainers. It was originally a blog post here: <a href="http://steveire.wordpress.com/2009/10/06/cache-invalidation-in-akonadi-models/">http://steveire.wordpress.com/2009/10/06/cache-invalidation-in-akonadi-models/</a> </dd></dl>
<p>If using EntityTreeModel::LazyPopulation with your model, items will be fetched into the model when the collection they are a part of is selected. This ensures that the model is as sparsely populated as possible for performance reasons. As a consequence however, it is necessary to purge unused items from the model too. This is handled automatically when using an <a class="el" href="classAkonadi_1_1SelectionProxyModel.html" title="A proxy model used to reference count selected Akonadi::Collection in a view.">Akonadi::SelectionProxyModel</a>.</p>
<p>The problem is knowing when to invalidate the cache. If no application is currently showing the contents of a Collection, there is no need for the Items in that Collection to be fetched, cached and kept up to date in the model. The effect we would like to achieve is to purge the Items in a Collection when those items are no longer shown anywhere in the application. Generally, that will mean that the Collection is not selected.</p>
<p>In Qt Model-View, the application data is stored in a model, and there may be one or more views attached to it displaying its contents. The model doesn’t have any knowledge of the views, and so it can’t know whether any particular Collection is selected, and purge its Iitems.</p>
<p>To solve this, we use the the KSelectionProxyModel, which already has a lot of code for managing the selection a user makes in a view. A subclass, <a class="el" href="classAkonadi_1_1SelectionProxyModel.html" title="A proxy model used to reference count selected Akonadi::Collection in a view.">Akonadi::SelectionProxyModel</a> implements a reference counting system which increments the refcount of a Collection when it is selected, and decrements it when deselected. If the reference count of a Collection goes down to zero, it is put in a queue to be purged. It is not purged immediately, but queued because if the user is clicking around several Collection in a short time, we don’t want to purge the Collections each click or we’d lose the benefit of the caching. Like other <a href="http://doc.trolltech.com/4.5/qobject.html#receivers">similar optimisation techniques</a>, this violates the object-oriented principle of modularity, but it is worth it for the benefit it brings. The effect can be seen in the akonadiconsole tool by not filtering out the items from the tree.</p>
<p>In the screenshots below I removed the filtering out of Items in the tree so that the fetching/purging can be seen. In real applications, the Items in the tree on the left would not be visible.</p>
<div class="image">
<img src="bufferedcaching1.png" alt="bufferedcaching1.png"/>
<div class="caption">
When a Collection is clicked, its Items are put into the model. The rest of the Collections have no items.</div></div>
 <div class="image">
<img src="bufferedcaching2.png" alt="bufferedcaching2.png"/>
<div class="caption">
The Inbox Collection is selected, so its items are fetched. Personal Contacts is no longer selected, so it is put into a queue to be purged.</div></div>
 <div class="image">
<img src="bufferedcaching3.png" alt="bufferedcaching3.png"/>
<div class="caption">
Select another Collection and its items are fetched too.</div></div>
 <div class="image">
<img src="bufferedcaching4.png" alt="bufferedcaching4.png"/>
<div class="caption">
Another Collection is selected, pushing the Personal contacts out of the queue and purging them</div></div>
 <div class="image">
<img src="bufferedcaching6.png" alt="bufferedcaching6.png"/>
<div class="caption">
If the Collection is selected again, its Items are refetched</div></div>
<p> For this example, I used a queue length of just two Collections, so that if a Collection was deselected two clicks ago, it will be purged. In real applications, a longer queue length will be used, but it’s harder to illustrate in screenshots. Another unrealistic part of this demo is that this feature will like be used in applications like KMail where Collections can contain tens of thousands of Items and fetching them is an expensive operation.</p>
<p>This feature should be totally invisible to users and even developers using <a class="el" href="namespaceAkonadi.html" title="FreeBusyManager::Singleton.">Akonadi</a>, but it should offset the main disadvantage of using a cache of Items in the EntityTreeModel. </p>
</div></div><!-- contents -->
<div class="copyrights">
This file is part of the KDE documentation.<br/>
Documentation copyright &copy; 1996-2013 The KDE developers.<br/>
Generated on Fri Jul 12 2013 16:48:59 by
<a href="http://www.doxygen.org/index.html">doxygen</a> 1.8.3.1 written
by <a href="mailto:dimitri@stack.nl">Dimitri van Heesch</a>, &copy;&nbsp;1997-2006
<p>
KDE's <a href="http://techbase.kde.org/Policies/Library_Documentation_Policy">Doxygen guidelines</a> are available online.
</p>
</div>
            </div>
          </div>
        </div>
        <div id="left">
          <div class="menu_box">
<a name="cp-menu" /><div class="menutitle"><div>
<h2 id="cp-menu-project">akonadi</h2>
<a href="#cp-skip-project" class="cp-doNotDisplay">Skip menu "akonadi"</a>
</div></div>
<ul><li><a href="index.html">Main Page</a></li><li><a href="namespaces.html">Namespace List</a></li><li><a href="namespacemembers.html">Namespace Members</a></li><li><a href="classes.html">Alphabetical List</a></li><li><a href="annotated.html">Class List</a></li><li><a href="hierarchy.html">Class Hierarchy</a></li><li><a href="functions.html">Class Members</a></li><li><a href="files.html">File List</a></li><li><a href="modules.html">Modules</a></li><li><a href="pages.html">Related Pages</a></li></ul>
<!--
<h2>Class Picker</h2>
<div style="text-align: center;">
<form name="guideform">
<select name="guidelinks" style="width:100%;" onChange="window.location=document.guideform.guidelinks.options[document.guideform.guidelinks.selectedIndex].value">
<option value="annotated.html">-- Choose --</option>
  <option value="classAddressEditDialog.html">addresseditdialog</option>,  <option value="classAddressEditWidget.html">addresseditwidget</option>,  <option value="classAddressSelectionWidget.html">addressselectionwidget</option>,  <option value="classAddressTypeCombo.html">addresstypecombo</option>,  <option value="classAkonadi_1_1AbstractContactFormatter.html">akonadi::abstractcontactformatter</option>,  <option value="classAkonadi_1_1AbstractContactGroupFormatter.html">akonadi::abstractcontactgroupformatter</option>,  <option value="classAkonadi_1_1AbstractDifferencesReporter.html">akonadi::abstractdifferencesreporter</option>,  <option value="classAkonadi_1_1ActionStateManager.html">akonadi::actionstatemanager</option>,  <option value="classAkonadi_1_1AddressAttribute.html">akonadi::addressattribute</option>,  <option value="classAkonadi_1_1AgentActionManager.html">akonadi::agentactionmanager</option>,  <option value="classAkonadi_1_1AgentBase.html">akonadi::agentbase</option>,  <option value="classAkonadi_1_1AgentBase_1_1Observer.html">akonadi::agentbase::observer</option>,  <option value="classAkonadi_1_1AgentBase_1_1ObserverV2.html">akonadi::agentbase::observerv2</option>,  <option value="classAkonadi_1_1AgentBasePrivate.html">akonadi::agentbaseprivate</option>,  <option value="classAkonadi_1_1AgentFactory.html">akonadi::agentfactory</option>,  <option value="classAkonadi_1_1AgentFactoryBase.html">akonadi::agentfactorybase</option>,  <option value="classAkonadi_1_1AgentFilterProxyModel.html">akonadi::agentfilterproxymodel</option>,  <option value="classAkonadi_1_1AgentInstance.html">akonadi::agentinstance</option>,  <option value="classAkonadi_1_1AgentInstance_1_1Private.html">akonadi::agentinstance::private</option>,  <option value="classAkonadi_1_1AgentInstanceCreateJob.html">akonadi::agentinstancecreatejob</option>,  <option value="classAkonadi_1_1AgentInstanceModel.html">akonadi::agentinstancemodel</option>,  <option value="classAkonadi_1_1AgentInstanceWidget.html">akonadi::agentinstancewidget</option>,  <option value="classAkonadi_1_1AgentManager.html">akonadi::agentmanager</option>,  <option value="classAkonadi_1_1AgentManagerPrivate.html">akonadi::agentmanagerprivate</option>,  <option value="classAkonadi_1_1AgentSearchInterface.html">akonadi::agentsearchinterface</option>,  <option value="classAkonadi_1_1AgentType.html">akonadi::agenttype</option>,  <option value="classAkonadi_1_1AgentType_1_1Private.html">akonadi::agenttype::private</option>,  <option value="classAkonadi_1_1AgentTypeDialog.html">akonadi::agenttypedialog</option>,  <option value="classAkonadi_1_1AgentTypeModel.html">akonadi::agenttypemodel</option>,  <option value="classAkonadi_1_1AgentTypeWidget.html">akonadi::agenttypewidget</option>,  <option value="classAkonadi_1_1AsyncSelectionHandler.html">akonadi::asyncselectionhandler</option>,  <option value="classAkonadi_1_1Attribute.html">akonadi::attribute</option>,  <option value="classAkonadi_1_1AttributeFactory.html">akonadi::attributefactory</option>,  <option value="classAkonadi_1_1BlockAlarmsAttribute.html">akonadi::blockalarmsattribute</option>,  <option value="classAkonadi_1_1CachePolicy.html">akonadi::cachepolicy</option>,  <option value="classAkonadi_1_1CachePolicyPage.html">akonadi::cachepolicypage</option>,  <option value="classAkonadi_1_1CalendarBase.html">akonadi::calendarbase</option>,  <option value="classAkonadi_1_1ChangeNotificationDependenciesFactory.html">akonadi::changenotificationdependenciesfactory</option>,  <option value="classAkonadi_1_1ChangeRecorder.html">akonadi::changerecorder</option>,  <option value="classAkonadi_1_1Collection.html">akonadi::collection</option>,  <option value="classAkonadi_1_1CollectionAttributesSynchronizationJob.html">akonadi::collectionattributessynchronizationjob</option>,  <option value="classAkonadi_1_1CollectionComboBox.html">akonadi::collectioncombobox</option>,  <option value="classAkonadi_1_1CollectionCopyJob.html">akonadi::collectioncopyjob</option>,  <option value="classAkonadi_1_1CollectionCreateJob.html">akonadi::collectioncreatejob</option>,  <option value="classAkonadi_1_1CollectionDeleteJob.html">akonadi::collectiondeletejob</option>,  <option value="classAkonadi_1_1CollectionDialog.html">akonadi::collectiondialog</option>,  <option value="classAkonadi_1_1CollectionFetchJob.html">akonadi::collectionfetchjob</option>,  <option value="classAkonadi_1_1CollectionFetchScope.html">akonadi::collectionfetchscope</option>,  <option value="classAkonadi_1_1CollectionFilterProxyModel.html">akonadi::collectionfilterproxymodel</option>,  <option value="classAkonadi_1_1CollectionModel.html">akonadi::collectionmodel</option>,  <option value="classAkonadi_1_1CollectionModelPrivate.html">akonadi::collectionmodelprivate</option>,  <option value="classAkonadi_1_1CollectionModifyJob.html">akonadi::collectionmodifyjob</option>,  <option value="classAkonadi_1_1CollectionMoveJob.html">akonadi::collectionmovejob</option>,  <option value="classAkonadi_1_1CollectionPathResolver.html">akonadi::collectionpathresolver</option>,  <option value="classAkonadi_1_1CollectionPrivate.html">akonadi::collectionprivate</option>,  <option value="classAkonadi_1_1CollectionPropertiesDialog.html">akonadi::collectionpropertiesdialog</option>,  <option value="classAkonadi_1_1CollectionPropertiesPage.html">akonadi::collectionpropertiespage</option>,  <option value="classAkonadi_1_1CollectionPropertiesPageFactory.html">akonadi::collectionpropertiespagefactory</option>,  <option value="classAkonadi_1_1CollectionQuotaAttribute.html">akonadi::collectionquotaattribute</option>,  <option value="classAkonadi_1_1CollectionRequester.html">akonadi::collectionrequester</option>,  <option value="classAkonadi_1_1CollectionRightsAttribute.html">akonadi::collectionrightsattribute</option>,  <option value="classAkonadi_1_1CollectionSelectJob.html">akonadi::collectionselectjob</option>,  <option value="classAkonadi_1_1CollectionStatistics.html">akonadi::collectionstatistics</option>,  <option value="classAkonadi_1_1CollectionStatisticsDelegate.html">akonadi::collectionstatisticsdelegate</option>,  <option value="classAkonadi_1_1CollectionStatisticsJob.html">akonadi::collectionstatisticsjob</option>,  <option value="classAkonadi_1_1CollectionStatisticsModel.html">akonadi::collectionstatisticsmodel</option>,  <option value="classAkonadi_1_1CollectionSync.html">akonadi::collectionsync</option>,  <option value="classAkonadi_1_1CollectionView.html">akonadi::collectionview</option>,  <option value="classAkonadi_1_1ConflictHandler.html">akonadi::conflicthandler</option>,  <option value="classAkonadi_1_1ConflictResolveDialog.html">akonadi::conflictresolvedialog</option>,  <option value="classAkonadi_1_1ContactDefaultActions.html">akonadi::contactdefaultactions</option>,  <option value="classAkonadi_1_1ContactEditor.html">akonadi::contacteditor</option>,  <option value="classAkonadi_1_1ContactEditorDialog.html">akonadi::contacteditordialog</option>,  <option value="classAkonadi_1_1ContactEditorPagePlugin.html">akonadi::contacteditorpageplugin</option>,  <option value="classAkonadi_1_1ContactGroupEditor.html">akonadi::contactgroupeditor</option>,  <option value="classAkonadi_1_1ContactGroupEditorDialog.html">akonadi::contactgroupeditordialog</option>,  <option value="classAkonadi_1_1ContactGroupExpandJob.html">akonadi::contactgroupexpandjob</option>,  <option value="classAkonadi_1_1ContactGroupSearchJob.html">akonadi::contactgroupsearchjob</option>,  <option value="classAkonadi_1_1ContactGroupViewer.html">akonadi::contactgroupviewer</option>,  <option value="classAkonadi_1_1ContactGroupViewerDialog.html">akonadi::contactgroupviewerdialog</option>,  <option value="classAkonadi_1_1ContactMetaData.html">akonadi::contactmetadata</option>,  <option value="classAkonadi_1_1ContactMetaDataAttribute.html">akonadi::contactmetadataattribute</option>,  <option value="classAkonadi_1_1ContactSearchJob.html">akonadi::contactsearchjob</option>,  <option value="classAkonadi_1_1ContactsFilterProxyModel.html">akonadi::contactsfilterproxymodel</option>,  <option value="classAkonadi_1_1ContactsTreeModel.html">akonadi::contactstreemodel</option>,  <option value="classAkonadi_1_1ContactViewer.html">akonadi::contactviewer</option>,  <option value="classAkonadi_1_1ContactViewerDialog.html">akonadi::contactviewerdialog</option>,  <option value="classAkonadi_1_1Control.html">akonadi::control</option>,  <option value="classAkonadi_1_1DefaultItemSerializerPlugin.html">akonadi::defaultitemserializerplugin</option>,  <option value="classAkonadi_1_1DefaultResourceJob.html">akonadi::defaultresourcejob</option>,  <option value="classAkonadi_1_1DialPhoneNumberAction.html">akonadi::dialphonenumberaction</option>,  <option value="classAkonadi_1_1DifferencesAlgorithmInterface.html">akonadi::differencesalgorithminterface</option>,  <option value="classAkonadi_1_1EmailAddressSelection.html">akonadi::emailaddressselection</option>,  <option value="classAkonadi_1_1EmailAddressSelectionDialog.html">akonadi::emailaddressselectiondialog</option>,  <option value="classAkonadi_1_1EmailAddressSelectionWidget.html">akonadi::emailaddressselectionwidget</option>,  <option value="classAkonadi_1_1Entity.html">akonadi::entity</option>,  <option value="classAkonadi_1_1EntityCache.html">akonadi::entitycache</option>,  <option value="classAkonadi_1_1EntityCacheBase.html">akonadi::entitycachebase</option>,  <option value="classAkonadi_1_1EntityDeletedAttribute.html">akonadi::entitydeletedattribute</option>,  <option value="classAkonadi_1_1EntityDisplayAttribute.html">akonadi::entitydisplayattribute</option>,  <option value="classAkonadi_1_1EntityHiddenAttribute.html">akonadi::entityhiddenattribute</option>,  <option value="classAkonadi_1_1EntityListView.html">akonadi::entitylistview</option>,  <option value="classAkonadi_1_1EntityMimeTypeFilterModel.html">akonadi::entitymimetypefiltermodel</option>,  <option value="classAkonadi_1_1EntityOrderProxyModel.html">akonadi::entityorderproxymodel</option>,  <option value="classAkonadi_1_1EntityPrivate.html">akonadi::entityprivate</option>,  <option value="classAkonadi_1_1EntityRightsFilterModel.html">akonadi::entityrightsfiltermodel</option>,  <option value="classAkonadi_1_1EntityTreeModel.html">akonadi::entitytreemodel</option>,  <option value="classAkonadi_1_1EntityTreeModelPrivate.html">akonadi::entitytreemodelprivate</option>,  <option value="classAkonadi_1_1EntityTreeView.html">akonadi::entitytreeview</option>,  <option value="classAkonadi_1_1EntityTreeViewStateSaver.html">akonadi::entitytreeviewstatesaver</option>,  <option value="classAkonadi_1_1ErrorOverlay.html">akonadi::erroroverlay</option>,  <option value="classAkonadi_1_1Exception.html">akonadi::exception</option>,  <option value="classAkonadi_1_1FavoriteCollectionsModel.html">akonadi::favoritecollectionsmodel</option>,  <option value="classAkonadi_1_1FetchJobCalendar.html">akonadi::fetchjobcalendar</option>,  <option value="classAkonadi_1_1Firstrun.html">akonadi::firstrun</option>,  <option value="classAkonadi_1_1FreeBusyProviderBase.html">akonadi::freebusyproviderbase</option>,  <option value="classAkonadi_1_1FreeBusyProviderBasePrivate.html">akonadi::freebusyproviderbaseprivate</option>,  <option value="classAkonadi_1_1GetLockJob.html">akonadi::getlockjob</option>,  <option value="classAkonadi_1_1History.html">akonadi::history</option>,  <option value="classAkonadi_1_1ImageProvider.html">akonadi::imageprovider</option>,  <option value="classAkonadi_1_1IncidenceFetchJob.html">akonadi::incidencefetchjob</option>,  <option value="classAkonadi_1_1IncidenceMimeTypeVisitor.html">akonadi::incidencemimetypevisitor</option>,  <option value="classAkonadi_1_1IndexPolicyAttribute.html">akonadi::indexpolicyattribute</option>,  <option value="classAkonadi_1_1Internal_1_1SharedValuePool.html">akonadi::internal::sharedvaluepool</option>,  <option value="classAkonadi_1_1InvalidateCacheJob.html">akonadi::invalidatecachejob</option>,  <option value="classAkonadi_1_1InvitationHandlerHelper.html">akonadi::invitationhandlerhelper</option>,  <option value="classAkonadi_1_1Item.html">akonadi::item</option>,  <option value="classAkonadi_1_1ItemCopyJob.html">akonadi::itemcopyjob</option>,  <option value="classAkonadi_1_1ItemCreateJob.html">akonadi::itemcreatejob</option>,  <option value="classAkonadi_1_1ItemDeleteJob.html">akonadi::itemdeletejob</option>,  <option value="classAkonadi_1_1ItemFetchJob.html">akonadi::itemfetchjob</option>,  <option value="classAkonadi_1_1ItemFetchScope.html">akonadi::itemfetchscope</option>,  <option value="classAkonadi_1_1ItemFetchScopePrivate.html">akonadi::itemfetchscopeprivate</option>,  <option value="classAkonadi_1_1ItemModel.html">akonadi::itemmodel</option>,  <option value="classAkonadi_1_1ItemModifyJob.html">akonadi::itemmodifyjob</option>,  <option value="classAkonadi_1_1ItemModifyJobPrivate.html">akonadi::itemmodifyjobprivate</option>,  <option value="classAkonadi_1_1ItemMonitor.html">akonadi::itemmonitor</option>,  <option value="classAkonadi_1_1ItemMonitor_1_1Private.html">akonadi::itemmonitor::private</option>,  <option value="classAkonadi_1_1ItemMoveJob.html">akonadi::itemmovejob</option>,  <option value="classAkonadi_1_1ItemPrivate.html">akonadi::itemprivate</option>,  <option value="classAkonadi_1_1ItemSearchJob.html">akonadi::itemsearchjob</option>,  <option value="classAkonadi_1_1ItemSerializer.html">akonadi::itemserializer</option>,  <option value="classAkonadi_1_1ItemSerializerPlugin.html">akonadi::itemserializerplugin</option>,  <option value="classAkonadi_1_1ItemSerializerPluginV2.html">akonadi::itemserializerpluginv2</option>,  <option value="classAkonadi_1_1ItemSync.html">akonadi::itemsync</option>,  <option value="classAkonadi_1_1ItemView.html">akonadi::itemview</option>,  <option value="classAkonadi_1_1Job.html">akonadi::job</option>,  <option value="classAkonadi_1_1JobPrivate.html">akonadi::jobprivate</option>,  <option value="classAkonadi_1_1KColumnFilterProxyModel.html">akonadi::kcolumnfilterproxymodel</option>,  <option value="classAkonadi_1_1KJobPrivateBase.html">akonadi::kjobprivatebase</option>,  <option value="classAkonadi_1_1LinkJob.html">akonadi::linkjob</option>,  <option value="classAkonadi_1_1LinkJobImpl.html">akonadi::linkjobimpl</option>,  <option value="classAkonadi_1_1MessageFolderAttribute.html">akonadi::messagefolderattribute</option>,  <option value="classAkonadi_1_1MessageModel.html">akonadi::messagemodel</option>,  <option value="classAkonadi_1_1MessageStatus.html">akonadi::messagestatus</option>,  <option value="classAkonadi_1_1MessageThreaderProxyModel.html">akonadi::messagethreaderproxymodel</option>,  <option value="classAkonadi_1_1MessageThreadingAttribute.html">akonadi::messagethreadingattribute</option>,  <option value="classAkonadi_1_1MimeTypeChecker.html">akonadi::mimetypechecker</option>,  <option value="classAkonadi_1_1MimeTypeCheckerPrivate.html">akonadi::mimetypecheckerprivate</option>,  <option value="classAkonadi_1_1Monitor.html">akonadi::monitor</option>,  <option value="classAkonadi_1_1MonitorPrivate.html">akonadi::monitorprivate</option>,  <option value="classAkonadi_1_1MonitorPrivate_1_1PurgeBuffer.html">akonadi::monitorprivate::purgebuffer</option>,  <option value="classAkonadi_1_1MoveJobImpl.html">akonadi::movejobimpl</option>,  <option value="classAkonadi_1_1NoteUtils_1_1Attachment.html">akonadi::noteutils::attachment</option>,  <option value="classAkonadi_1_1NoteUtils_1_1NoteMessageWrapper.html">akonadi::noteutils::notemessagewrapper</option>,  <option value="classAkonadi_1_1ObjectNotificationMessage.html">akonadi::objectnotificationmessage</option>,  <option value="classAkonadi_1_1PartFetcher.html">akonadi::partfetcher</option>,  <option value="classAkonadi_1_1PersistentSearchAttribute.html">akonadi::persistentsearchattribute</option>,  <option value="classAkonadi_1_1PreprocessorBase.html">akonadi::preprocessorbase</option>,  <option value="classAkonadi_1_1ProtocolHelper.html">akonadi::protocolhelper</option>,  <option value="classAkonadi_1_1RecentContactsCollectionRequestJob.html">akonadi::recentcontactscollectionrequestjob</option>,  <option value="classAkonadi_1_1RecentContactsCollections.html">akonadi::recentcontactscollections</option>,  <option value="classAkonadi_1_1RecursiveCollectionFilterProxyModel.html">akonadi::recursivecollectionfilterproxymodel</option>,  <option value="classAkonadi_1_1RecursiveItemFetchJob.html">akonadi::recursiveitemfetchjob</option>,  <option value="classAkonadi_1_1RecursiveMover.html">akonadi::recursivemover</option>,  <option value="classAkonadi_1_1RemoveDuplicatesJob.html">akonadi::removeduplicatesjob</option>,  <option value="classAkonadi_1_1ResourceBase.html">akonadi::resourcebase</option>,  <option value="classAkonadi_1_1ResourceScanJob.html">akonadi::resourcescanjob</option>,  <option value="classAkonadi_1_1ResourceSelectJob.html">akonadi::resourceselectjob</option>,  <option value="classAkonadi_1_1ResourceSynchronizationJob.html">akonadi::resourcesynchronizationjob</option>,  <option value="classAkonadi_1_1Scheduler.html">akonadi::scheduler</option>,  <option value="classAkonadi_1_1SearchCreateJob.html">akonadi::searchcreatejob</option>,  <option value="classAkonadi_1_1SelectionProxyModel.html">akonadi::selectionproxymodel</option>,  <option value="classAkonadi_1_1SelfTestDialog.html">akonadi::selftestdialog</option>,  <option value="classAkonadi_1_1ServerManager.html">akonadi::servermanager</option>,  <option value="classAkonadi_1_1Session.html">akonadi::session</option>,  <option value="classAkonadi_1_1SessionPrivate.html">akonadi::sessionprivate</option>,  <option value="classAkonadi_1_1ShowAddressAction.html">akonadi::showaddressaction</option>,  <option value="classAkonadi_1_1SocialFeedItem.html">akonadi::socialfeeditem</option>,  <option value="classAkonadi_1_1SpecialCollectionAttribute.html">akonadi::specialcollectionattribute</option>,  <option value="classAkonadi_1_1SpecialCollections.html">akonadi::specialcollections</option>,  <option value="classAkonadi_1_1SpecialCollectionsPrivate.html">akonadi::specialcollectionsprivate</option>,  <option value="classAkonadi_1_1SpecialCollectionsRequestJob.html">akonadi::specialcollectionsrequestjob</option>,  <option value="classAkonadi_1_1SpecialMailCollections.html">akonadi::specialmailcollections</option>,  <option value="classAkonadi_1_1SpecialMailCollectionsRequestJob.html">akonadi::specialmailcollectionsrequestjob</option>,  <option value="classAkonadi_1_1SpecialMailCollectionsTesting.html">akonadi::specialmailcollectionstesting</option>,  <option value="classAkonadi_1_1StandardActionManager.html">akonadi::standardactionmanager</option>,  <option value="classAkonadi_1_1StandardCalendarActionManager.html">akonadi::standardcalendaractionmanager</option>,  <option value="classAkonadi_1_1StandardContactActionManager.html">akonadi::standardcontactactionmanager</option>,  <option value="classAkonadi_1_1StandardContactFormatter.html">akonadi::standardcontactformatter</option>,  <option value="classAkonadi_1_1StandardContactGroupFormatter.html">akonadi::standardcontactgroupformatter</option>,  <option value="classAkonadi_1_1StandardMailActionManager.html">akonadi::standardmailactionmanager</option>,  <option value="classAkonadi_1_1StatisticsProxyModel.html">akonadi::statisticsproxymodel</option>,  <option value="classAkonadi_1_1StdStringItemSerializerPlugin.html">akonadi::stdstringitemserializerplugin</option>,  <option value="classAkonadi_1_1SubscriptionDialog.html">akonadi::subscriptiondialog</option>,  <option value="classAkonadi_1_1SubscriptionJob.html">akonadi::subscriptionjob</option>,  <option value="classAkonadi_1_1SubscriptionModel.html">akonadi::subscriptionmodel</option>,  <option value="classAkonadi_1_1TextBrowser.html">akonadi::textbrowser</option>,  <option value="classAkonadi_1_1TransactionBeginJob.html">akonadi::transactionbeginjob</option>,  <option value="classAkonadi_1_1TransactionCommitJob.html">akonadi::transactioncommitjob</option>,  <option value="classAkonadi_1_1TransactionRollbackJob.html">akonadi::transactionrollbackjob</option>,  <option value="classAkonadi_1_1TransactionSequence.html">akonadi::transactionsequence</option>,  <option value="classAkonadi_1_1TransportResourceBase.html">akonadi::transportresourcebase</option>,  <option value="classAkonadi_1_1TransportResourceBasePrivate.html">akonadi::transportresourcebaseprivate</option>,  <option value="classAkonadi_1_1TrashFilterProxyModel.html">akonadi::trashfilterproxymodel</option>,  <option value="classAkonadi_1_1TrashJob.html">akonadi::trashjob</option>,  <option value="classAkonadi_1_1TrashRestoreJob.html">akonadi::trashrestorejob</option>,  <option value="classAkonadi_1_1UnlinkJob.html">akonadi::unlinkjob</option>,  <option value="classAutoQPointer.html">autoqpointer</option>,  <option value="classCategoriesEditWidget.html">categorieseditwidget</option>,  <option value="classCollectionFilterModel.html">collectionfiltermodel</option>,  <option value="classContactEditorWidget.html">contacteditorwidget</option>,  <option value="classCustomField.html">customfield</option>,  <option value="classCustomFieldManager.html">customfieldmanager</option>,  <option value="classDisplayNameEditWidget.html">displaynameeditwidget</option>,  <option value="classEmailEditWidget.html">emaileditwidget</option>,  <option value="classIMEditWidget.html">imeditwidget</option>,  <option value="classKDatePickerPopup.html">kdatepickerpopup</option>,  <option value="classKEditTagsDialog.html">kedittagsdialog</option>,  <option value="classNameEditWidget.html">nameeditwidget</option>,  <option value="classPhoneEditWidget.html">phoneeditwidget</option>,  <option value="classPhoneNumberListWidget.html">phonenumberlistwidget</option>,  <option value="classPhoneNumberWidget.html">phonenumberwidget</option>,  <option value="classPhoneTypeCombo.html">phonetypecombo</option>,  <option value="classPhoneTypeDialog.html">phonetypedialog</option>,  <option value="classWaitingOverlay.html">waitingoverlay</option>,
</select>
</form>
</div>
-->
<div class="menu_box">
<a name="cp-menu" /><div class="menutitle"><div>
<h2 id="cp-menu-project">kdepimlibs-4.10.5 API Reference</h2>
<a href="#cp-skip-project" class="cp-doNotDisplay">Skip menu "kdepimlibs-4.10.5 API Reference"</a>
</div></div>
<div class="nav_list">
<ul>
<li><a href="../../akonadi/html/index.html">akonadi</a></li><li>&nbsp;&nbsp;<a href="../../akonadi/contact/html/index.html">contact</a></li><li>&nbsp;&nbsp;<a href="../../akonadi/kmime/html/index.html">kmime</a></li><li>&nbsp;&nbsp;<a href="../../akonadi/socialutils/html/index.html">socialutils</a></li><li><a href="../../kabc/html/index.html">kabc</a></li><li><a href="../../kalarmcal/html/index.html">kalarmcal</a></li><li><a href="../../kblog/html/index.html">kblog</a></li><li><a href="../../kcal/html/index.html">kcal</a></li><li><a href="../../kcalcore/html/index.html">kcalcore</a></li><li><a href="../../kcalutils/html/index.html">kcalutils</a></li><li><a href="../../kholidays/html/index.html">kholidays</a></li><li><a href="../../kimap/html/index.html">kimap</a></li><li><a href="../../kioslave/html/index.html">kioslave</a></li><li>&nbsp;&nbsp;<a href="../../kioslave/imap4/html/index.html">imap4</a></li><li>&nbsp;&nbsp;<a href="../../kioslave/mbox/html/index.html">mbox</a></li><li>&nbsp;&nbsp;<a href="../../kioslave/nntp/html/index.html">nntp</a></li><li><a href="../../kldap/html/index.html">kldap</a></li><li><a href="../../kmbox/html/index.html">kmbox</a></li><li><a href="../../kmime/html/index.html">kmime</a></li><li><a href="../../kontactinterface/html/index.html">kontactinterface</a></li><li><a href="../../kpimidentities/html/index.html">kpimidentities</a></li><li><a href="../../kpimtextedit/html/index.html">kpimtextedit</a></li><li><a href="../../kpimutils/html/index.html">kpimutils</a></li><li><a href="../../kresources/html/index.html">kresources</a></li><li><a href="../../ktnef/html/index.html">ktnef</a></li><li><a href="../../kxmlrpcclient/html/index.html">kxmlrpcclient</a></li><li><a href="../../mailtransport/html/index.html">mailtransport</a></li><li><a href="../../microblog/html/index.html">microblog</a></li><li><a href="../../qgpgme/html/index.html">qgpgme</a></li><li><a href="../../syndication/html/index.html">syndication</a></li><li>&nbsp;&nbsp;<a href="../../syndication/atom/html/index.html">atom</a></li><li>&nbsp;&nbsp;<a href="../../syndication/rdf/html/index.html">rdf</a></li><li>&nbsp;&nbsp;<a href="../../syndication/rss2/html/index.html">rss2</a></li>
</ul></div></div>
<!-- api_searchbox -->
          </div>
        </div>
        <div class="clearer"></div>
      </div>
      <div class="clearer"></div>
    </div>
    <div id="end_body"></div>
    <div id="footer"><div id="footer_text">
    Report problems with this website to <a href="https://bugs.kde.org/enter_sysadmin_request.cgi?component=api.kde.org">our bug tracking system</a>.<br>
    Contact the specific authors with questions and comments about the page contents.<p>
    KDE<sup>&#174;</sup> and <a href="/media/images/kde_gear_black.png">the K Desktop Environment<sup>&#174;</sup> logo</a> are registered trademarks of <a href="http://ev.kde.org/" title="Homepage of the KDE non-profit Organization">KDE e.V.</a> |
        <a href="http://www.kde.org/contact/impressum.php">Legal</a></p>
    </div></div>
  </div>
<!--
WARNING: DO NOT SEND MAIL TO THE FOLLOWING EMAIL ADDRESS! YOU WILL
BE BLOCKED INSTANTLY AND PERMANENTLY!
<a href="mailto:aaaatrap-45abe0e0c3bebc77@kde.org">Block me</a>
WARNING END
-->
</body>
</html>