From 711c1674fe9d84a200bc4310b7f2970b9d8e4855 2013-01-26 15:22:25 From: HanzZ Date: 2013-01-26 15:22:25 Subject: [PATCH] Send 'http://jabber.org/protocol/muc' if MUC is supported by backend --- diff --git a/backends/libcommuni/ircnetworkplugin.cpp b/backends/libcommuni/ircnetworkplugin.cpp index 2eea86cb78cde492e812fc0c95838f7df8b3e280..4996a874558f3bfe6f918f9e0c66e902b21930c2 100644 --- a/backends/libcommuni/ircnetworkplugin.cpp +++ b/backends/libcommuni/ircnetworkplugin.cpp @@ -56,6 +56,7 @@ void IRCNetworkPlugin::readData() { if (m_servers.empty()) { NetworkPlugin::PluginConfig cfg; cfg.setNeedRegistration(false); + cfg.setSupportMUC(true); sendConfig(cfg); } } diff --git a/backends/libpurple/main.cpp b/backends/libpurple/main.cpp index 4695389d23df98ebde67aab69897917342bf9eda..36e2df3f15e523110892ee52116f6c9badbfea78 100644 --- a/backends/libpurple/main.cpp +++ b/backends/libpurple/main.cpp @@ -43,6 +43,7 @@ DEFINE_LOGGER(logger, "backend"); int main_socket; static int writeInput; +bool firstPing = true; using namespace Transport; @@ -1656,6 +1657,14 @@ static void transportDataReceived(gpointer data, gint source, PurpleInputConditi exit(errno); } std::string d = std::string(buffer, n); + + if (firstPing) { + firstPing = false; + NetworkPlugin::PluginConfig cfg; + cfg.setSupportMUC(true); + np->sendConfig(cfg); + } + np->handleDataRead(d); } else { diff --git a/include/transport/networkplugin.h b/include/transport/networkplugin.h index c8e238c697000466b96fa35691a1a3202de08485..eece2e810916fb80e1beb3da38f1c5b4abea644a 100644 --- a/include/transport/networkplugin.h +++ b/include/transport/networkplugin.h @@ -39,16 +39,18 @@ class NetworkPlugin { class PluginConfig { public: - PluginConfig() : m_needPassword(true), m_needRegistration(false) {} + PluginConfig() : m_needPassword(true), m_needRegistration(false), m_supportMUC(false) {} virtual ~PluginConfig() {} void setNeedRegistration(bool needRegistration = false) { m_needRegistration = needRegistration; } void setNeedPassword(bool needPassword = true) { m_needPassword = needPassword; } + void setSupportMUC(bool supportMUC = true) { m_supportMUC = supportMUC; } void setExtraFields(const std::vector &fields) { m_extraFields = fields; } private: bool m_needPassword; bool m_needRegistration; + bool m_supportMUC; std::vector m_extraFields; friend class NetworkPlugin; diff --git a/plugin/cpp/networkplugin.cpp b/plugin/cpp/networkplugin.cpp index 06393bf4e1ad5e32469e3285f84b1c4a9c7cd4d6..773c47ff1bbfa80f8485bc712b4aab3f52a73d50 100644 --- a/plugin/cpp/networkplugin.cpp +++ b/plugin/cpp/networkplugin.cpp @@ -71,6 +71,9 @@ void NetworkPlugin::sendConfig(const PluginConfig &cfg) { data += std::string("extraField=") + (*it) + "\n"; } + data += "[features]\n"; + data += std::string("muc=") + (cfg.m_supportMUC ? "1" : "0") + "\n"; + pbnetwork::BackendConfig m; m.set_config(data); diff --git a/src/config.cpp b/src/config.cpp index a30a01e151fc6f177b36f908081814e23f3d13ad..1a5902e431e3a977d6f1072d150666c582b9c3f2 100644 --- a/src/config.cpp +++ b/src/config.cpp @@ -314,6 +314,7 @@ void Config::updateBackendConfig(const std::string &backendConfig) { ("registration.needRegistration", value()->default_value(false), "") ("registration.extraField", value >()->multitoken(), "") ("features.receipts", value()->default_value(false), "") + ("features.muc", value()->default_value(false), "") ; std::stringstream ifs(backendConfig); diff --git a/src/discoinforesponder.cpp b/src/discoinforesponder.cpp index 448ec17dec382b2951ac2b7178d91952185aa635..d3ea87da1ac785aa543bceb80e0505a59a7bf880 100644 --- a/src/discoinforesponder.cpp +++ b/src/discoinforesponder.cpp @@ -39,28 +39,31 @@ namespace Transport { DiscoInfoResponder::DiscoInfoResponder(Swift::IQRouter *router, Config *config) : Swift::GetResponder(router) { m_config = config; - m_config->onBackendConfigUpdated.connect(boost::bind(&DiscoInfoResponder::updateBuddyFeatures, this)); + m_config->onBackendConfigUpdated.connect(boost::bind(&DiscoInfoResponder::updateFeatures, this)); m_buddyInfo = NULL; m_transportInfo.addIdentity(DiscoInfo::Identity(CONFIG_STRING(m_config, "identity.name"), CONFIG_STRING(m_config, "identity.category"), CONFIG_STRING(m_config, "identity.type"))); - std::list features; - features.push_back("jabber:iq:register"); - features.push_back("jabber:iq:gateway"); - features.push_back("jabber:iq:private"); - features.push_back("http://jabber.org/protocol/disco#info"); - features.push_back("http://jabber.org/protocol/commands"); - setTransportFeatures(features); - - updateBuddyFeatures(); + updateFeatures(); } DiscoInfoResponder::~DiscoInfoResponder() { delete m_buddyInfo; } -void DiscoInfoResponder::updateBuddyFeatures() { +void DiscoInfoResponder::updateFeatures() { + std::list features2; + features2.push_back("jabber:iq:register"); + features2.push_back("jabber:iq:gateway"); + features2.push_back("jabber:iq:private"); + features2.push_back("http://jabber.org/protocol/disco#info"); + features2.push_back("http://jabber.org/protocol/commands"); + if (CONFIG_BOOL_DEFAULTED(m_config, "features.muc", false)) { + features2.push_back("http://jabber.org/protocol/muc"); + } + setTransportFeatures(features2); + std::list features; features.push_back("http://jabber.org/protocol/disco#items"); features.push_back("http://jabber.org/protocol/disco#info"); diff --git a/src/discoinforesponder.h b/src/discoinforesponder.h index 33dfe6b85aaf37a7f3d08966d96b96c56bb02e05..08b0656e5cc896fda3e8d704de73b34d2ae6979c 100644 --- a/src/discoinforesponder.h +++ b/src/discoinforesponder.h @@ -52,7 +52,7 @@ class DiscoInfoResponder : public Swift::GetResponder { private: virtual bool handleGetRequest(const Swift::JID& from, const Swift::JID& to, const std::string& id, boost::shared_ptr payload); - void updateBuddyFeatures(); + void updateFeatures(); Swift::DiscoInfo m_transportInfo; Swift::DiscoInfo *m_buddyInfo;