From kde-commits Sat Feb 28 23:14:46 2009 From: Volker Krause Date: Sat, 28 Feb 2009 23:14:46 +0000 To: kde-commits Subject: kdesupport/akonadi/server/src Message-Id: <1235862886.265773.2241.nullmailer () svn ! kde ! org> X-MARC-Message: https://marc.info/?l=kde-commits&m=123586291903424 SVN commit 933455 by vkrause: Move the collection sync triggering code to ItemRetrievalManager as well, to share the resource interface cache and benefit from the thread-safety fixes there. M +1 -1 handler/fetch.cpp M +2 -1 intervalcheck.cpp M +0 -29 storage/datastore.cpp M +0 -20 storage/datastore.h M +16 -0 storage/itemretrievalmanager.cpp M +5 -0 storage/itemretrievalmanager.h --- trunk/kdesupport/akonadi/server/src/handler/fetch.cpp #933454:933455 @@ -304,7 +304,7 @@ store->activeCachePolicy( col ); if ( !col.cachePolicySyncOnDemand() ) return; - store->triggerCollectionSync( col ); + ItemRetrievalManager::instance()->requestCollectionSync( col ); } QueryBuilder Fetch::buildPartQuery( const QStringList &partList, bool allPayload, bool allAttrs ) --- trunk/kdesupport/akonadi/server/src/intervalcheck.cpp #933454:933455 @@ -19,6 +19,7 @@ #include "intervalcheck.h" #include "storage/datastore.h" +#include "storage/itemretrievalmanager.h" #include #include @@ -61,7 +62,7 @@ mLastChecks[ collection.id() ] = QDateTime::currentDateTime(); qDebug() << "interval checking collection " << collection.id() << "(" << collection.name() << ")"; - DataStore::self()->triggerCollectionSync( collection ); + ItemRetrievalManager::instance()->requestCollectionSync( collection ); } QTimer::singleShot( 60 * 1000, this, SLOT(doIntervalCheck()) ); --- trunk/kdesupport/akonadi/server/src/storage/datastore.cpp #933454:933455 @@ -21,7 +21,6 @@ #include "datastore.h" #include "agentmanagerinterface.h" -#include "resourceinterface.h" #include "dbconfig.h" #include "dbinitializer.h" #include "dbupdater.h" @@ -551,13 +550,6 @@ return ok; } -void DataStore::triggerCollectionSync( const Collection &collection ) -{ - org::freedesktop::Akonadi::Resource *interface = resourceInterface( collection.resource().name() ); - if ( interface ) - interface->synchronizeCollection( collection.id() ); -} - QList DataStore::listPimItems( const Collection & collection, const Flag &flag ) { if ( !m_dbOpened ) @@ -770,25 +762,4 @@ return m_transactionLevel > 0; } -org::freedesktop::Akonadi::Resource * Akonadi::DataStore::resourceInterface( const QString &res ) -{ - org::freedesktop::Akonadi::Resource* iface = 0; - if ( mResourceInterfaceCache.contains( res ) ) - iface = mResourceInterfaceCache.value( res ); - if ( iface && iface->isValid() ) - return iface; - - delete iface; - iface = new org::freedesktop::Akonadi::Resource( QLatin1String("org.freedesktop.Akonadi.Resource.") + res, - QLatin1String("/"), QDBusConnection::sessionBus(), this ); - if ( !iface || !iface->isValid() ) { - qDebug() << QString::fromLatin1( "Cannot connect to agent instance with identifier '%1', error message: '%2'" ) - .arg( res, iface ? iface->lastError().message() : QString() ); - delete iface; - return 0; - } - mResourceInterfaceCache.insert( res, iface ); - return iface; -} - #include "datastore.moc" --- trunk/kdesupport/akonadi/server/src/storage/datastore.h #933454:933455 @@ -32,16 +32,6 @@ #include "entities.h" #include "notificationcollector.h" -class OrgFreedesktopAkonadiResourceInterface; -namespace org { - namespace freedesktop { - namespace Akonadi { - typedef ::OrgFreedesktopAkonadiResourceInterface Resource; - } - } -} - - namespace Akonadi { class NotificationCollector; @@ -254,8 +244,6 @@ void debugLastDbError( const char* actionDescription ) const; void debugLastQueryError( const QSqlQuery &query, const char* actionDescription ) const; public: - void triggerCollectionSync( const Collection &collection ); - /** Returns the id of the most recent inserted row, or -1 if there's no such id. @param query the query we want to get the last insert id for @@ -279,11 +267,6 @@ */ static QDateTime dateTimeToQDateTime( const QByteArray & dateTime ); - /** - Returns the D-Bus interface of the given resource. - */ - org::freedesktop::Akonadi::Resource *resourceInterface( const QString &res ); - private: QString m_connectionName; QSqlDatabase m_database; @@ -291,9 +274,6 @@ uint m_transactionLevel; QByteArray mSessionId; NotificationCollector* mNotificationCollector; - - // resource dbus interface cache - QHash mResourceInterfaceCache; }; } --- trunk/kdesupport/akonadi/server/src/storage/itemretrievalmanager.cpp #933454:933455 @@ -52,6 +52,7 @@ connect( QDBusConnection::sessionBus().interface(), SIGNAL(serviceOwnerChanged(QString,QString,QString)), this, SLOT(serviceOwnerChanged(QString,QString,QString)) ); connect( this, SIGNAL(requestAdded()), this, SLOT(processRequest()), Qt::QueuedConnection ); + connect( this, SIGNAL(syncCollection(QString,qint64)), this, SLOT(triggerCollectionSync(QString,qint64)), Qt::QueuedConnection ); } ItemRetrievalManager::~ItemRetrievalManager() @@ -82,6 +83,9 @@ // called within the retrieval thread OrgFreedesktopAkonadiResourceInterface* ItemRetrievalManager::resourceInterface(const QString& id) { + if ( id.isEmpty() ) + return 0; + OrgFreedesktopAkonadiResourceInterface *iface = 0; if ( mResourceInterfaces.contains( id ) ) iface = mResourceInterfaces.value( id ); @@ -197,4 +201,16 @@ mLock->unlock(); } +void ItemRetrievalManager::requestCollectionSync(const Collection& collection) +{ + emit syncCollection( collection.resource().name(), collection.id() ); +} + +void ItemRetrievalManager::triggerCollectionSync(const QString& resource, qint64 colId) +{ + OrgFreedesktopAkonadiResourceInterface *interface = resourceInterface( resource ); + if ( interface ) + interface->synchronizeCollection( colId ); +} + #include "itemretrievalmanager.moc" --- trunk/kdesupport/akonadi/server/src/storage/itemretrievalmanager.h #933454:933455 @@ -32,6 +32,8 @@ namespace Akonadi { +class Collection; + /** Manages and processes item retrieval requests. */ class ItemRetrievalManager : public QObject { @@ -42,11 +44,13 @@ void requestItemDelivery( qint64 uid, const QByteArray& remoteId, const QByteArray& mimeType, const QString &resource, const QStringList &parts ); + void requestCollectionSync( const Collection &collection ); static ItemRetrievalManager* instance(); signals: void requestAdded(); + void syncCollection( const QString &resource, qint64 colId ); private: OrgFreedesktopAkonadiResourceInterface* resourceInterface( const QString &id ); @@ -54,6 +58,7 @@ private slots: void serviceOwnerChanged( const QString &serviceName, const QString &oldOwner, const QString &newOwner ); void processRequest(); + void triggerCollectionSync( const QString &resource, qint64 colId ); private: class Request