--- 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";
}