summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Swiften/Avatars/UnitTest/VCardUpdateAvatarManagerTest.cpp14
-rw-r--r--Swiften/Avatars/VCardUpdateAvatarManager.cpp11
2 files changed, 21 insertions, 4 deletions
diff --git a/Swiften/Avatars/UnitTest/VCardUpdateAvatarManagerTest.cpp b/Swiften/Avatars/UnitTest/VCardUpdateAvatarManagerTest.cpp
index ce100ee..5a98a0e 100644
--- a/Swiften/Avatars/UnitTest/VCardUpdateAvatarManagerTest.cpp
+++ b/Swiften/Avatars/UnitTest/VCardUpdateAvatarManagerTest.cpp
@@ -25,10 +25,11 @@ class VCardUpdateAvatarManagerTest : public CppUnit::TestFixture {
25 CPPUNIT_TEST_SUITE(VCardUpdateAvatarManagerTest); 25 CPPUNIT_TEST_SUITE(VCardUpdateAvatarManagerTest);
26 CPPUNIT_TEST(testUpdate_NewHashNewVCardRequestsVCard); 26 CPPUNIT_TEST(testUpdate_NewHashNewVCardRequestsVCard);
27 CPPUNIT_TEST(testUpdate_NewHashStoresAvatarAndEmitsNotificationOnVCardReceive); 27 CPPUNIT_TEST(testUpdate_NewHashStoresAvatarAndEmitsNotificationOnVCardReceive);
28 CPPUNIT_TEST(testUpdate_KnownHash); 28 CPPUNIT_TEST(testUpdate_KnownHash);
29 CPPUNIT_TEST(testUpdate_KnownHashFromDifferentUserDoesNotRequestVCardButTriggersNotification); 29 CPPUNIT_TEST(testUpdate_KnownHashFromDifferentUserDoesNotRequestVCardButTriggersNotification);
30 CPPUNIT_TEST(testVCardWithEmptyPhoto);
30 CPPUNIT_TEST(testStanzaChannelReset); 31 CPPUNIT_TEST(testStanzaChannelReset);
31 CPPUNIT_TEST_SUITE_END(); 32 CPPUNIT_TEST_SUITE_END();
32 33
33 public: 34 public:
34 void setUp() { 35 void setUp() {
@@ -101,10 +102,19 @@ class VCardUpdateAvatarManagerTest : public CppUnit::TestFixture {
101 CPPUNIT_ASSERT_EQUAL(1, static_cast<int>(changes.size())); 102 CPPUNIT_ASSERT_EQUAL(1, static_cast<int>(changes.size()));
102 CPPUNIT_ASSERT_EQUAL(user2.toBare(), changes[0].first); 103 CPPUNIT_ASSERT_EQUAL(user2.toBare(), changes[0].first);
103 CPPUNIT_ASSERT_EQUAL(avatar1Hash, changes[0].second); 104 CPPUNIT_ASSERT_EQUAL(avatar1Hash, changes[0].second);
104 } 105 }
105 106
107 void testVCardWithEmptyPhoto() {
108 std::auto_ptr<VCardUpdateAvatarManager> testling = createManager();
109 vcardManager->requestVCard(JID("foo@bar.com"));
110 stanzaChannel->onIQReceived(createVCardResult(ByteArray()));
111
112 CPPUNIT_ASSERT(!avatarStorage->hasAvatar(Hexify::hexify(SHA1::getHash(ByteArray()))));
113 CPPUNIT_ASSERT_EQUAL(boost::filesystem::path(), testling->getAvatarPath(JID("foo@bar.com")));
114 }
115
106 void testStanzaChannelReset() { 116 void testStanzaChannelReset() {
107 std::auto_ptr<VCardUpdateAvatarManager> testling = createManager(); 117 std::auto_ptr<VCardUpdateAvatarManager> testling = createManager();
108 stanzaChannel->onPresenceReceived(createPresenceWithPhotoHash(user1, avatar1Hash)); 118 stanzaChannel->onPresenceReceived(createPresenceWithPhotoHash(user1, avatar1Hash));
109 stanzaChannel->onIQReceived(createVCardResult(avatar1)); 119 stanzaChannel->onIQReceived(createVCardResult(avatar1));
110 changes.clear(); 120 changes.clear();
@@ -133,11 +143,13 @@ class VCardUpdateAvatarManagerTest : public CppUnit::TestFixture {
133 return presence; 143 return presence;
134 } 144 }
135 145
136 IQ::ref createVCardResult(const ByteArray& avatar) { 146 IQ::ref createVCardResult(const ByteArray& avatar) {
137 VCard::ref vcard(new VCard()); 147 VCard::ref vcard(new VCard());
138 vcard->setPhoto(avatar); 148 if (!avatar.isEmpty()) {
149 vcard->setPhoto(avatar);
150 }
139 return IQ::createResult(JID("baz@fum.com"), stanzaChannel->sentStanzas[0]->getID(), vcard); 151 return IQ::createResult(JID("baz@fum.com"), stanzaChannel->sentStanzas[0]->getID(), vcard);
140 } 152 }
141 153
142 void handleAvatarChanged(const JID& jid, const String& hash) { 154 void handleAvatarChanged(const JID& jid, const String& hash) {
143 changes.push_back(std::pair<JID,String>(jid, hash)); 155 changes.push_back(std::pair<JID,String>(jid, hash));
diff --git a/Swiften/Avatars/VCardUpdateAvatarManager.cpp b/Swiften/Avatars/VCardUpdateAvatarManager.cpp
index dbc0b9b..24abfa1 100644
--- a/Swiften/Avatars/VCardUpdateAvatarManager.cpp
+++ b/Swiften/Avatars/VCardUpdateAvatarManager.cpp
@@ -50,13 +50,18 @@ void VCardUpdateAvatarManager::handleVCardChanged(const JID& from, VCard::ref vC
50 if (!vCard) { 50 if (!vCard) {
51 std::cerr << "Warning: " << from << ": null vcard payload" << std::endl; 51 std::cerr << "Warning: " << from << ": null vcard payload" << std::endl;
52 return; 52 return;
53 } 53 }
54 54
55 String hash = Hexify::hexify(SHA1::getHash(vCard->getPhoto())); 55 if (vCard->getPhoto().isEmpty()) {
56 avatarStorage_->addAvatar(hash, vCard->getPhoto()); 56 setAvatarHash(from, "");
57 setAvatarHash(from, hash); 57 }
58 else {
59 String hash = Hexify::hexify(SHA1::getHash(vCard->getPhoto()));
60 avatarStorage_->addAvatar(hash, vCard->getPhoto());
61 setAvatarHash(from, hash);
62 }
58} 63}
59 64
60void VCardUpdateAvatarManager::setAvatarHash(const JID& from, const String& hash) { 65void VCardUpdateAvatarManager::setAvatarHash(const JID& from, const String& hash) {
61 avatarHashes_[from] = hash; 66 avatarHashes_[from] = hash;
62 onAvatarChanged(from, hash); 67 onAvatarChanged(from, hash);