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

Olli Salli olli.salli at collabora.co.uk
Wed Feb 4 04:57:57 PST 2009


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

diff --git a/TelepathyQt4/Client/contact-manager.cpp b/TelepathyQt4/Client/contact-manager.cpp
index 6e4f013..eb7ed7b 100644
--- a/TelepathyQt4/Client/contact-manager.cpp
+++ b/TelepathyQt4/Client/contact-manager.cpp
@@ -99,6 +99,8 @@ QString featureToInterface(Contact::Feature feature)
     switch (feature) {
         case Contact::FeatureAlias:
             return TELEPATHY_INTERFACE_CONNECTION_INTERFACE_ALIASING;
+        case Contact::FeatureAvatarToken:
+            return TELEPATHY_INTERFACE_CONNECTION_INTERFACE_AVATARS;
         case Contact::FeatureSimplePresence:
             return TELEPATHY_INTERFACE_CONNECTION_INTERFACE_SIMPLE_PRESENCE;
         default:
@@ -213,6 +215,16 @@ void ContactManager::onAliasesChanged(const Telepathy::AliasPairList &aliases)
     }
 }
 
+void ContactManager::onAvatarUpdated(uint handle, const QString &token)
+{
+    debug() << "Got AvatarUpdate for contact with handle" << handle;
+
+    QSharedPointer<Contact> contact = mPriv->lookupContactByHandle(handle);
+    if (contact) {
+        contact->receiveAvatarToken(token);
+    }
+}
+
 void ContactManager::onPresencesChanged(const Telepathy::SimpleContactPresences &presences)
 {
     debug() << "Got PresencesChanged for" << presences.size() << "contacts";
@@ -281,6 +293,14 @@ void ContactManager::Private::ensureTracking(Contact::Feature feature)
                     SLOT(onAliasesChanged(const Telepathy::AliasPairList &)));
             break;
 
+        case Contact::FeatureAvatarToken:
+            QObject::connect(
+                    conn->avatarsInterface(),
+                    SIGNAL(AvatarUpdated(uint, const QString &)),
+                    conn->contactManager(),
+                    SLOT(onAvatarUpdated(uint, const QString &)));
+            break;
+
         case Contact::FeatureSimplePresence:
             QObject::connect(
                     conn->simplePresenceInterface(),
diff --git a/TelepathyQt4/Client/contact-manager.h b/TelepathyQt4/Client/contact-manager.h
index 6431582..a7b43ca 100644
--- a/TelepathyQt4/Client/contact-manager.h
+++ b/TelepathyQt4/Client/contact-manager.h
@@ -67,6 +67,7 @@ class ContactManager : public QObject
 
     private Q_SLOTS:
         void onAliasesChanged(const Telepathy::AliasPairList &);
+        void onAvatarUpdated(uint, const QString &);
         void onPresencesChanged(const Telepathy::SimpleContactPresences &);
 
     private:
diff --git a/TelepathyQt4/Client/contact.cpp b/TelepathyQt4/Client/contact.cpp
index c793548..62d512f 100644
--- a/TelepathyQt4/Client/contact.cpp
+++ b/TelepathyQt4/Client/contact.cpp
@@ -37,7 +37,7 @@ namespace Client
 struct Contact::Private
 {
     Private(ContactManager *manager, const ReferencedHandles &handle)
-        : manager(manager), handle(handle)
+        : manager(manager), handle(handle), isAvatarTokenKnown(false)
     {
     }
 
@@ -49,6 +49,8 @@ struct Contact::Private
     QSet<Feature> actualFeatures;
 
     QString alias;
+    bool isAvatarTokenKnown;
+    QString avatarToken;
     SimplePresence simplePresence;
 };
 
@@ -88,6 +90,32 @@ QString Contact::alias() const
     return mPriv->alias;
 }
 
+bool Contact::isAvatarTokenKnown() const
+{
+    if (!mPriv->requestedFeatures.contains(FeatureAvatarToken)) {
+        warning() << "Contact::isAvatarTokenKnown() used on" << this
+            << "for which FeatureAvatarToken hasn't been requested - returning false";
+        return false;
+    }
+
+    return mPriv->isAvatarTokenKnown;
+}
+
+QString Contact::avatarToken() const
+{
+    if (!mPriv->requestedFeatures.contains(FeatureAvatarToken)) {
+        warning() << "Contact::avatarToken() used on" << this
+            << "for which FeatureAvatarToken hasn't been requested - returning \"\"";
+        return QString("");
+    } else if (!isAvatarTokenKnown()) {
+        warning() << "Contact::avatarToken() used on" << this
+            << "for which the avatar token is not (yet) known - returning \"\"";
+        return QString("");
+    }
+
+    return mPriv->avatarToken;
+}
+
 QString Contact::presenceStatus() const
 {
     if (!mPriv->requestedFeatures.contains(FeatureSimplePresence)) {
@@ -156,6 +184,19 @@ void Contact::augment(const QSet<Feature> &requestedFeatures, const QVariantMap
                 }
                 break;
 
+            case FeatureAvatarToken:
+                if (attributes.contains(
+                            TELEPATHY_INTERFACE_CONNECTION_INTERFACE_AVATARS "/token")) {
+                    receiveAvatarToken(qdbus_cast<QString>(attributes.value(
+                                    TELEPATHY_INTERFACE_CONNECTION_INTERFACE_AVATARS "/token")));
+                } else if (mPriv->requestedFeatures.contains(FeatureAvatarToken)) {
+                    // TODO: When Conn::CAI and ContactManager::featuresSupported are added, check
+                    // for those (probably only the latter) here to decide whether to set this or
+                    // not
+                    mPriv->actualFeatures.insert(FeatureAvatarToken);
+                }
+                break;
+
             case FeatureSimplePresence:
                 maybePresence = qdbus_cast<SimplePresence>(attributes.value(
                             TELEPATHY_INTERFACE_CONNECTION_INTERFACE_SIMPLE_PRESENCE "/presence"));
@@ -186,6 +227,21 @@ void Contact::receiveAlias(const QString &alias)
     }
 }
 
