18 #include "collectionattributessynchronizationjob.h"
19 #include "dbusconnectionpool.h"
20 #include "kjobprivatebase_p.h"
21 #include "servermanager.h"
23 #include <akonadi/agentinstance.h>
24 #include <akonadi/agentmanager.h>
25 #include <akonadi/collection.h>
30 #include <QDBusConnection>
31 #include <QDBusInterface>
37 class CollectionAttributesSynchronizationJobPrivate :
public KJobPrivateBase
40 CollectionAttributesSynchronizationJobPrivate( CollectionAttributesSynchronizationJob* parent )
50 CollectionAttributesSynchronizationJob *q;
51 AgentInstance instance;
52 Collection collection;
53 QDBusInterface* interface;
56 static int timeoutCountLimit;
58 void slotSynchronized( qlonglong );
62 int CollectionAttributesSynchronizationJobPrivate::timeoutCountLimit = 60;
66 d( new CollectionAttributesSynchronizationJobPrivate( this ) )
69 d->collection = collection;
70 d->safetyTimer =
new QTimer(
this );
71 connect( d->safetyTimer, SIGNAL(timeout()), SLOT(slotTimeout()) );
72 d->safetyTimer->setInterval( 10 * 1000 );
73 d->safetyTimer->setSingleShot(
false );
81 void CollectionAttributesSynchronizationJob::start()
86 void CollectionAttributesSynchronizationJobPrivate::doStart()
88 if ( !collection.isValid() ) {
89 q->setError( KJob::UserDefinedError );
90 q->setErrorText( i18n(
"Invalid collection instance." ) );
95 if ( !instance.isValid() ) {
96 q->setError( KJob::UserDefinedError );
97 q->setErrorText( i18n(
"Invalid resource instance." ) );
102 interface = new QDBusInterface( ServerManager::agentServiceName( ServerManager::Resource, instance.identifier() ),
103 QString::fromLatin1( "/" ),
104 QString::fromLatin1( "org.freedesktop.Akonadi.Resource" ),
105 DBusConnectionPool::threadConnection(), this );
106 connect( interface, SIGNAL(attributesSynchronized(qlonglong)),
107 q, SLOT(slotSynchronized(qlonglong)) );
109 if ( interface->isValid() ) {
110 const QDBusMessage reply = interface->call( QString::fromUtf8(
"synchronizeCollectionAttributes" ), collection.id() );
111 if ( reply.type() == QDBusMessage::ErrorMessage ) {
116 safetyTimer->start();
118 q->setError( KJob::UserDefinedError );
119 q->setErrorText( i18n(
"Unable to obtain D-Bus interface for resource '%1'", instance.identifier() ) );
125 void CollectionAttributesSynchronizationJobPrivate::slotSynchronized( qlonglong
id )
127 if (
id == collection.id() ) {
128 q->disconnect( interface, SIGNAL(attributesSynchronized(qlonglong)),
129 q, SLOT(slotSynchronized(qlonglong)) );
135 void CollectionAttributesSynchronizationJobPrivate::slotTimeout()
140 if ( timeoutCount > timeoutCountLimit ) {
142 q->setError( KJob::UserDefinedError );
143 q->setErrorText( i18n(
"Collection attributes synchronization timed out." ) );
150 kDebug() <<
"trying again to sync collection attributes" << collection.id() << instance.
identifier();
151 interface->call( QString::fromUtf8(
"synchronizeCollectionAttributes" ), collection.id() );
157 #include "moc_collectionattributessynchronizationjob.cpp"