summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRemko Tronçon <git@el-tramo.be>2010-08-22 08:55:08 (GMT)
committerRemko Tronçon <git@el-tramo.be>2010-08-24 17:10:23 (GMT)
commitb6a34463dfcedd454ab42230a47cdb7294a76f21 (patch)
tree832b0243325451932c0d15e9e33d53948fce0110 /Swiften/VCards/VCardManager.cpp
parent6e4b357141a6d09632f1e96d0eaf54f79daf52c9 (diff)
downloadswift-b6a34463dfcedd454ab42230a47cdb7294a76f21.zip
swift-b6a34463dfcedd454ab42230a47cdb7294a76f21.tar.bz2
Implemented VCardManager.
Diffstat (limited to 'Swiften/VCards/VCardManager.cpp')
-rw-r--r--Swiften/VCards/VCardManager.cpp42
1 files changed, 37 insertions, 5 deletions
diff --git a/Swiften/VCards/VCardManager.cpp b/Swiften/VCards/VCardManager.cpp
index 0174dea..628f4c8 100644
--- a/Swiften/VCards/VCardManager.cpp
+++ b/Swiften/VCards/VCardManager.cpp
@@ -6,17 +6,49 @@
#include "Swiften/VCards/VCardManager.h"
+#include <boost/bind.hpp>
+
+#include "Swiften/JID/JID.h"
+#include "Swiften/VCards/VCardStorage.h"
+#include "Swiften/Queries/Requests/GetVCardRequest.h"
+
namespace Swift {
-VCardManager::VCardManager(IQRouter* iqRouter, VCardStorage* vcardStorage) : iqRouter(iqRouter), storage(vcardStorage) {
+VCardManager::VCardManager(const JID& ownJID, IQRouter* iqRouter, VCardStorage* vcardStorage) : ownJID(ownJID), iqRouter(iqRouter), storage(vcardStorage) {
}
-boost::shared_ptr<VCard> VCardManager::getVCardAndRequestWhenNeeded(const JID& jid) const {
- boost::shared_ptr<VCard> vcard = storage->getVCard(jid);
+VCard::ref VCardManager::getVCardAndRequestWhenNeeded(const JID& jid) {
+ VCard::ref vcard = storage->getVCard(jid);
if (!vcard) {
- // TODO: Request vcard if necessary
+ requestVCard(jid);
}
return vcard;
}
-
+
+void VCardManager::requestVCard(const JID& requestedJID) {
+ JID jid = requestedJID.equals(ownJID, JID::WithoutResource) ? JID() : requestedJID;
+ if (requestedVCards.find(jid) != requestedVCards.end()) {
+ return;
+ }
+ GetVCardRequest::ref request(new GetVCardRequest(jid, iqRouter));
+ request->onResponse.connect(boost::bind(&VCardManager::handleVCardReceived, this, jid, _1, _2));
+ request->send();
+ requestedVCards.insert(jid);
+}
+
+void VCardManager::requestOwnVCard() {
+ requestVCard(JID());
+}
+
+
+void VCardManager::handleVCardReceived(const JID& actualJID, VCard::ref vcard, const boost::optional<ErrorPayload>& error) {
+ if (error) {
+ vcard = VCard::ref(new VCard());
+ }
+ requestedVCards.erase(actualJID);
+ JID jid = actualJID.isValid() ? actualJID : ownJID.toBare();
+ storage->setVCard(jid, vcard);
+ onVCardChanged(jid, vcard);
+}
+
}