[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