summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTarun Gupta <tarun1995gupta@gmail.com>2017-07-07 21:09:17 (GMT)
committerTobias Markmann <tm@ayena.de>2017-07-24 14:24:05 (GMT)
commit38c132a6fe0ecaa3394550df15d36ae10dcce7d9 (patch)
tree3b48d7e237e6a5f88fe031b2512d5f346f42c8f5 /Swiften/MIX/MIXImpl.cpp
parentf0db4d39912e773208e9db2a3da3b68ac92ba17b (diff)
downloadswift-38c132a6fe0ecaa3394550df15d36ae10dcce7d9.zip
swift-38c132a6fe0ecaa3394550df15d36ae10dcce7d9.tar.bz2
Add Channel Join and Leave Capability to MIX
Add UpdateSubscription feature for subscribing to additional MIX nodes Add Joining a channel with a preference form Add requesting user preference form and updating the preferences License: This patch is BSD-licensed, see Documentation/Licenses/BSD-simplified.txt for details. Test-Information: Tests added for joining and leaving a channel as in XEP-0369, which passes. Tests also added for updating subscription, joining channel with preference form and requesting user preference form as in XEP-0369, which passes. Tested on Ubuntu 16.04 LTS. Change-Id: Ibc2737f6154eeee1a85e98cb5f80c8bdbad35dcd
Diffstat (limited to 'Swiften/MIX/MIXImpl.cpp')
-rw-r--r--Swiften/MIX/MIXImpl.cpp97
1 files changed, 97 insertions, 0 deletions
diff --git a/Swiften/MIX/MIXImpl.cpp b/Swiften/MIX/MIXImpl.cpp
new file mode 100644
index 0000000..cd3eb21
--- /dev/null
+++ b/Swiften/MIX/MIXImpl.cpp
@@ -0,0 +1,97 @@
+/*
+ * Copyright (c) 2017 Tarun Gupta
+ * Licensed under the simplified BSD license.
+ * See Documentation/Licenses/BSD-simplified.txt for more information.
+ */
+
+#include <Swiften/MIX/MIXImpl.h>
+
+#include <Swiften/Client/StanzaChannel.h>
+#include <Swiften/Elements/IQ.h>
+#include <Swiften/Queries/GenericRequest.h>
+#include <Swiften/Queries/IQRouter.h>
+
+namespace Swift {
+
+MIXImpl::MIXImpl(const JID& ownJID, const JID& channelJID, IQRouter* iqRouter) : ownJID_(ownJID), channelJID_(channelJID), iqRouter_(iqRouter) {
+
+}
+
+MIXImpl::~MIXImpl() {
+
+}
+
+void MIXImpl::joinChannel(const std::unordered_set<std::string>& nodes) {
+ joinChannelWithPreferences(nodes, nullptr);
+}
+
+void MIXImpl::joinChannelWithPreferences(const std::unordered_set<std::string>& nodes, Form::ref form) {
+ auto joinPayload = std::make_shared<MIXJoin>();
+ joinPayload->setChannel(channelJID_);
+ for (auto node : nodes) {
+ joinPayload->addSubscription(node);
+ }
+ if (form) {
+ joinPayload->setForm(form);
+ }
+ auto request = std::make_shared<GenericRequest<MIXJoin>>(IQ::Set, getJID(), joinPayload, iqRouter_);
+ request->onResponse.connect(boost::bind(&MIXImpl::handleJoinResponse, this, _1, _2));
+ request->send();
+}
+
+void MIXImpl::handleJoinResponse(MIXJoin::ref payload, ErrorPayload::ref error) {
+ onJoinResponse(payload, error);
+}
+
+void MIXImpl::updateSubscription(const std::unordered_set<std::string>& nodes) {
+ auto updateSubscriptionPayload = std::make_shared<MIXUpdateSubscription>();
+ updateSubscriptionPayload->setSubscriptions(nodes);
+ auto request = std::make_shared<GenericRequest<MIXUpdateSubscription>>(IQ::Set, channelJID_, updateSubscriptionPayload, iqRouter_);
+ request->onResponse.connect(boost::bind(&MIXImpl::handleUpdateSubscriptionResponse, this, _1, _2));
+ request->send();
+}
+
+void MIXImpl::handleUpdateSubscriptionResponse(MIXUpdateSubscription::ref payload, ErrorPayload::ref error) {
+ onSubscriptionUpdateResponse(payload, error);
+}
+
+void MIXImpl::leaveChannel() {
+ auto leavePayload = std::make_shared<MIXLeave>();
+ leavePayload->setChannel(channelJID_);
+ auto request = std::make_shared<GenericRequest<MIXLeave>>(IQ::Set, getJID(), leavePayload, iqRouter_);
+ request->onResponse.connect(boost::bind(&MIXImpl::handleLeaveResponse, this, _1, _2));
+ request->send();
+}
+
+void MIXImpl::handleLeaveResponse(MIXLeave::ref payload, ErrorPayload::ref error) {
+ onLeaveResponse(payload, error);
+}
+
+void MIXImpl::requestPreferencesForm() {
+ auto prefPayload = std::make_shared<MIXUserPreference>();
+ auto request = std::make_shared<GenericRequest<MIXUserPreference>>(IQ::Get, channelJID_, prefPayload, iqRouter_);
+ request->onResponse.connect(boost::bind(&MIXImpl::handlePreferencesFormReceived, this, _1, _2));
+ request->send();
+}
+
+void MIXImpl::handlePreferencesFormReceived(MIXUserPreference::ref payload, ErrorPayload::ref error) {
+ Form::ref form = nullptr;
+ if (payload) {
+ form = payload->getData();
+ }
+ onPreferencesFormResponse(form, error);
+}
+
+void MIXImpl::handlePreferencesResultReceived(MIXUserPreference::ref payload, ErrorPayload::ref error) {
+ onPreferencesUpdateResponse(payload, error);
+}
+
+void MIXImpl::updatePreferences(Form::ref form) {
+ auto prefPayload = std::make_shared<MIXUserPreference>();
+ prefPayload->setData(form);
+ auto request = std::make_shared<GenericRequest<MIXUserPreference>>(IQ::Set, channelJID_, prefPayload, iqRouter_);
+ request->onResponse.connect(boost::bind(&MIXImpl::handlePreferencesResultReceived, this, _1, _2));
+ request->send();
+}
+
+}