qtmobility/plugins/contacts/qtcontacts-tracker/trackerchangelistener.cpp
changeset 4 90517678cc4f
parent 1 2b40d63a9c3d
child 11 06b8e2af4411
--- a/qtmobility/plugins/contacts/qtcontacts-tracker/trackerchangelistener.cpp	Fri Apr 16 15:51:22 2010 +0300
+++ b/qtmobility/plugins/contacts/qtcontacts-tracker/trackerchangelistener.cpp	Mon May 03 13:18:40 2010 +0300
@@ -47,39 +47,52 @@
 
 using namespace SopranoLive;
 
-TrackerChangeListener::TrackerChangeListener(QObject* parent)
-:QObject(parent)
+TrackerChangeListener::TrackerChangeListener(QContactManagerEngine *eng, QObject* parent) :
+    QObject(parent), engine(eng)
 {
-    signaler_contact = SopranoLive::BackEnds::Tracker::ClassUpdateSignaler::get(
-                    nco::Contact::iri());
-    connectSignals(signaler_contact);
+    signaler_contact = SopranoLive::BackEnds::Tracker::ClassUpdateSignaler::get(nco::Contact::iri());
+    if (signaler_contact)
+    {
+        SopranoLive::BackEnds::Tracker::ClassUpdateSignaler * signaler = signaler_contact;
+        connect(signaler, SIGNAL(subjectsAdded(const QStringList &)), SLOT(contactsAdded(const QStringList &)));
+        connect(signaler,SIGNAL(subjectsRemoved(const QStringList &)),SLOT(contactsRemoved(const QStringList &)));
+        connect(signaler,SIGNAL(subjectsChanged(const QStringList &)),SLOT(contactsChanged(const QStringList &)));
+    }
 
-    signaler_imaccount = SopranoLive::BackEnds::Tracker::ClassUpdateSignaler::get(
-                    nco::IMAccount::iri());
-    connectSignals(signaler_imaccount);
+    signaler_imaccount = SopranoLive::BackEnds::Tracker::ClassUpdateSignaler::get(nco::IMAccount::iri());
+    if (signaler_imaccount)
+    {
+        // same for all signals - emit selfContact changed
+        SopranoLive::BackEnds::Tracker::ClassUpdateSignaler * signaler = signaler_imaccount;
+        connect(signaler, SIGNAL(subjectsAdded(const QStringList &)),SLOT(imAccountsChanged(const QStringList &)));
+        connect(signaler,SIGNAL(subjectsRemoved(const QStringList &)),SLOT(imAccountsChanged(const QStringList &)));
+        connect(signaler,SIGNAL(subjectsChanged(const QStringList &)),SLOT(imAccountsChanged(const QStringList &)));
+    }
+
+    signaler_imaddress = SopranoLive::BackEnds::Tracker::ClassUpdateSignaler::get(nco::IMAddress::iri());
+    if (signaler_imaddress)
+    {
+        // same for all signals - contact changed to be emitted
+        SopranoLive::BackEnds::Tracker::ClassUpdateSignaler * signaler = signaler_imaddress;
+        connect(signaler, SIGNAL(subjectsAdded(const QStringList &)),SLOT(imAddressesChanged(const QStringList &)));
+        connect(signaler,SIGNAL(subjectsRemoved(const QStringList &)),SLOT(imAddressesChanged(const QStringList &)));
+        connect(signaler,SIGNAL(subjectsChanged(const QStringList &)),SLOT(imAddressesChanged(const QStringList &)));
+    }
+
 }
 
 TrackerChangeListener::~TrackerChangeListener()
 {
+    if (signaler_imaddress)
+        signaler_imaddress->disconnect(this);
+    if (signaler_contact)
+        signaler_contact->disconnect(this);
+    if (signaler_imaccount)
+        signaler_imaccount->disconnect(this);
 }