+void Contact::receiveAvatarToken(const QString &token)
+{
+    if (!mPriv->requestedFeatures.contains(FeatureAvatarToken)) {
+        return;
+    }
+
+    mPriv->actualFeatures.insert(FeatureAvatarToken);
+
+    if (!mPriv->isAvatarTokenKnown || mPriv->avatarToken != token) {
+        mPriv->isAvatarTokenKnown = true;
+        mPriv->avatarToken = token;
+        emit avatarTokenChanged(token);
+    }
+}
+
 void Contact::receiveSimplePresence(const SimplePresence &presence)
 {
     if (!mPriv->requestedFeatures.contains(FeatureSimplePresence)) {
diff --git a/TelepathyQt4/Client/contact.h b/TelepathyQt4/Client/contact.h
index a487aab..8b99e35 100644
--- a/TelepathyQt4/Client/contact.h
+++ b/TelepathyQt4/Client/contact.h
@@ -46,6 +46,7 @@ class Contact : public QObject
 public:
     enum Feature {
         FeatureAlias,
+        FeatureAvatarToken,
         FeatureSimplePresence,
         _Padding = 0xFFFFFFFF
     };
@@ -60,6 +61,9 @@ public:
 
     QString alias() const;
 
+    bool isAvatarTokenKnown() const;
+    QString avatarToken() const;
+
     QString presenceStatus() const;
     uint presenceType() const;
     QString presenceMessage() const;
@@ -68,6 +72,7 @@ public:
 
 Q_SIGNALS:
     void aliasChanged(const QString &alias);
+    void avatarTokenChanged(const QString &avatarToken);
     void simplePresenceChanged(const QString &status, uint type, const QString &presenceMessage);
 
 private:
@@ -79,6 +84,7 @@ private:
     void augment(const QSet<Feature> &requestedFeatures, const QVariantMap &attributes);
 
     void receiveAlias(const QString &alias);
+    void receiveAvatarToken(const QString &avatarToken);
     void receiveSimplePresence(const SimplePresence &presence);
 
     struct Private;
diff --git a/tests/dbus/contacts.cpp b/tests/dbus/contacts.cpp
index 2e469e8..a653914 100644
--- a/tests/dbus/contacts.cpp
+++ b/tests/dbus/contacts.cpp
@@ -372,6 +372,14 @@ void TestContacts::testFeatures()
         "Alice Through the Looking Glass",
         "Bob the Pensioner"
     };
+    const char *initialTokens[] = {
+        "bbbbb",
+        "ccccc"
+    };
+    const char *latterTokens[] = {
+        "AAAA",
+        "BBBB"
+    };
     static ContactsConnectionPresenceStatusIndex initialStatuses[] = {
         CONTACTS_CONNECTION_STATUS_AVAILABLE,
         CONTACTS_CONNECTION_STATUS_BUSY,
@@ -392,6 +400,7 @@ void TestContacts::testFeatures()
     };
     QSet<Contact::Feature> features = QSet<Contact::Feature>()
         << Contact::FeatureAlias
+        << Contact::FeatureAvatarToken
         << Contact::FeatureSimplePresence;
     TpHandleRepoIface *serviceRepo =
         tp_base_connection_get_handles(TP_BASE_CONNECTION(mConnService), TP_HANDLE_TYPE_CONTACT);
@@ -406,6 +415,8 @@ void TestContacts::testFeatures()
     // Set the initial attributes
     contacts_connection_change_aliases(mConnService, 3, handles.toVector().constData(),
             initialAliases);
+    contacts_connection_change_avatar_tokens(mConnService, 2, handles.toVector().constData() + 1,
+            initialTokens);
     contacts_connection_change_presences(mConnService, 3, handles.toVector().constData(),
             initialStatuses, initialMessages);
 
@@ -427,10 +438,21 @@ void TestContacts::testFeatures()
         QVERIFY(mContacts[i]->actualFeatures().contains(Contact::FeatureAlias));
         QCOMPARE(mContacts[i]->alias(), QString(initialAliases[i]));
 
+        QVERIFY(mContacts[i]->actualFeatures().contains(Contact::FeatureAvatarToken));
         QVERIFY(mContacts[i]->actualFeatures().contains(Contact::FeatureSimplePresence));
         QCOMPARE(mContacts[i]->presenceMessage(), QString(initialMessages[i]));
     }
 
