20 #include "specialcollections.h"
22 #include "specialcollections_p.h"
23 #include "specialcollectionattribute_p.h"
25 #include "akonadi/agentinstance.h"
26 #include "akonadi/agentmanager.h"
27 #include "akonadi/collectionmodifyjob.h"
28 #include "akonadi/collectionfetchjob.h"
29 #include "akonadi/monitor.h"
32 #include <kcoreconfigskeleton.h>
34 #include <QtCore/QHash>
35 #include <QtCore/QObject>
36 #include <QtCore/QSet>
37 #include <akonadi/collectionfetchscope.h>
39 using namespace Akonadi;
41 SpecialCollectionsPrivate::SpecialCollectionsPrivate( KCoreConfigSkeleton *settings,
SpecialCollections *qq )
43 mSettings( settings ),
53 QObject::connect( mMonitor, SIGNAL(collectionRemoved(Akonadi::Collection)),
54 q, SLOT(collectionRemoved(Akonadi::Collection)) );
55 QObject::connect( mMonitor, SIGNAL(collectionStatisticsChanged(Akonadi::Collection::Id,Akonadi::CollectionStatistics)),
56 q, SLOT(collectionStatisticsChanged(Akonadi::Collection::Id,Akonadi::CollectionStatistics)) );
59 SpecialCollectionsPrivate::~SpecialCollectionsPrivate()
63 QString SpecialCollectionsPrivate::defaultResourceId()
const
65 if ( mDefaultResourceId.isEmpty() ) {
66 mSettings->readConfig();
67 const KConfigSkeletonItem *item = mSettings->findItem( QLatin1String(
"DefaultResourceId" ) );
70 mDefaultResourceId = item->property().toString();
72 return mDefaultResourceId;
75 void SpecialCollectionsPrivate::emitChanged(
const QString &resourceId )
78 mToEmitChangedFor.insert( resourceId );
80 kDebug() <<
"Emitting changed for" << resourceId;
82 emit q->collectionsChanged( agentInstance );
84 if ( resourceId == mDefaultResourceId || resourceId == defaultResourceId() ) {
85 kDebug() <<
"Emitting defaultFoldersChanged.";
86 emit q->defaultCollectionsChanged();
91 void SpecialCollectionsPrivate::collectionRemoved(
const Collection &collection )
93 kDebug() <<
"Collection" << collection.id() <<
"resource" << collection.resource();
94 if ( mFoldersForResource.contains( collection.resource() ) ) {
97 QHash<QByteArray, Collection> &folders = mFoldersForResource[ collection.resource() ];
99 QMutableHashIterator<QByteArray, Collection> it( folders );
100 while ( it.hasNext() ) {
102 if ( it.value() == collection ) {
105 emitChanged( collection.resource() );
110 if ( folders.isEmpty() ) {
112 mFoldersForResource.remove( collection.resource() );
117 void SpecialCollectionsPrivate::collectionStatisticsChanged( Akonadi::Collection::Id collectionId,
const Akonadi::CollectionStatistics &statistics )
121 Akonadi::CollectionFetchJob* fetchJob =
new Akonadi::CollectionFetchJob( Collection( collectionId ), Akonadi::CollectionFetchJob::Base );
122 fetchJob->fetchScope().setAncestorRetrieval( Akonadi::CollectionFetchScope::None );
123 fetchJob->setProperty(
"statistics", QVariant::fromValue( statistics ) );
125 q->connect( fetchJob, SIGNAL(result(KJob*)), q, SLOT(collectionFetchJobFinished(KJob*)) );
129 void SpecialCollectionsPrivate::collectionFetchJobFinished( KJob* job )
131 if ( job->error() ) {
132 kWarning() <<
"Error fetching collection to get name from id for statistics updating in specialcollections!";
136 const Akonadi::CollectionFetchJob *fetchJob = qobject_cast<Akonadi::CollectionFetchJob*>( job );
138 Q_ASSERT( fetchJob->collections().size() > 0 );
139 const Akonadi::Collection collection = fetchJob->collections().first();
140 const Akonadi::CollectionStatistics statistics = fetchJob->property(
"statistics" ).value<Akonadi::CollectionStatistics>();
142 mFoldersForResource[ collection.resource() ][ collection.name().toUtf8() ].setStatistics( statistics );
145 void SpecialCollectionsPrivate::beginBatchRegister()
147 Q_ASSERT( !mBatchMode );
149 Q_ASSERT( mToEmitChangedFor.isEmpty() );
152 void SpecialCollectionsPrivate::endBatchRegister()
154 Q_ASSERT( mBatchMode );
157 foreach (
const QString &resourceId, mToEmitChangedFor ) {
158 emitChanged( resourceId );
161 mToEmitChangedFor.clear();
164 void SpecialCollectionsPrivate::forgetFoldersForResource(
const QString &resourceId )
166 if ( mFoldersForResource.contains( resourceId ) ) {
167 const Collection::List folders = mFoldersForResource[ resourceId ].values();
169 foreach (
const Collection &collection, folders ) {
170 mMonitor->setCollectionMonitored( collection,
false );
173 mFoldersForResource.remove( resourceId );
174 emitChanged( resourceId );
178 AgentInstance SpecialCollectionsPrivate::defaultResource()
const
180 const QString identifier = defaultResourceId();
185 SpecialCollections::SpecialCollections( KCoreConfigSkeleton *settings, QObject *parent )
191 SpecialCollections::~SpecialCollections()
196 bool SpecialCollections::hasCollection(
const QByteArray &type,
const AgentInstance &instance )
const
199 if ( !d->mFoldersForResource.contains( instance.
identifier() ) ) {
204 return d->mFoldersForResource[ instance.
identifier() ].contains( type );
207 Akonadi::Collection SpecialCollections::collection(
const QByteArray &type,
const AgentInstance &instance )
const
209 if ( !d->mFoldersForResource.contains( instance.
identifier() ) ) {
213 return d->mFoldersForResource[ instance.
identifier() ][ type ];
216 bool SpecialCollections::registerCollection(
const QByteArray &type,
const Collection &collection )
219 kWarning() <<
"Invalid collection.";
223 const QString &resourceId = collection.
resource();
224 if ( resourceId.isEmpty() ) {
225 kWarning() <<
"Collection has empty resourceId.";
237 if ( !d->mFoldersForResource.contains( resourceId ) ) {
239 d->mFoldersForResource.insert( resourceId, QHash<QByteArray, Collection>() );
242 if ( !d->mFoldersForResource[ resourceId ].contains( type ) )
243 d->mFoldersForResource[ resourceId ].insert( type,
Collection() );
245 if ( d->mFoldersForResource[ resourceId ][ type ] != collection ) {
246 d->mMonitor->setCollectionMonitored( d->mFoldersForResource[ resourceId ][ type ],
false );
247 d->mMonitor->setCollectionMonitored( collection,
true );
248 d->mFoldersForResource[ resourceId ].insert( type, collection );
249 d->emitChanged( resourceId );
255 bool SpecialCollections::hasDefaultCollection(
const QByteArray &type )
const
257 return hasCollection( type, d->defaultResource() );
260 Akonadi::Collection SpecialCollections::defaultCollection(
const QByteArray &type )
const
262 return collection( type, d->defaultResource() );
265 #include "specialcollections.moc"