summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRemko Tronçon <git@el-tramo.be>2012-04-23 11:03:56 (GMT)
committerRemko Tronçon <git@el-tramo.be>2012-04-23 11:03:56 (GMT)
commit39d46fb62ef01c3394ec0b453229f8d703f75153 (patch)
treef1b99fe5e337b90182539326a78f8967a010c9db
parentc5dc30ae9ad8b9f3b0209c8ba177f1ce170a6364 (diff)
downloadswift-contrib-39d46fb62ef01c3394ec0b453229f8d703f75153.zip
swift-contrib-39d46fb62ef01c3394ec0b453229f8d703f75153.tar.bz2
Fixed assertion with inconsitent vcard cache.
Resolves: #1077
-rw-r--r--Swiften/Avatars/VCardAvatarManager.cpp8
1 files changed, 8 insertions, 0 deletions
diff --git a/Swiften/Avatars/VCardAvatarManager.cpp b/Swiften/Avatars/VCardAvatarManager.cpp
index c9571c3..ef1d293 100644
--- a/Swiften/Avatars/VCardAvatarManager.cpp
+++ b/Swiften/Avatars/VCardAvatarManager.cpp
@@ -8,18 +8,19 @@
#include <boost/bind.hpp>
#include <Swiften/Elements/VCard.h>
#include <Swiften/StringCodecs/SHA1.h>
#include <Swiften/StringCodecs/Hexify.h>
#include <Swiften/Avatars/AvatarStorage.h>
#include <Swiften/MUC/MUCRegistry.h>
#include <Swiften/VCards/VCardManager.h>
+#include <Swiften/Base/Log.h>
namespace Swift {
VCardAvatarManager::VCardAvatarManager(VCardManager* vcardManager, AvatarStorage* avatarStorage, MUCRegistry* mucRegistry) : vcardManager_(vcardManager), avatarStorage_(avatarStorage), mucRegistry_(mucRegistry) {
vcardManager_->onVCardChanged.connect(boost::bind(&VCardAvatarManager::handleVCardChanged, this, _1));
}
void VCardAvatarManager::handleVCardChanged(const JID& from) {
// We don't check whether the avatar actually changed. Direct use of this
@@ -29,18 +30,25 @@ void VCardAvatarManager::handleVCardChanged(const JID& from) {
}
std::string VCardAvatarManager::getAvatarHash(const JID& jid) const {
JID avatarJID = getAvatarJID(jid);
std::string hash = vcardManager_->getPhotoHash(avatarJID);
if (!hash.empty()) {
if (!avatarStorage_->hasAvatar(hash)) {
VCard::ref vCard = vcardManager_->getVCard(avatarJID);
if (vCard) {
+ std::string newHash = Hexify::hexify(SHA1::getHash(vCard->getPhoto()));
+ if (newHash != hash) {
+ // Shouldn't happen, but sometimes seem to. Might be fixed if we
+ // move to a safer backend.
+ SWIFT_LOG(warning) << "Inconsistent vCard photo hash cache";
+ hash = newHash;
+ }
avatarStorage_->addAvatar(hash, vCard->getPhoto());
}
else {
// Can happen if the cache is inconsistent.
hash = "";
}
}
}
return hash;