+    // Check that there's no known avatar token for the first contact, but that there is for the
+    // two others
+    QVERIFY(!mContacts[0]->isAvatarTokenKnown());
+    QVERIFY(mContacts[1]->isAvatarTokenKnown());
+    QVERIFY(mContacts[2]->isAvatarTokenKnown());
+
+    QCOMPARE(mContacts[0]->avatarToken(), QString(""));
+    QCOMPARE(mContacts[1]->avatarToken(), QString(initialTokens[0]));
+    QCOMPARE(mContacts[2]->avatarToken(), QString(initialTokens[1]));
+
     QCOMPARE(mContacts[0]->presenceStatus(), QString("available"));
     QCOMPARE(mContacts[1]->presenceStatus(), QString("busy"));
     QCOMPARE(mContacts[2]->presenceStatus(), QString("away"));
@@ -442,6 +464,8 @@ void TestContacts::testFeatures()
     // Change some of the contacts to a new set of attributes
     contacts_connection_change_aliases(mConnService, 2, handles.toVector().constData(),
             latterAliases);
+    contacts_connection_change_avatar_tokens(mConnService, 2, handles.toVector().constData(),
+            latterTokens);
     contacts_connection_change_presences(mConnService, 2, handles.toVector().constData(),
             latterStatuses, latterMessages);
     mLoop->processEvents();
@@ -455,13 +479,20 @@ void TestContacts::testFeatures()
         QVERIFY((mContacts[i]->actualFeatures() - mContacts[i]->requestedFeatures()).isEmpty());
 
         QVERIFY(mContacts[i]->actualFeatures().contains(Contact::FeatureAlias));
+        QVERIFY(mContacts[i]->actualFeatures().contains(Contact::FeatureAvatarToken));
         QVERIFY(mContacts[i]->actualFeatures().contains(Contact::FeatureSimplePresence));
+
+        QVERIFY(mContacts[i]->isAvatarTokenKnown());
     }
 
     QCOMPARE(mContacts[0]->alias(), QString(latterAliases[0]));
     QCOMPARE(mContacts[1]->alias(), QString(latterAliases[1]));
     QCOMPARE(mContacts[2]->alias(), QString(initialAliases[2]));
 
+    QCOMPARE(mContacts[0]->avatarToken(), QString(latterTokens[0]));
+    QCOMPARE(mContacts[1]->avatarToken(), QString(latterTokens[1]));
+    QCOMPARE(mContacts[2]->avatarToken(), QString(initialTokens[1]));
+
     QCOMPARE(mContacts[0]->presenceStatus(), QString("away"));
     QCOMPARE(mContacts[1]->presenceStatus(), QString("available"));
     QCOMPARE(mContacts[2]->presenceStatus(), QString("away"));
@@ -496,6 +527,11 @@ void TestContacts::testUpgrade()
         "Bob The Builder",
         "Chris Sawyer"
     };
+    const char *tokens[] = {
+        "aaaaa",
+        "bbbbb",
+        "ccccc"
+    };
     static ContactsConnectionPresenceStatusIndex statuses[] = {
         CONTACTS_CONNECTION_STATUS_AVAILABLE,
         CONTACTS_CONNECTION_STATUS_BUSY,
@@ -516,6 +552,7 @@ void TestContacts::testUpgrade()
     }
 
     contacts_connection_change_aliases(mConnService, 3, handles.toVector().constData(), aliases);
+    contacts_connection_change_avatar_tokens(mConnService, 3, handles.toVector().constData(), tokens);
     contacts_connection_change_presences(mConnService, 3, handles.toVector().constData(), statuses,
             messages);
 
@@ -534,6 +571,7 @@ void TestContacts::testUpgrade()
     // Upgrade them
     QSet<Contact::Feature> features = QSet<Contact::Feature>()
         << Contact::FeatureAlias
+        << Contact::FeatureAvatarToken
         << Contact::FeatureSimplePresence;
     pending = mConn->contactManager()->upgradeContacts(saveContacts, features);
 
@@ -566,6 +604,10 @@ void TestContacts::testUpgrade()
         QVERIFY(mContacts[i]->actualFeatures().contains(Contact::FeatureAlias));
         QCOMPARE(mContacts[i]->alias(), QString(aliases[i]));
 
+        QVERIFY(mContacts[i]->actualFeatures().contains(Contact::FeatureAvatarToken));
+        QVERIFY(mContacts[i]->isAvatarTokenKnown());
+        QCOMPARE(mContacts[i]->avatarToken(), QString(tokens[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