18 #include "resourcesynchronizationjob.h"
19 #include "dbusconnectionpool.h"
20 #include "kjobprivatebase_p.h"
22 #include <akonadi/agentinstance.h>
23 #include <akonadi/agentmanager.h>
28 #include <QDBusConnection>
29 #include <QDBusInterface>
35 class ResourceSynchronizationJobPrivate :
public KJobPrivateBase
38 ResourceSynchronizationJobPrivate( ResourceSynchronizationJob* parent ) :
43 collectionTreeOnly( false )
48 ResourceSynchronizationJob *q;
49 AgentInstance instance;
50 QDBusInterface* interface;
53 bool collectionTreeOnly;
54 static int timeoutCountLimit;
56 void slotSynchronized();
60 int ResourceSynchronizationJobPrivate::timeoutCountLimit = 60;
62 ResourceSynchronizationJob::ResourceSynchronizationJob(
const AgentInstance& instance, QObject* parent) :
64 d( new ResourceSynchronizationJobPrivate( this ) )
66 d->instance = instance;
67 d->safetyTimer =
new QTimer(
this );
68 connect( d->safetyTimer, SIGNAL(timeout()), SLOT(slotTimeout()) );
69 d->safetyTimer->setInterval( 10 * 1000 );
70 d->safetyTimer->setSingleShot(
false );
73 ResourceSynchronizationJob::~ResourceSynchronizationJob()
78 void ResourceSynchronizationJob::start()
83 bool ResourceSynchronizationJob::collectionTreeOnly()
const
85 return d->collectionTreeOnly;
88 void ResourceSynchronizationJob::setCollectionTreeOnly(
bool b )
90 d->collectionTreeOnly = b;
93 void ResourceSynchronizationJobPrivate::doStart()
95 if ( !instance.isValid() ) {
96 q->setError( KJob::UserDefinedError );
97 q->setErrorText( i18n(
"Invalid resource instance." ) );
102 interface = new QDBusInterface( QString::fromLatin1( "org.freedesktop.Akonadi.Resource.%1" ).arg( instance.identifier() ),
103 QString::fromLatin1( "/" ),
104 QString::fromLatin1( "org.freedesktop.Akonadi.Resource" ),
105 DBusConnectionPool::threadConnection(), this );
106 if ( collectionTreeOnly )
107 connect( interface, SIGNAL(collectionTreeSynchronized()), q, SLOT(slotSynchronized()) );
109 connect( interface, SIGNAL(synchronized()), q, SLOT(slotSynchronized()) );
111 if ( interface->isValid() ) {
112 if ( collectionTreeOnly )
113 instance.synchronizeCollectionTree();
115 instance.synchronize();
117 safetyTimer->start();
119 q->setError( KJob::UserDefinedError );
120 q->setErrorText( i18n(
"Unable to obtain D-Bus interface for resource '%1'", instance.identifier() ) );
126 void ResourceSynchronizationJobPrivate::slotSynchronized()
128 if ( collectionTreeOnly )
129 q->disconnect( interface, SIGNAL(collectionTreeSynchronized()), q, SLOT(slotSynchronized()) );
131 q->disconnect( interface, SIGNAL(
synchronized()), q, SLOT(slotSynchronized()) );
136 void ResourceSynchronizationJobPrivate::slotTimeout()
141 if ( timeoutCount > timeoutCountLimit ) {
143 q->setError( KJob::UserDefinedError );
144 q->setErrorText( i18n(
"Resource synchronization timed out." ) );
151 kDebug() <<
"trying again to sync resource" << instance.
identifier();
152 if ( collectionTreeOnly )
153 instance.synchronizeCollectionTree();
155 instance.synchronize();
159 AgentInstance ResourceSynchronizationJob::resource()
const
166 #include "resourcesynchronizationjob.moc"