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

akonadi

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

Skip menu "kdepimlibs-4.13.3 API Reference"
  • akonadi
  •   contact
  •   kmime
  •   socialutils
  • kabc
  • kalarmcal
  • kblog
  • kcal
  • kcalcore
  • kcalutils
  • kholidays
  • kimap
  • kioslave
  •   imap4
  •   mbox
  •   nntp
  • kldap
  • kmbox
  • kmime
  • kontactinterface
  • kpimidentities
  • kpimtextedit
  • kpimutils
  • kresources
  • ktnef
  • kxmlrpcclient
  • mailtransport
  • microblog
  • qgpgme
  • syndication
  •   atom
  •   rdf
  •   rss2
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