summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRemko Tronçon <git@el-tramo.be>2010-09-09 13:20:18 (GMT)
committerRemko Tronçon <git@el-tramo.be>2010-09-11 21:53:44 (GMT)
commit904db4e398210192093b688ebf1ad66fb017b6d2 (patch)
tree083f01449f64dc27aff63e2be0aa00a73cbd511b /Swiften/Avatars/CombinedAvatarProvider.cpp
parent10d8ba50a9e09517cfe4a6d4c3d51a768e989125 (diff)
downloadswift-904db4e398210192093b688ebf1ad66fb017b6d2.zip
swift-904db4e398210192093b688ebf1ad66fb017b6d2.tar.bz2
Added CombinedAvatarProvider
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);
+ }
+}
+
+}