• Skip to content
  • Skip to link menu
KDE API Reference
  • KDE API Reference
  • kdepimlibs API Reference
  • KDE Home
  • Contact Us
 

akonadi

  • sources
  • kde-4.12
  • kdepimlibs
  • akonadi
specialcollectionshelperjobs.cpp
1 /*
2  Copyright (c) 2009 Constantin Berzan <exit3219@gmail.com>
3 
4  This library is free software; you can redistribute it and/or modify it
5  under the terms of the GNU Library General Public License as published by
6  the Free Software Foundation; either version 2 of the License, or (at your
7  option) any later version.
8 
9  This library is distributed in the hope that it will be useful, but WITHOUT
10  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11  FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public
12  License for more details.
13 
14  You should have received a copy of the GNU Library General Public License
15  along with this library; see the file COPYING.LIB. If not, write to the
16  Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
17  02110-1301, USA.
18 */
19 
20 #include "specialcollectionshelperjobs_p.h"
21 
22 #include "dbusconnectionpool.h"
23 #include "specialcollectionattribute_p.h"
24 #include "specialcollections.h"
25 #include "servermanager.h"
26 
27 #include <akonadi/agentinstance.h>
28 #include <akonadi/agentinstancecreatejob.h>
29 #include <akonadi/agentmanager.h>
30 #include <akonadi/collectionfetchjob.h>
31 #include <akonadi/collectionfetchscope.h>
32 #include <akonadi/collectionmodifyjob.h>
33 #include <akonadi/entitydisplayattribute.h>
34 #include <akonadi/resourcesynchronizationjob.h>
35 
36 #include <KDebug>
37 #include <KLocalizedString>
38 #include <KStandardDirs>
39 #include <kcoreconfigskeleton.h>
40 
41 #include <QtDBus/QDBusConnectionInterface>
42 #include <QtDBus/QDBusInterface>
43 #include <QtDBus/QDBusServiceWatcher>
44 #include <QtCore/QMetaMethod>
45 #include <QtCore/QTime>
46 #include <QtCore/QTimer>
47 
48 #define LOCK_WAIT_TIMEOUT_SECONDS 10
49 
50 using namespace Akonadi;
51 
52 // convenient methods to get/set the default resource id
53 static void setDefaultResourceId( KCoreConfigSkeleton *settings, const QString &value )
54 {
55  KConfigSkeletonItem *item = settings->findItem( QLatin1String( "DefaultResourceId" ) );
56  Q_ASSERT( item );
57  item->setProperty( value );
58 }
59 
60 static QString defaultResourceId( KCoreConfigSkeleton *settings )
61 {
62  const KConfigSkeletonItem *item = settings->findItem( QLatin1String( "DefaultResourceId" ) );
63  Q_ASSERT( item );
64  return item->property().toString();
65 }
66 
67 static QString dbusServiceName()
68 {
69  QString service = QString::fromLatin1("org.kde.pim.SpecialCollections");
70  if (ServerManager::hasInstanceIdentifier())
71  return service + ServerManager::instanceIdentifier();
72  return service;
73 }
74 
75 static QVariant::Type argumentType( const QMetaObject *mo, const QString &method )
76 {
77  QMetaMethod m;
78  for ( int i = 0; i < mo->methodCount(); ++i ) {
79  const QString signature = QString::fromLatin1( mo->method( i ).signature() );
80  if ( signature.startsWith( method ) )
81  m = mo->method( i );
82  }
83 
84  if ( !m.signature() )
85  return QVariant::Invalid;
86 
87  const QList<QByteArray> argTypes = m.parameterTypes();
88  if ( argTypes.count() != 1 )
89  return QVariant::Invalid;
90 
91  return QVariant::nameToType( argTypes.first() );
92 }
93 
94 // ===================== ResourceScanJob ============================
95 
99 class Akonadi::ResourceScanJob::Private
100 {
101  public:
102  Private( KCoreConfigSkeleton *settings, ResourceScanJob *qq );
103 
104  void fetchResult( KJob *job ); // slot
105 
106  ResourceScanJob *const q;
107 
108  // Input:
109  QString mResourceId;
110  KCoreConfigSkeleton *mSettings;
111 
112  // Output:
113  Collection mRootCollection;
114  Collection::List mSpecialCollections;
115 };
116 
117 ResourceScanJob::Private::Private( KCoreConfigSkeleton *settings, ResourceScanJob *qq )
118  : q( qq ), mSettings( settings )
119 {
120 }
121 
122 void ResourceScanJob::Private::fetchResult( KJob *job )
123 {
124  if ( job->error() ) {
125  kWarning() << job->errorText();
126  return;
127  }
128 
129  CollectionFetchJob *fetchJob = qobject_cast<CollectionFetchJob *>( job );
130  Q_ASSERT( fetchJob );
131 
132  Q_ASSERT( !mRootCollection.isValid() );
133  Q_ASSERT( mSpecialCollections.isEmpty() );
134  foreach ( const Collection &collection, fetchJob->collections() ) {
135  if ( collection.parentCollection() == Collection::root() ) {
136  if ( mRootCollection.isValid() )
137  kWarning() << "Resource has more than one root collection. I don't know what to do.";
138  else
139  mRootCollection = collection;
140  }
141 
142  if ( collection.hasAttribute<SpecialCollectionAttribute>() )
143  mSpecialCollections.append( collection );
144  }
145 
146  kDebug() << "Fetched root collection" << mRootCollection.id()
147  << "and" << mSpecialCollections.count() << "local folders"
148  << "(total" << fetchJob->collections().count() << "collections).";
149 
150  if ( !mRootCollection.isValid() ) {
151  q->setError( Unknown );
152  q->setErrorText( i18n( "Could not fetch root collection of resource %1.", mResourceId ) );
153  q->emitResult();
154  return;
155  }
156 
157  // We are done!
158  q->emitResult();
159 }
160 
161 ResourceScanJob::ResourceScanJob( const QString &resourceId, KCoreConfigSkeleton *settings, QObject *parent )
162  : Job( parent ),
163  d( new Private( settings, this ) )
164 {
165  setResourceId( resourceId );
166 }
167 
168 ResourceScanJob::~ResourceScanJob()
169 {
170  delete d;
171 }
172 
173 QString ResourceScanJob::resourceId() const
174 {
175  return d->mResourceId;
176 }
177 
178 void ResourceScanJob::setResourceId( const QString &resourceId )
179 {
180  d->mResourceId = resourceId;
181 }
182 
183 Akonadi::Collection ResourceScanJob::rootResourceCollection() const
184 {
185  return d->mRootCollection;
186 }
187 
188 Akonadi::Collection::List ResourceScanJob::specialCollections() const
189 {
190  return d->mSpecialCollections;
191 }
192 
193 void ResourceScanJob::doStart()
194 {
195  if ( d->mResourceId.isEmpty() ) {
196  kError() << "No resource ID given.";
197  setError( Job::Unknown );
198  setErrorText( i18n( "No resource ID given." ) );
199  emitResult();
200  return;
201  }
202 
203  CollectionFetchJob *fetchJob = new CollectionFetchJob( Collection::root(),
204  CollectionFetchJob::Recursive, this );
205  fetchJob->fetchScope().setResource( d->mResourceId );
206  fetchJob->fetchScope().setIncludeStatistics( true );
207  connect( fetchJob, SIGNAL(result(KJob*)), this, SLOT(fetchResult(KJob*)) );
208 }
209 
210 // ===================== DefaultResourceJob ============================
211 
215 class Akonadi::DefaultResourceJobPrivate
216 {
217  public:
218  DefaultResourceJobPrivate( KCoreConfigSkeleton *settings, DefaultResourceJob *qq );
219 
220  void tryFetchResource();
221  void resourceCreateResult( KJob *job ); // slot
222  void resourceSyncResult( KJob *job ); // slot
223  void collectionFetchResult( KJob *job ); // slot
224  void collectionModifyResult( KJob *job ); // slot
225 
226  DefaultResourceJob *const q;
227  KCoreConfigSkeleton *mSettings;
228  bool mResourceWasPreexisting;
229  int mPendingModifyJobs;
230  QString mDefaultResourceType;
231  QVariantMap mDefaultResourceOptions;
232  QList<QByteArray> mKnownTypes;
233  QMap<QByteArray, QString> mNameForTypeMap;
234  QMap<QByteArray, QString> mIconForTypeMap;
235 };
236 
237 DefaultResourceJobPrivate::DefaultResourceJobPrivate( KCoreConfigSkeleton *settings, DefaultResourceJob *qq )
238  : q( qq ),
239  mSettings( settings ),
240  mResourceWasPreexisting( true /* for safety, so as not to accidentally delete data */ ),
241  mPendingModifyJobs( 0 )
242 {
243 }
244 
245 void DefaultResourceJobPrivate::tryFetchResource()
246 {
247  // Get the resourceId from config. Another instance might have changed it in the meantime.
248  mSettings->readConfig();
249 
250  const QString resourceId = defaultResourceId( mSettings );
251 
252  kDebug() << "Read defaultResourceId" << resourceId << "from config.";
253 
254  const AgentInstance resource = AgentManager::self()->instance( resourceId );
255  if ( resource.isValid() ) {
256  // The resource exists; scan it.
257  mResourceWasPreexisting = true;
258  kDebug() << "Found resource" << resourceId;
259  q->setResourceId( resourceId );
260 
261  CollectionFetchJob *fetchJob = new CollectionFetchJob( Collection::root(), CollectionFetchJob::Recursive, q );
262  fetchJob->fetchScope().setResource( resourceId );
263  fetchJob->fetchScope().setIncludeStatistics( true );
264  q->connect( fetchJob, SIGNAL(result(KJob*)), q, SLOT(collectionFetchResult(KJob*)) );
265  } else {
266  // Try harder: maybe the default resource has been removed and another one added
267  // without updating the config file, in this case search for a resource
268  // of the same type and the default name
269  const AgentInstance::List resources = AgentManager::self()->instances();
270  foreach ( const AgentInstance &resource, resources ) {
271  if ( resource.type().identifier() == mDefaultResourceType ) {
272  if ( resource.name() == mDefaultResourceOptions.value( QLatin1String( "Name" ) ).toString() ) {
273  // found a matching one...
274  setDefaultResourceId( mSettings, resource.identifier() );
275  mSettings->writeConfig();
276  mResourceWasPreexisting = true;
277  kDebug() << "Found resource" << resource.identifier();
278  q->setResourceId( resource.identifier() );
279  q->ResourceScanJob::doStart();
280  return;
281  }
282  }
283  }
284 
285  // Create the resource.
286  mResourceWasPreexisting = false;
287  kDebug() << "Creating maildir resource.";
288  const AgentType type = AgentManager::self()->type( mDefaultResourceType );
289  AgentInstanceCreateJob *job = new AgentInstanceCreateJob( type, q );
290  QObject::connect( job, SIGNAL(result(KJob*)), q, SLOT(resourceCreateResult(KJob*)) );
291  job->start(); // non-Akonadi::Job
292  }
293 }
294 
295 void DefaultResourceJobPrivate::resourceCreateResult( KJob *job )
296 {
297  if ( job->error() ) {
298  kWarning() << job->errorText();
299  //fail( i18n( "Failed to create the default resource (%1).", job->errorString() ) );
300  q->setError( job->error() );
301  q->setErrorText( job->errorText() );
302  q->emitResult();
303  return;
304  }
305 
306  AgentInstance agent;
307 
308  // Get the resource instance.
309  {
310  AgentInstanceCreateJob *createJob = qobject_cast<AgentInstanceCreateJob*>( job );
311  Q_ASSERT( createJob );
312  agent = createJob->instance();
313  setDefaultResourceId( mSettings, agent.identifier() );
314  kDebug() << "Created maildir resource with id" << defaultResourceId( mSettings );
315  }
316 
317  const QString defaultId = defaultResourceId( mSettings );
318 
319  // Configure the resource.
320  {
321  agent.setName( mDefaultResourceOptions.value( QLatin1String( "Name" ) ).toString() );
322 
323  QDBusInterface conf( QString::fromLatin1( "org.freedesktop.Akonadi.Resource." ) + defaultId,
324  QString::fromLatin1( "/Settings" ), QString() );
325 
326  if ( !conf.isValid() ) {
327  q->setError( -1 );
328  q->setErrorText( i18n( "Invalid resource identifier '%1'", defaultId ) );
329  q->emitResult();
330  return;
331  }
332 
333  QMapIterator<QString, QVariant> it( mDefaultResourceOptions );
334  while ( it.hasNext() ) {
335  it.next();
336 
337  if ( it.key() == QLatin1String( "Name" ) )
338  continue;
339 
340  const QString methodName = QString::fromLatin1( "set%1" ).arg( it.key() );
341  const QVariant::Type argType = argumentType( conf.metaObject(), methodName );
342  if ( argType == QVariant::Invalid ) {
343  q->setError( Job::Unknown );
344  q->setErrorText( i18n( "Failed to configure default resource via D-Bus." ) );
345  q->emitResult();
346  return;
347  }
348 
349  QDBusReply<void> reply = conf.call( methodName, it.value() );
350  if ( !reply.isValid() ) {
351  q->setError( Job::Unknown );
352  q->setErrorText( i18n( "Failed to configure default resource via D-Bus." ) );
353  q->emitResult();
354  return;
355  }
356  }
357 
358  conf.call( QLatin1String( "writeConfig" ) );
359 
360  agent.reconfigure();
361  }
362 
363  // Sync the resource.
364  {
365  ResourceSynchronizationJob *syncJob = new ResourceSynchronizationJob( agent, q );
366  QObject::connect( syncJob, SIGNAL(result(KJob*)), q, SLOT(resourceSyncResult(KJob*)) );
367  syncJob->start(); // non-Akonadi
368  }
369 }
370 
371 void DefaultResourceJobPrivate::resourceSyncResult( KJob *job )
372 {
373  if ( job->error() ) {
374  kWarning() << job->errorText();
375  //fail( i18n( "ResourceSynchronizationJob failed (%1).", job->errorString() ) );
376  return;
377  }
378 
379  // Fetch the collections of the resource.
380  kDebug() << "Fetching maildir collections.";
381  CollectionFetchJob *fetchJob = new CollectionFetchJob( Collection::root(), CollectionFetchJob::Recursive, q );
382  fetchJob->fetchScope().setResource( defaultResourceId( mSettings ) );
383  QObject::connect( fetchJob, SIGNAL(result(KJob*)), q, SLOT(collectionFetchResult(KJob*)) );
384 }
385 
386 void DefaultResourceJobPrivate::collectionFetchResult( KJob *job )
387 {
388  if ( job->error() ) {
389  kWarning() << job->errorText();
390  //fail( i18n( "Failed to fetch the root maildir collection (%1).", job->errorString() ) );
391  return;
392  }
393 
394  CollectionFetchJob *fetchJob = qobject_cast<CollectionFetchJob *>( job );
395  Q_ASSERT( fetchJob );
396 
397  const Collection::List collections = fetchJob->collections();
398  kDebug() << "Fetched" << collections.count() << "collections.";
399 
400  // Find the root maildir collection.
401  Collection::List toRecover;
402  Collection resourceCollection;
403  foreach ( const Collection &collection, collections ) {
404  if ( collection.parentCollection() == Collection::root() ) {
405  resourceCollection = collection;
406  toRecover.append( collection );
407  break;
408  }
409  }
410 
411  if ( !resourceCollection.isValid() ) {
412  q->setError( Job::Unknown );
413  q->setErrorText( i18n( "Failed to fetch the resource collection." ) );
414  q->emitResult();
415  return;
416  }
417 
418  // Find all children of the resource collection.
419  foreach ( const Collection &collection, collections ) {
420  if ( collection.parentCollection() == resourceCollection ) {
421  toRecover.append( collection );
422  }
423  }
424 
425  QHash<QString, QByteArray> typeForName;
426  foreach ( const QByteArray &type, mKnownTypes ) {
427  const QString displayName = mNameForTypeMap.value( type );
428  typeForName[ displayName ] = type;
429  }
430 
431  // These collections have been created by the maildir resource, when it
432  // found the folders on disk. So give them the necessary attributes now.
433  Q_ASSERT( mPendingModifyJobs == 0 );
434  foreach ( Collection collection, toRecover ) { // krazy:exclude=foreach
435 
436  if ( collection.hasAttribute<SpecialCollectionAttribute>() )
437  continue;
438 
439  // Find the type for the collection.
440  const QString name = collection.displayName();
441  const QByteArray type = typeForName.value( name );
442 
443  if ( !type.isEmpty() ) {
444  kDebug() << "Recovering collection" << name;
445  setCollectionAttributes( collection, type, mNameForTypeMap, mIconForTypeMap );
446 
447  CollectionModifyJob *modifyJob = new CollectionModifyJob( collection, q );
448  QObject::connect( modifyJob, SIGNAL(result(KJob*)), q, SLOT(collectionModifyResult(KJob*)) );
449  mPendingModifyJobs++;
450  } else {
451  kDebug() << "Searching for names: " << typeForName.keys();
452  kDebug() << "Unknown collection name" << name << "-- not recovering.";
453  }
454  }
455 
456  if ( mPendingModifyJobs == 0 ) {
457  // Scan the resource.
458  q->setResourceId( defaultResourceId( mSettings ) );
459  q->ResourceScanJob::doStart();
460  }
461 }
462 
463 void DefaultResourceJobPrivate::collectionModifyResult( KJob *job )
464 {
465  if ( job->error() ) {
466  kWarning() << job->errorText();
467  //fail( i18n( "Failed to modify the root maildir collection (%1).", job->errorString() ) );
468  return;
469  }
470 
471  Q_ASSERT( mPendingModifyJobs > 0 );
472  mPendingModifyJobs--;
473  kDebug() << "pendingModifyJobs now" << mPendingModifyJobs;
474  if ( mPendingModifyJobs == 0 ) {
475  // Write the updated config.
476  kDebug() << "Writing defaultResourceId" << defaultResourceId( mSettings ) << "to config.";
477  mSettings->writeConfig();
478 
479  // Scan the resource.
480  q->setResourceId( defaultResourceId( mSettings ) );
481  q->ResourceScanJob::doStart();
482  }
483 }
484 
485 DefaultResourceJob::DefaultResourceJob( KCoreConfigSkeleton *settings, QObject *parent )
486  : ResourceScanJob( QString(), settings, parent ),
487  d( new DefaultResourceJobPrivate( settings, this ) )
488 {
489 }
490 
491 DefaultResourceJob::~DefaultResourceJob()
492 {
493  delete d;
494 }
495 
496 void DefaultResourceJob::setDefaultResourceType( const QString &type )
497 {
498  d->mDefaultResourceType = type;
499 }
500 
501 void DefaultResourceJob::setDefaultResourceOptions( const QVariantMap &options )
502 {
503  d->mDefaultResourceOptions = options;
504 }
505 
506 void DefaultResourceJob::setTypes( const QList<QByteArray> &types )
507 {
508  d->mKnownTypes = types;
509 }
510 
511 void DefaultResourceJob::setNameForTypeMap( const QMap<QByteArray, QString> &map )
512 {
513  d->mNameForTypeMap = map;
514 }
515 
516 void DefaultResourceJob::setIconForTypeMap( const QMap<QByteArray, QString> &map )
517 {
518  d->mIconForTypeMap = map;
519 }
520 
521 void DefaultResourceJob::doStart()
522 {
523  d->tryFetchResource();
524 }
525 
526 void DefaultResourceJob::slotResult( KJob *job )
527 {
528  if ( job->error() ) {
529  kWarning() << job->errorText();
530  // Do some cleanup.
531  if ( !d->mResourceWasPreexisting ) {
532  // We only removed the resource instance if we have created it.
533  // Otherwise we might lose the user's data.
534  const AgentInstance resource = AgentManager::self()->instance( defaultResourceId( d->mSettings ) );
535  kDebug() << "Removing resource" << resource.identifier();
536  AgentManager::self()->removeInstance( resource );
537  }
538  }
539 
540  Job::slotResult( job );
541 }
542 
543 // ===================== GetLockJob ============================
544 
545 class Akonadi::GetLockJob::Private
546 {
547  public:
548  Private( GetLockJob *qq );
549 
550  void doStart(); // slot
551  void serviceOwnerChanged( const QString &name, const QString &oldOwner,
552  const QString &newOwner ); // slot
553  void timeout(); // slot
554 
555  GetLockJob *const q;
556  QTimer *mSafetyTimer;
557 };
558 
559 GetLockJob::Private::Private( GetLockJob *qq )
560  : q( qq ),
561  mSafetyTimer( 0 )
562 {
563 }
564 
565 void GetLockJob::Private::doStart()
566 {
567  // Just doing registerService() and checking its return value is not sufficient,
568  // since we may *already* own the name, and then registerService() returns true.
569 
570  QDBusConnection bus = DBusConnectionPool::threadConnection();
571  const bool alreadyLocked = bus.interface()->isServiceRegistered( dbusServiceName() );
572  const bool gotIt = bus.registerService( dbusServiceName() );
573 
574  if ( gotIt && !alreadyLocked ) {
575  //kDebug() << "Got lock immediately.";
576  q->emitResult();
577  } else {
578  QDBusServiceWatcher *watcher = new QDBusServiceWatcher( dbusServiceName(), DBusConnectionPool::threadConnection(),
579  QDBusServiceWatcher::WatchForOwnerChange, q );
580  //kDebug() << "Waiting for lock.";
581  connect( watcher, SIGNAL(serviceOwnerChanged(QString,QString,QString)),
582  q, SLOT(serviceOwnerChanged(QString,QString,QString)) );
583 
584  mSafetyTimer = new QTimer( q );
585  mSafetyTimer->setSingleShot( true );
586  mSafetyTimer->setInterval( LOCK_WAIT_TIMEOUT_SECONDS * 1000 );
587  mSafetyTimer->start();
588  connect( mSafetyTimer, SIGNAL(timeout()), q, SLOT(timeout()) );
589  }
590 }
591 
592 void GetLockJob::Private::serviceOwnerChanged( const QString&, const QString&, const QString &newOwner )
593 {
594  if ( newOwner.isEmpty() ) {
595  const bool gotIt = DBusConnectionPool::threadConnection().registerService( dbusServiceName() );
596  if ( gotIt ) {
597  mSafetyTimer->stop();
598  q->emitResult();
599  }
600  }
601 }
602 
603 void GetLockJob::Private::timeout()
604 {
605  kWarning() << "Timeout trying to get lock. Check who has acquired the name" << dbusServiceName() << "on DBus, using qdbus or qdbusviewer.";
606  q->setError( Job::Unknown );
607  q->setErrorText( i18n( "Timeout trying to get lock." ) );
608  q->emitResult();
609 }
610 
611 GetLockJob::GetLockJob( QObject *parent )
612  : KJob( parent ),
613  d( new Private( this ) )
614 {
615 }
616 
617 GetLockJob::~GetLockJob()
618 {
619  delete d;
620 }
621 
622 void GetLockJob::start()
623 {
624  QTimer::singleShot( 0, this, SLOT(doStart()) );
625 }
626 
627 void Akonadi::setCollectionAttributes( Akonadi::Collection &collection, const QByteArray &type,
628  const QMap<QByteArray, QString> &nameForType,
629  const QMap<QByteArray, QString> &iconForType )
630 {
631  {
632  EntityDisplayAttribute *attr = new EntityDisplayAttribute;
633  attr->setIconName( iconForType.value( type ) );
634  attr->setDisplayName( nameForType.value( type ) );
635  collection.addAttribute( attr );
636  }
637 
638  {
639  SpecialCollectionAttribute *attr = new SpecialCollectionAttribute;
640  attr->setCollectionType( type );
641  collection.addAttribute( attr );
642  }
643 }
644 
645 bool Akonadi::releaseLock()
646 {
647  return DBusConnectionPool::threadConnection().unregisterService( dbusServiceName() );
648 }
649 
650 #include "moc_specialcollectionshelperjobs_p.cpp"
Akonadi::CollectionModifyJob
Job that modifies a collection in the Akonadi storage.
Definition: collectionmodifyjob.h:82
Akonadi::AgentInstance::List
QList< AgentInstance > List
Describes a list of agent instances.
Definition: agentinstance.h:71
Akonadi::AgentManager::instances
AgentInstance::List instances() const
Returns the list of all available agent instances.
Definition: agentmanager.cpp:399
Akonadi::DefaultResourceJob::setNameForTypeMap
void setNameForTypeMap(const QMap< QByteArray, QString > &map)
Sets the map of special collection types to display names.
Definition: specialcollectionshelperjobs.cpp:511
Akonadi::CollectionFetchJob::collections
Collection::List collections() const
Returns the list of fetched collection.
Definition: collectionfetchjob.cpp:175
Akonadi::releaseLock
bool AKONADI_TESTS_EXPORT releaseLock()
Releases the SpecialCollectionsRequestJob lock that was obtained through GetLockJob.
Definition: specialcollectionshelperjobs.cpp:645
Akonadi::ServerManager::instanceIdentifier
static QString instanceIdentifier()
Returns the identifier of the Akonadi instance we are connected to.
Definition: servermanager.cpp:275
Akonadi::Collection::displayName
QString displayName() const
Returns the display name (EntityDisplayAttribute::displayName()) if set, and Collection::name() other...
Definition: collection.cpp:86
Akonadi::GetLockJob::GetLockJob
GetLockJob(QObject *parent=0)
Creates a new GetLockJob.
Definition: specialcollectionshelperjobs.cpp:611
Akonadi::Job::Unknown
Unknown error.
Definition: job.h:109
Akonadi::CollectionFetchJob::fetchScope
CollectionFetchScope & fetchScope()
Returns the collection fetch scope.
Definition: collectionfetchjob.cpp:437
Akonadi::CollectionFetchScope::setResource
void setResource(const QString &resource)
Sets a resource filter, that is only collections owned by the specified resource are retrieved...
Definition: collectionfetchscope.cpp:114
Akonadi::Collection
Represents a collection of PIM items.
Definition: collection.h:75
Akonadi::AgentInstance::type
AgentType type() const
Returns the agent type of this instance.
Definition: agentinstance.cpp:50
Akonadi::CollectionFetchJob
Job that fetches collections from the Akonadi storage.
Definition: collectionfetchjob.h:53
Akonadi::DefaultResourceJob::setDefaultResourceOptions
void setDefaultResourceOptions(const QVariantMap &options)
Sets the configuration options that shall be applied to the new resource that is created if the reque...
Definition: specialcollectionshelperjobs.cpp:501
Akonadi::CollectionFetchScope::setIncludeStatistics
void setIncludeStatistics(bool include)
Sets whether collection statistics should be included in the retrieved results.
Definition: collectionfetchscope.cpp:104
Akonadi::SpecialCollectionAttribute
An Attribute that stores the special collection type of a collection.
Definition: specialcollectionattribute_p.h:39
Akonadi::DefaultResourceJob::doStart
virtual void doStart()
This method must be reimplemented in the concrete jobs.
Definition: specialcollectionshelperjobs.cpp:521
Akonadi::GetLockJob
Definition: specialcollectionshelperjobs_p.h:194
Akonadi::AgentInstance::identifier
QString identifier() const
Returns the unique identifier of the agent instance.
Definition: agentinstance.cpp:55
Akonadi::Job
Base class for all actions in the Akonadi storage.
Definition: job.h:86
Akonadi::AgentType::identifier
QString identifier() const
Returns the unique identifier of the agent type.
Definition: agenttype.cpp:46
Akonadi::AgentManager::removeInstance
void removeInstance(const AgentInstance &instance)
Removes the given agent instance.
Definition: agentmanager.cpp:409
Akonadi::ResourceScanJob::~ResourceScanJob
~ResourceScanJob()
Destroys this ResourceScanJob.
Definition: specialcollectionshelperjobs.cpp:168
Akonadi::ResourceSynchronizationJob
Job that synchronizes a resource.
Definition: resourcesynchronizationjob.h:59
Akonadi::ResourceScanJob::ResourceScanJob
ResourceScanJob(const QString &resourceId, KCoreConfigSkeleton *settings, QObject *parent=0)
Creates a new ResourceScanJob.
Definition: specialcollectionshelperjobs.cpp:161
Akonadi::AgentType
A representation of an agent type.
Definition: agenttype.h:58
Akonadi::Entity::parentCollection
Collection parentCollection() const
Returns the parent collection of this object.
Definition: entity.cpp:186
Akonadi::Entity::addAttribute
void addAttribute(Attribute *attribute)
Adds an attribute to the entity.
Definition: entity.cpp:126
Akonadi::AgentManager::instance
AgentInstance instance(const QString &identifier) const
Returns the agent instance with the given identifier or an invalid agent instance if the identifier d...
Definition: agentmanager.cpp:404
Akonadi::EntityDisplayAttribute::setIconName
void setIconName(const QString &name)
Sets the icon name for the default icon.
Definition: entitydisplayattribute.cpp:69
Akonadi::AgentInstance::isValid
bool isValid() const
Returns whether the agent instance object is valid.
Definition: agentinstance.cpp:45
Akonadi::Collection::root
static Collection root()
Returns the root collection.
Definition: collection.cpp:192
Akonadi::DefaultResourceJob
Definition: specialcollectionshelperjobs_p.h:116
Akonadi::EntityDisplayAttribute::setDisplayName
void setDisplayName(const QString &name)
Sets the name that should be used for display.
Definition: entitydisplayattribute.cpp:54
Akonadi::Entity::id
Id id() const
Returns the unique identifier of the entity.
Definition: entity.cpp:72
Akonadi::ResourceScanJob::rootResourceCollection
Akonadi::Collection rootResourceCollection() const
Returns the root collection of the resource being scanned.
Definition: specialcollectionshelperjobs.cpp:183
Akonadi::AgentManager::type
AgentType type(const QString &identifier) const
Returns the agent type with the given identifier or an invalid agent type if the identifier does not ...
Definition: agentmanager.cpp:394
Akonadi::AgentInstance::setName
void setName(const QString &name)
Sets the user visible name of the agent instance.
Definition: agentinstance.cpp:60
Akonadi::ResourceScanJob::specialCollections
Akonadi::Collection::List specialCollections() const
Returns all the collections of this resource which have a SpecialCollectionAttribute.
Definition: specialcollectionshelperjobs.cpp:188
Akonadi::AgentInstanceCreateJob
Job for creating new agent instances.
Definition: agentinstancecreatejob.h:71
Akonadi::SpecialCollectionAttribute::setCollectionType
void setCollectionType(const QByteArray &type)
Sets the special collections type of the collection.
Definition: specialcollectionattribute.cpp:69
Akonadi::DefaultResourceJob::setIconForTypeMap
void setIconForTypeMap(const QMap< QByteArray, QString > &map)
Sets the map of special collection types to icon names.
Definition: specialcollectionshelperjobs.cpp:516
Akonadi::AgentInstance::name
QString name() const
Returns the user visible name of the agent instance.
Definition: agentinstance.cpp:65
Akonadi::Entity::hasAttribute
bool hasAttribute(const QByteArray &name) const
Returns true if the entity has an attribute of the given type name, false otherwise.
Definition: entity.cpp:146
Akonadi::ResourceScanJob::setResourceId
void setResourceId(const QString &resourceId)
Sets the resource ID of the resource to scan.
Definition: specialcollectionshelperjobs.cpp:178
Akonadi::AgentManager::self
static AgentManager * self()
Returns the global instance of the agent manager.
Definition: agentmanager.cpp:380
Akonadi::ResourceScanJob
Definition: specialcollectionshelperjobs_p.h:45
Akonadi::AgentInstance
A representation of an agent instance.
Definition: agentinstance.h:62
Akonadi::DefaultResourceJob::setDefaultResourceType
void setDefaultResourceType(const QString &type)
Sets the type of the resource that shall be created if the requested special collection does not exis...
Definition: specialcollectionshelperjobs.cpp:496
Akonadi::Entity::isValid
bool isValid() const
Returns whether the entity is valid.
Definition: entity.cpp:97
Akonadi::DefaultResourceJob::setTypes
void setTypes(const QList< QByteArray > &types)
Sets the list of well known special collection types.
Definition: specialcollectionshelperjobs.cpp:506
Akonadi::GetLockJob::~GetLockJob
~GetLockJob()
Destroys the GetLockJob.
Definition: specialcollectionshelperjobs.cpp:617
Akonadi::ResourceScanJob::doStart
virtual void doStart()
This method must be reimplemented in the concrete jobs.
Definition: specialcollectionshelperjobs.cpp:193
Akonadi::CollectionFetchJob::Recursive
List all sub-collections.
Definition: collectionfetchjob.h:64
Akonadi::Collection::List
QList< Collection > List
Describes a list of collections.
Definition: collection.h:81
Akonadi::EntityDisplayAttribute
Attribute that stores the properties that are used to display an entity.
Definition: entitydisplayattribute.h:39
Akonadi::ResourceScanJob::resourceId
QString resourceId() const
Returns the resource ID of the resource being scanned.
Definition: specialcollectionshelperjobs.cpp:173
Akonadi::ServerManager::hasInstanceIdentifier
static bool hasInstanceIdentifier()
Returns true if we are connected to a non-default Akonadi server instance.
Definition: servermanager.cpp:280
Akonadi::DefaultResourceJob::~DefaultResourceJob
~DefaultResourceJob()
Destroys the DefaultResourceJob.
Definition: specialcollectionshelperjobs.cpp:491
Akonadi::setCollectionAttributes
void setCollectionAttributes(Akonadi::Collection &col, const QByteArray &type, const QMap< QByteArray, QString > &nameForType, const QMap< QByteArray, QString > &iconForType)
Sets on col the required attributes of SpecialCollection type type These are a SpecialCollectionAttri...
Definition: specialcollectionshelperjobs.cpp:627
Akonadi::AgentInstanceCreateJob::start
void start()
Starts the instance creation.
Definition: agentinstancecreatejob.cpp:175
Akonadi::DefaultResourceJob::DefaultResourceJob
DefaultResourceJob(KCoreConfigSkeleton *settings, QObject *parent=0)
Creates a new DefaultResourceJob.
Definition: specialcollectionshelperjobs.cpp:485
Akonadi::AgentInstance::reconfigure
void reconfigure() const
Tell the agent that its configuration has been changed remotely via D-Bus.
Definition: agentinstance.cpp:149
Akonadi::AgentInstanceCreateJob::instance
AgentInstance instance() const
Returns the AgentInstance object of the newly created agent instance.
Definition: agentinstancecreatejob.cpp:170
This file is part of the KDE documentation.
Documentation copyright © 1996-2014 The KDE developers.
Generated on Tue Oct 14 2014 23:00:28 by doxygen 1.8.7 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

akonadi

Skip menu "akonadi"
  • Main Page
  • Namespace List
  • Namespace Members
  • Alphabetical List
  • Class List
  • Class Hierarchy
  • Class Members
  • File List
  • Modules
  • Related Pages

kdepimlibs API Reference

Skip menu "kdepimlibs API Reference"
  • akonadi
  •   contact
  •   kmime
  •   socialutils
  • kabc
  • kalarmcal
  • kblog
  • kcal
  • kcalcore
  • kcalutils
  • kholidays
  • kimap
  • kldap
  • kmbox
  • kmime
  • kpimidentities
  • kpimtextedit
  • kresources
  • ktnef
  • kxmlrpcclient
  • microblog

Search



Report problems with this website to our bug tracking system.
Contact the specific authors with questions and comments about the page contents.

KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal