diff options
author | Kevin Wu Won <kevin.wuwon@nokia.com> | 2010-12-22 14:46:13 +1000 |
---|---|---|
committer | Kevin Wu Won <kevin.wuwon@nokia.com> | 2011-01-13 17:01:49 +1000 |
commit | cdafc9b2f745c3ff78ad61570d94431205c15a39 (patch) | |
tree | ac402f25e3d63ac3f7028ef7fb55b57426a1283d | |
parent | 5980d78c44c688c4842434fe620004b3d18c97b0 (diff) |
Make QContactObserver and QOrganizerItemObserver client-constructable.
Perhaps this is a better design for the observer classes after all, since it
removes the need for the QSharedPointer while retaining the clear ownership
semantics of the class.
Task-number: QTMOBILITY-651
Task-number: QTMOBILITY-809
Change-Id: I98828fc4103f878941f8ef09f802589f570c1e61
23 files changed, 236 insertions, 233 deletions
diff --git a/examples/samplephonebook/contacteditor.cpp b/examples/samplephonebook/contacteditor.cpp index d75110d122..893a9a6384 100644 --- a/examples/samplephonebook/contacteditor.cpp +++ b/examples/samplephonebook/contacteditor.cpp @@ -50,6 +50,7 @@ ContactEditor::ContactEditor(QWidget *parent) { m_manager = 0; m_contactId = QContactLocalId(0); + m_observer = 0; m_nameEdit = new QLineEdit(this); m_phoneEdit = new QLineEdit(this); @@ -131,6 +132,7 @@ ContactEditor::ContactEditor(QWidget *parent) ContactEditor::~ContactEditor() { + delete m_observer; } void ContactEditor::setCurrentContact(QContactManager* manager, QContactLocalId currentId) @@ -159,8 +161,9 @@ void ContactEditor::setCurrentContact(QContactManager* manager, QContactLocalId contact = manager->contact(m_contactId); // Set an observer on the contact to watch it for changes from another process - m_observer = manager->observeContact(m_contactId); - connect(m_observer.data(), SIGNAL(contactChanged()), this, SLOT(contactChanged())); + delete m_observer; + m_observer = new QContactObserver(manager, m_contactId); + connect(m_observer, SIGNAL(contactChanged()), this, SLOT(contactChanged())); updateUi(contact); } @@ -282,7 +285,7 @@ void ContactEditor::avatarClicked() void ContactEditor::saveClicked() { // Stop observing the contact - if (!m_observer.isNull()) { + if (m_observer) { m_observer->disconnect(); } diff --git a/examples/samplephonebook/contacteditor.h b/examples/samplephonebook/contacteditor.h index 4a256918f5..337be766b0 100644 --- a/examples/samplephonebook/contacteditor.h +++ b/examples/samplephonebook/contacteditor.h @@ -103,7 +103,7 @@ private: QContactLocalId m_contactId; QString m_newAvatarPath; QImage m_thumbnail; - QSharedPointer<QContactObserver> m_observer; + QContactObserver* m_observer; }; #endif // CONTACTEDITOR_H diff --git a/src/contacts/qcontactmanager.cpp b/src/contacts/qcontactmanager.cpp index dce4a22435..dde55ed953 100644 --- a/src/contacts/qcontactmanager.cpp +++ b/src/contacts/qcontactmanager.cpp @@ -279,11 +279,11 @@ QContactManager::QContactManager(const QString& managerName, const QMap<QString, : QObject(parent), d(new QContactManagerData) { - createEngine(managerName, parameters); + createEngine(managerName, parameters); } -void QContactManager::createEngine(const QString& managerName, const QMap<QString, QString>& parameters) -{ +void QContactManager::createEngine(const QString& managerName, const QMap<QString, QString>& parameters) +{ d->createEngine(managerName, parameters); connect(d->m_engine, SIGNAL(dataChanged()), this, SIGNAL(dataChanged())); connect(d->m_engine, SIGNAL(contactsAdded(QList<QContactLocalId>)), this, SIGNAL(contactsAdded(QList<QContactLocalId>))); @@ -294,9 +294,9 @@ void QContactManager::createEngine(const QString& managerName, const QMap<QStrin connect(d->m_engine, SIGNAL(selfContactIdChanged(QContactLocalId,QContactLocalId)), this, SIGNAL(selfContactIdChanged(QContactLocalId,QContactLocalId))); connect(d->m_engine, SIGNAL(contactsChanged(QList<QContactLocalId>)), - this, SLOT(contactsUpdated(QList<QContactLocalId>))); + this, SLOT(_q_contactsUpdated(QList<QContactLocalId>))); connect(d->m_engine, SIGNAL(contactsRemoved(QList<QContactLocalId>)), - this, SLOT(contactsDeleted(QList<QContactLocalId>))); + this, SLOT(_q_contactsDeleted(QList<QContactLocalId>))); QContactManagerData::m_aliveEngines.insert(this); @@ -726,57 +726,6 @@ bool QContactManager::removeContacts(const QList<QContactLocalId>& contactIds, Q return retn; } - -/*! - Returns an observer object for the contact with id \a contactId. - - The returned object will emit contactChanged and contactRemoved signals until it is deleted (eg. - by the pointer falling out of scope). Note that the QContactObserver in the returned - QSharedPointer may or may not be deleted when the client loses its reference to it. The client - is responsible for keeping a reference to the shared pointer as long as it is interested in the - observer's signals. When the client wishes to stop receiving signals, it should both disconnect - the signals and delete the shared pointer. - - \sa QContactObserver - */ -QSharedPointer<QContactObserver> QContactManager::observeContact(QContactLocalId contactId) -{ - QContactObserver* observer = new QContactObserver(this); - connect(observer, SIGNAL(destroyed(QObject*)), this, SLOT(observerDestroyed(QObject*))); - d->m_observerForContact.insert(contactId, observer); - return QSharedPointer<QContactObserver>(observer); -} - -// Some private slots for observing contacts -void QContactManager::observerDestroyed(QObject* object) -{ - QContactObserver* observer = reinterpret_cast<QContactObserver*>(object); - QContactLocalId key = d->m_observerForContact.key(observer); - if (key != 0) { - d->m_observerForContact.remove(key, observer); - } -} - -void QContactManager::contactsUpdated(const QList<QContactLocalId>& ids) -{ - foreach (QContactLocalId id, ids) { - QList<QContactObserver*> observers = d->m_observerForContact.values(id); - foreach (QContactObserver* observer, observers) { - observer->emitContactChanged(); - } - } -} - -void QContactManager::contactsDeleted(const QList<QContactLocalId>& ids) -{ - foreach (QContactLocalId id, ids) { - QList<QContactObserver*> observers = d->m_observerForContact.values(id); - foreach (QContactObserver* observer, observers) { - observer->emitContactRemoved(); - } - } -} - /*! Returns a pruned or modified version of the \a original contact which is valid and can be saved in the manager. The returned contact might have entire details removed or arbitrarily changed. The cache of relationships @@ -1125,6 +1074,7 @@ QString QContactManager::managerUri() const return d->m_engine->managerUri(); } + #include "moc_qcontactmanager.cpp" QTM_END_NAMESPACE diff --git a/src/contacts/qcontactmanager.h b/src/contacts/qcontactmanager.h index ee5e481485..b1c0d26028 100644 --- a/src/contacts/qcontactmanager.h +++ b/src/contacts/qcontactmanager.h @@ -58,7 +58,6 @@ #include "qcontactsortorder.h" #include "qcontactfetchhint.h" #include "qcontacttype.h" -#include "qcontactobserver.h" QTM_BEGIN_NAMESPACE @@ -143,8 +142,6 @@ public: bool saveContacts(QList<QContact>* contacts, const QStringList& definitionMask, QMap<int, QContactManager::Error>* errorMap = 0); // Partial save bool removeContacts(const QList<QContactLocalId>& contactIds, QMap<int, QContactManager::Error>* errorMap = 0); // batch API - remove. - QSharedPointer<QContactObserver> observeContact(QContactLocalId contactId); - /* Return a pruned or modified contact which is valid and can be saved in the manager */ QContact compatibleContact(const QContact& original); @@ -200,15 +197,15 @@ Q_SIGNALS: void relationshipsRemoved(const QList<QContactLocalId>& affectedContactIds); void selfContactIdChanged(const QContactLocalId& oldId, const QContactLocalId& newId); // need both? or just new? -private Q_SLOTS: - void contactsUpdated(const QList<QContactLocalId>& ids); - void contactsDeleted(const QList<QContactLocalId>& ids); - void observerDestroyed(QObject* object); - private: friend class QContactManagerData; - void createEngine(const QString& managerName, const QMap<QString, QString>& parameters); + void createEngine(const QString& managerName, const QMap<QString, QString>& parameters); + Q_DISABLE_COPY(QContactManager) + + Q_PRIVATE_SLOT(d, void _q_contactsUpdated(const QList<QContactLocalId>& ids)); + Q_PRIVATE_SLOT(d, void _q_contactsDeleted(const QList<QContactLocalId>& ids)); + // private data pointer QContactManagerData* d; }; diff --git a/src/contacts/qcontactmanager_p.cpp b/src/contacts/qcontactmanager_p.cpp index 6bbbbf727c..49e5ce4447 100644 --- a/src/contacts/qcontactmanager_p.cpp +++ b/src/contacts/qcontactmanager_p.cpp @@ -304,7 +304,47 @@ void QContactManagerData::loadFactories() } } -// trampoline for private classes +// Observer stuff + +void QContactManagerData::registerObserver(QContactObserver* observer) +{ + m_observerForContact.insert(observer->contactLocalId(), observer); +} + +void QContactManagerData::unregisterObserver(QContactObserver* observer) +{ + QContactLocalId key = m_observerForContact.key(observer); + if (key != 0) { + m_observerForContact.remove(key, observer); + } +} + +void QContactManagerData::_q_contactsUpdated(const QList<QContactLocalId>& ids) +{ + foreach (QContactLocalId id, ids) { + QList<QContactObserver*> observers = m_observerForContact.values(id); + foreach (QContactObserver* observer, observers) { + QMetaObject::invokeMethod(observer, "contactChanged"); + } + } +} + +void QContactManagerData::_q_contactsDeleted(const QList<QContactLocalId>& ids) +{ + foreach (QContactLocalId id, ids) { + QList<QContactObserver*> observers = m_observerForContact.values(id); + foreach (QContactObserver* observer, observers) { + QMetaObject::invokeMethod(observer, "contactRemoved"); + } + } +} + +// trampolines for private classes +QContactManagerData* QContactManagerData::get(const QContactManager* manager) +{ + return manager->d; +} + QContactManagerEngineV2* QContactManagerData::engine(const QContactManager* manager) { if (manager) diff --git a/src/contacts/qcontactmanager_p.h b/src/contacts/qcontactmanager_p.h index cb01deb150..729e8d553f 100644 --- a/src/contacts/qcontactmanager_p.h +++ b/src/contacts/qcontactmanager_p.h @@ -62,6 +62,7 @@ #include "qcontactmanager.h" #include "qcontactmanagerengine.h" #include "qcontactactionmanager_p.h" +#include "qcontactobserver.h" QTM_USE_NAMESPACE QTM_BEGIN_NAMESPACE @@ -83,15 +84,15 @@ public: delete m_engine; } + void createEngine(const QString& managerName, const QMap<QString, QString>& parameters); + static QContactManagerData* get(const QContactManager* manager); static QContactManagerEngineV2* engine(const QContactManager* manager); QContactManagerEngineV2* m_engine; QContactManager::Error m_error; QMap<int, QContactManager::Error> m_errorMap; - QMultiHash<QContactLocalId, QContactObserver*> m_observerForContact; - /* Manager plugins */ static QHash<QString, QContactManagerEngineFactory*> m_engines; static QSet<QContactManager*> m_aliveEngines; @@ -102,6 +103,14 @@ public: static void loadFactories(); static void loadStaticFactories(); + // Observer stuff + void registerObserver(QContactObserver* observer); + void unregisterObserver(QContactObserver* observer); + void _q_contactsUpdated(const QList<QContactLocalId>& ids); + void _q_contactsDeleted(const QList<QContactLocalId>& ids); + + QMultiHash<QContactLocalId, QContactObserver*> m_observerForContact; + private: Q_DISABLE_COPY(QContactManagerData) }; diff --git a/src/contacts/qcontactobserver.cpp b/src/contacts/qcontactobserver.cpp index 4ab408baff..0a25219887 100644 --- a/src/contacts/qcontactobserver.cpp +++ b/src/contacts/qcontactobserver.cpp @@ -40,6 +40,17 @@ ****************************************************************************/ #include "qcontactobserver.h" +#include "qcontactid.h" +#include "qcontactmanager_p.h" + +QTM_BEGIN_NAMESPACE +class QContactObserverPrivate +{ + public: + QContactLocalId m_localId; + QContactManagerData* m_managerPrivate; +}; +QTM_END_NAMESPACE QTM_USE_NAMESPACE @@ -50,13 +61,37 @@ QTM_USE_NAMESPACE \inmodule QtContacts \ingroup contacts-main + */ - This class is created by calling QContactManager::observeContact(QContactLocalId). +/*! + Constructs a QContactObserver to observe the contact in \a manager with the given \a localId. + */ +QContactObserver::QContactObserver(QContactManager* manager, + QContactLocalId localId, + QObject* parent) + : QObject(parent), + d(new QContactObserverPrivate) +{ + d->m_localId = localId; + d->m_managerPrivate = QContactManagerData::get(manager); + d->m_managerPrivate->registerObserver(this); +} - \sa QContactManager::observeContact +/*! + Destroys this observer. */ +QContactObserver::~QContactObserver() +{ + d->m_managerPrivate->unregisterObserver(this); + delete d; +} -QContactObserver::QContactObserver(QObject* parent) : QObject(parent) {} +/*! + Returns the local id of the contact that this object observes. + */ +QContactLocalId QContactObserver::contactLocalId() const { + return d->m_localId; +} /*! \fn contactChanged() @@ -70,20 +105,4 @@ QContactObserver::QContactObserver(QObject* parent) : QObject(parent) {} This signal is emitted when the observed contact is removed from the manager. */ -/*! - This function causes the contactChanged() signal to be emitted. - */ -void QContactObserver::emitContactChanged() -{ - emit contactChanged(); -} - -/*! - This function causes the contactRemoved() signal to be emitted. - */ -void QContactObserver::emitContactRemoved() -{ - emit contactRemoved(); -} - #include "moc_qcontactobserver.cpp" diff --git a/src/contacts/qcontactobserver.h b/src/contacts/qcontactobserver.h index c3656f8958..2e5d3929c0 100644 --- a/src/contacts/qcontactobserver.h +++ b/src/contacts/qcontactobserver.h @@ -43,25 +43,27 @@ #define QCONTACTOBSERVER_H #include <QObject> +#include <QScopedPointer> #include "qmobilityglobal.h" +#include "qcontactmanager.h" QTM_BEGIN_NAMESPACE +class QContactObserverPrivate; class Q_CONTACTS_EXPORT QContactObserver : public QObject { Q_OBJECT public: - void emitContactChanged(); - void emitContactRemoved(); + QContactObserver(QContactManager* manager, QContactLocalId localId, QObject* parent = 0); + ~QContactObserver(); + QContactLocalId contactLocalId() const; signals: void contactChanged(); void contactRemoved(); private: - QContactObserver(QObject* parent = 0); - Q_DISABLE_COPY(QContactObserver) - friend class QContactManager; + QContactObserverPrivate* d; }; QTM_END_NAMESPACE diff --git a/src/contacts/qtcontacts.h b/src/contacts/qtcontacts.h index 7046db8e5c..d88e0df756 100644 --- a/src/contacts/qtcontacts.h +++ b/src/contacts/qtcontacts.h @@ -51,6 +51,7 @@ #include "qcontactmanagerenginefactory.h" // manage backend instantiator #include "qcontact.h" // contact #include "qcontactid.h" // contact identifier +#include "qcontactobserver.h" // contact observer #include "qcontactdetaildefinition.h" // detail definition #include "qcontactdetailfielddefinition.h" // field in a detail definition #include "qcontactdetail.h" // contact detail diff --git a/src/organizer/engines/qorganizeriteminvalidbackend_p.h b/src/organizer/engines/qorganizeriteminvalidbackend_p.h index 5a4f0dbb6d..276a78c396 100644 --- a/src/organizer/engines/qorganizeriteminvalidbackend_p.h +++ b/src/organizer/engines/qorganizeriteminvalidbackend_p.h @@ -84,13 +84,6 @@ public: *error = QOrganizerManager::NotSupportedError; return QOrganizerItem(); } - - /*! \reimp */ - virtual QSharedPointer<QOrganizerItemObserver> observeItem(const QOrganizerItemId& itemId) - { - Q_UNUSED(itemId); - return QSharedPointer<QOrganizerItemObserver>(createOrganizerItemObserver(this)); - } }; QTM_END_NAMESPACE diff --git a/src/organizer/qorganizeritemobserver.cpp b/src/organizer/qorganizeritemobserver.cpp index aa9de2ad66..48b9ae27f0 100644 --- a/src/organizer/qorganizeritemobserver.cpp +++ b/src/organizer/qorganizeritemobserver.cpp @@ -40,6 +40,17 @@ ****************************************************************************/ #include "qorganizeritemobserver.h" +#include "qorganizeritemid.h" +#include "qorganizermanager_p.h" + +QTM_BEGIN_NAMESPACE +class QOrganizerItemObserverPrivate +{ + public: + QOrganizerItemId m_id; + QOrganizerManagerData* m_managerPrivate; +}; +QTM_END_NAMESPACE QTM_USE_NAMESPACE @@ -50,13 +61,36 @@ QTM_USE_NAMESPACE \inmodule QtOrganizer \ingroup organizer-main + */ - This class is created by calling QOrganizerManager::observeItem(QOrganizerItemId). +/*! + Constructs a QOrganizerItemObserver to observe the item in \a manager with the given \a itemId. + */ +QOrganizerItemObserver::QOrganizerItemObserver(QOrganizerManager* manager, + const QOrganizerItemId& itemId, + QObject* parent) + : QObject(parent), + d(new QOrganizerItemObserverPrivate) +{ + d->m_id = itemId; + d->m_managerPrivate = QOrganizerManagerData::get(manager); + d->m_managerPrivate->registerObserver(this); +} - \sa QOrganizerManager::observeItem +/*! + Destroys this observer. */ +QOrganizerItemObserver::~QOrganizerItemObserver() +{ + delete d; +} -QOrganizerItemObserver::QOrganizerItemObserver(QObject* parent) : QObject(parent) {} +/*! + Returns the id of the item that this object observes. + */ +QOrganizerItemId QOrganizerItemObserver::itemId() const { + return d->m_id; +} /*! \fn void QOrganizerItemObserver::itemChanged() @@ -70,20 +104,4 @@ QOrganizerItemObserver::QOrganizerItemObserver(QObject* parent) : QObject(parent This signal is emitted when the observed item is removed from the manager. */ -/*! - This function causes the itemChanged() signal to be emitted. - */ -void QOrganizerItemObserver::emitItemChanged() -{ - emit itemChanged(); -} - -/*! - This function causes the itemRemoved() signal to be emitted. - */ -void QOrganizerItemObserver::emitItemRemoved() -{ - emit itemRemoved(); -} - #include "moc_qorganizeritemobserver.cpp" diff --git a/src/organizer/qorganizeritemobserver.h b/src/organizer/qorganizeritemobserver.h index 7c63387d00..ca94ceee86 100644 --- a/src/organizer/qorganizeritemobserver.h +++ b/src/organizer/qorganizeritemobserver.h @@ -44,24 +44,26 @@ #include <QObject> #include "qmobilityglobal.h" +#include "qorganizermanager.h" QTM_BEGIN_NAMESPACE +class QOrganizerItemObserverPrivate; class Q_ORGANIZER_EXPORT QOrganizerItemObserver : public QObject { Q_OBJECT public: - void emitItemChanged(); - void emitItemRemoved(); + QOrganizerItemObserver(QOrganizerManager* manager, const QOrganizerItemId& itemId, QObject* parent = 0); + ~QOrganizerItemObserver(); + QOrganizerItemId itemId() const; signals: void itemChanged(); void itemRemoved(); private: - QOrganizerItemObserver(QObject* parent = 0); - Q_DISABLE_COPY(QOrganizerItemObserver) friend class QOrganizerManagerEngineV2; + QOrganizerItemObserverPrivate* d; }; QTM_END_NAMESPACE diff --git a/src/organizer/qorganizermanager.cpp b/src/organizer/qorganizermanager.cpp index 9ddc848335..5b644425ed 100644 --- a/src/organizer/qorganizermanager.cpp +++ b/src/organizer/qorganizermanager.cpp @@ -285,6 +285,12 @@ void QOrganizerManager::createEngine(const QString& managerName, const QMap<QStr connect(d->m_engine, SIGNAL(collectionsAdded(QList<QOrganizerCollectionId>)), this, SIGNAL(collectionsAdded(QList<QOrganizerCollectionId>))); connect(d->m_engine, SIGNAL(collectionsChanged(QList<QOrganizerCollectionId>)), this, SIGNAL(collectionsChanged(QList<QOrganizerCollectionId>))); connect(d->m_engine, SIGNAL(collectionsRemoved(QList<QOrganizerCollectionId>)), this, SIGNAL(collectionsRemoved(QList<QOrganizerCollectionId>))); + + connect(d->m_engine, SIGNAL(itemsChanged(QList<QOrganizerItemId>)), + this, SLOT(_q_itemsUpdated(QList<QOrganizerItemId>))); + connect(d->m_engine, SIGNAL(itemsRemoved(QList<QOrganizerItemId>)), + this, SLOT(_q_itemsDeleted(QList<QOrganizerItemId>))); + } /*! @@ -686,23 +692,6 @@ bool QOrganizerManager::removeItems(const QList<QOrganizerItemId>& organizeritem } /*! - Returns an observer object for the item with id \a itemId. - - The returned object will emit itemChanged and itemRemoved signals until it is deleted (eg. - by the pointer falling out of scope). Note that the QOrganizerItemObserver in the returned - QSharedPointer may or may not be deleted when the client loses its reference to it. The client - is responsible for keeping a reference to the shared pointer as long as it is interested in the - observer's signals. When the client wishes to stop receiving signals, it should both disconnect - the signals and delete the shared pointer. - - \sa QOrganizerItemObserver - */ -QSharedPointer<QOrganizerItemObserver> QOrganizerManager::observeItem(const QOrganizerItemId& itemId) -{ - return d->m_engine->observeItem(itemId); -} - -/*! Returns the id of the default collection managed by this manager */ QOrganizerCollection QOrganizerManager::defaultCollection() const @@ -936,7 +925,7 @@ QString QOrganizerManager::managerUri() const QList<QOrganizerItemId> QOrganizerManager::extractIds(const QList<QOrganizerItem>& items) { QList<QOrganizerItemId> ids; -#if QT_VERSION > 0x040700 +#if QT_VERSION > 0x040700 ids.reserve(items.count()); #endif diff --git a/src/organizer/qorganizermanager.h b/src/organizer/qorganizermanager.h index c2fb0fb725..2055dd7e6d 100644 --- a/src/organizer/qorganizermanager.h +++ b/src/organizer/qorganizermanager.h @@ -57,7 +57,6 @@ #include "qorganizeritemsortorder.h" #include "qorganizeritemfetchhint.h" #include "qorganizeritemfilter.h" -#include "qorganizeritemobserver.h" #include "qorganizercollection.h" #include "qorganizercollectionid.h" @@ -65,6 +64,7 @@ QTM_BEGIN_NAMESPACE class QOrganizerManagerData; + class Q_ORGANIZER_EXPORT QOrganizerManager : public QObject { Q_OBJECT @@ -133,8 +133,6 @@ public: bool removeItem(const QOrganizerItemId& itemId); bool removeItems(const QList<QOrganizerItemId>& itemIds); - QSharedPointer<QOrganizerItemObserver> observeItem(const QOrganizerItemId& itemId); - /* Collections - every item belongs to one or more collections */ QOrganizerCollection defaultCollection() const; QOrganizerCollection collection(const QOrganizerCollectionId& collectionId) const; @@ -180,6 +178,10 @@ private: friend class QOrganizerManagerData; void createEngine(const QString& managerName, const QMap<QString, QString>& parameters); Q_DISABLE_COPY(QOrganizerManager) + + Q_PRIVATE_SLOT(d, void _q_itemsUpdated(const QList<QOrganizerItemId>& ids)); + Q_PRIVATE_SLOT(d, void _q_itemsDeleted(const QList<QOrganizerItemId>& ids)); + // private data pointer QOrganizerManagerData* d; }; diff --git a/src/organizer/qorganizermanager_p.cpp b/src/organizer/qorganizermanager_p.cpp index b190a7c3eb..6465fab84a 100644 --- a/src/organizer/qorganizermanager_p.cpp +++ b/src/organizer/qorganizermanager_p.cpp @@ -288,7 +288,47 @@ QOrganizerCollectionEngineId* QOrganizerManagerData::createEngineCollectionId(co return engineFactory ? engineFactory->createCollectionEngineId(parameters, engineIdString) : NULL; } -// trampoline for private classes +// Observer stuff + +void QOrganizerManagerData::registerObserver(QOrganizerItemObserver* observer) +{ + m_observerForItem.insert(observer->itemId(), observer); +} + +void QOrganizerManagerData::unregisterObserver(QOrganizerItemObserver* observer) +{ + QOrganizerItemId key = m_observerForItem.key(observer); + if (!key.isNull()) { + m_observerForItem.remove(key, observer); + } +} + +void QOrganizerManagerData::_q_itemsUpdated(const QList<QOrganizerItemId>& ids) +{ + foreach (QOrganizerItemId id, ids) { + QList<QOrganizerItemObserver*> observers = m_observerForItem.values(id); + foreach (QOrganizerItemObserver* observer, observers) { + QMetaObject::invokeMethod(observer, "itemChanged"); + } + } +} + +void QOrganizerManagerData::_q_itemsDeleted(const QList<QOrganizerItemId>& ids) +{ + foreach (QOrganizerItemId id, ids) { + QList<QOrganizerItemObserver*> observers = m_observerForItem.values(id); + foreach (QOrganizerItemObserver* observer, observers) { + QMetaObject::invokeMethod(observer, "itemRemoved"); + } + } +} + +// trampolines for private classes +QOrganizerManagerData* QOrganizerManagerData::get(const QOrganizerManager* manager) +{ + return manager->d; +} + QOrganizerManagerEngineV2* QOrganizerManagerData::engine(const QOrganizerManager* manager) { if (manager) diff --git a/src/organizer/qorganizermanager_p.h b/src/organizer/qorganizermanager_p.h index 7bb99af263..56dc645449 100644 --- a/src/organizer/qorganizermanager_p.h +++ b/src/organizer/qorganizermanager_p.h @@ -61,6 +61,7 @@ #include "qorganizermanager.h" #include "qorganizermanagerengine.h" +#include "qorganizeritemobserver.h" QTM_BEGIN_NAMESPACE @@ -82,6 +83,7 @@ public: } void createEngine(const QString& managerName, const QMap<QString, QString>& parameters); + static QOrganizerManagerData* get(const QOrganizerManager* manager); static QOrganizerManagerEngineV2* engine(const QOrganizerManager* manager); static QOrganizerItemEngineId* createEngineItemId(const QString& managerName, const QMap<QString, QString>& parameters, const QString& engineIdString); static QOrganizerCollectionEngineId* createEngineCollectionId(const QString& managerName, const QMap<QString, QString>& parameters, const QString& engineIdString); @@ -98,6 +100,14 @@ public: static void loadFactories(); static void loadStaticFactories(); + // Observer stuff + void registerObserver(QOrganizerItemObserver* observer); + void unregisterObserver(QOrganizerItemObserver* observer); + void _q_itemsUpdated(const QList<QOrganizerItemId>& ids); + void _q_itemsDeleted(const QList<QOrganizerItemId>& ids); + + QMultiHash<QOrganizerItemId, QOrganizerItemObserver*> m_observerForItem; + private: Q_DISABLE_COPY(QOrganizerManagerData) }; diff --git a/src/organizer/qorganizermanagerengine.cpp b/src/organizer/qorganizermanagerengine.cpp index a566aea8b5..78d9c90b0c 100644 --- a/src/organizer/qorganizermanagerengine.cpp +++ b/src/organizer/qorganizermanagerengine.cpp @@ -3480,22 +3480,6 @@ void QOrganizerManagerEngineV2::updateItemFetchByIdRequest(QOrganizerItemFetchBy } } -/*! - \fn virtual QSharedPointer<QOrganizerItemObserver> observeItem(QOrganizerItemId itemId) = 0; - - Returns an observer object for the item with id \a itemId. - - \sa QOrganizerItemObserver - */ - -/*! - Factory function to construct a QOrganizerItemObserver with given \a parent. - */ -QOrganizerItemObserver* QOrganizerManagerEngineV2::createOrganizerItemObserver(QObject* parent) -{ - return new QOrganizerItemObserver(parent); -} - #include "moc_qorganizermanagerengine.cpp" QTM_END_NAMESPACE diff --git a/src/organizer/qorganizermanagerengine.h b/src/organizer/qorganizermanagerengine.h index 3aeeb32555..30e33ac248 100644 --- a/src/organizer/qorganizermanagerengine.h +++ b/src/organizer/qorganizermanagerengine.h @@ -208,11 +208,6 @@ public: static void updateItemFetchByIdRequest(QOrganizerItemFetchByIdRequest* req, const QList<QOrganizerItem>& result, QOrganizerManager::Error error, const QMap<int, QOrganizerManager::Error>& errorMap, QOrganizerAbstractRequest::State); - virtual QSharedPointer<QOrganizerItemObserver> observeItem(const QOrganizerItemId& itemId) = 0; - -protected: - static QOrganizerItemObserver* createOrganizerItemObserver(QObject* parent = 0); - // TODO async function }; diff --git a/src/organizer/qorganizermanagerenginev2wrapper_p.cpp b/src/organizer/qorganizermanagerenginev2wrapper_p.cpp index 7fd1de595b..7022216ffd 100644 --- a/src/organizer/qorganizermanagerenginev2wrapper_p.cpp +++ b/src/organizer/qorganizermanagerenginev2wrapper_p.cpp @@ -63,11 +63,6 @@ QOrganizerManagerEngineV2Wrapper::QOrganizerManagerEngineV2Wrapper(QOrganizerMan this, SIGNAL(collectionsChanged(QList<QOrganizerCollectionId>))); connect(wrappee, SIGNAL(collectionsRemoved(QList<QOrganizerCollectionId>)), this, SIGNAL(collectionsRemoved(QList<QOrganizerCollectionId>))); - - connect(wrappee, SIGNAL(itemsChanged(QList<QOrganizerItemId>)), - this, SLOT(itemsUpdated(QList<QOrganizerItemId>))); - connect(wrappee, SIGNAL(itemsRemoved(QList<QOrganizerItemId>)), - this, SLOT(itemsDeleted(QList<QOrganizerItemId>))); } QOrganizerManagerEngineV2Wrapper::~QOrganizerManagerEngineV2Wrapper() @@ -211,45 +206,6 @@ bool QOrganizerManagerEngineV2Wrapper::waitForRequestFinished(QOrganizerAbstract } -QSharedPointer<QOrganizerItemObserver> QOrganizerManagerEngineV2Wrapper::observeItem( - const QOrganizerItemId& itemId) -{ - QOrganizerItemObserver* observer = createOrganizerItemObserver(this); - connect(observer, SIGNAL(destroyed(QObject*)), - this, SLOT(observerDestroyed(QObject*))); - m_observerForItem.insert(itemId, observer); - return QSharedPointer<QOrganizerItemObserver>(observer); -} - -void QOrganizerManagerEngineV2Wrapper::observerDestroyed(QObject* object) -{ - QOrganizerItemObserver* observer = reinterpret_cast<QOrganizerItemObserver*>(object); - QOrganizerItemId key = m_observerForItem.key(observer); - if (!key.isNull()) { - m_observerForItem.remove(key, observer); - } -} - -void QOrganizerManagerEngineV2Wrapper::itemsUpdated(const QList<QOrganizerItemId>& ids) -{ - foreach (const QOrganizerItemId& id, ids) { - QList<QOrganizerItemObserver*> observers = m_observerForItem.values(id); - foreach (QOrganizerItemObserver* observer, observers) { - observer->emitItemChanged(); - } - } -} - -void QOrganizerManagerEngineV2Wrapper::itemsDeleted(const QList<QOrganizerItemId>& ids) -{ - foreach (const QOrganizerItemId& id, ids) { - QList<QOrganizerItemObserver*> observers = m_observerForItem.values(id); - foreach (QOrganizerItemObserver* observer, observers) { - observer->emitItemRemoved(); - } - } -} - /* A static helper to twiddle with \a request's privates, setting its engine to \a engine. */ void QOrganizerManagerEngineV2Wrapper::setEngineOfRequest(QOrganizerAbstractRequest* request, QOrganizerManagerEngine* engine) diff --git a/src/organizer/qorganizermanagerenginev2wrapper_p.h b/src/organizer/qorganizermanagerenginev2wrapper_p.h index c5043913d4..0d083bdc4a 100644 --- a/src/organizer/qorganizermanagerenginev2wrapper_p.h +++ b/src/organizer/qorganizermanagerenginev2wrapper_p.h @@ -71,8 +71,6 @@ public: QOrganizerManagerEngineV2Wrapper(QOrganizerManagerEngine* wrappee); ~QOrganizerManagerEngineV2Wrapper(); - QSharedPointer<QOrganizerItemObserver> observeItem(const QOrganizerItemId& itemId); - /* Extra functions */ static void setEngineOfRequest(QOrganizerAbstractRequest* request, QOrganizerManagerEngine* engine); @@ -240,16 +238,10 @@ public: } private Q_SLOTS: - void itemsUpdated(const QList<QOrganizerItemId>& ids); - void itemsDeleted(const QList<QOrganizerItemId>& ids); - void observerDestroyed(QObject* object); - -private Q_SLOTS: void requestStateChanged(QOrganizerAbstractRequest::State state); private: QHash<QOrganizerAbstractRequest*, RequestController*> m_controllerForRequest; - QMultiHash<QOrganizerItemId, QOrganizerItemObserver*> m_observerForItem; QOrganizerManagerEngine* m_engine; }; diff --git a/src/organizer/qtorganizer.h b/src/organizer/qtorganizer.h index 70c64f5cf7..7cb49b673e 100644 --- a/src/organizer/qtorganizer.h +++ b/src/organizer/qtorganizer.h @@ -55,6 +55,7 @@ #include "qorganizeritemfilter.h" // organizer item filter #include "qorganizeritem.h" // organizer item #include "qorganizeritemid.h" // organizer item identifier +#include "qorganizeritemobserver.h" // organizer item observer #include "qorganizermanager.h" // manager #include "qorganizermanagerengine.h" // manager backend #include "qorganizermanagerenginefactory.h" // manage backend instantiator diff --git a/tests/auto/qcontactmanager/tst_qcontactmanager.cpp b/tests/auto/qcontactmanager/tst_qcontactmanager.cpp index a58db97cff..4efa6a1a48 100644 --- a/tests/auto/qcontactmanager/tst_qcontactmanager.cpp +++ b/tests/auto/qcontactmanager/tst_qcontactmanager.cpp @@ -2208,7 +2208,7 @@ void tst_QContactManager::signalEmission() QVERIFY(arg.count() == 1); QCOMPARE(QContactLocalId(arg.at(0)), cid); - QSharedPointer<QContactObserver> c1Observer = m1->observeContact(cid); + QScopedPointer<QContactObserver> c1Observer(new QContactObserver(m1.data(), cid)); QScopedPointer<QSignalSpy> spyCOM1(new QSignalSpy(c1Observer.data(), SIGNAL(contactChanged()))); QScopedPointer<QSignalSpy> spyCOR1(new QSignalSpy(c1Observer.data(), SIGNAL(contactRemoved()))); @@ -2256,8 +2256,8 @@ void tst_QContactManager::signalEmission() spyCOM1->clear(); spyCOR1->clear(); - QSharedPointer<QContactObserver> c2Observer = m1->observeContact(c2.localId()); - QSharedPointer<QContactObserver> c3Observer = m1->observeContact(c3.localId()); + QScopedPointer<QContactObserver> c2Observer(new QContactObserver(m1.data(), c2.localId())); + QScopedPointer<QContactObserver> c3Observer(new QContactObserver(m1.data(), c3.localId())); QScopedPointer<QSignalSpy> spyCOM2(new QSignalSpy(c2Observer.data(), SIGNAL(contactChanged()))); QScopedPointer<QSignalSpy> spyCOM3(new QSignalSpy(c3Observer.data(), SIGNAL(contactChanged()))); QScopedPointer<QSignalSpy> spyCOR2(new QSignalSpy(c2Observer.data(), SIGNAL(contactRemoved()))); @@ -2314,9 +2314,9 @@ void tst_QContactManager::signalEmission() QTRY_WAIT( while(spyCA.size() > 0) {sigids += spyCA.takeFirst().at(0).value<QList<QContactLocalId> >(); }, sigids.contains(c.localId()) && sigids.contains(c2.localId()) && sigids.contains(c3.localId())); QTRY_COMPARE(spyCM.count(), 0); - c1Observer = m1->observeContact(c.localId()); - c2Observer = m1->observeContact(c2.localId()); - c3Observer = m1->observeContact(c3.localId()); + c1Observer.reset(new QContactObserver(m1.data(), c.localId())); + c2Observer.reset(new QContactObserver(m1.data(), c2.localId())); + c3Observer.reset(new QContactObserver(m1.data(), c3.localId())); spyCOM1.reset(new QSignalSpy(c1Observer.data(), SIGNAL(contactChanged()))); spyCOM2.reset(new QSignalSpy(c2Observer.data(), SIGNAL(contactChanged()))); spyCOM3.reset(new QSignalSpy(c3Observer.data(), SIGNAL(contactChanged()))); diff --git a/tests/auto/qorganizermanager/tst_qorganizermanager.cpp b/tests/auto/qorganizermanager/tst_qorganizermanager.cpp index 121b46e815..2a81dd9b54 100644 --- a/tests/auto/qorganizermanager/tst_qorganizermanager.cpp +++ b/tests/auto/qorganizermanager/tst_qorganizermanager.cpp @@ -2495,7 +2495,7 @@ void tst_QOrganizerManager::signalEmission() QVERIFY(arg.count() == 1); QCOMPARE(QOrganizerItemId(arg.at(0)), cid); - QSharedPointer<QOrganizerItemObserver> todo1Observer = m1->observeItem(cid); + QScopedPointer<QOrganizerItemObserver> todo1Observer(new QOrganizerItemObserver(m1.data(), cid)); QScopedPointer<QSignalSpy> spyObserverModified1(new QSignalSpy(todo1Observer.data(), SIGNAL(itemChanged()))); QScopedPointer<QSignalSpy> spyObserverRemoved1(new QSignalSpy(todo1Observer.data(), SIGNAL(itemRemoved()))); @@ -2539,8 +2539,8 @@ void tst_QOrganizerManager::signalEmission() spyObserverModified1->clear(); spyObserverRemoved1->clear(); - QSharedPointer<QOrganizerItemObserver> todo2Observer = m1->observeItem(todo2.id()); - QSharedPointer<QOrganizerItemObserver> todo3Observer = m1->observeItem(todo3.id()); + QScopedPointer<QOrganizerItemObserver> todo2Observer(new QOrganizerItemObserver(m1.data(), todo2.id())); + QScopedPointer<QOrganizerItemObserver> todo3Observer(new QOrganizerItemObserver(m1.data(), todo3.id())); QScopedPointer<QSignalSpy> spyObserverModified2(new QSignalSpy(todo2Observer.data(), SIGNAL(itemChanged()))); QScopedPointer<QSignalSpy> spyObserverModified3(new QSignalSpy(todo3Observer.data(), SIGNAL(itemChanged()))); QScopedPointer<QSignalSpy> spyObserverRemoved2(new QSignalSpy(todo2Observer.data(), SIGNAL(itemRemoved()))); @@ -2601,9 +2601,9 @@ void tst_QOrganizerManager::signalEmission() QTRY_WAIT( while(spyAdded.size() > 0) {sigids += spyAdded.takeFirst().at(0).value<QList<QOrganizerItemId> >(); }, sigids.contains(todo.id()) && sigids.contains(todo2.id()) && sigids.contains(todo3.id())); QTRY_COMPARE(spyModified.count(), 0); - todo1Observer = m1->observeItem(todo.id()); - todo2Observer = m1->observeItem(todo2.id()); - todo3Observer = m1->observeItem(todo3.id()); + todo1Observer.reset(new QOrganizerItemObserver(m1.data(), todo.id())); + todo2Observer.reset(new QOrganizerItemObserver(m1.data(), todo2.id())); + todo3Observer.reset(new QOrganizerItemObserver(m1.data(), todo3.id())); spyObserverModified1.reset(new QSignalSpy(todo1Observer.data(), SIGNAL(itemChanged()))); spyObserverModified2.reset(new QSignalSpy(todo2Observer.data(), SIGNAL(itemChanged()))); spyObserverModified3.reset(new QSignalSpy(todo3Observer.data(), SIGNAL(itemChanged()))); |