From 1e2722460b9a67713484903bf6382d08f7e09278 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Remko=20Tron=C3=A7on?= <git@el-tramo.be>
Date: Sat, 12 Mar 2011 12:45:16 +0100
Subject: Moved vcard photo hash management into vcard storage.

This makes it easy to adapt the code to cache photo hashes if we want to.

diff --git a/Swiften/Avatars/AvatarFileStorage.cpp b/Swiften/Avatars/AvatarFileStorage.cpp
index 44a6a7f..5caf794 100644
--- a/Swiften/Avatars/AvatarFileStorage.cpp
+++ b/Swiften/Avatars/AvatarFileStorage.cpp
@@ -12,6 +12,8 @@
 #include <boost/property_tree/xml_parser.hpp>
 
 #include <Swiften/Base/foreach.h>
+#include <Swiften/StringCodecs/SHA1.h>
+#include <Swiften/StringCodecs/Hexify.h>
 
 namespace Swift {
 
@@ -44,6 +46,8 @@ bool AvatarFileStorage::hasAvatar(const std::string& hash) const {
 }
 
 void AvatarFileStorage::addAvatar(const std::string& hash, const ByteArray& avatar) {
+	assert(Hexify::hexify(SHA1::getHash(avatar)) == hash);
+
 	boost::filesystem::path avatarPath = getAvatarPath(hash);
 	if (!boost::filesystem::exists(avatarPath.parent_path())) {
 		try {
diff --git a/Swiften/Avatars/VCardAvatarManager.cpp b/Swiften/Avatars/VCardAvatarManager.cpp
index ce732db..046e6f3 100644
--- a/Swiften/Avatars/VCardAvatarManager.cpp
+++ b/Swiften/Avatars/VCardAvatarManager.cpp
@@ -29,17 +29,16 @@ void VCardAvatarManager::handleVCardChanged(const JID& from) {
 }
 
 std::string VCardAvatarManager::getAvatarHash(const JID& jid) const {
-	VCard::ref vCard = vcardManager_->getVCard(getAvatarJID(jid));
-	if (vCard && !vCard->getPhoto().isEmpty()) {
-		std::string hash = Hexify::hexify(SHA1::getHash(vCard->getPhoto()));
+	JID avatarJID = getAvatarJID(jid);
+	std::string hash = vcardManager_->getPhotoHash(avatarJID);
+	if (!hash.empty()) {
 		if (!avatarStorage_->hasAvatar(hash)) {
+			VCard::ref vCard = vcardManager_->getVCard(avatarJID);
+			assert(vCard);
 			avatarStorage_->addAvatar(hash, vCard->getPhoto());
 		}
-		return hash;
-	}
-	else {
-		return "";
 	}
+	return hash;
 }
 
 JID VCardAvatarManager::getAvatarJID(const JID& jid) const {
diff --git a/Swiften/VCards/VCardManager.cpp b/Swiften/VCards/VCardManager.cpp
index de53238..b9602ab 100644
--- a/Swiften/VCards/VCardManager.cpp
+++ b/Swiften/VCards/VCardManager.cpp
@@ -12,6 +12,7 @@
 #include "Swiften/VCards/VCardStorage.h"
 #include "Swiften/VCards/GetVCardRequest.h"
 
+
 namespace Swift {
 
 VCardManager::VCardManager(const JID& ownJID, IQRouter* iqRouter, VCardStorage* vcardStorage) : ownJID(ownJID), iqRouter(iqRouter), storage(vcardStorage) {
@@ -77,4 +78,8 @@ void VCardManager::setVCard(const JID& jid, VCard::ref vcard) {
 	}
 }
 
+std::string VCardManager::getPhotoHash(const JID& jid) const {
+	return storage->getPhotoHash(jid);
+}
+
 }
diff --git a/Swiften/VCards/VCardManager.h b/Swiften/VCards/VCardManager.h
index 5cdf82e..1dd16ae 100644
--- a/Swiften/VCards/VCardManager.h
+++ b/Swiften/VCards/VCardManager.h
@@ -29,6 +29,9 @@ namespace Swift {
 			void requestVCard(const JID& jid);
 			void requestOwnVCard();
 
+			std::string getPhotoHash(const JID& jid) const;
+
+
 			SetVCardRequest::ref createSetVCardRequest(VCard::ref);
 
 		public:
diff --git a/Swiften/VCards/VCardStorage.cpp b/Swiften/VCards/VCardStorage.cpp
index cacd083..b14ee60 100644
--- a/Swiften/VCards/VCardStorage.cpp
+++ b/Swiften/VCards/VCardStorage.cpp
@@ -6,9 +6,22 @@
 
 #include "Swiften/VCards/VCardStorage.h"
 
+#include <Swiften/StringCodecs/Hexify.h>
+#include <Swiften/StringCodecs/SHA1.h>
+
 namespace Swift {
 
 VCardStorage::~VCardStorage() {
 }
 
+std::string VCardStorage::getPhotoHash(const JID& jid) const {
+	VCard::ref vCard = getVCard(jid);
+	if (vCard && !vCard->getPhoto().isEmpty()) {
+		return Hexify::hexify(SHA1::getHash(vCard->getPhoto()));
+	}
+	else {
+		return "";
+	}
+}
+
 }
diff --git a/Swiften/VCards/VCardStorage.h b/Swiften/VCards/VCardStorage.h
index 854ccc6..977a40c 100644
--- a/Swiften/VCards/VCardStorage.h
+++ b/Swiften/VCards/VCardStorage.h
@@ -6,9 +6,10 @@
 
 #pragma once
 
+#include <string>
 #include <boost/shared_ptr.hpp>
 
-#include "Swiften/Elements/VCard.h"
+#include <Swiften/Elements/VCard.h>
 
 namespace Swift {
 	class JID;
@@ -19,5 +20,7 @@ namespace Swift {
 
 			virtual VCard::ref getVCard(const JID& jid) const = 0;
 			virtual void setVCard(const JID&, VCard::ref) = 0;
+
+			virtual std::string getPhotoHash(const JID&) const;
 	};
 }
-- 
cgit v0.10.2-6-g49f6