From aebf16650e33f442d3cc3bbc87f034c3c146e596 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Remko=20Tron=C3=A7on?= <git@el-tramo.be>
Date: Mon, 14 Mar 2011 20:11:05 +0100
Subject: Make sure the avatar gets updated in the chat window.

Combined avatar provider shouldn't look up avatars in the cache, because
the specific providers can return different results if they use the bare
JID.

Resolves: #781
Release-Notes: Fixed a bug where the avatar was not updating in the chat window.

diff --git a/Swiften/Avatars/CombinedAvatarProvider.cpp b/Swiften/Avatars/CombinedAvatarProvider.cpp
index d7e716c..eea0b89 100644
--- a/Swiften/Avatars/CombinedAvatarProvider.cpp
+++ b/Swiften/Avatars/CombinedAvatarProvider.cpp
@@ -14,13 +14,7 @@
 namespace Swift {
 
 std::string CombinedAvatarProvider::getAvatarHash(const JID& jid) const {
-	std::map<JID, std::string>::const_iterator i = avatars.find(jid);
-	if (i == avatars.end()) {
-		return getCombinedAvatarAndCache(jid);
-	}
-	else {
-		return i->second;
-	}
+	return getCombinedAvatarAndCache(jid);
 }
 
 void CombinedAvatarProvider::addProvider(AvatarProvider* provider) {
diff --git a/Swiften/Avatars/UnitTest/CombinedAvatarProviderTest.cpp b/Swiften/Avatars/UnitTest/CombinedAvatarProviderTest.cpp
index 3e1cba3..4894e14 100644
--- a/Swiften/Avatars/UnitTest/CombinedAvatarProviderTest.cpp
+++ b/Swiften/Avatars/UnitTest/CombinedAvatarProviderTest.cpp
@@ -26,6 +26,7 @@ class CombinedAvatarProviderTest : public CppUnit::TestFixture {
 		CPPUNIT_TEST(testProviderUpdateWithAvatarDisappearingTriggersChange);
 		CPPUNIT_TEST(testProviderUpdateAfterAvatarDisappearedTriggersChange);
 		CPPUNIT_TEST(testProviderUpdateAfterGetDoesNotTriggerChange);
+		CPPUNIT_TEST(testProviderUpdateBareJIDAfterGetFullJID);
 		CPPUNIT_TEST(testRemoveProviderDisconnectsUpdates);
 		CPPUNIT_TEST_SUITE_END();
 
@@ -168,6 +169,19 @@ class CombinedAvatarProviderTest : public CppUnit::TestFixture {
 			CPPUNIT_ASSERT_EQUAL(0, static_cast<int>(changes.size()));
 		}
 
+		void testProviderUpdateBareJIDAfterGetFullJID() {
+			std::auto_ptr<CombinedAvatarProvider> testling(createProvider());
+			avatarProvider1->useBare = true;
+			testling->addProvider(avatarProvider1);
+
+			avatarProvider1->avatars[user1.toBare()] = avatarHash1;
+			testling->getAvatarHash(user1);
+			avatarProvider1->avatars[user1.toBare()] = avatarHash2;
+			avatarProvider1->onAvatarChanged(user1.toBare());
+
+			CPPUNIT_ASSERT_EQUAL(avatarHash2, testling->getAvatarHash(user1));
+		}
+
 	private:
 		std::auto_ptr<CombinedAvatarProvider> createProvider() {
 			std::auto_ptr<CombinedAvatarProvider> result(new CombinedAvatarProvider());
@@ -181,8 +195,12 @@ class CombinedAvatarProviderTest : public CppUnit::TestFixture {
 
 	private:
 		struct DummyAvatarProvider : public AvatarProvider {
+			DummyAvatarProvider() : useBare(false) {
+			}
+
 			std::string getAvatarHash(const JID& jid) const {
-				std::map<JID, std::string>::const_iterator i = avatars.find(jid);
+				JID actualJID = useBare ? jid.toBare() : jid;
+				std::map<JID, std::string>::const_iterator i = avatars.find(actualJID);
 				if (i != avatars.end()) {
 					return i->second;
 				}
@@ -191,6 +209,7 @@ class CombinedAvatarProviderTest : public CppUnit::TestFixture {
 				}
 			}
 
+			bool useBare;
 			std::map<JID, std::string> avatars;
 		};
 
-- 
cgit v0.10.2-6-g49f6