[Telepathy-commits] [telepathy-qt4/master] Add and test Contact::FeatureAlias

Olli Salli olli.salli at collabora.co.uk
Wed Feb 4 02:23:28 PST 2009


---
 TelepathyQt4/Client/contact-manager.cpp |   23 +++++++++++++++++
 TelepathyQt4/Client/contact-manager.h   |    1 +
 TelepathyQt4/Client/contact.cpp         |   39 ++++++++++++++++++++++++++++-
 TelepathyQt4/Client/contact.h           |    6 ++++
 tests/dbus/contacts.cpp                 |   42 ++++++++++++++++++++++++++++---
 5 files changed, 106 insertions(+), 5 deletions(-)

diff --git a/TelepathyQt4/Client/contact-manager.cpp b/TelepathyQt4/Client/contact-manager.cpp
index b3dbf8b..6e4f013 100644
--- a/TelepathyQt4/Client/contact-manager.cpp
+++ b/TelepathyQt4/Client/contact-manager.cpp
@@ -97,6 +97,8 @@ namespace
 QString featureToInterface(Contact::Feature feature)
 {
     switch (feature) {
+        case Contact::FeatureAlias:
+            return TELEPATHY_INTERFACE_CONNECTION_INTERFACE_ALIASING;
         case Contact::FeatureSimplePresence:
             return TELEPATHY_INTERFACE_CONNECTION_INTERFACE_SIMPLE_PRESENCE;
         default:
@@ -198,6 +200,19 @@ PendingContacts *ContactManager::upgradeContacts(const QList<QSharedPointer<Cont
     return new PendingContacts(this, contacts, features);
 }
 
+void ContactManager::onAliasesChanged(const Telepathy::AliasPairList &aliases)
+{
+    debug() << "Got AliasesChanged for" << aliases.size() << "contacts";
+
+    foreach (AliasPair pair, aliases) {
+        QSharedPointer<Contact> contact = mPriv->lookupContactByHandle(pair.handle);
+
+        if (contact) {
+            contact->receiveAlias(pair.alias);
+        }
+    }
+}
+
 void ContactManager::onPresencesChanged(const Telepathy::SimpleContactPresences &presences)
 {
     debug() << "Got PresencesChanged for" << presences.size() << "contacts";
@@ -258,6 +273,14 @@ void ContactManager::Private::ensureTracking(Contact::Feature feature)
         return;
 
     switch (feature) {
+        case Contact::FeatureAlias:
+            QObject::connect(
+                    conn->aliasingInterface(),
+                    SIGNAL(AliasesChanged(const Telepathy::AliasPairList &)),
+                    conn->contactManager(),
+                    SLOT(onAliasesChanged(const Telepathy::AliasPairList &)));
+            break;
+
         case Contact::FeatureSimplePresence:
             QObject::connect(
                     conn->simplePresenceInterface(),
diff --git a/TelepathyQt4/Client/contact-manager.h b/TelepathyQt4/Client/contact-manager.h
index e325219..6431582 100644
--- a/TelepathyQt4/Client/contact-manager.h
+++ b/TelepathyQt4/Client/contact-manager.h
@@ -66,6 +66,7 @@ class ContactManager : public QObject
                 const QSet<Contact::Feature> &features);
 
     private Q_SLOTS:
+        void onAliasesChanged(const Telepathy::AliasPairList &);
         void onPresencesChanged(const Telepathy::SimpleContactPresences &);
 
     private:
diff --git a/TelepathyQt4/Client/contact.cpp b/TelepathyQt4/Client/contact.cpp
index dafa78c..c793548 100644
--- a/TelepathyQt4/Client/contact.cpp
+++ b/TelepathyQt4/Client/contact.cpp
@@ -48,6 +48,7 @@ struct Contact::Private
     QSet<Feature> requestedFeatures;
     QSet<Feature> actualFeatures;
 
+    QString alias;
     SimplePresence simplePresence;
 };
 
@@ -76,6 +77,17 @@ QSet<Contact::Feature> Contact::actualFeatures() const
     return mPriv->actualFeatures;
 }
 
+QString Contact::alias() const
+{
+    if (!mPriv->requestedFeatures.contains(FeatureAlias)) {
+        warning() << "Contact::alias() used on" << this
+            << "for which FeatureAlias hasn't been requested - returning id";
+        return id();
+    }
+
+    return mPriv->alias;
+}
+
 QString Contact::presenceStatus() const
 {
     if (!mPriv->requestedFeatures.contains(FeatureSimplePresence)) {
@@ -131,9 +143,19 @@ void Contact::augment(const QSet<Feature> &requestedFeatures, const QVariantMap
     mPriv->id = qdbus_cast<QString>(attributes[TELEPATHY_INTERFACE_CONNECTION "/contact-id"]);
 
     foreach (Feature feature, requestedFeatures) {
+        QString maybeAlias;
         SimplePresence maybePresence;
 
         switch (feature) {
+            case FeatureAlias:
+                maybeAlias = qdbus_cast<QString>(attributes.value(
+                            TELEPATHY_INTERFACE_CONNECTION_INTERFACE_ALIASING "/alias"));
+
+                if (!maybeAlias.isEmpty()) {
+                    receiveAlias(maybeAlias);
+                }
+                break;
+
             case FeatureSimplePresence:
                 maybePresence = qdbus_cast<SimplePresence>(attributes.value(
                             TELEPATHY_INTERFACE_CONNECTION_INTERFACE_SIMPLE_PRESENCE "/presence"));
@@ -150,10 +172,25 @@ void Contact::augment(const QSet<Feature> &requestedFeatures, const QVariantMap
     }
 }
 
+void Contact::receiveAlias(const QString &alias)
+{
+    if (!mPriv->requestedFeatures.contains(FeatureAlias)) {
+        return;
+    }
+
+    mPriv->actualFeatures.insert(FeatureAlias);
+
+    if (mPriv->alias != alias) {
+        mPriv->alias = alias;
+        emit aliasChanged(alias);
+    }
+}
+
 void Contact::receiveSimplePresence(const SimplePresence &presence)
 {
-    if (!mPriv->requestedFeatures.contains(FeatureSimplePresence))
+    if (!mPriv->requestedFeatures.contains(FeatureSimplePresence)) {
         return;
+    }
 
     mPriv->actualFeatures.insert(FeatureSimplePresence);
 
diff --git a/TelepathyQt4/Client/contact.h b/TelepathyQt4/Client/contact.h
index 750b076..a487aab 100644
--- a/TelepathyQt4/Client/contact.h
+++ b/TelepathyQt4/Client/contact.h
@@ -45,6 +45,7 @@ class Contact : public QObject
 
 public:
     enum Feature {
+        FeatureAlias,
         FeatureSimplePresence,
         _Padding = 0xFFFFFFFF
     };
@@ -57,6 +58,8 @@ public:
     QSet<Feature> requestedFeatures() const;
     QSet<Feature> actualFeatures() const;
 
+    QString alias() const;
+
     QString presenceStatus() const;
     uint presenceType() const;
     QString presenceMessage() const;
@@ -64,6 +67,7 @@ public:
     ~Contact();
 
 Q_SIGNALS:
+    void aliasChanged(const QString &alias);
     void simplePresenceChanged(const QString &status, uint type, const QString &presenceMessage);
 
 private:
@@ -73,6 +77,8 @@ private:
             const QSet<Feature> &requestedFeatures, const QVariantMap &attributes);
 
     void augment(const QSet<Feature> &requestedFeatures, const QVariantMap &attributes);
+
+    void receiveAlias(const QString &alias);
     void receiveSimplePresence(const SimplePresence &presence);
 
     struct Private;
diff --git a/tests/dbus/contacts.cpp b/tests/dbus/contacts.cpp
index d79e298..dd282e0 100644
--- a/tests/dbus/contacts.cpp
+++ b/tests/dbus/contacts.cpp
@@ -354,6 +354,15 @@ void TestContacts::testForIdentifiers()
 void TestContacts::testFeatures()
 {
     QStringList ids = QStringList() << "alice" << "bob" << "chris";
+    const char *initialAliases[] = {
+        "Alice in Wonderland",
+        "Bob the Builder",
+        "Chris Sawyer"
+    };
+    const char *latterAliases[] = {
+        "Alice Through the Looking Glass",
+        "Bob the Pensioner"
+    };
     static ContactsConnectionPresenceStatusIndex initialStatuses[] = {
         CONTACTS_CONNECTION_STATUS_AVAILABLE,
         CONTACTS_CONNECTION_STATUS_BUSY,
@@ -369,10 +378,12 @@ void TestContacts::testFeatures()
         "GON OUT BACKSON"
     };
     const char *latterMessages[] = {
-        "Having some sushi",
-        "Done fixing it",
+        "Having some carrots",
+        "Done building for life, yay",
     };
-    QSet<Contact::Feature> features = QSet<Contact::Feature>() << Contact::FeatureSimplePresence;
+    QSet<Contact::Feature> features = QSet<Contact::Feature>()
+        << Contact::FeatureAlias
+        << Contact::FeatureSimplePresence;
     TpHandleRepoIface *serviceRepo =
         tp_base_connection_get_handles(TP_BASE_CONNECTION(mConnService), TP_HANDLE_TYPE_CONTACT);
 
@@ -384,6 +395,8 @@ void TestContacts::testFeatures()
     }
 
     // Set the initial attributes
+    contacts_connection_change_aliases(mConnService, 3, handles.toVector().constData(),
+            initialAliases);
     contacts_connection_change_presences(mConnService, 3, handles.toVector().constData(),
             initialStatuses, initialMessages);
 
@@ -402,6 +415,9 @@ void TestContacts::testFeatures()
         QVERIFY((features - mContacts[i]->requestedFeatures()).isEmpty());
         QVERIFY((mContacts[i]->actualFeatures() - mContacts[i]->requestedFeatures()).isEmpty());
 
+        QVERIFY(mContacts[i]->actualFeatures().contains(Contact::FeatureAlias));
+        QCOMPARE(mContacts[i]->alias(), QString(initialAliases[i]));
+
         QVERIFY(mContacts[i]->actualFeatures().contains(Contact::FeatureSimplePresence));
         QCOMPARE(mContacts[i]->presenceMessage(), QString(initialMessages[i]));
     }
@@ -415,6 +431,8 @@ void TestContacts::testFeatures()
     QCOMPARE(mContacts[2]->presenceType(), uint(Telepathy::ConnectionPresenceTypeAway));
 
     // Change some of the contacts to a new set of attributes
+    contacts_connection_change_aliases(mConnService, 2, handles.toVector().constData(),
+            latterAliases);
     contacts_connection_change_presences(mConnService, 2, handles.toVector().constData(),
             latterStatuses, latterMessages);
     mLoop->processEvents();
@@ -427,9 +445,14 @@ void TestContacts::testFeatures()
         QVERIFY((features - mContacts[i]->requestedFeatures()).isEmpty());
         QVERIFY((mContacts[i]->actualFeatures() - mContacts[i]->requestedFeatures()).isEmpty());
 
+        QVERIFY(mContacts[i]->actualFeatures().contains(Contact::FeatureAlias));
         QVERIFY(mContacts[i]->actualFeatures().contains(Contact::FeatureSimplePresence));
     }
 
+    QCOMPARE(mContacts[0]->alias(), QString(latterAliases[0]));
+    QCOMPARE(mContacts[1]->alias(), QString(latterAliases[1]));
+    QCOMPARE(mContacts[2]->alias(), QString(initialAliases[2]));
+
     QCOMPARE(mContacts[0]->presenceStatus(), QString("away"));
     QCOMPARE(mContacts[1]->presenceStatus(), QString("available"));
     QCOMPARE(mContacts[2]->presenceStatus(), QString("away"));
@@ -459,6 +482,11 @@ void TestContacts::testFeatures()
 void TestContacts::testUpgrade()
 {
     QStringList ids = QStringList() << "alice" << "bob" << "chris";
+    const char *aliases[] = {
+        "Alice in Wonderland",
+        "Bob The Builder",
+        "Chris Sawyer"
+    };
     static ContactsConnectionPresenceStatusIndex statuses[] = {
         CONTACTS_CONNECTION_STATUS_AVAILABLE,
         CONTACTS_CONNECTION_STATUS_BUSY,
@@ -478,6 +506,7 @@ void TestContacts::testUpgrade()
         QVERIFY(handles[i] != 0);
     }
 
+    contacts_connection_change_aliases(mConnService, 3, handles.toVector().constData(), aliases);
     contacts_connection_change_presences(mConnService, 3, handles.toVector().constData(), statuses,
             messages);
 
@@ -494,7 +523,9 @@ void TestContacts::testUpgrade()
     QList<QSharedPointer<Contact> > saveContacts = mContacts;
 
     // Upgrade them
-    QSet<Contact::Feature> features = QSet<Contact::Feature>() << Contact::FeatureSimplePresence;
+    QSet<Contact::Feature> features = QSet<Contact::Feature>()
+        << Contact::FeatureAlias
+        << Contact::FeatureSimplePresence;
     pending = mConn->contactManager()->upgradeContacts(saveContacts, features);
 
     // Test the closure accessors
@@ -523,6 +554,9 @@ void TestContacts::testUpgrade()
         QVERIFY((features - mContacts[i]->requestedFeatures()).isEmpty());
         QVERIFY((mContacts[i]->actualFeatures() - mContacts[i]->requestedFeatures()).isEmpty());
 
+        QVERIFY(mContacts[i]->actualFeatures().contains(Contact::FeatureAlias));
+        QCOMPARE(mContacts[i]->alias(), QString(aliases[i]));
+
         QVERIFY(mContacts[i]->actualFeatures().contains(Contact::FeatureSimplePresence));
         QCOMPARE(mContacts[i]->presenceMessage(), QString(messages[i]));
     }
-- 
1.5.6.5




More information about the telepathy-commits mailing list