summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKevin Smith <git@kismith.co.uk>2010-03-22 20:37:30 (GMT)
committerKevin Smith <git@kismith.co.uk>2010-03-22 20:37:30 (GMT)
commit0c377fa93ffd8538da9e71ddc71d4e8c07600a22 (patch)
treefa655b09f94cdb9018bfad4aa1de3dba2d345969
parent1ebd045cadb3585c846ea38c63d508e5aa6ec1e7 (diff)
downloadswift-contrib-0c377fa93ffd8538da9e71ddc71d4e8c07600a22.zip
swift-contrib-0c377fa93ffd8538da9e71ddc71d4e8c07600a22.tar.bz2
Can now accept roster subscriptions.
-rw-r--r--Swift/Controllers/RosterController.cpp8
-rw-r--r--Swift/Controllers/XMPPRosterController.cpp2
-rw-r--r--Swift/QtUI/QtSubscriptionRequestWindow.cpp2
-rw-r--r--Swiften/Presence/PresenceOracle.cpp26
-rw-r--r--Swiften/Presence/PresenceOracle.h4
-rw-r--r--Swiften/Roster/XMPPRoster.cpp22
-rw-r--r--Swiften/Roster/XMPPRoster.h14
7 files changed, 64 insertions, 14 deletions
diff --git a/Swift/Controllers/RosterController.cpp b/Swift/Controllers/RosterController.cpp
index 4c55ea8..8d13057 100644
--- a/Swift/Controllers/RosterController.cpp
+++ b/Swift/Controllers/RosterController.cpp
@@ -142,6 +142,7 @@ void RosterController::handleIncomingPresence(boost::shared_ptr<Presence> newPre
}
void RosterController::handleSubscriptionRequest(const JID& jid, const String& message) {
+ //FIXME: If already subscribed, auto-subscribe
SubscriptionRequestEvent* eventPointer = new SubscriptionRequestEvent(jid, message);
eventPointer->onAccept.connect(boost::bind(&RosterController::handleSubscriptionRequestAccepted, this, eventPointer));
eventPointer->onDecline.connect(boost::bind(&RosterController::handleSubscriptionRequestDeclined, this, eventPointer));
@@ -150,11 +151,14 @@ void RosterController::handleSubscriptionRequest(const JID& jid, const String& m
}
void RosterController::handleSubscriptionRequestAccepted(SubscriptionRequestEvent* event) {
- //FIXME: do something
+ presenceOracle_->confirmSubscription(event->getJID());
+ if (!xmppRoster_->containsJID(event->getJID()) || xmppRoster_->getSubscriptionStateForJID(event->getJID()) == RosterItemPayload::None || xmppRoster_->getSubscriptionStateForJID(event->getJID()) == RosterItemPayload::From) {
+ presenceOracle_->requestSubscription(event->getJID());
+ }
}
void RosterController::handleSubscriptionRequestDeclined(SubscriptionRequestEvent* event) {
- //FIXME: do something
+ presenceOracle_->cancelSubscription(event->getJID());
}
void RosterController::handleAvatarChanged(const JID& jid, const String&) {
diff --git a/Swift/Controllers/XMPPRosterController.cpp b/Swift/Controllers/XMPPRosterController.cpp
index d089cff..01e5169 100644
--- a/Swift/Controllers/XMPPRosterController.cpp
+++ b/Swift/Controllers/XMPPRosterController.cpp
@@ -37,7 +37,7 @@ void XMPPRosterController::handleRosterReceived(boost::shared_ptr<RosterPayload>
if (item.getSubscription() == RosterItemPayload::Remove) {
xmppRoster_->removeContact(item.getJID());
} else {
- xmppRoster_->addContact(item.getJID(), item.getName(), item.getGroups());
+ xmppRoster_->addContact(item.getJID(), item.getName(), item.getGroups(), item.getSubscription());
}
}
}
diff --git a/Swift/QtUI/QtSubscriptionRequestWindow.cpp b/Swift/QtUI/QtSubscriptionRequestWindow.cpp
index df0c8e6..bda86f2 100644
--- a/Swift/QtUI/QtSubscriptionRequestWindow.cpp
+++ b/Swift/QtUI/QtSubscriptionRequestWindow.cpp
@@ -9,7 +9,7 @@
namespace Swift {
QtSubscriptionRequestWindow::QtSubscriptionRequestWindow(boost::shared_ptr<SubscriptionRequestEvent> event, QWidget* parent) : QDialog(parent), event_(event) {
- QString text = P2QSTRING(event->getJID().toString()) + " would like to add you to their roster. Would you like to add them to your roster and share your status when you're online? If you choose to defer this choice, you'll be asked again when you next login.";
+ QString text = P2QSTRING(event->getJID().toString()) + " would like to add you to their roster.\n Would you like to add them to your roster and share your status when you're online? \n\nIf you choose to defer this choice, you'll be asked again when you next login.";
QVBoxLayout* layout = new QVBoxLayout();
QLabel* label = new QLabel(text, this);
layout->addWidget(label);
diff --git a/Swiften/Presence/PresenceOracle.cpp b/Swiften/Presence/PresenceOracle.cpp
index d7239df..988fc10 100644
--- a/Swiften/Presence/PresenceOracle.cpp
+++ b/Swiften/Presence/PresenceOracle.cpp
@@ -8,9 +8,33 @@ typedef std::pair<JID, std::map<JID, boost::shared_ptr<Presence> > > JIDMapPair;
typedef std::pair<JID, boost::shared_ptr<Presence> > JIDPresencePair;
PresenceOracle::PresenceOracle(StanzaChannel* stanzaChannel) {
- stanzaChannel->onPresenceReceived.connect(boost::bind(&PresenceOracle::handleIncomingPresence, this, _1));
+ stanzaChannel_ = stanzaChannel;
+ stanzaChannel_->onPresenceReceived.connect(boost::bind(&PresenceOracle::handleIncomingPresence, this, _1));
}
+void PresenceOracle::cancelSubscription(const JID& jid) {
+ boost::shared_ptr<Presence> stanza(new Presence());
+ stanza->setType(Presence::Unsubscribed);
+ stanza->setTo(jid);
+ stanzaChannel_->sendPresence(stanza);
+}
+
+void PresenceOracle::confirmSubscription(const JID& jid) {
+ boost::shared_ptr<Presence> stanza(new Presence());
+ stanza->setType(Presence::Subscribed);
+ stanza->setTo(jid);
+ stanzaChannel_->sendPresence(stanza);
+}
+
+
+void PresenceOracle::requestSubscription(const JID& jid) {
+ boost::shared_ptr<Presence> stanza(new Presence());
+ stanza->setType(Presence::Subscribe);
+ stanza->setTo(jid);
+ stanzaChannel_->sendPresence(stanza);
+}
+
+
void PresenceOracle::handleIncomingPresence(boost::shared_ptr<Presence> presence) {
JID bareJID = JID(presence->getFrom().toBare());
diff --git a/Swiften/Presence/PresenceOracle.h b/Swiften/Presence/PresenceOracle.h
index 320a999..dc6fe5d 100644
--- a/Swiften/Presence/PresenceOracle.h
+++ b/Swiften/Presence/PresenceOracle.h
@@ -14,6 +14,10 @@ class PresenceOracle {
PresenceOracle(StanzaChannel* stanzaChannel);
~PresenceOracle() {};
+ void cancelSubscription(const JID& jid);
+ void confirmSubscription(const JID& jid);
+ void requestSubscription(const JID& jid);
+
boost::signal<void (boost::shared_ptr<Presence>, boost::shared_ptr<Presence>)> onPresenceChange;
boost::signal<void (const JID&, const String&)> onPresenceSubscriptionRequest;
diff --git a/Swiften/Roster/XMPPRoster.cpp b/Swiften/Roster/XMPPRoster.cpp
index a5cccaf..62edc45 100644
--- a/Swiften/Roster/XMPPRoster.cpp
+++ b/Swiften/Roster/XMPPRoster.cpp
@@ -2,17 +2,21 @@
namespace Swift {
-void XMPPRoster::addContact(const JID& jid, const String& name, const std::vector<String>& groups) {
+void XMPPRoster::addContact(const JID& jid, const String& name, const std::vector<String>& groups, RosterItemPayload::Subscription subscription) {
JID bareJID(jid.toBare());
bool exists = containsJID(bareJID);
+ String oldName = getNameForJID(bareJID);
+ std::vector<String> oldGroups = entries_[bareJID].groups;
if (exists) {
entries_.erase(bareJID);
}
- String oldName = getNameForJID(bareJID);
- std::vector<String> oldGroups = entries_[bareJID].second;
- entries_[bareJID] = std::pair<String, std::vector<String> >(name, groups);
+ XMPPRosterItem item;
+ item.groups = groups;
+ item.name = name;
+ item.jid = jid;
+ item.subscription = subscription;
+ entries_[bareJID] = item;
if (exists) {
-
onJIDUpdated(bareJID, oldName, oldGroups);
} else {
onJIDAdded(bareJID);
@@ -29,11 +33,15 @@ bool XMPPRoster::containsJID(const JID& jid) {
}
const String& XMPPRoster::getNameForJID(const JID& jid) {
- return entries_[JID(jid.toBare())].first;
+ return entries_[JID(jid.toBare())].name;
}
const std::vector<String>& XMPPRoster::getGroupsForJID(const JID& jid) {
- return entries_[JID(jid.toBare())].second;
+ return entries_[JID(jid.toBare())].groups;
+}
+
+RosterItemPayload::Subscription XMPPRoster::getSubscriptionStateForJID(const JID& jid) {
+ return entries_[JID(jid.toBare())].subscription;
}
}
diff --git a/Swiften/Roster/XMPPRoster.h b/Swiften/Roster/XMPPRoster.h
index 7a72e00..47326c3 100644
--- a/Swiften/Roster/XMPPRoster.h
+++ b/Swiften/Roster/XMPPRoster.h
@@ -3,6 +3,7 @@
#include "Swiften/Base/String.h"
#include "Swiften/JID/JID.h"
+#include "Swiften/Elements/RosterItemPayload.h"
#include <map>
#include <vector>
@@ -10,14 +11,22 @@
namespace Swift {
+struct XMPPRosterItem {
+ JID jid;
+ String name;
+ std::vector<String> groups;
+ RosterItemPayload::Subscription subscription;
+};
+
class XMPPRoster {
public:
XMPPRoster() {};
~XMPPRoster() {};
- void addContact(const JID& jid, const String& name, const std::vector<String>& groups);
+ void addContact(const JID& jid, const String& name, const std::vector<String>& groups, const RosterItemPayload::Subscription subscription);
bool containsJID(const JID& jid);
void removeContact(const JID& jid);
+ RosterItemPayload::Subscription getSubscriptionStateForJID(const JID& jid);
const String& getNameForJID(const JID& jid);
const std::vector<String>& getGroupsForJID(const JID& jid);
@@ -26,7 +35,8 @@ class XMPPRoster {
boost::signal<void (const JID&, const String&, const std::vector<String>&)> onJIDUpdated;
private:
- std::map<JID, std::pair<String, std::vector<String> > > entries_;
+ //std::map<JID, std::pair<String, std::vector<String> > > entries_;
+ std::map<JID, XMPPRosterItem> entries_;
};
}