summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'Swiften/Avatars/CombinedAvatarProvider.cpp')
-rw-r--r--Swiften/Avatars/CombinedAvatarProvider.cpp57
1 files changed, 57 insertions, 0 deletions
diff --git a/Swiften/Avatars/CombinedAvatarProvider.cpp b/Swiften/Avatars/CombinedAvatarProvider.cpp
new file mode 100644
index 0000000..0e4a704
--- /dev/null
+++ b/Swiften/Avatars/CombinedAvatarProvider.cpp
@@ -0,0 +1,57 @@
+/*
+ * Copyright (c) 2010 Remko Tronçon
+ * Licensed under the GNU General Public License v3.
+ * See Documentation/Licenses/GPLv3.txt for more information.
+ */
+
+#include "Swiften/Avatars/CombinedAvatarProvider.h"
+
+#include <algorithm>
+#include <boost/bind.hpp>
+
+namespace Swift {
+
+String CombinedAvatarProvider::getAvatarHash(const JID& jid) const {
+ for (size_t i = 0; i < providers.size(); ++i) {
+ String hash = providers[i]->getAvatarHash(jid);
+ if (!hash.isEmpty()) {
+ return hash;
+ }
+ }
+ return String();
+}
+
+void CombinedAvatarProvider::addProvider(AvatarProvider* provider) {
+ provider->onAvatarChanged.connect(reinterpret_cast<int>(this), boost::bind(&CombinedAvatarProvider::handleAvatarChanged, this, _1));
+ providers.push_back(provider);
+}
+
+void CombinedAvatarProvider::removeProvider(AvatarProvider* provider) {
+ std::vector<AvatarProvider*>::iterator i = std::remove(providers.begin(), providers.end(), provider);
+ for(std::vector<AvatarProvider*>::iterator j = i; j < providers.end(); ++j) {
+ provider->onAvatarChanged.disconnect(reinterpret_cast<int>(this));
+ }
+ providers.erase(i, providers.end());
+}
+
+void CombinedAvatarProvider::handleAvatarChanged(const JID& jid) {
+ String hash = getAvatarHash(jid);
+ std::map<JID, String>::iterator i = avatars.find(jid);
+ if (i != avatars.end()) {
+ if (i->second != hash) {
+ if (hash.isEmpty()) {
+ avatars.erase(i);
+ }
+ else {
+ avatars.insert(std::make_pair(jid, hash));
+ }
+ onAvatarChanged(jid);
+ }
+ }
+ else if (!hash.isEmpty()) {
+ avatars.insert(std::make_pair(jid, hash));
+ onAvatarChanged(jid);
+ }
+}
+
+}