20 #include "specialcollectionsrequestjob.h"
22 #include "specialcollectionattribute_p.h"
23 #include "specialcollections.h"
24 #include "specialcollections_p.h"
25 #include "specialcollectionshelperjobs_p.h"
27 #include "akonadi/agentmanager.h"
28 #include "akonadi/collectioncreatejob.h"
29 #include "akonadi/entitydisplayattribute.h"
33 #include <QtCore/QVariant>
35 using namespace Akonadi;
40 class Akonadi::SpecialCollectionsRequestJobPrivate
45 bool isEverythingReady();
46 void lockResult( KJob *job );
49 void resourceScanResult( KJob *job );
50 void createRequestedFolders(
ResourceScanJob *job, QHash<QByteArray, bool> &requestedFolders );
51 void collectionCreateResult( KJob *job );
55 int mPendingCreateJobs;
57 QByteArray mRequestedType;
61 QHash<QByteArray, bool> mDefaultFolders;
62 bool mRequestingDefaultFolders;
63 QHash< QString, QHash<QByteArray, bool> > mFoldersForResource;
64 QString mDefaultResourceType;
65 QVariantMap mDefaultResourceOptions;
66 QList<QByteArray> mKnownTypes;
67 QMap<QByteArray, QString> mNameForTypeMap;
68 QMap<QByteArray, QString> mIconForTypeMap;
71 QStringList mToForget;
72 QVector< QPair<Collection, QByteArray> > mToRegister;
77 SpecialCollectionsRequestJobPrivate::SpecialCollectionsRequestJobPrivate(
SpecialCollections *collections,
80 mSpecialCollections( collections ),
81 mPendingCreateJobs( 0 ),
82 mRequestingDefaultFolders( false )
86 bool SpecialCollectionsRequestJobPrivate::isEverythingReady()
89 if ( mRequestingDefaultFolders ) {
90 QHashIterator<QByteArray, bool> it( mDefaultFolders );
91 while ( it.hasNext() ) {
93 if ( it.value() && !mSpecialCollections->hasDefaultCollection( it.key() ) )
98 const QStringList resourceIds = mFoldersForResource.keys();
99 QHashIterator< QString, QHash<QByteArray, bool> > resourceIt( mFoldersForResource );
100 while ( resourceIt.hasNext() ) {
103 const QHash<QByteArray, bool> &requested = resourceIt.value();
104 QHashIterator<QByteArray, bool> it( requested );
105 while ( it.hasNext() ) {
115 void SpecialCollectionsRequestJobPrivate::lockResult( KJob *job )
117 if ( job->error() ) {
118 kWarning() <<
"Failed to get lock:" << job->errorString();
119 q->setError( job->error() );
120 q->setErrorText( job->errorString() );
125 if ( mRequestingDefaultFolders ) {
133 QObject::connect( resjob, SIGNAL(result(KJob*)), q, SLOT(resourceScanResult(KJob*)) );
140 void SpecialCollectionsRequestJobPrivate::releaseLock()
144 kWarning() <<
"WTF, can't release lock.";
148 void SpecialCollectionsRequestJobPrivate::nextResource()
150 if ( mFoldersForResource.isEmpty() ) {
151 kDebug() <<
"All done! Comitting.";
153 mSpecialCollections->d->beginBatchRegister();
156 foreach (
const QString &resourceId, mToForget ) {
157 mSpecialCollections->d->forgetFoldersForResource( resourceId );
161 typedef QPair<Collection, QByteArray> RegisterPair;
162 foreach (
const RegisterPair &pair, mToRegister ) {
163 const bool ok = mSpecialCollections->registerCollection( pair.second, pair.first );
168 mSpecialCollections->d->endBatchRegister();
171 QObject::connect( q, SIGNAL(result(KJob*)), q, SLOT(
releaseLock()) );
177 const QString resourceId = mFoldersForResource.keys().first();
178 kDebug() <<
"A resource is done," << mFoldersForResource.count()
179 <<
"more to do. Now doing resource" << resourceId;
181 QObject::connect( resjob, SIGNAL(result(KJob*)), q, SLOT(resourceScanResult(KJob*)) );
185 void SpecialCollectionsRequestJobPrivate::resourceScanResult( KJob *job )
190 const QString resourceId = resjob->
resourceId();
191 kDebug() <<
"resourceId" << resourceId;
193 if ( job->error() ) {
194 kWarning() <<
"Failed to request resource" << resourceId <<
":" << job->errorString();
198 if ( qobject_cast<DefaultResourceJob*>( job ) ) {
200 if ( resourceId != mSpecialCollections->d->defaultResourceId() ) {
201 kError() <<
"Resource id's don't match: " << resourceId
202 << mSpecialCollections->d->defaultResourceId();
206 createRequestedFolders( resjob, mDefaultFolders );
209 QHash<QByteArray, bool> requestedFolders = mFoldersForResource[ resourceId ];
210 mFoldersForResource.remove( resourceId );
211 createRequestedFolders( resjob, requestedFolders );
215 void SpecialCollectionsRequestJobPrivate::createRequestedFolders(
ResourceScanJob *scanJob,
216 QHash<QByteArray, bool> &requestedFolders )
224 if ( !type.isEmpty() ) {
225 mToRegister.append( qMakePair( collection, type ) );
226 requestedFolders.insert( type,
false );
232 Q_ASSERT( mPendingCreateJobs == 0 );
235 QHashIterator<QByteArray, bool> it( requestedFolders );
236 while ( it.hasNext() ) {
242 collection.
setName( mNameForTypeMap.value( it.key() ) );
247 createJob->setProperty(
"type", it.key() );
248 QObject::connect( createJob, SIGNAL(result(KJob*)), q, SLOT(collectionCreateResult(KJob*)) );
250 mPendingCreateJobs++;
254 if ( mPendingCreateJobs == 0 )
258 void SpecialCollectionsRequestJobPrivate::collectionCreateResult( KJob *job )
260 if ( job->error() ) {
261 kWarning() <<
"Failed CollectionCreateJob." << job->errorString();
266 Q_ASSERT( createJob );
269 mToRegister.append( qMakePair( collection, createJob->property(
"type" ).toByteArray() ) );
271 Q_ASSERT( mPendingCreateJobs > 0 );
272 mPendingCreateJobs--;
273 kDebug() <<
"mPendingCreateJobs now" << mPendingCreateJobs;
275 if ( mPendingCreateJobs == 0 )
284 d( new SpecialCollectionsRequestJobPrivate( collections, this ) )
286 setProperty(
"transactionsDisabled",
true );
296 d->mDefaultFolders[ type ] =
true;
297 d->mRequestingDefaultFolders =
true;
298 d->mRequestedType = type;
303 d->mFoldersForResource[ instance.
identifier() ][ type ] =
true;
304 d->mRequestedType = type;
305 d->mRequestedResource = instance;
310 if ( d->mRequestedResource.isValid() )
311 return d->mSpecialCollections->collection( d->mRequestedType, d->mRequestedResource );
313 return d->mSpecialCollections->defaultCollection( d->mRequestedType );
318 d->mDefaultResourceType = type;
323 d->mDefaultResourceOptions = options;
328 d->mKnownTypes = types;
333 d->mNameForTypeMap = map;
338 d->mIconForTypeMap = map;
343 if ( d->isEverythingReady() ) {
347 connect( lockJob, SIGNAL(result(KJob*)),
this, SLOT(lockResult(KJob*)) );
352 void SpecialCollectionsRequestJob::slotResult( KJob *job )
354 if ( job->error() ) {
356 kWarning() <<
"Failed SpecialCollectionsRequestJob::slotResult" << job->errorString();
360 TransactionSequence::slotResult( job );
363 #include "moc_specialcollectionsrequestjob.cpp"