summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKevin Wu Won <kevin.wuwon@nokia.com>2010-12-22 14:46:13 +1000
committerKevin Wu Won <kevin.wuwon@nokia.com>2011-01-13 17:01:49 +1000
commitcdafc9b2f745c3ff78ad61570d94431205c15a39 (patch)
treeac402f25e3d63ac3f7028ef7fb55b57426a1283d
parent5980d78c44c688c4842434fe620004b3d18c97b0 (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
-rw-r--r--examples/samplephonebook/contacteditor.cpp9
-rw-r--r--examples/samplephonebook/contacteditor.h2
-rw-r--r--src/contacts/qcontactmanager.cpp62
-rw-r--r--src/contacts/qcontactmanager.h15
-rw-r--r--src/contacts/qcontactmanager_p.cpp42
-rw-r--r--src/contacts/qcontactmanager_p.h13
-rw-r--r--src/contacts/qcontactobserver.cpp57
-rw-r--r--src/contacts/qcontactobserver.h12
-rw-r--r--src/contacts/qtcontacts.h1
-rw-r--r--src/organizer/engines/qorganizeriteminvalidbackend_p.h7
-rw-r--r--src/organizer/qorganizeritemobserver.cpp56
-rw-r--r--src/organizer/qorganizeritemobserver.h10
-rw-r--r--src/organizer/qorganizermanager.cpp25
-rw-r--r--src/organizer/qorganizermanager.h8
-rw-r--r--src/organizer/qorganizermanager_p.cpp42
-rw-r--r--src/organizer/qorganizermanager_p.h10
-rw-r--r--src/organizer/qorganizermanagerengine.cpp16
-rw-r--r--src/organizer/qorganizermanagerengine.h5
-rw-r--r--src/organizer/qorganizermanagerenginev2wrapper_p.cpp44
-rw-r--r--src/organizer/qorganizermanagerenginev2wrapper_p.h8
-rw-r--r--src/organizer/qtorganizer.h1
-rw-r--r--tests/auto/qcontactmanager/tst_qcontactmanager.cpp12
-rw-r--r--tests/auto/qorganizermanager/tst_qorganizermanager.cpp12
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())));