-// TEMPORARY here we'll for now extract ids from tracker contact URI.
-// In future need nonblocking async way to get contact ids from tracker contact urls
-// let's see which signals will be used from libqttracker
+
 QContactLocalId url2UniqueId(const QString &contactUrl)
 {
-
-    /* Telepathy URI would look like telepathy:///org/freedesktop...
-       convert the URI component which contains the 
-       account + contat id to uint32 expected by
-       qcontactlocalid
-    */
-    if (contactUrl.contains("telepathy")) {
-        QContactLocalId id = 0;
-        QStringList decoded = contactUrl.split(":");
-        id = qHash(decoded.value(1).remove(0,1));
-        return id;
-    }
-
     /* handle conatact:interger URL types comming from
        which are non telepathy url's
     */
@@ -93,10 +106,9 @@
     if( !conversion )
         qWarning() << Q_FUNC_INFO << "unparsed uri to uniqueI:" << contactUrl;
     return id;
-
 }
 
-void TrackerChangeListener::subjectsAdded(const QStringList &subjects)
+void TrackerChangeListener::contactsAdded(const QStringList &subjects)
 {
     QList<QContactLocalId> added;
     foreach(const QString &uri, subjects)
@@ -106,7 +118,7 @@
     emit contactsAdded(added);
 }
 
-void TrackerChangeListener::subjectsRemoved(const QStringList &subjects)
+void TrackerChangeListener::contactsRemoved(const QStringList &subjects)
 {
     QList<QContactLocalId> added;
     foreach(const QString &uri, subjects)
@@ -116,8 +128,8 @@
     emit contactsRemoved(added);
 }
 
-// TODO data changed for full query
-void TrackerChangeListener::subjectsChanged(const QStringList &subjects)
+
+void TrackerChangeListener::contactsChanged(const QStringList &subjects)
 {
     QList<QContactLocalId> changed;
     foreach(const QString &uri, subjects) {
@@ -129,33 +141,21 @@
     emit contactsChanged(changed);
 }
 
-
-AsyncQuery::AsyncQuery(RDFSelect selectQuery)
+void TrackerChangeListener::imAccountsChanged(const QStringList &subjects)
 {
-    nodes = ::tracker()->modelQuery(selectQuery);
-    QObject::connect(nodes.model(), SIGNAL(modelUpdated()), this,
-            SLOT(queryReady()));
-}
-
-void AsyncQuery::queryReady()
-{
-    emit queryReady(this);
+    Q_UNUSED(subjects)
+    QContactManager::Error error;
+    QContactLocalId selfId = engine->selfContactId(&error);
+    if (engine && QContactManager::NoError == error) {
+        emit contactsChanged(QList<QContactLocalId>()<<selfId);
+    } else {
+        qWarning() << __PRETTY_FUNCTION__ << "Signal not propagated:" << engine << error;
+    }
 }
 
-void TrackerChangeListener::connectSignals(SopranoLive::BackEnds::Tracker::ClassUpdateSignaler *signaler) {
-    // Note here that we are not using
-    // QAbstractItemModel signals from LiveNodes::model() because
-    // node list for which notification comes is fixed. Those are used for
-    // async implementation
-    if (signaler)
-    {
-        connect(signaler, SIGNAL(subjectsAdded(const QStringList &)),
-                SLOT(subjectsAdded(const QStringList &)));
-        connect(signaler,
-                SIGNAL(baseRemoveSubjectsd(const QStringList &)),
-                SLOT(subjectsRemoved(const QStringList &)));
-        connect(signaler,
-                SIGNAL(subjectsChanged(const QStringList &)),
-                SLOT(subjectsChanged(const QStringList &)));
-    }
+void TrackerChangeListener::imAddressesChanged(const QStringList &subjects)
+{
+    Q_UNUSED(subjects)
+    // TODO use QHash in engine - mapping IMAddress URIs to contacts
+    qWarning() << __PRETTY_FUNCTION__ << "Not implemented";
 }