From 6ca2c3a931e0d4092807eef425fa1264ef8dd7cc Mon Sep 17 00:00:00 2001 From: HanzZ Date: Wed, 22 Feb 2012 08:38:45 +0100 Subject: [PATCH 001/143] pubsub payloads/serializers --- include/Swiften/Elements/PubSubItem.cpp | 14 +++++ include/Swiften/Elements/PubSubItem.h | 35 +++++++++++ include/Swiften/Elements/PubSubPayload.cpp | 14 +++++ include/Swiften/Elements/PubSubPayload.h | 53 ++++++++++++++++ .../Swiften/Elements/PubSubPublishPayload.cpp | 16 +++++ .../Swiften/Elements/PubSubPublishPayload.h | 43 +++++++++++++ .../Elements/PubSubSubscribePayload.cpp | 16 +++++ .../Swiften/Elements/PubSubSubscribePayload.h | 40 +++++++++++++ .../Elements/PubSubSubscriptionPayload.cpp | 16 +++++ .../Elements/PubSubSubscriptionPayload.h | 60 +++++++++++++++++++ .../PubSubItemSerializer.cpp | 31 ++++++++++ .../PayloadSerializers/PubSubItemSerializer.h | 19 ++++++ .../PubSubPayloadSerializer.cpp | 36 +++++++++++ .../PubSubPayloadSerializer.h | 23 +++++++ .../PubSubPublishPayloadSerializer.cpp | 40 +++++++++++++ .../PubSubPublishPayloadSerializer.h | 23 +++++++ .../PubSubSubscribePayloadSerializer.cpp | 34 +++++++++++ .../PubSubSubscribePayloadSerializer.h | 19 ++++++ .../PubSubSubscriptionPayloadSerializer.cpp | 49 +++++++++++++++ .../PubSubSubscriptionPayloadSerializer.h | 19 ++++++ spectrum/src/sample.cfg | 16 ++--- 21 files changed, 608 insertions(+), 8 deletions(-) create mode 100644 include/Swiften/Elements/PubSubItem.cpp create mode 100644 include/Swiften/Elements/PubSubItem.h create mode 100644 include/Swiften/Elements/PubSubPayload.cpp create mode 100644 include/Swiften/Elements/PubSubPayload.h create mode 100644 include/Swiften/Elements/PubSubPublishPayload.cpp create mode 100644 include/Swiften/Elements/PubSubPublishPayload.h create mode 100644 include/Swiften/Elements/PubSubSubscribePayload.cpp create mode 100644 include/Swiften/Elements/PubSubSubscribePayload.h create mode 100644 include/Swiften/Elements/PubSubSubscriptionPayload.cpp create mode 100644 include/Swiften/Elements/PubSubSubscriptionPayload.h create mode 100644 include/Swiften/Serializer/PayloadSerializers/PubSubItemSerializer.cpp create mode 100644 include/Swiften/Serializer/PayloadSerializers/PubSubItemSerializer.h create mode 100644 include/Swiften/Serializer/PayloadSerializers/PubSubPayloadSerializer.cpp create mode 100644 include/Swiften/Serializer/PayloadSerializers/PubSubPayloadSerializer.h create mode 100644 include/Swiften/Serializer/PayloadSerializers/PubSubPublishPayloadSerializer.cpp create mode 100644 include/Swiften/Serializer/PayloadSerializers/PubSubPublishPayloadSerializer.h create mode 100644 include/Swiften/Serializer/PayloadSerializers/PubSubSubscribePayloadSerializer.cpp create mode 100644 include/Swiften/Serializer/PayloadSerializers/PubSubSubscribePayloadSerializer.h create mode 100644 include/Swiften/Serializer/PayloadSerializers/PubSubSubscriptionPayloadSerializer.cpp create mode 100644 include/Swiften/Serializer/PayloadSerializers/PubSubSubscriptionPayloadSerializer.h diff --git a/include/Swiften/Elements/PubSubItem.cpp b/include/Swiften/Elements/PubSubItem.cpp new file mode 100644 index 00000000..e146be9d --- /dev/null +++ b/include/Swiften/Elements/PubSubItem.cpp @@ -0,0 +1,14 @@ +/* + * Copyright (c) 2011 Jan Kaluza + * Licensed under the Simplified BSD license. + * See Documentation/Licenses/BSD-simplified.txt for more information. + */ + +#include + +namespace Swift { + +PubSubItem::PubSubItem(const std::string &body) : body_(body) { +} + +} diff --git a/include/Swiften/Elements/PubSubItem.h b/include/Swiften/Elements/PubSubItem.h new file mode 100644 index 00000000..554b7a76 --- /dev/null +++ b/include/Swiften/Elements/PubSubItem.h @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2011 Jan Kaluza + * Licensed under the Simplified BSD license. + * See Documentation/Licenses/BSD-simplified.txt for more information. + */ + +#pragma once + +#include + +#include +#include + +namespace Swift { + class PubSubItem : public Payload { + public: + PubSubItem(const std::string &body = ""); + + const std::string& getData() const { return body_; } + + void setData(const std::string& body) { + body_ = body; + } + + const std::string& getId() const { return id; } + + void setId(const std::string& id) { + this->id = id; + } + + private: + std::string body_; + std::string id; + }; +} diff --git a/include/Swiften/Elements/PubSubPayload.cpp b/include/Swiften/Elements/PubSubPayload.cpp new file mode 100644 index 00000000..663e8eb7 --- /dev/null +++ b/include/Swiften/Elements/PubSubPayload.cpp @@ -0,0 +1,14 @@ +/* + * Copyright (c) 2011 Jan Kaluza + * Licensed under the Simplified BSD license. + * See Documentation/Licenses/BSD-simplified.txt for more information. + */ + +#include + +namespace Swift { + +PubSubPayload::PubSubPayload() { +} + +} diff --git a/include/Swiften/Elements/PubSubPayload.h b/include/Swiften/Elements/PubSubPayload.h new file mode 100644 index 00000000..61ccdfa8 --- /dev/null +++ b/include/Swiften/Elements/PubSubPayload.h @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2012 Jan Kaluza + * Licensed under the Simplified BSD license. + * See Documentation/Licenses/BSD-simplified.txt for more information. + */ + +#pragma once + +#include + +#include +#include + +namespace Swift { + class PubSubPayload : public Payload { + public: + PubSubPayload(); + + const std::vector > getPayloads() const { + return payloads; + } + + template + const std::vector > getPayloads() const { + std::vector > matched_payloads; + for (std::vector >::const_iterator i = payloads.begin(); i != payloads.end(); ++i) { + boost::shared_ptr result = boost::dynamic_pointer_cast(*i); + if (result) { + matched_payloads.push_back(result); + } + } + + return matched_payloads; + + } + + template + const boost::shared_ptr getPayload() const { + boost::shared_ptr result; + for (std::vector >::const_iterator i = payloads.begin(); i != payloads.end(); ++i) { + result = boost::dynamic_pointer_cast(*i); + if (result) { + return result; + } + } + + return result; + } + + private: + std::vector > payloads; + }; +} diff --git a/include/Swiften/Elements/PubSubPublishPayload.cpp b/include/Swiften/Elements/PubSubPublishPayload.cpp new file mode 100644 index 00000000..dec34e92 --- /dev/null +++ b/include/Swiften/Elements/PubSubPublishPayload.cpp @@ -0,0 +1,16 @@ +/* + * Copyright (c) 2011 Jan Kaluza + * Licensed under the Simplified BSD license. + * See Documentation/Licenses/BSD-simplified.txt for more information. + */ + +#include + +namespace Swift { + +PubSubPublishPayload::PubSubPublishPayload(const std::string &node) : + node(node) { + + } + +} diff --git a/include/Swiften/Elements/PubSubPublishPayload.h b/include/Swiften/Elements/PubSubPublishPayload.h new file mode 100644 index 00000000..7505ca58 --- /dev/null +++ b/include/Swiften/Elements/PubSubPublishPayload.h @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2011 Jan Kaluza + * Licensed under the Simplified BSD license. + * See Documentation/Licenses/BSD-simplified.txt for more information. + */ + +#pragma once + +#include + +#include +#include +#include +#include + +namespace Swift { + class PubSubPublishPayload : public Payload { + public: + enum Type { None, Pending, Subscribed, Unconfigured }; + + PubSubPublishPayload(const std::string &node = ""); + + void setNode(const std::string &node) { + this->node = node; + } + + const std::string &getNode() const { + return node; + } + + void addItem(const boost::shared_ptr &item) { + items.push_back(item); + } + + const std::vector > &getItems() const { + return items; + } + + private: + std::string node; + std::vector > items; + }; +} diff --git a/include/Swiften/Elements/PubSubSubscribePayload.cpp b/include/Swiften/Elements/PubSubSubscribePayload.cpp new file mode 100644 index 00000000..24aa6fd6 --- /dev/null +++ b/include/Swiften/Elements/PubSubSubscribePayload.cpp @@ -0,0 +1,16 @@ +/* + * Copyright (c) 2011 Jan Kaluza + * Licensed under the Simplified BSD license. + * See Documentation/Licenses/BSD-simplified.txt for more information. + */ + +#include + +namespace Swift { + +PubSubSubscribePayload::PubSubSubscribePayload(const JID &jid, const std::string &node) : + jid(jid), node(node) { + + } + +} diff --git a/include/Swiften/Elements/PubSubSubscribePayload.h b/include/Swiften/Elements/PubSubSubscribePayload.h new file mode 100644 index 00000000..c65e2b61 --- /dev/null +++ b/include/Swiften/Elements/PubSubSubscribePayload.h @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2011 Jan Kaluza + * Licensed under the Simplified BSD license. + * See Documentation/Licenses/BSD-simplified.txt for more information. + */ + +#pragma once + +#include + +#include +#include +#include + +namespace Swift { + class PubSubSubscribePayload : public Payload { + public: + PubSubSubscribePayload(const JID &jid, const std::string &node = ""); + + void setJID(const JID &jid) { + this->jid = jid; + } + + const JID &getJID() const { + return jid; + } + + void setNode(const std::string &node) { + this->node = node; + } + + const std::string &getNode() const { + return node; + } + + private: + JID jid; + std::string node; + }; +} diff --git a/include/Swiften/Elements/PubSubSubscriptionPayload.cpp b/include/Swiften/Elements/PubSubSubscriptionPayload.cpp new file mode 100644 index 00000000..293505ec --- /dev/null +++ b/include/Swiften/Elements/PubSubSubscriptionPayload.cpp @@ -0,0 +1,16 @@ +/* + * Copyright (c) 2011 Jan Kaluza + * Licensed under the Simplified BSD license. + * See Documentation/Licenses/BSD-simplified.txt for more information. + */ + +#include + +namespace Swift { + +PubSubSubscriptionPayload::PubSubSubscriptionPayload(const JID &jid, const std::string &node) : + jid(jid), node(node), type(None) { + + } + +} diff --git a/include/Swiften/Elements/PubSubSubscriptionPayload.h b/include/Swiften/Elements/PubSubSubscriptionPayload.h new file mode 100644 index 00000000..7e4e4154 --- /dev/null +++ b/include/Swiften/Elements/PubSubSubscriptionPayload.h @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2011 Jan Kaluza + * Licensed under the Simplified BSD license. + * See Documentation/Licenses/BSD-simplified.txt for more information. + */ + +#pragma once + +#include + +#include +#include +#include + +namespace Swift { + class PubSubSubscriptionPayload : public Payload { + public: + enum Type { None, Pending, Subscribed, Unconfigured }; + + PubSubSubscriptionPayload(const JID &jid, const std::string &node = ""); + + void setJID(const JID &jid) { + this->jid = jid; + } + + const JID &getJID() const { + return jid; + } + + void setNode(const std::string &node) { + this->node = node; + } + + const std::string &getNode() const { + return node; + } + + void setId(const std::string &id) { + this->id = id; + } + + const std::string &getId() const { + return id; + } + + void setType(const Type &type) { + this->type = type; + } + + const Type &getType() const { + return type; + } + + private: + JID jid; + std::string node; + std::string id; + Type type; + }; +} diff --git a/include/Swiften/Serializer/PayloadSerializers/PubSubItemSerializer.cpp b/include/Swiften/Serializer/PayloadSerializers/PubSubItemSerializer.cpp new file mode 100644 index 00000000..85702537 --- /dev/null +++ b/include/Swiften/Serializer/PayloadSerializers/PubSubItemSerializer.cpp @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2011 Jan Kaluza + * Licensed under the Simplified BSD license. + * See Documentation/Licenses/BSD-simplified.txt for more information. + */ + +#include +#include +#include +#include +#include + +namespace Swift { + +PubSubItemSerializer::PubSubItemSerializer() : GenericPayloadSerializer() { +} + +std::string PubSubItemSerializer::serializePayload(boost::shared_ptr payload) const { + XMLElement item("item"); + if (!payload->getId().empty()) { + item.setAttribute("id", payload->getId()); + } + + boost::shared_ptr body(new XMLElement("body", "http://www.w3.org/1999/xhtml")); + body->addNode(boost::shared_ptr(new XMLRawTextNode(payload->getData()))); + item.addNode(body); + + return item.serialize(); +} + +} diff --git a/include/Swiften/Serializer/PayloadSerializers/PubSubItemSerializer.h b/include/Swiften/Serializer/PayloadSerializers/PubSubItemSerializer.h new file mode 100644 index 00000000..a75c4969 --- /dev/null +++ b/include/Swiften/Serializer/PayloadSerializers/PubSubItemSerializer.h @@ -0,0 +1,19 @@ +/* + * Copyright (c) 2011 Jan Kaluza + * Licensed under the Simplified BSD license. + * See Documentation/Licenses/BSD-simplified.txt for more information. + */ + +#pragma once + +#include +#include + +namespace Swift { + class PubSubItemSerializer : public GenericPayloadSerializer { + public: + PubSubItemSerializer(); + + virtual std::string serializePayload(boost::shared_ptr item) const; + }; +} diff --git a/include/Swiften/Serializer/PayloadSerializers/PubSubPayloadSerializer.cpp b/include/Swiften/Serializer/PayloadSerializers/PubSubPayloadSerializer.cpp new file mode 100644 index 00000000..9706d681 --- /dev/null +++ b/include/Swiften/Serializer/PayloadSerializers/PubSubPayloadSerializer.cpp @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2011 Jan Kaluza + * Licensed under the Simplified BSD license. + * See Documentation/Licenses/BSD-simplified.txt for more information. + */ + +#include +#include +#include +#include +#include +#include + +namespace Swift { + +PubSubPayloadSerializer::PubSubPayloadSerializer(PayloadSerializerCollection *serializers) + : GenericPayloadSerializer(), + serializers(serializers) { +} + +std::string PubSubPayloadSerializer::serializePayload(boost::shared_ptr payload) const { + XMLElement pubsub("pubsub", "http://jabber.org/protocol/pubsub"); + + if (!payload->getPayloads().empty()) { + foreach(boost::shared_ptr subPayload, payload->getPayloads()) { + PayloadSerializer* serializer = serializers->getPayloadSerializer(subPayload); + if (serializer) { + pubsub.addNode(boost::shared_ptr(new XMLRawTextNode(serializer->serialize(subPayload)))); + } + } + } + + return pubsub.serialize(); +} + +} diff --git a/include/Swiften/Serializer/PayloadSerializers/PubSubPayloadSerializer.h b/include/Swiften/Serializer/PayloadSerializers/PubSubPayloadSerializer.h new file mode 100644 index 00000000..0f8f251a --- /dev/null +++ b/include/Swiften/Serializer/PayloadSerializers/PubSubPayloadSerializer.h @@ -0,0 +1,23 @@ +/* + * Copyright (c) 2011 Jan Kaluza + * Licensed under the Simplified BSD license. + * See Documentation/Licenses/BSD-simplified.txt for more information. + */ + +#pragma once + +#include +#include + +namespace Swift { + class PayloadSerializerCollection; + + class PubSubPayloadSerializer : public GenericPayloadSerializer { + public: + PubSubPayloadSerializer(PayloadSerializerCollection *serializers); + + virtual std::string serializePayload(boost::shared_ptr item) const; + private: + PayloadSerializerCollection *serializers; + }; +} diff --git a/include/Swiften/Serializer/PayloadSerializers/PubSubPublishPayloadSerializer.cpp b/include/Swiften/Serializer/PayloadSerializers/PubSubPublishPayloadSerializer.cpp new file mode 100644 index 00000000..1f87c246 --- /dev/null +++ b/include/Swiften/Serializer/PayloadSerializers/PubSubPublishPayloadSerializer.cpp @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2011 Jan Kaluza + * Licensed under the Simplified BSD license. + * See Documentation/Licenses/BSD-simplified.txt for more information. + */ + +#include +#include +#include +#include +#include +#include + +namespace Swift { + +PubSubPublishPayloadSerializer::PubSubPublishPayloadSerializer(PayloadSerializerCollection *serializers) + : GenericPayloadSerializer(), + serializers(serializers) { +} + +std::string PubSubPublishPayloadSerializer::serializePayload(boost::shared_ptr payload) const { + XMLElement publish("publish"); + + if (!payload->getNode().empty()) { + publish.setAttribute("node", payload->getNode()); + } + + if (!payload->getItems().empty()) { + foreach(boost::shared_ptr subPayload, payload->getItems()) { + PayloadSerializer* serializer = serializers->getPayloadSerializer(subPayload); + if (serializer) { + publish.addNode(boost::shared_ptr(new XMLRawTextNode(serializer->serialize(subPayload)))); + } + } + } + + return publish.serialize(); +} + +} diff --git a/include/Swiften/Serializer/PayloadSerializers/PubSubPublishPayloadSerializer.h b/include/Swiften/Serializer/PayloadSerializers/PubSubPublishPayloadSerializer.h new file mode 100644 index 00000000..ae290559 --- /dev/null +++ b/include/Swiften/Serializer/PayloadSerializers/PubSubPublishPayloadSerializer.h @@ -0,0 +1,23 @@ +/* + * Copyright (c) 2011 Jan Kaluza + * Licensed under the Simplified BSD license. + * See Documentation/Licenses/BSD-simplified.txt for more information. + */ + +#pragma once + +#include +#include + +namespace Swift { + class PayloadSerializerCollection; + + class PubSubPublishPayloadSerializer : public GenericPayloadSerializer { + public: + PubSubPublishPayloadSerializer(PayloadSerializerCollection *serializers); + + virtual std::string serializePayload(boost::shared_ptr item) const; + private: + PayloadSerializerCollection *serializers; + }; +} diff --git a/include/Swiften/Serializer/PayloadSerializers/PubSubSubscribePayloadSerializer.cpp b/include/Swiften/Serializer/PayloadSerializers/PubSubSubscribePayloadSerializer.cpp new file mode 100644 index 00000000..f6a96626 --- /dev/null +++ b/include/Swiften/Serializer/PayloadSerializers/PubSubSubscribePayloadSerializer.cpp @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2011 Jan Kaluza + * Licensed under the Simplified BSD license. + * See Documentation/Licenses/BSD-simplified.txt for more information. + */ + +#include +#include +#include +#include +#include +#include + +namespace Swift { + +PubSubSubscribePayloadSerializer::PubSubSubscribePayloadSerializer() + : GenericPayloadSerializer() { +} + +std::string PubSubSubscribePayloadSerializer::serializePayload(boost::shared_ptr payload) const { + XMLElement subscribe("subscribe"); + + if (!payload->getJID().isValid()) { + subscribe.setAttribute("jid", payload->getJID().toBare().toString()); + } + + if (!payload->getNode().empty()) { + subscribe.setAttribute("node", payload->getNode()); + } + + return subscribe.serialize(); +} + +} diff --git a/include/Swiften/Serializer/PayloadSerializers/PubSubSubscribePayloadSerializer.h b/include/Swiften/Serializer/PayloadSerializers/PubSubSubscribePayloadSerializer.h new file mode 100644 index 00000000..327703be --- /dev/null +++ b/include/Swiften/Serializer/PayloadSerializers/PubSubSubscribePayloadSerializer.h @@ -0,0 +1,19 @@ +/* + * Copyright (c) 2011 Jan Kaluza + * Licensed under the Simplified BSD license. + * See Documentation/Licenses/BSD-simplified.txt for more information. + */ + +#pragma once + +#include +#include + +namespace Swift { + class PubSubSubscribePayloadSerializer : public GenericPayloadSerializer { + public: + PubSubSubscribePayloadSerializer(); + + virtual std::string serializePayload(boost::shared_ptr item) const; + }; +} diff --git a/include/Swiften/Serializer/PayloadSerializers/PubSubSubscriptionPayloadSerializer.cpp b/include/Swiften/Serializer/PayloadSerializers/PubSubSubscriptionPayloadSerializer.cpp new file mode 100644 index 00000000..02a634a1 --- /dev/null +++ b/include/Swiften/Serializer/PayloadSerializers/PubSubSubscriptionPayloadSerializer.cpp @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2011 Jan Kaluza + * Licensed under the Simplified BSD license. + * See Documentation/Licenses/BSD-simplified.txt for more information. + */ + +#include +#include +#include +#include +#include +#include + +namespace Swift { + +PubSubSubscriptionPayloadSerializer::PubSubSubscriptionPayloadSerializer() + : GenericPayloadSerializer() { +} + +std::string PubSubSubscriptionPayloadSerializer::serializePayload(boost::shared_ptr payload) const { + XMLElement subscription("subscription"); + + if (!payload->getJID().isValid()) { + subscription.setAttribute("jid", payload->getJID().toBare().toString()); + } + + if (!payload->getNode().empty()) { + subscription.setAttribute("node", payload->getNode()); + } + + switch (payload->getType()) { + case PubSubSubscriptionPayload::None: + subscription.setAttribute("subscription", "none"); + break; + case PubSubSubscriptionPayload::Subscribed: + subscription.setAttribute("subscription", "subscribed"); + break; + case PubSubSubscriptionPayload::Unconfigured: + subscription.setAttribute("subscription", "unconfigured"); + break; + case PubSubSubscriptionPayload::Pending: + subscription.setAttribute("subscription", "pending"); + break; + } + + return subscription.serialize(); +} + +} diff --git a/include/Swiften/Serializer/PayloadSerializers/PubSubSubscriptionPayloadSerializer.h b/include/Swiften/Serializer/PayloadSerializers/PubSubSubscriptionPayloadSerializer.h new file mode 100644 index 00000000..0e06a34b --- /dev/null +++ b/include/Swiften/Serializer/PayloadSerializers/PubSubSubscriptionPayloadSerializer.h @@ -0,0 +1,19 @@ +/* + * Copyright (c) 2011 Jan Kaluza + * Licensed under the Simplified BSD license. + * See Documentation/Licenses/BSD-simplified.txt for more information. + */ + +#pragma once + +#include +#include + +namespace Swift { + class PubSubSubscriptionPayloadSerializer : public GenericPayloadSerializer { + public: + PubSubSubscriptionPayloadSerializer(); + + virtual std::string serializePayload(boost::shared_ptr item) const; + }; +} diff --git a/spectrum/src/sample.cfg b/spectrum/src/sample.cfg index cc57d216..c473966b 100644 --- a/spectrum/src/sample.cfg +++ b/spectrum/src/sample.cfg @@ -33,12 +33,12 @@ incoming_dir=/var/spool/sms/incoming #backend_config=/home/hanzz/code/libtransport/spectrum/src/backend-logging.cfg # log4cxx/log4j logging configuration file for backends [database] -#type = sqlite3 # or "none" without database backend -#database = test.sql -#prefix=icq -type = mysql # or "none" without database backend....................................................................................................................... -database = test -prefix= -user=root -password=yourrootsqlpassword +type = sqlite3 # or "none" without database backend +database = test.sql +prefix=icq +#type = mysql # or "none" without database backend....................................................................................................................... +#database = test +#prefix= +#user=root +#password=yourrootsqlpassword #encryption_key=hanzzik From ff27ec02335268e1476d93c74a7d2836c6252386 Mon Sep 17 00:00:00 2001 From: Jan Kaluza Date: Wed, 22 Feb 2012 14:11:57 +0100 Subject: [PATCH 002/143] Fixed compilation with latest Swiften --- include/Swiften/Network/DummyNetworkFactories.cpp | 1 + include/Swiften/Network/DummyNetworkFactories.h | 5 +++++ 2 files changed, 6 insertions(+) diff --git a/include/Swiften/Network/DummyNetworkFactories.cpp b/include/Swiften/Network/DummyNetworkFactories.cpp index 4c477561..567d467a 100644 --- a/include/Swiften/Network/DummyNetworkFactories.cpp +++ b/include/Swiften/Network/DummyNetworkFactories.cpp @@ -18,6 +18,7 @@ DummyNetworkFactories::DummyNetworkFactories(EventLoop* eventLoop) { domainNameResolver = new PlatformDomainNameResolver(eventLoop); connectionServerFactory = new DummyConnectionServerFactory(eventLoop); m_platformXMLParserFactory = new PlatformXMLParserFactory(); + this->eventLoop = eventLoop; } DummyNetworkFactories::~DummyNetworkFactories() { diff --git a/include/Swiften/Network/DummyNetworkFactories.h b/include/Swiften/Network/DummyNetworkFactories.h index a945cdfa..546cb0cc 100644 --- a/include/Swiften/Network/DummyNetworkFactories.h +++ b/include/Swiften/Network/DummyNetworkFactories.h @@ -41,6 +41,10 @@ namespace Swift { return m_platformXMLParserFactory; } + EventLoop *getEventLoop() const { + return eventLoop; + } + Swift::TLSContextFactory* getTLSContextFactory() const { return 0; } @@ -55,5 +59,6 @@ namespace Swift { ConnectionFactory* connectionFactory; DomainNameResolver* domainNameResolver; ConnectionServerFactory* connectionServerFactory; + EventLoop *eventLoop; }; } From 7c90087b1774bb14fd2f17cb6bbe53d3bc3a7c8d Mon Sep 17 00:00:00 2001 From: HanzZ Date: Wed, 22 Feb 2012 19:23:43 +0100 Subject: [PATCH 003/143] PubSub Parsers --- include/Swiften/Elements/PubSubItem.cpp | 2 +- include/Swiften/Elements/PubSubItem.h | 39 ++++++++++++-- include/Swiften/Elements/PubSubPayload.h | 6 ++- .../Swiften/Elements/PubSubPublishPayload.h | 6 +-- .../Swiften/Elements/PubSubSubscribePayload.h | 2 +- .../Elements/PubSubSubscriptionPayload.h | 2 +- .../PayloadParsers/PubSubItemParser.cpp | 30 +++++++++++ .../Parser/PayloadParsers/PubSubItemParser.h | 24 +++++++++ .../PayloadParsers/PubSubPayloadParser.cpp | 25 +++++++++ .../PayloadParsers/PubSubPayloadParser.h | 24 +++++++++ .../PubSubPublishPayloadParser.cpp | 30 +++++++++++ .../PubSubPublishPayloadParser.h | 24 +++++++++ .../PubSubSubscribePayloadParser.cpp | 32 ++++++++++++ .../PubSubSubscribePayloadParser.h | 24 +++++++++ .../PubSubSubscriptionPayloadParser.cpp | 51 +++++++++++++++++++ .../PubSubSubscriptionPayloadParser.h | 24 +++++++++ .../PubSubItemSerializer.cpp | 15 ++++-- .../PayloadSerializers/PubSubItemSerializer.h | 5 +- .../PubSubPublishPayloadSerializer.cpp | 2 +- 19 files changed, 349 insertions(+), 18 deletions(-) create mode 100644 include/Swiften/Parser/PayloadParsers/PubSubItemParser.cpp create mode 100644 include/Swiften/Parser/PayloadParsers/PubSubItemParser.h create mode 100644 include/Swiften/Parser/PayloadParsers/PubSubPayloadParser.cpp create mode 100644 include/Swiften/Parser/PayloadParsers/PubSubPayloadParser.h create mode 100644 include/Swiften/Parser/PayloadParsers/PubSubPublishPayloadParser.cpp create mode 100644 include/Swiften/Parser/PayloadParsers/PubSubPublishPayloadParser.h create mode 100644 include/Swiften/Parser/PayloadParsers/PubSubSubscribePayloadParser.cpp create mode 100644 include/Swiften/Parser/PayloadParsers/PubSubSubscribePayloadParser.h create mode 100644 include/Swiften/Parser/PayloadParsers/PubSubSubscriptionPayloadParser.cpp create mode 100644 include/Swiften/Parser/PayloadParsers/PubSubSubscriptionPayloadParser.h diff --git a/include/Swiften/Elements/PubSubItem.cpp b/include/Swiften/Elements/PubSubItem.cpp index e146be9d..730ad89e 100644 --- a/include/Swiften/Elements/PubSubItem.cpp +++ b/include/Swiften/Elements/PubSubItem.cpp @@ -8,7 +8,7 @@ namespace Swift { -PubSubItem::PubSubItem(const std::string &body) : body_(body) { +PubSubItem::PubSubItem() { } } diff --git a/include/Swiften/Elements/PubSubItem.h b/include/Swiften/Elements/PubSubItem.h index 554b7a76..f0b3ef70 100644 --- a/include/Swiften/Elements/PubSubItem.h +++ b/include/Swiften/Elements/PubSubItem.h @@ -14,12 +14,41 @@ namespace Swift { class PubSubItem : public Payload { public: - PubSubItem(const std::string &body = ""); + PubSubItem(); - const std::string& getData() const { return body_; } + void addPayload(boost::shared_ptr payload) { + payloads.push_back(payload); + } - void setData(const std::string& body) { - body_ = body; + const std::vector > getPayloads() const { + return payloads; + } + + template + const std::vector > getPayloads() const { + std::vector > matched_payloads; + for (std::vector >::const_iterator i = payloads.begin(); i != payloads.end(); ++i) { + boost::shared_ptr result = boost::dynamic_pointer_cast(*i); + if (result) { + matched_payloads.push_back(result); + } + } + + return matched_payloads; + + } + + template + const boost::shared_ptr getPayload() const { + boost::shared_ptr result; + for (std::vector >::const_iterator i = payloads.begin(); i != payloads.end(); ++i) { + result = boost::dynamic_pointer_cast(*i); + if (result) { + return result; + } + } + + return result; } const std::string& getId() const { return id; } @@ -29,7 +58,7 @@ namespace Swift { } private: - std::string body_; + std::vector > payloads; std::string id; }; } diff --git a/include/Swiften/Elements/PubSubPayload.h b/include/Swiften/Elements/PubSubPayload.h index 61ccdfa8..46c8b82e 100644 --- a/include/Swiften/Elements/PubSubPayload.h +++ b/include/Swiften/Elements/PubSubPayload.h @@ -16,10 +16,14 @@ namespace Swift { public: PubSubPayload(); + void addPayload(boost::shared_ptr payload) { + payloads.push_back(payload); + } + const std::vector > getPayloads() const { return payloads; } - + template const std::vector > getPayloads() const { std::vector > matched_payloads; diff --git a/include/Swiften/Elements/PubSubPublishPayload.h b/include/Swiften/Elements/PubSubPublishPayload.h index 7505ca58..930cca6b 100644 --- a/include/Swiften/Elements/PubSubPublishPayload.h +++ b/include/Swiften/Elements/PubSubPublishPayload.h @@ -28,16 +28,16 @@ namespace Swift { return node; } - void addItem(const boost::shared_ptr &item) { + void addItem(const boost::shared_ptr &item) { items.push_back(item); } - const std::vector > &getItems() const { + const std::vector > &getItems() const { return items; } private: std::string node; - std::vector > items; + std::vector > items; }; } diff --git a/include/Swiften/Elements/PubSubSubscribePayload.h b/include/Swiften/Elements/PubSubSubscribePayload.h index c65e2b61..f2b011a2 100644 --- a/include/Swiften/Elements/PubSubSubscribePayload.h +++ b/include/Swiften/Elements/PubSubSubscribePayload.h @@ -15,7 +15,7 @@ namespace Swift { class PubSubSubscribePayload : public Payload { public: - PubSubSubscribePayload(const JID &jid, const std::string &node = ""); + PubSubSubscribePayload(const JID &jid = JID(), const std::string &node = ""); void setJID(const JID &jid) { this->jid = jid; diff --git a/include/Swiften/Elements/PubSubSubscriptionPayload.h b/include/Swiften/Elements/PubSubSubscriptionPayload.h index 7e4e4154..c404e6ff 100644 --- a/include/Swiften/Elements/PubSubSubscriptionPayload.h +++ b/include/Swiften/Elements/PubSubSubscriptionPayload.h @@ -17,7 +17,7 @@ namespace Swift { public: enum Type { None, Pending, Subscribed, Unconfigured }; - PubSubSubscriptionPayload(const JID &jid, const std::string &node = ""); + PubSubSubscriptionPayload(const JID &jid = JID(), const std::string &node = ""); void setJID(const JID &jid) { this->jid = jid; diff --git a/include/Swiften/Parser/PayloadParsers/PubSubItemParser.cpp b/include/Swiften/Parser/PayloadParsers/PubSubItemParser.cpp new file mode 100644 index 00000000..8f23c41a --- /dev/null +++ b/include/Swiften/Parser/PayloadParsers/PubSubItemParser.cpp @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2012 Jan Kaluza + * Licensed under the Simplified BSD license. + * See Documentation/Licenses/BSD-simplified.txt for more information. + */ + +#include + +#include + +#include +#include +#include +#include +#include + +namespace Swift { + +void PubSubItemParser::handleTree(ParserElement::ref root) { + std::string id = root->getAttributes().getAttribute("id"); + if (!id.empty()) { + getPayloadInternal()->setId(id); + } + + foreach (ParserElement::ref child, root->getAllChildren()) { + getPayloadInternal()->addPayload(TreeReparser::parseTree(child, factories)); + } +} + +} diff --git a/include/Swiften/Parser/PayloadParsers/PubSubItemParser.h b/include/Swiften/Parser/PayloadParsers/PubSubItemParser.h new file mode 100644 index 00000000..9326f92d --- /dev/null +++ b/include/Swiften/Parser/PayloadParsers/PubSubItemParser.h @@ -0,0 +1,24 @@ +/* + * Copyright (c) 2012 Jan Kaluza + * Licensed under the Simplified BSD license. + * See Documentation/Licenses/BSD-simplified.txt for more information. + */ + +#pragma once + +#include + +#include +#include +#include + +namespace Swift { + class PayloadParserFactoryCollection; + class PubSubItemParser : public GenericPayloadTreeParser { + public: + PubSubItemParser(PayloadParserFactoryCollection* collection) : factories(collection) {} + virtual void handleTree(ParserElement::ref root); + private: + PayloadParserFactoryCollection* factories; + }; +} diff --git a/include/Swiften/Parser/PayloadParsers/PubSubPayloadParser.cpp b/include/Swiften/Parser/PayloadParsers/PubSubPayloadParser.cpp new file mode 100644 index 00000000..c3e151bb --- /dev/null +++ b/include/Swiften/Parser/PayloadParsers/PubSubPayloadParser.cpp @@ -0,0 +1,25 @@ +/* + * Copyright (c) 2012 Jan Kaluza + * Licensed under the Simplified BSD license. + * See Documentation/Licenses/BSD-simplified.txt for more information. + */ + +#include + +#include + +#include +#include +#include +#include +#include + +namespace Swift { + +void PubSubPayloadParser::handleTree(ParserElement::ref root) { + foreach (ParserElement::ref child, root->getAllChildren()) { + getPayloadInternal()->addPayload(TreeReparser::parseTree(child, factories)); + } +} + +} diff --git a/include/Swiften/Parser/PayloadParsers/PubSubPayloadParser.h b/include/Swiften/Parser/PayloadParsers/PubSubPayloadParser.h new file mode 100644 index 00000000..7bbb688c --- /dev/null +++ b/include/Swiften/Parser/PayloadParsers/PubSubPayloadParser.h @@ -0,0 +1,24 @@ +/* + * Copyright (c) 2012 Jan Kaluza + * Licensed under the Simplified BSD license. + * See Documentation/Licenses/BSD-simplified.txt for more information. + */ + +#pragma once + +#include + +#include +#include +#include + +namespace Swift { + class PayloadParserFactoryCollection; + class PubSubPayloadParser : public GenericPayloadTreeParser { + public: + PubSubPayloadParser(PayloadParserFactoryCollection* collection) : factories(collection) {} + virtual void handleTree(ParserElement::ref root); + private: + PayloadParserFactoryCollection* factories; + }; +} diff --git a/include/Swiften/Parser/PayloadParsers/PubSubPublishPayloadParser.cpp b/include/Swiften/Parser/PayloadParsers/PubSubPublishPayloadParser.cpp new file mode 100644 index 00000000..949ceba4 --- /dev/null +++ b/include/Swiften/Parser/PayloadParsers/PubSubPublishPayloadParser.cpp @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2012 Jan Kaluza + * Licensed under the Simplified BSD license. + * See Documentation/Licenses/BSD-simplified.txt for more information. + */ + +#include + +#include + +#include +#include +#include +#include +#include + +namespace Swift { + +void PubSubPublishPayloadParser::handleTree(ParserElement::ref root) { + std::string node = root->getAttributes().getAttribute("node"); + if (!node.empty()) { + getPayloadInternal()->setNode(node); + } + + foreach (ParserElement::ref child, root->getAllChildren()) { + getPayloadInternal()->addItem(TreeReparser::parseTree(child, factories)); + } +} + +} diff --git a/include/Swiften/Parser/PayloadParsers/PubSubPublishPayloadParser.h b/include/Swiften/Parser/PayloadParsers/PubSubPublishPayloadParser.h new file mode 100644 index 00000000..b0575b72 --- /dev/null +++ b/include/Swiften/Parser/PayloadParsers/PubSubPublishPayloadParser.h @@ -0,0 +1,24 @@ +/* + * Copyright (c) 2012 Jan Kaluza + * Licensed under the Simplified BSD license. + * See Documentation/Licenses/BSD-simplified.txt for more information. + */ + +#pragma once + +#include + +#include +#include +#include + +namespace Swift { + class PayloadParserFactoryCollection; + class PubSubPublishPayloadParser : public GenericPayloadTreeParser { + public: + PubSubPublishPayloadParser(PayloadParserFactoryCollection* collection) : factories(collection) {} + virtual void handleTree(ParserElement::ref root); + private: + PayloadParserFactoryCollection* factories; + }; +} diff --git a/include/Swiften/Parser/PayloadParsers/PubSubSubscribePayloadParser.cpp b/include/Swiften/Parser/PayloadParsers/PubSubSubscribePayloadParser.cpp new file mode 100644 index 00000000..b7913d24 --- /dev/null +++ b/include/Swiften/Parser/PayloadParsers/PubSubSubscribePayloadParser.cpp @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2012 Jan Kaluza + * Licensed under the Simplified BSD license. + * See Documentation/Licenses/BSD-simplified.txt for more information. + */ + +#include + +#include + +#include +#include +#include +#include +#include + +namespace Swift { + +void PubSubSubscribePayloadParser::handleTree(ParserElement::ref root) { + std::string node = root->getAttributes().getAttribute("node"); + if (!node.empty()) { + getPayloadInternal()->setNode(node); + } + + std::string jid = root->getAttributes().getAttribute("jid"); + if (!jid.empty()) { + getPayloadInternal()->setJID(jid); + } + +} + +} diff --git a/include/Swiften/Parser/PayloadParsers/PubSubSubscribePayloadParser.h b/include/Swiften/Parser/PayloadParsers/PubSubSubscribePayloadParser.h new file mode 100644 index 00000000..54a2b05a --- /dev/null +++ b/include/Swiften/Parser/PayloadParsers/PubSubSubscribePayloadParser.h @@ -0,0 +1,24 @@ +/* + * Copyright (c) 2012 Jan Kaluza + * Licensed under the Simplified BSD license. + * See Documentation/Licenses/BSD-simplified.txt for more information. + */ + +#pragma once + +#include + +#include +#include +#include + +namespace Swift { + class PayloadParserFactoryCollection; + class PubSubSubscribePayloadParser : public GenericPayloadTreeParser { + public: + PubSubSubscribePayloadParser(PayloadParserFactoryCollection* collection) : factories(collection) {} + virtual void handleTree(ParserElement::ref root); + private: + PayloadParserFactoryCollection* factories; + }; +} diff --git a/include/Swiften/Parser/PayloadParsers/PubSubSubscriptionPayloadParser.cpp b/include/Swiften/Parser/PayloadParsers/PubSubSubscriptionPayloadParser.cpp new file mode 100644 index 00000000..0c964762 --- /dev/null +++ b/include/Swiften/Parser/PayloadParsers/PubSubSubscriptionPayloadParser.cpp @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2012 Jan Kaluza + * Licensed under the Simplified BSD license. + * See Documentation/Licenses/BSD-simplified.txt for more information. + */ + +#include + +#include + +#include +#include +#include +#include +#include + +namespace Swift { + +void PubSubSubscriptionPayloadParser::handleTree(ParserElement::ref root) { + std::string node = root->getAttributes().getAttribute("node"); + if (!node.empty()) { + getPayloadInternal()->setNode(node); + } + + std::string jid = root->getAttributes().getAttribute("jid"); + if (!jid.empty()) { + getPayloadInternal()->setJID(jid); + } + + std::string id = root->getAttributes().getAttribute("subid"); + if (!id.empty()) { + getPayloadInternal()->setId(id); + } + + std::string type = root->getAttributes().getAttribute("subscription"); + if (type == "none") { + getPayloadInternal()->setType(PubSubSubscriptionPayload::None); + } + else if (type == "subscribed") { + getPayloadInternal()->setType(PubSubSubscriptionPayload::Subscribed); + } + else if (type == "pending") { + getPayloadInternal()->setType(PubSubSubscriptionPayload::Pending); + } + else if (type == "unconfigured") { + getPayloadInternal()->setType(PubSubSubscriptionPayload::Unconfigured); + } + +} + +} diff --git a/include/Swiften/Parser/PayloadParsers/PubSubSubscriptionPayloadParser.h b/include/Swiften/Parser/PayloadParsers/PubSubSubscriptionPayloadParser.h new file mode 100644 index 00000000..7bd1c2d1 --- /dev/null +++ b/include/Swiften/Parser/PayloadParsers/PubSubSubscriptionPayloadParser.h @@ -0,0 +1,24 @@ +/* + * Copyright (c) 2012 Jan Kaluza + * Licensed under the Simplified BSD license. + * See Documentation/Licenses/BSD-simplified.txt for more information. + */ + +#pragma once + +#include + +#include +#include +#include + +namespace Swift { + class PayloadParserFactoryCollection; + class PubSubSubscriptionPayloadParser : public GenericPayloadTreeParser { + public: + PubSubSubscriptionPayloadParser(PayloadParserFactoryCollection* collection) : factories(collection) {} + virtual void handleTree(ParserElement::ref root); + private: + PayloadParserFactoryCollection* factories; + }; +} diff --git a/include/Swiften/Serializer/PayloadSerializers/PubSubItemSerializer.cpp b/include/Swiften/Serializer/PayloadSerializers/PubSubItemSerializer.cpp index 85702537..47ab6492 100644 --- a/include/Swiften/Serializer/PayloadSerializers/PubSubItemSerializer.cpp +++ b/include/Swiften/Serializer/PayloadSerializers/PubSubItemSerializer.cpp @@ -9,10 +9,12 @@ #include #include #include +#include namespace Swift { -PubSubItemSerializer::PubSubItemSerializer() : GenericPayloadSerializer() { +PubSubItemSerializer::PubSubItemSerializer(PayloadSerializerCollection *serializers) : + GenericPayloadSerializer(), serializers(serializers) { } std::string PubSubItemSerializer::serializePayload(boost::shared_ptr payload) const { @@ -21,9 +23,14 @@ std::string PubSubItemSerializer::serializePayload(boost::shared_ptr item.setAttribute("id", payload->getId()); } - boost::shared_ptr body(new XMLElement("body", "http://www.w3.org/1999/xhtml")); - body->addNode(boost::shared_ptr(new XMLRawTextNode(payload->getData()))); - item.addNode(body); + if (!payload->getPayloads().empty()) { + foreach(boost::shared_ptr subPayload, payload->getPayloads()) { + PayloadSerializer* serializer = serializers->getPayloadSerializer(subPayload); + if (serializer) { + item.addNode(boost::shared_ptr(new XMLRawTextNode(serializer->serialize(subPayload)))); + } + } + } return item.serialize(); } diff --git a/include/Swiften/Serializer/PayloadSerializers/PubSubItemSerializer.h b/include/Swiften/Serializer/PayloadSerializers/PubSubItemSerializer.h index a75c4969..795c63ba 100644 --- a/include/Swiften/Serializer/PayloadSerializers/PubSubItemSerializer.h +++ b/include/Swiften/Serializer/PayloadSerializers/PubSubItemSerializer.h @@ -10,10 +10,13 @@ #include namespace Swift { + class PayloadSerializerCollection; class PubSubItemSerializer : public GenericPayloadSerializer { public: - PubSubItemSerializer(); + PubSubItemSerializer(PayloadSerializerCollection *serializers); virtual std::string serializePayload(boost::shared_ptr item) const; + private: + PayloadSerializerCollection *serializers; }; } diff --git a/include/Swiften/Serializer/PayloadSerializers/PubSubPublishPayloadSerializer.cpp b/include/Swiften/Serializer/PayloadSerializers/PubSubPublishPayloadSerializer.cpp index 1f87c246..09cfbb5f 100644 --- a/include/Swiften/Serializer/PayloadSerializers/PubSubPublishPayloadSerializer.cpp +++ b/include/Swiften/Serializer/PayloadSerializers/PubSubPublishPayloadSerializer.cpp @@ -26,7 +26,7 @@ std::string PubSubPublishPayloadSerializer::serializePayload(boost::shared_ptr

getItems().empty()) { - foreach(boost::shared_ptr subPayload, payload->getItems()) { + foreach(boost::shared_ptr subPayload, payload->getItems()) { PayloadSerializer* serializer = serializers->getPayloadSerializer(subPayload); if (serializer) { publish.addNode(boost::shared_ptr(new XMLRawTextNode(serializer->serialize(subPayload)))); From 197cd61f9552963c1fcc78594a5b4e50a3878f6f Mon Sep 17 00:00:00 2001 From: HanzZ Date: Sat, 25 Feb 2012 07:37:59 +0100 Subject: [PATCH 004/143] Handle skype FULLNAME --- backends/skype/main.cpp | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/backends/skype/main.cpp b/backends/skype/main.cpp index c82792ce..f9f7b4b6 100644 --- a/backends/skype/main.cpp +++ b/backends/skype/main.cpp @@ -629,6 +629,19 @@ static void handle_skype_message(std::string &message, Skype *sk) { std::vector groups; np->handleBuddyChanged(sk->getUser(), cmd[1], "", groups, status, mood_text); } + else if (cmd[2] == "FULLNAME") { + std::string st = sk->send_command("GET USER " + cmd[1] + " ONLINESTATUS"); + st = st.substr(st.find("ONLINESTATUS") + 13); + pbnetwork::StatusType status = getStatus(st); + + std::string mood_text = sk->send_command("GET USER " + cmd[1] + " MOOD_TEXT"); + mood_text = mood_text.substr(mood_text.find("MOOD_TEXT") + 10); + + std::string alias = message.substr(message.find("FULLNAME") + 9); + + std::vector groups; + np->handleBuddyChanged(sk->getUser(), cmd[1], alias, groups, status, mood_text); + } } else if (cmd[0] == "CHATMESSAGE") { if (cmd[3] == "RECEIVED") { From 54dff8d28067599e63b5c2312889a0c13143a571 Mon Sep 17 00:00:00 2001 From: HanzZ Date: Sun, 26 Feb 2012 12:40:48 +0100 Subject: [PATCH 005/143] Gateway payload --- include/Swiften/Elements/GatewayPayload.cpp | 16 ++++++ include/Swiften/Elements/GatewayPayload.h | 49 +++++++++++++++++++ .../PayloadParsers/GatewayPayloadParser.cpp | 33 +++++++++++++ .../PayloadParsers/GatewayPayloadParser.h | 21 ++++++++ .../GatewayPayloadSerializer.cpp | 41 ++++++++++++++++ .../GatewayPayloadSerializer.h | 19 +++++++ 6 files changed, 179 insertions(+) create mode 100644 include/Swiften/Elements/GatewayPayload.cpp create mode 100644 include/Swiften/Elements/GatewayPayload.h create mode 100644 include/Swiften/Parser/PayloadParsers/GatewayPayloadParser.cpp create mode 100644 include/Swiften/Parser/PayloadParsers/GatewayPayloadParser.h create mode 100644 include/Swiften/Serializer/PayloadSerializers/GatewayPayloadSerializer.cpp create mode 100644 include/Swiften/Serializer/PayloadSerializers/GatewayPayloadSerializer.h diff --git a/include/Swiften/Elements/GatewayPayload.cpp b/include/Swiften/Elements/GatewayPayload.cpp new file mode 100644 index 00000000..59b6a9f6 --- /dev/null +++ b/include/Swiften/Elements/GatewayPayload.cpp @@ -0,0 +1,16 @@ +/* + * Copyright (c) 2011 Jan Kaluza + * Licensed under the Simplified BSD license. + * See Documentation/Licenses/BSD-simplified.txt for more information. + */ + +#include + +namespace Swift { + +GatewayPayload::GatewayPayload(const JID &jid, const std::string &desc, const std::string &prompt) : + jid(jid), desc(desc), prompt(prompt) { + + } + +} diff --git a/include/Swiften/Elements/GatewayPayload.h b/include/Swiften/Elements/GatewayPayload.h new file mode 100644 index 00000000..2f6bbc54 --- /dev/null +++ b/include/Swiften/Elements/GatewayPayload.h @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2011 Jan Kaluza + * Licensed under the Simplified BSD license. + * See Documentation/Licenses/BSD-simplified.txt for more information. + */ + +#pragma once + +#include + +#include +#include +#include + +namespace Swift { + class GatewayPayload : public Payload { + public: + GatewayPayload(const JID &jid = JID(), const std::string &desc = "", const std::string &prompt = ""); + + void setJID(const JID &jid) { + this->jid = jid; + } + + const JID &getJID() const { + return jid; + } + + void setDesc(const std::string &desc) { + this->desc = desc; + } + + const std::string &getDesc() const { + return desc; + } + + void setPrompt(const std::string &prompt) { + this->prompt = prompt; + } + + const std::string &getPrompt() const { + return prompt; + } + + private: + JID jid; + std::string desc; + std::string prompt; + }; +} diff --git a/include/Swiften/Parser/PayloadParsers/GatewayPayloadParser.cpp b/include/Swiften/Parser/PayloadParsers/GatewayPayloadParser.cpp new file mode 100644 index 00000000..30437926 --- /dev/null +++ b/include/Swiften/Parser/PayloadParsers/GatewayPayloadParser.cpp @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2012 Jan Kaluza + * Licensed under the Simplified BSD license. + * See Documentation/Licenses/BSD-simplified.txt for more information. + */ + +#include + +#include + +#include +#include +#include +#include +#include + +namespace Swift { + +void GatewayPayloadParser::handleTree(ParserElement::ref root) { + foreach (ParserElement::ref child, root->getAllChildren()) { + if (child->getName() == "desc") { + getPayloadInternal()->setDesc(child->getText()); + } + else if (child->getName() == "prompt") { + getPayloadInternal()->setPrompt(child->getText()); + } + else if (child->getName() == "jid") { + getPayloadInternal()->setJID(child->getText()); + } + } +} + +} diff --git a/include/Swiften/Parser/PayloadParsers/GatewayPayloadParser.h b/include/Swiften/Parser/PayloadParsers/GatewayPayloadParser.h new file mode 100644 index 00000000..db2c5782 --- /dev/null +++ b/include/Swiften/Parser/PayloadParsers/GatewayPayloadParser.h @@ -0,0 +1,21 @@ +/* + * Copyright (c) 2012 Jan Kaluza + * Licensed under the Simplified BSD license. + * See Documentation/Licenses/BSD-simplified.txt for more information. + */ + +#pragma once + +#include + +#include +#include +#include + +namespace Swift { + class GatewayPayloadParser : public GenericPayloadTreeParser { + public: + GatewayPayloadParser() {} + virtual void handleTree(ParserElement::ref root); + }; +} diff --git a/include/Swiften/Serializer/PayloadSerializers/GatewayPayloadSerializer.cpp b/include/Swiften/Serializer/PayloadSerializers/GatewayPayloadSerializer.cpp new file mode 100644 index 00000000..8a129376 --- /dev/null +++ b/include/Swiften/Serializer/PayloadSerializers/GatewayPayloadSerializer.cpp @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2011 Jan Kaluza + * Licensed under the Simplified BSD license. + * See Documentation/Licenses/BSD-simplified.txt for more information. + */ + +#include +#include +#include +#include +#include +#include + +namespace Swift { + +GatewayPayloadSerializer::GatewayPayloadSerializer() + : GenericPayloadSerializer() { +} + +std::string GatewayPayloadSerializer::serializePayload(boost::shared_ptr payload) const { + XMLElement query("query", "jabber:iq:gateway"); + + if (!payload->getJID().isValid()) { + boost::shared_ptr jid(new XMLElement("jid", "", payload->getJID().toBare().toString())); + query.addNode(jid); + } + + if (!payload->getDesc().empty()) { + boost::shared_ptr desc(new XMLElement("desc", "", payload->getDesc())); + query.addNode(desc); + } + + if (!payload->getPrompt().empty()) { + boost::shared_ptr prompt(new XMLElement("prompt", "", payload->getPrompt())); + query.addNode(prompt); + } + + return query.serialize(); +} + +} diff --git a/include/Swiften/Serializer/PayloadSerializers/GatewayPayloadSerializer.h b/include/Swiften/Serializer/PayloadSerializers/GatewayPayloadSerializer.h new file mode 100644 index 00000000..1b64ac17 --- /dev/null +++ b/include/Swiften/Serializer/PayloadSerializers/GatewayPayloadSerializer.h @@ -0,0 +1,19 @@ +/* + * Copyright (c) 2011 Jan Kaluza + * Licensed under the Simplified BSD license. + * See Documentation/Licenses/BSD-simplified.txt for more information. + */ + +#pragma once + +#include +#include + +namespace Swift { + class GatewayPayloadSerializer : public GenericPayloadSerializer { + public: + GatewayPayloadSerializer(); + + virtual std::string serializePayload(boost::shared_ptr item) const; + }; +} From 320738eda85a90c77c4072bd320f6cfd3e6416f8 Mon Sep 17 00:00:00 2001 From: HanzZ Date: Sun, 26 Feb 2012 14:03:48 +0100 Subject: [PATCH 006/143] Gateway interaction --- ChangeLog | 1 + .../GatewayPayloadSerializer.cpp | 2 +- include/transport/gatewayresponder.h | 43 +++++++++++++ include/transport/usermanager.h | 4 ++ spectrum/src/main.cpp | 4 ++ src/gatewayresponder.cpp | 63 +++++++++++++++++++ src/transport.cpp | 6 ++ 7 files changed, 122 insertions(+), 1 deletion(-) create mode 100644 include/transport/gatewayresponder.h create mode 100644 src/gatewayresponder.cpp diff --git a/ChangeLog b/ChangeLog index 97aaa33c..bc4c7435 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,6 +1,7 @@ Version 2.0.0-beta (X-X-X): General: * Added PostreSQL support (thanks to Jadestorm). + * Added XEP-0100 (Gateway interaction) support. * Send presences only "from" bare JID (fixed bug with buddies appearing twice in the roster and potential unregistering issues). * Fixed potential MySQL/SQLite3 deadlocks. diff --git a/include/Swiften/Serializer/PayloadSerializers/GatewayPayloadSerializer.cpp b/include/Swiften/Serializer/PayloadSerializers/GatewayPayloadSerializer.cpp index 8a129376..6b7cd9e7 100644 --- a/include/Swiften/Serializer/PayloadSerializers/GatewayPayloadSerializer.cpp +++ b/include/Swiften/Serializer/PayloadSerializers/GatewayPayloadSerializer.cpp @@ -20,7 +20,7 @@ GatewayPayloadSerializer::GatewayPayloadSerializer() std::string GatewayPayloadSerializer::serializePayload(boost::shared_ptr payload) const { XMLElement query("query", "jabber:iq:gateway"); - if (!payload->getJID().isValid()) { + if (payload->getJID().isValid()) { boost::shared_ptr jid(new XMLElement("jid", "", payload->getJID().toBare().toString())); query.addNode(jid); } diff --git a/include/transport/gatewayresponder.h b/include/transport/gatewayresponder.h new file mode 100644 index 00000000..1acf4403 --- /dev/null +++ b/include/transport/gatewayresponder.h @@ -0,0 +1,43 @@ +/** + * libtransport -- C++ library for easy XMPP Transports development + * + * Copyright (C) 2011, Jan Kaluza + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA + */ + +#pragma once + +#include +#include "Swiften/Swiften.h" +#include "Swiften/Queries/Responder.h" +#include "Swiften/Elements/GatewayPayload.h" + +namespace Transport { + +class UserManager; + +class GatewayResponder : public Swift::Responder { + public: + GatewayResponder(Swift::IQRouter *router, UserManager *userManager); + ~GatewayResponder(); + + private: + virtual bool handleGetRequest(const Swift::JID& from, const Swift::JID& to, const std::string& id, boost::shared_ptr payload); + virtual bool handleSetRequest(const Swift::JID& from, const Swift::JID& to, const std::string& id, boost::shared_ptr payload); + UserManager *m_userManager; +}; + +} \ No newline at end of file diff --git a/include/transport/usermanager.h b/include/transport/usermanager.h index 290c4235..5ea47d5c 100644 --- a/include/transport/usermanager.h +++ b/include/transport/usermanager.h @@ -104,6 +104,10 @@ class UserManager : public Swift::EntityCapsProvider { return m_userRegistry; } + Component *getComponent() { + return m_component; + } + /// Connects user manually. /// \param user JID of user. void connectUser(const Swift::JID &user); diff --git a/spectrum/src/main.cpp b/spectrum/src/main.cpp index c57573ea..d05bdeb8 100644 --- a/spectrum/src/main.cpp +++ b/spectrum/src/main.cpp @@ -12,6 +12,7 @@ #include "transport/statsresponder.h" #include "transport/usersreconnecter.h" #include "transport/util.h" +#include "transport/gatewayresponder.h" #include "Swiften/EventLoop/SimpleEventLoop.h" #include #include @@ -421,6 +422,9 @@ int main(int argc, char **argv) StatsResponder statsResponder(&transport, &userManager, &plugin, storageBackend); statsResponder.start(); + GatewayResponder gatewayResponder(transport.getIQRouter(), &userManager); + gatewayResponder.start(); + eventLoop_ = &eventLoop; eventLoop.run(); diff --git a/src/gatewayresponder.cpp b/src/gatewayresponder.cpp new file mode 100644 index 00000000..903c069a --- /dev/null +++ b/src/gatewayresponder.cpp @@ -0,0 +1,63 @@ +/** + * XMPP - libpurple transport + * + * Copyright (C) 2009, Jan Kaluza + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA + */ + +#include "transport/gatewayresponder.h" + +#include +#include +#include "Swiften/Queries/IQRouter.h" +#include "Swiften/Elements/RawXMLPayload.h" +#include "Swiften/Swiften.h" +#include "transport/usermanager.h" +#include "transport/user.h" +#include "transport/transport.h" +#include "log4cxx/logger.h" + +using namespace log4cxx; + +using namespace Swift; +using namespace boost; + +namespace Transport { + +static LoggerPtr logger = Logger::getLogger("GatewayResponder"); + +GatewayResponder::GatewayResponder(Swift::IQRouter *router, UserManager *userManager) : Swift::Responder(router) { + m_userManager = userManager; +} + +GatewayResponder::~GatewayResponder() { +} + +bool GatewayResponder::handleGetRequest(const Swift::JID& from, const Swift::JID& to, const std::string& id, boost::shared_ptr payload) { + sendResponse(from, id, boost::shared_ptr(new GatewayPayload(Swift::JID(), "Enter legacy network contact ID.", "Contact ID"))); + return true; +} + +bool GatewayResponder::handleSetRequest(const Swift::JID& from, const Swift::JID& to, const std::string& id, boost::shared_ptr payload) { + std::string prompt = payload->getPrompt(); + std::string escaped = Swift::JID::getEscapedNode(prompt); + std::string jid = escaped + "@" + m_userManager->getComponent()->getJID().toBare().toString(); + + sendResponse(from, id, boost::shared_ptr(new GatewayPayload(jid))); + return true; +} + +} diff --git a/src/transport.cpp b/src/transport.cpp index 0d1d06ea..8eab7bf7 100644 --- a/src/transport.cpp +++ b/src/transport.cpp @@ -36,6 +36,8 @@ #include "Swiften/Serializer/PayloadSerializers/XHTMLIMSerializer.h" #include "Swiften/Parser/PayloadParsers/StatsParser.h" #include "Swiften/Serializer/PayloadSerializers/StatsSerializer.h" +#include "Swiften/Parser/PayloadParsers/GatewayPayloadParser.h" +#include "Swiften/Serializer/PayloadSerializers/GatewayPayloadSerializer.h" #include "Swiften/Serializer/PayloadSerializers/SpectrumErrorSerializer.h" #include "transport/BlockParser.h" #include "transport/BlockSerializer.h" @@ -95,6 +97,7 @@ Component::Component(Swift::EventLoop *loop, Swift::NetworkFactories *factories, m_server->addPayloadParserFactory(new GenericPayloadParserFactory("block", "urn:xmpp:block:0")); m_server->addPayloadParserFactory(new GenericPayloadParserFactory("invisible", "urn:xmpp:invisible:0")); m_server->addPayloadParserFactory(new GenericPayloadParserFactory("query", "http://jabber.org/protocol/stats")); + m_server->addPayloadParserFactory(new GenericPayloadParserFactory("query", "jabber:iq:gateway")); m_server->addPayloadSerializer(new Swift::AttentionSerializer()); m_server->addPayloadSerializer(new Swift::XHTMLIMSerializer()); @@ -102,6 +105,7 @@ Component::Component(Swift::EventLoop *loop, Swift::NetworkFactories *factories, m_server->addPayloadSerializer(new Swift::InvisibleSerializer()); m_server->addPayloadSerializer(new Swift::StatsSerializer()); m_server->addPayloadSerializer(new Swift::SpectrumErrorSerializer()); + m_server->addPayloadSerializer(new Swift::GatewayPayloadSerializer()); m_server->onDataRead.connect(boost::bind(&Component::handleDataRead, this, _1)); m_server->onDataWritten.connect(boost::bind(&Component::handleDataWritten, this, _1)); @@ -121,6 +125,7 @@ Component::Component(Swift::EventLoop *loop, Swift::NetworkFactories *factories, m_component->addPayloadParserFactory(new GenericPayloadParserFactory("block", "urn:xmpp:block:0")); m_component->addPayloadParserFactory(new GenericPayloadParserFactory("invisible", "urn:xmpp:invisible:0")); m_component->addPayloadParserFactory(new GenericPayloadParserFactory("query", "http://jabber.org/protocol/stats")); + m_component->addPayloadParserFactory(new GenericPayloadParserFactory("query", "jabber:iq:gateway")); m_component->addPayloadSerializer(new Swift::AttentionSerializer()); m_component->addPayloadSerializer(new Swift::XHTMLIMSerializer()); @@ -128,6 +133,7 @@ Component::Component(Swift::EventLoop *loop, Swift::NetworkFactories *factories, m_component->addPayloadSerializer(new Swift::InvisibleSerializer()); m_component->addPayloadSerializer(new Swift::StatsSerializer()); m_component->addPayloadSerializer(new Swift::SpectrumErrorSerializer()); + m_component->addPayloadSerializer(new Swift::GatewayPayloadSerializer()); m_stanzaChannel = m_component->getStanzaChannel(); m_iqRouter = m_component->getIQRouter(); From 1c99b634a8e9c83e7ca673ca0ff0925e3562e8be Mon Sep 17 00:00:00 2001 From: HanzZ Date: Sun, 26 Feb 2012 15:41:40 +0100 Subject: [PATCH 007/143] Do not send empty name in roster push --- src/networkpluginserver.cpp | 1 + src/rostermanager.cpp | 7 ++++++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/src/networkpluginserver.cpp b/src/networkpluginserver.cpp index a89117b6..bb8eb680 100644 --- a/src/networkpluginserver.cpp +++ b/src/networkpluginserver.cpp @@ -195,6 +195,7 @@ static void handleBuddyPayload(LocalBuddy *buddy, const pbnetwork::Buddy &payloa // Set alias only if it's not empty. Backends are allowed to send empty alias if it has // not changed. if (!payload.alias().empty()) { + LOG4CXX_INFO(logger, "Setting alias to " << payload.alias() << " " << buddy->getAlias()); buddy->setAlias(payload.alias()); } diff --git a/src/rostermanager.cpp b/src/rostermanager.cpp index 44264588..65135116 100644 --- a/src/rostermanager.cpp +++ b/src/rostermanager.cpp @@ -110,7 +110,12 @@ void RosterManager::sendBuddyRosterPush(Buddy *buddy) { Swift::RosterPayload::ref payload = Swift::RosterPayload::ref(new Swift::RosterPayload()); Swift::RosterItemPayload item; item.setJID(buddy->getJID().toBare()); - item.setName(buddy->getAlias()); + if (buddy->getAlias().empty()) { + item.setName(buddy->getJID().toBare().toString()); + } + else { + item.setName(buddy->getAlias()); + } item.setGroups(buddy->getGroups()); item.setSubscription(Swift::RosterItemPayload::Both); From 666233737631cd8bb55186087bafb789248b0c60 Mon Sep 17 00:00:00 2001 From: HanzZ Date: Sun, 26 Feb 2012 16:14:43 +0100 Subject: [PATCH 008/143] debug --- src/networkpluginserver.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/networkpluginserver.cpp b/src/networkpluginserver.cpp index bb8eb680..00b7f9cd 100644 --- a/src/networkpluginserver.cpp +++ b/src/networkpluginserver.cpp @@ -479,6 +479,8 @@ void NetworkPluginServer::handleBuddyChangedPayload(const std::string &data) { if (!user) return; + LOG4CXX_INFO(logger, "HANDLE BUDDY CHANGED " << payload.buddyname() << "-" << payload.alias()); + LocalBuddy *buddy = (LocalBuddy *) user->getRosterManager()->getBuddy(payload.buddyname()); if (buddy) { handleBuddyPayload(buddy, payload); From fbb10606458df2bda74cc0cf63d883a8fd3c384e Mon Sep 17 00:00:00 2001 From: HanzZ Date: Sun, 26 Feb 2012 16:55:37 +0100 Subject: [PATCH 009/143] Remove firstSet check --- src/localbuddy.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/localbuddy.cpp b/src/localbuddy.cpp index a12b9ee9..55f7e27c 100644 --- a/src/localbuddy.cpp +++ b/src/localbuddy.cpp @@ -32,11 +32,11 @@ LocalBuddy::~LocalBuddy() { } void LocalBuddy::setAlias(const std::string &alias) { - if (m_firstSet) { - m_firstSet = false; - m_alias = alias; - return; - } +// if (m_firstSet) { +// m_firstSet = false; +// m_alias = alias; +// return; +// } bool changed = m_alias != alias; m_alias = alias; From d6c5afab27269413fc2a1c1f422f7253dc644f42 Mon Sep 17 00:00:00 2001 From: HanzZ Date: Sun, 26 Feb 2012 19:37:00 +0100 Subject: [PATCH 010/143] fixed skype buddies parsing --- backends/skype/main.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backends/skype/main.cpp b/backends/skype/main.cpp index f9f7b4b6..9ede8a7f 100644 --- a/backends/skype/main.cpp +++ b/backends/skype/main.cpp @@ -505,7 +505,7 @@ bool Skype::loadSkypeBuddies() { // online status;friendly name;voicemail;mood // (comma-seperated lines, usernames can have comma's) - for (int i=0; full_friends_list[i] && *full_friends_list[i] != '\0'; i+=8) + for (int i=0; full_friends_list[i] && full_friends_list[i+1] && *full_friends_list[i] != '\0'; i+=8) { std::string buddy = full_friends_list[i]; From 554dddd813d9f81f47ad1d9b1a12fbf9b5f474a9 Mon Sep 17 00:00:00 2001 From: HanzZ Date: Tue, 28 Feb 2012 11:01:22 +0100 Subject: [PATCH 011/143] Updated changelog --- ChangeLog | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ChangeLog b/ChangeLog index bc4c7435..d0d28034 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,4 +1,4 @@ -Version 2.0.0-beta (X-X-X): +Version 2.0.0-beta (2012-02-28): General: * Added PostreSQL support (thanks to Jadestorm). * Added XEP-0100 (Gateway interaction) support. From 40d67818427287b278b341a16f265f2bfbfbc46f Mon Sep 17 00:00:00 2001 From: Jan Kaluza Date: Tue, 28 Feb 2012 14:44:00 +0100 Subject: [PATCH 012/143] Backend template --- backends/CMakeLists.txt | 2 + backends/template/CMakeLists.txt | 10 ++ backends/template/README | 1 + backends/template/main.cpp | 181 +++++++++++++++++++++++++++++++ 4 files changed, 194 insertions(+) create mode 100644 backends/template/CMakeLists.txt create mode 100644 backends/template/README create mode 100644 backends/template/main.cpp diff --git a/backends/CMakeLists.txt b/backends/CMakeLists.txt index 543b60b8..cdb2696f 100644 --- a/backends/CMakeLists.txt +++ b/backends/CMakeLists.txt @@ -9,6 +9,8 @@ if (PROTOBUF_FOUND) ADD_SUBDIRECTORY(smstools3) + ADD_SUBDIRECTORY(template) + if (NOT WIN32) ADD_SUBDIRECTORY(frotz) if (${LIBDBUSGLIB_FOUND}) diff --git a/backends/template/CMakeLists.txt b/backends/template/CMakeLists.txt new file mode 100644 index 00000000..b35d57a3 --- /dev/null +++ b/backends/template/CMakeLists.txt @@ -0,0 +1,10 @@ +cmake_minimum_required(VERSION 2.6) + +FILE(GLOB SRC *.c *.cpp) + +ADD_EXECUTABLE(spectrum2_template_backend ${SRC}) + +target_link_libraries(spectrum2_template_backend transport pthread ${Boost_LIBRARIES} ${SWIFTEN_LIBRARY} ${LOG4CXX_LIBRARIES}) + +#INSTALL(TARGETS spectrum2_template_backend RUNTIME DESTINATION bin) + diff --git a/backends/template/README b/backends/template/README new file mode 100644 index 00000000..b5b85a34 --- /dev/null +++ b/backends/template/README @@ -0,0 +1 @@ +This is just template for creating new generic spectrum2 backends. It does not do anything! \ No newline at end of file diff --git a/backends/template/main.cpp b/backends/template/main.cpp new file mode 100644 index 00000000..44fc8623 --- /dev/null +++ b/backends/template/main.cpp @@ -0,0 +1,181 @@ +// Transport includes +#include "transport/config.h" +#include "transport/networkplugin.h" + +// Swiften +#include "Swiften/Swiften.h" + +// for signal handler +#include "unistd.h" +#include "signal.h" +#include "sys/wait.h" +#include "sys/signal.h" + +// Log4cxx +#include "log4cxx/logger.h" +#include "log4cxx/consoleappender.h" +#include "log4cxx/patternlayout.h" +#include "log4cxx/propertyconfigurator.h" +#include "log4cxx/helpers/properties.h" +#include "log4cxx/helpers/fileinputstream.h" +#include "log4cxx/helpers/transcoder.h" + +// Boost +#include +using namespace boost::filesystem; +using namespace boost::program_options; +using namespace Transport; + +// log4cxx main logger +using namespace log4cxx; +static LoggerPtr logger = log4cxx::Logger::getLogger("Backend Template"); + +// eventloop +Swift::SimpleEventLoop *loop_; + +// Plugin +class TemplatePlugin; +TemplatePlugin * np = NULL; + +class TemplatePlugin : public NetworkPlugin { + public: + Swift::BoostNetworkFactories *m_factories; + Swift::BoostIOServiceThread m_boostIOServiceThread; + boost::shared_ptr m_conn; + + TemplatePlugin(Config *config, Swift::SimpleEventLoop *loop, const std::string &host, int port) : NetworkPlugin() { + this->config = config; + m_factories = new Swift::BoostNetworkFactories(loop); + m_conn = m_factories->getConnectionFactory()->createConnection(); + m_conn->onDataRead.connect(boost::bind(&TemplatePlugin::_handleDataRead, this, _1)); + m_conn->connect(Swift::HostAddressPort(Swift::HostAddress(host), port)); + + LOG4CXX_INFO(logger, "Starting the plugin."); + } + + // NetworkPlugin uses this method to send the data to networkplugin server + void sendData(const std::string &string) { + m_conn->write(Swift::createSafeByteArray(string)); + } + + // This method has to call handleDataRead with all received data from network plugin server + void _handleDataRead(boost::shared_ptr data) { + std::string d(data->begin(), data->end()); + handleDataRead(d); + } + + void handleLoginRequest(const std::string &user, const std::string &legacyName, const std::string &password) { + handleConnected(user); + } + + void handleLogoutRequest(const std::string &user, const std::string &legacyName) { + } + + void handleMessageSendRequest(const std::string &user, const std::string &legacyName, const std::string &message, const std::string &xhtml = "") { + LOG4CXX_INFO(logger, "Sending message from " << user << " to " << legacyName << "."); + } + + void handleBuddyUpdatedRequest(const std::string &user, const std::string &buddyName, const std::string &alias, const std::vector &groups) { + LOG4CXX_INFO(logger, user << ": Added buddy " << buddyName << "."); + handleBuddyChanged(user, buddyName, alias, groups, pbnetwork::STATUS_ONLINE); + } + + void handleBuddyRemovedRequest(const std::string &user, const std::string &buddyName, const std::vector &groups) { + + } + + private: + Config *config; +}; + +static void spectrum_sigchld_handler(int sig) +{ + int status; + pid_t pid; + + do { + pid = waitpid(-1, &status, WNOHANG); + } while (pid != 0 && pid != (pid_t)-1); + + if ((pid == (pid_t) - 1) && (errno != ECHILD)) { + char errmsg[BUFSIZ]; + snprintf(errmsg, BUFSIZ, "Warning: waitpid() returned %d", pid); + perror(errmsg); + } +} + + +int main (int argc, char* argv[]) { + std::string host; + int port; + + if (signal(SIGCHLD, spectrum_sigchld_handler) == SIG_ERR) { + std::cout << "SIGCHLD handler can't be set\n"; + return -1; + } + + boost::program_options::options_description desc("Usage: spectrum [OPTIONS] \nAllowed options"); + desc.add_options() + ("host,h", value(&host), "host") + ("port,p", value(&port), "port") + ; + try + { + boost::program_options::variables_map vm; + boost::program_options::store(boost::program_options::parse_command_line(argc, argv, desc), vm); + boost::program_options::notify(vm); + } + catch (std::runtime_error& e) + { + std::cout << desc << "\n"; + exit(1); + } + catch (...) + { + std::cout << desc << "\n"; + exit(1); + } + + + if (argc < 5) { + return 1; + } + + Config config; + if (!config.load(argv[5])) { + std::cerr << "Can't open " << argv[1] << " configuration file.\n"; + return 1; + } + + if (CONFIG_STRING(&config, "logging.backend_config").empty()) { + LoggerPtr root = log4cxx::Logger::getRootLogger(); +#ifndef _MSC_VER + root->addAppender(new ConsoleAppender(new PatternLayout("%d %-5p %c: %m%n"))); +#else + root->addAppender(new ConsoleAppender(new PatternLayout(L"%d %-5p %c: %m%n"))); +#endif + } + else { + log4cxx::helpers::Properties p; + log4cxx::helpers::FileInputStream *istream = new log4cxx::helpers::FileInputStream(CONFIG_STRING(&config, "logging.backend_config")); + p.load(istream); + LogString pid, jid; + log4cxx::helpers::Transcoder::decode(boost::lexical_cast(getpid()), pid); + log4cxx::helpers::Transcoder::decode(CONFIG_STRING(&config, "service.jid"), jid); +#ifdef _MSC_VER + p.setProperty(L"pid", pid); + p.setProperty(L"jid", jid); +#else + p.setProperty("pid", pid); + p.setProperty("jid", jid); +#endif + log4cxx::PropertyConfigurator::configure(p); + } + + Swift::SimpleEventLoop eventLoop; + loop_ = &eventLoop; + np = new TemplatePlugin(&config, &eventLoop, host, port); + loop_->run(); + + return 0; +} From 7292a987c59d7ae79f1e572aab10f73c38f46f8f Mon Sep 17 00:00:00 2001 From: Jan Kaluza Date: Fri, 2 Mar 2012 08:51:55 +0100 Subject: [PATCH 013/143] First tries of full MUC support --- backends/libpurple/main.cpp | 35 +++++++++++++++++++++++++++++++++++ spectrum/src/sample.cfg | 7 ++++--- src/user.cpp | 4 ++-- 3 files changed, 41 insertions(+), 5 deletions(-) diff --git a/backends/libpurple/main.cpp b/backends/libpurple/main.cpp index 86a6f201..cf8d3090 100644 --- a/backends/libpurple/main.cpp +++ b/backends/libpurple/main.cpp @@ -915,6 +915,41 @@ class SpectrumNetworkPlugin : public NetworkPlugin { } } + void handleJoinRoomRequest(const std::string &user, const std::string &room, const std::string &nickname, const std::string &pasword) { + PurpleAccount *account = m_sessions[user]; + if (!account) { + return; + } + + PurpleConnection *gc = purple_account_get_connection(account); + GHashTable *comps = NULL; + + // Check if the PurpleChat is not stored in buddy list + PurpleChat *chat = purple_blist_find_chat(account, room.c_str()); + if (chat) { + comps = purple_chat_get_components(chat); + } + else if (PURPLE_PLUGIN_PROTOCOL_INFO(gc->prpl)->chat_info_defaults != NULL) { + comps = PURPLE_PLUGIN_PROTOCOL_INFO(gc->prpl)->chat_info_defaults(gc, room.c_str()); + } + + LOG4CXX_INFO(logger, user << ": Joining the room " << room); + if (comps) { + serv_join_chat(gc, comps); + g_hash_table_destroy(comps); + } + } + + void handleLeaveRoomRequest(const std::string &user, const std::string &room) { + PurpleAccount *account = m_sessions[user]; + if (!account) { + return; + } + + PurpleConversation *conv = purple_find_conversation_with_account(PURPLE_CONV_TYPE_CHAT, room.c_str(), account); + purple_conversation_destroy(conv); + } + void handleFTStartRequest(const std::string &user, const std::string &buddyName, const std::string &fileName, unsigned long size, unsigned long ftID) { PurpleXfer *xfer = m_unhandledXfers[user + fileName + buddyName]; if (xfer) { diff --git a/spectrum/src/sample.cfg b/spectrum/src/sample.cfg index c473966b..d0e234e9 100644 --- a/spectrum/src/sample.cfg +++ b/spectrum/src/sample.cfg @@ -13,8 +13,8 @@ admin_password=test #cert=server.pfx #patch to PKCS#12 certificate #cert_password=test #password to that certificate if any users_per_backend=10 -#backend=/home/hanzz/code/libtransport/backends/libpurple/spectrum2_libpurple_backend -backend=/home/hanzz/code/libtransport/backends/smstools3/spectrum2_smstools3_backend +backend=/home/hanzz/code/libtransport/backends/libpurple/spectrum2_libpurple_backend +#backend=/home/hanzz/code/libtransport/backends/smstools3/spectrum2_smstools3_backend #backend=/usr/bin/mono /home/hanzz/code/networkplugin-csharp/msnp-sharp-backend/bin/Debug/msnp-sharp-backend.exe #backend=/home/hanzz/code/libtransport/backends/frotz/spectrum2_frotz_backend #backend=/home/hanzz/code/libtransport/backends/libircclient-qt/spectrum2_libircclient-qt_backend @@ -22,6 +22,7 @@ backend=/home/hanzz/code/libtransport/backends/smstools3/spectrum2_smstools3_bac protocol=any #protocol=prpl-icq irc_server=irc.freenode.org +working_dir=./ [backend] #default_avatar=catmelonhead.jpg @@ -33,7 +34,7 @@ incoming_dir=/var/spool/sms/incoming #backend_config=/home/hanzz/code/libtransport/spectrum/src/backend-logging.cfg # log4cxx/log4j logging configuration file for backends [database] -type = sqlite3 # or "none" without database backend +type = none # or "none" without database backend database = test.sql prefix=icq #type = mysql # or "none" without database backend....................................................................................................................... diff --git a/src/user.cpp b/src/user.cpp index 0467ee86..e94ae872 100644 --- a/src/user.cpp +++ b/src/user.cpp @@ -213,8 +213,8 @@ void User::handlePresence(Swift::Presence::ref presence) { bool isMUC = presence->getPayload() != NULL || *presence->getTo().getNode().c_str() == '#'; if (isMUC) { if (presence->getType() == Swift::Presence::Unavailable) { - LOG4CXX_INFO(logger, m_jid.toString() << ": Going to left room " << presence->getTo().getNode()); std::string room = Buddy::JIDToLegacyName(presence->getTo()); + LOG4CXX_INFO(logger, m_jid.toString() << ": Going to left room " << room); onRoomLeft(room); } else { @@ -224,8 +224,8 @@ void User::handlePresence(Swift::Presence::ref presence) { m_readyForConnect = true; onReadyToConnect(); } - LOG4CXX_INFO(logger, m_jid.toString() << ": Going to join room " << presence->getTo().getNode() << " as " << presence->getTo().getResource()); std::string room = Buddy::JIDToLegacyName(presence->getTo()); + LOG4CXX_INFO(logger, m_jid.toString() << ": Going to join room " << room << " as " << presence->getTo().getResource()); std::string password = ""; if (presence->getPayload() != NULL) { password = presence->getPayload()->getPassword() ? *presence->getPayload()->getPassword() : ""; From 7dd245244ef1ac94434b81f0ed50b880917acd77 Mon Sep 17 00:00:00 2001 From: Jan Kaluza Date: Tue, 6 Mar 2012 09:24:23 +0100 Subject: [PATCH 014/143] Do not build with openssl support on windows --- src/CMakeLists.txt | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index dcb192c4..925ce5f4 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -1,6 +1,12 @@ cmake_minimum_required(VERSION 2.6) FILE(GLOB SRC *.cpp *.h) FILE(GLOB_RECURSE SWIFTEN_SRC ../include/Swiften/*.cpp) + +# Build without openssl on windows +if (WIN32) + string(REGEX REPLACE "[^;]+;?/OpenSSL/[^;]+;?" "" SWIFTEN_SRC "${SWIFTEN_SRC}") +endif() + FILE(GLOB HEADERS ../include/transport/*.h) if (CPPUNIT_FOUND) From 346e24d182b139218ec1907df5576580d63e5d73 Mon Sep 17 00:00:00 2001 From: Jan Kaluza Date: Tue, 6 Mar 2012 11:00:57 +0100 Subject: [PATCH 015/143] Fixed header corruption on 64bit windows --- plugin/src/networkplugin.cpp | 4 +- plugin/src/pbnetwork.proto | 137 ----------------------------------- src/networkpluginserver.cpp | 4 +- 3 files changed, 4 insertions(+), 141 deletions(-) delete mode 100644 plugin/src/pbnetwork.proto diff --git a/plugin/src/networkplugin.cpp b/plugin/src/networkplugin.cpp index 9348eb11..27536ad8 100644 --- a/plugin/src/networkplugin.cpp +++ b/plugin/src/networkplugin.cpp @@ -559,8 +559,8 @@ void NetworkPlugin::handleDataRead(std::string &data) { } void NetworkPlugin::send(const std::string &data) { - char header[4]; - *((int*)(header)) = htonl(data.size()); + uint32_t size = htonl(data.size()); + char *header = (char *) &size; sendData(std::string(header, 4) + data); } diff --git a/plugin/src/pbnetwork.proto b/plugin/src/pbnetwork.proto deleted file mode 100644 index a492feb2..00000000 --- a/plugin/src/pbnetwork.proto +++ /dev/null @@ -1,137 +0,0 @@ -package pbnetwork; - -enum StatusType { - STATUS_ONLINE = 0; - STATUS_AWAY = 1; - STATUS_FFC = 2; - STATUS_XA = 3; - STATUS_DND = 4; - STATUS_NONE = 5; - STATUS_INVISIBLE = 6; -} - -message Connected { - required string user = 1; -} - -message Disconnected { - required string user = 1; - required int32 error = 2; - optional string message = 3; -} - -message Login { - required string user = 1; - required string legacyName = 2; - required string password = 3; -} - -message Logout { - required string user = 1; - required string legacyName = 2; -} - -message Buddy { - required string userName = 1; - required string buddyName = 2; - optional string alias = 3; - optional string groups = 4; - optional StatusType status = 5; - optional string statusMessage = 6; - optional string iconHash = 7; - optional bool blocked = 8; -} - -message ConversationMessage { - required string userName = 1; - required string buddyName = 2; - required string message = 3; - optional string nickname = 4; - optional string xhtml = 5; -} - -message Room { - required string userName = 1; - required string nickname = 2; - required string room = 3; - optional string password = 4; -} - -message Participant { - required string userName = 1; - required string room = 2; - required string nickname = 3; - required int32 flag = 4; - required StatusType status = 5; - optional string statusMessage = 6; - optional string newname = 7; -} - -message VCard { - required string userName = 1; - required string buddyName = 2; - required int32 id = 3; - optional string fullname = 4; - optional string nickname = 5; - optional bytes photo = 6; -} - -message Status { - required string userName = 1; - required StatusType status = 3; - optional string statusMessage = 4; -} - -message Stats { - required int32 res = 1; - required int32 init_res = 2; - required int32 shared = 3; -} - -message File { - required string userName = 1; - required string buddyName = 2; - required string fileName = 3; - required int32 size = 4; - optional int32 ftID = 5; -} - -message FileTransferData { - required int32 ftID = 1; - required bytes data = 2; -} - -message WrapperMessage { - enum Type { - TYPE_CONNECTED = 1; - TYPE_DISCONNECTED = 2; - TYPE_LOGIN = 3; - TYPE_LOGOUT = 4; - TYPE_BUDDY_CHANGED = 6; - TYPE_BUDDY_REMOVED = 7; - TYPE_CONV_MESSAGE = 8; - TYPE_PING = 9; - TYPE_PONG = 10; - TYPE_JOIN_ROOM = 11; - TYPE_LEAVE_ROOM = 12; - TYPE_PARTICIPANT_CHANGED = 13; - TYPE_ROOM_NICKNAME_CHANGED = 14; - TYPE_ROOM_SUBJECT_CHANGED = 15; - TYPE_VCARD = 16; - TYPE_STATUS_CHANGED = 17; - TYPE_BUDDY_TYPING = 18; - TYPE_BUDDY_STOPPED_TYPING = 19; - TYPE_BUDDY_TYPED = 20; - TYPE_AUTH_REQUEST = 21; - TYPE_ATTENTION = 22; - TYPE_STATS = 23; - TYPE_FT_START = 24; - TYPE_FT_FINISH = 25; - TYPE_FT_DATA = 26; - TYPE_FT_PAUSE = 27; - TYPE_FT_CONTINUE = 28; - } - required Type type = 1; - optional bytes payload = 2; -} -; \ No newline at end of file diff --git a/src/networkpluginserver.cpp b/src/networkpluginserver.cpp index 00b7f9cd..db2e94e4 100644 --- a/src/networkpluginserver.cpp +++ b/src/networkpluginserver.cpp @@ -804,8 +804,8 @@ void NetworkPluginServer::handleDataRead(Backend *c, boost::shared_ptr &c, const std::string &data) { // generate header - size of wrapper message - char header[4]; - *((int*)(header)) = htonl(data.size()); + uint32_t size = htonl(data.size()); + char *header = (char *) &size; // send header together with wrapper message c->write(Swift::createSafeByteArray(std::string(header, 4) + data)); From f744728ba0278dd2df967ababe325b8fe6671d9f Mon Sep 17 00:00:00 2001 From: Jan Kaluza Date: Tue, 6 Mar 2012 11:19:53 +0100 Subject: [PATCH 016/143] define uint32_t on windows --- plugin/src/networkplugin.cpp | 1 + src/networkpluginserver.cpp | 1 + 2 files changed, 2 insertions(+) diff --git a/plugin/src/networkplugin.cpp b/plugin/src/networkplugin.cpp index 27536ad8..beede0c9 100644 --- a/plugin/src/networkplugin.cpp +++ b/plugin/src/networkplugin.cpp @@ -25,6 +25,7 @@ #ifndef WIN32 #include +#define uint32_t u_long #else #include #endif diff --git a/src/networkpluginserver.cpp b/src/networkpluginserver.cpp index db2e94e4..4dd9c0b3 100644 --- a/src/networkpluginserver.cpp +++ b/src/networkpluginserver.cpp @@ -48,6 +48,7 @@ #ifdef _WIN32 #include "windows.h" +#define uint32_t u_long #else #include "sys/wait.h" #include "sys/signal.h" From f8df2994fd394128c7211fe28bcf73b8808b9cbb Mon Sep 17 00:00:00 2001 From: Jan Kaluza Date: Tue, 6 Mar 2012 11:23:11 +0100 Subject: [PATCH 017/143] stdint.h --- plugin/src/networkplugin.cpp | 2 +- src/networkpluginserver.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/plugin/src/networkplugin.cpp b/plugin/src/networkplugin.cpp index beede0c9..df4a6a38 100644 --- a/plugin/src/networkplugin.cpp +++ b/plugin/src/networkplugin.cpp @@ -25,9 +25,9 @@ #ifndef WIN32 #include -#define uint32_t u_long #else #include +#include #endif using namespace log4cxx; diff --git a/src/networkpluginserver.cpp b/src/networkpluginserver.cpp index 4dd9c0b3..eeae4c31 100644 --- a/src/networkpluginserver.cpp +++ b/src/networkpluginserver.cpp @@ -48,7 +48,7 @@ #ifdef _WIN32 #include "windows.h" -#define uint32_t u_long +#include #else #include "sys/wait.h" #include "sys/signal.h" From c990770ecf3b2d841b1ed9003de08701b02ae021 Mon Sep 17 00:00:00 2001 From: Jan Kaluza Date: Tue, 6 Mar 2012 11:47:00 +0100 Subject: [PATCH 018/143] renamed plugin/src to plugin/cpp --- plugin/CMakeLists.txt | 2 +- plugin/{src => cpp}/CMakeLists.txt | 0 plugin/{src => cpp}/networkplugin.cpp | 0 3 files changed, 1 insertion(+), 1 deletion(-) rename plugin/{src => cpp}/CMakeLists.txt (100%) rename plugin/{src => cpp}/networkplugin.cpp (100%) diff --git a/plugin/CMakeLists.txt b/plugin/CMakeLists.txt index 4b7537b5..6df16409 100644 --- a/plugin/CMakeLists.txt +++ b/plugin/CMakeLists.txt @@ -1 +1 @@ -ADD_SUBDIRECTORY(src) +ADD_SUBDIRECTORY(cpp) diff --git a/plugin/src/CMakeLists.txt b/plugin/cpp/CMakeLists.txt similarity index 100% rename from plugin/src/CMakeLists.txt rename to plugin/cpp/CMakeLists.txt diff --git a/plugin/src/networkplugin.cpp b/plugin/cpp/networkplugin.cpp similarity index 100% rename from plugin/src/networkplugin.cpp rename to plugin/cpp/networkplugin.cpp From 6c2ef4c9d8714dd898215f807af6283eb3efe543 Mon Sep 17 00:00:00 2001 From: Jan Kaluza Date: Tue, 6 Mar 2012 12:49:36 +0100 Subject: [PATCH 019/143] place for python binding --- plugin/CMakeLists.txt | 1 + plugin/python/CMakeLists.txt | 13 +++++++++++++ 2 files changed, 14 insertions(+) create mode 100644 plugin/python/CMakeLists.txt diff --git a/plugin/CMakeLists.txt b/plugin/CMakeLists.txt index 6df16409..798bc96f 100644 --- a/plugin/CMakeLists.txt +++ b/plugin/CMakeLists.txt @@ -1 +1,2 @@ ADD_SUBDIRECTORY(cpp) +ADD_SUBDIRECTORY(python) diff --git a/plugin/python/CMakeLists.txt b/plugin/python/CMakeLists.txt new file mode 100644 index 00000000..5bc15fb8 --- /dev/null +++ b/plugin/python/CMakeLists.txt @@ -0,0 +1,13 @@ +cmake_minimum_required(VERSION 2.6) + +if (PROTOBUF_FOUND) + ADD_CUSTOM_COMMAND( + OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/protocol_pb2.py + COMMAND ${PROTOBUF_PROTOC_EXECUTABLE} --python_out ${CMAKE_CURRENT_BINARY_DIR} --proto_path ${CMAKE_CURRENT_BINARY_DIR}/../../include/transport/ ${CMAKE_CURRENT_BINARY_DIR}/../../include/transport/protocol.proto + COMMENT "Running Python protocol buffer compiler on protocol.proto" + DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/../../include/transport/protocol.proto + ) + ADD_CUSTOM_TARGET(pb-python DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/protocol_pb2.py) +endif() + + From fa1b565385454f05b5b3a5bf496622659e2cf0ff Mon Sep 17 00:00:00 2001 From: Jan Kaluza Date: Wed, 7 Mar 2012 10:47:46 +0100 Subject: [PATCH 020/143] Use g_free for freeing glibs data --- backends/libpurple/main.cpp | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/backends/libpurple/main.cpp b/backends/libpurple/main.cpp index cf8d3090..e25d093e 100644 --- a/backends/libpurple/main.cpp +++ b/backends/libpurple/main.cpp @@ -89,7 +89,7 @@ static std::string KEYFILE_STRING(const std::string &cat, const std::string &key return def; } std::string ret(str); - free(str); + g_free(str); if (ret.find("#") != std::string::npos) { ret = ret.substr(0, ret.find("#")); @@ -1407,11 +1407,13 @@ static void *notify_user_info(PurpleConnection *gc, const char *who, PurpleNotif if (true) { gchar *data; gchar *path = purple_buddy_icon_get_full_path(icon); - if (g_file_get_contents (path, &data, &len, NULL)) { - photo = std::string(data, len); - free(data); + if (path) { + if (g_file_get_contents(path, &data, &len, NULL)) { + photo = std::string(data, len); + g_free(data); + } + g_free(path); } - free(path); } else { const gchar * data = (gchar*)purple_buddy_icon_get_data(icon, &len); From 022a723079d8910366153fc9c3f336fe72262977 Mon Sep 17 00:00:00 2001 From: Jan Kaluza Date: Wed, 7 Mar 2012 13:51:35 +0100 Subject: [PATCH 021/143] working joining/leaving XMPP MUC --- backends/libpurple/main.cpp | 46 +++++++++++++++++++++++++++++++++++-- 1 file changed, 44 insertions(+), 2 deletions(-) diff --git a/backends/libpurple/main.cpp b/backends/libpurple/main.cpp index e25d093e..7b77a994 100644 --- a/backends/libpurple/main.cpp +++ b/backends/libpurple/main.cpp @@ -1256,6 +1256,48 @@ static void conv_write_im(PurpleConversation *conv, const char *who, const char np->handleMessage(np->m_accounts[account], w, message_, "", xhtml_); } +static void conv_chat_add_users(PurpleConversation *conv, GList *cbuddies, gboolean new_arrivals) { + PurpleAccount *account = purple_conversation_get_account(conv); + + GList *l = cbuddies; + while (l != NULL) { + PurpleConvChatBuddy *cb = (PurpleConvChatBuddy *)l->data; + std::string name(cb->name); + int flags = GPOINTER_TO_INT(cb->flags); + if (flags & PURPLE_CBFLAGS_OP || flags & PURPLE_CBFLAGS_HALFOP) { +// item->addAttribute("affiliation", "admin"); +// item->addAttribute("role", "moderator"); + flags = 1; + } + else if (flags & PURPLE_CBFLAGS_FOUNDER) { +// item->addAttribute("affiliation", "owner"); +// item->addAttribute("role", "moderator"); + flags = 1; + } + else { + flags = 0; +// item->addAttribute("affiliation", "member"); +// item->addAttribute("role", "participant"); + } + + np->handleParticipantChanged(np->m_accounts[account], name, purple_conversation_get_name(conv), (int) flags, pbnetwork::STATUS_ONLINE); + + l = l->next; + } +} + +static void conv_chat_remove_users(PurpleConversation *conv, GList *users) { + PurpleAccount *account = purple_conversation_get_account(conv); + + GList *l = users; + while (l != NULL) { + std::string name((char *) l->data); + np->handleParticipantChanged(np->m_accounts[account], name, purple_conversation_get_name(conv), 0, pbnetwork::STATUS_NONE); + + l = l->next; + } +} + static PurpleConversationUiOps conversation_ui_ops = { NULL, @@ -1263,9 +1305,9 @@ static PurpleConversationUiOps conversation_ui_ops = NULL,//conv_write_chat, /* write_chat */ conv_write_im, /* write_im */ NULL,//conv_write_conv, /* write_conv */ - NULL,//conv_chat_add_users, /* chat_add_users */ + conv_chat_add_users, /* chat_add_users */ NULL,//conv_chat_rename_user, /* chat_rename_user */ - NULL,//conv_chat_remove_users, /* chat_remove_users */ + conv_chat_remove_users, /* chat_remove_users */ NULL,//pidgin_conv_chat_update_user, /* chat_update_user */ NULL,//pidgin_conv_present_conversation, /* present */ NULL,//pidgin_conv_has_focus, /* has_focus */ From 87a0a2f49a23806f01c4bae39c2465a40d378be2 Mon Sep 17 00:00:00 2001 From: HanzZ Date: Wed, 7 Mar 2012 18:59:21 +0100 Subject: [PATCH 022/143] Working MUC messages for XMPP --- CMakeLists.txt | 1 + backends/libpurple/main.cpp | 35 ++++++++++++++++++++++++++++------- 2 files changed, 29 insertions(+), 7 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index e798a842..b64e64fa 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -218,6 +218,7 @@ ADD_SUBDIRECTORY(spectrum) ADD_SUBDIRECTORY(backends) if (NOT WIN32) ADD_SUBDIRECTORY(spectrum_manager) + ADD_SUBDIRECTORY(spectrum2_send_message) endif() if (CPPUNIT_FOUND) diff --git a/backends/libpurple/main.cpp b/backends/libpurple/main.cpp index 7b77a994..ec00f706 100644 --- a/backends/libpurple/main.cpp +++ b/backends/libpurple/main.cpp @@ -768,17 +768,30 @@ class SpectrumNetworkPlugin : public NetworkPlugin { void handleMessageSendRequest(const std::string &user, const std::string &legacyName, const std::string &message, const std::string &xhtml) { PurpleAccount *account = m_sessions[user]; if (account) { - PurpleConversation *conv = purple_find_conversation_with_account(PURPLE_CONV_TYPE_IM, legacyName.c_str(), account); + PurpleConversation *conv = purple_find_conversation_with_account(PURPLE_CONV_TYPE_CHAT, legacyName.c_str(), account); if (!conv) { - conv = purple_conversation_new(PURPLE_CONV_TYPE_IM, account, legacyName.c_str()); + PurpleConversation *conv = purple_find_conversation_with_account(PURPLE_CONV_TYPE_IM, legacyName.c_str(), account); + if (!conv) { + conv = purple_conversation_new(PURPLE_CONV_TYPE_IM, account, legacyName.c_str()); + } } if (xhtml.empty()) { gchar *_markup = purple_markup_escape_text(message.c_str(), -1); - purple_conv_im_send(PURPLE_CONV_IM(conv), _markup); + if (purple_conversation_get_type(conv) == PURPLE_CONV_TYPE_IM) { + purple_conv_im_send(PURPLE_CONV_IM(conv), _markup); + } + else if (purple_conversation_get_type(conv) == PURPLE_CONV_TYPE_CHAT) { + purple_conv_chat_send(PURPLE_CONV_CHAT(conv), _markup); + } g_free(_markup); } else { - purple_conv_im_send(PURPLE_CONV_IM(conv), xhtml.c_str()); + if (purple_conversation_get_type(conv) == PURPLE_CONV_TYPE_IM) { + purple_conv_im_send(PURPLE_CONV_IM(conv), xhtml.c_str()); + } + else if (purple_conversation_get_type(conv) == PURPLE_CONV_TYPE_CHAT) { + purple_conv_chat_send(PURPLE_CONV_CHAT(conv), xhtml.c_str()); + } } } } @@ -1213,8 +1226,10 @@ static PurpleBlistUiOps blistUiOps = static void conv_write_im(PurpleConversation *conv, const char *who, const char *msg, PurpleMessageFlags flags, time_t mtime) { // Don't forwards our own messages. - if (flags & PURPLE_MESSAGE_SEND || flags & PURPLE_MESSAGE_SYSTEM) + if (purple_conversation_get_type(conv) == PURPLE_CONV_TYPE_IM && flags & PURPLE_MESSAGE_SEND || flags & PURPLE_MESSAGE_SYSTEM) { + LOG4CXX_INFO(logger, "MSG"); return; + } PurpleAccount *account = purple_conversation_get_account(conv); // char *striped = purple_markup_strip_html(message); @@ -1253,7 +1268,13 @@ static void conv_write_im(PurpleConversation *conv, const char *who, const char // LOG4CXX_INFO(logger, "Received message body='" << message_ << "' xhtml='" << xhtml_ << "'"); - np->handleMessage(np->m_accounts[account], w, message_, "", xhtml_); + if (purple_conversation_get_type(conv) == PURPLE_CONV_TYPE_IM) { + np->handleMessage(np->m_accounts[account], w, message_, "", xhtml_); + } + else { + LOG4CXX_INFO(logger, "Received message body='" << message_ << "' name='" << purple_conversation_get_name(conv) << "' " << w); + np->handleMessage(np->m_accounts[account], purple_conversation_get_name(conv), message_, w, xhtml_); + } } static void conv_chat_add_users(PurpleConversation *conv, GList *cbuddies, gboolean new_arrivals) { @@ -1302,7 +1323,7 @@ static PurpleConversationUiOps conversation_ui_ops = { NULL, NULL, - NULL,//conv_write_chat, /* write_chat */ + conv_write_im,//conv_write_chat, /* write_chat */ conv_write_im, /* write_im */ NULL,//conv_write_conv, /* write_conv */ conv_chat_add_users, /* chat_add_users */ From 15e1f34b0392f7d11031589ebfe50b7365ebf9ec Mon Sep 17 00:00:00 2001 From: HanzZ Date: Wed, 7 Mar 2012 19:00:53 +0100 Subject: [PATCH 023/143] Working MUC messages for XMPP --- backends/libpurple/main.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/backends/libpurple/main.cpp b/backends/libpurple/main.cpp index ec00f706..01e24e43 100644 --- a/backends/libpurple/main.cpp +++ b/backends/libpurple/main.cpp @@ -1226,8 +1226,7 @@ static PurpleBlistUiOps blistUiOps = static void conv_write_im(PurpleConversation *conv, const char *who, const char *msg, PurpleMessageFlags flags, time_t mtime) { // Don't forwards our own messages. - if (purple_conversation_get_type(conv) == PURPLE_CONV_TYPE_IM && flags & PURPLE_MESSAGE_SEND || flags & PURPLE_MESSAGE_SYSTEM) { - LOG4CXX_INFO(logger, "MSG"); + if (purple_conversation_get_type(conv) == PURPLE_CONV_TYPE_IM && (flags & PURPLE_MESSAGE_SEND || flags & PURPLE_MESSAGE_SYSTEM)) { return; } PurpleAccount *account = purple_conversation_get_account(conv); From 933a650898cbd6df71f58b357b21f29d6c5baed6 Mon Sep 17 00:00:00 2001 From: Jan Kaluza Date: Thu, 8 Mar 2012 08:42:36 +0100 Subject: [PATCH 024/143] Fixed username_mask --- src/userregistration.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/userregistration.cpp b/src/userregistration.cpp index f7de616e..db7ab22e 100644 --- a/src/userregistration.cpp +++ b/src/userregistration.cpp @@ -453,7 +453,7 @@ bool UserRegistration::handleSetRequest(const Swift::JID& from, const Swift::JID // #endif if (!registered) { res.jid = barejid; - res.uin = username; + res.uin = newUsername; res.password = *payload->getPassword(); res.language = language; res.encoding = encoding; @@ -462,7 +462,7 @@ bool UserRegistration::handleSetRequest(const Swift::JID& from, const Swift::JID } else { res.jid = barejid; - res.uin = username; + res.uin = newUsername; res.password = *payload->getPassword(); res.language = language; res.encoding = encoding; From 1dc49d5237e0665b39df38fa68b26fbcd44bb285 Mon Sep 17 00:00:00 2001 From: Jan Kaluza Date: Thu, 8 Mar 2012 08:46:07 +0100 Subject: [PATCH 025/143] do not try to build spectrum2_send_message --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index b64e64fa..3c1ef558 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -218,7 +218,7 @@ ADD_SUBDIRECTORY(spectrum) ADD_SUBDIRECTORY(backends) if (NOT WIN32) ADD_SUBDIRECTORY(spectrum_manager) - ADD_SUBDIRECTORY(spectrum2_send_message) +# ADD_SUBDIRECTORY(spectrum2_send_message) endif() if (CPPUNIT_FOUND) From 98981aec94641db2da4b08bc06a7c0bcff191704 Mon Sep 17 00:00:00 2001 From: Jan Kaluza Date: Thu, 8 Mar 2012 11:10:21 +0100 Subject: [PATCH 026/143] Fixed logging for skype --- backends/skype/main.cpp | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/backends/skype/main.cpp b/backends/skype/main.cpp index 9ede8a7f..984d9f60 100644 --- a/backends/skype/main.cpp +++ b/backends/skype/main.cpp @@ -834,7 +834,17 @@ int main(int argc, char **argv) { log4cxx::helpers::FileInputStream *istream = new log4cxx::helpers::FileInputStream(CONFIG_STRING(&config, "logging.backend_config")); p.load(istream); - p.setProperty("pid", boost::lexical_cast(getpid())); + + LogString pid, jid; + log4cxx::helpers::Transcoder::decode(boost::lexical_cast(getpid()), pid); + log4cxx::helpers::Transcoder::decode(CONFIG_STRING(&config, "service.jid"), jid); +#ifdef _MSC_VER + p.setProperty(L"pid", pid); + p.setProperty(L"jid", jid); +#else + p.setProperty("pid", pid); + p.setProperty("jid", jid); +#endif log4cxx::PropertyConfigurator::configure(p); } From f42aa113b93c9aa7b0ff5b85f532f40554b1caeb Mon Sep 17 00:00:00 2001 From: Jan Kaluza Date: Thu, 8 Mar 2012 11:56:36 +0100 Subject: [PATCH 027/143] support for extra memory usage --- include/transport/networkplugin.h | 2 ++ plugin/cpp/networkplugin.cpp | 13 +++++++++---- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/include/transport/networkplugin.h b/include/transport/networkplugin.h index bba9c013..9a0dfb9b 100644 --- a/include/transport/networkplugin.h +++ b/include/transport/networkplugin.h @@ -211,6 +211,8 @@ class NetworkPlugin { virtual void handleFTPauseRequest(unsigned long ftID) {} virtual void handleFTContinueRequest(unsigned long ftID) {} + virtual void handleMemoryUsage(double &res, double &shared) {res = 0; shared = 0;} + virtual void handleExitRequest() { exit(1); } void handleDataRead(std::string &data); virtual void sendData(const std::string &string) {} diff --git a/plugin/cpp/networkplugin.cpp b/plugin/cpp/networkplugin.cpp index df4a6a38..c17adb7f 100644 --- a/plugin/cpp/networkplugin.cpp +++ b/plugin/cpp/networkplugin.cpp @@ -587,13 +587,18 @@ void NetworkPlugin::sendMemoryUsage() { pbnetwork::Stats stats; stats.set_init_res(m_init_res); - double res; - double shared; + double res = 0; + double shared = 0; #ifndef WIN32 process_mem_usage(shared, res); #endif - stats.set_res(res); - stats.set_shared(shared); + + double e_res; + double e_shared; + handleMemoryUsage(e_res, e_shared); + + stats.set_res(res + e_res); + stats.set_shared(shared + e_shared); std::string message; stats.SerializeToString(&message); From 3949b84ed02700f637e1545d3188c59608ff63d3 Mon Sep 17 00:00:00 2001 From: HanzZ Date: Thu, 8 Mar 2012 20:04:56 +0100 Subject: [PATCH 028/143] Allow setting buddies subscriptions --- include/transport/buddy.h | 8 ++++++-- src/buddy.cpp | 11 ++++++----- src/networkpluginserver.cpp | 7 ++++++- src/rosterstorage.cpp | 2 +- src/tests/basictest.h | 2 +- 5 files changed, 20 insertions(+), 10 deletions(-) diff --git a/include/transport/buddy.h b/include/transport/buddy.h index 5e8f1088..929ba337 100644 --- a/include/transport/buddy.h +++ b/include/transport/buddy.h @@ -39,6 +39,9 @@ typedef enum { BUDDY_NO_FLAG = 0, /// Represents one legacy network Buddy. class Buddy { public: + typedef enum { Ask, + Both, + } Subscription; /// Constructor. /// \param rosterManager RosterManager associated with this buddy. @@ -93,12 +96,12 @@ class Buddy { /// Sets current subscription. /// \param subscription "to", "from", "both", "ask" - void setSubscription(const std::string &subscription); + void setSubscription(Subscription subscription); /// Returns current subscription /// \return subscription "to", "from", "both", "ask" - const std::string getSubscription(); + Subscription getSubscription(); /// Sets this buddy's flags. @@ -172,6 +175,7 @@ class Buddy { Swift::JID m_jid; BuddyFlag m_flags; RosterManager *m_rosterManager; + Subscription m_subscription; }; } diff --git a/src/buddy.cpp b/src/buddy.cpp index 6c023539..55f35713 100644 --- a/src/buddy.cpp +++ b/src/buddy.cpp @@ -26,7 +26,8 @@ namespace Transport { -Buddy::Buddy(RosterManager *rosterManager, long id) : m_id(id), m_flags(BUDDY_NO_FLAG), m_rosterManager(rosterManager){ +Buddy::Buddy(RosterManager *rosterManager, long id) : m_id(id), m_flags(BUDDY_NO_FLAG), m_rosterManager(rosterManager), + m_subscription(Ask) { // m_rosterManager->setBuddy(this); } @@ -64,12 +65,12 @@ const Swift::JID &Buddy::getJID() { return m_jid; } -void Buddy::setSubscription(const std::string &subscription) { -// m_subscription = subscription; +void Buddy::setSubscription(Subscription subscription) { + m_subscription = subscription; } -const std::string Buddy::getSubscription() { - return "ask"; +Buddy::Subscription Buddy::getSubscription() { + return m_subscription; } Swift::Presence::ref Buddy::generatePresenceStanza(int features, bool only_new) { diff --git a/src/networkpluginserver.cpp b/src/networkpluginserver.cpp index eeae4c31..5beba002 100644 --- a/src/networkpluginserver.cpp +++ b/src/networkpluginserver.cpp @@ -95,7 +95,12 @@ class NetworkFactory : public Factory { LocalBuddy *buddy = new LocalBuddy(rosterManager, buddyInfo.id); buddy->setAlias(buddyInfo.alias); buddy->setName(buddyInfo.legacyName); - buddy->setSubscription(buddyInfo.subscription); + if (buddyInfo.subscription == "both") { + buddy->setSubscription(Buddy::Both); + } + else { + buddy->setSubscription(Buddy::Ask); + } buddy->setGroups(buddyInfo.groups); buddy->setFlags((BuddyFlag) (buddyInfo.flags)); if (buddyInfo.settings.find("icon_hash") != buddyInfo.settings.end()) diff --git a/src/rosterstorage.cpp b/src/rosterstorage.cpp index 294f19e8..30679cb9 100644 --- a/src/rosterstorage.cpp +++ b/src/rosterstorage.cpp @@ -103,7 +103,7 @@ bool RosterStorage::storeBuddies() { buddyInfo.alias = buddy->getAlias(); buddyInfo.legacyName = buddy->getName(); buddyInfo.groups = buddy->getGroups(); - buddyInfo.subscription = buddy->getSubscription(); + buddyInfo.subscription = buddy->getSubscription() == Buddy::Ask ? "ask" : "both"; buddyInfo.id = buddy->getID(); buddyInfo.flags = buddy->getFlags(); buddyInfo.settings["icon_hash"].s = buddy->getIconHash(); diff --git a/src/tests/basictest.h b/src/tests/basictest.h index c67691b3..832cada4 100644 --- a/src/tests/basictest.h +++ b/src/tests/basictest.h @@ -72,7 +72,7 @@ class TestingFactory : public Factory { LocalBuddy *buddy = new LocalBuddy(rosterManager, buddyInfo.id); buddy->setAlias(buddyInfo.alias); buddy->setName(buddyInfo.legacyName); - buddy->setSubscription(buddyInfo.subscription); + buddy->setSubscription(Buddy::Ask); buddy->setGroups(buddyInfo.groups); buddy->setFlags((BuddyFlag) buddyInfo.flags); if (buddyInfo.settings.find("icon_hash") != buddyInfo.settings.end()) From 4c9f82cb3591f2c1f6f1bc68fbebc630ca3bf7ec Mon Sep 17 00:00:00 2001 From: HanzZ Date: Fri, 9 Mar 2012 08:25:03 +0100 Subject: [PATCH 029/143] Report also skype process memory usage --- backends/skype/main.cpp | 30 +++++++++++++++++++----------- include/transport/memoryusage.h | 6 +++++- src/memoryusage.cpp | 21 +++++++++++++++------ 3 files changed, 39 insertions(+), 18 deletions(-) diff --git a/backends/skype/main.cpp b/backends/skype/main.cpp index 984d9f60..a56b985d 100644 --- a/backends/skype/main.cpp +++ b/backends/skype/main.cpp @@ -4,6 +4,7 @@ #include "transport/config.h" #include "transport/transport.h" #include "transport/usermanager.h" +#include "transport/memoryusage.h" #include "transport/logger.h" #include "transport/sqlite3backend.h" #include "transport/userregistration.h" @@ -97,6 +98,10 @@ class Skype { bool createDBusProxy(); bool loadSkypeBuddies(); + int getPid() { + return (int) m_pid; + } + private: std::string m_username; std::string m_password; @@ -134,6 +139,19 @@ class SpectrumNetworkPlugin : public NetworkPlugin { skype->login(); } + void handleMemoryUsage(double &res, double &shared) { + res = 0; + shared = 0; + for(std::map::const_iterator it = m_sessions.begin(); it != m_sessions.end(); it++) { + Skype *skype = it->second; + double r; + double s; + process_mem_usage(s, r, skype->getPid()); + res += r; + shared += s; + } + } + void handleLogoutRequest(const std::string &user, const std::string &legacyName) { Skype *skype = m_sessions[user]; if (skype) { @@ -834,17 +852,7 @@ int main(int argc, char **argv) { log4cxx::helpers::FileInputStream *istream = new log4cxx::helpers::FileInputStream(CONFIG_STRING(&config, "logging.backend_config")); p.load(istream); - - LogString pid, jid; - log4cxx::helpers::Transcoder::decode(boost::lexical_cast(getpid()), pid); - log4cxx::helpers::Transcoder::decode(CONFIG_STRING(&config, "service.jid"), jid); -#ifdef _MSC_VER - p.setProperty(L"pid", pid); - p.setProperty(L"jid", jid); -#else - p.setProperty("pid", pid); - p.setProperty("jid", jid); -#endif + p.setProperty("pid", boost::lexical_cast(getpid())); log4cxx::PropertyConfigurator::configure(p); } diff --git a/include/transport/memoryusage.h b/include/transport/memoryusage.h index d2080e21..d38917d9 100644 --- a/include/transport/memoryusage.h +++ b/include/transport/memoryusage.h @@ -22,10 +22,14 @@ #include +#ifndef WIN32 +#include "signal.h" +#endif + namespace Transport { #ifndef WIN32 - void process_mem_usage(double& shared, double& resident_set); + void process_mem_usage(double& shared, double& resident_set, pid_t pid = 0); #endif } \ No newline at end of file diff --git a/src/memoryusage.cpp b/src/memoryusage.cpp index ded5130e..d620569b 100644 --- a/src/memoryusage.cpp +++ b/src/memoryusage.cpp @@ -25,6 +25,7 @@ #include #include #include +#include #ifndef WIN32 #include #endif @@ -41,13 +42,18 @@ namespace Transport { #ifndef WIN32 #ifdef BSD -void process_mem_usage(double& vm_usage, double& resident_set) { +void process_mem_usage(double& vm_usage, double& resident_set, pid_t pid) { int mib[4]; size_t size; mib[0] = CTL_KERN; mib[1] = KERN_PROC; mib[2] = KERN_PROC_PID; - mib[3] = getpid(); + if (pid == 0) { + mib[3] = getpid(); + } + else { + mib[3] = pid; + } struct kinfo_proc proc; size = sizeof(struct kinfo_proc); @@ -75,7 +81,7 @@ void process_mem_usage(double& vm_usage, double& resident_set) { vm_usage = (double) proc.ki_size; } #else /* BSD */ -void process_mem_usage(double& shared, double& resident_set) { +void process_mem_usage(double& shared, double& resident_set, pid_t pid) { using std::ios_base; using std::ifstream; using std::string; @@ -84,8 +90,11 @@ void process_mem_usage(double& shared, double& resident_set) { resident_set = 0.0; // 'file' stat seems to give the most reliable results - // - ifstream stat_stream("/proc/self/statm",ios_base::in); + std::string f = "/proc/self/statm"; + if (pid != 0) { + f = "/proc/" + boost::lexical_cast(pid) + "/statm"; + } + ifstream stat_stream(f.c_str(), ios_base::in); if (!stat_stream.is_open()) { shared = 0; resident_set = 0; @@ -94,7 +103,7 @@ void process_mem_usage(double& shared, double& resident_set) { // dummy vars for leading entries in stat that we don't care about // - string pid, comm, state, ppid, pgrp, session, tty_nr; + string pid1, comm, state, ppid, pgrp, session, tty_nr; string tpgid, flags, minflt, cminflt, majflt, cmajflt; string utime, stime, cutime, cstime, priority, nice; string O, itrealvalue, starttime; From b6645a4ed9def716fcfa63cda01478554973082f Mon Sep 17 00:00:00 2001 From: HanzZ Date: Fri, 9 Mar 2012 09:35:36 +0100 Subject: [PATCH 030/143] Store subscriptions properly in DB and change them during the subscribe process --- src/rostermanager.cpp | 31 +++++++++++++++++++++++++++++-- 1 file changed, 29 insertions(+), 2 deletions(-) diff --git a/src/rostermanager.cpp b/src/rostermanager.cpp index 65135116..4d8afba9 100644 --- a/src/rostermanager.cpp +++ b/src/rostermanager.cpp @@ -137,6 +137,11 @@ void RosterManager::sendBuddyRosterPush(Buddy *buddy) { request->send(); m_requests.push_back(request); } + + if (buddy->getSubscription() != Buddy::Both) { + buddy->setSubscription(Buddy::Both); + handleBuddyChanged(buddy); + } } void RosterManager::sendBuddySubscribePresence(Buddy *buddy) { @@ -165,6 +170,11 @@ void RosterManager::setBuddyCallback(Buddy *buddy) { sendBuddyRosterPush(buddy); } else { + if (buddy->getSubscription() == Buddy::Both) { + LOG4CXX_INFO(logger, m_user->getJID().toString() << ": Not forwarding this buddy, because subscription=both"); + return; + } + if (m_supportRemoteRoster) { sendBuddyRosterPush(buddy); } @@ -331,7 +341,7 @@ void RosterManager::handleSubscription(Swift::Presence::ref presence) { response->setType(Swift::Presence::Subscribed); break; case Swift::Presence::Subscribed: - onBuddyAdded(buddy); +// onBuddyAdded(buddy); break; // buddy is already there, so nothing to do, just answer case Swift::Presence::Unsubscribe: @@ -361,6 +371,10 @@ void RosterManager::handleSubscription(Swift::Presence::ref presence) { currentPresence->setTo(presence->getFrom()); m_component->getStanzaChannel()->sendPresence(currentPresence); } + if (buddy->getSubscription() != Buddy::Both) { + buddy->setSubscription(Buddy::Both); + handleBuddyChanged(buddy); + } break; // remove buddy case Swift::Presence::Unsubscribe: @@ -370,6 +384,19 @@ void RosterManager::handleSubscription(Swift::Presence::ref presence) { // just send response case Swift::Presence::Unsubscribed: response->setType(Swift::Presence::Unsubscribe); + // We set both here, because this Unsubscribed can be response to + // subscribe presence and we don't want that unsubscribe presence + // to be send later again + if (buddy->getSubscription() != Buddy::Both) { + buddy->setSubscription(Buddy::Both); + handleBuddyChanged(buddy); + } + break; + case Swift::Presence::Subscribed: + if (buddy->getSubscription() != Buddy::Both) { + buddy->setSubscription(Buddy::Both); + handleBuddyChanged(buddy); + } break; default: return; @@ -394,7 +421,7 @@ void RosterManager::handleSubscription(Swift::Presence::ref presence) { // buddy is already there, so nothing to do, just answer case Swift::Presence::Unsubscribe: response->setType(Swift::Presence::Unsubscribed); - onBuddyRemoved(buddy); +// onBuddyRemoved(buddy); break; // just send response case Swift::Presence::Unsubscribed: From 6ec566375c7d1fe285735519f0d11b75e969d61b Mon Sep 17 00:00:00 2001 From: HanzZ Date: Fri, 9 Mar 2012 17:13:32 +0100 Subject: [PATCH 031/143] Send backend id back to main instance --- include/transport/networkpluginserver.h | 1 + include/transport/protocol.proto | 1 + plugin/cpp/networkplugin.cpp | 8 ++++++++ src/networkpluginserver.cpp | 1 + 4 files changed, 11 insertions(+) diff --git a/include/transport/networkpluginserver.h b/include/transport/networkpluginserver.h index 671c8ba4..e0ce31f9 100644 --- a/include/transport/networkpluginserver.h +++ b/include/transport/networkpluginserver.h @@ -56,6 +56,7 @@ class NetworkPluginServer { bool acceptUsers; bool longRun; bool willDie; + std::string id; }; NetworkPluginServer(Component *component, Config *config, UserManager *userManager, FileTransferManager *ftManager); diff --git a/include/transport/protocol.proto b/include/transport/protocol.proto index 9a296392..8f3ac42c 100644 --- a/include/transport/protocol.proto +++ b/include/transport/protocol.proto @@ -106,6 +106,7 @@ message Stats { required int32 res = 1; required int32 init_res = 2; required int32 shared = 3; + required string id = 4; } message File { diff --git a/plugin/cpp/networkplugin.cpp b/plugin/cpp/networkplugin.cpp index c17adb7f..4c26515a 100644 --- a/plugin/cpp/networkplugin.cpp +++ b/plugin/cpp/networkplugin.cpp @@ -41,6 +41,12 @@ namespace Transport { wrap.set_payload(MESSAGE); \ wrap.SerializeToString(&MESSAGE); +template std::string stringOf(T object) { + std::ostringstream os; + os << object; + return (os.str()); +} + NetworkPlugin::NetworkPlugin() { m_pingReceived = false; @@ -603,6 +609,8 @@ void NetworkPlugin::sendMemoryUsage() { std::string message; stats.SerializeToString(&message); + stats.set_id(stringOf(getpid())); + WRAP(message, pbnetwork::WrapperMessage_Type_TYPE_STATS); send(message); diff --git a/src/networkpluginserver.cpp b/src/networkpluginserver.cpp index 5beba002..f3f891f0 100644 --- a/src/networkpluginserver.cpp +++ b/src/networkpluginserver.cpp @@ -612,6 +612,7 @@ void NetworkPluginServer::handleStatsPayload(Backend *c, const std::string &data c->res = payload.res(); c->init_res = payload.init_res(); c->shared = payload.shared(); + c->id = payload.id(); } void NetworkPluginServer::handleFTStartPayload(const std::string &data) { From d4769080ca30af9f9240f8a291ed9f556cc71764 Mon Sep 17 00:00:00 2001 From: HanzZ Date: Fri, 9 Mar 2012 17:55:57 +0100 Subject: [PATCH 032/143] More stats --- include/transport/networkpluginserver.h | 5 +++++ include/transport/usermanager.h | 9 +++++++++ src/networkpluginserver.cpp | 4 ++++ src/statsresponder.cpp | 18 +++++++++++++++--- src/usermanager.cpp | 2 ++ 5 files changed, 35 insertions(+), 3 deletions(-) diff --git a/include/transport/networkpluginserver.h b/include/transport/networkpluginserver.h index e0ce31f9..5572780a 100644 --- a/include/transport/networkpluginserver.h +++ b/include/transport/networkpluginserver.h @@ -71,6 +71,10 @@ class NetworkPluginServer { return m_clients; } + const std::vector &getCrashedBackends() { + return m_crashedBackends; + } + void collectBackend(); bool moveToLongRunBackend(User *user); @@ -138,6 +142,7 @@ class NetworkPluginServer { bool m_isNextLongRun; std::map m_filetransfers; FileTransferManager *m_ftManager; + std::vector m_crashedBackends; }; } diff --git a/include/transport/usermanager.h b/include/transport/usermanager.h index 5ea47d5c..2601be21 100644 --- a/include/transport/usermanager.h +++ b/include/transport/usermanager.h @@ -116,6 +116,13 @@ class UserManager : public Swift::EntityCapsProvider { /// \param user JID of user. void disconnectUser(const Swift::JID &user); + void messageToXMPPSent() { m_sentToXMPP++; } + void messageToBackendSent() { m_sentToBackend++; } + + unsigned long getMessagesToXMPP() { return m_sentToXMPP; } + unsigned long getMessagesToBackend() { return m_sentToBackend; } + + private: void handlePresence(Swift::Presence::ref presence); void handleMessageReceived(Swift::Message::ref message); @@ -134,6 +141,8 @@ class UserManager : public Swift::EntityCapsProvider { StorageResponder *m_storageResponder; UserRegistry *m_userRegistry; Swift::Timer::ref m_removeTimer; + unsigned long m_sentToXMPP; + unsigned long m_sentToBackend; friend class RosterResponder; }; diff --git a/src/networkpluginserver.cpp b/src/networkpluginserver.cpp index f3f891f0..2ae551af 100644 --- a/src/networkpluginserver.cpp +++ b/src/networkpluginserver.cpp @@ -351,6 +351,10 @@ void NetworkPluginServer::handleSessionFinished(Backend *c) { // If there are users associated with this backend, it must have crashed, so print error output // and disconnect users + if (!c->users.empty()) { + m_crashedBackends.push_back(c->id); + } + for (std::list::const_iterator it = c->users.begin(); it != c->users.end(); it++) { LOG4CXX_ERROR(logger, "Backend " << c << " disconnected (probably crashed) with active user " << (*it)->getJID().toString()); (*it)->setData(NULL); diff --git a/src/statsresponder.cpp b/src/statsresponder.cpp index 802a1bbd..bf4e4b5f 100644 --- a/src/statsresponder.cpp +++ b/src/statsresponder.cpp @@ -81,7 +81,10 @@ bool StatsResponder::handleGetRequest(const Swift::JID& from, const Swift::JID& response->addItem(StatsPayload::Item("users/online")); response->addItem(StatsPayload::Item("contacts/online")); response->addItem(StatsPayload::Item("contacts/total")); - response->addItem(StatsPayload::Item("backends")); + response->addItem(StatsPayload::Item("messages/from-xmpp")); + response->addItem(StatsPayload::Item("messages/to-xmpp")); + response->addItem(StatsPayload::Item("backends/running")); + response->addItem(StatsPayload::Item("backends/crashed")); response->addItem(StatsPayload::Item("memory-usage")); } else { @@ -115,8 +118,11 @@ bool StatsResponder::handleGetRequest(const Swift::JID& from, const Swift::JID& else if (item.getName() == "users/online") { response->addItem(StatsPayload::Item("users/online", "users", boost::lexical_cast(m_userManager->getUserCount()))); } - else if (item.getName() == "backends") { - response->addItem(StatsPayload::Item("backends", "backends", boost::lexical_cast(m_server->getBackendCount()))); + else if (item.getName() == "backends/running") { + response->addItem(StatsPayload::Item("backends/running", "backends", boost::lexical_cast(m_server->getBackendCount()))); + } + else if (item.getName() == "backends/crashed") { + response->addItem(StatsPayload::Item("backends/crashed", "backends", boost::lexical_cast(m_server->getCrashedBackends().size()))); } else if (item.getName() == "memory-usage") { response->addItem(StatsPayload::Item("memory-usage", "KB", boost::lexical_cast(usedMemory()))); @@ -127,6 +133,12 @@ bool StatsResponder::handleGetRequest(const Swift::JID& from, const Swift::JID& else if (item.getName() == "contacts/total") { response->addItem(StatsPayload::Item("contacts/total", "contacts", boost::lexical_cast(contactsTotal))); } + else if (item.getName() == "messages/from-xmpp") { + response->addItem(StatsPayload::Item("messages/from-xmpp", "messages", boost::lexical_cast(m_userManager->getMessagesToBackend()))); + } + else if (item.getName() == "messages/to-xmpp") { + response->addItem(StatsPayload::Item("messages/to-xmpp", "messages", boost::lexical_cast(m_userManager->getMessagesToXMPP()))); + } } } diff --git a/src/usermanager.cpp b/src/usermanager.cpp index 08823715..ed99e668 100644 --- a/src/usermanager.cpp +++ b/src/usermanager.cpp @@ -42,6 +42,8 @@ static LoggerPtr logger = Logger::getLogger("UserManager"); UserManager::UserManager(Component *component, UserRegistry *userRegistry, StorageBackend *storageBackend) { m_cachedUser = NULL; m_onlineBuddies = 0; + m_sentToXMPP = 0; + m_sentToBackend = 0; m_component = component; m_storageBackend = storageBackend; m_storageResponder = NULL; From 7ec58e0024366cfae4556ea6558278f2ee278203 Mon Sep 17 00:00:00 2001 From: HanzZ Date: Fri, 9 Mar 2012 18:41:58 +0100 Subject: [PATCH 033/143] fixed setting backend id --- plugin/cpp/networkplugin.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/plugin/cpp/networkplugin.cpp b/plugin/cpp/networkplugin.cpp index 4c26515a..94fc82c0 100644 --- a/plugin/cpp/networkplugin.cpp +++ b/plugin/cpp/networkplugin.cpp @@ -605,12 +605,11 @@ void NetworkPlugin::sendMemoryUsage() { stats.set_res(res + e_res); stats.set_shared(shared + e_shared); + stats.set_id(stringOf(getpid())); std::string message; stats.SerializeToString(&message); - stats.set_id(stringOf(getpid())); - WRAP(message, pbnetwork::WrapperMessage_Type_TYPE_STATS); send(message); From 5407885d87e772765b49a35d8622012f41a1ec1d Mon Sep 17 00:00:00 2001 From: HanzZ Date: Fri, 9 Mar 2012 19:36:48 +0100 Subject: [PATCH 034/143] Do not send available presence as response to subscribed --- src/rostermanager.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/rostermanager.cpp b/src/rostermanager.cpp index 4d8afba9..1bde0173 100644 --- a/src/rostermanager.cpp +++ b/src/rostermanager.cpp @@ -342,7 +342,7 @@ void RosterManager::handleSubscription(Swift::Presence::ref presence) { break; case Swift::Presence::Subscribed: // onBuddyAdded(buddy); - break; + return; // buddy is already there, so nothing to do, just answer case Swift::Presence::Unsubscribe: response->setType(Swift::Presence::Unsubscribed); @@ -397,7 +397,7 @@ void RosterManager::handleSubscription(Swift::Presence::ref presence) { buddy->setSubscription(Buddy::Both); handleBuddyChanged(buddy); } - break; + return; default: return; } From 6d09f9e42f94d9765f94706b374bc3aa46a5f9de Mon Sep 17 00:00:00 2001 From: HanzZ Date: Fri, 9 Mar 2012 20:13:33 +0100 Subject: [PATCH 035/143] Updated changelog --- ChangeLog | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/ChangeLog b/ChangeLog index d0d28034..d731f169 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,18 @@ +Version 2.0.0-beta2 (2012-XX-XX): + General: + * Fixed bug when Roster Item Exchange and subscribe stanzas were send + repeatedly. + * Fixed username_mask setting. + * Added new fields into statistics. + + libpurple: + * Added support for MUC for prpl-jabber protocol. + + Skype: + * Fixed logging issue when the logs were not stored in the proper instance + directory. + * Skype backend includes also Skype client memory usage into the account. + Version 2.0.0-beta (2012-02-28): General: * Added PostreSQL support (thanks to Jadestorm). From f522ee311c938aac030a7bc8862c0a2af974157e Mon Sep 17 00:00:00 2001 From: HanzZ Date: Fri, 9 Mar 2012 21:44:03 +0100 Subject: [PATCH 036/143] Handle buddy updates and removal in skype --- backends/skype/main.cpp | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/backends/skype/main.cpp b/backends/skype/main.cpp index a56b985d..7952bc59 100644 --- a/backends/skype/main.cpp +++ b/backends/skype/main.cpp @@ -196,6 +196,21 @@ class SpectrumNetworkPlugin : public NetworkPlugin { } } + void handleBuddyUpdatedRequest(const std::string &user, const std::string &buddyName, const std::string &alias, const std::vector &groups) { + Skype *skype = m_sessions[user]; + if (skype) { + skype->send_command("SET USER " + buddyName + " BUDDYSTATUS 2 Please authorize me"); + skype->send_command("SET USER " + buddyName + " ISAUTHORIZED TRUE"); + } + } + + void handleBuddyRemovedRequest(const std::string &user, const std::string &buddyName, const std::vector &groups) { + Skype *skype = m_sessions[user]; + if (skype) { + skype->send_command("SET USER " + buddyName + " BUDDYSTATUS 1"); + } + } + void handleMessageSendRequest(const std::string &user, const std::string &legacyName, const std::string &message, const std::string &xhtml) { Skype *skype = m_sessions[user]; if (skype) { @@ -286,13 +301,6 @@ class SpectrumNetworkPlugin : public NetworkPlugin { void handleVCardUpdatedRequest(const std::string &user, const std::string &p, const std::string &nickname) { } - void handleBuddyRemovedRequest(const std::string &user, const std::string &buddyName, const std::vector &groups) { - } - - void handleBuddyUpdatedRequest(const std::string &user, const std::string &buddyName, const std::string &alias, const std::vector &groups) { - - } - void handleBuddyBlockToggled(const std::string &user, const std::string &buddyName, bool blocked) { } From 51167fe71f1fe0667efcdc1551fdeee684951411 Mon Sep 17 00:00:00 2001 From: HanzZ Date: Sat, 10 Mar 2012 10:51:58 +0100 Subject: [PATCH 037/143] Fixed conversation creationg introduced by previous commits --- backends/libpurple/main.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backends/libpurple/main.cpp b/backends/libpurple/main.cpp index 01e24e43..ce8ad051 100644 --- a/backends/libpurple/main.cpp +++ b/backends/libpurple/main.cpp @@ -770,7 +770,7 @@ class SpectrumNetworkPlugin : public NetworkPlugin { if (account) { PurpleConversation *conv = purple_find_conversation_with_account(PURPLE_CONV_TYPE_CHAT, legacyName.c_str(), account); if (!conv) { - PurpleConversation *conv = purple_find_conversation_with_account(PURPLE_CONV_TYPE_IM, legacyName.c_str(), account); + conv = purple_find_conversation_with_account(PURPLE_CONV_TYPE_IM, legacyName.c_str(), account); if (!conv) { conv = purple_conversation_new(PURPLE_CONV_TYPE_IM, account, legacyName.c_str()); } From a9f468f8f3fe71663a581591db51d55bec39e48c Mon Sep 17 00:00:00 2001 From: HanzZ Date: Sat, 10 Mar 2012 11:22:39 +0100 Subject: [PATCH 038/143] Fill the stats --- src/networkpluginserver.cpp | 1 + src/usermanager.cpp | 1 + 2 files changed, 2 insertions(+) diff --git a/src/networkpluginserver.cpp b/src/networkpluginserver.cpp index 2ae551af..591c9650 100644 --- a/src/networkpluginserver.cpp +++ b/src/networkpluginserver.cpp @@ -579,6 +579,7 @@ void NetworkPluginServer::handleConvMessagePayload(const std::string &data, bool // Forward it conv->handleMessage(msg, payload.nickname()); + m_userManager->messageToXMPPSent(); } void NetworkPluginServer::handleAttentionPayload(const std::string &data) { diff --git a/src/usermanager.cpp b/src/usermanager.cpp index ed99e668..1845d94e 100644 --- a/src/usermanager.cpp +++ b/src/usermanager.cpp @@ -268,6 +268,7 @@ void UserManager::handleMessageReceived(Swift::Message::ref message) { } user->getConversationManager()->handleMessageReceived(message); + messageToBackendSent(); } void UserManager::handleGeneralPresenceReceived(Swift::Presence::ref presence) { From 8dba1176b5c0543cd12be6e0f4c3ed1eb9380367 Mon Sep 17 00:00:00 2001 From: HanzZ Date: Sat, 10 Mar 2012 11:31:13 +0100 Subject: [PATCH 039/143] Remove skype tmp directory before login --- backends/skype/main.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/backends/skype/main.cpp b/backends/skype/main.cpp index 7952bc59..e8a56baf 100644 --- a/backends/skype/main.cpp +++ b/backends/skype/main.cpp @@ -386,6 +386,12 @@ static gboolean create_dbus_proxy(gpointer data) { } void Skype::login() { + if (m_username.find("..") == 0 || m_username.find("/") != std::string::npos) { + np->handleDisconnected(m_user, 0, "Invalid username"); + return; + } + boost::filesystem::remove_all(std::string("/tmp/skype/") + m_username); + boost::filesystem::path path(std::string("/tmp/skype/") + m_username); if (!boost::filesystem::exists(path)) { boost::filesystem::create_directories(path); From b627e6177f20b7369a9d73829e7a846b21dcb939 Mon Sep 17 00:00:00 2001 From: HanzZ Date: Sun, 11 Mar 2012 11:31:02 +0100 Subject: [PATCH 040/143] Fixed crash in skype handleMemoryUsage --- backends/skype/main.cpp | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/backends/skype/main.cpp b/backends/skype/main.cpp index e8a56baf..0e849f4c 100644 --- a/backends/skype/main.cpp +++ b/backends/skype/main.cpp @@ -129,7 +129,9 @@ class SpectrumNetworkPlugin : public NetworkPlugin { void handleLoginRequest(const std::string &user, const std::string &legacyName, const std::string &password) { std::string name = legacyName; - name = name.substr(name.find(".") + 1); + if (name.find("skype.") == 0 || name.find("prpl-skype.") == 0) { + name = name.substr(name.find(".") + 1); + } LOG4CXX_INFO(logger, "Creating account with name '" << name << "'"); Skype *skype = new Skype(user, name, password); @@ -144,11 +146,13 @@ class SpectrumNetworkPlugin : public NetworkPlugin { shared = 0; for(std::map::const_iterator it = m_sessions.begin(); it != m_sessions.end(); it++) { Skype *skype = it->second; - double r; - double s; - process_mem_usage(s, r, skype->getPid()); - res += r; - shared += s; + if (skype) { + double r; + double s; + process_mem_usage(s, r, skype->getPid()); + res += r; + shared += s; + } } } From 7ecce75babd489c1ff1102bbc9689034a246dded Mon Sep 17 00:00:00 2001 From: HanzZ Date: Sun, 11 Mar 2012 12:08:54 +0100 Subject: [PATCH 041/143] More skype tweaks --- backends/skype/main.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/backends/skype/main.cpp b/backends/skype/main.cpp index 0e849f4c..54e7025e 100644 --- a/backends/skype/main.cpp +++ b/backends/skype/main.cpp @@ -434,7 +434,7 @@ void Skype::login() { char *db = (char *) malloc(db_path.size() + 1); strcpy(db, db_path.c_str()); LOG4CXX_INFO(logger, m_username << ": Spawning new Skype instance dbpath=" << db); - gchar* argv[6] = {"skype", "--disable-cleanlooks", "--pipelogin", "--dbpath", db, 0}; + gchar* argv[8] = {"skype", "--enable-dbus", "--use-session-dbus", "--disable-cleanlooks", "--pipelogin", "--dbpath", db, 0}; int fd; g_spawn_async_with_pipes(NULL, @@ -608,8 +608,10 @@ std::string Skype::send_command(const std::string &message) { { LOG4CXX_INFO(logger, m_username << ": DBUS Error: " << error->message); g_error_free(error); + return ""; } else { LOG4CXX_INFO(logger, m_username << ": DBUS no response"); + return ""; } } From c43a4b4fc1f3342656878959f47a2cbb02702f5d Mon Sep 17 00:00:00 2001 From: Jan Kaluza Date: Mon, 12 Mar 2012 10:48:24 +0100 Subject: [PATCH 042/143] sleep for 2 seconds before trying to connect skype using dbus and try it repeatedly when skype refuses to authenticate spectrum --- backends/skype/main.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/backends/skype/main.cpp b/backends/skype/main.cpp index 54e7025e..23ac6825 100644 --- a/backends/skype/main.cpp +++ b/backends/skype/main.cpp @@ -473,6 +473,7 @@ void Skype::login() { } } + sleep(2); m_timer = g_timeout_add_seconds(1, create_dbus_proxy, this); } @@ -499,7 +500,7 @@ bool Skype::loadSkypeBuddies() { return FALSE; } - if (re.empty() || re == "CONNSTATUS OFFLINE") { + if (re.empty() || re == "CONNSTATUS OFFLINE" || re == "ERROR 68") { return TRUE; } From 4c1285a8e1da653e3012ed12b37b6c4b41c22312 Mon Sep 17 00:00:00 2001 From: Jan Kaluza Date: Mon, 12 Mar 2012 14:02:09 +0100 Subject: [PATCH 043/143] log sent messages --- backends/skype/main.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/backends/skype/main.cpp b/backends/skype/main.cpp index 23ac6825..988a2ad1 100644 --- a/backends/skype/main.cpp +++ b/backends/skype/main.cpp @@ -430,6 +430,7 @@ void Skype::login() { "\n"; g_file_set_contents(std::string(std::string("/tmp/skype/") + m_username + "/" + m_username +"/config.xml").c_str(), config_xml.c_str(), -1, NULL); + sleep(1); std::string db_path = std::string("/tmp/skype/") + m_username; char *db = (char *) malloc(db_path.size() + 1); strcpy(db, db_path.c_str()); @@ -473,7 +474,7 @@ void Skype::login() { } } - sleep(2); + sleep(1); m_timer = g_timeout_add_seconds(1, create_dbus_proxy, this); } @@ -602,6 +603,7 @@ std::string Skype::send_command(const std::string &message) { // int message_num; // gchar error_return[30]; + LOG4CXX_INFO(logger, "Sending: " << message); if (!dbus_g_proxy_call (m_proxy, "Invoke", &error, G_TYPE_STRING, message.c_str(), G_TYPE_INVALID, G_TYPE_STRING, &str, G_TYPE_INVALID)) { From 1846c3953d39471a3975253d0224bf5151bcb370 Mon Sep 17 00:00:00 2001 From: Jan Kaluza Date: Tue, 13 Mar 2012 09:52:28 +0100 Subject: [PATCH 044/143] Fixed skype hopeful --- backends/skype/main.cpp | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/backends/skype/main.cpp b/backends/skype/main.cpp index 988a2ad1..dd8031d4 100644 --- a/backends/skype/main.cpp +++ b/backends/skype/main.cpp @@ -82,7 +82,7 @@ static pbnetwork::StatusType getStatus(const std::string &st) { class Skype { public: Skype(const std::string &user, const std::string &username, const std::string &password); - ~Skype() { logout(); } + ~Skype() { LOG4CXX_INFO(logger, "Skype instance desctuctor"); logout(); } void login(); void logout(); std::string send_command(const std::string &message); @@ -159,6 +159,7 @@ class SpectrumNetworkPlugin : public NetworkPlugin { void handleLogoutRequest(const std::string &user, const std::string &legacyName) { Skype *skype = m_sessions[user]; if (skype) { + LOG4CXX_INFO(logger, "User wants to logout, logging out"); skype->logout(); exit(1); } @@ -361,6 +362,7 @@ bool Skype::createDBusProxy() { LOG4CXX_INFO(logger, m_username << ":" << error->message); if (m_counter == 15) { + LOG4CXX_ERROR(logger, "Logging out, proxy couldn't be created"); np->handleDisconnected(m_user, 0, error->message); logout(); g_error_free(error); @@ -483,18 +485,19 @@ bool Skype::loadSkypeBuddies() { // while (re == "CONNSTATUS OFFLINE" || re.empty()) { // sleep(1); - gchar buffer[1024]; - int bytes_read = read(fd_output, buffer, 1023); - if (bytes_read > 0) { - buffer[bytes_read] = 0; - np->handleDisconnected(m_user, 0, buffer); - close(fd_output); - logout(); - return FALSE; - } +// gchar buffer[1024]; +// int bytes_read = read(fd_output, buffer, 1023); +// if (bytes_read > 0) { +// buffer[bytes_read] = 0; +// np->handleDisconnected(m_user, 0, buffer); +// close(fd_output); +// logout(); +// return FALSE; +// } std::string re = send_command("NAME Spectrum"); if (m_counter++ > 15) { + LOG4CXX_ERROR(logger, "Logging out, because we tried to connect the Skype over DBUS 15 times without success"); np->handleDisconnected(m_user, 0, ""); close(fd_output); logout(); @@ -508,6 +511,7 @@ bool Skype::loadSkypeBuddies() { close(fd_output); if (send_command("PROTOCOL 7") != "PROTOCOL 7") { + LOG4CXX_ERROR(logger, "PROTOCOL 7 failed, logging out"); np->handleDisconnected(m_user, 0, "Skype is not ready"); logout(); return FALSE; From eea254d29c46de4244adddf0f4040288ac86c298 Mon Sep 17 00:00:00 2001 From: HanzZ Date: Tue, 13 Mar 2012 21:57:09 +0100 Subject: [PATCH 045/143] log error on disconnect everytime --- src/user.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/user.cpp b/src/user.cpp index e94ae872..8cfcd0ea 100644 --- a/src/user.cpp +++ b/src/user.cpp @@ -328,7 +328,7 @@ void User::handleDisconnected(const std::string &error, Swift::SpectrumErrorPayl if (e == Swift::SpectrumErrorPayload::CONNECTION_ERROR_OTHER_ERROR || e == Swift::SpectrumErrorPayload::CONNECTION_ERROR_NETWORK_ERROR) { if (m_reconnectCounter < 3) { m_reconnectCounter++; - LOG4CXX_INFO(logger, m_jid.toString() << ": Disconnecting from legacy network for, trying to reconnect automatically."); + LOG4CXX_INFO(logger, m_jid.toString() << ": Disconnecting from legacy network " << error << ", trying to reconnect automatically."); // Simulate destruction/resurrection :) // TODO: If this stops working, create onReconnect signal m_userManager->onUserDestroyed(this); From 4cd528271c09dd3def2a01aa1399f97d313c1ffc Mon Sep 17 00:00:00 2001 From: Jan Kaluza Date: Wed, 14 Mar 2012 09:00:19 +0100 Subject: [PATCH 046/143] send info about missed calls + probably fixed Incorrect Password notification --- backends/skype/main.cpp | 49 +++++++++++++++++++++++++++++++++-------- 1 file changed, 40 insertions(+), 9 deletions(-) diff --git a/backends/skype/main.cpp b/backends/skype/main.cpp index dd8031d4..fbc765d1 100644 --- a/backends/skype/main.cpp +++ b/backends/skype/main.cpp @@ -485,15 +485,20 @@ bool Skype::loadSkypeBuddies() { // while (re == "CONNSTATUS OFFLINE" || re.empty()) { // sleep(1); -// gchar buffer[1024]; -// int bytes_read = read(fd_output, buffer, 1023); -// if (bytes_read > 0) { -// buffer[bytes_read] = 0; -// np->handleDisconnected(m_user, 0, buffer); -// close(fd_output); -// logout(); -// return FALSE; -// } + gchar buffer[1024]; + int bytes_read = read(fd_output, buffer, 1023); + if (bytes_read > 0) { + buffer[bytes_read] = 0; + std::string b(buffer); + LOG4CXX_WARN(logger, "Skype wrote this on stdout '" << b << "'"); + if (b.find("Incorrect Password") != std::string::npos) { + LOG4CXX_INFO(logger, "Incorrect password, logging out") + np->handleDisconnected(m_user, 0, "Incorrect password"); + close(fd_output); + logout(); + return FALSE; + } + } std::string re = send_command("NAME Spectrum"); if (m_counter++ > 15) { @@ -710,6 +715,32 @@ static void handle_skype_message(std::string &message, Skype *sk) { np->handleMessage(sk->getUser(), from, body); } } + else if (cmd[0] == "CALL") { + // CALL 884 STATUS RINGING + if (cmd[2] == "STATUS") { + if (cmd[3] == "RINGING" || cmd[3] == "MISSED") { + // handle only incoming calls + std::string type = sk->send_command("GET CALL " + cmd[1] + " TYPE"); + type = type.substr(type.find("TYPE") + 5); + if (type.find("INCOMING") != 0) { + return; + } + + std::string from = sk->send_command("GET CALL " + cmd[1] + " PARTNER_HANDLE"); + from = from.substr(from.find("PARTNER_HANDLE") + 15); + + std::string dispname = sk->send_command("GET CALL " + cmd[1] + " PARTNER_DISPNAME"); + dispname = dispname.substr(dispname.find("PARTNER_DISPNAME") + 17); + + if (cmd[3] == "RINGING") { + np->handleMessage(sk->getUser(), from, "User " + dispname + " is calling you."); + } + else { + np->handleMessage(sk->getUser(), from, "You have missed call from user " + dispname + "."); + } + } + } + } } DBusHandlerResult skype_notify_handler(DBusConnection *connection, DBusMessage *message, gpointer user_data) { From 55c27481103e63e8cd18bb8cebf01bd4f9606955 Mon Sep 17 00:00:00 2001 From: Jan Kaluza Date: Wed, 14 Mar 2012 09:22:29 +0100 Subject: [PATCH 047/143] Removed unrecognized commands --- backends/skype/main.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backends/skype/main.cpp b/backends/skype/main.cpp index fbc765d1..4622f464 100644 --- a/backends/skype/main.cpp +++ b/backends/skype/main.cpp @@ -437,7 +437,7 @@ void Skype::login() { char *db = (char *) malloc(db_path.size() + 1); strcpy(db, db_path.c_str()); LOG4CXX_INFO(logger, m_username << ": Spawning new Skype instance dbpath=" << db); - gchar* argv[8] = {"skype", "--enable-dbus", "--use-session-dbus", "--disable-cleanlooks", "--pipelogin", "--dbpath", db, 0}; + gchar* argv[6] = {"skype", "--disable-cleanlooks", "--pipelogin", "--dbpath", db, 0}; int fd; g_spawn_async_with_pipes(NULL, From 0e01945c9839eaeec61af49db1920cb5cf8fe628 Mon Sep 17 00:00:00 2001 From: Jan Kaluza Date: Wed, 14 Mar 2012 14:48:24 +0100 Subject: [PATCH 048/143] Forward proper errors to XMPP user instead of Internal Server Error --- backends/skype/main.cpp | 10 +++++----- spectrum/src/sample.cfg | 3 ++- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/backends/skype/main.cpp b/backends/skype/main.cpp index 4622f464..137c7b8a 100644 --- a/backends/skype/main.cpp +++ b/backends/skype/main.cpp @@ -363,7 +363,7 @@ bool Skype::createDBusProxy() { if (m_counter == 15) { LOG4CXX_ERROR(logger, "Logging out, proxy couldn't be created"); - np->handleDisconnected(m_user, 0, error->message); + np->handleDisconnected(m_user, pbnetwork::CONNECTION_ERROR_AUTHENTICATION_IMPOSSIBLE, error->message); logout(); g_error_free(error); return FALSE; @@ -393,7 +393,7 @@ static gboolean create_dbus_proxy(gpointer data) { void Skype::login() { if (m_username.find("..") == 0 || m_username.find("/") != std::string::npos) { - np->handleDisconnected(m_user, 0, "Invalid username"); + np->handleDisconnected(m_user, pbnetwork::CONNECTION_ERROR_AUTHENTICATION_IMPOSSIBLE, "Invalid username"); return; } boost::filesystem::remove_all(std::string("/tmp/skype/") + m_username); @@ -493,7 +493,7 @@ bool Skype::loadSkypeBuddies() { LOG4CXX_WARN(logger, "Skype wrote this on stdout '" << b << "'"); if (b.find("Incorrect Password") != std::string::npos) { LOG4CXX_INFO(logger, "Incorrect password, logging out") - np->handleDisconnected(m_user, 0, "Incorrect password"); + np->handleDisconnected(m_user, pbnetwork::CONNECTION_ERROR_AUTHENTICATION_FAILED, "Incorrect password"); close(fd_output); logout(); return FALSE; @@ -503,7 +503,7 @@ bool Skype::loadSkypeBuddies() { std::string re = send_command("NAME Spectrum"); if (m_counter++ > 15) { LOG4CXX_ERROR(logger, "Logging out, because we tried to connect the Skype over DBUS 15 times without success"); - np->handleDisconnected(m_user, 0, ""); + np->handleDisconnected(m_user, pbnetwork::CONNECTION_ERROR_AUTHENTICATION_IMPOSSIBLE, "Skype is not read."); close(fd_output); logout(); return FALSE; @@ -517,7 +517,7 @@ bool Skype::loadSkypeBuddies() { if (send_command("PROTOCOL 7") != "PROTOCOL 7") { LOG4CXX_ERROR(logger, "PROTOCOL 7 failed, logging out"); - np->handleDisconnected(m_user, 0, "Skype is not ready"); + np->handleDisconnected(m_user, pbnetwork::CONNECTION_ERROR_AUTHENTICATION_IMPOSSIBLE, "Skype is not ready"); logout(); return FALSE; } diff --git a/spectrum/src/sample.cfg b/spectrum/src/sample.cfg index d0e234e9..57e601eb 100644 --- a/spectrum/src/sample.cfg +++ b/spectrum/src/sample.cfg @@ -13,11 +13,12 @@ admin_password=test #cert=server.pfx #patch to PKCS#12 certificate #cert_password=test #password to that certificate if any users_per_backend=10 -backend=/home/hanzz/code/libtransport/backends/libpurple/spectrum2_libpurple_backend +#backend=/home/hanzz/code/libtransport/backends/libpurple/spectrum2_libpurple_backend #backend=/home/hanzz/code/libtransport/backends/smstools3/spectrum2_smstools3_backend #backend=/usr/bin/mono /home/hanzz/code/networkplugin-csharp/msnp-sharp-backend/bin/Debug/msnp-sharp-backend.exe #backend=/home/hanzz/code/libtransport/backends/frotz/spectrum2_frotz_backend #backend=/home/hanzz/code/libtransport/backends/libircclient-qt/spectrum2_libircclient-qt_backend +backend=/usr/bin/xvfb-run -n BACKEND_ID -s "-screen 0 10x10x8" -f /tmp/x-skype-gw /home/hanzz/code/libtransport/backends/skype/spectrum2_skype_backend #protocol=prpl-msn protocol=any #protocol=prpl-icq From c6c322f51f948d64336eedf538b470b7604aa5f0 Mon Sep 17 00:00:00 2001 From: HanzZ Date: Wed, 14 Mar 2012 18:11:32 +0100 Subject: [PATCH 049/143] Logs shows backends PID + there's new crashed_backends command to find out PIDs of crashed backends to make log inspection easier --- src/admininterface.cpp | 21 +++++++++++++++------ src/networkpluginserver.cpp | 12 ++++++------ 2 files changed, 21 insertions(+), 12 deletions(-) diff --git a/src/admininterface.cpp b/src/admininterface.cpp index 7df84772..cec4dfa6 100644 --- a/src/admininterface.cpp +++ b/src/admininterface.cpp @@ -112,7 +112,7 @@ void AdminInterface::handleMessageReceived(Swift::Message::ref message) { const std::list &backends = m_server->getBackends(); for (std::list ::const_iterator b = backends.begin(); b != backends.end(); b++) { NetworkPluginServer::Backend *backend = *b; - lst += "Backend " + boost::lexical_cast(id); + lst += "Backend " + boost::lexical_cast(id) + " (ID=" + backend->id + ")"; lst += backend->acceptUsers ? "" : " - not-accepting"; lst += backend->longRun ? " - long-running" : ""; lst += ":\n"; @@ -204,7 +204,7 @@ void AdminInterface::handleMessageReceived(Swift::Message::ref message) { int id = 1; const std::list &backends = m_server->getBackends(); BOOST_FOREACH(NetworkPluginServer::Backend * backend, backends) { - lst += "Backend " + boost::lexical_cast(id) + ": " + boost::lexical_cast(backend->res) + "\n"; + lst += "Backend " + boost::lexical_cast(id) + " (ID=" + backend->id + "): " + boost::lexical_cast(backend->res) + "\n"; id++; } @@ -215,7 +215,7 @@ void AdminInterface::handleMessageReceived(Swift::Message::ref message) { int id = 1; const std::list &backends = m_server->getBackends(); BOOST_FOREACH(NetworkPluginServer::Backend * backend, backends) { - lst += "Backend " + boost::lexical_cast(id) + ": " + boost::lexical_cast(backend->shared) + "\n"; + lst += "Backend " + boost::lexical_cast(id) + " (ID=" + backend->id + "): " + boost::lexical_cast(backend->shared) + "\n"; id++; } @@ -226,7 +226,7 @@ void AdminInterface::handleMessageReceived(Swift::Message::ref message) { int id = 1; const std::list &backends = m_server->getBackends(); BOOST_FOREACH(NetworkPluginServer::Backend * backend, backends) { - lst += "Backend " + boost::lexical_cast(id) + ": " + boost::lexical_cast(backend->res - backend->shared) + "\n"; + lst += "Backend " + boost::lexical_cast(id) + " (ID=" + backend->id + "): " + boost::lexical_cast(backend->res - backend->shared) + "\n"; id++; } @@ -238,10 +238,10 @@ void AdminInterface::handleMessageReceived(Swift::Message::ref message) { const std::list &backends = m_server->getBackends(); BOOST_FOREACH(NetworkPluginServer::Backend * backend, backends) { if (backend->users.size() == 0) { - lst += "Backend " + boost::lexical_cast(id) + ": 0\n"; + lst += "Backend " + boost::lexical_cast(id) + " (ID=" + backend->id + "): 0\n"; } else { - lst += "Backend " + boost::lexical_cast(id) + ": " + boost::lexical_cast((backend->res - backend->init_res) / backend->users.size()) + "\n"; + lst += "Backend " + boost::lexical_cast(id) + " (ID=" + backend->id + "): " + boost::lexical_cast((backend->res - backend->init_res) / backend->users.size()) + "\n"; } id++; } @@ -251,6 +251,14 @@ void AdminInterface::handleMessageReceived(Swift::Message::ref message) { else if (message->getBody() == "collect_backend") { m_server->collectBackend(); } + else if (message->getBody() == "crashed_backends") { + std::string lst; + const std::vector &backends = m_server->getCrashedBackends(); + BOOST_FOREACH(const std::string &backend, backends) { + lst += backend + "\n"; + } + message->setBody(lst); + } else if (message->getBody().find("help") == 0) { std::string help; help += "General:\n"; @@ -263,6 +271,7 @@ void AdminInterface::handleMessageReceived(Swift::Message::ref message) { help += " has_online_user - returns 1 if user is online\n"; help += "Backends:\n"; help += " backends_count - number of active backends\n"; + help += " crashed_backends - returns IDs of crashed backends\n"; help += "Memory:\n"; help += " res_memory - Total RESident memory spectrum2 and its backends use in KB\n"; help += " shr_memory - Total SHaRed memory spectrum2 backends share together in KB\n"; diff --git a/src/networkpluginserver.cpp b/src/networkpluginserver.cpp index 591c9650..a36699be 100644 --- a/src/networkpluginserver.cpp +++ b/src/networkpluginserver.cpp @@ -344,7 +344,7 @@ void NetworkPluginServer::handleNewClientConnection(boost::shared_ptrgetJID().toString()); + LOG4CXX_ERROR(logger, "Backend " << c << " (ID=" << c->id << ") disconnected (probably crashed) with active user " << (*it)->getJID().toString()); (*it)->setData(NULL); (*it)->handleDisconnected("Internal Server Error, please reconnect."); } @@ -864,12 +864,12 @@ void NetworkPluginServer::pingTimeout() { sendPing((*it)); } else { - LOG4CXX_INFO(logger, "Disconnecting backend " << (*it) << ". PING response not received."); + LOG4CXX_INFO(logger, "Disconnecting backend " << (*it) << " (ID=" << (*it)->id << "). PING response not received."); toRemove.push_back(*it); } if ((*it)->users.size() == 0) { - LOG4CXX_INFO(logger, "Disconnecting backend " << (*it) << ". There are no users."); + LOG4CXX_INFO(logger, "Disconnecting backend " << (*it) << " (ID=" << (*it)->id << "). There are no users."); toRemove.push_back(*it); } } @@ -898,7 +898,7 @@ void NetworkPluginServer::collectBackend() { if (m_collectTimer) { m_collectTimer->start(); } - LOG4CXX_INFO(logger, "Backend " << backend << "is set to die"); + LOG4CXX_INFO(logger, "Backend " << backend << " (ID=" << backend->id << ") is set to die"); backend->acceptUsers = false; } } @@ -1366,7 +1366,7 @@ void NetworkPluginServer::sendPing(Backend *c) { wrap.SerializeToString(&message); if (c->connection) { - LOG4CXX_INFO(logger, "PING to " << c); + LOG4CXX_INFO(logger, "PING to " << c << " (ID=" << c->id << ")"); send(c->connection, message); c->pongReceived = false; } From 48f2d9d6b146b8a395ee474a625e44d110644089 Mon Sep 17 00:00:00 2001 From: HanzZ Date: Wed, 14 Mar 2012 18:56:23 +0100 Subject: [PATCH 050/143] Moved database initialization into StorageBackend --- backends/smstools3/main.cpp | 53 ++++------------------------ include/transport/storagebackend.h | 4 +++ spectrum/src/main.cpp | 55 ++++-------------------------- 3 files changed, 18 insertions(+), 94 deletions(-) diff --git a/backends/smstools3/main.cpp b/backends/smstools3/main.cpp index 1b0bb044..c152ef4f 100644 --- a/backends/smstools3/main.cpp +++ b/backends/smstools3/main.cpp @@ -337,55 +337,16 @@ int main (int argc, char* argv[]) { log4cxx::PropertyConfigurator::configure(p); } -#ifdef WITH_SQLITE - if (CONFIG_STRING(&config, "database.type") == "sqlite3") { - storageBackend = new SQLite3Backend(&config); - if (!storageBackend->connect()) { - std::cerr << "Can't connect to database. Check the log to find out the reason.\n"; - return -1; - } - } -#else - if (CONFIG_STRING(&config, "database.type") == "sqlite3") { - std::cerr << "Spectrum2 is not compiled with mysql backend.\n"; + std::string error; + storageBackend = StorageBackend::createBackend(&config, error); + if (storageBackend == NULL) { + std::cerr << error << "\n"; return -2; } -#endif -#ifdef WITH_MYSQL - if (CONFIG_STRING(&config, "database.type") == "mysql") { - storageBackend = new MySQLBackend(&config); - if (!storageBackend->connect()) { - std::cerr << "Can't connect to database. Check the log to find out the reason.\n"; - return -1; - } - } -#else - if (CONFIG_STRING(&config, "database.type") == "mysql") { - std::cerr << "Spectrum2 is not compiled with mysql backend.\n"; - return -2; - } -#endif - -#ifdef WITH_PQXX - if (CONFIG_STRING(&config, "database.type") == "pqxx") { - storageBackend = new PQXXBackend(&config); - if (!storageBackend->connect()) { - std::cerr << "Can't connect to database. Check the log to find out the reason.\n"; - return -1; - } - } -#else - if (CONFIG_STRING(&config, "database.type") == "pqxx") { - std::cerr << "Spectrum2 is not compiled with pqxx backend.\n"; - return -2; - } -#endif - - if (CONFIG_STRING(&config, "database.type") != "mysql" && CONFIG_STRING(&config, "database.type") != "sqlite3" - && CONFIG_STRING(&config, "database.type") != "pqxx" && CONFIG_STRING(&config, "database.type") != "none") { - std::cerr << "Unknown storage backend " << CONFIG_STRING(&config, "database.type") << "\n"; - return -2; + if (!storageBackend->connect()) { + std::cerr << "Can't connect to database. Check the log to find out the reason.\n"; + return -1; } Swift::SimpleEventLoop eventLoop; diff --git a/include/transport/storagebackend.h b/include/transport/storagebackend.h index 6bac4aa7..f0a13df5 100644 --- a/include/transport/storagebackend.h +++ b/include/transport/storagebackend.h @@ -80,6 +80,8 @@ struct BuddyInfo { int flags; }; +class Config; + /// Abstract class defining storage backends. class StorageBackend { @@ -87,6 +89,8 @@ class StorageBackend /// Virtual desctructor. virtual ~StorageBackend() {} + static StorageBackend *createBackend(Config *config, std::string &error); + /// connect virtual bool connect() = 0; diff --git a/spectrum/src/main.cpp b/spectrum/src/main.cpp index d05bdeb8..02e9e226 100644 --- a/spectrum/src/main.cpp +++ b/spectrum/src/main.cpp @@ -349,57 +349,16 @@ int main(int argc, char **argv) component_ = &transport; // Logger logger(&transport); - StorageBackend *storageBackend = NULL; - -#ifdef WITH_SQLITE - if (CONFIG_STRING(&config, "database.type") == "sqlite3") { - storageBackend = new SQLite3Backend(&config); - if (!storageBackend->connect()) { - std::cerr << "Can't connect to database. Check the log to find out the reason.\n"; - return -1; - } - } -#else - if (CONFIG_STRING(&config, "database.type") == "sqlite3") { - std::cerr << "Spectrum2 is not compiled with mysql backend.\n"; + std::string error; + StorageBackend *storageBackend = StorageBackend::createBackend(&config, error); + if (storageBackend == NULL) { + std::cerr << error << "\n"; return -2; } -#endif -#ifdef WITH_MYSQL - if (CONFIG_STRING(&config, "database.type") == "mysql") { - storageBackend = new MySQLBackend(&config); - if (!storageBackend->connect()) { - std::cerr << "Can't connect to database. Check the log to find out the reason.\n"; - return -1; - } - } -#else - if (CONFIG_STRING(&config, "database.type") == "mysql") { - std::cerr << "Spectrum2 is not compiled with mysql backend.\n"; - return -2; - } -#endif - -#ifdef WITH_PQXX - if (CONFIG_STRING(&config, "database.type") == "pqxx") { - storageBackend = new PQXXBackend(&config); - if (!storageBackend->connect()) { - std::cerr << "Can't connect to database. Check the log to find out the reason.\n"; - return -1; - } - } -#else - if (CONFIG_STRING(&config, "database.type") == "pqxx") { - std::cerr << "Spectrum2 is not compiled with pqxx backend.\n"; - return -2; - } -#endif - - if (CONFIG_STRING(&config, "database.type") != "mysql" && CONFIG_STRING(&config, "database.type") != "sqlite3" - && CONFIG_STRING(&config, "database.type") != "pqxx" && CONFIG_STRING(&config, "database.type") != "none") { - std::cerr << "Unknown storage backend " << CONFIG_STRING(&config, "database.type") << "\n"; - return -2; + if (!storageBackend->connect()) { + std::cerr << "Can't connect to database. Check the log to find out the reason.\n"; + return -1; } UserManager userManager(&transport, &userRegistry, storageBackend); From a06a47ed110e45de38e60259955c4cfaf87a1b88 Mon Sep 17 00:00:00 2001 From: HanzZ Date: Wed, 14 Mar 2012 21:18:10 +0100 Subject: [PATCH 051/143] moved log4cxx initialization to libtransport --- backends/libcommuni/main.cpp | 26 +------ backends/skype/main.cpp | 14 +--- backends/smstools3/main.cpp | 37 +++------- include/transport/logging.h | 39 +++++++++++ spectrum/src/main.cpp | 77 +++----------------- src/logging.cpp | 132 +++++++++++++++++++++++++++++++++++ src/storagebackend.cpp | 49 +++++++++++++ 7 files changed, 240 insertions(+), 134 deletions(-) create mode 100644 include/transport/logging.h create mode 100644 src/logging.cpp create mode 100644 src/storagebackend.cpp diff --git a/backends/libcommuni/main.cpp b/backends/libcommuni/main.cpp index f5af84fb..6443c2bd 100644 --- a/backends/libcommuni/main.cpp +++ b/backends/libcommuni/main.cpp @@ -10,6 +10,7 @@ #include "transport/config.h" #include "transport/networkplugin.h" +#include "transport/logging.h" #include "session.h" #include #include @@ -83,30 +84,7 @@ int main (int argc, char* argv[]) { } QCoreApplication app(argc, argv); - if (CONFIG_STRING(&config, "logging.backend_config").empty()) { - LoggerPtr root = log4cxx::Logger::getRootLogger(); -#ifndef _MSC_VER - root->addAppender(new ConsoleAppender(new PatternLayout("%d %-5p %c: %m%n"))); -#else - root->addAppender(new ConsoleAppender(new PatternLayout(L"%d %-5p %c: %m%n"))); -#endif - } - else { - log4cxx::helpers::Properties p; - log4cxx::helpers::FileInputStream *istream = new log4cxx::helpers::FileInputStream(CONFIG_STRING(&config, "logging.backend_config")); - p.load(istream); - LogString pid, jid; - log4cxx::helpers::Transcoder::decode(boost::lexical_cast(getpid()), pid); - log4cxx::helpers::Transcoder::decode(CONFIG_STRING(&config, "service.jid"), jid); -#ifdef _MSC_VER - p.setProperty(L"pid", pid); - p.setProperty(L"jid", jid); -#else - p.setProperty("pid", pid); - p.setProperty("jid", jid); -#endif - log4cxx::PropertyConfigurator::configure(p); - } + Logging::initBackendLogging(&config); Swift::QtEventLoop eventLoop; diff --git a/backends/skype/main.cpp b/backends/skype/main.cpp index 137c7b8a..40118f67 100644 --- a/backends/skype/main.cpp +++ b/backends/skype/main.cpp @@ -2,6 +2,7 @@ #include #include "transport/config.h" +#include "transport/logging.h" #include "transport/transport.h" #include "transport/usermanager.h" #include "transport/memoryusage.h" @@ -901,18 +902,7 @@ int main(int argc, char **argv) { return 1; } - if (CONFIG_STRING(&config, "logging.backend_config").empty()) { - LoggerPtr root = log4cxx::Logger::getRootLogger(); - root->addAppender(new ConsoleAppender(new PatternLayout("%d %-5p %c: %m%n"))); - } - else { - log4cxx::helpers::Properties p; - log4cxx::helpers::FileInputStream *istream = new log4cxx::helpers::FileInputStream(CONFIG_STRING(&config, "logging.backend_config")); - - p.load(istream); - p.setProperty("pid", boost::lexical_cast(getpid())); - log4cxx::PropertyConfigurator::configure(p); - } + Logging::initBackendLogging(&config); // initPurple(config); diff --git a/backends/smstools3/main.cpp b/backends/smstools3/main.cpp index c152ef4f..a6502bdc 100644 --- a/backends/smstools3/main.cpp +++ b/backends/smstools3/main.cpp @@ -9,6 +9,7 @@ */ #include "transport/config.h" +#include "transport/logging.h" #include "transport/networkplugin.h" #include "transport/sqlite3backend.h" #include "transport/mysqlbackend.h" @@ -312,39 +313,17 @@ int main (int argc, char* argv[]) { return 1; } - if (CONFIG_STRING(&config, "logging.backend_config").empty()) { - LoggerPtr root = log4cxx::Logger::getRootLogger(); -#ifndef _MSC_VER - root->addAppender(new ConsoleAppender(new PatternLayout("%d %-5p %c: %m%n"))); -#else - root->addAppender(new ConsoleAppender(new PatternLayout(L"%d %-5p %c: %m%n"))); -#endif - } - else { - log4cxx::helpers::Properties p; - log4cxx::helpers::FileInputStream *istream = new log4cxx::helpers::FileInputStream(CONFIG_STRING(&config, "logging.backend_config")); - p.load(istream); - LogString pid, jid; - log4cxx::helpers::Transcoder::decode(boost::lexical_cast(getpid()), pid); - log4cxx::helpers::Transcoder::decode(CONFIG_STRING(&config, "service.jid"), jid); -#ifdef _MSC_VER - p.setProperty(L"pid", pid); - p.setProperty(L"jid", jid); -#else - p.setProperty("pid", pid); - p.setProperty("jid", jid); -#endif - log4cxx::PropertyConfigurator::configure(p); - } + Logging::initBackendLogging(&config); std::string error; - storageBackend = StorageBackend::createBackend(&config, error); + StorageBackend *storageBackend = StorageBackend::createBackend(&config, error); if (storageBackend == NULL) { - std::cerr << error << "\n"; - return -2; + if (!error.empty()) { + std::cerr << error << "\n"; + return -2; + } } - - if (!storageBackend->connect()) { + else if (!storageBackend->connect()) { std::cerr << "Can't connect to database. Check the log to find out the reason.\n"; return -1; } diff --git a/include/transport/logging.h b/include/transport/logging.h new file mode 100644 index 00000000..79b1dfd5 --- /dev/null +++ b/include/transport/logging.h @@ -0,0 +1,39 @@ +/** + * libtransport -- C++ library for easy XMPP Transports development + * + * Copyright (C) 2011, Jan Kaluza + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA + */ + +#pragma once + +#include +#include +#include +#include + +namespace Transport { + +class Config; + +namespace Logging { + +void initBackendLogging(Config *config); +void initMainLogging(Config *config); + +} + +} diff --git a/spectrum/src/main.cpp b/spectrum/src/main.cpp index 02e9e226..be525f60 100644 --- a/spectrum/src/main.cpp +++ b/spectrum/src/main.cpp @@ -13,6 +13,7 @@ #include "transport/usersreconnecter.h" #include "transport/util.h" #include "transport/gatewayresponder.h" +#include "transport/logging.h" #include "Swiften/EventLoop/SimpleEventLoop.h" #include #include @@ -235,71 +236,7 @@ int main(int argc, char **argv) } #endif - if (CONFIG_STRING(&config, "logging.config").empty()) { - LoggerPtr root = log4cxx::Logger::getRootLogger(); -#ifdef WIN32 - root->addAppender(new ConsoleAppender(new PatternLayout(L"%d %-5p %c: %m%n"))); -#else - root->addAppender(new ConsoleAppender(new PatternLayout("%d %-5p %c: %m%n"))); -#endif - } - else { - log4cxx::helpers::Properties p; - log4cxx::helpers::FileInputStream *istream = new log4cxx::helpers::FileInputStream(CONFIG_STRING(&config, "logging.config")); - - p.load(istream); - LogString pid, jid; - log4cxx::helpers::Transcoder::decode(boost::lexical_cast(getpid()), pid); - log4cxx::helpers::Transcoder::decode(CONFIG_STRING(&config, "service.jid"), jid); -#ifdef WIN32 - p.setProperty(L"pid", pid); - p.setProperty(L"jid", jid); -#else - p.setProperty("pid", pid); - p.setProperty("jid", jid); -#endif - - std::string dir; - BOOST_FOREACH(const log4cxx::LogString &prop, p.propertyNames()) { - if (boost::ends_with(prop, ".File")) { - log4cxx::helpers::Transcoder::encode(p.get(prop), dir); - boost::replace_all(dir, "${jid}", jid); - break; - } - } - - if (!dir.empty()) { - // create directories - try { - boost::filesystem::create_directories( - boost::filesystem::path(dir).parent_path().string() - ); - } - catch (...) { - std::cerr << "Can't create logging directory directory " << boost::filesystem::path(dir).parent_path().string() << ".\n"; - return 1; - } - -#ifndef WIN32 - if (!CONFIG_STRING(&config, "service.group").empty() && !CONFIG_STRING(&config, "service.user").empty()) { - struct group *gr; - if ((gr = getgrnam(CONFIG_STRING(&config, "service.group").c_str())) == NULL) { - std::cerr << "Invalid service.group name " << CONFIG_STRING(&config, "service.group") << "\n"; - return 1; - } - struct passwd *pw; - if ((pw = getpwnam(CONFIG_STRING(&config, "service.user").c_str())) == NULL) { - std::cerr << "Invalid service.user name " << CONFIG_STRING(&config, "service.user") << "\n"; - return 1; - } - chown(dir.c_str(), pw->pw_uid, gr->gr_gid); - } - -#endif - } - - log4cxx::PropertyConfigurator::configure(p); - } + Logging::initMainLogging(&config); #ifndef WIN32 if (!CONFIG_STRING(&config, "service.group").empty() ||!CONFIG_STRING(&config, "service.user").empty() ) { @@ -352,11 +289,12 @@ int main(int argc, char **argv) std::string error; StorageBackend *storageBackend = StorageBackend::createBackend(&config, error); if (storageBackend == NULL) { - std::cerr << error << "\n"; - return -2; + if (!error.empty()) { + std::cerr << error << "\n"; + return -2; + } } - - if (!storageBackend->connect()) { + else if (!storageBackend->connect()) { std::cerr << "Can't connect to database. Check the log to find out the reason.\n"; return -1; } @@ -399,4 +337,5 @@ int main(int argc, char **argv) delete storageBackend; delete factories; + return 0; } diff --git a/src/logging.cpp b/src/logging.cpp new file mode 100644 index 00000000..19dee6cf --- /dev/null +++ b/src/logging.cpp @@ -0,0 +1,132 @@ +/** + * libtransport -- C++ library for easy XMPP Transports development + * + * Copyright (C) 2011, Jan Kaluza + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA + */ + +#include "transport/logging.h" +#include "transport/config.h" +#include +#include +#include +#include + +#include "log4cxx/logger.h" +#include "log4cxx/consoleappender.h" +#include "log4cxx/patternlayout.h" +#include "log4cxx/propertyconfigurator.h" +#include "log4cxx/helpers/properties.h" +#include "log4cxx/helpers/fileinputstream.h" +#include "log4cxx/helpers/transcoder.h" +#include +#include + +#ifndef WIN32 +#include "sys/signal.h" +#include +#include +#include +#include "libgen.h" +#else +#include +#endif + +using namespace boost::filesystem; +using namespace log4cxx; + +namespace Transport { + +namespace Logging { + +static LoggerPtr root; + +static void initLogging(Config *config, std::string key) { + if (CONFIG_STRING(config, key).empty()) { + root = log4cxx::Logger::getRootLogger(); +#ifdef WIN32 + root->addAppender(new ConsoleAppender(new PatternLayout(L"%d %-5p %c: %m%n"))); +#else + root->addAppender(new ConsoleAppender(new PatternLayout("%d %-5p %c: %m%n"))); +#endif + } + else { + log4cxx::helpers::Properties p; + log4cxx::helpers::FileInputStream *istream = new log4cxx::helpers::FileInputStream(CONFIG_STRING(config, key)); + + p.load(istream); + LogString pid, jid; + log4cxx::helpers::Transcoder::decode(boost::lexical_cast(getpid()), pid); + log4cxx::helpers::Transcoder::decode(CONFIG_STRING(config, "service.jid"), jid); +#ifdef WIN32 + p.setProperty(L"pid", pid); + p.setProperty(L"jid", jid); +#else + p.setProperty("pid", pid); + p.setProperty("jid", jid); +#endif + + std::string dir; + BOOST_FOREACH(const log4cxx::LogString &prop, p.propertyNames()) { + if (boost::ends_with(prop, ".File")) { + log4cxx::helpers::Transcoder::encode(p.get(prop), dir); + boost::replace_all(dir, "${jid}", jid); + break; + } + } + + if (!dir.empty()) { + // create directories + try { + boost::filesystem::create_directories( + boost::filesystem::path(dir).parent_path().string() + ); + } + catch (...) { + std::cerr << "Can't create logging directory directory " << boost::filesystem::path(dir).parent_path().string() << ".\n"; + } + +#ifndef WIN32 + if (!CONFIG_STRING(config, "service.group").empty() && !CONFIG_STRING(config, "service.user").empty()) { + struct group *gr; + if ((gr = getgrnam(CONFIG_STRING(config, "service.group").c_str())) == NULL) { + std::cerr << "Invalid service.group name " << CONFIG_STRING(config, "service.group") << "\n"; + } + struct passwd *pw; + if ((pw = getpwnam(CONFIG_STRING(config, "service.user").c_str())) == NULL) { + std::cerr << "Invalid service.user name " << CONFIG_STRING(config, "service.user") << "\n"; + } + chown(dir.c_str(), pw->pw_uid, gr->gr_gid); + } + +#endif + } + + log4cxx::PropertyConfigurator::configure(p); + } +} + +void initBackendLogging(Config *config) { + initLogging(config, "logging.backend_config"); +} + +void initMainLogging(Config *config) { + initLogging(config, "logging.config"); +} + +} + +} diff --git a/src/storagebackend.cpp b/src/storagebackend.cpp new file mode 100644 index 00000000..17657a48 --- /dev/null +++ b/src/storagebackend.cpp @@ -0,0 +1,49 @@ +#include "transport/storagebackend.h" +#include "transport/config.h" + +#include "transport/sqlite3backend.h" +#include "transport/mysqlbackend.h" +#include "transport/pqxxbackend.h" + +namespace Transport { + +StorageBackend *StorageBackend::createBackend(Config *config, std::string &error) { + StorageBackend *storageBackend = NULL; +#ifdef WITH_SQLITE + if (CONFIG_STRING(config, "database.type") == "sqlite3") { + storageBackend = new SQLite3Backend(config); + } +#else + if (CONFIG_STRING(config, "database.type") == "sqlite3") { + error = "Libtransport is not compiled with sqlite3 backend support."; + } +#endif + +#ifdef WITH_MYSQL + if (CONFIG_STRING(config, "database.type") == "mysql") { + storageBackend = new MySQLBackend(config); + } +#else + if (CONFIG_STRING(config, "database.type") == "mysql") { + error = "Spectrum2 is not compiled with mysql backend support."; + } +#endif + +#ifdef WITH_PQXX + if (CONFIG_STRING(config, "database.type") == "pqxx") { + storageBackend = new PQXXBackend(config); + } +#else + if (CONFIG_STRING(config, "database.type") == "pqxx") { + error = "Spectrum2 is not compiled with pqxx backend support."; + } +#endif + + if (CONFIG_STRING(config, "database.type") != "mysql" && CONFIG_STRING(config, "database.type") != "sqlite3" + && CONFIG_STRING(config, "database.type") != "pqxx" && CONFIG_STRING(config, "database.type") != "none") { + error = "Unknown storage backend " + CONFIG_STRING(config, "database.type"); + } + return storageBackend; +} + +} From 23457aedcfa77ae0e22cde112eadc3d086c677e4 Mon Sep 17 00:00:00 2001 From: Jan Kaluza Date: Thu, 15 Mar 2012 08:09:41 +0100 Subject: [PATCH 052/143] GET_PROPERTY in Skype --- backends/skype/main.cpp | 93 ++++++++++++++++------------------------- spectrum/src/sample.cfg | 2 +- 2 files changed, 38 insertions(+), 57 deletions(-) diff --git a/backends/skype/main.cpp b/backends/skype/main.cpp index 40118f67..6731b96b 100644 --- a/backends/skype/main.cpp +++ b/backends/skype/main.cpp @@ -36,6 +36,10 @@ using namespace Transport; class SpectrumNetworkPlugin; +#define GET_RESPONSE_DATA(RESP, DATA) (RESP.find(DATA) != std::string::npos ? RESP.substr(RESP.find(DATA) + strlen(DATA) + 1) : ""); +#define GET_PROPERTY(VAR, OBJ, WHICH, PROP) std::string VAR = sk->send_command(std::string("GET ") + OBJ + " " + WHICH + " " + PROP); \ + VAR = GET_RESPONSE_DATA(VAR, PROP); + SpectrumNetworkPlugin *np; @@ -292,7 +296,7 @@ class SpectrumNetworkPlugin : public NetworkPlugin { std::cout << skype->getUsername() << " " << name << "\n"; if (skype->getUsername() == name) { alias = skype->send_command("GET PROFILE FULLNAME"); - alias = alias.substr(17); + alias = GET_RESPONSE_DATA(alias, "FULLNAME") } handleVCard(user, id, legacyName, "", alias, photo); } @@ -504,7 +508,7 @@ bool Skype::loadSkypeBuddies() { std::string re = send_command("NAME Spectrum"); if (m_counter++ > 15) { LOG4CXX_ERROR(logger, "Logging out, because we tried to connect the Skype over DBUS 15 times without success"); - np->handleDisconnected(m_user, pbnetwork::CONNECTION_ERROR_AUTHENTICATION_IMPOSSIBLE, "Skype is not read."); + np->handleDisconnected(m_user, pbnetwork::CONNECTION_ERROR_AUTHENTICATION_IMPOSSIBLE, "Skype is not ready. This issue have been logged and admins will check it and try to fix it soon."); close(fd_output); logout(); return FALSE; @@ -518,7 +522,7 @@ bool Skype::loadSkypeBuddies() { if (send_command("PROTOCOL 7") != "PROTOCOL 7") { LOG4CXX_ERROR(logger, "PROTOCOL 7 failed, logging out"); - np->handleDisconnected(m_user, pbnetwork::CONNECTION_ERROR_AUTHENTICATION_IMPOSSIBLE, "Skype is not ready"); + np->handleDisconnected(m_user, pbnetwork::CONNECTION_ERROR_AUTHENTICATION_IMPOSSIBLE, "Skype is not ready. This issue have been logged and admins will check it and try to fix it soon."); logout(); return FALSE; } @@ -527,20 +531,22 @@ bool Skype::loadSkypeBuddies() { std::map group_map; std::string groups = send_command("SEARCH GROUPS CUSTOM"); - groups = groups.substr(groups.find(' ') + 1); - std::vector grps; - boost::split(grps, groups, boost::is_any_of(",")); - BOOST_FOREACH(std::string grp, grps) { - std::vector data; - std::string name = send_command("GET GROUP " + grp + " DISPLAYNAME"); - boost::split(data, name, boost::is_any_of(" ")); - name = name.substr(name.find("DISPLAYNAME") + 12); + if (groups.find(' ') != std::string::npos) { + groups = groups.substr(groups.find(' ') + 1); + std::vector grps; + boost::split(grps, groups, boost::is_any_of(",")); + BOOST_FOREACH(std::string grp, grps) { + std::vector data; + std::string name = send_command("GET GROUP " + grp + " DISPLAYNAME"); + boost::split(data, name, boost::is_any_of(" ")); + name = GET_RESPONSE_DATA(name, "DISPLAYNAME"); - std::string users = send_command("GET GROUP " + data[1] + " USERS"); - users = name.substr(name.find("USERS") + 6); - boost::split(data, users, boost::is_any_of(",")); - BOOST_FOREACH(std::string u, data) { - group_map[u] = grp; + std::string users = send_command("GET GROUP " + data[1] + " USERS"); + users = GET_RESPONSE_DATA(users, "USERS"); + boost::split(data, users, boost::is_any_of(",")); + BOOST_FOREACH(std::string u, data) { + group_map[u] = grp; + } } } @@ -650,70 +656,49 @@ static void handle_skype_message(std::string &message, Skype *sk) { } else { pbnetwork::StatusType status = getStatus(cmd[3]); - std::string mood_text = sk->send_command("GET USER " + cmd[1] + " MOOD_TEXT"); - mood_text = mood_text.substr(mood_text.find("MOOD_TEXT") + 10); - - std::string alias = sk->send_command("GET USER " + cmd[1] + " FULLNAME"); - alias = alias.substr(alias.find("FULLNAME") + 9); + GET_PROPERTY(mood_text, "USER", cmd[1], "MOOD_TEXT"); + GET_PROPERTY(alias, "USER", cmd[1], "FULLNAME"); std::vector groups; np->handleBuddyChanged(sk->getUser(), cmd[1], alias, groups, status, mood_text); } } else if (cmd[2] == "MOOD_TEXT") { - std::string st = sk->send_command("GET USER " + cmd[1] + " ONLINESTATUS"); - st = st.substr(st.find("ONLINESTATUS") + 13); + GET_PROPERTY(st, "USER", cmd[1], "ONLINESTATUS"); pbnetwork::StatusType status = getStatus(st); - std::string mood_text = message.substr(message.find("MOOD_TEXT") + 10); + std::string mood_text = GET_RESPONSE_DATA(message, "MOOD_TEXT"); std::vector groups; np->handleBuddyChanged(sk->getUser(), cmd[1], "", groups, status, mood_text); } else if (cmd[2] == "BUDDYSTATUS" && cmd[3] == "3") { - std::string st = sk->send_command("GET USER " + cmd[1] + " ONLINESTATUS"); - st = st.substr(st.find("ONLINESTATUS") + 13); + GET_PROPERTY(mood_text, "USER", cmd[1], "MOOD_TEXT"); + GET_PROPERTY(st, "USER", cmd[1], "ONLINESTATUS"); pbnetwork::StatusType status = getStatus(st); - std::string mood_text = message.substr(message.find("MOOD_TEXT") + 10); - std::vector groups; np->handleBuddyChanged(sk->getUser(), cmd[1], "", groups, status, mood_text); } else if (cmd[2] == "FULLNAME") { - std::string st = sk->send_command("GET USER " + cmd[1] + " ONLINESTATUS"); - st = st.substr(st.find("ONLINESTATUS") + 13); + GET_PROPERTY(alias, "USER", cmd[1], "FULLNAME"); + GET_PROPERTY(mood_text, "USER", cmd[1], "MOOD_TEXT"); + GET_PROPERTY(st, "USER", cmd[1], "ONLINESTATUS"); pbnetwork::StatusType status = getStatus(st); - std::string mood_text = sk->send_command("GET USER " + cmd[1] + " MOOD_TEXT"); - mood_text = mood_text.substr(mood_text.find("MOOD_TEXT") + 10); - - std::string alias = message.substr(message.find("FULLNAME") + 9); - std::vector groups; np->handleBuddyChanged(sk->getUser(), cmd[1], alias, groups, status, mood_text); } } else if (cmd[0] == "CHATMESSAGE") { if (cmd[3] == "RECEIVED") { - std::string body = sk->send_command("GET CHATMESSAGE " + cmd[1] + " BODY"); - body = body.substr(body.find("BODY") + 5); + GET_PROPERTY(body, "CHATMESSAGE", cmd[1], "BODY"); + GET_PROPERTY(from_handle, "CHATMESSAGE", cmd[1], "FROM_HANDLE"); - std::string chatname = sk->send_command("GET CHATMESSAGE " + cmd[1] + " CHATNAME"); - size_t start = chatname.find("$") + 1; - size_t len = chatname.find(";") - start; - std::string from = chatname.substr(start, len); - - std::string from_handle = sk->send_command("GET CHATMESSAGE " + cmd[1] + " FROM_HANDLE"); - from_handle = from_handle.substr(from_handle.find("FROM_HANDLE") + 12); - -// if (from_handle != sk->getUsername()) { - from = from_handle; -// } if (from_handle == sk->getUsername()) return; - np->handleMessage(sk->getUser(), from, body); + np->handleMessage(sk->getUser(), from_handle, body); } } else if (cmd[0] == "CALL") { @@ -721,17 +706,13 @@ static void handle_skype_message(std::string &message, Skype *sk) { if (cmd[2] == "STATUS") { if (cmd[3] == "RINGING" || cmd[3] == "MISSED") { // handle only incoming calls - std::string type = sk->send_command("GET CALL " + cmd[1] + " TYPE"); - type = type.substr(type.find("TYPE") + 5); + GET_PROPERTY(type, "CALL", cmd[1], "TYPE"); if (type.find("INCOMING") != 0) { return; } - std::string from = sk->send_command("GET CALL " + cmd[1] + " PARTNER_HANDLE"); - from = from.substr(from.find("PARTNER_HANDLE") + 15); - - std::string dispname = sk->send_command("GET CALL " + cmd[1] + " PARTNER_DISPNAME"); - dispname = dispname.substr(dispname.find("PARTNER_DISPNAME") + 17); + GET_PROPERTY(from, "CALL", cmd[1], "PARTNER_HANDLE"); + GET_PROPERTY(dispname, "CALL", cmd[1], "PARTNER_DISPNAME"); if (cmd[3] == "RINGING") { np->handleMessage(sk->getUser(), from, "User " + dispname + " is calling you."); diff --git a/spectrum/src/sample.cfg b/spectrum/src/sample.cfg index 57e601eb..78c22a80 100644 --- a/spectrum/src/sample.cfg +++ b/spectrum/src/sample.cfg @@ -7,7 +7,7 @@ server_mode = 1 backend_host=localhost pidfile=./test.pid # < this option doesn't work yet -backend_port=10001 +#backend_port=10001 admin_username=admin admin_password=test #cert=server.pfx #patch to PKCS#12 certificate From c4e327423f743994bb4dd0b80e355dfb530dd3d6 Mon Sep 17 00:00:00 2001 From: Jan Kaluza Date: Thu, 15 Mar 2012 09:06:52 +0100 Subject: [PATCH 053/143] inform skype that we seen the received message --- backends/skype/main.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/backends/skype/main.cpp b/backends/skype/main.cpp index 6731b96b..176f1110 100644 --- a/backends/skype/main.cpp +++ b/backends/skype/main.cpp @@ -699,6 +699,8 @@ static void handle_skype_message(std::string &message, Skype *sk) { return; np->handleMessage(sk->getUser(), from_handle, body); + + sk->send_command("SET CHATMESSAGE " + cmd[1] + " SEEN"); } } else if (cmd[0] == "CALL") { From 19ebf447d6dad28ddb5b3c6b19a6321c5175c2c9 Mon Sep 17 00:00:00 2001 From: HanzZ Date: Fri, 16 Mar 2012 10:37:40 +0100 Subject: [PATCH 054/143] GET_RESPONSE_DATA fix --- backends/skype/main.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backends/skype/main.cpp b/backends/skype/main.cpp index 176f1110..2e39124c 100644 --- a/backends/skype/main.cpp +++ b/backends/skype/main.cpp @@ -36,7 +36,7 @@ using namespace Transport; class SpectrumNetworkPlugin; -#define GET_RESPONSE_DATA(RESP, DATA) (RESP.find(DATA) != std::string::npos ? RESP.substr(RESP.find(DATA) + strlen(DATA) + 1) : ""); +#define GET_RESPONSE_DATA(RESP, DATA) ((RESP.find(std::string(DATA) + " ") != std::string::npos) ? RESP.substr(RESP.find(DATA) + strlen(DATA) + 1) : ""); #define GET_PROPERTY(VAR, OBJ, WHICH, PROP) std::string VAR = sk->send_command(std::string("GET ") + OBJ + " " + WHICH + " " + PROP); \ VAR = GET_RESPONSE_DATA(VAR, PROP); From 8a471b73f7d1ab6ede685ea041987463237be23c Mon Sep 17 00:00:00 2001 From: HanzZ Date: Fri, 16 Mar 2012 12:00:55 +0100 Subject: [PATCH 055/143] Changelog --- ChangeLog | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/ChangeLog b/ChangeLog index d731f169..69a7fd12 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,17 +1,22 @@ Version 2.0.0-beta2 (2012-XX-XX): General: - * Fixed bug when Roster Item Exchange and subscribe stanzas were send + * Fixed bug when Roster Item Exchange and subscribe stanzas were sent repeatedly. + * Backends related logs now contain the backend PID. * Fixed username_mask setting. - * Added new fields into statistics. + * Added new fields into statistics (backends_crashed, messages related + stats). libpurple: * Added support for MUC for prpl-jabber protocol. Skype: + * Memory usage statistic now includes the Skype client. * Fixed logging issue when the logs were not stored in the proper instance directory. * Skype backend includes also Skype client memory usage into the account. + * Working buddies adding/removing. + * Information about missed call is now forwarded to XMPP user. Version 2.0.0-beta (2012-02-28): General: From dd8627bbfef108501b121287bd1ec45418293337 Mon Sep 17 00:00:00 2001 From: HanzZ Date: Fri, 16 Mar 2012 12:27:59 +0100 Subject: [PATCH 056/143] little cleanup in libpurple backend --- backends/libpurple/main.cpp | 458 ++--------------------------------- backends/libpurple/utils.cpp | 129 ++++++++++ backends/libpurple/utils.h | 30 +++ 3 files changed, 176 insertions(+), 441 deletions(-) create mode 100644 backends/libpurple/utils.cpp create mode 100644 backends/libpurple/utils.h diff --git a/backends/libpurple/main.cpp b/backends/libpurple/main.cpp index ce8ad051..39c53627 100644 --- a/backends/libpurple/main.cpp +++ b/backends/libpurple/main.cpp @@ -1,3 +1,5 @@ +#include "utils.h" + #include "glib.h" #include "purple.h" #include @@ -12,25 +14,7 @@ #include "log4cxx/helpers/properties.h" #include "log4cxx/helpers/fileinputstream.h" #include "log4cxx/helpers/transcoder.h" -#ifndef WIN32 -#include "sys/wait.h" -#include "sys/signal.h" -#include -#include -#include -#include -#include -#include -#include "sys/socket.h" -#include -#include -#include -#else -#include -#define getpid _getpid -#define ssize_t SSIZE_T -#include "win32/win32dep.h" -#endif + // #include "valgrind/memcheck.h" #include "malloc.h" #include @@ -44,7 +28,7 @@ using namespace log4cxx; static LoggerPtr logger_libpurple = log4cxx::Logger::getLogger("libpurple"); static LoggerPtr logger = log4cxx::Logger::getLogger("backend"); -int m_sock; +int main_socket; static int writeInput; using namespace Transport; @@ -107,13 +91,8 @@ static std::string KEYFILE_STRING(const std::string &cat, const std::string &key #define KEYFILE_BOOL(CAT, KEY) g_key_file_get_boolean(keyfile, CAT, KEY, 0) -static gboolean nodaemon = FALSE; -static gchar *logfile = NULL; -static gchar *lock_file = NULL; static gchar *host = NULL; static int port = 10000; -static gboolean ver = FALSE; -static gboolean list_purple_settings = FALSE; struct FTData { unsigned long id; @@ -122,121 +101,12 @@ struct FTData { }; static GOptionEntry options_entries[] = { - { "nodaemon", 'n', 0, G_OPTION_ARG_NONE, &nodaemon, "Disable background daemon mode", NULL }, - { "logfile", 'l', 0, G_OPTION_ARG_STRING, &logfile, "Set file to log", NULL }, - { "pidfile", 'p', 0, G_OPTION_ARG_STRING, &lock_file, "File where to write transport PID", NULL }, - { "version", 'v', 0, G_OPTION_ARG_NONE, &ver, "Shows Spectrum version", NULL }, - { "list-purple-settings", 's', 0, G_OPTION_ARG_NONE, &list_purple_settings, "Lists purple settings which can be used in config file", NULL }, { "host", 'h', 0, G_OPTION_ARG_STRING, &host, "Host to connect to", NULL }, { "port", 'p', 0, G_OPTION_ARG_INT, &port, "Port to connect to", NULL }, { NULL, 0, 0, G_OPTION_ARG_NONE, NULL, "", NULL } }; static void *notify_user_info(PurpleConnection *gc, const char *who, PurpleNotifyUserInfo *user_info); -static GHashTable *ui_info = NULL; - -static GHashTable *spectrum_ui_get_info(void) -{ - if(NULL == ui_info) { - ui_info = g_hash_table_new(g_str_hash, g_str_equal); - - g_hash_table_insert(ui_info, g_strdup("name"), g_strdup("Spectrum")); - g_hash_table_insert(ui_info, g_strdup("version"), g_strdup("0.5")); - g_hash_table_insert(ui_info, g_strdup("website"), g_strdup("http://spectrum.im")); - g_hash_table_insert(ui_info, g_strdup("dev_website"), g_strdup("http://spectrum.im")); - g_hash_table_insert(ui_info, g_strdup("client_type"), g_strdup("pc")); - - /* - * This is the client key for "Pidgin." It is owned by the AIM - * account "markdoliner." Please don't use this key for other - * applications. You can either not specify a client key, in - * which case the default "libpurple" key will be used, or you - * can register for your own client key at - * http://developer.aim.com/manageKeys.jsp - */ - g_hash_table_insert(ui_info, g_strdup("prpl-aim-clientkey"), g_strdup("ma1cSASNCKFtrdv9")); - g_hash_table_insert(ui_info, g_strdup("prpl-icq-clientkey"), g_strdup("ma1cSASNCKFtrdv9")); - - /* - * This is the distid for Pidgin, given to us by AOL. Please - * don't use this for other applications. You can just not - * specify a distid and libpurple will use a default. - */ - g_hash_table_insert(ui_info, g_strdup("prpl-aim-distid"), GINT_TO_POINTER(1550)); - g_hash_table_insert(ui_info, g_strdup("prpl-icq-distid"), GINT_TO_POINTER(1550)); - } - - return ui_info; -} - -static gboolean -badchar(char c) -{ - switch (c) { - case ' ': - case ',': - case '\0': - case '\n': - case '\r': - case '<': - case '>': - case '"': - return TRUE; - default: - return FALSE; - } -} - -static gboolean -badentity(const char *c) -{ - if (!g_ascii_strncasecmp(c, "<", 4) || - !g_ascii_strncasecmp(c, ">", 4) || - !g_ascii_strncasecmp(c, """, 6)) { - return TRUE; - } - return FALSE; -} - -static const char * -process_link(GString *ret, - const char *start, const char *c, - int matchlen, - const char *urlprefix, - int inside_paren) -{ - char *url_buf; - const char *t; - - for (t = c;; t++) { - if (!badchar(*t) && !badentity(t)) - continue; - - if (t - c == matchlen) - break; - - if (*t == ',' && *(t + 1) != ' ') { - continue; - } - - if (t > start && *(t - 1) == '.') - t--; - if (t > start && *(t - 1) == ')' && inside_paren > 0) - t--; - - url_buf = g_strndup(c, t - c); -// tmpurlbuf = purple_unescape_html(url_buf); -// std::cout << url_buf << "\n"; - g_string_append_printf(ret, "%s", - urlprefix, - url_buf, url_buf); -// g_free(tmpurlbuf); - g_free(url_buf); - return t; - } - - return c; -} static gboolean ft_ui_ready(void *data) { PurpleXfer *xfer = (PurpleXfer *) data; @@ -246,184 +116,6 @@ static gboolean ft_ui_ready(void *data) { return FALSE; } -static char * -spectrum_markup_linkify(const char *text) -{ - const char *c, *t, *q = NULL; - char *tmpurlbuf, *url_buf; - gunichar g; - gboolean inside_html = FALSE; - int inside_paren = 0; - GString *ret; - - if (text == NULL) - return NULL; - - ret = g_string_new(""); - - c = text; - while (*c) { - - if(*c == '(' && !inside_html) { - inside_paren++; - ret = g_string_append_c(ret, *c); - c++; - } - - if(inside_html) { - if(*c == '>') { - inside_html = FALSE; - } else if(!q && (*c == '\"' || *c == '\'')) { - q = c; - } else if(q) { - if(*c == *q) - q = NULL; - } - } else if(*c == '<') { - inside_html = TRUE; - if (!g_ascii_strncasecmp(c, "", 3)) { - inside_html = FALSE; - break; - } - ret = g_string_append_c(ret, *c); - c++; - if (!(*c)) - break; - } - } - } else if (!g_ascii_strncasecmp(c, "http://", 7)) { - c = process_link(ret, text, c, 7, "", inside_paren); - } else if (!g_ascii_strncasecmp(c, "https://", 8)) { - c = process_link(ret, text, c, 8, "", inside_paren); - } else if (!g_ascii_strncasecmp(c, "ftp://", 6)) { - c = process_link(ret, text, c, 6, "", inside_paren); - } else if (!g_ascii_strncasecmp(c, "sftp://", 7)) { - c = process_link(ret, text, c, 7, "", inside_paren); - } else if (!g_ascii_strncasecmp(c, "file://", 7)) { - c = process_link(ret, text, c, 7, "", inside_paren); - } else if (!g_ascii_strncasecmp(c, "www.", 4) && c[4] != '.' && (c == text || badchar(c[-1]) || badentity(c-1))) { - c = process_link(ret, text, c, 4, "http://", inside_paren); - } else if (!g_ascii_strncasecmp(c, "ftp.", 4) && c[4] != '.' && (c == text || badchar(c[-1]) || badentity(c-1))) { - c = process_link(ret, text, c, 4, "ftp://", inside_paren); - } else if (!g_ascii_strncasecmp(c, "xmpp:", 5) && (c == text || badchar(c[-1]) || badentity(c-1))) { - c = process_link(ret, text, c, 5, "", inside_paren); - } else if (!g_ascii_strncasecmp(c, "mailto:", 7)) { - t = c; - while (1) { - if (badchar(*t) || badentity(t)) { - const char *d; - if (t - c == 7) { - break; - } - if (t > text && *(t - 1) == '.') - t--; - if ((d = strstr(c + 7, "?")) != NULL && d < t) - url_buf = g_strndup(c + 7, d - c - 7); - else - url_buf = g_strndup(c + 7, t - c - 7); - if (!purple_email_is_valid(url_buf)) { - g_free(url_buf); - break; - } - g_free(url_buf); - url_buf = g_strndup(c, t - c); -// tmpurlbuf = purple_unescape_html(url_buf); - g_string_append_printf(ret, "%s", - url_buf, url_buf); - g_free(url_buf); -// g_free(tmpurlbuf); - c = t; - break; - } - t++; - } - } else if (c != text && (*c == '@')) { - int flag; - GString *gurl_buf = NULL; - const char illegal_chars[] = "!@#$%^&*()[]{}/|\\<>\":;\r\n \0"; - - if (strchr(illegal_chars,*(c - 1)) || strchr(illegal_chars, *(c + 1))) - flag = 0; - else { - flag = 1; - gurl_buf = g_string_new(""); - } - - t = c; - while (flag) { - /* iterate backwards grabbing the local part of an email address */ - g = g_utf8_get_char(t); - if (badchar(*t) || (g >= 127) || (*t == '(') || - ((*t == ';') && ((t > (text+2) && (!g_ascii_strncasecmp(t - 3, "<", 4) || - !g_ascii_strncasecmp(t - 3, ">", 4))) || - (t > (text+4) && (!g_ascii_strncasecmp(t - 5, """, 6)))))) { - /* local part will already be part of ret, strip it out */ - ret = g_string_truncate(ret, ret->len - (c - t)); - ret = g_string_append_unichar(ret, g); - break; - } else { - g_string_prepend_unichar(gurl_buf, g); - t = g_utf8_find_prev_char(text, t); - if (t < text) { - ret = g_string_assign(ret, ""); - break; - } - } - } - - t = g_utf8_find_next_char(c, NULL); - - while (flag) { - /* iterate forwards grabbing the domain part of an email address */ - g = g_utf8_get_char(t); - if (badchar(*t) || (g >= 127) || (*t == ')') || badentity(t)) { - char *d; - - url_buf = g_string_free(gurl_buf, FALSE); - - /* strip off trailing periods */ - if (strlen(url_buf) > 0) { - for (d = url_buf + strlen(url_buf) - 1; *d == '.'; d--, t--) - *d = '\0'; - } - - tmpurlbuf = purple_unescape_html(url_buf); - if (purple_email_is_valid(tmpurlbuf)) { - g_string_append_printf(ret, "%s", - url_buf, url_buf); - } else { - g_string_append(ret, url_buf); - } - g_free(url_buf); - g_free(tmpurlbuf); - c = t; - - break; - } else { - g_string_append_unichar(gurl_buf, g); - t = g_utf8_find_next_char(t, NULL); - } - } - } - - if(*c == ')' && !inside_html) { - inside_paren--; - ret = g_string_append_c(ret, *c); - c++; - } - - if (*c == 0) - break; - - ret = g_string_append_c(ret, *c); - c++; - - } - return g_string_free(ret, FALSE); -} - struct authRequest { PurpleAccountRequestAuthorizationCb authorize_cb; PurpleAccountRequestAuthorizationCb deny_cb; @@ -509,13 +201,13 @@ static std::string getAlias(PurpleBuddy *m_buddy) { class SpectrumNetworkPlugin : public NetworkPlugin { public: - SpectrumNetworkPlugin(const std::string &host, int port) : NetworkPlugin() { + SpectrumNetworkPlugin() : NetworkPlugin() { } void handleExitRequest() { LOG4CXX_INFO(logger, "Exiting..."); - exit(1); + exit(0); } void getProtocolAndName(const std::string &legacyName, std::string &name, std::string &protocol) { @@ -597,7 +289,7 @@ class SpectrumNetworkPlugin : public NetworkPlugin { void handleLoginRequest(const std::string &user, const std::string &legacyName, const std::string &password) { PurpleAccount *account = NULL; - + std::string name; std::string protocol; getProtocolAndName(legacyName, name, protocol); @@ -614,7 +306,6 @@ class SpectrumNetworkPlugin : public NetworkPlugin { return; } - if (purple_accounts_find(name.c_str(), protocol.c_str()) != NULL) { LOG4CXX_INFO(logger, "Using previously created account with name '" << name.c_str() << "' and protocol '" << protocol << "'"); account = purple_accounts_find(name.c_str(), protocol.c_str()); @@ -637,11 +328,13 @@ class SpectrumNetworkPlugin : public NetworkPlugin { setDefaultAccountOptions(account); + // Enable account + privacy lists purple_account_set_enabled(account, "spectrum", TRUE); if (KEYFILE_BOOL("service", "enable_privacy_lists")) { purple_account_set_privacy_type(account, PURPLE_PRIVACY_DENY_USERS); } + // Set the status const PurpleStatusType *status_type = purple_account_get_status_type_with_primitive(account, PURPLE_STATUS_AVAILABLE); if (status_type != NULL) { purple_account_set_status(account, purple_status_type_get_id(status_type), TRUE, NULL); @@ -661,50 +354,6 @@ class SpectrumNetworkPlugin : public NetworkPlugin { m_accounts.erase(account); purple_accounts_delete(account); -// -// // Remove conversations. -// // This has to be called before m_account->ui_data = NULL;, because it uses -// // ui_data to call SpectrumMessageHandler::purpleConversationDestroyed() callback. -// GList *iter; -// for (iter = purple_get_conversations(); iter; ) { -// PurpleConversation *conv = (PurpleConversation*) iter->data; -// iter = iter->next; -// if (purple_conversation_get_account(conv) == account) -// purple_conversation_destroy(conv); -// } -// -// g_free(account->ui_data); -// account->ui_data = NULL; -// m_accounts.erase(account); -// -// purple_notify_close_with_handle(account); -// purple_request_close_with_handle(account); -// -// purple_accounts_remove(account); -// -// GSList *buddies = purple_find_buddies(account, NULL); -// while(buddies) { -// PurpleBuddy *b = (PurpleBuddy *) buddies->data; -// purple_blist_remove_buddy(b); -// buddies = g_slist_delete_link(buddies, buddies); -// } -// -// /* Remove any open conversation for this account */ -// for (GList *it = purple_get_conversations(); it; ) { -// PurpleConversation *conv = (PurpleConversation *) it->data; -// it = it->next; -// if (purple_conversation_get_account(conv) == account) -// purple_conversation_destroy(conv); -// } -// -// /* Remove this account's pounces */ -// // purple_pounce_destroy_all_by_account(account); -// -// /* This will cause the deletion of an old buddy icon. */ -// purple_buddy_icons_set_account_icon(account, NULL, 0); -// -// purple_account_destroy(account); - // force returning of memory chunks allocated by libxml2 to kernel #ifndef WIN32 malloc_trim(0); #endif @@ -1002,9 +651,9 @@ class SpectrumNetworkPlugin : public NetworkPlugin { } void sendData(const std::string &string) { - write(m_sock, string.c_str(), string.size()); + write(main_socket, string.c_str(), string.size()); if (writeInput == 0) - writeInput = purple_input_add(m_sock, PURPLE_INPUT_WRITE, &transportDataReceived, NULL); + writeInput = purple_input_add(main_socket, PURPLE_INPUT_WRITE, &transportDataReceived, NULL); } void readyForData() { @@ -1864,9 +1513,8 @@ static bool initPurple() { remove("./accounts.xml"); remove("./blist.xml"); -// if (m_configuration.logAreas & LOG_AREA_PURPLE) - purple_debug_set_ui_ops(&debugUiOps); - purple_debug_set_verbose(true); + purple_debug_set_ui_ops(&debugUiOps); + purple_debug_set_verbose(true); purple_core_set_ui_ops(&coreUiOps); if (KEYFILE_STRING("service", "eventloop") == "libev") { @@ -1930,50 +1578,7 @@ static bool initPurple() { } return ret; } -#ifndef WIN32 -static void spectrum_sigchld_handler(int sig) -{ - int status; - pid_t pid; - do { - pid = waitpid(-1, &status, WNOHANG); - } while (pid != 0 && pid != (pid_t)-1); - - if ((pid == (pid_t) - 1) && (errno != ECHILD)) { - char errmsg[BUFSIZ]; - snprintf(errmsg, BUFSIZ, "Warning: waitpid() returned %d", pid); - perror(errmsg); - } -} -#endif - -static int create_socket(char *host, int portno) { - struct sockaddr_in serv_addr; - - int m_sock = socket(AF_INET, SOCK_STREAM, 0); - memset((char *) &serv_addr, 0, sizeof(serv_addr)); - serv_addr.sin_family = AF_INET; - serv_addr.sin_port = htons(portno); - - hostent *hos; // Resolve name - if ((hos = gethostbyname(host)) == NULL) { - // strerror() will not work for gethostbyname() and hstrerror() - // is supposedly obsolete - exit(1); - } - serv_addr.sin_addr.s_addr = *((unsigned long *) hos->h_addr_list[0]); - - if (connect(m_sock, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0) { - close(m_sock); - m_sock = 0; - } - - int flags = fcntl(m_sock, F_GETFL); - flags |= O_NONBLOCK; - fcntl(m_sock, F_SETFL, flags); - return m_sock; -} static void transportDataReceived(gpointer data, gint source, PurpleInputCondition cond) { if (cond & PURPLE_INPUT_READ) { @@ -2002,17 +1607,10 @@ int main(int argc, char **argv) { context = g_option_context_new("config_file_name or profile name"); g_option_context_add_main_entries(context, options_entries, ""); if (!g_option_context_parse (context, &argc, &argv, &error)) { - std::cout << "option parsing failed: " << error->message << "\n"; + std::cerr << "option parsing failed: " << error->message << "\n"; return -1; } - if (ver) { -// std::cout << VERSION << "\n"; - std::cout << "verze\n"; - g_option_context_free(context); - return 0; - } - if (argc != 2) { #ifdef WIN32 std::cout << "Usage: spectrum.exe \n"; @@ -2036,27 +1634,6 @@ int main(int argc, char **argv) { g_option_context_free(context); return -1; } -// -// if (signal(SIGINT, spectrum_sigint_handler) == SIG_ERR) { -// std::cout << "SIGINT handler can't be set\n"; -// g_option_context_free(context); -// return -1; -// } -// -// if (signal(SIGTERM, spectrum_sigterm_handler) == SIG_ERR) { -// std::cout << "SIGTERM handler can't be set\n"; -// g_option_context_free(context); -// return -1; -// } -// -// struct sigaction sa; -// memset(&sa, 0, sizeof(sa)); -// sa.sa_handler = spectrum_sighup_handler; -// if (sigaction(SIGHUP, &sa, NULL)) { -// std::cout << "SIGHUP handler can't be set\n"; -// g_option_context_free(context); -// return -1; -// } #endif keyfile = g_key_file_new (); if (!g_key_file_load_from_file (keyfile, argv[1], (GKeyFileFlags) 0, 0)) { @@ -2091,12 +1668,11 @@ int main(int argc, char **argv) { initPurple(); - m_sock = create_socket(host, port); - - purple_input_add(m_sock, PURPLE_INPUT_READ, &transportDataReceived, NULL); + main_socket = create_socket(host, port); + purple_input_add(main_socket, PURPLE_INPUT_READ, &transportDataReceived, NULL); purple_timeout_add_seconds(30, pingTimeout, NULL); - np = new SpectrumNetworkPlugin(host, port); + np = new SpectrumNetworkPlugin(); bool libev = KEYFILE_STRING("service", "eventloop") == "libev"; GMainLoop *m_loop; diff --git a/backends/libpurple/utils.cpp b/backends/libpurple/utils.cpp new file mode 100644 index 00000000..417ad67d --- /dev/null +++ b/backends/libpurple/utils.cpp @@ -0,0 +1,129 @@ +/** + * libtransport -- C++ library for easy XMPP Transports development + * + * Copyright (C) 2011, Jan Kaluza + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA + */ + +#include "utils.h" + +#include "glib.h" +#include "purple.h" +#include +#include + +#include "errno.h" + +#ifndef WIN32 +#include "sys/wait.h" +#include "sys/signal.h" +#include +#include +#include +#include +#include +#include +#include "sys/socket.h" +#include +#include +#include +#else +#include +#define getpid _getpid +#define ssize_t SSIZE_T +#include "win32/win32dep.h" +#endif + +static GHashTable *ui_info = NULL; + +GHashTable *spectrum_ui_get_info(void) +{ + if(NULL == ui_info) { + ui_info = g_hash_table_new(g_str_hash, g_str_equal); + + g_hash_table_insert(ui_info, g_strdup("name"), g_strdup("Spectrum")); + g_hash_table_insert(ui_info, g_strdup("version"), g_strdup("0.5")); + g_hash_table_insert(ui_info, g_strdup("website"), g_strdup("http://spectrum.im")); + g_hash_table_insert(ui_info, g_strdup("dev_website"), g_strdup("http://spectrum.im")); + g_hash_table_insert(ui_info, g_strdup("client_type"), g_strdup("pc")); + + /* + * This is the client key for "Pidgin." It is owned by the AIM + * account "markdoliner." Please don't use this key for other + * applications. You can either not specify a client key, in + * which case the default "libpurple" key will be used, or you + * can register for your own client key at + * http://developer.aim.com/manageKeys.jsp + */ + g_hash_table_insert(ui_info, g_strdup("prpl-aim-clientkey"), g_strdup("ma1cSASNCKFtrdv9")); + g_hash_table_insert(ui_info, g_strdup("prpl-icq-clientkey"), g_strdup("ma1cSASNCKFtrdv9")); + + /* + * This is the distid for Pidgin, given to us by AOL. Please + * don't use this for other applications. You can just not + * specify a distid and libpurple will use a default. + */ + g_hash_table_insert(ui_info, g_strdup("prpl-aim-distid"), GINT_TO_POINTER(1550)); + g_hash_table_insert(ui_info, g_strdup("prpl-icq-distid"), GINT_TO_POINTER(1550)); + } + + return ui_info; +} + +#ifndef WIN32 +void spectrum_sigchld_handler(int sig) +{ + int status; + pid_t pid; + + do { + pid = waitpid(-1, &status, WNOHANG); + } while (pid != 0 && pid != (pid_t)-1); + + if ((pid == (pid_t) - 1) && (errno != ECHILD)) { + char errmsg[BUFSIZ]; + snprintf(errmsg, BUFSIZ, "Warning: waitpid() returned %d", pid); + perror(errmsg); + } +} +#endif + +int create_socket(char *host, int portno) { + struct sockaddr_in serv_addr; + + int main_socket = socket(AF_INET, SOCK_STREAM, 0); + memset((char *) &serv_addr, 0, sizeof(serv_addr)); + serv_addr.sin_family = AF_INET; + serv_addr.sin_port = htons(portno); + + hostent *hos; // Resolve name + if ((hos = gethostbyname(host)) == NULL) { + // strerror() will not work for gethostbyname() and hstrerror() + // is supposedly obsolete + exit(1); + } + serv_addr.sin_addr.s_addr = *((unsigned long *) hos->h_addr_list[0]); + + if (connect(main_socket, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0) { + close(main_socket); + main_socket = 0; + } + + int flags = fcntl(main_socket, F_GETFL); + flags |= O_NONBLOCK; + fcntl(main_socket, F_SETFL, flags); + return main_socket; +} diff --git a/backends/libpurple/utils.h b/backends/libpurple/utils.h new file mode 100644 index 00000000..2055b6c1 --- /dev/null +++ b/backends/libpurple/utils.h @@ -0,0 +1,30 @@ +/** + * libtransport -- C++ library for easy XMPP Transports development + * + * Copyright (C) 2011, Jan Kaluza + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA + */ + +#pragma once + +#include "purple.h" + +#ifndef WIN32 +void spectrum_sigchld_handler(int sig); +#endif + +int create_socket(char *host, int portno); +GHashTable *spectrum_ui_get_info(void); \ No newline at end of file From ab72dd03c64ac9e5ab868edec78d33831ef7c794 Mon Sep 17 00:00:00 2001 From: HanzZ Date: Mon, 19 Mar 2012 15:09:55 +0100 Subject: [PATCH 057/143] new sample.cfg --- spectrum/src/sample.cfg | 12 +++--------- src/user.cpp | 1 + 2 files changed, 4 insertions(+), 9 deletions(-) diff --git a/spectrum/src/sample.cfg b/spectrum/src/sample.cfg index 78c22a80..acdd93f5 100644 --- a/spectrum/src/sample.cfg +++ b/spectrum/src/sample.cfg @@ -13,22 +13,16 @@ admin_password=test #cert=server.pfx #patch to PKCS#12 certificate #cert_password=test #password to that certificate if any users_per_backend=10 -#backend=/home/hanzz/code/libtransport/backends/libpurple/spectrum2_libpurple_backend -#backend=/home/hanzz/code/libtransport/backends/smstools3/spectrum2_smstools3_backend -#backend=/usr/bin/mono /home/hanzz/code/networkplugin-csharp/msnp-sharp-backend/bin/Debug/msnp-sharp-backend.exe -#backend=/home/hanzz/code/libtransport/backends/frotz/spectrum2_frotz_backend -#backend=/home/hanzz/code/libtransport/backends/libircclient-qt/spectrum2_libircclient-qt_backend -backend=/usr/bin/xvfb-run -n BACKEND_ID -s "-screen 0 10x10x8" -f /tmp/x-skype-gw /home/hanzz/code/libtransport/backends/skype/spectrum2_skype_backend +backend=../..//backends/libpurple/spectrum2_libpurple_backend +protocol=prpl-xmpp #protocol=prpl-msn -protocol=any +#protocol=any #protocol=prpl-icq -irc_server=irc.freenode.org working_dir=./ [backend] #default_avatar=catmelonhead.jpg #no_vcard_fetch=true -incoming_dir=/var/spool/sms/incoming [logging] #config=logging.cfg # log4cxx/log4j logging configuration file diff --git a/src/user.cpp b/src/user.cpp index 8cfcd0ea..0baedfa9 100644 --- a/src/user.cpp +++ b/src/user.cpp @@ -210,6 +210,7 @@ void User::handlePresence(Swift::Presence::ref presence) { } } } + bool isMUC = presence->getPayload() != NULL || *presence->getTo().getNode().c_str() == '#'; if (isMUC) { if (presence->getType() == Swift::Presence::Unavailable) { From a10cccd1e1c09ad3fc8121dc9a244e1fd847b32a Mon Sep 17 00:00:00 2001 From: Jan Kaluza Date: Tue, 20 Mar 2012 08:12:10 +0100 Subject: [PATCH 058/143] Fixed skype crash --- backends/skype/main.cpp | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/backends/skype/main.cpp b/backends/skype/main.cpp index 2e39124c..ccb60559 100644 --- a/backends/skype/main.cpp +++ b/backends/skype/main.cpp @@ -538,6 +538,11 @@ bool Skype::loadSkypeBuddies() { BOOST_FOREACH(std::string grp, grps) { std::vector data; std::string name = send_command("GET GROUP " + grp + " DISPLAYNAME"); + + if (name.find("ERROR") == 0) { + continue; + } + boost::split(data, name, boost::is_any_of(" ")); name = GET_RESPONSE_DATA(name, "DISPLAYNAME"); @@ -619,7 +624,7 @@ std::string Skype::send_command(const std::string &message) { // int message_num; // gchar error_return[30]; - LOG4CXX_INFO(logger, "Sending: " << message); + LOG4CXX_INFO(logger, "Sending: '" << message << "'"); if (!dbus_g_proxy_call (m_proxy, "Invoke", &error, G_TYPE_STRING, message.c_str(), G_TYPE_INVALID, G_TYPE_STRING, &str, G_TYPE_INVALID)) { @@ -636,7 +641,7 @@ std::string Skype::send_command(const std::string &message) { } if (str != NULL) { - LOG4CXX_INFO(logger, m_username << ": DBUS:" << str); + LOG4CXX_INFO(logger, m_username << ": DBUS:'" << str << "'"); } return str ? std::string(str) : std::string(); } From 75f202cb884bb325e7a2780c064e68c0a6ee726e Mon Sep 17 00:00:00 2001 From: Jan Kaluza Date: Tue, 20 Mar 2012 10:28:39 +0100 Subject: [PATCH 059/143] Catch out of range exception --- backends/skype/main.cpp | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/backends/skype/main.cpp b/backends/skype/main.cpp index ccb60559..c98b1498 100644 --- a/backends/skype/main.cpp +++ b/backends/skype/main.cpp @@ -38,7 +38,13 @@ class SpectrumNetworkPlugin; #define GET_RESPONSE_DATA(RESP, DATA) ((RESP.find(std::string(DATA) + " ") != std::string::npos) ? RESP.substr(RESP.find(DATA) + strlen(DATA) + 1) : ""); #define GET_PROPERTY(VAR, OBJ, WHICH, PROP) std::string VAR = sk->send_command(std::string("GET ") + OBJ + " " + WHICH + " " + PROP); \ - VAR = GET_RESPONSE_DATA(VAR, PROP); + try {\ + VAR = GET_RESPONSE_DATA(VAR, PROP);\ + }\ + catch (std::out_of_range& oor) {\ + VAR="";\ + } + SpectrumNetworkPlugin *np; @@ -547,7 +553,12 @@ bool Skype::loadSkypeBuddies() { name = GET_RESPONSE_DATA(name, "DISPLAYNAME"); std::string users = send_command("GET GROUP " + data[1] + " USERS"); - users = GET_RESPONSE_DATA(users, "USERS"); + try { + users = GET_RESPONSE_DATA(users, "USERS"); + } + catch (std::out_of_range& oor) { + continue; + } boost::split(data, users, boost::is_any_of(",")); BOOST_FOREACH(std::string u, data) { group_map[u] = grp; From 7067865738d06ea9b649caf06e6c729893fe405d Mon Sep 17 00:00:00 2001 From: HanzZ Date: Tue, 20 Mar 2012 22:06:51 +0100 Subject: [PATCH 060/143] Send admin contac tot user --- spectrum/src/sample.cfg | 2 +- src/usermanager.cpp | 15 +++++++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/spectrum/src/sample.cfg b/spectrum/src/sample.cfg index acdd93f5..d3b4f317 100644 --- a/spectrum/src/sample.cfg +++ b/spectrum/src/sample.cfg @@ -8,7 +8,7 @@ backend_host=localhost pidfile=./test.pid # < this option doesn't work yet #backend_port=10001 -admin_username=admin +admin_jid=admin@localhost admin_password=test #cert=server.pfx #patch to PKCS#12 certificate #cert_password=test #password to that certificate if any diff --git a/src/usermanager.cpp b/src/usermanager.cpp index 1845d94e..52e41607 100644 --- a/src/usermanager.cpp +++ b/src/usermanager.cpp @@ -152,6 +152,21 @@ void UserManager::handlePresence(Swift::Presence::ref presence) { if (!user) { // Admin user is not legacy network user, so do not create User class instance for him if (m_component->inServerMode() && CONFIG_STRING(m_component->getConfig(), "service.admin_jid") == presence->getFrom().toBare().toString()) { + // Send admin contact to the user. + Swift::RosterPayload::ref payload = Swift::RosterPayload::ref(new Swift::RosterPayload()); + Swift::RosterItemPayload item; + item.setJID(m_component->getJID()); + item.setName("Admin"); + item.setSubscription(Swift::RosterItemPayload::Both); + payload->addItem(item); + + Swift::SetRosterRequest::ref request = Swift::SetRosterRequest::create(payload, presence->getFrom(), m_component->getIQRouter()); + request->send(); + + Swift::Presence::ref response = Swift::Presence::create(); + response->setTo(presence->getFrom()); + response->setFrom(m_component->getJID()); + m_component->getStanzaChannel()->sendPresence(response); return; } From 9c7d577b0e3aac70f6e1e8ce56f23c8c638c1514 Mon Sep 17 00:00:00 2001 From: HanzZ Date: Tue, 20 Mar 2012 22:45:13 +0100 Subject: [PATCH 061/143] define getpid on windows --- plugin/cpp/networkplugin.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/plugin/cpp/networkplugin.cpp b/plugin/cpp/networkplugin.cpp index 94fc82c0..1b7f448c 100644 --- a/plugin/cpp/networkplugin.cpp +++ b/plugin/cpp/networkplugin.cpp @@ -28,6 +28,8 @@ #else #include #include +#include +#define getpid _getpid #endif using namespace log4cxx; From e910508a9cc9cd37f93c3895efe1644b44a89307 Mon Sep 17 00:00:00 2001 From: HanzZ Date: Tue, 20 Mar 2012 22:45:41 +0100 Subject: [PATCH 062/143] define getpid on windows --- src/logging.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/logging.cpp b/src/logging.cpp index 19dee6cf..dfc3f447 100644 --- a/src/logging.cpp +++ b/src/logging.cpp @@ -43,6 +43,8 @@ #include "libgen.h" #else #include +#include +#define getpid _getpid #endif using namespace boost::filesystem; From 2bf17991b5fae854bf99d57c716f051b68ec2acd Mon Sep 17 00:00:00 2001 From: HanzZ Date: Tue, 20 Mar 2012 22:51:17 +0100 Subject: [PATCH 063/143] define getpid on windows --- backends/libpurple/main.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/backends/libpurple/main.cpp b/backends/libpurple/main.cpp index 39c53627..8defa6b9 100644 --- a/backends/libpurple/main.cpp +++ b/backends/libpurple/main.cpp @@ -24,6 +24,11 @@ #include #endif +#ifdef WIN32 +#include +#define getpid _getpid +#endif + using namespace log4cxx; static LoggerPtr logger_libpurple = log4cxx::Logger::getLogger("libpurple"); From 3b4c7b384b0cb96f5b42f47afae5ab2dc92614ca Mon Sep 17 00:00:00 2001 From: HanzZ Date: Tue, 20 Mar 2012 22:58:00 +0100 Subject: [PATCH 064/143] ssize_t on windows... --- backends/libpurple/main.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/backends/libpurple/main.cpp b/backends/libpurple/main.cpp index 8defa6b9..e05ba412 100644 --- a/backends/libpurple/main.cpp +++ b/backends/libpurple/main.cpp @@ -25,6 +25,8 @@ #endif #ifdef WIN32 +#include "win32/win32dep.h" +#define ssize_t SSIZE_T #include #define getpid _getpid #endif From 7d238f4440b755affb087be6ef98834c21a19d22 Mon Sep 17 00:00:00 2001 From: Jan Kaluza Date: Wed, 21 Mar 2012 11:01:07 +0100 Subject: [PATCH 065/143] catch FileInputStream exception --- backends/libpurple/main.cpp | 16 +++++++++++++++- plugin/cpp/CMakeLists.txt | 7 +++++-- src/logging.cpp | 16 +++++++++++++++- 3 files changed, 35 insertions(+), 4 deletions(-) diff --git a/backends/libpurple/main.cpp b/backends/libpurple/main.cpp index e05ba412..8c9c7b48 100644 --- a/backends/libpurple/main.cpp +++ b/backends/libpurple/main.cpp @@ -1658,7 +1658,21 @@ int main(int argc, char **argv) { } else { log4cxx::helpers::Properties p; - log4cxx::helpers::FileInputStream *istream = new log4cxx::helpers::FileInputStream(KEYFILE_STRING("logging", "backend_config")); + log4cxx::helpers::FileInputStream *istream = NULL; + try { + istream = new log4cxx::helpers::FileInputStream(KEYFILE_STRING("logging", "backend_config")); + } + catch(log4cxx::helpers::IOException &ex) { + std::cerr << "Can't create FileInputStream logger instance: " << ex.what() << "\n"; + } + catch (...) { + std::cerr << "Can't create FileInputStream logger instance\n"; + } + + if (!istream) { + return 1; + } + p.load(istream); LogString pid, jid; log4cxx::helpers::Transcoder::decode(stringOf(getpid()), pid); diff --git a/plugin/cpp/CMakeLists.txt b/plugin/cpp/CMakeLists.txt index dde42f38..544e2ec2 100644 --- a/plugin/cpp/CMakeLists.txt +++ b/plugin/cpp/CMakeLists.txt @@ -2,10 +2,13 @@ cmake_minimum_required(VERSION 2.6) FILE(GLOB SRC *.cpp *.h) FILE(GLOB HEADERS ../include/transport/*.h) +set(EXTRA_SOURCES ${CMAKE_CURRENT_BINARY_DIR}/../../src/memoryusage.cpp) +set(EXTRA_SOURCES ${EXTRA_SOURCES} ${CMAKE_CURRENT_BINARY_DIR}/../../include/transport/protocol.pb.cc) + if (NOT WIN32) - ADD_LIBRARY(transport-plugin SHARED ${HEADERS} ${SRC} ${PROTOBUF_SRC} ${PROTOBUF_HDRS} ../../src/memoryusage.cpp ${CMAKE_CURRENT_BINARY_DIR}/../../include/transport/protocol.pb.cc) + ADD_LIBRARY(transport-plugin SHARED ${HEADERS} ${SRC} ${PROTOBUF_SRC} ${PROTOBUF_HDRS} ${EXTRA_SOURCES}) else() - ADD_LIBRARY(transport-plugin STATIC ${HEADERS} ${SRC} ${PROTOBUF_SRC} ${PROTOBUF_HDRS} ../../src/memoryusage.cpp ${CMAKE_CURRENT_BINARY_DIR}/../../include/transport/protocol.pb.cc) + ADD_LIBRARY(transport-plugin STATIC ${HEADERS} ${SRC} ${PROTOBUF_SRC} ${PROTOBUF_HDRS} ${EXTRA_SOURCES}) endif() ADD_DEPENDENCIES(transport-plugin pb) SET_SOURCE_FILES_PROPERTIES(${CMAKE_CURRENT_BINARY_DIR}/../../include/transport/protocol.pb.cc PROPERTIES GENERATED 1) diff --git a/src/logging.cpp b/src/logging.cpp index dfc3f447..fc9f94b3 100644 --- a/src/logging.cpp +++ b/src/logging.cpp @@ -67,7 +67,21 @@ static void initLogging(Config *config, std::string key) { } else { log4cxx::helpers::Properties p; - log4cxx::helpers::FileInputStream *istream = new log4cxx::helpers::FileInputStream(CONFIG_STRING(config, key)); + + log4cxx::helpers::FileInputStream *istream = NULL; + try { + istream = new log4cxx::helpers::FileInputStream(CONFIG_STRING(config, key)); + } + catch(log4cxx::helpers::IOException &ex) { + std::cerr << "Can't create FileInputStream logger instance: " << ex.what() << "\n"; + } + catch (...) { + std::cerr << "Can't create FileInputStream logger instance\n"; + } + + if (!istream) { + return; + } p.load(istream); LogString pid, jid; From 52039dd4dfaabe335b6adcdc1d12c2777c2d5f3e Mon Sep 17 00:00:00 2001 From: Jan Kaluza Date: Wed, 21 Mar 2012 11:10:11 +0100 Subject: [PATCH 066/143] Stop backend when user disconnects and admin wants to have one user per backend --- src/networkpluginserver.cpp | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/networkpluginserver.cpp b/src/networkpluginserver.cpp index a36699be..00f601d7 100644 --- a/src/networkpluginserver.cpp +++ b/src/networkpluginserver.cpp @@ -1095,12 +1095,13 @@ void NetworkPluginServer::handleUserDestroyed(User *user) { } send(c->connection, message); c->users.remove(user); -// if (c->users.size() == 0) { -// LOG4CXX_INFO(logger, "Disconnecting backend " << c << ". There are no users."); -// handleSessionFinished(c); -// m_clients.erase(user->connection); -// } + // If backend should handle only one user, it must not accept another one before + // we kill it, so set up willDie to true + if (c->users.size() == 0 && CONFIG_INT(m_config, "service.users_per_backend") == 1) { + LOG4CXX_INFO(logger, "Backend " << c->id << " will die, because the last user disconnected"); + c->willDie = true; + } } void NetworkPluginServer::handleMessageReceived(NetworkConversation *conv, boost::shared_ptr &msg) { From 1f60d0547cc5cb96ac6dc797193b2a0dc6be96d3 Mon Sep 17 00:00:00 2001 From: HanzZ Date: Wed, 21 Mar 2012 15:46:25 +0100 Subject: [PATCH 067/143] Changed libtransport-plugin deps to have logging.h used from libpurple backend --- backends/libpurple/main.cpp | 44 ++++++------------------------------- plugin/cpp/CMakeLists.txt | 6 +++-- src/config.cpp | 13 ++++++++--- 3 files changed, 21 insertions(+), 42 deletions(-) diff --git a/backends/libpurple/main.cpp b/backends/libpurple/main.cpp index 8c9c7b48..a39f5218 100644 --- a/backends/libpurple/main.cpp +++ b/backends/libpurple/main.cpp @@ -6,6 +6,8 @@ #include #include "transport/networkplugin.h" +#include "transport/logging.h" +#include "transport/config.h" #include "geventloop.h" #include "log4cxx/logger.h" #include "log4cxx/consoleappender.h" @@ -1648,44 +1650,12 @@ int main(int argc, char **argv) { return 1; } - if (KEYFILE_STRING("logging", "backend_config").empty()) { - LoggerPtr root = log4cxx::Logger::getRootLogger(); -#ifndef _MSC_VER - root->addAppender(new ConsoleAppender(new PatternLayout("%d %-5p %c: %m%n"))); -#else - root->addAppender(new ConsoleAppender(new PatternLayout(L"%d %-5p %c: %m%n"))); -#endif - } - else { - log4cxx::helpers::Properties p; - log4cxx::helpers::FileInputStream *istream = NULL; - try { - istream = new log4cxx::helpers::FileInputStream(KEYFILE_STRING("logging", "backend_config")); - } - catch(log4cxx::helpers::IOException &ex) { - std::cerr << "Can't create FileInputStream logger instance: " << ex.what() << "\n"; - } - catch (...) { - std::cerr << "Can't create FileInputStream logger instance\n"; - } - - if (!istream) { - return 1; - } - - p.load(istream); - LogString pid, jid; - log4cxx::helpers::Transcoder::decode(stringOf(getpid()), pid); - log4cxx::helpers::Transcoder::decode(KEYFILE_STRING("service", "jid"), jid); -#ifdef _MSC_VER - p.setProperty(L"pid", pid); - p.setProperty(L"jid", jid); -#else - p.setProperty("pid", pid); - p.setProperty("jid", jid); -#endif - log4cxx::PropertyConfigurator::configure(p); + Config config; + if (!config.load(argv[1])) { + std::cerr << "Can't open " << argv[1] << " configuration file.\n"; + return 1; } + Logging::initBackendLogging(&config); initPurple(); diff --git a/plugin/cpp/CMakeLists.txt b/plugin/cpp/CMakeLists.txt index 544e2ec2..b41b3453 100644 --- a/plugin/cpp/CMakeLists.txt +++ b/plugin/cpp/CMakeLists.txt @@ -3,6 +3,8 @@ FILE(GLOB SRC *.cpp *.h) FILE(GLOB HEADERS ../include/transport/*.h) set(EXTRA_SOURCES ${CMAKE_CURRENT_BINARY_DIR}/../../src/memoryusage.cpp) +set(EXTRA_SOURCES ${EXTRA_SOURCES} ${CMAKE_CURRENT_BINARY_DIR}/../../src/logging.cpp) +set(EXTRA_SOURCES ${EXTRA_SOURCES} ${CMAKE_CURRENT_BINARY_DIR}/../../src/config.cpp) set(EXTRA_SOURCES ${EXTRA_SOURCES} ${CMAKE_CURRENT_BINARY_DIR}/../../include/transport/protocol.pb.cc) if (NOT WIN32) @@ -18,9 +20,9 @@ if (CMAKE_COMPILER_IS_GNUCXX) endif() if (NOT WIN32) - TARGET_LINK_LIBRARIES(transport-plugin ${PROTOBUF_LIBRARIES} ${LOG4CXX_LIBRARIES}) + TARGET_LINK_LIBRARIES(transport-plugin ${PROTOBUF_LIBRARIES} ${LOG4CXX_LIBRARIES} ${Boost_LIBRARIES}) else() - TARGET_LINK_LIBRARIES(transport-plugin ${PROTOBUF_LIBRARIES} ${LOG4CXX_LIBRARIES} ws2_32.lib) + TARGET_LINK_LIBRARIES(transport-plugin ${PROTOBUF_LIBRARIES} ${LOG4CXX_LIBRARIES} ${Boost_LIBRARIES} ws2_32.lib) endif() SET_TARGET_PROPERTIES(transport-plugin PROPERTIES diff --git a/src/config.cpp b/src/config.cpp index 7088889c..5962cc25 100644 --- a/src/config.cpp +++ b/src/config.cpp @@ -19,7 +19,6 @@ */ #include "transport/config.h" -#include "transport/util.h" #include #ifdef _MSC_VER #include @@ -31,6 +30,14 @@ using namespace boost::program_options; namespace Transport { +int getRandomPort(const std::string &s) { + unsigned long r = 0; + BOOST_FOREACH(char c, s) { + r += (int) c; + } + srand(time(NULL) + r); + return 30000 + rand() % 10000; +} bool Config::load(const std::string &configfile, boost::program_options::options_description &opts, const std::string &jid) { std::ifstream ifs(configfile.c_str()); @@ -126,7 +133,7 @@ bool Config::load(std::istream &ifs, boost::program_options::options_description else if (opt.string_key == "service.backend_port") { found_backend_port = true; if (opt.value[0] == "0") { - opt.value[0] = boost::lexical_cast(Util::getRandomPort(_jid.empty() ? jid : _jid)); + opt.value[0] = boost::lexical_cast(getRandomPort(_jid.empty() ? jid : _jid)); } } else if (opt.string_key == "service.working_dir") { @@ -152,7 +159,7 @@ bool Config::load(std::istream &ifs, boost::program_options::options_description } if (!found_backend_port) { std::vector value; - std::string p = boost::lexical_cast(Util::getRandomPort(_jid.empty() ? jid : _jid)); + std::string p = boost::lexical_cast(getRandomPort(_jid.empty() ? jid : _jid)); value.push_back(p); parsed.options.push_back(boost::program_options::basic_option("service.backend_port", value)); } From 7c93aee6f49a37fd1956a42afebf93935b116ffa Mon Sep 17 00:00:00 2001 From: HanzZ Date: Wed, 21 Mar 2012 16:31:51 +0100 Subject: [PATCH 068/143] Log4cxx is optional dependency now --- CMakeLists.txt | 6 ++- backends/libcommuni/main.cpp | 10 ----- backends/libcommuni/session.cpp | 6 +-- .../libcommuni/singleircnetworkplugin.cpp | 6 +-- backends/libpurple/geventloop.cpp | 6 +-- backends/libpurple/main.cpp | 13 ++----- backends/skype/main.cpp | 11 +----- backends/smstools3/main.cpp | 11 +----- backends/template/main.cpp | 39 ++----------------- .../TLS/OpenSSL/OpenSSLServerContext.cpp | 8 +--- include/transport/logging.h | 22 +++++++++++ plugin/cpp/networkplugin.cpp | 9 ++--- spectrum/src/main.cpp | 11 +----- src/admininterface.cpp | 6 +-- src/blockresponder.cpp | 6 +-- src/conversation.cpp | 5 --- src/conversationmanager.cpp | 6 +-- src/filetransfermanager.cpp | 6 +-- src/gatewayresponder.cpp | 6 +-- src/logging.cpp | 20 ++++++---- src/memoryreadbytestream.cpp | 3 -- src/mysqlbackend.cpp | 6 +-- src/networkpluginserver.cpp | 6 +-- src/rostermanager.cpp | 6 +-- src/rosterresponder.cpp | 6 +-- src/sqlite3backend.cpp | 6 +-- src/statsresponder.cpp | 6 +-- src/storageresponder.cpp | 6 +-- src/tests/main.cpp | 4 ++ src/transport.cpp | 10 ++--- src/user.cpp | 5 +-- src/usermanager.cpp | 7 ++-- src/userregistration.cpp | 5 +-- src/userregistry.cpp | 6 +-- src/usersreconnecter.cpp | 6 +-- src/vcardresponder.cpp | 6 +-- 36 files changed, 104 insertions(+), 203 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 3c1ef558..78c29c74 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -167,10 +167,12 @@ else() endif() if (LOG4CXX_FOUND) - message("Logging : yes") + message("Log4cxx : yes") include_directories(${LOG4CXX_INCLUDE_DIR}) + ADD_DEFINITIONS(-DWITH_LOG4CXX) else() - message(FATAL_ERROR "Logging : no (install log4cxx-devel)") + set(LOG4CXX_LIBRARIES "") + message("Log4cxx : no (install log4cxx-devel)") endif() if (WIN32) diff --git a/backends/libcommuni/main.cpp b/backends/libcommuni/main.cpp index 6443c2bd..9b717d4c 100644 --- a/backends/libcommuni/main.cpp +++ b/backends/libcommuni/main.cpp @@ -18,19 +18,9 @@ #include "ircnetworkplugin.h" #include "singleircnetworkplugin.h" -#include "log4cxx/logger.h" -#include "log4cxx/consoleappender.h" -#include "log4cxx/patternlayout.h" -#include "log4cxx/propertyconfigurator.h" -#include "log4cxx/helpers/properties.h" -#include "log4cxx/helpers/fileinputstream.h" -#include "log4cxx/helpers/transcoder.h" - using namespace boost::program_options; using namespace Transport; -using namespace log4cxx; - NetworkPlugin * np = NULL; int main (int argc, char* argv[]) { diff --git a/backends/libcommuni/session.cpp b/backends/libcommuni/session.cpp index 971c2c0c..ac972b5f 100644 --- a/backends/libcommuni/session.cpp +++ b/backends/libcommuni/session.cpp @@ -15,11 +15,9 @@ #include #include -#include "log4cxx/logger.h" +#include "transport/logging.h" -using namespace log4cxx; - -static LoggerPtr logger = log4cxx::Logger::getLogger("IRCSession"); +DEFINE_LOGGER(logger, "IRCSession"); MyIrcSession::MyIrcSession(const std::string &user, NetworkPlugin *np, const std::string &suffix, QObject* parent) : IrcSession(parent) { diff --git a/backends/libcommuni/singleircnetworkplugin.cpp b/backends/libcommuni/singleircnetworkplugin.cpp index 06bd378c..f668e543 100644 --- a/backends/libcommuni/singleircnetworkplugin.cpp +++ b/backends/libcommuni/singleircnetworkplugin.cpp @@ -1,11 +1,9 @@ #include "singleircnetworkplugin.h" -#include "log4cxx/logger.h" +#include "transport/logging.h" #include #include -using namespace log4cxx; - -static LoggerPtr logger = log4cxx::Logger::getLogger("SingleIRCNetworkPlugin"); +DEFINE_LOGGER(logger, "SingleIRCNetworkPlugin"); SingleIRCNetworkPlugin::SingleIRCNetworkPlugin(Config *config, Swift::QtEventLoop *loop, const std::string &host, int port) { this->config = config; diff --git a/backends/libpurple/geventloop.cpp b/backends/libpurple/geventloop.cpp index b32c893d..1dacea40 100644 --- a/backends/libpurple/geventloop.cpp +++ b/backends/libpurple/geventloop.cpp @@ -28,11 +28,9 @@ #include "event.h" #endif -#include "log4cxx/logger.h" +#include "transport/logging.h" -using namespace log4cxx; - -static LoggerPtr logger = Logger::getLogger("EventLoop"); +DEFINE_LOGGER(logger, "EventLoop"); typedef struct _PurpleIOClosure { PurpleInputFunction function; diff --git a/backends/libpurple/main.cpp b/backends/libpurple/main.cpp index a39f5218..c971f273 100644 --- a/backends/libpurple/main.cpp +++ b/backends/libpurple/main.cpp @@ -8,14 +8,8 @@ #include "transport/networkplugin.h" #include "transport/logging.h" #include "transport/config.h" +#include "transport/logging.h" #include "geventloop.h" -#include "log4cxx/logger.h" -#include "log4cxx/consoleappender.h" -#include "log4cxx/patternlayout.h" -#include "log4cxx/propertyconfigurator.h" -#include "log4cxx/helpers/properties.h" -#include "log4cxx/helpers/fileinputstream.h" -#include "log4cxx/helpers/transcoder.h" // #include "valgrind/memcheck.h" #include "malloc.h" @@ -33,10 +27,9 @@ #define getpid _getpid #endif -using namespace log4cxx; +DEFINE_LOGGER(logger_libpurple, "libpurple"); +DEFINE_LOGGER(logger, "backend"); -static LoggerPtr logger_libpurple = log4cxx::Logger::getLogger("libpurple"); -static LoggerPtr logger = log4cxx::Logger::getLogger("backend"); int main_socket; static int writeInput; diff --git a/backends/skype/main.cpp b/backends/skype/main.cpp index c98b1498..7a081114 100644 --- a/backends/skype/main.cpp +++ b/backends/skype/main.cpp @@ -14,13 +14,8 @@ #include "transport/rostermanager.h" #include "transport/conversation.h" #include "transport/networkplugin.h" +#include "transport/logger.h" #include -#include "log4cxx/logger.h" -#include "log4cxx/consoleappender.h" -#include "log4cxx/patternlayout.h" -#include "log4cxx/propertyconfigurator.h" -#include "log4cxx/helpers/properties.h" -#include "log4cxx/helpers/fileinputstream.h" #include "sys/wait.h" #include "sys/signal.h" // #include "valgrind/memcheck.h" @@ -28,9 +23,7 @@ #include -using namespace log4cxx; - -static LoggerPtr logger = Logger::getLogger("backend"); +DEFINE_LOGGER(logger, "backend"); using namespace Transport; diff --git a/backends/smstools3/main.cpp b/backends/smstools3/main.cpp index a6502bdc..2e61868c 100644 --- a/backends/smstools3/main.cpp +++ b/backends/smstools3/main.cpp @@ -26,13 +26,6 @@ Swift::SimpleEventLoop *loop_; -#include "log4cxx/logger.h" -#include "log4cxx/consoleappender.h" -#include "log4cxx/patternlayout.h" -#include "log4cxx/propertyconfigurator.h" -#include "log4cxx/helpers/properties.h" -#include "log4cxx/helpers/fileinputstream.h" -#include "log4cxx/helpers/transcoder.h" #include #include @@ -41,9 +34,7 @@ using namespace boost::filesystem; using namespace boost::program_options; using namespace Transport; -using namespace log4cxx; - -static LoggerPtr logger = log4cxx::Logger::getLogger("SMSNetworkPlugin"); +DEFINE_LOGGER(logger, "SMSNetworkPlugin"); #define INTERNAL_USER "/sms@backend@internal@user" diff --git a/backends/template/main.cpp b/backends/template/main.cpp index 44fc8623..595ce42d 100644 --- a/backends/template/main.cpp +++ b/backends/template/main.cpp @@ -1,6 +1,7 @@ // Transport includes #include "transport/config.h" #include "transport/networkplugin.h" +#include "transport/logging.h" // Swiften #include "Swiften/Swiften.h" @@ -11,24 +12,13 @@ #include "sys/wait.h" #include "sys/signal.h" -// Log4cxx -#include "log4cxx/logger.h" -#include "log4cxx/consoleappender.h" -#include "log4cxx/patternlayout.h" -#include "log4cxx/propertyconfigurator.h" -#include "log4cxx/helpers/properties.h" -#include "log4cxx/helpers/fileinputstream.h" -#include "log4cxx/helpers/transcoder.h" - // Boost #include using namespace boost::filesystem; using namespace boost::program_options; using namespace Transport; -// log4cxx main logger -using namespace log4cxx; -static LoggerPtr logger = log4cxx::Logger::getLogger("Backend Template"); +DEFINE_LOGGER(logger, "Backend Template"); // eventloop Swift::SimpleEventLoop *loop_; @@ -147,30 +137,7 @@ int main (int argc, char* argv[]) { return 1; } - if (CONFIG_STRING(&config, "logging.backend_config").empty()) { - LoggerPtr root = log4cxx::Logger::getRootLogger(); -#ifndef _MSC_VER - root->addAppender(new ConsoleAppender(new PatternLayout("%d %-5p %c: %m%n"))); -#else - root->addAppender(new ConsoleAppender(new PatternLayout(L"%d %-5p %c: %m%n"))); -#endif - } - else { - log4cxx::helpers::Properties p; - log4cxx::helpers::FileInputStream *istream = new log4cxx::helpers::FileInputStream(CONFIG_STRING(&config, "logging.backend_config")); - p.load(istream); - LogString pid, jid; - log4cxx::helpers::Transcoder::decode(boost::lexical_cast(getpid()), pid); - log4cxx::helpers::Transcoder::decode(CONFIG_STRING(&config, "service.jid"), jid); -#ifdef _MSC_VER - p.setProperty(L"pid", pid); - p.setProperty(L"jid", jid); -#else - p.setProperty("pid", pid); - p.setProperty("jid", jid); -#endif - log4cxx::PropertyConfigurator::configure(p); - } + Logging::initBackendLogging(&config); Swift::SimpleEventLoop eventLoop; loop_ = &eventLoop; diff --git a/include/Swiften/TLS/OpenSSL/OpenSSLServerContext.cpp b/include/Swiften/TLS/OpenSSL/OpenSSLServerContext.cpp index ebf798be..40218daa 100644 --- a/include/Swiften/TLS/OpenSSL/OpenSSLServerContext.cpp +++ b/include/Swiften/TLS/OpenSSL/OpenSSLServerContext.cpp @@ -14,12 +14,8 @@ #include #include -#include "log4cxx/logger.h" -#include "log4cxx/consoleappender.h" -#include "log4cxx/patternlayout.h" -#include "log4cxx/propertyconfigurator.h" -using namespace log4cxx; -static LoggerPtr logger = Logger::getLogger("OpenSSLServerContext"); +#include "transport/logging.h" +DEFINE_LOGGER(logger, "OpenSSLServerContext"); #include "Swiften/TLS/OpenSSL/OpenSSLServerContext.h" diff --git a/include/transport/logging.h b/include/transport/logging.h index 79b1dfd5..4abf92dd 100644 --- a/include/transport/logging.h +++ b/include/transport/logging.h @@ -24,6 +24,28 @@ #include #include #include +#include + +#ifdef WITH_LOG4CXX +#include "log4cxx/logger.h" +#include "log4cxx/consoleappender.h" +#include "log4cxx/patternlayout.h" +#include "log4cxx/propertyconfigurator.h" +#include "log4cxx/helpers/properties.h" +#include "log4cxx/helpers/fileinputstream.h" +#include "log4cxx/helpers/transcoder.h" +#include "log4cxx/logger.h" + +#define DEFINE_LOGGER(VAR, NAME) static log4cxx::LoggerPtr VAR = log4cxx::Logger::getLogger(NAME); + +using namespace log4cxx; +#else +#define DEFINE_LOGGER(VARIABLE, NAME) static const char *VARIABLE = NAME; + +#define LOG4CXX_ERROR(LOGGER, DATA) std::cerr << "E: <" << LOGGER << "> " << DATA << "\n"; +#define LOG4CXX_WARN(LOGGER, DATA) std::cout << "W: <" << LOGGER << "> " << DATA << "\n"; +#define LOG4CXX_INFO(LOGGER, DATA) std::cout << "I: <" << LOGGER << "> " << DATA << "\n"; +#endif namespace Transport { diff --git a/plugin/cpp/networkplugin.cpp b/plugin/cpp/networkplugin.cpp index 1b7f448c..179b2f08 100644 --- a/plugin/cpp/networkplugin.cpp +++ b/plugin/cpp/networkplugin.cpp @@ -19,9 +19,10 @@ */ #include "transport/networkplugin.h" -#include "log4cxx/logger.h" -#include "log4cxx/basicconfigurator.h" #include "transport/memoryusage.h" +#include "transport/logging.h" + +#include #ifndef WIN32 #include @@ -32,9 +33,7 @@ #define getpid _getpid #endif -using namespace log4cxx; - -static LoggerPtr logger = Logger::getLogger("NetworkPlugin"); +DEFINE_LOGGER(logger, "NetworkPlugin"); namespace Transport { diff --git a/spectrum/src/main.cpp b/spectrum/src/main.cpp index be525f60..82540d11 100644 --- a/spectrum/src/main.cpp +++ b/spectrum/src/main.cpp @@ -26,20 +26,11 @@ #else #include #endif -#include "log4cxx/logger.h" -#include "log4cxx/consoleappender.h" -#include "log4cxx/patternlayout.h" -#include "log4cxx/propertyconfigurator.h" -#include "log4cxx/helpers/properties.h" -#include "log4cxx/helpers/transcoder.h" -#include "log4cxx/helpers/fileinputstream.h" #include -using namespace log4cxx; - using namespace Transport; -static LoggerPtr logger = log4cxx::Logger::getLogger("Spectrum"); +DEFINE_LOGGER(logger, "Spectrum"); Swift::SimpleEventLoop *eventLoop_ = NULL; Component *component_ = NULL; diff --git a/src/admininterface.cpp b/src/admininterface.cpp index cec4dfa6..c79db37c 100644 --- a/src/admininterface.cpp +++ b/src/admininterface.cpp @@ -26,16 +26,14 @@ #include "transport/rostermanager.h" #include "transport/usermanager.h" #include "transport/networkpluginserver.h" +#include "transport/logging.h" #include "storageresponder.h" -#include "log4cxx/logger.h" #include "transport/memoryusage.h" #include -using namespace log4cxx; - namespace Transport { -static LoggerPtr logger = Logger::getLogger("AdminInterface"); +DEFINE_LOGGER(logger, "AdminInterface"); static std::string getArg(const std::string &body) { std::string ret; diff --git a/src/blockresponder.cpp b/src/blockresponder.cpp index 9737907a..708fec43 100644 --- a/src/blockresponder.cpp +++ b/src/blockresponder.cpp @@ -29,16 +29,14 @@ #include "transport/user.h" #include "transport/buddy.h" #include "transport/rostermanager.h" -#include "log4cxx/logger.h" - -using namespace log4cxx; +#include "transport/logging.h" using namespace Swift; using namespace boost; namespace Transport { -static LoggerPtr logger = Logger::getLogger("BlockResponder"); +DEFINE_LOGGER(logger, "BlockResponder"); BlockResponder::BlockResponder(Swift::IQRouter *router, UserManager *userManager) : Swift::SetResponder(router) { m_userManager = userManager; diff --git a/src/conversation.cpp b/src/conversation.cpp index d903e320..571a4cde 100644 --- a/src/conversation.cpp +++ b/src/conversation.cpp @@ -25,14 +25,9 @@ #include "transport/transport.h" #include "transport/buddy.h" #include "transport/rostermanager.h" -#include "log4cxx/logger.h" - -using namespace log4cxx; namespace Transport { -// static LoggerPtr logger = Logger::getLogger("Conversation"); - Conversation::Conversation(ConversationManager *conversationManager, const std::string &legacyName, bool isMUC) : m_conversationManager(conversationManager) { m_legacyName = legacyName; m_conversationManager->addConversation(this); diff --git a/src/conversationmanager.cpp b/src/conversationmanager.cpp index bc08d7a7..6a5d7d16 100644 --- a/src/conversationmanager.cpp +++ b/src/conversationmanager.cpp @@ -24,16 +24,14 @@ #include "transport/buddy.h" #include "transport/factory.h" #include "transport/user.h" +#include "transport/logging.h" #include "Swiften/Roster/SetRosterRequest.h" #include "Swiften/Elements/RosterPayload.h" #include "Swiften/Elements/RosterItemPayload.h" -#include "log4cxx/logger.h" - -using namespace log4cxx; namespace Transport { -static LoggerPtr logger = Logger::getLogger("ConversationManager"); +DEFINE_LOGGER(logger, "ConversationManager"); ConversationManager::ConversationManager(User *user, Component *component){ m_user = user; diff --git a/src/filetransfermanager.cpp b/src/filetransfermanager.cpp index 8fcacdcf..73c08a86 100644 --- a/src/filetransfermanager.cpp +++ b/src/filetransfermanager.cpp @@ -23,13 +23,11 @@ #include "transport/usermanager.h" #include "transport/user.h" #include "transport/buddy.h" -#include "log4cxx/logger.h" - -using namespace log4cxx; +#include "transport/logging.h" namespace Transport { -static LoggerPtr logger = Logger::getLogger("FileTransferManager"); +DEFINE_LOGGER(logger, "FileTransferManager"); FileTransferManager::FileTransferManager(Component *component, UserManager *userManager) { m_component = component; diff --git a/src/gatewayresponder.cpp b/src/gatewayresponder.cpp index 903c069a..2f7c0c35 100644 --- a/src/gatewayresponder.cpp +++ b/src/gatewayresponder.cpp @@ -28,16 +28,14 @@ #include "transport/usermanager.h" #include "transport/user.h" #include "transport/transport.h" -#include "log4cxx/logger.h" - -using namespace log4cxx; +#include "transport/logging.h" using namespace Swift; using namespace boost; namespace Transport { -static LoggerPtr logger = Logger::getLogger("GatewayResponder"); +DEFINE_LOGGER(logger, "GatewayResponder"); GatewayResponder::GatewayResponder(Swift::IQRouter *router, UserManager *userManager) : Swift::Responder(router) { m_userManager = userManager; diff --git a/src/logging.cpp b/src/logging.cpp index fc9f94b3..3d56878f 100644 --- a/src/logging.cpp +++ b/src/logging.cpp @@ -25,13 +25,7 @@ #include #include -#include "log4cxx/logger.h" -#include "log4cxx/consoleappender.h" -#include "log4cxx/patternlayout.h" -#include "log4cxx/propertyconfigurator.h" -#include "log4cxx/helpers/properties.h" -#include "log4cxx/helpers/fileinputstream.h" -#include "log4cxx/helpers/transcoder.h" + #include #include @@ -48,12 +42,14 @@ #endif using namespace boost::filesystem; -using namespace log4cxx; + namespace Transport { namespace Logging { +#ifdef WITH_LOG4CXX +using namespace log4cxx; static LoggerPtr root; static void initLogging(Config *config, std::string key) { @@ -143,6 +139,14 @@ void initMainLogging(Config *config) { initLogging(config, "logging.config"); } +#else /* WITH_LOG4CXX */ +void initBackendLogging(Config */*config*/) { +} + +void initMainLogging(Config */*config*/) { +} +#endif /* WITH_LOG4CXX */ + } } diff --git a/src/memoryreadbytestream.cpp b/src/memoryreadbytestream.cpp index 1c74ec3e..83514ada 100644 --- a/src/memoryreadbytestream.cpp +++ b/src/memoryreadbytestream.cpp @@ -19,11 +19,8 @@ */ #include "transport/memoryreadbytestream.h" -#include "log4cxx/logger.h" #include -using namespace log4cxx; - namespace Transport { MemoryReadBytestream::MemoryReadBytestream(unsigned long size) { diff --git a/src/mysqlbackend.cpp b/src/mysqlbackend.cpp index 1af53c3a..9bb5eaef 100644 --- a/src/mysqlbackend.cpp +++ b/src/mysqlbackend.cpp @@ -22,10 +22,8 @@ #include "transport/mysqlbackend.h" #include "transport/util.h" +#include "transport/logging.h" #include -#include "log4cxx/logger.h" - -using namespace log4cxx; #define MYSQL_DB_VERSION 2 #define CHECK_DB_RESPONSE(stmt) \ @@ -92,7 +90,7 @@ using namespace boost; namespace Transport { -static LoggerPtr logger = Logger::getLogger("MySQLBackend"); +DEFINE_LOGGER(logger, "MySQLBackend"); static bool exec_ok; MySQLBackend::Statement::Statement(MYSQL *conn, const std::string &format, const std::string &statement) { diff --git a/src/networkpluginserver.cpp b/src/networkpluginserver.cpp index 00f601d7..90d66759 100644 --- a/src/networkpluginserver.cpp +++ b/src/networkpluginserver.cpp @@ -31,6 +31,7 @@ #include "transport/vcardresponder.h" #include "transport/rosterresponder.h" #include "transport/memoryreadbytestream.h" +#include "transport/logging.h" #include "blockresponder.h" #include "Swiften/Swiften.h" #include "Swiften/Server/ServerStanzaChannel.h" @@ -41,7 +42,6 @@ #include "Swiften/Elements/InvisiblePayload.h" #include "Swiften/Elements/SpectrumErrorPayload.h" #include "transport/protocol.pb.h" -#include "log4cxx/logger.h" #include #include @@ -55,14 +55,12 @@ #include "popt.h" #endif -using namespace log4cxx; - namespace Transport { static unsigned long backend_id; static unsigned long bytestream_id; -static LoggerPtr logger = Logger::getLogger("NetworkPluginServer"); +DEFINE_LOGGER(logger, "NetworkPluginServer"); class NetworkConversation : public Conversation { public: diff --git a/src/rostermanager.cpp b/src/rostermanager.cpp index 1bde0173..ea49430b 100644 --- a/src/rostermanager.cpp +++ b/src/rostermanager.cpp @@ -25,21 +25,19 @@ #include "transport/usermanager.h" #include "transport/buddy.h" #include "transport/user.h" +#include "transport/logging.h" #include "Swiften/Roster/SetRosterRequest.h" #include "Swiften/Elements/RosterPayload.h" #include "Swiften/Elements/RosterItemPayload.h" #include "Swiften/Elements/RosterItemExchangePayload.h" -#include "log4cxx/logger.h" #include #include #include -using namespace log4cxx; - namespace Transport { -static LoggerPtr logger = Logger::getLogger("RosterManager"); +DEFINE_LOGGER(logger, "RosterManager"); RosterManager::RosterManager(User *user, Component *component){ m_rosterStorage = NULL; diff --git a/src/rosterresponder.cpp b/src/rosterresponder.cpp index fe243bcc..3b0c4612 100644 --- a/src/rosterresponder.cpp +++ b/src/rosterresponder.cpp @@ -28,16 +28,14 @@ #include "transport/usermanager.h" #include "transport/rostermanager.h" #include "transport/buddy.h" -#include "log4cxx/logger.h" - -using namespace log4cxx; +#include "transport/logging.h" using namespace Swift; using namespace boost; namespace Transport { -static LoggerPtr logger = Logger::getLogger("RosterResponder"); +DEFINE_LOGGER(logger, "RosterResponder"); RosterResponder::RosterResponder(Swift::IQRouter *router, UserManager *userManager) : Swift::Responder(router) { m_userManager = userManager; diff --git a/src/sqlite3backend.cpp b/src/sqlite3backend.cpp index c61ca628..e9a11dac 100644 --- a/src/sqlite3backend.cpp +++ b/src/sqlite3backend.cpp @@ -22,10 +22,8 @@ #include "transport/sqlite3backend.h" #include "transport/util.h" +#include "transport/logging.h" #include -#include "log4cxx/logger.h" - -using namespace log4cxx; #define SQLITE_DB_VERSION 3 #define CHECK_DB_RESPONSE(stmt) \ @@ -65,7 +63,7 @@ using namespace boost; namespace Transport { -static LoggerPtr logger = Logger::getLogger("SQLite3Backend"); +DEFINE_LOGGER(logger, "SQLite3Backend"); SQLite3Backend::SQLite3Backend(Config *config) { m_config = config; diff --git a/src/statsresponder.cpp b/src/statsresponder.cpp index bf4e4b5f..4ba24e71 100644 --- a/src/statsresponder.cpp +++ b/src/statsresponder.cpp @@ -34,16 +34,14 @@ #include "transport/rostermanager.h" #include "transport/usermanager.h" #include "transport/networkpluginserver.h" -#include "log4cxx/logger.h" - -using namespace log4cxx; +#include "transport/logging.h" using namespace Swift; using namespace boost; namespace Transport { -static LoggerPtr logger = Logger::getLogger("StatsResponder"); +DEFINE_LOGGER(logger, "StatsResponder"); StatsResponder::StatsResponder(Component *component, UserManager *userManager, NetworkPluginServer *server, StorageBackend *storageBackend) : Swift::Responder(component->getIQRouter()) { m_component = component; diff --git a/src/storageresponder.cpp b/src/storageresponder.cpp index b5f4e5aa..1b3d2aa9 100644 --- a/src/storageresponder.cpp +++ b/src/storageresponder.cpp @@ -27,16 +27,14 @@ #include "Swiften/Swiften.h" #include "transport/usermanager.h" #include "transport/user.h" -#include "log4cxx/logger.h" - -using namespace log4cxx; +#include "transport/logging.h" using namespace Swift; using namespace boost; namespace Transport { -static LoggerPtr logger = Logger::getLogger("StorageResponder"); +DEFINE_LOGGER(logger, "StorageResponder"); StorageResponder::StorageResponder(Swift::IQRouter *router, StorageBackend *storageBackend, UserManager *userManager) : Swift::Responder(router) { m_storageBackend = storageBackend; diff --git a/src/tests/main.cpp b/src/tests/main.cpp index 55ba41ae..aea740f0 100644 --- a/src/tests/main.cpp +++ b/src/tests/main.cpp @@ -5,18 +5,22 @@ #include #include #include +#ifdef WITH_LOG4CXX #include "log4cxx/logger.h" #include "log4cxx/fileappender.h" #include "log4cxx/patternlayout.h" #include "log4cxx/propertyconfigurator.h" using namespace log4cxx; +#endif int main (int argc, char* argv[]) { +#ifdef WITH_LOG4CXX LoggerPtr root = Logger::getRootLogger(); root->addAppender(new FileAppender(new PatternLayout("%d %-5p %c: %m%n"), "libtransport_test.log", false)); +#endif // informs test-listener about testresults CPPUNIT_NS :: TestResult testresult; diff --git a/src/transport.cpp b/src/transport.cpp index 8eab7bf7..581670af 100644 --- a/src/transport.cpp +++ b/src/transport.cpp @@ -24,6 +24,7 @@ #include "transport/storagebackend.h" #include "transport/factory.h" #include "transport/userregistry.h" +#include "transport/logging.h" #include "discoinforesponder.h" #include "discoitemsresponder.h" #include "storageparser.h" @@ -43,20 +44,15 @@ #include "transport/BlockSerializer.h" #include "Swiften/Parser/PayloadParsers/InvisibleParser.h" #include "Swiften/Serializer/PayloadSerializers/InvisibleSerializer.h" -#include "log4cxx/logger.h" -#include "log4cxx/consoleappender.h" -#include "log4cxx/patternlayout.h" -#include "log4cxx/propertyconfigurator.h" #include "Swiften/Swiften.h" using namespace Swift; using namespace boost; -using namespace log4cxx; namespace Transport { -static LoggerPtr logger = Logger::getLogger("Component"); -static LoggerPtr logger_xml = Logger::getLogger("Component.XML"); +DEFINE_LOGGER(logger, "Component"); +DEFINE_LOGGER(logger_xml, "Component.XML"); Component::Component(Swift::EventLoop *loop, Swift::NetworkFactories *factories, Config *config, Factory *factory, Transport::UserRegistry *userRegistry) { m_component = NULL; diff --git a/src/user.cpp b/src/user.cpp index 0baedfa9..d347f795 100644 --- a/src/user.cpp +++ b/src/user.cpp @@ -25,24 +25,23 @@ #include "transport/usermanager.h" #include "transport/conversationmanager.h" #include "transport/presenceoracle.h" +#include "transport/logging.h" #include "Swiften/Swiften.h" #include "Swiften/Server/ServerStanzaChannel.h" #include "Swiften/Elements/StreamError.h" #include "Swiften/Elements/MUCPayload.h" #include "Swiften/Elements/SpectrumErrorPayload.h" -#include "log4cxx/logger.h" #include #include #include -using namespace log4cxx; using namespace boost; #define foreach BOOST_FOREACH namespace Transport { -static LoggerPtr logger = Logger::getLogger("User"); +DEFINE_LOGGER(logger, "User"); User::User(const Swift::JID &jid, UserInfo &userInfo, Component *component, UserManager *userManager) { m_jid = jid.toBare(); diff --git a/src/usermanager.cpp b/src/usermanager.cpp index 52e41607..82371146 100644 --- a/src/usermanager.cpp +++ b/src/usermanager.cpp @@ -25,19 +25,18 @@ #include "transport/conversationmanager.h" #include "transport/rostermanager.h" #include "transport/userregistry.h" +#include "transport/logging.h" #include "storageresponder.h" -#include "log4cxx/logger.h" + #include "Swiften/Swiften.h" #include "Swiften/Server/ServerStanzaChannel.h" #include "Swiften/Elements/StreamError.h" #include "malloc.h" // #include "valgrind/memcheck.h" -using namespace log4cxx; - namespace Transport { -static LoggerPtr logger = Logger::getLogger("UserManager"); +DEFINE_LOGGER(logger, "UserManager"); UserManager::UserManager(Component *component, UserRegistry *userRegistry, StorageBackend *storageBackend) { m_cachedUser = NULL; diff --git a/src/userregistration.cpp b/src/userregistration.cpp index db7ab22e..0e23217f 100644 --- a/src/userregistration.cpp +++ b/src/userregistration.cpp @@ -24,18 +24,17 @@ #include "transport/transport.h" #include "transport/rostermanager.h" #include "transport/user.h" +#include "transport/logging.h" #include "Swiften/Elements/ErrorPayload.h" #include #include #include -#include "log4cxx/logger.h" using namespace Swift; -using namespace log4cxx; namespace Transport { -static LoggerPtr logger = Logger::getLogger("UserRegistration"); +DEFINE_LOGGER(logger, "UserRegistration"); UserRegistration::UserRegistration(Component *component, UserManager *userManager, StorageBackend *storageBackend) : Swift::Responder(component->m_iqRouter) { m_component = component; diff --git a/src/userregistry.cpp b/src/userregistry.cpp index 00b72135..81f6806c 100644 --- a/src/userregistry.cpp +++ b/src/userregistry.cpp @@ -23,13 +23,11 @@ #include "Swiften/Swiften.h" #include "Swiften/Server/UserRegistry.h" #include "transport/userregistry.h" -#include "log4cxx/logger.h" - -using namespace log4cxx; +#include "transport/logging.h" namespace Transport { -static LoggerPtr logger = Logger::getLogger("UserRegistry"); +DEFINE_LOGGER(logger, "UserRegistry"); UserRegistry::UserRegistry(Config *cfg, Swift::NetworkFactories *factories) { config = cfg; diff --git a/src/usersreconnecter.cpp b/src/usersreconnecter.cpp index 0ba66afb..7a7ecdfd 100644 --- a/src/usersreconnecter.cpp +++ b/src/usersreconnecter.cpp @@ -26,16 +26,14 @@ #include "Swiften/Swiften.h" #include "transport/storagebackend.h" #include "transport/transport.h" -#include "log4cxx/logger.h" - -using namespace log4cxx; +#include "transport/logging.h" using namespace Swift; using namespace boost; namespace Transport { -static LoggerPtr logger = Logger::getLogger("UserReconnecter"); +DEFINE_LOGGER(logger, "UserReconnecter"); UsersReconnecter::UsersReconnecter(Component *component, StorageBackend *storageBackend) { m_component = component; diff --git a/src/vcardresponder.cpp b/src/vcardresponder.cpp index 4277d70d..83ff2acc 100644 --- a/src/vcardresponder.cpp +++ b/src/vcardresponder.cpp @@ -28,16 +28,14 @@ #include "transport/usermanager.h" #include "transport/rostermanager.h" #include "transport/transport.h" -#include "log4cxx/logger.h" - -using namespace log4cxx; +#include "transport/logging.h" using namespace Swift; using namespace boost; namespace Transport { -static LoggerPtr logger = Logger::getLogger("VCardResponder"); +DEFINE_LOGGER(logger, "VCardResponder"); VCardResponder::VCardResponder(Swift::IQRouter *router, Swift::NetworkFactories *factories, UserManager *userManager) : Swift::Responder(router) { m_id = 0; From 143a692c8df17a57aa77f664a8895b69b76d6f38 Mon Sep 17 00:00:00 2001 From: HanzZ Date: Wed, 21 Mar 2012 16:40:20 +0100 Subject: [PATCH 069/143] Changelog --- ChangeLog | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/ChangeLog b/ChangeLog index 69a7fd12..645ca3fa 100644 --- a/ChangeLog +++ b/ChangeLog @@ -6,6 +6,10 @@ Version 2.0.0-beta2 (2012-XX-XX): * Fixed username_mask setting. * Added new fields into statistics (backends_crashed, messages related stats). + * Log4cxx is now optional dependency. Without Log4cxx, Spectrum 2 logs + to standard output. + * Fixed crash when Log4cxx configuration file didn't exist. + * Admin can now see "Admin" contact in server-mode. libpurple: * Added support for MUC for prpl-jabber protocol. From 7a7f4fdaa916ab29f29311cafb7c12371d750656 Mon Sep 17 00:00:00 2001 From: Jan Kaluza Date: Thu, 22 Mar 2012 07:39:49 +0100 Subject: [PATCH 070/143] kill skype with SIGKILL --- backends/skype/main.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/backends/skype/main.cpp b/backends/skype/main.cpp index c98b1498..6329ef46 100644 --- a/backends/skype/main.cpp +++ b/backends/skype/main.cpp @@ -623,8 +623,12 @@ void Skype::logout() { send_command("SET USERSTATUS OFFLINE"); sleep(2); g_object_unref(m_proxy); - LOG4CXX_INFO(logger, m_username << ": Killing Skype instance"); + LOG4CXX_INFO(logger, m_username << ": Terminating Skype instance (SIGTERM)"); kill((int) m_pid, SIGTERM); + // Give skype a chance + sleep(2); + LOG4CXX_INFO(logger, m_username << ": Killing Skype instance (SIGKILL)"); + kill((int) m_pid, SIGKILL); m_pid = 0; } } From 03969481e476007ea0656cd716cceec192e2c96b Mon Sep 17 00:00:00 2001 From: Jan Kaluza Date: Thu, 22 Mar 2012 09:08:02 +0100 Subject: [PATCH 071/143] Do not count chatstate notification to statistics --- src/usermanager.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/usermanager.cpp b/src/usermanager.cpp index 82371146..b4bc0bd1 100644 --- a/src/usermanager.cpp +++ b/src/usermanager.cpp @@ -282,7 +282,12 @@ void UserManager::handleMessageReceived(Swift::Message::ref message) { } user->getConversationManager()->handleMessageReceived(message); - messageToBackendSent(); + + // Do not count chatstate notification... + boost::shared_ptr statePayload = msg->getPayload(); + if (!statePayload) { + messageToBackendSent(); + } } void UserManager::handleGeneralPresenceReceived(Swift::Presence::ref presence) { From 53ce06cbea74cddbd564ff7809b0f59424f32056 Mon Sep 17 00:00:00 2001 From: HanzZ Date: Fri, 23 Mar 2012 12:55:27 +0100 Subject: [PATCH 072/143] server cert for testing --- spectrum/src/server.p12 | Bin 0 -> 1717 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 spectrum/src/server.p12 diff --git a/spectrum/src/server.p12 b/spectrum/src/server.p12 new file mode 100644 index 0000000000000000000000000000000000000000..c05f6b5dfbc99414b42ede2ece1529796946a9bc GIT binary patch literal 1717 zcmY+Dc{tRGAIHsU$ThB?m_^iBBr|3m<5>D(9NP%FB4iFZduTeyIp1<0xn>9>IfiUR z!>p1ta+Q`fHRPPKxkeajskZdf^Za)A_xt1Xe4gj^emf(tq#g`LNTdP~HBHD4gp)GR9k6MZAuv4r-aMN|F{~?#{q+p>twY)~*kDQySkEORTqJd^%=7nUn1q8Qj~c52sZ73PpuRETPH618`KA!mKp&bw-{? zLKJzk@^o~E7AT-KIPy$|Zfi)2SQ+44IyVtSF}fV#8jnE~p&|W>wZ5yM43>qrMVU6lbFGeKFQdK32v#X^u2pSaV1-0tlkQc+CrL9V5L4t~B zZWC>I#Ez~=Zne3gTf!p|jXuS_VkeMYiu||JS%o#?cX1g~byZ3MHdU9r)^41w&-ePp zD^Nvlp@raV&)w>lT;R7;96Fh&N0~nO-IlQAGswj$_`g*x$`cOGh%h^>;fvJ_9{Tt> z>pE&XKcFd)q$Xoz)r|DRC)EQFDz}VA0C8vB;xkVj(Ew}3PS26l{5*o%^}V+P5m-xsCbn4kiW5= znrQH0aO;-?&Lt+UJUPZjk-%qy zqklzMs?oW`vA(&w9^3s&ZNGs@R=xFoa>&vvTJ^Hap)1sag1m2a56)wY`bc*F{*BH=l1*9$KZ3 zhPnKF*tqtOfHawT5fg_@g%$LuZ3 z1!_qSG2Fs+nG25DTgA5)CBj!{6&rTEK{2WXB~{DGsxJ*gpf7k#fxMRrDG=5z;;{97 zMKzUf2D>mwt=TM$7b%S!yC~gYd}8H+%+-BJ8h3Y47`=So`9NFv(65giFRfZX8!L5j zl9vClU6SjW@g0o5Eo$MZ7pY^y}mGM0x<^|4FO`Rv#xr*X;>E&H-PVsZxvAV6}ATe=!X+h<9e}w5%q4vyq z#M;WTDAYy#MGCi@Q}Jxy>Gi3ukGKuW^Wx(;6<<~}Hqh%@!AbHc!7C2!n)Vx({JV3> zL5q%&8<^Ux_4;(Z#;^-UHcSms8dLv}#iFR7~L^m}s*A3^q z`uc0}2g$K6ze&9O6_f*$O3IckSV{{j=;U3G=oie>s%f9E2|i`VB{O-C-wuaxN6%{ZM}Bq+I0Q9Q7RFuH%YT1o}03RS)<=k|C}hs#2$m+iQ$ z{JGlxc)kmR#T>v$!C{7S5U@H-0;(*CAr!t=ZfnT=KJ>|S&7XY?A1fggflUc>&B7Ns IeQWoB0GpW;MgRZ+ literal 0 HcmV?d00001 From 6ba5bdf44a3d16152bbb415fa03d436e2c4e6a77 Mon Sep 17 00:00:00 2001 From: HanzZ Date: Fri, 23 Mar 2012 13:09:24 +0100 Subject: [PATCH 073/143] fixed typo --- src/usermanager.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/usermanager.cpp b/src/usermanager.cpp index b4bc0bd1..2a9666d4 100644 --- a/src/usermanager.cpp +++ b/src/usermanager.cpp @@ -284,7 +284,7 @@ void UserManager::handleMessageReceived(Swift::Message::ref message) { user->getConversationManager()->handleMessageReceived(message); // Do not count chatstate notification... - boost::shared_ptr statePayload = msg->getPayload(); + boost::shared_ptr statePayload = message->getPayload(); if (!statePayload) { messageToBackendSent(); } From ece09d41b776472419101092e66aac6df555b18f Mon Sep 17 00:00:00 2001 From: HanzZ Date: Mon, 26 Mar 2012 18:10:25 +0200 Subject: [PATCH 074/143] registration.auto_register option --- .../libcommuni/singleircnetworkplugin.cpp | 10 ++++--- src/config.cpp | 1 + src/usermanager.cpp | 28 +++++++++++++++++++ 3 files changed, 35 insertions(+), 4 deletions(-) diff --git a/backends/libcommuni/singleircnetworkplugin.cpp b/backends/libcommuni/singleircnetworkplugin.cpp index f668e543..af44ccfa 100644 --- a/backends/libcommuni/singleircnetworkplugin.cpp +++ b/backends/libcommuni/singleircnetworkplugin.cpp @@ -50,10 +50,12 @@ void SingleIRCNetworkPlugin::handleLoginRequest(const std::string &user, const s session->setHost(QString::fromStdString(m_server)); session->setPort(6667); - std::string identify = m_identify; - boost::replace_all(identify, "$password", password); - boost::replace_all(identify, "$name", legacyName); - session->setIdentify(identify); + if (!password.empty()) { + std::string identify = m_identify; + boost::replace_all(identify, "$password", password); + boost::replace_all(identify, "$name", legacyName); + session->setIdentify(identify); + } session->open(); diff --git a/src/config.cpp b/src/config.cpp index 5962cc25..816e6fba 100644 --- a/src/config.cpp +++ b/src/config.cpp @@ -93,6 +93,7 @@ bool Config::load(std::istream &ifs, boost::program_options::options_description ("registration.instructions", value()->default_value("Enter your legacy network username and password."), "Instructions showed to user in registration form") ("registration.username_label", value()->default_value("Legacy network username:"), "Label for username field") ("registration.username_mask", value()->default_value(""), "Username mask") + ("registration.auto_register", value()->default_value(false), "Register new user automatically when the presence arrives.") ("registration.encoding", value()->default_value("utf8"), "Default encoding in registration form") ("registration.require_local_account", value()->default_value(false), "True if users have to have a local account to register to this transport from remote servers.") ("registration.local_username_label", value()->default_value("Local username:"), "Label for local usernme field") diff --git a/src/usermanager.cpp b/src/usermanager.cpp index 2a9666d4..671509f4 100644 --- a/src/usermanager.cpp +++ b/src/usermanager.cpp @@ -214,6 +214,34 @@ void UserManager::handlePresence(Swift::Presence::ref presence) { res.password = m_userRegistry->getUserPassword(userkey); } + // We allow auto_register feature in gateway-mode. This allows IRC user to register + // the transport just by joining the room. + if (!m_component->inServerMode()) { + if (!registered && CONFIG_BOOL(m_component->getConfig(), "registration.auto_register")) { + res.password = ""; + res.jid = userkey; + + bool isMUC = presence->getPayload() != NULL || *presence->getTo().getNode().c_str() == '#'; + if (isMUC) { + res.uin = presence->getTo().getResource(); + } + else { + res.uin = presence->getFrom().toString(); + } + LOG4CXX_INFO(logger, "Auto-registering user " << userkey << " with uin=" << res.uin); + + if (m_storageBackend) { + // store user and getUser again to get user ID. + m_storageBackend->setUser(res); + registered = m_storageBackend->getUser(userkey, res); + } + else { + registered = false; + } + } + } + + // Unregistered users are not able to login if (!registered) { LOG4CXX_WARN(logger, "Unregistered user " << userkey << " tried to login"); From 065127585a724926210da0a4d61e3faef496f238 Mon Sep 17 00:00:00 2001 From: HanzZ Date: Mon, 26 Mar 2012 21:36:10 +0200 Subject: [PATCH 075/143] Added MUCPayloadParser --- .../PayloadParsers/MUCPayloadParser.cpp | 27 +++++++++++++++++++ .../Parser/PayloadParsers/MUCPayloadParser.h | 22 +++++++++++++++ src/transport.cpp | 3 +++ 3 files changed, 52 insertions(+) create mode 100644 include/Swiften/Parser/PayloadParsers/MUCPayloadParser.cpp create mode 100644 include/Swiften/Parser/PayloadParsers/MUCPayloadParser.h diff --git a/include/Swiften/Parser/PayloadParsers/MUCPayloadParser.cpp b/include/Swiften/Parser/PayloadParsers/MUCPayloadParser.cpp new file mode 100644 index 00000000..257c3da3 --- /dev/null +++ b/include/Swiften/Parser/PayloadParsers/MUCPayloadParser.cpp @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2010 Kevin Smith + * Licensed under the GNU General Public License v3. + * See Documentation/Licenses/GPLv3.txt for more information. + */ + +#include + +#include + +#include +#include +#include +#include +#include + +namespace Swift { + +void MUCPayloadParser::handleTree(ParserElement::ref root) { + foreach (ParserElement::ref child, root->getAllChildren()) { + if (child->getName() == "password" && child->getNamespace() == root->getNamespace()) { + getPayloadInternal()->setPassword(child->getText()); + } + } +} + +} diff --git a/include/Swiften/Parser/PayloadParsers/MUCPayloadParser.h b/include/Swiften/Parser/PayloadParsers/MUCPayloadParser.h new file mode 100644 index 00000000..5f6910b0 --- /dev/null +++ b/include/Swiften/Parser/PayloadParsers/MUCPayloadParser.h @@ -0,0 +1,22 @@ +/* + * Copyright (c) 2010 Kevin Smith + * Licensed under the GNU General Public License v3. + * See Documentation/Licenses/GPLv3.txt for more information. + */ + +#pragma once + +#include + +#include +#include +#include + +namespace Swift { + class PayloadParserFactoryCollection; + class MUCPayloadParser : public GenericPayloadTreeParser { + public: + MUCPayloadParser(){} + virtual void handleTree(ParserElement::ref root); + }; +} diff --git a/src/transport.cpp b/src/transport.cpp index 581670af..d32bad70 100644 --- a/src/transport.cpp +++ b/src/transport.cpp @@ -40,6 +40,7 @@ #include "Swiften/Parser/PayloadParsers/GatewayPayloadParser.h" #include "Swiften/Serializer/PayloadSerializers/GatewayPayloadSerializer.h" #include "Swiften/Serializer/PayloadSerializers/SpectrumErrorSerializer.h" +#include "Swiften/Parser/PayloadParsers/MUCPayloadParser.h" #include "transport/BlockParser.h" #include "transport/BlockSerializer.h" #include "Swiften/Parser/PayloadParsers/InvisibleParser.h" @@ -94,6 +95,7 @@ Component::Component(Swift::EventLoop *loop, Swift::NetworkFactories *factories, m_server->addPayloadParserFactory(new GenericPayloadParserFactory("invisible", "urn:xmpp:invisible:0")); m_server->addPayloadParserFactory(new GenericPayloadParserFactory("query", "http://jabber.org/protocol/stats")); m_server->addPayloadParserFactory(new GenericPayloadParserFactory("query", "jabber:iq:gateway")); + m_server->addPayloadParserFactory(new GenericPayloadParserFactory("x", "http://jabber.org/protocol/muc")); m_server->addPayloadSerializer(new Swift::AttentionSerializer()); m_server->addPayloadSerializer(new Swift::XHTMLIMSerializer()); @@ -122,6 +124,7 @@ Component::Component(Swift::EventLoop *loop, Swift::NetworkFactories *factories, m_component->addPayloadParserFactory(new GenericPayloadParserFactory("invisible", "urn:xmpp:invisible:0")); m_component->addPayloadParserFactory(new GenericPayloadParserFactory("query", "http://jabber.org/protocol/stats")); m_component->addPayloadParserFactory(new GenericPayloadParserFactory("query", "jabber:iq:gateway")); + m_component->addPayloadParserFactory(new GenericPayloadParserFactory("x", "http://jabber.org/protocol/muc")); m_component->addPayloadSerializer(new Swift::AttentionSerializer()); m_component->addPayloadSerializer(new Swift::XHTMLIMSerializer()); From 5f06cf12d6c9d3265fb0857e4b119aefed06e897 Mon Sep 17 00:00:00 2001 From: Jan Kaluza Date: Tue, 27 Mar 2012 12:37:11 +0200 Subject: [PATCH 076/143] Fixed out-of-source building --- include/transport/CMakeLists.txt | 8 ++++---- plugin/cpp/CMakeLists.txt | 14 +++++++------- spectrum/src/sample.cfg | 3 ++- 3 files changed, 13 insertions(+), 12 deletions(-) diff --git a/include/transport/CMakeLists.txt b/include/transport/CMakeLists.txt index 2868190d..104a2206 100644 --- a/include/transport/CMakeLists.txt +++ b/include/transport/CMakeLists.txt @@ -1,11 +1,11 @@ if (PROTOBUF_FOUND) ADD_CUSTOM_COMMAND( - OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/protocol.pb.cc ${CMAKE_CURRENT_BINARY_DIR}/protocol.pb.h - COMMAND ${PROTOBUF_PROTOC_EXECUTABLE} --cpp_out ${CMAKE_CURRENT_BINARY_DIR} --proto_path ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR}/protocol.proto + OUTPUT ${CMAKE_CURRENT_SOURCE_DIR}/protocol.pb.cc ${CMAKE_CURRENT_SOURCE_DIR}/protocol.pb.h + COMMAND ${PROTOBUF_PROTOC_EXECUTABLE} --cpp_out ${CMAKE_CURRENT_SOURCE_DIR} --proto_path ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/protocol.proto COMMENT "Running C++ protocol buffer compiler on protocol.proto" - DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/protocol.proto + DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/protocol.proto ) - ADD_CUSTOM_TARGET(pb DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/protocol.pb.cc) + ADD_CUSTOM_TARGET(pb DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/protocol.pb.cc) endif() FILE(GLOB HEADERS *.h protocol.h) diff --git a/plugin/cpp/CMakeLists.txt b/plugin/cpp/CMakeLists.txt index b41b3453..ddb49358 100644 --- a/plugin/cpp/CMakeLists.txt +++ b/plugin/cpp/CMakeLists.txt @@ -2,10 +2,10 @@ cmake_minimum_required(VERSION 2.6) FILE(GLOB SRC *.cpp *.h) FILE(GLOB HEADERS ../include/transport/*.h) -set(EXTRA_SOURCES ${CMAKE_CURRENT_BINARY_DIR}/../../src/memoryusage.cpp) -set(EXTRA_SOURCES ${EXTRA_SOURCES} ${CMAKE_CURRENT_BINARY_DIR}/../../src/logging.cpp) -set(EXTRA_SOURCES ${EXTRA_SOURCES} ${CMAKE_CURRENT_BINARY_DIR}/../../src/config.cpp) -set(EXTRA_SOURCES ${EXTRA_SOURCES} ${CMAKE_CURRENT_BINARY_DIR}/../../include/transport/protocol.pb.cc) +set(EXTRA_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/../../src/memoryusage.cpp) +set(EXTRA_SOURCES ${EXTRA_SOURCES} ${CMAKE_CURRENT_SOURCE_DIR}/../../src/logging.cpp) +set(EXTRA_SOURCES ${EXTRA_SOURCES} ${CMAKE_CURRENT_SOURCE_DIR}/../../src/config.cpp) +set(EXTRA_SOURCES ${EXTRA_SOURCES} ${CMAKE_CURRENT_SOURCE_DIR}/../../include/transport/protocol.pb.cc) if (NOT WIN32) ADD_LIBRARY(transport-plugin SHARED ${HEADERS} ${SRC} ${PROTOBUF_SRC} ${PROTOBUF_HDRS} ${EXTRA_SOURCES}) @@ -13,7 +13,7 @@ else() ADD_LIBRARY(transport-plugin STATIC ${HEADERS} ${SRC} ${PROTOBUF_SRC} ${PROTOBUF_HDRS} ${EXTRA_SOURCES}) endif() ADD_DEPENDENCIES(transport-plugin pb) -SET_SOURCE_FILES_PROPERTIES(${CMAKE_CURRENT_BINARY_DIR}/../../include/transport/protocol.pb.cc PROPERTIES GENERATED 1) +SET_SOURCE_FILES_PROPERTIES(${CMAKE_CURRENT_SOURCE_DIR}/../../include/transport/protocol.pb.cc PROPERTIES GENERATED 1) if (CMAKE_COMPILER_IS_GNUCXX) ADD_DEFINITIONS(-fPIC) @@ -31,5 +31,5 @@ SET_TARGET_PROPERTIES(transport-plugin PROPERTIES INSTALL(TARGETS transport-plugin LIBRARY DESTINATION lib ARCHIVE DESTINATION lib COMPONENT libraries) -#CONFIGURE_FILE(transport.pc.in "${CMAKE_CURRENT_BINARY_DIR}/transport.pc") -#INSTALL(FILES "${CMAKE_CURRENT_BINARY_DIR}/transport.pc" DESTINATION lib/pkgconfig) +#CONFIGURE_FILE(transport.pc.in "${CMAKE_CURRENT_SOURCE_DIR}/transport.pc") +#INSTALL(FILES "${CMAKE_CURRENT_SOURCE_DIR}/transport.pc" DESTINATION lib/pkgconfig) diff --git a/spectrum/src/sample.cfg b/spectrum/src/sample.cfg index d3b4f317..88ec12c8 100644 --- a/spectrum/src/sample.cfg +++ b/spectrum/src/sample.cfg @@ -13,7 +13,8 @@ admin_password=test #cert=server.pfx #patch to PKCS#12 certificate #cert_password=test #password to that certificate if any users_per_backend=10 -backend=../..//backends/libpurple/spectrum2_libpurple_backend +#backend=../..//backends/libpurple/spectrum2_libpurple_backend +backend=../../backends/template/spectrum2_template_backend protocol=prpl-xmpp #protocol=prpl-msn #protocol=any From 0af5cfe9169eba89e4ce10d79356d3b0eb6d0b46 Mon Sep 17 00:00:00 2001 From: Jan Kaluza Date: Tue, 27 Mar 2012 12:56:22 +0200 Subject: [PATCH 077/143] use fromUtf8 instead of fromStdString --- backends/libcommuni/singleircnetworkplugin.cpp | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/backends/libcommuni/singleircnetworkplugin.cpp b/backends/libcommuni/singleircnetworkplugin.cpp index af44ccfa..547e4b66 100644 --- a/backends/libcommuni/singleircnetworkplugin.cpp +++ b/backends/libcommuni/singleircnetworkplugin.cpp @@ -9,7 +9,7 @@ SingleIRCNetworkPlugin::SingleIRCNetworkPlugin(Config *config, Swift::QtEventLoo this->config = config; m_server = config->getUnregistered().find("service.irc_server")->second; m_socket = new QTcpSocket(); - m_socket->connectToHost(QString::fromStdString(host), port); + m_socket->connectToHost(QString::fromUtf8(host), port); connect(m_socket, SIGNAL(readyRead()), this, SLOT(readData())); if (config->getUnregistered().find("service.irc_identify") != config->getUnregistered().end()) { @@ -44,10 +44,10 @@ void SingleIRCNetworkPlugin::handleLoginRequest(const std::string &user, const s LOG4CXX_INFO(logger, user << ": Connecting " << m_server << " as " << legacyName); MyIrcSession *session = new MyIrcSession(user, this); - session->setUserName(QString::fromStdString(legacyName)); - session->setNickName(QString::fromStdString(legacyName)); - session->setRealName(QString::fromStdString(legacyName)); - session->setHost(QString::fromStdString(m_server)); + session->setUserName(QString::fromUtf8(legacyName)); + session->setNickName(QString::fromUtf8(legacyName)); + session->setRealName(QString::fromUtf8(legacyName)); + session->setHost(QString::fromUtf8(m_server)); session->setPort(6667); if (!password.empty()) { @@ -90,7 +90,7 @@ void SingleIRCNetworkPlugin::handleMessageSendRequest(const std::string &user, c } LOG4CXX_INFO(logger, user << ": Forwarding message to " << r); - m_sessions[user]->sendCommand(IrcCommand::createMessage(QString::fromStdString(r), QString::fromStdString(message))); + m_sessions[user]->sendCommand(IrcCommand::createMessage(QString::fromUtf8(r), QString::fromUtf8(message))); if (r.find("#") == 0) { handleMessage(user, legacyName, message, m_sessions[user]->nickName().toStdString()); @@ -105,7 +105,7 @@ void SingleIRCNetworkPlugin::handleJoinRoomRequest(const std::string &user, cons LOG4CXX_INFO(logger, user << ": Joining " << room); m_sessions[user]->addAutoJoinChannel(room); - m_sessions[user]->sendCommand(IrcCommand::createJoin(QString::fromStdString(room), QString::fromStdString(password))); + m_sessions[user]->sendCommand(IrcCommand::createJoin(QString::fromUtf8(room), QString::fromUtf8(password))); m_sessions[user]->rooms += 1; // update nickname, because we have nickname per session, no nickname per room. @@ -122,7 +122,7 @@ void SingleIRCNetworkPlugin::handleLeaveRoomRequest(const std::string &user, con } LOG4CXX_INFO(logger, user << ": Leaving " << room); - m_sessions[u]->sendCommand(IrcCommand::createPart(QString::fromStdString(r))); + m_sessions[u]->sendCommand(IrcCommand::createPart(QString::fromUtf8(r))); m_sessions[u]->removeAutoJoinChannel(r); m_sessions[u]->rooms -= 1; } From dd9a404392b760c128a343a922fc9ffc70bfa7c9 Mon Sep 17 00:00:00 2001 From: Jan Kaluza Date: Tue, 27 Mar 2012 13:00:36 +0200 Subject: [PATCH 078/143] use fromUtf8/toUtf8 really everywhere --- backends/libcommuni/ircnetworkplugin.cpp | 18 +++--- backends/libcommuni/session.cpp | 58 +++++++++---------- .../libcommuni/singleircnetworkplugin.cpp | 4 +- 3 files changed, 40 insertions(+), 40 deletions(-) diff --git a/backends/libcommuni/ircnetworkplugin.cpp b/backends/libcommuni/ircnetworkplugin.cpp index d7c9ae9e..6dacca20 100644 --- a/backends/libcommuni/ircnetworkplugin.cpp +++ b/backends/libcommuni/ircnetworkplugin.cpp @@ -5,7 +5,7 @@ IRCNetworkPlugin::IRCNetworkPlugin(Config *config, Swift::QtEventLoop *loop, const std::string &host, int port) { this->config = config; m_socket = new QTcpSocket(); - m_socket->connectToHost(QString::fromStdString(host), port); + m_socket->connectToHost(QString::fromUtf8(host), port); connect(m_socket, SIGNAL(readyRead()), this, SLOT(readData())); } @@ -28,8 +28,8 @@ void IRCNetworkPlugin::handleLoginRequest(const std::string &user, const std::st if (CONFIG_BOOL(config, "service.server_mode")) { MyIrcSession *session = new MyIrcSession(user, this); std::string h = user.substr(0, user.find("@")); - session->setNickName(QString::fromStdString(h.substr(0, h.find("%")))); - session->setHost(QString::fromStdString(h.substr(h.find("%") + 1))); + session->setNickName(QString::fromUtf8(h.substr(0, h.find("%")))); + session->setHost(QString::fromUtf8(h.substr(h.find("%") + 1))); session->setPort(6667); session->open(); std::cout << "CONNECTING IRC NETWORK " << h.substr(h.find("%") + 1) << "\n"; @@ -72,7 +72,7 @@ void IRCNetworkPlugin::handleMessageSendRequest(const std::string &user, const s } } std::cout << "MESSAGE " << u << " " << r << "\n"; - m_sessions[u]->sendCommand(IrcCommand::createMessage(QString::fromStdString(r), QString::fromStdString(message))); + m_sessions[u]->sendCommand(IrcCommand::createMessage(QString::fromUtf8(r), QString::fromUtf8(message))); std::cout << "SENT\n"; } @@ -89,8 +89,8 @@ void IRCNetworkPlugin::handleJoinRoomRequest(const std::string &user, const std: if (room.find("@") != std::string::npos) { // suffix is %irc.freenode.net to let MyIrcSession return #room%irc.freenode.net MyIrcSession *session = new MyIrcSession(user, this, room.substr(room.find("@"))); - session->setNickName(QString::fromStdString(nickname)); - session->setHost(QString::fromStdString(room.substr(room.find("@") + 1))); + session->setNickName(QString::fromUtf8(nickname)); + session->setHost(QString::fromUtf8(room.substr(room.find("@") + 1))); session->setPort(6667); session->open(); std::cout << "CONNECTING IRC NETWORK " << room.substr(room.find("@") + 1) << "\n"; @@ -103,10 +103,10 @@ void IRCNetworkPlugin::handleJoinRoomRequest(const std::string &user, const std: } std::cout << "JOINING " << r << "\n"; m_sessions[u]->addAutoJoinChannel(r); - m_sessions[u]->sendCommand(IrcCommand::createJoin(QString::fromStdString(r), QString::fromStdString(password))); + m_sessions[u]->sendCommand(IrcCommand::createJoin(QString::fromUtf8(r), QString::fromUtf8(password))); m_sessions[u]->rooms += 1; // update nickname, because we have nickname per session, no nickname per room. - handleRoomNicknameChanged(user, r, m_sessions[u]->nickName().toStdString()); + handleRoomNicknameChanged(user, r, m_sessions[u]->nickName().toUtf8()); } void IRCNetworkPlugin::handleLeaveRoomRequest(const std::string &user, const std::string &room) { @@ -120,7 +120,7 @@ void IRCNetworkPlugin::handleLeaveRoomRequest(const std::string &user, const std if (m_sessions[u] == NULL) return; - m_sessions[u]->sendCommand(IrcCommand::createPart(QString::fromStdString(r))); + m_sessions[u]->sendCommand(IrcCommand::createPart(QString::fromUtf8(r))); m_sessions[u]->removeAutoJoinChannel(r); m_sessions[u]->rooms -= 1; diff --git a/backends/libcommuni/session.cpp b/backends/libcommuni/session.cpp index ac972b5f..495bb25c 100644 --- a/backends/libcommuni/session.cpp +++ b/backends/libcommuni/session.cpp @@ -38,13 +38,13 @@ void MyIrcSession::on_connected() { } for(std::list::const_iterator it = m_autoJoin.begin(); it != m_autoJoin.end(); it++) { - sendCommand(IrcCommand::createJoin(QString::fromStdString(*it))); + sendCommand(IrcCommand::createJoin(QString::fromUtf8(*it))); } if (getIdentify().find(" ") != std::string::npos) { std::string to = getIdentify().substr(0, getIdentify().find(" ")); std::string what = getIdentify().substr(getIdentify().find(" ") + 1); - sendCommand(IrcCommand::createMessage(QString::fromStdString(to), QString::fromStdString(what))); + sendCommand(IrcCommand::createMessage(QString::fromUtf8(to), QString::fromUtf8(what))); } } @@ -67,30 +67,30 @@ bool MyIrcSession::correctNickname(std::string &nickname) { void MyIrcSession::on_joined(IrcMessage *message) { IrcJoinMessage *m = (IrcJoinMessage *) message; bool flags = 0; - std::string nickname = m->sender().name().toStdString(); + std::string nickname = m->sender().name().toUtf8(); flags = correctNickname(nickname); - np->handleParticipantChanged(user, nickname, m->channel().toStdString() + suffix, (int) flags, pbnetwork::STATUS_ONLINE); - LOG4CXX_INFO(logger, user << ": Joined " << m->parameters()[0].toStdString()); + np->handleParticipantChanged(user, nickname, m->channel().toUtf8() + suffix, (int) flags, pbnetwork::STATUS_ONLINE); + LOG4CXX_INFO(logger, user << ": Joined " << m->parameters()[0].toUtf8()); } void MyIrcSession::on_parted(IrcMessage *message) { IrcPartMessage *m = (IrcPartMessage *) message; bool flags = 0; - std::string nickname = m->sender().name().toStdString(); + std::string nickname = m->sender().name().toUtf8(); flags = correctNickname(nickname); - LOG4CXX_INFO(logger, user << ": " << nickname << " parted " << m->channel().toStdString() + suffix); - np->handleParticipantChanged(user, nickname, m->channel().toStdString() + suffix,(int) flags, pbnetwork::STATUS_NONE, m->reason().toStdString()); + LOG4CXX_INFO(logger, user << ": " << nickname << " parted " << m->channel().toUtf8() + suffix); + np->handleParticipantChanged(user, nickname, m->channel().toUtf8() + suffix,(int) flags, pbnetwork::STATUS_NONE, m->reason().toUtf8()); } void MyIrcSession::on_quit(IrcMessage *message) { IrcQuitMessage *m = (IrcQuitMessage *) message; for(std::list::const_iterator it = m_autoJoin.begin(); it != m_autoJoin.end(); it++) { bool flags = 0; - std::string nickname = m->sender().name().toStdString(); + std::string nickname = m->sender().name().toUtf8(); flags = correctNickname(nickname); LOG4CXX_INFO(logger, user << ": " << nickname << " quit " << (*it) + suffix); - np->handleParticipantChanged(user, nickname, (*it) + suffix,(int) flags, pbnetwork::STATUS_NONE, m->reason().toStdString()); + np->handleParticipantChanged(user, nickname, (*it) + suffix,(int) flags, pbnetwork::STATUS_NONE, m->reason().toUtf8()); } } @@ -98,10 +98,10 @@ void MyIrcSession::on_nickChanged(IrcMessage *message) { IrcNickMessage *m = (IrcNickMessage *) message; for(std::list::const_iterator it = m_autoJoin.begin(); it != m_autoJoin.end(); it++) { - std::string nickname = m->sender().name().toStdString(); + std::string nickname = m->sender().name().toUtf8(); bool flags = m_modes[(*it) + nickname]; - LOG4CXX_INFO(logger, user << ": " << nickname << " changed nickname to " << m->nick().toStdString()); - np->handleParticipantChanged(user, nickname, (*it) + suffix,(int) flags, pbnetwork::STATUS_ONLINE, "", m->nick().toStdString()); + LOG4CXX_INFO(logger, user << ": " << nickname << " changed nickname to " << m->nick().toUtf8()); + np->handleParticipantChanged(user, nickname, (*it) + suffix,(int) flags, pbnetwork::STATUS_ONLINE, "", m->nick().toUtf8()); } } @@ -109,8 +109,8 @@ void MyIrcSession::on_modeChanged(IrcMessage *message) { IrcModeMessage *m = (IrcModeMessage *) message; // mode changed: "#testik" "HanzZ" "+o" "hanzz_k" - std::string nickname = m->argument().toStdString(); - std::string mode = m->mode().toStdString(); + std::string nickname = m->argument().toUtf8(); + std::string mode = m->mode().toUtf8(); if (nickname.empty()) return; LOG4CXX_INFO(logger, user << ": " << nickname << " changed mode to " << mode); @@ -130,29 +130,29 @@ void MyIrcSession::on_topicChanged(IrcMessage *message) { IrcTopicMessage *m = (IrcTopicMessage *) message; bool flags = 0; - std::string nickname = m->sender().name().toStdString(); + std::string nickname = m->sender().name().toUtf8(); flags = correctNickname(nickname); - LOG4CXX_INFO(logger, user << ": " << nickname << " topic changed to " << m->topic().toStdString()); - np->handleSubject(user, m->channel().toStdString() + suffix, m->topic().toStdString(), nickname); + LOG4CXX_INFO(logger, user << ": " << nickname << " topic changed to " << m->topic().toUtf8()); + np->handleSubject(user, m->channel().toUtf8() + suffix, m->topic().toUtf8(), nickname); } void MyIrcSession::on_messageReceived(IrcMessage *message) { IrcPrivateMessage *m = (IrcPrivateMessage *) message; - std::string target = m->target().toStdString(); + std::string target = m->target().toUtf8(); LOG4CXX_INFO(logger, user << ": Message from " << target); if (target.find("#") == 0) { bool flags = 0; - std::string nickname = m->sender().name().toStdString(); + std::string nickname = m->sender().name().toUtf8(); flags = correctNickname(nickname); - np->handleMessage(user, target + suffix, m->message().toStdString(), nickname); + np->handleMessage(user, target + suffix, m->message().toUtf8(), nickname); } else { bool flags = 0; - std::string nickname = m->sender().name().toStdString(); + std::string nickname = m->sender().name().toUtf8(); flags = correctNickname(nickname); - np->handleMessage(user, nickname, m->message().toStdString()); + np->handleMessage(user, nickname, m->message().toUtf8()); } } @@ -163,10 +163,10 @@ void MyIrcSession::on_numericMessageReceived(IrcMessage *message) { IrcNumericMessage *m = (IrcNumericMessage *) message; switch (m->code()) { case 332: - m_topicData = m->parameters().value(2).toStdString(); + m_topicData = m->parameters().value(2).toUtf8(); break; case 333: - np->handleSubject(user, m->parameters().value(1).toStdString() + suffix, m_topicData, m->parameters().value(2).toStdString()); + np->handleSubject(user, m->parameters().value(1).toUtf8() + suffix, m_topicData, m->parameters().value(2).toUtf8()); break; case 353: channel = m->parameters().value(2); @@ -174,10 +174,10 @@ void MyIrcSession::on_numericMessageReceived(IrcMessage *message) { for (int i = 0; i < members.size(); i++) { bool flags = 0; - std::string nickname = members.at(i).toStdString(); + std::string nickname = members.at(i).toUtf8(); flags = correctNickname(nickname); - m_modes[channel.toStdString() + nickname] = flags; - np->handleParticipantChanged(user, nickname, channel.toStdString() + suffix,(int) flags, pbnetwork::STATUS_ONLINE); + m_modes[channel.toUtf8() + nickname] = flags; + np->handleParticipantChanged(user, nickname, channel.toUtf8() + suffix,(int) flags, pbnetwork::STATUS_ONLINE); } break; case 432: @@ -193,7 +193,7 @@ void MyIrcSession::on_numericMessageReceived(IrcMessage *message) { } void MyIrcSession::onMessageReceived(IrcMessage *message) { - LOG4CXX_INFO(logger, user << ": " << message->toString().toStdString()); + LOG4CXX_INFO(logger, user << ": " << message->toString().toUtf8()); switch (message->type()) { case IrcMessage::Join: on_joined(message); diff --git a/backends/libcommuni/singleircnetworkplugin.cpp b/backends/libcommuni/singleircnetworkplugin.cpp index 547e4b66..c36d851a 100644 --- a/backends/libcommuni/singleircnetworkplugin.cpp +++ b/backends/libcommuni/singleircnetworkplugin.cpp @@ -93,7 +93,7 @@ void SingleIRCNetworkPlugin::handleMessageSendRequest(const std::string &user, c m_sessions[user]->sendCommand(IrcCommand::createMessage(QString::fromUtf8(r), QString::fromUtf8(message))); if (r.find("#") == 0) { - handleMessage(user, legacyName, message, m_sessions[user]->nickName().toStdString()); + handleMessage(user, legacyName, message, m_sessions[user]->nickName().toUtf8()); } } @@ -109,7 +109,7 @@ void SingleIRCNetworkPlugin::handleJoinRoomRequest(const std::string &user, cons m_sessions[user]->rooms += 1; // update nickname, because we have nickname per session, no nickname per room. - handleRoomNicknameChanged(user, room, m_sessions[user]->userName().toStdString()); + handleRoomNicknameChanged(user, room, m_sessions[user]->userName().toUtf8()); } void SingleIRCNetworkPlugin::handleLeaveRoomRequest(const std::string &user, const std::string &room) { From 3014cc2e1c8cd77b87280c8e379386fe6e473c48 Mon Sep 17 00:00:00 2001 From: Jan Kaluza Date: Tue, 27 Mar 2012 13:40:33 +0200 Subject: [PATCH 079/143] TO_UTF8/FROM_UTF8 --- backends/libcommuni/ircnetworkplugin.cpp | 21 ++++--- backends/libcommuni/session.cpp | 61 ++++++++++--------- .../libcommuni/singleircnetworkplugin.cpp | 23 ++++--- 3 files changed, 57 insertions(+), 48 deletions(-) diff --git a/backends/libcommuni/ircnetworkplugin.cpp b/backends/libcommuni/ircnetworkplugin.cpp index 6dacca20..74bdec24 100644 --- a/backends/libcommuni/ircnetworkplugin.cpp +++ b/backends/libcommuni/ircnetworkplugin.cpp @@ -2,10 +2,13 @@ #include #include +#define FROM_UTF8(WHAT) QString::fromUtf8((WHAT).c_str(), (WHAT).size()) +#define TO_UTF8(WHAT) std::string((WHAT).toUtf8().data(), (WHAT).toUtf8().size()) + IRCNetworkPlugin::IRCNetworkPlugin(Config *config, Swift::QtEventLoop *loop, const std::string &host, int port) { this->config = config; m_socket = new QTcpSocket(); - m_socket->connectToHost(QString::fromUtf8(host), port); + m_socket->connectToHost(FROM_UTF8(host), port); connect(m_socket, SIGNAL(readyRead()), this, SLOT(readData())); } @@ -28,8 +31,8 @@ void IRCNetworkPlugin::handleLoginRequest(const std::string &user, const std::st if (CONFIG_BOOL(config, "service.server_mode")) { MyIrcSession *session = new MyIrcSession(user, this); std::string h = user.substr(0, user.find("@")); - session->setNickName(QString::fromUtf8(h.substr(0, h.find("%")))); - session->setHost(QString::fromUtf8(h.substr(h.find("%") + 1))); + session->setNickName(FROM_UTF8(h.substr(0, h.find("%")))); + session->setHost(FROM_UTF8(h.substr(h.find("%") + 1))); session->setPort(6667); session->open(); std::cout << "CONNECTING IRC NETWORK " << h.substr(h.find("%") + 1) << "\n"; @@ -72,7 +75,7 @@ void IRCNetworkPlugin::handleMessageSendRequest(const std::string &user, const s } } std::cout << "MESSAGE " << u << " " << r << "\n"; - m_sessions[u]->sendCommand(IrcCommand::createMessage(QString::fromUtf8(r), QString::fromUtf8(message))); + m_sessions[u]->sendCommand(IrcCommand::createMessage(FROM_UTF8(r), FROM_UTF8(message))); std::cout << "SENT\n"; } @@ -89,8 +92,8 @@ void IRCNetworkPlugin::handleJoinRoomRequest(const std::string &user, const std: if (room.find("@") != std::string::npos) { // suffix is %irc.freenode.net to let MyIrcSession return #room%irc.freenode.net MyIrcSession *session = new MyIrcSession(user, this, room.substr(room.find("@"))); - session->setNickName(QString::fromUtf8(nickname)); - session->setHost(QString::fromUtf8(room.substr(room.find("@") + 1))); + session->setNickName(FROM_UTF8(nickname)); + session->setHost(FROM_UTF8(room.substr(room.find("@") + 1))); session->setPort(6667); session->open(); std::cout << "CONNECTING IRC NETWORK " << room.substr(room.find("@") + 1) << "\n"; @@ -103,10 +106,10 @@ void IRCNetworkPlugin::handleJoinRoomRequest(const std::string &user, const std: } std::cout << "JOINING " << r << "\n"; m_sessions[u]->addAutoJoinChannel(r); - m_sessions[u]->sendCommand(IrcCommand::createJoin(QString::fromUtf8(r), QString::fromUtf8(password))); + m_sessions[u]->sendCommand(IrcCommand::createJoin(FROM_UTF8(r), FROM_UTF8(password))); m_sessions[u]->rooms += 1; // update nickname, because we have nickname per session, no nickname per room. - handleRoomNicknameChanged(user, r, m_sessions[u]->nickName().toUtf8()); + handleRoomNicknameChanged(user, r, TO_UTF8(m_sessions[u]->nickName())); } void IRCNetworkPlugin::handleLeaveRoomRequest(const std::string &user, const std::string &room) { @@ -120,7 +123,7 @@ void IRCNetworkPlugin::handleLeaveRoomRequest(const std::string &user, const std if (m_sessions[u] == NULL) return; - m_sessions[u]->sendCommand(IrcCommand::createPart(QString::fromUtf8(r))); + m_sessions[u]->sendCommand(IrcCommand::createPart(FROM_UTF8(r))); m_sessions[u]->removeAutoJoinChannel(r); m_sessions[u]->rooms -= 1; diff --git a/backends/libcommuni/session.cpp b/backends/libcommuni/session.cpp index 495bb25c..08bdd726 100644 --- a/backends/libcommuni/session.cpp +++ b/backends/libcommuni/session.cpp @@ -15,6 +15,9 @@ #include #include +#define FROM_UTF8(WHAT) QString::fromUtf8((WHAT).c_str(), (WHAT).size()) +#define TO_UTF8(WHAT) std::string((WHAT).toUtf8().data(), (WHAT).toUtf8().size()) + #include "transport/logging.h" DEFINE_LOGGER(logger, "IRCSession"); @@ -38,13 +41,13 @@ void MyIrcSession::on_connected() { } for(std::list::const_iterator it = m_autoJoin.begin(); it != m_autoJoin.end(); it++) { - sendCommand(IrcCommand::createJoin(QString::fromUtf8(*it))); + sendCommand(IrcCommand::createJoin(FROM_UTF8(*it))); } if (getIdentify().find(" ") != std::string::npos) { std::string to = getIdentify().substr(0, getIdentify().find(" ")); std::string what = getIdentify().substr(getIdentify().find(" ") + 1); - sendCommand(IrcCommand::createMessage(QString::fromUtf8(to), QString::fromUtf8(what))); + sendCommand(IrcCommand::createMessage(FROM_UTF8(to), FROM_UTF8(what))); } } @@ -67,30 +70,30 @@ bool MyIrcSession::correctNickname(std::string &nickname) { void MyIrcSession::on_joined(IrcMessage *message) { IrcJoinMessage *m = (IrcJoinMessage *) message; bool flags = 0; - std::string nickname = m->sender().name().toUtf8(); + std::string nickname = TO_UTF8(m->sender().name()); flags = correctNickname(nickname); - np->handleParticipantChanged(user, nickname, m->channel().toUtf8() + suffix, (int) flags, pbnetwork::STATUS_ONLINE); - LOG4CXX_INFO(logger, user << ": Joined " << m->parameters()[0].toUtf8()); + np->handleParticipantChanged(user, nickname, TO_UTF8(m->channel()), (int) flags, pbnetwork::STATUS_ONLINE); + LOG4CXX_INFO(logger, user << ": Joined " << TO_UTF8(m->parameters()[0])); } void MyIrcSession::on_parted(IrcMessage *message) { IrcPartMessage *m = (IrcPartMessage *) message; bool flags = 0; - std::string nickname = m->sender().name().toUtf8(); + std::string nickname = TO_UTF8(m->sender().name()); flags = correctNickname(nickname); - LOG4CXX_INFO(logger, user << ": " << nickname << " parted " << m->channel().toUtf8() + suffix); - np->handleParticipantChanged(user, nickname, m->channel().toUtf8() + suffix,(int) flags, pbnetwork::STATUS_NONE, m->reason().toUtf8()); + LOG4CXX_INFO(logger, user << ": " << nickname << " parted " << TO_UTF8(m->channel()) + suffix); + np->handleParticipantChanged(user, nickname, TO_UTF8(m->channel()) + suffix,(int) flags, pbnetwork::STATUS_NONE, TO_UTF8(m->reason())); } void MyIrcSession::on_quit(IrcMessage *message) { IrcQuitMessage *m = (IrcQuitMessage *) message; for(std::list::const_iterator it = m_autoJoin.begin(); it != m_autoJoin.end(); it++) { bool flags = 0; - std::string nickname = m->sender().name().toUtf8(); + std::string nickname = TO_UTF8(m->sender().name()); flags = correctNickname(nickname); LOG4CXX_INFO(logger, user << ": " << nickname << " quit " << (*it) + suffix); - np->handleParticipantChanged(user, nickname, (*it) + suffix,(int) flags, pbnetwork::STATUS_NONE, m->reason().toUtf8()); + np->handleParticipantChanged(user, nickname, (*it) + suffix,(int) flags, pbnetwork::STATUS_NONE, TO_UTF8(m->reason())); } } @@ -98,10 +101,10 @@ void MyIrcSession::on_nickChanged(IrcMessage *message) { IrcNickMessage *m = (IrcNickMessage *) message; for(std::list::const_iterator it = m_autoJoin.begin(); it != m_autoJoin.end(); it++) { - std::string nickname = m->sender().name().toUtf8(); + std::string nickname = TO_UTF8(m->sender().name()); bool flags = m_modes[(*it) + nickname]; - LOG4CXX_INFO(logger, user << ": " << nickname << " changed nickname to " << m->nick().toUtf8()); - np->handleParticipantChanged(user, nickname, (*it) + suffix,(int) flags, pbnetwork::STATUS_ONLINE, "", m->nick().toUtf8()); + LOG4CXX_INFO(logger, user << ": " << nickname << " changed nickname to " << TO_UTF8(m->nick())); + np->handleParticipantChanged(user, nickname, (*it) + suffix,(int) flags, pbnetwork::STATUS_ONLINE, "", TO_UTF8(m->nick())); } } @@ -109,8 +112,8 @@ void MyIrcSession::on_modeChanged(IrcMessage *message) { IrcModeMessage *m = (IrcModeMessage *) message; // mode changed: "#testik" "HanzZ" "+o" "hanzz_k" - std::string nickname = m->argument().toUtf8(); - std::string mode = m->mode().toUtf8(); + std::string nickname = TO_UTF8(m->argument()); + std::string mode = TO_UTF8(m->mode()); if (nickname.empty()) return; LOG4CXX_INFO(logger, user << ": " << nickname << " changed mode to " << mode); @@ -130,29 +133,29 @@ void MyIrcSession::on_topicChanged(IrcMessage *message) { IrcTopicMessage *m = (IrcTopicMessage *) message; bool flags = 0; - std::string nickname = m->sender().name().toUtf8(); + std::string nickname = TO_UTF8(m->sender().name()); flags = correctNickname(nickname); - LOG4CXX_INFO(logger, user << ": " << nickname << " topic changed to " << m->topic().toUtf8()); - np->handleSubject(user, m->channel().toUtf8() + suffix, m->topic().toUtf8(), nickname); + LOG4CXX_INFO(logger, user << ": " << nickname << " topic changed to " << TO_UTF8(m->topic())); + np->handleSubject(user, TO_UTF8(m->channel()) + suffix, TO_UTF8(m->topic()), nickname); } void MyIrcSession::on_messageReceived(IrcMessage *message) { IrcPrivateMessage *m = (IrcPrivateMessage *) message; - std::string target = m->target().toUtf8(); + std::string target = TO_UTF8(m->target()); LOG4CXX_INFO(logger, user << ": Message from " << target); if (target.find("#") == 0) { bool flags = 0; - std::string nickname = m->sender().name().toUtf8(); + std::string nickname = TO_UTF8(m->sender().name()); flags = correctNickname(nickname); - np->handleMessage(user, target + suffix, m->message().toUtf8(), nickname); + np->handleMessage(user, target + suffix, TO_UTF8(m->message()), nickname); } else { bool flags = 0; - std::string nickname = m->sender().name().toUtf8(); + std::string nickname = TO_UTF8(m->sender().name()); flags = correctNickname(nickname); - np->handleMessage(user, nickname, m->message().toUtf8()); + np->handleMessage(user, nickname, TO_UTF8(m->message())); } } @@ -163,10 +166,10 @@ void MyIrcSession::on_numericMessageReceived(IrcMessage *message) { IrcNumericMessage *m = (IrcNumericMessage *) message; switch (m->code()) { case 332: - m_topicData = m->parameters().value(2).toUtf8(); + m_topicData = TO_UTF8(m->parameters().value(2)); break; case 333: - np->handleSubject(user, m->parameters().value(1).toUtf8() + suffix, m_topicData, m->parameters().value(2).toUtf8()); + np->handleSubject(user, TO_UTF8(m->parameters().value(1)) + suffix, m_topicData, TO_UTF8(m->parameters().value(2))); break; case 353: channel = m->parameters().value(2); @@ -174,10 +177,10 @@ void MyIrcSession::on_numericMessageReceived(IrcMessage *message) { for (int i = 0; i < members.size(); i++) { bool flags = 0; - std::string nickname = members.at(i).toUtf8(); + std::string nickname = TO_UTF8(members.at(i)); flags = correctNickname(nickname); - m_modes[channel.toUtf8() + nickname] = flags; - np->handleParticipantChanged(user, nickname, channel.toUtf8() + suffix,(int) flags, pbnetwork::STATUS_ONLINE); + m_modes[TO_UTF8(channel) + nickname] = flags; + np->handleParticipantChanged(user, nickname, TO_UTF8(channel) + suffix,(int) flags, pbnetwork::STATUS_ONLINE); } break; case 432: @@ -193,7 +196,7 @@ void MyIrcSession::on_numericMessageReceived(IrcMessage *message) { } void MyIrcSession::onMessageReceived(IrcMessage *message) { - LOG4CXX_INFO(logger, user << ": " << message->toString().toUtf8()); + LOG4CXX_INFO(logger, user << ": " << TO_UTF8(message->toString())); switch (message->type()) { case IrcMessage::Join: on_joined(message); diff --git a/backends/libcommuni/singleircnetworkplugin.cpp b/backends/libcommuni/singleircnetworkplugin.cpp index c36d851a..cce79c7b 100644 --- a/backends/libcommuni/singleircnetworkplugin.cpp +++ b/backends/libcommuni/singleircnetworkplugin.cpp @@ -3,13 +3,16 @@ #include #include +#define FROM_UTF8(WHAT) QString::fromUtf8((WHAT).c_str(), (WHAT).size()) +#define TO_UTF8(WHAT) std::string((WHAT).toUtf8().data(), (WHAT).toUtf8().size()) + DEFINE_LOGGER(logger, "SingleIRCNetworkPlugin"); SingleIRCNetworkPlugin::SingleIRCNetworkPlugin(Config *config, Swift::QtEventLoop *loop, const std::string &host, int port) { this->config = config; m_server = config->getUnregistered().find("service.irc_server")->second; m_socket = new QTcpSocket(); - m_socket->connectToHost(QString::fromUtf8(host), port); + m_socket->connectToHost(FROM_UTF8(host), port); connect(m_socket, SIGNAL(readyRead()), this, SLOT(readData())); if (config->getUnregistered().find("service.irc_identify") != config->getUnregistered().end()) { @@ -44,10 +47,10 @@ void SingleIRCNetworkPlugin::handleLoginRequest(const std::string &user, const s LOG4CXX_INFO(logger, user << ": Connecting " << m_server << " as " << legacyName); MyIrcSession *session = new MyIrcSession(user, this); - session->setUserName(QString::fromUtf8(legacyName)); - session->setNickName(QString::fromUtf8(legacyName)); - session->setRealName(QString::fromUtf8(legacyName)); - session->setHost(QString::fromUtf8(m_server)); + session->setUserName(FROM_UTF8(legacyName)); + session->setNickName(FROM_UTF8(legacyName)); + session->setRealName(FROM_UTF8(legacyName)); + session->setHost(FROM_UTF8(m_server)); session->setPort(6667); if (!password.empty()) { @@ -90,10 +93,10 @@ void SingleIRCNetworkPlugin::handleMessageSendRequest(const std::string &user, c } LOG4CXX_INFO(logger, user << ": Forwarding message to " << r); - m_sessions[user]->sendCommand(IrcCommand::createMessage(QString::fromUtf8(r), QString::fromUtf8(message))); + m_sessions[user]->sendCommand(IrcCommand::createMessage(FROM_UTF8(r), FROM_UTF8(message))); if (r.find("#") == 0) { - handleMessage(user, legacyName, message, m_sessions[user]->nickName().toUtf8()); + handleMessage(user, legacyName, message, TO_UTF8(m_sessions[user]->nickName())); } } @@ -105,11 +108,11 @@ void SingleIRCNetworkPlugin::handleJoinRoomRequest(const std::string &user, cons LOG4CXX_INFO(logger, user << ": Joining " << room); m_sessions[user]->addAutoJoinChannel(room); - m_sessions[user]->sendCommand(IrcCommand::createJoin(QString::fromUtf8(room), QString::fromUtf8(password))); + m_sessions[user]->sendCommand(IrcCommand::createJoin(FROM_UTF8(room), FROM_UTF8(password))); m_sessions[user]->rooms += 1; // update nickname, because we have nickname per session, no nickname per room. - handleRoomNicknameChanged(user, room, m_sessions[user]->userName().toUtf8()); + handleRoomNicknameChanged(user, room, TO_UTF8(m_sessions[user]->userName())); } void SingleIRCNetworkPlugin::handleLeaveRoomRequest(const std::string &user, const std::string &room) { @@ -122,7 +125,7 @@ void SingleIRCNetworkPlugin::handleLeaveRoomRequest(const std::string &user, con } LOG4CXX_INFO(logger, user << ": Leaving " << room); - m_sessions[u]->sendCommand(IrcCommand::createPart(QString::fromUtf8(r))); + m_sessions[u]->sendCommand(IrcCommand::createPart(FROM_UTF8(r))); m_sessions[u]->removeAutoJoinChannel(r); m_sessions[u]->rooms -= 1; } From c6057e35d5ffc5b3d4cd25e0ac1b1650a025edc7 Mon Sep 17 00:00:00 2001 From: HanzZ Date: Tue, 27 Mar 2012 21:47:50 +0200 Subject: [PATCH 080/143] Support for setting -DLIB_INSTALL_DIR=lib64 --- CMakeLists.txt | 4 ++++ plugin/cpp/CMakeLists.txt | 2 +- src/CMakeLists.txt | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 78c29c74..9ded7aba 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,6 +1,10 @@ cmake_minimum_required(VERSION 2.6) project(libtransport) +if(NOT LIB_INSTALL_DIR) + set(LIB_INSTALL_DIR "lib") +endif() + set(CMAKE_MODULE_PATH "cmake_modules") set(cppunit_DIR "${CMAKE_SOURCE_DIR}/cmake_modules") diff --git a/plugin/cpp/CMakeLists.txt b/plugin/cpp/CMakeLists.txt index b41b3453..e17b87a1 100644 --- a/plugin/cpp/CMakeLists.txt +++ b/plugin/cpp/CMakeLists.txt @@ -29,7 +29,7 @@ SET_TARGET_PROPERTIES(transport-plugin PROPERTIES VERSION ${TRANSPORT_VERSION} SOVERSION ${TRANSPORT_VERSION} ) -INSTALL(TARGETS transport-plugin LIBRARY DESTINATION lib ARCHIVE DESTINATION lib COMPONENT libraries) +INSTALL(TARGETS transport-plugin LIBRARY DESTINATION ${LIB_INSTALL_DIR} ARCHIVE DESTINATION ${LIB_INSTALL_DIR} COMPONENT libraries) #CONFIGURE_FILE(transport.pc.in "${CMAKE_CURRENT_BINARY_DIR}/transport.pc") #INSTALL(FILES "${CMAKE_CURRENT_BINARY_DIR}/transport.pc" DESTINATION lib/pkgconfig) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 925ce5f4..ae247e34 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -50,7 +50,7 @@ SET_TARGET_PROPERTIES(transport PROPERTIES VERSION ${TRANSPORT_VERSION} SOVERSION ${TRANSPORT_VERSION} ) -INSTALL(TARGETS transport LIBRARY DESTINATION lib ARCHIVE DESTINATION lib COMPONENT libraries) +INSTALL(TARGETS transport LIBRARY DESTINATION ${LIB_INSTALL_DIR} ARCHIVE DESTINATION ${LIB_INSTALL_DIR} COMPONENT libraries) #CONFIGURE_FILE(transport.pc.in "${CMAKE_CURRENT_BINARY_DIR}/transport.pc") #INSTALL(FILES "${CMAKE_CURRENT_BINARY_DIR}/transport.pc" DESTINATION lib/pkgconfig) From eb30457222f8c69775792938d591b2ca48c1ab2e Mon Sep 17 00:00:00 2001 From: HanzZ Date: Wed, 28 Mar 2012 16:22:05 +0200 Subject: [PATCH 081/143] Changelog --- ChangeLog | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/ChangeLog b/ChangeLog index 645ca3fa..301c2ea6 100644 --- a/ChangeLog +++ b/ChangeLog @@ -6,6 +6,7 @@ Version 2.0.0-beta2 (2012-XX-XX): * Fixed username_mask setting. * Added new fields into statistics (backends_crashed, messages related stats). + * Chatstates are now not counted as incoming messages in stats. * Log4cxx is now optional dependency. Without Log4cxx, Spectrum 2 logs to standard output. * Fixed crash when Log4cxx configuration file didn't exist. @@ -14,6 +15,11 @@ Version 2.0.0-beta2 (2012-XX-XX): libpurple: * Added support for MUC for prpl-jabber protocol. + LibCommuni IRC backend: + * Fixed sending/receiving UTF8 messages. + * Using the [registration] auto_register=1 config option, users don't + have to register manually when connecting IRC network. + Skype: * Memory usage statistic now includes the Skype client. * Fixed logging issue when the logs were not stored in the proper instance @@ -21,6 +27,7 @@ Version 2.0.0-beta2 (2012-XX-XX): * Skype backend includes also Skype client memory usage into the account. * Working buddies adding/removing. * Information about missed call is now forwarded to XMPP user. + * Fixed bug when Skype client instance wasn't killed by backend. Version 2.0.0-beta (2012-02-28): General: From 3f7677176b4ab9f7f07238aed3700c910ecbc697 Mon Sep 17 00:00:00 2001 From: HanzZ Date: Wed, 28 Mar 2012 17:17:07 +0200 Subject: [PATCH 082/143] Changelog --- ChangeLog | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ChangeLog b/ChangeLog index 301c2ea6..fe7ded53 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,4 +1,4 @@ -Version 2.0.0-beta2 (2012-XX-XX): +Version 2.0.0-beta2 (2012-03-28): General: * Fixed bug when Roster Item Exchange and subscribe stanzas were sent repeatedly. @@ -13,7 +13,7 @@ Version 2.0.0-beta2 (2012-XX-XX): * Admin can now see "Admin" contact in server-mode. libpurple: - * Added support for MUC for prpl-jabber protocol. + * Added initial support for MUC for prpl-jabber protocol. LibCommuni IRC backend: * Fixed sending/receiving UTF8 messages. From 9d81165a53c931d95ec560bf13d9ee6d575a064c Mon Sep 17 00:00:00 2001 From: Jan Kaluza Date: Thu, 29 Mar 2012 08:59:04 +0200 Subject: [PATCH 083/143] login tweak --- backends/skype/main.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backends/skype/main.cpp b/backends/skype/main.cpp index aa237178..7571fedc 100644 --- a/backends/skype/main.cpp +++ b/backends/skype/main.cpp @@ -456,7 +456,7 @@ void Skype::login() { &fd_output, NULL /*error*/); std::string login_data = std::string(m_username + " " + m_password + "\n"); - LOG4CXX_INFO(logger, m_username << ": Login data=" << login_data); + LOG4CXX_INFO(logger, m_username << ": Login data=" << m_username); write(fd, login_data.c_str(), login_data.size()); close(fd); From ee06ad97fd21c5bec3eb7a5a61d3acd7dff96f4b Mon Sep 17 00:00:00 2001 From: Jan Kaluza Date: Thu, 29 Mar 2012 09:21:33 +0200 Subject: [PATCH 084/143] More logging --- backends/skype/main.cpp | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/backends/skype/main.cpp b/backends/skype/main.cpp index 7571fedc..ae0bbab3 100644 --- a/backends/skype/main.cpp +++ b/backends/skype/main.cpp @@ -366,7 +366,7 @@ bool Skype::createDBusProxy() { LOG4CXX_INFO(logger, m_username << ":" << error->message); if (m_counter == 15) { - LOG4CXX_ERROR(logger, "Logging out, proxy couldn't be created"); + LOG4CXX_ERROR(logger, "Logging out, proxy couldn't be created: " << error->message); np->handleDisconnected(m_user, pbnetwork::CONNECTION_ERROR_AUTHENTICATION_IMPOSSIBLE, error->message); logout(); g_error_free(error); @@ -444,7 +444,8 @@ void Skype::login() { gchar* argv[6] = {"skype", "--disable-cleanlooks", "--pipelogin", "--dbpath", db, 0}; int fd; - g_spawn_async_with_pipes(NULL, + GError *error = NULL; + bool spawned = g_spawn_async_with_pipes(NULL, argv, NULL /*envp*/, G_SPAWN_SEARCH_PATH, @@ -454,7 +455,14 @@ void Skype::login() { &fd, NULL, &fd_output, - NULL /*error*/); + &error); + + if (!spawned) { + LOG4CXX_ERROR(logger, "Error spawning the Skype instance: " << error->message) + np->handleDisconnected(m_user, pbnetwork::CONNECTION_ERROR_AUTHENTICATION_IMPOSSIBLE, "Error spawning the Skype instance."); + return; + } + std::string login_data = std::string(m_username + " " + m_password + "\n"); LOG4CXX_INFO(logger, m_username << ": Login data=" << m_username); write(fd, login_data.c_str(), login_data.size()); @@ -469,12 +477,12 @@ void Skype::login() { if (m_connection == NULL) { - LOG4CXX_INFO(logger, "Creating DBus connection."); + LOG4CXX_INFO(logger, "Creating DBUS connection."); GError *error = NULL; m_connection = dbus_g_bus_get (DBUS_BUS_SESSION, &error); if (m_connection == NULL && error != NULL) { - LOG4CXX_INFO(logger, m_username << ": DBUS Error: " << error->message); + LOG4CXX_INFO(logger, m_username << ": Creating DBUS Connection rrror: " << error->message); g_error_free(error); return; } From 42a3b6c1d5008343da25e0b5023ea8745eaef7fb Mon Sep 17 00:00:00 2001 From: Jan Kaluza Date: Thu, 29 Mar 2012 09:58:19 +0200 Subject: [PATCH 085/143] More backend spawning logging --- backends/skype/main.cpp | 2 +- src/networkpluginserver.cpp | 30 ++++++++++++++++++++++++++---- 2 files changed, 27 insertions(+), 5 deletions(-) diff --git a/backends/skype/main.cpp b/backends/skype/main.cpp index ae0bbab3..1ccd81e4 100644 --- a/backends/skype/main.cpp +++ b/backends/skype/main.cpp @@ -482,7 +482,7 @@ void Skype::login() { m_connection = dbus_g_bus_get (DBUS_BUS_SESSION, &error); if (m_connection == NULL && error != NULL) { - LOG4CXX_INFO(logger, m_username << ": Creating DBUS Connection rrror: " << error->message); + LOG4CXX_INFO(logger, m_username << ": Creating DBUS Connection error: " << error->message); g_error_free(error); return; } diff --git a/src/networkpluginserver.cpp b/src/networkpluginserver.cpp index 90d66759..fdd68e68 100644 --- a/src/networkpluginserver.cpp +++ b/src/networkpluginserver.cpp @@ -163,9 +163,14 @@ static unsigned long exec_(std::string path, const char *host, const char *port, if ( pid == 0 ) { setsid(); // child process - exit(execv(argv[0], argv)); + errno = 0; + int ret = execv(argv[0], argv); + if (ret == -1) { + exit(errno); + } + exit(0); } else if ( pid < 0 ) { - // fork failed + LOG4CXX_ERROR(logger, "Fork failed"); } free(p); @@ -258,12 +263,29 @@ NetworkPluginServer::NetworkPluginServer(Component *component, Config *config, U LOG4CXX_INFO(logger, "Listening on host " << CONFIG_STRING(m_config, "service.backend_host") << " port " << CONFIG_STRING(m_config, "service.backend_port")); + unsigned long pid = exec_(CONFIG_STRING(m_config, "service.backend"), CONFIG_STRING(m_config, "service.backend_host").c_str(), CONFIG_STRING(m_config, "service.backend_port").c_str(), m_config->getConfigFile().c_str()); + LOG4CXX_INFO(logger, "Backend should now connect to Spectrum2 instance. Spectrum2 won't accept any connection before backend connects"); + #ifndef _WIN32 + // wait if the backend process will still be alive after 1 second + sleep(1); + pid_t result; + int status; + result = waitpid(-1, &status, WNOHANG); + if (result != 0) { + if (WIFEXITED(status)) { + if (WEXITSTATUS(status) != 0) { + LOG4CXX_ERROR(logger, "Backend can not be started, exit_code=" << WEXITSTATUS(status) << ", possible error: " << strerror(WEXITSTATUS(status))); + } + } + else { + LOG4CXX_ERROR(logger, "Backend can not be started"); + } + } + signal(SIGCHLD, SigCatcher); #endif - exec_(CONFIG_STRING(m_config, "service.backend"), CONFIG_STRING(m_config, "service.backend_host").c_str(), CONFIG_STRING(m_config, "service.backend_port").c_str(), m_config->getConfigFile().c_str()); - LOG4CXX_INFO(logger, "Backend should now connect to Spectrum2 instance. Spectrum2 won't accept any connection before backend connects"); } NetworkPluginServer::~NetworkPluginServer() { From afe5ac506dd169bda7e0eeabecd17d0f29c9f864 Mon Sep 17 00:00:00 2001 From: HanzZ Date: Fri, 30 Mar 2012 15:28:49 +0200 Subject: [PATCH 086/143] Store buddy changes only when there's a real change --- include/transport/localbuddy.h | 14 ++++++++++++-- src/buddy.cpp | 1 - src/rostermanager.cpp | 3 --- 3 files changed, 12 insertions(+), 6 deletions(-) diff --git a/include/transport/localbuddy.h b/include/transport/localbuddy.h index c8f81174..16bf12c1 100644 --- a/include/transport/localbuddy.h +++ b/include/transport/localbuddy.h @@ -51,10 +51,20 @@ class LocalBuddy : public Buddy { } std::string getIconHash() { return m_iconHash; } - void setIconHash(const std::string &iconHash) { m_iconHash = iconHash; } + void setIconHash(const std::string &iconHash) { + bool changed = m_iconHash != iconHash; + m_iconHash = iconHash; + if (changed) + getRosterManager()->storeBuddy(this); + } std::vector getGroups() { return m_groups; } - void setGroups(const std::vector &groups) { m_groups = groups; } + void setGroups(const std::vector &groups) { + bool changed = m_groups.size() != groups.size(); + m_groups = groups; + if (changed) + getRosterManager()->storeBuddy(this); + } private: std::string m_name; diff --git a/src/buddy.cpp b/src/buddy.cpp index 55f35713..5e9b30b6 100644 --- a/src/buddy.cpp +++ b/src/buddy.cpp @@ -148,7 +148,6 @@ void Buddy::handleBuddyChanged() { if (presence) { m_rosterManager->getUser()->getComponent()->getStanzaChannel()->sendPresence(presence); } - m_rosterManager->handleBuddyChanged(this); } void Buddy::handleVCardReceived(const std::string &id, Swift::VCard::ref vcard) { diff --git a/src/rostermanager.cpp b/src/rostermanager.cpp index ea49430b..81a453de 100644 --- a/src/rostermanager.cpp +++ b/src/rostermanager.cpp @@ -152,9 +152,6 @@ void RosterManager::sendBuddySubscribePresence(Buddy *buddy) { } void RosterManager::handleBuddyChanged(Buddy *buddy) { - if (m_rosterStorage) { - m_rosterStorage->storeBuddy(buddy); - } } void RosterManager::setBuddyCallback(Buddy *buddy) { From f7323117c859090c238a6d7fbaf7c62c337f04a1 Mon Sep 17 00:00:00 2001 From: Jan Kaluza Date: Tue, 3 Apr 2012 11:23:02 +0200 Subject: [PATCH 087/143] Make pb-python target default one --- plugin/python/CMakeLists.txt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/plugin/python/CMakeLists.txt b/plugin/python/CMakeLists.txt index 5bc15fb8..c851b4fd 100644 --- a/plugin/python/CMakeLists.txt +++ b/plugin/python/CMakeLists.txt @@ -7,7 +7,9 @@ if (PROTOBUF_FOUND) COMMENT "Running Python protocol buffer compiler on protocol.proto" DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/../../include/transport/protocol.proto ) - ADD_CUSTOM_TARGET(pb-python DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/protocol_pb2.py) + ADD_CUSTOM_TARGET(pb-python ALL DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/protocol_pb2.py) endif() + + From d7fb0da49618fa53bc80c98b3adaa30a5f3c63ce Mon Sep 17 00:00:00 2001 From: HanzZ Date: Tue, 3 Apr 2012 19:27:52 +0200 Subject: [PATCH 088/143] Send node in disco#info. Fixes #206 --- src/discoinforesponder.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/discoinforesponder.cpp b/src/discoinforesponder.cpp index 626953ad..6d701088 100644 --- a/src/discoinforesponder.cpp +++ b/src/discoinforesponder.cpp @@ -88,11 +88,15 @@ bool DiscoInfoResponder::handleGetRequest(const Swift::JID& from, const Swift::J // presence for transport if (to.getNode().empty()) { - sendResponse(from, id, boost::shared_ptr(new DiscoInfo(m_transportInfo))); + boost::shared_ptr res(new DiscoInfo(m_transportInfo)); + res->setNode(info->getNode()); + sendResponse(from, id, res); } // presence for buddy else { - sendResponse(from, to, id, boost::shared_ptr(new DiscoInfo(m_buddyInfo))); + boost::shared_ptr res(new DiscoInfo(m_buddyInfo)); + res->setNode(info->getNode()); + sendResponse(from, to, id, res); } return true; } From bde0e7c3eb50786fb182894bec0ab4d074b1399b Mon Sep 17 00:00:00 2001 From: HanzZ Date: Tue, 3 Apr 2012 20:17:04 +0200 Subject: [PATCH 089/143] Fetch gadu-gadu buddies. Fixes #252 --- backends/libpurple/main.cpp | 20 ++++++++++++++++++++ spectrum/src/sample.cfg | 6 +++--- 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/backends/libpurple/main.cpp b/backends/libpurple/main.cpp index c971f273..dcd5f63a 100644 --- a/backends/libpurple/main.cpp +++ b/backends/libpurple/main.cpp @@ -1447,6 +1447,26 @@ static void signed_on(PurpleConnection *gc, gpointer unused) { // force returning of memory chunks allocated by libxml2 to kernel malloc_trim(0); #endif + + PurplePlugin *plugin = gc && PURPLE_CONNECTION_IS_CONNECTED(gc) ? gc->prpl : NULL; + if (plugin && PURPLE_PLUGIN_HAS_ACTIONS(plugin)) { + PurplePluginAction *action = NULL; + GList *actions, *l; + + actions = PURPLE_PLUGIN_ACTIONS(plugin, gc); + + for (l = actions; l != NULL; l = l->next) { + if (l->data) { + action = (PurplePluginAction *) l->data; + action->plugin = plugin; + action->context = gc; + if ((std::string) action->label == "Download buddylist from Server") { + action->callback(action); + } + purple_plugin_action_free(action); + } + } + } } static void printDebug(PurpleDebugLevel level, const char *category, const char *arg_s) { diff --git a/spectrum/src/sample.cfg b/spectrum/src/sample.cfg index 88ec12c8..5309a754 100644 --- a/spectrum/src/sample.cfg +++ b/spectrum/src/sample.cfg @@ -13,9 +13,9 @@ admin_password=test #cert=server.pfx #patch to PKCS#12 certificate #cert_password=test #password to that certificate if any users_per_backend=10 -#backend=../..//backends/libpurple/spectrum2_libpurple_backend -backend=../../backends/template/spectrum2_template_backend -protocol=prpl-xmpp +backend=../..//backends/libpurple/spectrum2_libpurple_backend +#backend=../../backends/template/spectrum2_template_backend +protocol=prpl-gg #protocol=prpl-msn #protocol=any #protocol=prpl-icq From 0d46e7f53ec6781201e2e381fa2ce9908ba38ebe Mon Sep 17 00:00:00 2001 From: HanzZ Date: Tue, 3 Apr 2012 20:38:25 +0200 Subject: [PATCH 090/143] execute_purple_plugin_action --- backends/libpurple/main.cpp | 21 ++------------------- backends/libpurple/utils.cpp | 22 ++++++++++++++++++++++ backends/libpurple/utils.h | 5 ++++- 3 files changed, 28 insertions(+), 20 deletions(-) diff --git a/backends/libpurple/main.cpp b/backends/libpurple/main.cpp index dcd5f63a..8320ea28 100644 --- a/backends/libpurple/main.cpp +++ b/backends/libpurple/main.cpp @@ -1448,25 +1448,8 @@ static void signed_on(PurpleConnection *gc, gpointer unused) { malloc_trim(0); #endif - PurplePlugin *plugin = gc && PURPLE_CONNECTION_IS_CONNECTED(gc) ? gc->prpl : NULL; - if (plugin && PURPLE_PLUGIN_HAS_ACTIONS(plugin)) { - PurplePluginAction *action = NULL; - GList *actions, *l; - - actions = PURPLE_PLUGIN_ACTIONS(plugin, gc); - - for (l = actions; l != NULL; l = l->next) { - if (l->data) { - action = (PurplePluginAction *) l->data; - action->plugin = plugin; - action->context = gc; - if ((std::string) action->label == "Download buddylist from Server") { - action->callback(action); - } - purple_plugin_action_free(action); - } - } - } + // For prpl-gg + execute_purple_plugin_action(gc, "Download buddylist from Server"); } static void printDebug(PurpleDebugLevel level, const char *category, const char *arg_s) { diff --git a/backends/libpurple/utils.cpp b/backends/libpurple/utils.cpp index 417ad67d..76759798 100644 --- a/backends/libpurple/utils.cpp +++ b/backends/libpurple/utils.cpp @@ -49,6 +49,28 @@ static GHashTable *ui_info = NULL; +void execute_purple_plugin_action(PurpleConnection *gc, const std::string &name) { + PurplePlugin *plugin = gc && PURPLE_CONNECTION_IS_CONNECTED(gc) ? gc->prpl : NULL; + if (plugin && PURPLE_PLUGIN_HAS_ACTIONS(plugin)) { + PurplePluginAction *action = NULL; + GList *actions, *l; + + actions = PURPLE_PLUGIN_ACTIONS(plugin, gc); + + for (l = actions; l != NULL; l = l->next) { + if (l->data) { + action = (PurplePluginAction *) l->data; + action->plugin = plugin; + action->context = gc; + if ((std::string) action->label == name) { + action->callback(action); + } + purple_plugin_action_free(action); + } + } + } +} + GHashTable *spectrum_ui_get_info(void) { if(NULL == ui_info) { diff --git a/backends/libpurple/utils.h b/backends/libpurple/utils.h index 2055b6c1..72d513a4 100644 --- a/backends/libpurple/utils.h +++ b/backends/libpurple/utils.h @@ -21,10 +21,13 @@ #pragma once #include "purple.h" +#include #ifndef WIN32 void spectrum_sigchld_handler(int sig); #endif int create_socket(char *host, int portno); -GHashTable *spectrum_ui_get_info(void); \ No newline at end of file +GHashTable *spectrum_ui_get_info(void); + +void execute_purple_plugin_action(PurpleConnection *gc, const std::string &name); From 8bd3dfd3a28d293a90edf58a56bbc80c39829d80 Mon Sep 17 00:00:00 2001 From: Sarang Bharadwaj Date: Thu, 5 Apr 2012 14:36:24 +0530 Subject: [PATCH 091/143] NetworkPlugin python version --- backends/template/template_backend.py | 103 +++ docs/Doxyfile | 12 +- plugin/python/NetworkPlugin.py | 524 +++++++++++++++ plugin/python/protocol_pb2.py | 929 ++++++++++++++++++++++++++ spectrum/src/sample.cfg | 6 +- 5 files changed, 1565 insertions(+), 9 deletions(-) create mode 100755 backends/template/template_backend.py create mode 100644 plugin/python/NetworkPlugin.py create mode 100644 plugin/python/protocol_pb2.py diff --git a/backends/template/template_backend.py b/backends/template/template_backend.py new file mode 100755 index 00000000..575d3310 --- /dev/null +++ b/backends/template/template_backend.py @@ -0,0 +1,103 @@ +#!/usr/bin/python + +import asyncore, argparse, protocol_pb2, socket, logging +from NetworkPlugin import NetworkPlugin + +np = None + + +logger = logging.getLogger('Template Backend') +logger.setLevel(logging.DEBUG) +ch = logging.StreamHandler() +ch.setLevel(logging.DEBUG) +formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') +ch.setFormatter(formatter) +logger.addHandler(ch) + + +def handleTransportData(data): + """ + This function is called when data is received from the NetworkPlugin server + """ + np.handleDataRead(data) + + +class SpectrumPlugin(NetworkPlugin): + global logger + def __init__(self, iochannel): + NetworkPlugin.__init__(self) + self.iochannel = iochannel + logger.info("Starting plugin.") + + def sendData(self, string): + """ + NetworkPlugin uses this method to send the data to networkplugin server + """ + self.iochannel.sendData(string) + logger.info("Starting plugin.") + + def handleLoginRequest(self, user, legacyName, password): + self.handleConnected(user) + logger.info("Added Echo Buddy") + self.handleBuddyChanged(user, "echo", "Echo", [], protocol_pb2.STATUS_ONLINE) + + def handleLogoutRequest(self, user, legacyName): + pass + + def handleMessageSendRequest(self, user, legacyName, message, xhtml = ""): + logger.info("Message sent from " + user + ' to ' + legacyName) + if(legacyName == "echo"): + logger.info("Message Echoed: " + message) + self.handleMessage(user, legacyName, message) + + def handleBuddyUpdatedRequest(self, user, buddyName, alias, groups): + logger.info("Added Buddy " + buddyName) + self.handleBuddyChanged(user, buddyName, alias, groups, protocol_pb2.STATUS_ONLINE) + + def handleBuddyRemovedRequest(self, user, buddyName, groups): + pass + + + +class IOChannel(asyncore.dispatcher): + def __init__(self, host, port, readCallBack): + asyncore.dispatcher.__init__(self) + self.create_socket(socket.AF_INET, socket.SOCK_STREAM) + self.connect((host, port)) + self.handleReceivedData = readCallBack + self.send_buffer = "" + + def sendData(self, data): + self.send_buffer += data + + def handle_connect(self): + pass + + def handle_close(self): + self.close() + + def handle_read(self): + data = self.recv(65536) + self.handleReceivedData(data) + + def handle_write(self): + sent = self.send(self.send_buffer) + self.send_buffer = self.send_buffer[sent:] + + def writable(self): + return (len(self.send_buffer) > 0) + + def readable(self): + return True + + +if __name__ == "__main__": + parser = argparse.ArgumentParser() + parser.add_argument('--host', type=str, required=True) + parser.add_argument('--port', type=int, required=True) + parser.add_argument('config_file', type=str) + + args = parser.parse_args() + io = IOChannel(args.host, args.port, handleTransportData) + np = SpectrumPlugin(io) + asyncore.loop() diff --git a/docs/Doxyfile b/docs/Doxyfile index 45a29656..d5fe6463 100644 --- a/docs/Doxyfile +++ b/docs/Doxyfile @@ -38,7 +38,7 @@ PROJECT_NUMBER = "2.0" # If a relative path is entered, it will be relative to the location # where doxygen was started. If left blank the current directory will be used. -OUTPUT_DIRECTORY = /home/hanzz/code/libtransport/docs/../docs/html +OUTPUT_DIRECTORY = /home/sarang/dev/libtransport/docs/../docs/html # If the CREATE_SUBDIRS tag is set to YES, then doxygen will create # 4096 sub-directories (in 2 levels) under the output directory of each output @@ -564,7 +564,7 @@ WARN_LOGFILE = # directories like "/usr/src/myproject". Separate the files or directories # with spaces. -INPUT = /home/hanzz/code/libtransport/docs/../include/transport/ +INPUT = /home/sarang/dev/libtransport/docs/../include/transport/ # This tag can be used to specify the character encoding of the source files # that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is @@ -621,7 +621,7 @@ EXCLUDE_SYMBOLS = # directories that contain example code fragments that are included (see # the \include command). -EXAMPLE_PATH = "/home/hanzz/code/libtransport/docs/examples" +EXAMPLE_PATH = "/home/sarang/dev/libtransport/docs/examples" # If the value of the EXAMPLE_PATH tag contains directories, you can use the # EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp @@ -641,7 +641,7 @@ EXAMPLE_RECURSIVE = NO # directories that contain image that are included in the documentation (see # the \image command). -IMAGE_PATH = "/home/hanzz/code/libtransport/docs" +IMAGE_PATH = "/home/sarang/dev/libtransport/docs" # The INPUT_FILTER tag can be used to specify a program that doxygen should # invoke to filter for each input file. Doxygen will invoke the filter program @@ -763,7 +763,7 @@ GENERATE_HTML = YES # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `html' will be used as the default path. -HTML_OUTPUT = /home/hanzz/code/libtransport/docs/../docs/html +HTML_OUTPUT = /home/sarang/dev/libtransport/docs/../docs/html # The HTML_FILE_EXTENSION tag can be used to specify the file extension for # each generated HTML page (for example: .htm,.php,.asp). If it is left blank @@ -1445,7 +1445,7 @@ DOT_IMAGE_FORMAT = png # The tag DOT_PATH can be used to specify the path where the dot tool can be # found. If left blank, it is assumed the dot tool can be found in the path. -DOT_PATH = "/usr/bin" +DOT_PATH = "" # The DOTFILE_DIRS tag can be used to specify one or more directories that # contain dot files that are included in the documentation (see the diff --git a/plugin/python/NetworkPlugin.py b/plugin/python/NetworkPlugin.py new file mode 100644 index 00000000..717731fe --- /dev/null +++ b/plugin/python/NetworkPlugin.py @@ -0,0 +1,524 @@ +import protocol_pb2, socket, struct, sys, os + +def WRAP(MESSAGE, TYPE): + wrap = protocol_pb2.WrapperMessage() + wrap.type = TYPE + wrap.payload = MESSAGE + return wrap.SerializeToString() + +class NetworkPlugin: + """ + Creates new NetworkPlugin and connects the Spectrum2 NetworkPluginServer. + @param loop: Event loop. + @param host: Host where Spectrum2 NetworkPluginServer runs. + @param port: Port. + """ + + def __init__(self): + self.m_pingReceived = False + self.m_data = "" + self.m_init_res = 0 + + def handleMessage(self, user, legacyName, msg, nickname = "", xhtml = ""): + m = protocol_pb2.ConversationMessage() + m.userName = user + m.buddyName = legacyName + m.message = msg + m.nickname = nickname + m.xhtml = xhtml + + message = WRAP(m.SerializeToString(), protocol_pb2.WrapperMessage.TYPE_CONV_MESSAGE) + self.send(message) + + def handleAttention(self, user, buddyName, msg): + m = protocol_pb2.ConversationMessage() + m.userName = user + m.buddyName = buddyName + m.message = msg + + message = WRAP(m.SerializeToString(), protocol_pb2.WrapperMessage.TYPE_ATTENTION) + self.send(message) + + def handleVCard(self, user, ID, legacyName, fullName, nickname, photo): + vcard = protocol_pb2.VCard() + vcard.userName = user + vcard.buddyName = legacyName + vcard.id = ID + vcard.fullname = fullName + vcard.nickname = nickname + vcard.photo = photo + + message = WRAP(vcard.SerializeToString(), protocol_pb2.WrapperMessage.TYPE_VCARD) + self.send(message) + + + def handleSubject(self, user, legacyName, msg, nickname = ""): + m = protocol_pb2.ConversationMessage() + m.userName = user + m.buddyName = legacyName + m.message = msg + m.nickname = nickname + + message = WRAP(m.SerializeToString(), protocol_pb2.WrapperMessage.TYPE_ROOM_SUBJECT_CHANGED) + #print "SENDING MESSAGE" + self.send(message) + + + def handleBuddyChanged(self, user, buddyName, alias, groups, status, statusMessage = "", iconHash = "", blocked = False): + buddy = protocol_pb2.Buddy() + buddy.userName = user + buddy.buddyName = buddyName + buddy.alias = alias + buddy.group.extend(groups) + buddy.status = status + buddy.statusMessage = statusMessage + buddy.iconHash = iconHash + buddy.blocked = blocked + + message = WRAP(buddy.SerializeToString(), protocol_pb2.WrapperMessage.TYPE_BUDDY_CHANGED) + self.send(message) + + + def handleBuddyTyping(self, user, buddyName): + buddy = protocol_pb2.Buddy() + buddy.userName = user + buddy.buddyName = buddyName + + message = WRAP(buddy.SerializeToString(), protocol_pb2.WrapperMessage.TYPE_BUDDY_TYPING) + self.send(message); + + def handleBuddyTyped(self, user, buddyName): + buddy = protocol_pb2.Buddy() + buddy.userName = user + buddy.buddyName = buddyName + + message = WRAP(buddy.SerializeToString(), protocol_pb2.WrapperMessage.TYPE_BUDDY_TYPED) + self.send(message); + + def handleBuddyStoppedTyping(self, user, buddyName): + buddy = protocol_pb2.Buddy() + buddy.userName = user + buddy.buddyName = buddyName + + message = WRAP(buddy.SerializeToString(), protocol_pb2.WrapperMessage.TYPE_BUDDY_STOPPED_TYPING) + self.send(message) + + def handleAuthorization(self, user, buddyName): + buddy = protocol_pb2.Buddy() + buddy.userName = user + buddy.buddyName = buddyName + + message = WRAP(buddy.SerializeToString(), protocol_pb2.WrapperMessage.TYPE_AUTH_REQUEST) + self.send(message) + + + def handleConnected(self, user): + d = protocol_pb2.Connected() + d.user = user + + message = WRAP(d.SerializeToString(), protocol_pb2.WrapperMessage.TYPE_CONNECTED) + self.send(message); + + + def handleDisconnected(self, user, error = 0, msg = ""): + d = protocol_pb2.Disconnected() + d.user = user + d.error = error + d.message = msg + + message = WRAP(d.SerializeToString(), protocol_pb2.WrapperMessage.TYPE_DISCONNECTED) + self.send(message); + + + def handleParticipantChanged(self, user, nickname, room, flags, status, statusMessage = "", newname = ""): + d = protocol_pb2.Participant() + d.userName = user + d.nickname = nickname + d.room = room + d.flag = flags + d.newname = newname + d.status = status + d.statusMessage = statusMessage + + message = WRAP(d.SerializeToString(), protocol_pb2.WrapperMessage.TYPE_PARTICIPANT_CHANGED) + self.send(message); + + + def handleRoomNicknameChanged(self, user, r, nickname): + room = protocol_pb2.Room() + room.userName = user + room.nickname = nickname + room.room = r + room.password = "" + + message = WRAP(room.SerializeToString(), protocol_pb2.WrapperMessage.TYPE_ROOM_NICKNAME_CHANGED) + self.send(message); + + + def handleFTStart(self, user, buddyName, fileName, size): + room = protocol_pb2.File() + room.userName = user + room.buddyName = buddyName + room.fileName = fileName + room.size = size + + message = WRAP(room.SerializeToString(), protocol_pb2.WrapperMessage.TYPE_FT_START) + self.send(message); + + def handleFTFinish(self, user, buddyName, fileName, size, ftid): + room = protocol_pb2.File() + room.userName = user + room.buddyName = buddyName + room.fileName = fileName + room.size = size + + # Check later + if ftid != 0: + room.ftID = ftid + + message = WRAP(room.SerializeToString(), protocol_pb2.WrapperMessage.TYPE_FT_FINISH) + self.send(message) + + + def handleFTData(self, ftID, data): + d = protocol_pb2.FileTransferData() + d.ftid = ftID + d.data = data + + message = WRAP(d.SerializeToString(), protocol_pb2.WrapperMessage.TYPE_FT_DATA); + self.send(message) + + def handleLoginPayload(self, data): + payload = protocol_pb2.Login() + if (payload.ParseFromString(data) == False): + #TODO: ERROR + return + self.handleLoginRequest(payload.user, payload.legacyName, payload.password) + + def handleLogoutPayload(self, data): + payload = protocol_pb2.Logout() + if (payload.ParseFromString(data) == False): + #TODO: ERROR + return + self.handleLogoutRequest(self, payload.user, payload.legacyName) + + def handleStatusChangedPayload(data): + payload = protocol_pb2.Status() + if (payload.ParseFromString(data) == False): + #TODO: ERROR + return + self.handleStatusChangeRequest(payload.userName, payload.status, payload.statusMessage) + + def handleConvMessagePayload(self, data): + payload = protocol_pb2.ConversationMessage() + if (payload.ParseFromString(data) == False): + #TODO: ERROR + return + self.handleMessageSendRequest(payload.userName, payload.buddyName, payload.message, payload.xhtml) + + def handleAttentionPayload(self, data): + payload = protocol_pb2.ConversationMessage() + if (payload.ParseFromString(data) == False): + #TODO: ERROR + return + self.handleAttentionRequest(payload.userName, payload.buddyName, payload.message) + + def handleFTStartPayload(self, data): + payload = protocol_pb2.File() + if (payload.ParseFromString(data) == False): + #TODO: ERROR + return + self.handleFTStartRequest(payload.userName, payload.buddyName, payload.fileName, payload.size, payload.ftID); + + def handleFTFinishPayload(self, data): + payload = protocol_pb2.File() + if (payload.ParseFromString(data) == False): + #TODO: ERROR + return + self.handleFTFinishRequest(payload.userName, payload.buddyName, payload.fileName, payload.size, payload.ftID) + + def handleFTPausePayload(self, data): + payload = protocol_pb2.FileTransferData() + if (payload.ParseFromString(data) == False): + #TODO: ERROR + return + self.handleFTPauseRequest(payload.ftID) + + def handleFTContinuePayload(self, data): + payload = protocol_pb2.FileTransferData() + if (payload.ParseFromString(data) == False): + #TODO: ERROR + return + self.handleFTContinueRequest(payload.ftID) + + def handleJoinRoomPayload(self, data): + payload = protocol_pb2.Room() + if (payload.ParseFromString(data) == False): + #TODO: ERROR + return + self.handleJoinRoomRequest(payload.userName, payload.room, payload.nickname, payload.password) + + def handleLeaveRoomPayload(self, data): + payload = protocol_pb2.Room() + if (payload.ParseFromString(data) == False): + #TODO: ERROR + return + self.handleLeaveRoomRequest(payload.userName, payload.room) + + def handleVCardPayload(self, data): + payload = protocol_pb2.VCard() + if (payload.ParseFromString(data) == False): + #TODO: ERROR + return + if payload.HasField('photo'): + self.handleVCardUpdatedRequest(payload.userName, payload.photo, payload.nickname) + elif len(payload.buddyName) > 0: + self.handleVCardRequest(payload.userName, payload.buddyName, payload.id) + + def handleBuddyChangedPayload(self, data): + payload = protocol_pb2.Buddy() + if (payload.ParseFromString(data) == False): + #TODO: ERROR + return + if payload.HasField('blocked'): + self.handleBuddyBlockToggled(payload.userName, payload.buddyName, payload.blocked) + else: + groups = [g for g in payload.group] + self.handleBuddyUpdatedRequest(payload.userName, payload.buddyName, payload.alias, groups); + + def handleBuddyRemovedPayload(self, data): + payload = protocol_pb2.Buddy() + if (payload.ParseFromString(data) == False): + #TODO: ERROR + return + groups = [g for g in payload.group] + self.handleBuddyRemovedRequest(payload.userName, payload.buddyName, groups); + + def handleChatStatePayload(self, data, msgType): + payload = protocol_pb2.Buddy() + if (payload.ParseFromString(data) == False): + #TODO: ERROR + return + if msgType == protocol_pb2.WrapperMessage.TYPE_BUDDY_TYPING: + self.handleTypingRequest(payload.userName, payload.buddyName) + elif msgType == protocol_pb2.WrapperMessage.TYPE_BUDDY_TYPED: + self.handleTypedRequest(payload.userName, payload.buddyName) + elif msgType == protocol_pb2.WrapperMessage.TYPE_BUDDY_STOPPED_TYPING: + self.handleStoppedTypingRequest(payload.userName, payload.buddyName) + + + def handleDataRead(self, data): + self.m_data += data + while len(self.m_data) != 0: + expected_size = 0 + if (len(self.m_data) >= 4): + expected_size = struct.unpack('!I', self.m_data[0:4])[0] + if (len(self.m_data) - 4 < expected_size): + return + else: + return + + wrapper = protocol_pb2.WrapperMessage() + if (wrapper.ParseFromString(self.m_data[4:]) == False): + self.m_data = self.m_data[expected_size+4:] + return + + self.m_data = self.m_data[4+expected_size:] + + if wrapper.type == protocol_pb2.WrapperMessage.TYPE_LOGIN: + self.handleLoginPayload(wrapper.payload) + elif wrapper.type == protocol_pb2.WrapperMessage.TYPE_LOGOUT: + self.handleLogoutPayload(wrapper.payload) + elif wrapper.type == protocol_pb2.WrapperMessage.TYPE_PING: + self.sendPong() + elif wrapper.type == protocol_pb2.WrapperMessage.TYPE_CONV_MESSAGE: + self.handleConvMessagePayload(wrapper.payload) + elif wrapper.type == protocol_pb2.WrapperMessage.TYPE_JOIN_ROOM: + self.handleJoinRoomPayload(wrapper.payload) + elif wrapper.type == protocol_pb2.WrapperMessage.TYPE_LEAVE_ROOM: + self.handleLeaveRoomPayload(wrapper.payload) + elif wrapper.type == protocol_pb2.WrapperMessage.TYPE_VCARD: + self.handleVCardPayload(wrapper.payload) + elif wrapper.type == protocol_pb2.WrapperMessage.TYPE_BUDDY_CHANGED: + self.handleBuddyChangedPayload(wrapper.payload) + elif wrapper.type == protocol_pb2.WrapperMessage.TYPE_BUDDY_REMOVED: + self.handleBuddyRemovedPayload(wrapper.payload) + elif wrapper.type == protocol_pb2.WrapperMessage.TYPE_STATUS_CHANGED: + self.handleStatusChangedPayload(wrapper.payload) + elif wrapper.type == protocol_pb2.WrapperMessage.TYPE_BUDDY_TYPING: + self.handleChatStatePayload(wrapper.payload, protocol_pb2.WrapperMessage.TYPE_BUDDY_TYPING) + elif wrapper.type == protocol_pb2.WrapperMessage.TYPE_BUDDY_TYPED: + self.handleChatStatePayload(wrapper.payload, protocol_pb2.WrapperMessage.TYPE_BUDDY_TYPED) + elif wrapper.type == protocol_pb2.WrapperMessage.TYPE_BUDDY_STOPPED_TYPING: + self.handleChatStatePayload(wrapper.payload, protocol_pb2.WrapperMessage.TYPE_BUDDY_STOPPED_TYPING) + elif wrapper.type == protocol_pb2.WrapperMessage.TYPE_ATTENTION: + self.handleAttentionPayload(wrapper.payload) + elif wrapper.type == protocol_pb2.WrapperMessage.TYPE_FT_START: + self.handleFTStartPayload(wrapper.payload) + elif wrapper.type == protocol_pb2.WrapperMessage.TYPE_FT_FINISH: + self.handleFTFinishPayload(wrapper.payload) + elif wrapper.type == protocol_pb2.WrapperMessage.TYPE_FT_PAUSE: + self.handleFTPausePayload(wrapper.payload) + elif wrapper.type == protocol_pb2.WrapperMessage.TYPE_FT_CONTINUE: + self.handleFTContinuePayload(wrapper.payload) + elif wrapper.type == protocol_pb2.WrapperMessage.TYPE_EXIT: + self.handleExitRequest() + + + def send(self, data): + header = struct.pack('!I',len(data)) + self.sendData(header + data) + + def checkPing(self): + if (self.m_pingReceived == False): + self.handleExitRequest() + self.m_pingReceived = False + + + def sendPong(self): + self.m_pingReceived = True + wrap = protocol_pb2.WrapperMessage() + wrap.type = protocol_pb2.WrapperMessage.TYPE_PONG + message = wrap.SerializeToString() + self.send(message) + self.sendMemoryUsage() + + + def sendMemoryUsage(self): + stats = protocol_pb2.Stats() + + stats.init_res = self.m_init_res + res = 0 + shared = 0 + + e_res, e_shared = self.handleMemoryUsage() + + stats.res = res + e_res + stats.shared = shared + e_shared + stats.id = str(os.getpid()) + + message = WRAP(stats.SerializeToString(), protocol_pb2.WrapperMessage.TYPE_STATS) + self.send(message) + + + def handleLoginRequest(self, user, legacyName, password): + """ + Called when XMPP user wants to connect legacy network. + You should connect him to legacy network and call handleConnected or handleDisconnected function later. + @param user: XMPP JID of user for which this event occurs. + @param legacyName: Legacy network name of this user used for login. + @param password: Legacy network password of this user. + """ + + #\msc + #NetworkPlugin,YourNetworkPlugin,LegacyNetwork; + #NetworkPlugin->YourNetworkPlugin [label="handleLoginRequest(...)", URL="\ref NetworkPlugin::handleLoginRequest()"]; + #YourNetworkPlugin->LegacyNetwork [label="connect the legacy network"]; + #--- [label="If password was valid and user is connected and logged in"]; + #YourNetworkPlugin<-LegacyNetwork [label="connected"]; + #YourNetworkPlugin->NetworkPlugin [label="handleConnected()", URL="\ref NetworkPlugin::handleConnected()"]; + #--- [label="else"]; + #YourNetworkPlugin<-LegacyNetwork [label="disconnected"]; + #YourNetworkPlugin->NetworkPlugin [label="handleDisconnected()", URL="\ref NetworkPlugin::handleDisconnected()"]; + #\endmsc + + raise NotImplementedError, "Implement me" + + def handleLogoutRequest(self, user, legacyName): + """ + Called when XMPP user wants to disconnect legacy network. + You should disconnect him from legacy network. + @param user: XMPP JID of user for which this event occurs. + @param legacyName: Legacy network name of this user used for login. + """ + + raise NotImplementedError, "Implement me" + + def handleMessageSendRequest(self, user, legacyName, message, xhtml = ""): + """ + Called when XMPP user sends message to legacy network. + @param user: XMPP JID of user for which this event occurs. + @param legacyName: Legacy network name of buddy or room. + @param message: Plain text message. + @param xhtml: XHTML message. + """ + + raise NotImplementedError, "Implement me" + + def handleVCardRequest(self, user, legacyName, ID): + """ Called when XMPP user requests VCard of buddy. + @param user: XMPP JID of user for which this event occurs. + @param legacyName: Legacy network name of buddy whose VCard is requested. + @param ID: ID which is associated with this request. You have to pass it to handleVCard function when you receive VCard.""" + + #\msc + #NetworkPlugin,YourNetworkPlugin,LegacyNetwork; + #NetworkPlugin->YourNetworkPlugin [label="handleVCardRequest(...)", URL="\ref NetworkPlugin::handleVCardRequest()"]; + #YourNetworkPlugin->LegacyNetwork [label="start VCard fetching"]; + #YourNetworkPlugin<-LegacyNetwork [label="VCard fetched"]; + #YourNetworkPlugin->NetworkPlugin [label="handleVCard()", URL="\ref NetworkPlugin::handleVCard()"]; + #\endmsc + + pass + + + def handleVCardUpdatedRequest(self, user, photo, nickname): + """ + Called when XMPP user updates his own VCard. + You should update the VCard in legacy network too. + @param user: XMPP JID of user for which this event occurs. + @param photo: Raw photo data. + """ + pass + + def handleJoinRoomRequest(self, user, room, nickname, pasword): + pass + + def handleLeaveRoomRequest(self, user, room): + pass + + def handleStatusChangeRequest(self, user, status, statusMessage): + pass + + def handleBuddyUpdatedRequest(self, user, buddyName, alias, groups): + pass + + def handleBuddyRemovedRequest(self, user, buddyName, groups): + pass + + def handleBuddyBlockToggled(self, user, buddyName, blocked): + pass + + def handleTypingRequest(self, user, buddyName): + pass + + def handleTypedRequest(self, user, buddyName): + pass + + def handleStoppedTypingRequest(self, user, buddyName): + pass + + def handleAttentionRequest(self, user, buddyName, message): + pass + + def handleFTStartRequest(self, user, buddyName, fileName, size, ftID): + pass + + def handleFTFinishRequest(self, user, buddyName, fileName, size, ftID): + pass + + def handleFTPauseRequest(self, ftID): + pass + + def handleFTContinueRequest(self, ftID): + pass + + def handleMemoryUsage(self): + return (0,0) + + def handleExitRequest(self): + sys.exit(1) + + def sendData(self, data): + pass + diff --git a/plugin/python/protocol_pb2.py b/plugin/python/protocol_pb2.py new file mode 100644 index 00000000..1ed6f366 --- /dev/null +++ b/plugin/python/protocol_pb2.py @@ -0,0 +1,929 @@ +# Generated by the protocol buffer compiler. DO NOT EDIT! + +from google.protobuf import descriptor +from google.protobuf import message +from google.protobuf import reflection +from google.protobuf import service +from google.protobuf import service_reflection +from google.protobuf import descriptor_pb2 +_CONNECTIONERROR = descriptor.EnumDescriptor( + name='ConnectionError', + full_name='pbnetwork.ConnectionError', + filename='ConnectionError', + values=[ + descriptor.EnumValueDescriptor( + name='CONNECTION_ERROR_NETWORK_ERROR', index=0, number=0, + options=None, + type=None), + descriptor.EnumValueDescriptor( + name='CONNECTION_ERROR_INVALID_USERNAME', index=1, number=1, + options=None, + type=None), + descriptor.EnumValueDescriptor( + name='CONNECTION_ERROR_AUTHENTICATION_FAILED', index=2, number=2, + options=None, + type=None), + descriptor.EnumValueDescriptor( + name='CONNECTION_ERROR_AUTHENTICATION_IMPOSSIBLE', index=3, number=3, + options=None, + type=None), + descriptor.EnumValueDescriptor( + name='CONNECTION_ERROR_NO_SSL_SUPPORT', index=4, number=4, + options=None, + type=None), + descriptor.EnumValueDescriptor( + name='CONNECTION_ERROR_ENCRYPTION_ERROR', index=5, number=5, + options=None, + type=None), + descriptor.EnumValueDescriptor( + name='CONNECTION_ERROR_NAME_IN_USE', index=6, number=6, + options=None, + type=None), + descriptor.EnumValueDescriptor( + name='CONNECTION_ERROR_INVALID_SETTINGS', index=7, number=7, + options=None, + type=None), + descriptor.EnumValueDescriptor( + name='CONNECTION_ERROR_CERT_NOT_PROVIDED', index=8, number=8, + options=None, + type=None), + descriptor.EnumValueDescriptor( + name='CONNECTION_ERROR_CERT_UNTRUSTED', index=9, number=9, + options=None, + type=None), + descriptor.EnumValueDescriptor( + name='CONNECTION_ERROR_CERT_EXPIRED', index=10, number=10, + options=None, + type=None), + descriptor.EnumValueDescriptor( + name='CONNECTION_ERROR_CERT_NOT_ACTIVATED', index=11, number=11, + options=None, + type=None), + descriptor.EnumValueDescriptor( + name='CONNECTION_ERROR_CERT_HOSTNAME_MISMATCH', index=12, number=12, + options=None, + type=None), + descriptor.EnumValueDescriptor( + name='CONNECTION_ERROR_CERT_FINGERPRINT_MISMATCH', index=13, number=13, + options=None, + type=None), + descriptor.EnumValueDescriptor( + name='CONNECTION_ERROR_CERT_SELF_SIGNED', index=14, number=14, + options=None, + type=None), + descriptor.EnumValueDescriptor( + name='CONNECTION_ERROR_CERT_OTHER_ERROR', index=15, number=15, + options=None, + type=None), + descriptor.EnumValueDescriptor( + name='CONNECTION_ERROR_OTHER_ERROR', index=16, number=16, + options=None, + type=None), + ], + options=None, +) + + +_STATUSTYPE = descriptor.EnumDescriptor( + name='StatusType', + full_name='pbnetwork.StatusType', + filename='StatusType', + values=[ + descriptor.EnumValueDescriptor( + name='STATUS_ONLINE', index=0, number=0, + options=None, + type=None), + descriptor.EnumValueDescriptor( + name='STATUS_AWAY', index=1, number=1, + options=None, + type=None), + descriptor.EnumValueDescriptor( + name='STATUS_FFC', index=2, number=2, + options=None, + type=None), + descriptor.EnumValueDescriptor( + name='STATUS_XA', index=3, number=3, + options=None, + type=None), + descriptor.EnumValueDescriptor( + name='STATUS_DND', index=4, number=4, + options=None, + type=None), + descriptor.EnumValueDescriptor( + name='STATUS_NONE', index=5, number=5, + options=None, + type=None), + descriptor.EnumValueDescriptor( + name='STATUS_INVISIBLE', index=6, number=6, + options=None, + type=None), + ], + options=None, +) + + +CONNECTION_ERROR_NETWORK_ERROR = 0 +CONNECTION_ERROR_INVALID_USERNAME = 1 +CONNECTION_ERROR_AUTHENTICATION_FAILED = 2 +CONNECTION_ERROR_AUTHENTICATION_IMPOSSIBLE = 3 +CONNECTION_ERROR_NO_SSL_SUPPORT = 4 +CONNECTION_ERROR_ENCRYPTION_ERROR = 5 +CONNECTION_ERROR_NAME_IN_USE = 6 +CONNECTION_ERROR_INVALID_SETTINGS = 7 +CONNECTION_ERROR_CERT_NOT_PROVIDED = 8 +CONNECTION_ERROR_CERT_UNTRUSTED = 9 +CONNECTION_ERROR_CERT_EXPIRED = 10 +CONNECTION_ERROR_CERT_NOT_ACTIVATED = 11 +CONNECTION_ERROR_CERT_HOSTNAME_MISMATCH = 12 +CONNECTION_ERROR_CERT_FINGERPRINT_MISMATCH = 13 +CONNECTION_ERROR_CERT_SELF_SIGNED = 14 +CONNECTION_ERROR_CERT_OTHER_ERROR = 15 +CONNECTION_ERROR_OTHER_ERROR = 16 +STATUS_ONLINE = 0 +STATUS_AWAY = 1 +STATUS_FFC = 2 +STATUS_XA = 3 +STATUS_DND = 4 +STATUS_NONE = 5 +STATUS_INVISIBLE = 6 + + +_WRAPPERMESSAGE_TYPE = descriptor.EnumDescriptor( + name='Type', + full_name='pbnetwork.WrapperMessage.Type', + filename='Type', + values=[ + descriptor.EnumValueDescriptor( + name='TYPE_CONNECTED', index=0, number=1, + options=None, + type=None), + descriptor.EnumValueDescriptor( + name='TYPE_DISCONNECTED', index=1, number=2, + options=None, + type=None), + descriptor.EnumValueDescriptor( + name='TYPE_LOGIN', index=2, number=3, + options=None, + type=None), + descriptor.EnumValueDescriptor( + name='TYPE_LOGOUT', index=3, number=4, + options=None, + type=None), + descriptor.EnumValueDescriptor( + name='TYPE_BUDDY_CHANGED', index=4, number=6, + options=None, + type=None), + descriptor.EnumValueDescriptor( + name='TYPE_BUDDY_REMOVED', index=5, number=7, + options=None, + type=None), + descriptor.EnumValueDescriptor( + name='TYPE_CONV_MESSAGE', index=6, number=8, + options=None, + type=None), + descriptor.EnumValueDescriptor( + name='TYPE_PING', index=7, number=9, + options=None, + type=None), + descriptor.EnumValueDescriptor( + name='TYPE_PONG', index=8, number=10, + options=None, + type=None), + descriptor.EnumValueDescriptor( + name='TYPE_JOIN_ROOM', index=9, number=11, + options=None, + type=None), + descriptor.EnumValueDescriptor( + name='TYPE_LEAVE_ROOM', index=10, number=12, + options=None, + type=None), + descriptor.EnumValueDescriptor( + name='TYPE_PARTICIPANT_CHANGED', index=11, number=13, + options=None, + type=None), + descriptor.EnumValueDescriptor( + name='TYPE_ROOM_NICKNAME_CHANGED', index=12, number=14, + options=None, + type=None), + descriptor.EnumValueDescriptor( + name='TYPE_ROOM_SUBJECT_CHANGED', index=13, number=15, + options=None, + type=None), + descriptor.EnumValueDescriptor( + name='TYPE_VCARD', index=14, number=16, + options=None, + type=None), + descriptor.EnumValueDescriptor( + name='TYPE_STATUS_CHANGED', index=15, number=17, + options=None, + type=None), + descriptor.EnumValueDescriptor( + name='TYPE_BUDDY_TYPING', index=16, number=18, + options=None, + type=None), + descriptor.EnumValueDescriptor( + name='TYPE_BUDDY_STOPPED_TYPING', index=17, number=19, + options=None, + type=None), + descriptor.EnumValueDescriptor( + name='TYPE_BUDDY_TYPED', index=18, number=20, + options=None, + type=None), + descriptor.EnumValueDescriptor( + name='TYPE_AUTH_REQUEST', index=19, number=21, + options=None, + type=None), + descriptor.EnumValueDescriptor( + name='TYPE_ATTENTION', index=20, number=22, + options=None, + type=None), + descriptor.EnumValueDescriptor( + name='TYPE_STATS', index=21, number=23, + options=None, + type=None), + descriptor.EnumValueDescriptor( + name='TYPE_FT_START', index=22, number=24, + options=None, + type=None), + descriptor.EnumValueDescriptor( + name='TYPE_FT_FINISH', index=23, number=25, + options=None, + type=None), + descriptor.EnumValueDescriptor( + name='TYPE_FT_DATA', index=24, number=26, + options=None, + type=None), + descriptor.EnumValueDescriptor( + name='TYPE_FT_PAUSE', index=25, number=27, + options=None, + type=None), + descriptor.EnumValueDescriptor( + name='TYPE_FT_CONTINUE', index=26, number=28, + options=None, + type=None), + descriptor.EnumValueDescriptor( + name='TYPE_EXIT', index=27, number=29, + options=None, + type=None), + ], + options=None, +) + + +_CONNECTED = descriptor.Descriptor( + name='Connected', + full_name='pbnetwork.Connected', + filename='protocol.proto', + containing_type=None, + fields=[ + descriptor.FieldDescriptor( + name='user', full_name='pbnetwork.Connected.user', index=0, + number=1, type=9, cpp_type=9, label=2, + default_value=unicode("", "utf-8"), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], # TODO(robinson): Implement. + enum_types=[ + ], + options=None) + + +_DISCONNECTED = descriptor.Descriptor( + name='Disconnected', + full_name='pbnetwork.Disconnected', + filename='protocol.proto', + containing_type=None, + fields=[ + descriptor.FieldDescriptor( + name='user', full_name='pbnetwork.Disconnected.user', index=0, + number=1, type=9, cpp_type=9, label=2, + default_value=unicode("", "utf-8"), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + descriptor.FieldDescriptor( + name='error', full_name='pbnetwork.Disconnected.error', index=1, + number=2, type=5, cpp_type=1, label=2, + default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + descriptor.FieldDescriptor( + name='message', full_name='pbnetwork.Disconnected.message', index=2, + number=3, type=9, cpp_type=9, label=1, + default_value=unicode("", "utf-8"), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], # TODO(robinson): Implement. + enum_types=[ + ], + options=None) + + +_LOGIN = descriptor.Descriptor( + name='Login', + full_name='pbnetwork.Login', + filename='protocol.proto', + containing_type=None, + fields=[ + descriptor.FieldDescriptor( + name='user', full_name='pbnetwork.Login.user', index=0, + number=1, type=9, cpp_type=9, label=2, + default_value=unicode("", "utf-8"), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + descriptor.FieldDescriptor( + name='legacyName', full_name='pbnetwork.Login.legacyName', index=1, + number=2, type=9, cpp_type=9, label=2, + default_value=unicode("", "utf-8"), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + descriptor.FieldDescriptor( + name='password', full_name='pbnetwork.Login.password', index=2, + number=3, type=9, cpp_type=9, label=2, + default_value=unicode("", "utf-8"), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], # TODO(robinson): Implement. + enum_types=[ + ], + options=None) + + +_LOGOUT = descriptor.Descriptor( + name='Logout', + full_name='pbnetwork.Logout', + filename='protocol.proto', + containing_type=None, + fields=[ + descriptor.FieldDescriptor( + name='user', full_name='pbnetwork.Logout.user', index=0, + number=1, type=9, cpp_type=9, label=2, + default_value=unicode("", "utf-8"), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + descriptor.FieldDescriptor( + name='legacyName', full_name='pbnetwork.Logout.legacyName', index=1, + number=2, type=9, cpp_type=9, label=2, + default_value=unicode("", "utf-8"), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], # TODO(robinson): Implement. + enum_types=[ + ], + options=None) + + +_BUDDY = descriptor.Descriptor( + name='Buddy', + full_name='pbnetwork.Buddy', + filename='protocol.proto', + containing_type=None, + fields=[ + descriptor.FieldDescriptor( + name='userName', full_name='pbnetwork.Buddy.userName', index=0, + number=1, type=9, cpp_type=9, label=2, + default_value=unicode("", "utf-8"), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + descriptor.FieldDescriptor( + name='buddyName', full_name='pbnetwork.Buddy.buddyName', index=1, + number=2, type=9, cpp_type=9, label=2, + default_value=unicode("", "utf-8"), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + descriptor.FieldDescriptor( + name='alias', full_name='pbnetwork.Buddy.alias', index=2, + number=3, type=9, cpp_type=9, label=1, + default_value=unicode("", "utf-8"), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + descriptor.FieldDescriptor( + name='group', full_name='pbnetwork.Buddy.group', index=3, + number=4, type=9, cpp_type=9, label=3, + default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + descriptor.FieldDescriptor( + name='status', full_name='pbnetwork.Buddy.status', index=4, + number=5, type=14, cpp_type=8, label=1, + default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + descriptor.FieldDescriptor( + name='statusMessage', full_name='pbnetwork.Buddy.statusMessage', index=5, + number=6, type=9, cpp_type=9, label=1, + default_value=unicode("", "utf-8"), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + descriptor.FieldDescriptor( + name='iconHash', full_name='pbnetwork.Buddy.iconHash', index=6, + number=7, type=9, cpp_type=9, label=1, + default_value=unicode("", "utf-8"), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + descriptor.FieldDescriptor( + name='blocked', full_name='pbnetwork.Buddy.blocked', index=7, + number=8, type=8, cpp_type=7, label=1, + default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], # TODO(robinson): Implement. + enum_types=[ + ], + options=None) + + +_CONVERSATIONMESSAGE = descriptor.Descriptor( + name='ConversationMessage', + full_name='pbnetwork.ConversationMessage', + filename='protocol.proto', + containing_type=None, + fields=[ + descriptor.FieldDescriptor( + name='userName', full_name='pbnetwork.ConversationMessage.userName', index=0, + number=1, type=9, cpp_type=9, label=2, + default_value=unicode("", "utf-8"), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + descriptor.FieldDescriptor( + name='buddyName', full_name='pbnetwork.ConversationMessage.buddyName', index=1, + number=2, type=9, cpp_type=9, label=2, + default_value=unicode("", "utf-8"), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + descriptor.FieldDescriptor( + name='message', full_name='pbnetwork.ConversationMessage.message', index=2, + number=3, type=9, cpp_type=9, label=2, + default_value=unicode("", "utf-8"), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + descriptor.FieldDescriptor( + name='nickname', full_name='pbnetwork.ConversationMessage.nickname', index=3, + number=4, type=9, cpp_type=9, label=1, + default_value=unicode("", "utf-8"), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + descriptor.FieldDescriptor( + name='xhtml', full_name='pbnetwork.ConversationMessage.xhtml', index=4, + number=5, type=9, cpp_type=9, label=1, + default_value=unicode("", "utf-8"), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], # TODO(robinson): Implement. + enum_types=[ + ], + options=None) + + +_ROOM = descriptor.Descriptor( + name='Room', + full_name='pbnetwork.Room', + filename='protocol.proto', + containing_type=None, + fields=[ + descriptor.FieldDescriptor( + name='userName', full_name='pbnetwork.Room.userName', index=0, + number=1, type=9, cpp_type=9, label=2, + default_value=unicode("", "utf-8"), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + descriptor.FieldDescriptor( + name='nickname', full_name='pbnetwork.Room.nickname', index=1, + number=2, type=9, cpp_type=9, label=2, + default_value=unicode("", "utf-8"), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + descriptor.FieldDescriptor( + name='room', full_name='pbnetwork.Room.room', index=2, + number=3, type=9, cpp_type=9, label=2, + default_value=unicode("", "utf-8"), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + descriptor.FieldDescriptor( + name='password', full_name='pbnetwork.Room.password', index=3, + number=4, type=9, cpp_type=9, label=1, + default_value=unicode("", "utf-8"), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], # TODO(robinson): Implement. + enum_types=[ + ], + options=None) + + +_PARTICIPANT = descriptor.Descriptor( + name='Participant', + full_name='pbnetwork.Participant', + filename='protocol.proto', + containing_type=None, + fields=[ + descriptor.FieldDescriptor( + name='userName', full_name='pbnetwork.Participant.userName', index=0, + number=1, type=9, cpp_type=9, label=2, + default_value=unicode("", "utf-8"), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + descriptor.FieldDescriptor( + name='room', full_name='pbnetwork.Participant.room', index=1, + number=2, type=9, cpp_type=9, label=2, + default_value=unicode("", "utf-8"), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + descriptor.FieldDescriptor( + name='nickname', full_name='pbnetwork.Participant.nickname', index=2, + number=3, type=9, cpp_type=9, label=2, + default_value=unicode("", "utf-8"), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + descriptor.FieldDescriptor( + name='flag', full_name='pbnetwork.Participant.flag', index=3, + number=4, type=5, cpp_type=1, label=2, + default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + descriptor.FieldDescriptor( + name='status', full_name='pbnetwork.Participant.status', index=4, + number=5, type=14, cpp_type=8, label=2, + default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + descriptor.FieldDescriptor( + name='statusMessage', full_name='pbnetwork.Participant.statusMessage', index=5, + number=6, type=9, cpp_type=9, label=1, + default_value=unicode("", "utf-8"), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + descriptor.FieldDescriptor( + name='newname', full_name='pbnetwork.Participant.newname', index=6, + number=7, type=9, cpp_type=9, label=1, + default_value=unicode("", "utf-8"), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], # TODO(robinson): Implement. + enum_types=[ + ], + options=None) + + +_VCARD = descriptor.Descriptor( + name='VCard', + full_name='pbnetwork.VCard', + filename='protocol.proto', + containing_type=None, + fields=[ + descriptor.FieldDescriptor( + name='userName', full_name='pbnetwork.VCard.userName', index=0, + number=1, type=9, cpp_type=9, label=2, + default_value=unicode("", "utf-8"), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + descriptor.FieldDescriptor( + name='buddyName', full_name='pbnetwork.VCard.buddyName', index=1, + number=2, type=9, cpp_type=9, label=2, + default_value=unicode("", "utf-8"), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + descriptor.FieldDescriptor( + name='id', full_name='pbnetwork.VCard.id', index=2, + number=3, type=5, cpp_type=1, label=2, + default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + descriptor.FieldDescriptor( + name='fullname', full_name='pbnetwork.VCard.fullname', index=3, + number=4, type=9, cpp_type=9, label=1, + default_value=unicode("", "utf-8"), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + descriptor.FieldDescriptor( + name='nickname', full_name='pbnetwork.VCard.nickname', index=4, + number=5, type=9, cpp_type=9, label=1, + default_value=unicode("", "utf-8"), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + descriptor.FieldDescriptor( + name='photo', full_name='pbnetwork.VCard.photo', index=5, + number=6, type=12, cpp_type=9, label=1, + default_value="", + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], # TODO(robinson): Implement. + enum_types=[ + ], + options=None) + + +_STATUS = descriptor.Descriptor( + name='Status', + full_name='pbnetwork.Status', + filename='protocol.proto', + containing_type=None, + fields=[ + descriptor.FieldDescriptor( + name='userName', full_name='pbnetwork.Status.userName', index=0, + number=1, type=9, cpp_type=9, label=2, + default_value=unicode("", "utf-8"), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + descriptor.FieldDescriptor( + name='status', full_name='pbnetwork.Status.status', index=1, + number=3, type=14, cpp_type=8, label=2, + default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + descriptor.FieldDescriptor( + name='statusMessage', full_name='pbnetwork.Status.statusMessage', index=2, + number=4, type=9, cpp_type=9, label=1, + default_value=unicode("", "utf-8"), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], # TODO(robinson): Implement. + enum_types=[ + ], + options=None) + + +_STATS = descriptor.Descriptor( + name='Stats', + full_name='pbnetwork.Stats', + filename='protocol.proto', + containing_type=None, + fields=[ + descriptor.FieldDescriptor( + name='res', full_name='pbnetwork.Stats.res', index=0, + number=1, type=5, cpp_type=1, label=2, + default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + descriptor.FieldDescriptor( + name='init_res', full_name='pbnetwork.Stats.init_res', index=1, + number=2, type=5, cpp_type=1, label=2, + default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + descriptor.FieldDescriptor( + name='shared', full_name='pbnetwork.Stats.shared', index=2, + number=3, type=5, cpp_type=1, label=2, + default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + descriptor.FieldDescriptor( + name='id', full_name='pbnetwork.Stats.id', index=3, + number=4, type=9, cpp_type=9, label=2, + default_value=unicode("", "utf-8"), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], # TODO(robinson): Implement. + enum_types=[ + ], + options=None) + + +_FILE = descriptor.Descriptor( + name='File', + full_name='pbnetwork.File', + filename='protocol.proto', + containing_type=None, + fields=[ + descriptor.FieldDescriptor( + name='userName', full_name='pbnetwork.File.userName', index=0, + number=1, type=9, cpp_type=9, label=2, + default_value=unicode("", "utf-8"), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + descriptor.FieldDescriptor( + name='buddyName', full_name='pbnetwork.File.buddyName', index=1, + number=2, type=9, cpp_type=9, label=2, + default_value=unicode("", "utf-8"), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + descriptor.FieldDescriptor( + name='fileName', full_name='pbnetwork.File.fileName', index=2, + number=3, type=9, cpp_type=9, label=2, + default_value=unicode("", "utf-8"), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + descriptor.FieldDescriptor( + name='size', full_name='pbnetwork.File.size', index=3, + number=4, type=5, cpp_type=1, label=2, + default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + descriptor.FieldDescriptor( + name='ftID', full_name='pbnetwork.File.ftID', index=4, + number=5, type=5, cpp_type=1, label=1, + default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], # TODO(robinson): Implement. + enum_types=[ + ], + options=None) + + +_FILETRANSFERDATA = descriptor.Descriptor( + name='FileTransferData', + full_name='pbnetwork.FileTransferData', + filename='protocol.proto', + containing_type=None, + fields=[ + descriptor.FieldDescriptor( + name='ftID', full_name='pbnetwork.FileTransferData.ftID', index=0, + number=1, type=5, cpp_type=1, label=2, + default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + descriptor.FieldDescriptor( + name='data', full_name='pbnetwork.FileTransferData.data', index=1, + number=2, type=12, cpp_type=9, label=2, + default_value="", + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], # TODO(robinson): Implement. + enum_types=[ + ], + options=None) + + +_WRAPPERMESSAGE = descriptor.Descriptor( + name='WrapperMessage', + full_name='pbnetwork.WrapperMessage', + filename='protocol.proto', + containing_type=None, + fields=[ + descriptor.FieldDescriptor( + name='type', full_name='pbnetwork.WrapperMessage.type', index=0, + number=1, type=14, cpp_type=8, label=2, + default_value=1, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + descriptor.FieldDescriptor( + name='payload', full_name='pbnetwork.WrapperMessage.payload', index=1, + number=2, type=12, cpp_type=9, label=1, + default_value="", + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], # TODO(robinson): Implement. + enum_types=[ + _WRAPPERMESSAGE_TYPE, + ], + options=None) + + +_BUDDY.fields_by_name['status'].enum_type = _STATUSTYPE +_PARTICIPANT.fields_by_name['status'].enum_type = _STATUSTYPE +_STATUS.fields_by_name['status'].enum_type = _STATUSTYPE +_WRAPPERMESSAGE.fields_by_name['type'].enum_type = _WRAPPERMESSAGE_TYPE + +class Connected(message.Message): + __metaclass__ = reflection.GeneratedProtocolMessageType + DESCRIPTOR = _CONNECTED + +class Disconnected(message.Message): + __metaclass__ = reflection.GeneratedProtocolMessageType + DESCRIPTOR = _DISCONNECTED + +class Login(message.Message): + __metaclass__ = reflection.GeneratedProtocolMessageType + DESCRIPTOR = _LOGIN + +class Logout(message.Message): + __metaclass__ = reflection.GeneratedProtocolMessageType + DESCRIPTOR = _LOGOUT + +class Buddy(message.Message): + __metaclass__ = reflection.GeneratedProtocolMessageType + DESCRIPTOR = _BUDDY + +class ConversationMessage(message.Message): + __metaclass__ = reflection.GeneratedProtocolMessageType + DESCRIPTOR = _CONVERSATIONMESSAGE + +class Room(message.Message): + __metaclass__ = reflection.GeneratedProtocolMessageType + DESCRIPTOR = _ROOM + +class Participant(message.Message): + __metaclass__ = reflection.GeneratedProtocolMessageType + DESCRIPTOR = _PARTICIPANT + +class VCard(message.Message): + __metaclass__ = reflection.GeneratedProtocolMessageType + DESCRIPTOR = _VCARD + +class Status(message.Message): + __metaclass__ = reflection.GeneratedProtocolMessageType + DESCRIPTOR = _STATUS + +class Stats(message.Message): + __metaclass__ = reflection.GeneratedProtocolMessageType + DESCRIPTOR = _STATS + +class File(message.Message): + __metaclass__ = reflection.GeneratedProtocolMessageType + DESCRIPTOR = _FILE + +class FileTransferData(message.Message): + __metaclass__ = reflection.GeneratedProtocolMessageType + DESCRIPTOR = _FILETRANSFERDATA + +class WrapperMessage(message.Message): + __metaclass__ = reflection.GeneratedProtocolMessageType + DESCRIPTOR = _WRAPPERMESSAGE + diff --git a/spectrum/src/sample.cfg b/spectrum/src/sample.cfg index 5309a754..5018ae8b 100644 --- a/spectrum/src/sample.cfg +++ b/spectrum/src/sample.cfg @@ -13,9 +13,9 @@ admin_password=test #cert=server.pfx #patch to PKCS#12 certificate #cert_password=test #password to that certificate if any users_per_backend=10 -backend=../..//backends/libpurple/spectrum2_libpurple_backend -#backend=../../backends/template/spectrum2_template_backend -protocol=prpl-gg +#backend=../..//backends/libpurple/spectrum2_libpurple_backend +backend=../../backends/template/template_backend.py +protocol=prpl-jabber #protocol=prpl-msn #protocol=any #protocol=prpl-icq From 99941f0a4c0082f4779c0327953daad4f0bf1146 Mon Sep 17 00:00:00 2001 From: Sarang Bharadwaj Date: Fri, 6 Apr 2012 14:09:14 +0530 Subject: [PATCH 092/143] Removed protocol_pb2.py --- plugin/python/protocol_pb2.py | 929 ---------------------------------- 1 file changed, 929 deletions(-) delete mode 100644 plugin/python/protocol_pb2.py diff --git a/plugin/python/protocol_pb2.py b/plugin/python/protocol_pb2.py deleted file mode 100644 index 1ed6f366..00000000 --- a/plugin/python/protocol_pb2.py +++ /dev/null @@ -1,929 +0,0 @@ -# Generated by the protocol buffer compiler. DO NOT EDIT! - -from google.protobuf import descriptor -from google.protobuf import message -from google.protobuf import reflection -from google.protobuf import service -from google.protobuf import service_reflection -from google.protobuf import descriptor_pb2 -_CONNECTIONERROR = descriptor.EnumDescriptor( - name='ConnectionError', - full_name='pbnetwork.ConnectionError', - filename='ConnectionError', - values=[ - descriptor.EnumValueDescriptor( - name='CONNECTION_ERROR_NETWORK_ERROR', index=0, number=0, - options=None, - type=None), - descriptor.EnumValueDescriptor( - name='CONNECTION_ERROR_INVALID_USERNAME', index=1, number=1, - options=None, - type=None), - descriptor.EnumValueDescriptor( - name='CONNECTION_ERROR_AUTHENTICATION_FAILED', index=2, number=2, - options=None, - type=None), - descriptor.EnumValueDescriptor( - name='CONNECTION_ERROR_AUTHENTICATION_IMPOSSIBLE', index=3, number=3, - options=None, - type=None), - descriptor.EnumValueDescriptor( - name='CONNECTION_ERROR_NO_SSL_SUPPORT', index=4, number=4, - options=None, - type=None), - descriptor.EnumValueDescriptor( - name='CONNECTION_ERROR_ENCRYPTION_ERROR', index=5, number=5, - options=None, - type=None), - descriptor.EnumValueDescriptor( - name='CONNECTION_ERROR_NAME_IN_USE', index=6, number=6, - options=None, - type=None), - descriptor.EnumValueDescriptor( - name='CONNECTION_ERROR_INVALID_SETTINGS', index=7, number=7, - options=None, - type=None), - descriptor.EnumValueDescriptor( - name='CONNECTION_ERROR_CERT_NOT_PROVIDED', index=8, number=8, - options=None, - type=None), - descriptor.EnumValueDescriptor( - name='CONNECTION_ERROR_CERT_UNTRUSTED', index=9, number=9, - options=None, - type=None), - descriptor.EnumValueDescriptor( - name='CONNECTION_ERROR_CERT_EXPIRED', index=10, number=10, - options=None, - type=None), - descriptor.EnumValueDescriptor( - name='CONNECTION_ERROR_CERT_NOT_ACTIVATED', index=11, number=11, - options=None, - type=None), - descriptor.EnumValueDescriptor( - name='CONNECTION_ERROR_CERT_HOSTNAME_MISMATCH', index=12, number=12, - options=None, - type=None), - descriptor.EnumValueDescriptor( - name='CONNECTION_ERROR_CERT_FINGERPRINT_MISMATCH', index=13, number=13, - options=None, - type=None), - descriptor.EnumValueDescriptor( - name='CONNECTION_ERROR_CERT_SELF_SIGNED', index=14, number=14, - options=None, - type=None), - descriptor.EnumValueDescriptor( - name='CONNECTION_ERROR_CERT_OTHER_ERROR', index=15, number=15, - options=None, - type=None), - descriptor.EnumValueDescriptor( - name='CONNECTION_ERROR_OTHER_ERROR', index=16, number=16, - options=None, - type=None), - ], - options=None, -) - - -_STATUSTYPE = descriptor.EnumDescriptor( - name='StatusType', - full_name='pbnetwork.StatusType', - filename='StatusType', - values=[ - descriptor.EnumValueDescriptor( - name='STATUS_ONLINE', index=0, number=0, - options=None, - type=None), - descriptor.EnumValueDescriptor( - name='STATUS_AWAY', index=1, number=1, - options=None, - type=None), - descriptor.EnumValueDescriptor( - name='STATUS_FFC', index=2, number=2, - options=None, - type=None), - descriptor.EnumValueDescriptor( - name='STATUS_XA', index=3, number=3, - options=None, - type=None), - descriptor.EnumValueDescriptor( - name='STATUS_DND', index=4, number=4, - options=None, - type=None), - descriptor.EnumValueDescriptor( - name='STATUS_NONE', index=5, number=5, - options=None, - type=None), - descriptor.EnumValueDescriptor( - name='STATUS_INVISIBLE', index=6, number=6, - options=None, - type=None), - ], - options=None, -) - - -CONNECTION_ERROR_NETWORK_ERROR = 0 -CONNECTION_ERROR_INVALID_USERNAME = 1 -CONNECTION_ERROR_AUTHENTICATION_FAILED = 2 -CONNECTION_ERROR_AUTHENTICATION_IMPOSSIBLE = 3 -CONNECTION_ERROR_NO_SSL_SUPPORT = 4 -CONNECTION_ERROR_ENCRYPTION_ERROR = 5 -CONNECTION_ERROR_NAME_IN_USE = 6 -CONNECTION_ERROR_INVALID_SETTINGS = 7 -CONNECTION_ERROR_CERT_NOT_PROVIDED = 8 -CONNECTION_ERROR_CERT_UNTRUSTED = 9 -CONNECTION_ERROR_CERT_EXPIRED = 10 -CONNECTION_ERROR_CERT_NOT_ACTIVATED = 11 -CONNECTION_ERROR_CERT_HOSTNAME_MISMATCH = 12 -CONNECTION_ERROR_CERT_FINGERPRINT_MISMATCH = 13 -CONNECTION_ERROR_CERT_SELF_SIGNED = 14 -CONNECTION_ERROR_CERT_OTHER_ERROR = 15 -CONNECTION_ERROR_OTHER_ERROR = 16 -STATUS_ONLINE = 0 -STATUS_AWAY = 1 -STATUS_FFC = 2 -STATUS_XA = 3 -STATUS_DND = 4 -STATUS_NONE = 5 -STATUS_INVISIBLE = 6 - - -_WRAPPERMESSAGE_TYPE = descriptor.EnumDescriptor( - name='Type', - full_name='pbnetwork.WrapperMessage.Type', - filename='Type', - values=[ - descriptor.EnumValueDescriptor( - name='TYPE_CONNECTED', index=0, number=1, - options=None, - type=None), - descriptor.EnumValueDescriptor( - name='TYPE_DISCONNECTED', index=1, number=2, - options=None, - type=None), - descriptor.EnumValueDescriptor( - name='TYPE_LOGIN', index=2, number=3, - options=None, - type=None), - descriptor.EnumValueDescriptor( - name='TYPE_LOGOUT', index=3, number=4, - options=None, - type=None), - descriptor.EnumValueDescriptor( - name='TYPE_BUDDY_CHANGED', index=4, number=6, - options=None, - type=None), - descriptor.EnumValueDescriptor( - name='TYPE_BUDDY_REMOVED', index=5, number=7, - options=None, - type=None), - descriptor.EnumValueDescriptor( - name='TYPE_CONV_MESSAGE', index=6, number=8, - options=None, - type=None), - descriptor.EnumValueDescriptor( - name='TYPE_PING', index=7, number=9, - options=None, - type=None), - descriptor.EnumValueDescriptor( - name='TYPE_PONG', index=8, number=10, - options=None, - type=None), - descriptor.EnumValueDescriptor( - name='TYPE_JOIN_ROOM', index=9, number=11, - options=None, - type=None), - descriptor.EnumValueDescriptor( - name='TYPE_LEAVE_ROOM', index=10, number=12, - options=None, - type=None), - descriptor.EnumValueDescriptor( - name='TYPE_PARTICIPANT_CHANGED', index=11, number=13, - options=None, - type=None), - descriptor.EnumValueDescriptor( - name='TYPE_ROOM_NICKNAME_CHANGED', index=12, number=14, - options=None, - type=None), - descriptor.EnumValueDescriptor( - name='TYPE_ROOM_SUBJECT_CHANGED', index=13, number=15, - options=None, - type=None), - descriptor.EnumValueDescriptor( - name='TYPE_VCARD', index=14, number=16, - options=None, - type=None), - descriptor.EnumValueDescriptor( - name='TYPE_STATUS_CHANGED', index=15, number=17, - options=None, - type=None), - descriptor.EnumValueDescriptor( - name='TYPE_BUDDY_TYPING', index=16, number=18, - options=None, - type=None), - descriptor.EnumValueDescriptor( - name='TYPE_BUDDY_STOPPED_TYPING', index=17, number=19, - options=None, - type=None), - descriptor.EnumValueDescriptor( - name='TYPE_BUDDY_TYPED', index=18, number=20, - options=None, - type=None), - descriptor.EnumValueDescriptor( - name='TYPE_AUTH_REQUEST', index=19, number=21, - options=None, - type=None), - descriptor.EnumValueDescriptor( - name='TYPE_ATTENTION', index=20, number=22, - options=None, - type=None), - descriptor.EnumValueDescriptor( - name='TYPE_STATS', index=21, number=23, - options=None, - type=None), - descriptor.EnumValueDescriptor( - name='TYPE_FT_START', index=22, number=24, - options=None, - type=None), - descriptor.EnumValueDescriptor( - name='TYPE_FT_FINISH', index=23, number=25, - options=None, - type=None), - descriptor.EnumValueDescriptor( - name='TYPE_FT_DATA', index=24, number=26, - options=None, - type=None), - descriptor.EnumValueDescriptor( - name='TYPE_FT_PAUSE', index=25, number=27, - options=None, - type=None), - descriptor.EnumValueDescriptor( - name='TYPE_FT_CONTINUE', index=26, number=28, - options=None, - type=None), - descriptor.EnumValueDescriptor( - name='TYPE_EXIT', index=27, number=29, - options=None, - type=None), - ], - options=None, -) - - -_CONNECTED = descriptor.Descriptor( - name='Connected', - full_name='pbnetwork.Connected', - filename='protocol.proto', - containing_type=None, - fields=[ - descriptor.FieldDescriptor( - name='user', full_name='pbnetwork.Connected.user', index=0, - number=1, type=9, cpp_type=9, label=2, - default_value=unicode("", "utf-8"), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - ], - extensions=[ - ], - nested_types=[], # TODO(robinson): Implement. - enum_types=[ - ], - options=None) - - -_DISCONNECTED = descriptor.Descriptor( - name='Disconnected', - full_name='pbnetwork.Disconnected', - filename='protocol.proto', - containing_type=None, - fields=[ - descriptor.FieldDescriptor( - name='user', full_name='pbnetwork.Disconnected.user', index=0, - number=1, type=9, cpp_type=9, label=2, - default_value=unicode("", "utf-8"), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - descriptor.FieldDescriptor( - name='error', full_name='pbnetwork.Disconnected.error', index=1, - number=2, type=5, cpp_type=1, label=2, - default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - descriptor.FieldDescriptor( - name='message', full_name='pbnetwork.Disconnected.message', index=2, - number=3, type=9, cpp_type=9, label=1, - default_value=unicode("", "utf-8"), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - ], - extensions=[ - ], - nested_types=[], # TODO(robinson): Implement. - enum_types=[ - ], - options=None) - - -_LOGIN = descriptor.Descriptor( - name='Login', - full_name='pbnetwork.Login', - filename='protocol.proto', - containing_type=None, - fields=[ - descriptor.FieldDescriptor( - name='user', full_name='pbnetwork.Login.user', index=0, - number=1, type=9, cpp_type=9, label=2, - default_value=unicode("", "utf-8"), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - descriptor.FieldDescriptor( - name='legacyName', full_name='pbnetwork.Login.legacyName', index=1, - number=2, type=9, cpp_type=9, label=2, - default_value=unicode("", "utf-8"), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - descriptor.FieldDescriptor( - name='password', full_name='pbnetwork.Login.password', index=2, - number=3, type=9, cpp_type=9, label=2, - default_value=unicode("", "utf-8"), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - ], - extensions=[ - ], - nested_types=[], # TODO(robinson): Implement. - enum_types=[ - ], - options=None) - - -_LOGOUT = descriptor.Descriptor( - name='Logout', - full_name='pbnetwork.Logout', - filename='protocol.proto', - containing_type=None, - fields=[ - descriptor.FieldDescriptor( - name='user', full_name='pbnetwork.Logout.user', index=0, - number=1, type=9, cpp_type=9, label=2, - default_value=unicode("", "utf-8"), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - descriptor.FieldDescriptor( - name='legacyName', full_name='pbnetwork.Logout.legacyName', index=1, - number=2, type=9, cpp_type=9, label=2, - default_value=unicode("", "utf-8"), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - ], - extensions=[ - ], - nested_types=[], # TODO(robinson): Implement. - enum_types=[ - ], - options=None) - - -_BUDDY = descriptor.Descriptor( - name='Buddy', - full_name='pbnetwork.Buddy', - filename='protocol.proto', - containing_type=None, - fields=[ - descriptor.FieldDescriptor( - name='userName', full_name='pbnetwork.Buddy.userName', index=0, - number=1, type=9, cpp_type=9, label=2, - default_value=unicode("", "utf-8"), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - descriptor.FieldDescriptor( - name='buddyName', full_name='pbnetwork.Buddy.buddyName', index=1, - number=2, type=9, cpp_type=9, label=2, - default_value=unicode("", "utf-8"), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - descriptor.FieldDescriptor( - name='alias', full_name='pbnetwork.Buddy.alias', index=2, - number=3, type=9, cpp_type=9, label=1, - default_value=unicode("", "utf-8"), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - descriptor.FieldDescriptor( - name='group', full_name='pbnetwork.Buddy.group', index=3, - number=4, type=9, cpp_type=9, label=3, - default_value=[], - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - descriptor.FieldDescriptor( - name='status', full_name='pbnetwork.Buddy.status', index=4, - number=5, type=14, cpp_type=8, label=1, - default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - descriptor.FieldDescriptor( - name='statusMessage', full_name='pbnetwork.Buddy.statusMessage', index=5, - number=6, type=9, cpp_type=9, label=1, - default_value=unicode("", "utf-8"), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - descriptor.FieldDescriptor( - name='iconHash', full_name='pbnetwork.Buddy.iconHash', index=6, - number=7, type=9, cpp_type=9, label=1, - default_value=unicode("", "utf-8"), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - descriptor.FieldDescriptor( - name='blocked', full_name='pbnetwork.Buddy.blocked', index=7, - number=8, type=8, cpp_type=7, label=1, - default_value=False, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - ], - extensions=[ - ], - nested_types=[], # TODO(robinson): Implement. - enum_types=[ - ], - options=None) - - -_CONVERSATIONMESSAGE = descriptor.Descriptor( - name='ConversationMessage', - full_name='pbnetwork.ConversationMessage', - filename='protocol.proto', - containing_type=None, - fields=[ - descriptor.FieldDescriptor( - name='userName', full_name='pbnetwork.ConversationMessage.userName', index=0, - number=1, type=9, cpp_type=9, label=2, - default_value=unicode("", "utf-8"), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - descriptor.FieldDescriptor( - name='buddyName', full_name='pbnetwork.ConversationMessage.buddyName', index=1, - number=2, type=9, cpp_type=9, label=2, - default_value=unicode("", "utf-8"), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - descriptor.FieldDescriptor( - name='message', full_name='pbnetwork.ConversationMessage.message', index=2, - number=3, type=9, cpp_type=9, label=2, - default_value=unicode("", "utf-8"), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - descriptor.FieldDescriptor( - name='nickname', full_name='pbnetwork.ConversationMessage.nickname', index=3, - number=4, type=9, cpp_type=9, label=1, - default_value=unicode("", "utf-8"), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - descriptor.FieldDescriptor( - name='xhtml', full_name='pbnetwork.ConversationMessage.xhtml', index=4, - number=5, type=9, cpp_type=9, label=1, - default_value=unicode("", "utf-8"), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - ], - extensions=[ - ], - nested_types=[], # TODO(robinson): Implement. - enum_types=[ - ], - options=None) - - -_ROOM = descriptor.Descriptor( - name='Room', - full_name='pbnetwork.Room', - filename='protocol.proto', - containing_type=None, - fields=[ - descriptor.FieldDescriptor( - name='userName', full_name='pbnetwork.Room.userName', index=0, - number=1, type=9, cpp_type=9, label=2, - default_value=unicode("", "utf-8"), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - descriptor.FieldDescriptor( - name='nickname', full_name='pbnetwork.Room.nickname', index=1, - number=2, type=9, cpp_type=9, label=2, - default_value=unicode("", "utf-8"), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - descriptor.FieldDescriptor( - name='room', full_name='pbnetwork.Room.room', index=2, - number=3, type=9, cpp_type=9, label=2, - default_value=unicode("", "utf-8"), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - descriptor.FieldDescriptor( - name='password', full_name='pbnetwork.Room.password', index=3, - number=4, type=9, cpp_type=9, label=1, - default_value=unicode("", "utf-8"), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - ], - extensions=[ - ], - nested_types=[], # TODO(robinson): Implement. - enum_types=[ - ], - options=None) - - -_PARTICIPANT = descriptor.Descriptor( - name='Participant', - full_name='pbnetwork.Participant', - filename='protocol.proto', - containing_type=None, - fields=[ - descriptor.FieldDescriptor( - name='userName', full_name='pbnetwork.Participant.userName', index=0, - number=1, type=9, cpp_type=9, label=2, - default_value=unicode("", "utf-8"), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - descriptor.FieldDescriptor( - name='room', full_name='pbnetwork.Participant.room', index=1, - number=2, type=9, cpp_type=9, label=2, - default_value=unicode("", "utf-8"), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - descriptor.FieldDescriptor( - name='nickname', full_name='pbnetwork.Participant.nickname', index=2, - number=3, type=9, cpp_type=9, label=2, - default_value=unicode("", "utf-8"), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - descriptor.FieldDescriptor( - name='flag', full_name='pbnetwork.Participant.flag', index=3, - number=4, type=5, cpp_type=1, label=2, - default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - descriptor.FieldDescriptor( - name='status', full_name='pbnetwork.Participant.status', index=4, - number=5, type=14, cpp_type=8, label=2, - default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - descriptor.FieldDescriptor( - name='statusMessage', full_name='pbnetwork.Participant.statusMessage', index=5, - number=6, type=9, cpp_type=9, label=1, - default_value=unicode("", "utf-8"), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - descriptor.FieldDescriptor( - name='newname', full_name='pbnetwork.Participant.newname', index=6, - number=7, type=9, cpp_type=9, label=1, - default_value=unicode("", "utf-8"), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - ], - extensions=[ - ], - nested_types=[], # TODO(robinson): Implement. - enum_types=[ - ], - options=None) - - -_VCARD = descriptor.Descriptor( - name='VCard', - full_name='pbnetwork.VCard', - filename='protocol.proto', - containing_type=None, - fields=[ - descriptor.FieldDescriptor( - name='userName', full_name='pbnetwork.VCard.userName', index=0, - number=1, type=9, cpp_type=9, label=2, - default_value=unicode("", "utf-8"), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - descriptor.FieldDescriptor( - name='buddyName', full_name='pbnetwork.VCard.buddyName', index=1, - number=2, type=9, cpp_type=9, label=2, - default_value=unicode("", "utf-8"), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - descriptor.FieldDescriptor( - name='id', full_name='pbnetwork.VCard.id', index=2, - number=3, type=5, cpp_type=1, label=2, - default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - descriptor.FieldDescriptor( - name='fullname', full_name='pbnetwork.VCard.fullname', index=3, - number=4, type=9, cpp_type=9, label=1, - default_value=unicode("", "utf-8"), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - descriptor.FieldDescriptor( - name='nickname', full_name='pbnetwork.VCard.nickname', index=4, - number=5, type=9, cpp_type=9, label=1, - default_value=unicode("", "utf-8"), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - descriptor.FieldDescriptor( - name='photo', full_name='pbnetwork.VCard.photo', index=5, - number=6, type=12, cpp_type=9, label=1, - default_value="", - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - ], - extensions=[ - ], - nested_types=[], # TODO(robinson): Implement. - enum_types=[ - ], - options=None) - - -_STATUS = descriptor.Descriptor( - name='Status', - full_name='pbnetwork.Status', - filename='protocol.proto', - containing_type=None, - fields=[ - descriptor.FieldDescriptor( - name='userName', full_name='pbnetwork.Status.userName', index=0, - number=1, type=9, cpp_type=9, label=2, - default_value=unicode("", "utf-8"), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - descriptor.FieldDescriptor( - name='status', full_name='pbnetwork.Status.status', index=1, - number=3, type=14, cpp_type=8, label=2, - default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - descriptor.FieldDescriptor( - name='statusMessage', full_name='pbnetwork.Status.statusMessage', index=2, - number=4, type=9, cpp_type=9, label=1, - default_value=unicode("", "utf-8"), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - ], - extensions=[ - ], - nested_types=[], # TODO(robinson): Implement. - enum_types=[ - ], - options=None) - - -_STATS = descriptor.Descriptor( - name='Stats', - full_name='pbnetwork.Stats', - filename='protocol.proto', - containing_type=None, - fields=[ - descriptor.FieldDescriptor( - name='res', full_name='pbnetwork.Stats.res', index=0, - number=1, type=5, cpp_type=1, label=2, - default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - descriptor.FieldDescriptor( - name='init_res', full_name='pbnetwork.Stats.init_res', index=1, - number=2, type=5, cpp_type=1, label=2, - default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - descriptor.FieldDescriptor( - name='shared', full_name='pbnetwork.Stats.shared', index=2, - number=3, type=5, cpp_type=1, label=2, - default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - descriptor.FieldDescriptor( - name='id', full_name='pbnetwork.Stats.id', index=3, - number=4, type=9, cpp_type=9, label=2, - default_value=unicode("", "utf-8"), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - ], - extensions=[ - ], - nested_types=[], # TODO(robinson): Implement. - enum_types=[ - ], - options=None) - - -_FILE = descriptor.Descriptor( - name='File', - full_name='pbnetwork.File', - filename='protocol.proto', - containing_type=None, - fields=[ - descriptor.FieldDescriptor( - name='userName', full_name='pbnetwork.File.userName', index=0, - number=1, type=9, cpp_type=9, label=2, - default_value=unicode("", "utf-8"), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - descriptor.FieldDescriptor( - name='buddyName', full_name='pbnetwork.File.buddyName', index=1, - number=2, type=9, cpp_type=9, label=2, - default_value=unicode("", "utf-8"), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - descriptor.FieldDescriptor( - name='fileName', full_name='pbnetwork.File.fileName', index=2, - number=3, type=9, cpp_type=9, label=2, - default_value=unicode("", "utf-8"), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - descriptor.FieldDescriptor( - name='size', full_name='pbnetwork.File.size', index=3, - number=4, type=5, cpp_type=1, label=2, - default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - descriptor.FieldDescriptor( - name='ftID', full_name='pbnetwork.File.ftID', index=4, - number=5, type=5, cpp_type=1, label=1, - default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - ], - extensions=[ - ], - nested_types=[], # TODO(robinson): Implement. - enum_types=[ - ], - options=None) - - -_FILETRANSFERDATA = descriptor.Descriptor( - name='FileTransferData', - full_name='pbnetwork.FileTransferData', - filename='protocol.proto', - containing_type=None, - fields=[ - descriptor.FieldDescriptor( - name='ftID', full_name='pbnetwork.FileTransferData.ftID', index=0, - number=1, type=5, cpp_type=1, label=2, - default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - descriptor.FieldDescriptor( - name='data', full_name='pbnetwork.FileTransferData.data', index=1, - number=2, type=12, cpp_type=9, label=2, - default_value="", - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - ], - extensions=[ - ], - nested_types=[], # TODO(robinson): Implement. - enum_types=[ - ], - options=None) - - -_WRAPPERMESSAGE = descriptor.Descriptor( - name='WrapperMessage', - full_name='pbnetwork.WrapperMessage', - filename='protocol.proto', - containing_type=None, - fields=[ - descriptor.FieldDescriptor( - name='type', full_name='pbnetwork.WrapperMessage.type', index=0, - number=1, type=14, cpp_type=8, label=2, - default_value=1, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - descriptor.FieldDescriptor( - name='payload', full_name='pbnetwork.WrapperMessage.payload', index=1, - number=2, type=12, cpp_type=9, label=1, - default_value="", - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - ], - extensions=[ - ], - nested_types=[], # TODO(robinson): Implement. - enum_types=[ - _WRAPPERMESSAGE_TYPE, - ], - options=None) - - -_BUDDY.fields_by_name['status'].enum_type = _STATUSTYPE -_PARTICIPANT.fields_by_name['status'].enum_type = _STATUSTYPE -_STATUS.fields_by_name['status'].enum_type = _STATUSTYPE -_WRAPPERMESSAGE.fields_by_name['type'].enum_type = _WRAPPERMESSAGE_TYPE - -class Connected(message.Message): - __metaclass__ = reflection.GeneratedProtocolMessageType - DESCRIPTOR = _CONNECTED - -class Disconnected(message.Message): - __metaclass__ = reflection.GeneratedProtocolMessageType - DESCRIPTOR = _DISCONNECTED - -class Login(message.Message): - __metaclass__ = reflection.GeneratedProtocolMessageType - DESCRIPTOR = _LOGIN - -class Logout(message.Message): - __metaclass__ = reflection.GeneratedProtocolMessageType - DESCRIPTOR = _LOGOUT - -class Buddy(message.Message): - __metaclass__ = reflection.GeneratedProtocolMessageType - DESCRIPTOR = _BUDDY - -class ConversationMessage(message.Message): - __metaclass__ = reflection.GeneratedProtocolMessageType - DESCRIPTOR = _CONVERSATIONMESSAGE - -class Room(message.Message): - __metaclass__ = reflection.GeneratedProtocolMessageType - DESCRIPTOR = _ROOM - -class Participant(message.Message): - __metaclass__ = reflection.GeneratedProtocolMessageType - DESCRIPTOR = _PARTICIPANT - -class VCard(message.Message): - __metaclass__ = reflection.GeneratedProtocolMessageType - DESCRIPTOR = _VCARD - -class Status(message.Message): - __metaclass__ = reflection.GeneratedProtocolMessageType - DESCRIPTOR = _STATUS - -class Stats(message.Message): - __metaclass__ = reflection.GeneratedProtocolMessageType - DESCRIPTOR = _STATS - -class File(message.Message): - __metaclass__ = reflection.GeneratedProtocolMessageType - DESCRIPTOR = _FILE - -class FileTransferData(message.Message): - __metaclass__ = reflection.GeneratedProtocolMessageType - DESCRIPTOR = _FILETRANSFERDATA - -class WrapperMessage(message.Message): - __metaclass__ = reflection.GeneratedProtocolMessageType - DESCRIPTOR = _WRAPPERMESSAGE - From 9e6da7ea85a977444b0666a7d85e30f6b18016ca Mon Sep 17 00:00:00 2001 From: HanzZ Date: Sun, 8 Apr 2012 11:40:22 +0200 Subject: [PATCH 093/143] Removed Doxyfile --- docs/Doxyfile | 1510 ------------------------------------------------- 1 file changed, 1510 deletions(-) delete mode 100644 docs/Doxyfile diff --git a/docs/Doxyfile b/docs/Doxyfile deleted file mode 100644 index d5fe6463..00000000 --- a/docs/Doxyfile +++ /dev/null @@ -1,1510 +0,0 @@ -# Doxyfile 1.5.8 - -# This file describes the settings to be used by the documentation system -# doxygen (www.doxygen.org) for a project -# -# All text after a hash (#) is considered a comment and will be ignored -# The format is: -# TAG = value [value, ...] -# For lists items can also be appended using: -# TAG += value [value, ...] -# Values that contain spaces should be placed between quotes (" ") - -#--------------------------------------------------------------------------- -# Project related configuration options -#--------------------------------------------------------------------------- - -# This tag specifies the encoding used for all characters in the config file -# that follow. The default is UTF-8 which is also the encoding used for all -# text before the first occurrence of this tag. Doxygen uses libiconv (or the -# iconv built into libc) for the transcoding. See -# http://www.gnu.org/software/libiconv for the list of possible encodings. - -DOXYFILE_ENCODING = UTF-8 - -# The PROJECT_NAME tag is a single word (or a sequence of words surrounded -# by quotes) that should identify the project. - -PROJECT_NAME = "libtransport" - -# The PROJECT_NUMBER tag can be used to enter a project or revision number. -# This could be handy for archiving the generated documentation or -# if some version control system is used. - -PROJECT_NUMBER = "2.0" - -# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) -# base path where the generated documentation will be put. -# If a relative path is entered, it will be relative to the location -# where doxygen was started. If left blank the current directory will be used. - -OUTPUT_DIRECTORY = /home/sarang/dev/libtransport/docs/../docs/html - -# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create -# 4096 sub-directories (in 2 levels) under the output directory of each output -# format and will distribute the generated files over these directories. -# Enabling this option can be useful when feeding doxygen a huge amount of -# source files, where putting all generated files in the same directory would -# otherwise cause performance problems for the file system. - -CREATE_SUBDIRS = NO - -# The OUTPUT_LANGUAGE tag is used to specify the language in which all -# documentation generated by doxygen is written. Doxygen will use this -# information to generate all constant output in the proper language. -# The default language is English, other supported languages are: -# Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional, -# Croatian, Czech, Danish, Dutch, Farsi, Finnish, French, German, Greek, -# Hungarian, Italian, Japanese, Japanese-en (Japanese with English messages), -# Korean, Korean-en, Lithuanian, Norwegian, Macedonian, Persian, Polish, -# Portuguese, Romanian, Russian, Serbian, Serbian-Cyrilic, Slovak, Slovene, -# Spanish, Swedish, and Ukrainian. - -OUTPUT_LANGUAGE = English - -# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will -# include brief member descriptions after the members that are listed in -# the file and class documentation (similar to JavaDoc). -# Set to NO to disable this. - -BRIEF_MEMBER_DESC = YES - -# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend -# the brief description of a member or function before the detailed description. -# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the -# brief descriptions will be completely suppressed. - -REPEAT_BRIEF = YES - -# This tag implements a quasi-intelligent brief description abbreviator -# that is used to form the text in various listings. Each string -# in this list, if found as the leading text of the brief description, will be -# stripped from the text and the result after processing the whole list, is -# used as the annotated text. Otherwise, the brief description is used as-is. -# If left blank, the following values are used ("$name" is automatically -# replaced with the name of the entity): "The $name class" "The $name widget" -# "The $name file" "is" "provides" "specifies" "contains" -# "represents" "a" "an" "the" - -ABBREVIATE_BRIEF = - -# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then -# Doxygen will generate a detailed section even if there is only a brief -# description. - -ALWAYS_DETAILED_SEC = NO - -# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all -# inherited members of a class in the documentation of that class as if those -# members were ordinary class members. Constructors, destructors and assignment -# operators of the base classes will not be shown. - -INLINE_INHERITED_MEMB = NO - -# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full -# path before files name in the file list and in the header files. If set -# to NO the shortest path that makes the file name unique will be used. - -FULL_PATH_NAMES = NO - -# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag -# can be used to strip a user-defined part of the path. Stripping is -# only done if one of the specified strings matches the left-hand part of -# the path. The tag can be used to show relative paths in the file list. -# If left blank the directory from which doxygen is run is used as the -# path to strip. - -STRIP_FROM_PATH = - -# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of -# the path mentioned in the documentation of a class, which tells -# the reader which header file to include in order to use a class. -# If left blank only the name of the header file containing the class -# definition is used. Otherwise one should specify the include paths that -# are normally passed to the compiler using the -I flag. - -STRIP_FROM_INC_PATH = - -# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter -# (but less readable) file names. This can be useful is your file systems -# doesn't support long names like on DOS, Mac, or CD-ROM. - -SHORT_NAMES = NO - -# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen -# will interpret the first line (until the first dot) of a JavaDoc-style -# comment as the brief description. If set to NO, the JavaDoc -# comments will behave just like regular Qt-style comments -# (thus requiring an explicit @brief command for a brief description.) - -JAVADOC_AUTOBRIEF = NO - -# If the QT_AUTOBRIEF tag is set to YES then Doxygen will -# interpret the first line (until the first dot) of a Qt-style -# comment as the brief description. If set to NO, the comments -# will behave just like regular Qt-style comments (thus requiring -# an explicit \brief command for a brief description.) - -QT_AUTOBRIEF = NO - -# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen -# treat a multi-line C++ special comment block (i.e. a block of //! or /// -# comments) as a brief description. This used to be the default behaviour. -# The new default is to treat a multi-line C++ comment block as a detailed -# description. Set this tag to YES if you prefer the old behaviour instead. - -MULTILINE_CPP_IS_BRIEF = NO - -# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented -# member inherits the documentation from any documented member that it -# re-implements. - -INHERIT_DOCS = YES - -# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce -# a new page for each member. If set to NO, the documentation of a member will -# be part of the file/class/namespace that contains it. - -SEPARATE_MEMBER_PAGES = NO - -# The TAB_SIZE tag can be used to set the number of spaces in a tab. -# Doxygen uses this value to replace tabs by spaces in code fragments. - -TAB_SIZE = 8 - -# This tag can be used to specify a number of aliases that acts -# as commands in the documentation. An alias has the form "name=value". -# For example adding "sideeffect=\par Side Effects:\n" will allow you to -# put the command \sideeffect (or @sideeffect) in the documentation, which -# will result in a user-defined paragraph with heading "Side Effects:". -# You can put \n's in the value part of an alias to insert newlines. - -ALIASES = - -# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C -# sources only. Doxygen will then generate output that is more tailored for C. -# For instance, some of the names that are used will be different. The list -# of all members will be omitted, etc. - -OPTIMIZE_OUTPUT_FOR_C = NO - -# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java -# sources only. Doxygen will then generate output that is more tailored for -# Java. For instance, namespaces will be presented as packages, qualified -# scopes will look different, etc. - -OPTIMIZE_OUTPUT_JAVA = NO - -# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran -# sources only. Doxygen will then generate output that is more tailored for -# Fortran. - -OPTIMIZE_FOR_FORTRAN = NO - -# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL -# sources. Doxygen will then generate output that is tailored for -# VHDL. - -OPTIMIZE_OUTPUT_VHDL = NO - -# Doxygen selects the parser to use depending on the extension of the files it parses. -# With this tag you can assign which parser to use for a given extension. -# Doxygen has a built-in mapping, but you can override or extend it using this tag. -# The format is ext=language, where ext is a file extension, and language is one of -# the parsers supported by doxygen: IDL, Java, Javascript, C#, C, C++, D, PHP, -# Objective-C, Python, Fortran, VHDL, C, C++. For instance to make doxygen treat -# .inc files as Fortran files (default is PHP), and .f files as C (default is Fortran), -# use: inc=Fortran f=C - -EXTENSION_MAPPING = - -# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want -# to include (a tag file for) the STL sources as input, then you should -# set this tag to YES in order to let doxygen match functions declarations and -# definitions whose arguments contain STL classes (e.g. func(std::string); v.s. -# func(std::string) {}). This also make the inheritance and collaboration -# diagrams that involve STL classes more complete and accurate. - -BUILTIN_STL_SUPPORT = NO - -# If you use Microsoft's C++/CLI language, you should set this option to YES to -# enable parsing support. - -CPP_CLI_SUPPORT = NO - -# Set the SIP_SUPPORT tag to YES if your project consists of sip sources only. -# Doxygen will parse them like normal C++ but will assume all classes use public -# instead of private inheritance when no explicit protection keyword is present. - -SIP_SUPPORT = NO - -# For Microsoft's IDL there are propget and propput attributes to indicate getter -# and setter methods for a property. Setting this option to YES (the default) -# will make doxygen to replace the get and set methods by a property in the -# documentation. This will only work if the methods are indeed getting or -# setting a simple type. If this is not the case, or you want to show the -# methods anyway, you should set this option to NO. - -IDL_PROPERTY_SUPPORT = YES - -# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC -# tag is set to YES, then doxygen will reuse the documentation of the first -# member in the group (if any) for the other members of the group. By default -# all members of a group must be documented explicitly. - -DISTRIBUTE_GROUP_DOC = NO - -# Set the SUBGROUPING tag to YES (the default) to allow class member groups of -# the same type (for instance a group of public functions) to be put as a -# subgroup of that type (e.g. under the Public Functions section). Set it to -# NO to prevent subgrouping. Alternatively, this can be done per class using -# the \nosubgrouping command. - -SUBGROUPING = YES - -# When TYPEDEF_HIDES_STRUCT is enabled, a typedef of a struct, union, or enum -# is documented as struct, union, or enum with the name of the typedef. So -# typedef struct TypeS {} TypeT, will appear in the documentation as a struct -# with name TypeT. When disabled the typedef will appear as a member of a file, -# namespace, or class. And the struct will be named TypeS. This can typically -# be useful for C code in case the coding convention dictates that all compound -# types are typedef'ed and only the typedef is referenced, never the tag name. - -TYPEDEF_HIDES_STRUCT = NO - -# The SYMBOL_CACHE_SIZE determines the size of the internal cache use to -# determine which symbols to keep in memory and which to flush to disk. -# When the cache is full, less often used symbols will be written to disk. -# For small to medium size projects (<1000 input files) the default value is -# probably good enough. For larger projects a too small cache size can cause -# doxygen to be busy swapping symbols to and from disk most of the time -# causing a significant performance penality. -# If the system has enough physical memory increasing the cache will improve the -# performance by keeping more symbols in memory. Note that the value works on -# a logarithmic scale so increasing the size by one will rougly double the -# memory usage. The cache size is given by this formula: -# 2^(16+SYMBOL_CACHE_SIZE). The valid range is 0..9, the default is 0, -# corresponding to a cache size of 2^16 = 65536 symbols - -SYMBOL_CACHE_SIZE = 0 - -#--------------------------------------------------------------------------- -# Build related configuration options -#--------------------------------------------------------------------------- - -# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in -# documentation are documented, even if no documentation was available. -# Private class members and static file members will be hidden unless -# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES - -EXTRACT_ALL = NO - -# If the EXTRACT_PRIVATE tag is set to YES all private members of a class -# will be included in the documentation. - -EXTRACT_PRIVATE = NO - -# If the EXTRACT_STATIC tag is set to YES all static members of a file -# will be included in the documentation. - -EXTRACT_STATIC = NO - -# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) -# defined locally in source files will be included in the documentation. -# If set to NO only classes defined in header files are included. - -EXTRACT_LOCAL_CLASSES = YES - -# This flag is only useful for Objective-C code. When set to YES local -# methods, which are defined in the implementation section but not in -# the interface are included in the documentation. -# If set to NO (the default) only methods in the interface are included. - -EXTRACT_LOCAL_METHODS = NO - -# If this flag is set to YES, the members of anonymous namespaces will be -# extracted and appear in the documentation as a namespace called -# 'anonymous_namespace{file}', where file will be replaced with the base -# name of the file that contains the anonymous namespace. By default -# anonymous namespace are hidden. - -EXTRACT_ANON_NSPACES = NO - -# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all -# undocumented members of documented classes, files or namespaces. -# If set to NO (the default) these members will be included in the -# various overviews, but no documentation section is generated. -# This option has no effect if EXTRACT_ALL is enabled. - -HIDE_UNDOC_MEMBERS = NO - -# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all -# undocumented classes that are normally visible in the class hierarchy. -# If set to NO (the default) these classes will be included in the various -# overviews. This option has no effect if EXTRACT_ALL is enabled. - -HIDE_UNDOC_CLASSES = NO - -# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all -# friend (class|struct|union) declarations. -# If set to NO (the default) these declarations will be included in the -# documentation. - -HIDE_FRIEND_COMPOUNDS = NO - -# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any -# documentation blocks found inside the body of a function. -# If set to NO (the default) these blocks will be appended to the -# function's detailed documentation block. - -HIDE_IN_BODY_DOCS = NO - -# The INTERNAL_DOCS tag determines if documentation -# that is typed after a \internal command is included. If the tag is set -# to NO (the default) then the documentation will be excluded. -# Set it to YES to include the internal documentation. - -INTERNAL_DOCS = NO - -# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate -# file names in lower-case letters. If set to YES upper-case letters are also -# allowed. This is useful if you have classes or files whose names only differ -# in case and if your file system supports case sensitive file names. Windows -# and Mac users are advised to set this option to NO. - -CASE_SENSE_NAMES = YES - -# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen -# will show members with their full class and namespace scopes in the -# documentation. If set to YES the scope will be hidden. - -HIDE_SCOPE_NAMES = NO - -# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen -# will put a list of the files that are included by a file in the documentation -# of that file. - -SHOW_INCLUDE_FILES = YES - -# If the INLINE_INFO tag is set to YES (the default) then a tag [inline] -# is inserted in the documentation for inline members. - -INLINE_INFO = YES - -# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen -# will sort the (detailed) documentation of file and class members -# alphabetically by member name. If set to NO the members will appear in -# declaration order. - -SORT_MEMBER_DOCS = YES - -# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the -# brief documentation of file, namespace and class members alphabetically -# by member name. If set to NO (the default) the members will appear in -# declaration order. - -SORT_BRIEF_DOCS = NO - -# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the -# hierarchy of group names into alphabetical order. If set to NO (the default) -# the group names will appear in their defined order. - -SORT_GROUP_NAMES = NO - -# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be -# sorted by fully-qualified names, including namespaces. If set to -# NO (the default), the class list will be sorted only by class name, -# not including the namespace part. -# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. -# Note: This option applies only to the class list, not to the -# alphabetical list. - -SORT_BY_SCOPE_NAME = NO - -# The GENERATE_TODOLIST tag can be used to enable (YES) or -# disable (NO) the todo list. This list is created by putting \todo -# commands in the documentation. - -GENERATE_TODOLIST = YES - -# The GENERATE_TESTLIST tag can be used to enable (YES) or -# disable (NO) the test list. This list is created by putting \test -# commands in the documentation. - -GENERATE_TESTLIST = YES - -# The GENERATE_BUGLIST tag can be used to enable (YES) or -# disable (NO) the bug list. This list is created by putting \bug -# commands in the documentation. - -GENERATE_BUGLIST = YES - -# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or -# disable (NO) the deprecated list. This list is created by putting -# \deprecated commands in the documentation. - -GENERATE_DEPRECATEDLIST= YES - -# The ENABLED_SECTIONS tag can be used to enable conditional -# documentation sections, marked by \if sectionname ... \endif. - -ENABLED_SECTIONS = - -# The MAX_INITIALIZER_LINES tag determines the maximum number of lines -# the initial value of a variable or define consists of for it to appear in -# the documentation. If the initializer consists of more lines than specified -# here it will be hidden. Use a value of 0 to hide initializers completely. -# The appearance of the initializer of individual variables and defines in the -# documentation can be controlled using \showinitializer or \hideinitializer -# command in the documentation regardless of this setting. - -MAX_INITIALIZER_LINES = 30 - -# Set the SHOW_USED_FILES tag to NO to disable the list of files generated -# at the bottom of the documentation of classes and structs. If set to YES the -# list will mention the files that were used to generate the documentation. - -SHOW_USED_FILES = YES - -# If the sources in your project are distributed over multiple directories -# then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy -# in the documentation. The default is NO. - -SHOW_DIRECTORIES = NO - -# Set the SHOW_FILES tag to NO to disable the generation of the Files page. -# This will remove the Files entry from the Quick Index and from the -# Folder Tree View (if specified). The default is YES. - -SHOW_FILES = YES - -# Set the SHOW_NAMESPACES tag to NO to disable the generation of the -# Namespaces page. -# This will remove the Namespaces entry from the Quick Index -# and from the Folder Tree View (if specified). The default is YES. - -SHOW_NAMESPACES = YES - -# The FILE_VERSION_FILTER tag can be used to specify a program or script that -# doxygen should invoke to get the current version for each file (typically from -# the version control system). Doxygen will invoke the program by executing (via -# popen()) the command , where is the value of -# the FILE_VERSION_FILTER tag, and is the name of an input file -# provided by doxygen. Whatever the program writes to standard output -# is used as the file version. See the manual for examples. - -FILE_VERSION_FILTER = - -# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed by -# doxygen. The layout file controls the global structure of the generated output files -# in an output format independent way. The create the layout file that represents -# doxygen's defaults, run doxygen with the -l option. You can optionally specify a -# file name after the option, if omitted DoxygenLayout.xml will be used as the name -# of the layout file. - -LAYOUT_FILE = - -#--------------------------------------------------------------------------- -# configuration options related to warning and progress messages -#--------------------------------------------------------------------------- - -# The QUIET tag can be used to turn on/off the messages that are generated -# by doxygen. Possible values are YES and NO. If left blank NO is used. - -QUIET = YES - -# The WARNINGS tag can be used to turn on/off the warning messages that are -# generated by doxygen. Possible values are YES and NO. If left blank -# NO is used. - -WARNINGS = YES - -# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings -# for undocumented members. If EXTRACT_ALL is set to YES then this flag will -# automatically be disabled. - -WARN_IF_UNDOCUMENTED = YES - -# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for -# potential errors in the documentation, such as not documenting some -# parameters in a documented function, or documenting parameters that -# don't exist or using markup commands wrongly. - -WARN_IF_DOC_ERROR = YES - -# This WARN_NO_PARAMDOC option can be abled to get warnings for -# functions that are documented, but have no documentation for their parameters -# or return value. If set to NO (the default) doxygen will only warn about -# wrong or incomplete parameter documentation, but not about the absence of -# documentation. - -WARN_NO_PARAMDOC = NO - -# The WARN_FORMAT tag determines the format of the warning messages that -# doxygen can produce. The string should contain the $file, $line, and $text -# tags, which will be replaced by the file and line number from which the -# warning originated and the warning text. Optionally the format may contain -# $version, which will be replaced by the version of the file (if it could -# be obtained via FILE_VERSION_FILTER) - -WARN_FORMAT = "$file:$line: $text" - -# The WARN_LOGFILE tag can be used to specify a file to which warning -# and error messages should be written. If left blank the output is written -# to stderr. - -WARN_LOGFILE = - -#--------------------------------------------------------------------------- -# configuration options related to the input files -#--------------------------------------------------------------------------- - -# The INPUT tag can be used to specify the files and/or directories that contain -# documented source files. You may enter file names like "myfile.cpp" or -# directories like "/usr/src/myproject". Separate the files or directories -# with spaces. - -INPUT = /home/sarang/dev/libtransport/docs/../include/transport/ - -# This tag can be used to specify the character encoding of the source files -# that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is -# also the default input encoding. Doxygen uses libiconv (or the iconv built -# into libc) for the transcoding. See http://www.gnu.org/software/libiconv for -# the list of possible encodings. - -INPUT_ENCODING = UTF-8 - -# If the value of the INPUT tag contains directories, you can use the -# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp -# and *.h) to filter out the source-files in the directories. If left -# blank the following patterns are tested: -# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx -# *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.py *.f90 - -FILE_PATTERNS = - -# The RECURSIVE tag can be used to turn specify whether or not subdirectories -# should be searched for input files as well. Possible values are YES and NO. -# If left blank NO is used. - -RECURSIVE = YES - -# The EXCLUDE tag can be used to specify files and/or directories that should -# excluded from the INPUT source files. This way you can easily exclude a -# subdirectory from a directory tree whose root is specified with the INPUT tag. - -EXCLUDE = "_darcs" - -# The EXCLUDE_SYMLINKS tag can be used select whether or not files or -# directories that are symbolic links (a Unix filesystem feature) are excluded -# from the input. - -EXCLUDE_SYMLINKS = NO - -# If the value of the INPUT tag contains directories, you can use the -# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude -# certain files from those directories. Note that the wildcards are matched -# against the file with absolute path, so to exclude all test directories -# for example use the pattern */test/* - -EXCLUDE_PATTERNS = "*/.*" "*/.*/*" - -# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names -# (namespaces, classes, functions, etc.) that should be excluded from the -# output. The symbol name can be a fully qualified name, a word, or if the -# wildcard * is used, a substring. Examples: ANamespace, AClass, -# AClass::ANamespace, ANamespace::*Test - -EXCLUDE_SYMBOLS = - -# The EXAMPLE_PATH tag can be used to specify one or more files or -# directories that contain example code fragments that are included (see -# the \include command). - -EXAMPLE_PATH = "/home/sarang/dev/libtransport/docs/examples" - -# If the value of the EXAMPLE_PATH tag contains directories, you can use the -# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp -# and *.h) to filter out the source-files in the directories. If left -# blank all files are included. - -EXAMPLE_PATTERNS = - -# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be -# searched for input files to be used with the \include or \dontinclude -# commands irrespective of the value of the RECURSIVE tag. -# Possible values are YES and NO. If left blank NO is used. - -EXAMPLE_RECURSIVE = NO - -# The IMAGE_PATH tag can be used to specify one or more files or -# directories that contain image that are included in the documentation (see -# the \image command). - -IMAGE_PATH = "/home/sarang/dev/libtransport/docs" - -# The INPUT_FILTER tag can be used to specify a program that doxygen should -# invoke to filter for each input file. Doxygen will invoke the filter program -# by executing (via popen()) the command , where -# is the value of the INPUT_FILTER tag, and is the name of an -# input file. Doxygen will then use the output that the filter program writes -# to standard output. -# If FILTER_PATTERNS is specified, this tag will be -# ignored. - -INPUT_FILTER = - -# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern -# basis. -# Doxygen will compare the file name with each pattern and apply the -# filter if there is a match. -# The filters are a list of the form: -# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further -# info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER -# is applied to all files. - -FILTER_PATTERNS = - -# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using -# INPUT_FILTER) will be used to filter the input files when producing source -# files to browse (i.e. when SOURCE_BROWSER is set to YES). - -FILTER_SOURCE_FILES = NO - -#--------------------------------------------------------------------------- -# configuration options related to source browsing -#--------------------------------------------------------------------------- - -# If the SOURCE_BROWSER tag is set to YES then a list of source files will -# be generated. Documented entities will be cross-referenced with these sources. -# Note: To get rid of all source code in the generated output, make sure also -# VERBATIM_HEADERS is set to NO. - -SOURCE_BROWSER = NO - -# Setting the INLINE_SOURCES tag to YES will include the body -# of functions and classes directly in the documentation. - -INLINE_SOURCES = NO - -# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct -# doxygen to hide any special comment blocks from generated source code -# fragments. Normal C and C++ comments will always remain visible. - -STRIP_CODE_COMMENTS = YES - -# If the REFERENCED_BY_RELATION tag is set to YES -# then for each documented function all documented -# functions referencing it will be listed. - -REFERENCED_BY_RELATION = NO - -# If the REFERENCES_RELATION tag is set to YES -# then for each documented function all documented entities -# called/used by that function will be listed. - -REFERENCES_RELATION = NO - -# If the REFERENCES_LINK_SOURCE tag is set to YES (the default) -# and SOURCE_BROWSER tag is set to YES, then the hyperlinks from -# functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will -# link to the source code. -# Otherwise they will link to the documentation. - -REFERENCES_LINK_SOURCE = YES - -# If the USE_HTAGS tag is set to YES then the references to source code -# will point to the HTML generated by the htags(1) tool instead of doxygen -# built-in source browser. The htags tool is part of GNU's global source -# tagging system (see http://www.gnu.org/software/global/global.html). You -# will need version 4.8.6 or higher. - -USE_HTAGS = NO - -# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen -# will generate a verbatim copy of the header file for each class for -# which an include is specified. Set to NO to disable this. - -VERBATIM_HEADERS = YES - -#--------------------------------------------------------------------------- -# configuration options related to the alphabetical class index -#--------------------------------------------------------------------------- - -# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index -# of all compounds will be generated. Enable this if the project -# contains a lot of classes, structs, unions or interfaces. - -ALPHABETICAL_INDEX = NO - -# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then -# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns -# in which this list will be split (can be a number in the range [1..20]) - -COLS_IN_ALPHA_INDEX = 5 - -# In case all classes in a project start with a common prefix, all -# classes will be put under the same header in the alphabetical index. -# The IGNORE_PREFIX tag can be used to specify one or more prefixes that -# should be ignored while generating the index headers. - -IGNORE_PREFIX = - -#--------------------------------------------------------------------------- -# configuration options related to the HTML output -#--------------------------------------------------------------------------- - -# If the GENERATE_HTML tag is set to YES (the default) Doxygen will -# generate HTML output. - -GENERATE_HTML = YES - -# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. -# If a relative path is entered the value of OUTPUT_DIRECTORY will be -# put in front of it. If left blank `html' will be used as the default path. - -HTML_OUTPUT = /home/sarang/dev/libtransport/docs/../docs/html - -# The HTML_FILE_EXTENSION tag can be used to specify the file extension for -# each generated HTML page (for example: .htm,.php,.asp). If it is left blank -# doxygen will generate files with .html extension. - -HTML_FILE_EXTENSION = .html - -# The HTML_HEADER tag can be used to specify a personal HTML header for -# each generated HTML page. If it is left blank doxygen will generate a -# standard header. - -HTML_HEADER = - -# The HTML_FOOTER tag can be used to specify a personal HTML footer for -# each generated HTML page. If it is left blank doxygen will generate a -# standard footer. - -HTML_FOOTER = - -# The HTML_STYLESHEET tag can be used to specify a user-defined cascading -# style sheet that is used by each HTML page. It can be used to -# fine-tune the look of the HTML output. If the tag is left blank doxygen -# will generate a default style sheet. Note that doxygen will try to copy -# the style sheet file to the HTML output directory, so don't put your own -# stylesheet in the HTML output directory as well, or it will be erased! - -HTML_STYLESHEET = - -# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, -# files or namespaces will be aligned in HTML using tables. If set to -# NO a bullet list will be used. - -HTML_ALIGN_MEMBERS = YES - -# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML -# documentation will contain sections that can be hidden and shown after the -# page has loaded. For this to work a browser that supports -# JavaScript and DHTML is required (for instance Mozilla 1.0+, Firefox -# Netscape 6.0+, Internet explorer 5.0+, Konqueror, or Safari). - -HTML_DYNAMIC_SECTIONS = NO - -# If the GENERATE_DOCSET tag is set to YES, additional index files -# will be generated that can be used as input for Apple's Xcode 3 -# integrated development environment, introduced with OSX 10.5 (Leopard). -# To create a documentation set, doxygen will generate a Makefile in the -# HTML output directory. Running make will produce the docset in that -# directory and running "make install" will install the docset in -# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find -# it at startup. -# See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html for more information. - -GENERATE_DOCSET = NO - -# When GENERATE_DOCSET tag is set to YES, this tag determines the name of the -# feed. A documentation feed provides an umbrella under which multiple -# documentation sets from a single provider (such as a company or product suite) -# can be grouped. - -DOCSET_FEEDNAME = "Doxygen generated docs" - -# When GENERATE_DOCSET tag is set to YES, this tag specifies a string that -# should uniquely identify the documentation set bundle. This should be a -# reverse domain-name style string, e.g. com.mycompany.MyDocSet. Doxygen -# will append .docset to the name. - -DOCSET_BUNDLE_ID = org.doxygen.Project - -# If the GENERATE_HTMLHELP tag is set to YES, additional index files -# will be generated that can be used as input for tools like the -# Microsoft HTML help workshop to generate a compiled HTML help file (.chm) -# of the generated HTML documentation. - -GENERATE_HTMLHELP = NO - -# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can -# be used to specify the file name of the resulting .chm file. You -# can add a path in front of the file if the result should not be -# written to the html output directory. - -CHM_FILE = - -# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can -# be used to specify the location (absolute path including file name) of -# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run -# the HTML help compiler on the generated index.hhp. - -HHC_LOCATION = - -# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag -# controls if a separate .chi index file is generated (YES) or that -# it should be included in the master .chm file (NO). - -GENERATE_CHI = NO - -# If the GENERATE_HTMLHELP tag is set to YES, the CHM_INDEX_ENCODING -# is used to encode HtmlHelp index (hhk), content (hhc) and project file -# content. - -CHM_INDEX_ENCODING = - -# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag -# controls whether a binary table of contents is generated (YES) or a -# normal table of contents (NO) in the .chm file. - -BINARY_TOC = NO - -# The TOC_EXPAND flag can be set to YES to add extra items for group members -# to the contents of the HTML help documentation and to the tree view. - -TOC_EXPAND = NO - -# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and QHP_VIRTUAL_FOLDER -# are set, an additional index file will be generated that can be used as input for -# Qt's qhelpgenerator to generate a Qt Compressed Help (.qch) of the generated -# HTML documentation. - -GENERATE_QHP = NO - -# If the QHG_LOCATION tag is specified, the QCH_FILE tag can -# be used to specify the file name of the resulting .qch file. -# The path specified is relative to the HTML output folder. - -QCH_FILE = - -# The QHP_NAMESPACE tag specifies the namespace to use when generating -# Qt Help Project output. For more information please see -# http://doc.trolltech.com/qthelpproject.html#namespace - -QHP_NAMESPACE = - -# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating -# Qt Help Project output. For more information please see -# http://doc.trolltech.com/qthelpproject.html#virtual-folders - -QHP_VIRTUAL_FOLDER = doc - -# If QHP_CUST_FILTER_NAME is set, it specifies the name of a custom filter to add. -# For more information please see -# http://doc.trolltech.com/qthelpproject.html#custom-filters - -QHP_CUST_FILTER_NAME = - -# The QHP_CUST_FILT_ATTRS tag specifies the list of the attributes of the custom filter to add.For more information please see -# Qt Help Project / Custom Filters. - -QHP_CUST_FILTER_ATTRS = - -# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this project's -# filter section matches. -# Qt Help Project / Filter Attributes. - -QHP_SECT_FILTER_ATTRS = - -# If the GENERATE_QHP tag is set to YES, the QHG_LOCATION tag can -# be used to specify the location of Qt's qhelpgenerator. -# If non-empty doxygen will try to run qhelpgenerator on the generated -# .qhp file. - -QHG_LOCATION = - -# The DISABLE_INDEX tag can be used to turn on/off the condensed index at -# top of each HTML page. The value NO (the default) enables the index and -# the value YES disables it. - -DISABLE_INDEX = NO - -# This tag can be used to set the number of enum values (range [1..20]) -# that doxygen will group on one line in the generated HTML documentation. - -ENUM_VALUES_PER_LINE = 4 - -# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index -# structure should be generated to display hierarchical information. -# If the tag value is set to FRAME, a side panel will be generated -# containing a tree-like index structure (just like the one that -# is generated for HTML Help). For this to work a browser that supports -# JavaScript, DHTML, CSS and frames is required (for instance Mozilla 1.0+, -# Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are -# probably better off using the HTML help feature. Other possible values -# for this tag are: HIERARCHIES, which will generate the Groups, Directories, -# and Class Hierarchy pages using a tree view instead of an ordered list; -# ALL, which combines the behavior of FRAME and HIERARCHIES; and NONE, which -# disables this behavior completely. For backwards compatibility with previous -# releases of Doxygen, the values YES and NO are equivalent to FRAME and NONE -# respectively. - -GENERATE_TREEVIEW = NONE - -# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be -# used to set the initial width (in pixels) of the frame in which the tree -# is shown. - -TREEVIEW_WIDTH = 250 - -# Use this tag to change the font size of Latex formulas included -# as images in the HTML documentation. The default is 10. Note that -# when you change the font size after a successful doxygen run you need -# to manually remove any form_*.png images from the HTML output directory -# to force them to be regenerated. - -FORMULA_FONTSIZE = 10 - -#--------------------------------------------------------------------------- -# configuration options related to the LaTeX output -#--------------------------------------------------------------------------- - -# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will -# generate Latex output. - -GENERATE_LATEX = NO - -# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. -# If a relative path is entered the value of OUTPUT_DIRECTORY will be -# put in front of it. If left blank `latex' will be used as the default path. - -LATEX_OUTPUT = "" - -# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be -# invoked. If left blank `latex' will be used as the default command name. - -LATEX_CMD_NAME = "" - -# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to -# generate index for LaTeX. If left blank `makeindex' will be used as the -# default command name. - -MAKEINDEX_CMD_NAME = "" - -# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact -# LaTeX documents. This may be useful for small projects and may help to -# save some trees in general. - -COMPACT_LATEX = NO - -# The PAPER_TYPE tag can be used to set the paper type that is used -# by the printer. Possible values are: a4, a4wide, letter, legal and -# executive. If left blank a4wide will be used. - -PAPER_TYPE = a4wide - -# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX -# packages that should be included in the LaTeX output. - -EXTRA_PACKAGES = - -# The LATEX_HEADER tag can be used to specify a personal LaTeX header for -# the generated latex document. The header should contain everything until -# the first chapter. If it is left blank doxygen will generate a -# standard header. Notice: only use this tag if you know what you are doing! - -LATEX_HEADER = - -# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated -# is prepared for conversion to pdf (using ps2pdf). The pdf file will -# contain links (just like the HTML output) instead of page references -# This makes the output suitable for online browsing using a pdf viewer. - -PDF_HYPERLINKS = YES - -# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of -# plain latex in the generated Makefile. Set this option to YES to get a -# higher quality PDF documentation. - -USE_PDFLATEX = - -# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. -# command to the generated LaTeX files. This will instruct LaTeX to keep -# running if errors occur, instead of asking the user for help. -# This option is also used when generating formulas in HTML. - -LATEX_BATCHMODE = YES - -# If LATEX_HIDE_INDICES is set to YES then doxygen will not -# include the index chapters (such as File Index, Compound Index, etc.) -# in the output. - -LATEX_HIDE_INDICES = NO - -#--------------------------------------------------------------------------- -# configuration options related to the RTF output -#--------------------------------------------------------------------------- - -# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output -# The RTF output is optimized for Word 97 and may not look very pretty with -# other RTF readers or editors. - -GENERATE_RTF = NO - -# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. -# If a relative path is entered the value of OUTPUT_DIRECTORY will be -# put in front of it. If left blank `rtf' will be used as the default path. - -RTF_OUTPUT = rtf - -# If the COMPACT_RTF tag is set to YES Doxygen generates more compact -# RTF documents. This may be useful for small projects and may help to -# save some trees in general. - -COMPACT_RTF = NO - -# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated -# will contain hyperlink fields. The RTF file will -# contain links (just like the HTML output) instead of page references. -# This makes the output suitable for online browsing using WORD or other -# programs which support those fields. -# Note: wordpad (write) and others do not support links. - -RTF_HYPERLINKS = NO - -# Load stylesheet definitions from file. Syntax is similar to doxygen's -# config file, i.e. a series of assignments. You only have to provide -# replacements, missing definitions are set to their default value. - -RTF_STYLESHEET_FILE = - -# Set optional variables used in the generation of an rtf document. -# Syntax is similar to doxygen's config file. - -RTF_EXTENSIONS_FILE = - -#--------------------------------------------------------------------------- -# configuration options related to the man page output -#--------------------------------------------------------------------------- - -# If the GENERATE_MAN tag is set to YES (the default) Doxygen will -# generate man pages - -GENERATE_MAN = NO - -# The MAN_OUTPUT tag is used to specify where the man pages will be put. -# If a relative path is entered the value of OUTPUT_DIRECTORY will be -# put in front of it. If left blank `man' will be used as the default path. - -MAN_OUTPUT = man - -# The MAN_EXTENSION tag determines the extension that is added to -# the generated man pages (default is the subroutine's section .3) - -MAN_EXTENSION = .3 - -# If the MAN_LINKS tag is set to YES and Doxygen generates man output, -# then it will generate one additional man file for each entity -# documented in the real man page(s). These additional files -# only source the real man page, but without them the man command -# would be unable to find the correct page. The default is NO. - -MAN_LINKS = NO - -#--------------------------------------------------------------------------- -# configuration options related to the XML output -#--------------------------------------------------------------------------- - -# If the GENERATE_XML tag is set to YES Doxygen will -# generate an XML file that captures the structure of -# the code including all documentation. - -GENERATE_XML = NO - -# The XML_OUTPUT tag is used to specify where the XML pages will be put. -# If a relative path is entered the value of OUTPUT_DIRECTORY will be -# put in front of it. If left blank `xml' will be used as the default path. - -XML_OUTPUT = xml - -# The XML_SCHEMA tag can be used to specify an XML schema, -# which can be used by a validating XML parser to check the -# syntax of the XML files. - -XML_SCHEMA = - -# The XML_DTD tag can be used to specify an XML DTD, -# which can be used by a validating XML parser to check the -# syntax of the XML files. - -XML_DTD = - -# If the XML_PROGRAMLISTING tag is set to YES Doxygen will -# dump the program listings (including syntax highlighting -# and cross-referencing information) to the XML output. Note that -# enabling this will significantly increase the size of the XML output. - -XML_PROGRAMLISTING = YES - -#--------------------------------------------------------------------------- -# configuration options for the AutoGen Definitions output -#--------------------------------------------------------------------------- - -# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will -# generate an AutoGen Definitions (see autogen.sf.net) file -# that captures the structure of the code including all -# documentation. Note that this feature is still experimental -# and incomplete at the moment. - -GENERATE_AUTOGEN_DEF = NO - -#--------------------------------------------------------------------------- -# configuration options related to the Perl module output -#--------------------------------------------------------------------------- - -# If the GENERATE_PERLMOD tag is set to YES Doxygen will -# generate a Perl module file that captures the structure of -# the code including all documentation. Note that this -# feature is still experimental and incomplete at the -# moment. - -GENERATE_PERLMOD = NO - -# If the PERLMOD_LATEX tag is set to YES Doxygen will generate -# the necessary Makefile rules, Perl scripts and LaTeX code to be able -# to generate PDF and DVI output from the Perl module output. - -PERLMOD_LATEX = NO - -# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be -# nicely formatted so it can be parsed by a human reader. -# This is useful -# if you want to understand what is going on. -# On the other hand, if this -# tag is set to NO the size of the Perl module output will be much smaller -# and Perl will parse it just the same. - -PERLMOD_PRETTY = YES - -# The names of the make variables in the generated doxyrules.make file -# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. -# This is useful so different doxyrules.make files included by the same -# Makefile don't overwrite each other's variables. - -PERLMOD_MAKEVAR_PREFIX = - -#--------------------------------------------------------------------------- -# Configuration options related to the preprocessor -#--------------------------------------------------------------------------- - -# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will -# evaluate all C-preprocessor directives found in the sources and include -# files. - -ENABLE_PREPROCESSING = YES - -# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro -# names in the source code. If set to NO (the default) only conditional -# compilation will be performed. Macro expansion can be done in a controlled -# way by setting EXPAND_ONLY_PREDEF to YES. - -MACRO_EXPANSION = NO - -# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES -# then the macro expansion is limited to the macros specified with the -# PREDEFINED and EXPAND_AS_DEFINED tags. - -EXPAND_ONLY_PREDEF = NO - -# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files -# in the INCLUDE_PATH (see below) will be search if a #include is found. - -SEARCH_INCLUDES = YES - -# The INCLUDE_PATH tag can be used to specify one or more directories that -# contain include files that are not input files but should be processed by -# the preprocessor. - -INCLUDE_PATH = - -# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard -# patterns (like *.h and *.hpp) to filter out the header-files in the -# directories. If left blank, the patterns specified with FILE_PATTERNS will -# be used. - -INCLUDE_FILE_PATTERNS = - -# The PREDEFINED tag can be used to specify one or more macro names that -# are defined before the preprocessor is started (similar to the -D option of -# gcc). The argument of the tag is a list of macros of the form: name -# or name=definition (no spaces). If the definition and the = are -# omitted =1 is assumed. To prevent a macro definition from being -# undefined via #undef or recursively expanded use the := operator -# instead of the = operator. - -PREDEFINED = - -# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then -# this tag can be used to specify a list of macro names that should be expanded. -# The macro definition that is found in the sources will be used. -# Use the PREDEFINED tag if you want to use a different macro definition. - -EXPAND_AS_DEFINED = - -# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then -# doxygen's preprocessor will remove all function-like macros that are alone -# on a line, have an all uppercase name, and do not end with a semicolon. Such -# function macros are typically used for boiler-plate code, and will confuse -# the parser if not removed. - -SKIP_FUNCTION_MACROS = YES - -#--------------------------------------------------------------------------- -# Configuration::additions related to external references -#--------------------------------------------------------------------------- - -# The TAGFILES option can be used to specify one or more tagfiles. -# Optionally an initial location of the external documentation -# can be added for each tagfile. The format of a tag file without -# this location is as follows: -# -# TAGFILES = file1 file2 ... -# Adding location for the tag files is done as follows: -# -# TAGFILES = file1=loc1 "file2 = loc2" ... -# where "loc1" and "loc2" can be relative or absolute paths or -# URLs. If a location is present for each tag, the installdox tool -# does not have to be run to correct the links. -# Note that each tag file must have a unique name -# (where the name does NOT include the path) -# If a tag file is not located in the directory in which doxygen -# is run, you must also specify the path to the tagfile here. - -TAGFILES = - -# When a file name is specified after GENERATE_TAGFILE, doxygen will create -# a tag file that is based on the input files it reads. - -GENERATE_TAGFILE = - -# If the ALLEXTERNALS tag is set to YES all external classes will be listed -# in the class index. If set to NO only the inherited external classes -# will be listed. - -ALLEXTERNALS = NO - -# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed -# in the modules index. If set to NO, only the current project's groups will -# be listed. - -EXTERNAL_GROUPS = YES - -# The PERL_PATH should be the absolute path and name of the perl script -# interpreter (i.e. the result of `which perl'). - -PERL_PATH = /usr/bin/perl - -#--------------------------------------------------------------------------- -# Configuration options related to the dot tool -#--------------------------------------------------------------------------- - -# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will -# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base -# or super classes. Setting the tag to NO turns the diagrams off. Note that -# this option is superseded by the HAVE_DOT option below. This is only a -# fallback. It is recommended to install and use dot, since it yields more -# powerful graphs. - -CLASS_DIAGRAMS = YES - -# You can define message sequence charts within doxygen comments using the \msc -# command. Doxygen will then run the mscgen tool (see -# http://www.mcternan.me.uk/mscgen/) to produce the chart and insert it in the -# documentation. The MSCGEN_PATH tag allows you to specify the directory where -# the mscgen tool resides. If left empty the tool is assumed to be found in the -# default search path. - -MSCGEN_PATH = - -# If set to YES, the inheritance and collaboration graphs will hide -# inheritance and usage relations if the target is undocumented -# or is not a class. - -HIDE_UNDOC_RELATIONS = YES - -# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is -# available from the path. This tool is part of Graphviz, a graph visualization -# toolkit from AT&T and Lucent Bell Labs. The other options in this section -# have no effect if this option is set to NO (the default) - -HAVE_DOT = - -# By default doxygen will write a font called FreeSans.ttf to the output -# directory and reference it in all dot files that doxygen generates. This -# font does not include all possible unicode characters however, so when you need -# these (or just want a differently looking font) you can specify the font name -# using DOT_FONTNAME. You need need to make sure dot is able to find the font, -# which can be done by putting it in a standard location or by setting the -# DOTFONTPATH environment variable or by setting DOT_FONTPATH to the directory -# containing the font. - -DOT_FONTNAME = FreeSans - -# The DOT_FONTSIZE tag can be used to set the size of the font of dot graphs. -# The default size is 10pt. - -DOT_FONTSIZE = 10 - -# By default doxygen will tell dot to use the output directory to look for the -# FreeSans.ttf font (which doxygen will put there itself). If you specify a -# different font using DOT_FONTNAME you can set the path where dot -# can find it using this tag. - -DOT_FONTPATH = - -# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen -# will generate a graph for each documented class showing the direct and -# indirect inheritance relations. Setting this tag to YES will force the -# the CLASS_DIAGRAMS tag to NO. - -CLASS_GRAPH = YES - -# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen -# will generate a graph for each documented class showing the direct and -# indirect implementation dependencies (inheritance, containment, and -# class references variables) of the class with other documented classes. - -COLLABORATION_GRAPH = YES - -# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen -# will generate a graph for groups, showing the direct groups dependencies - -GROUP_GRAPHS = YES - -# If the UML_LOOK tag is set to YES doxygen will generate inheritance and -# collaboration diagrams in a style similar to the OMG's Unified Modeling -# Language. - -UML_LOOK = NO - -# If set to YES, the inheritance and collaboration graphs will show the -# relations between templates and their instances. - -TEMPLATE_RELATIONS = NO - -# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT -# tags are set to YES then doxygen will generate a graph for each documented -# file showing the direct and indirect include dependencies of the file with -# other documented files. - -INCLUDE_GRAPH = YES - -# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and -# HAVE_DOT tags are set to YES then doxygen will generate a graph for each -# documented header file showing the documented files that directly or -# indirectly include this file. - -INCLUDED_BY_GRAPH = YES - -# If the CALL_GRAPH and HAVE_DOT options are set to YES then -# doxygen will generate a call dependency graph for every global function -# or class method. Note that enabling this option will significantly increase -# the time of a run. So in most cases it will be better to enable call graphs -# for selected functions only using the \callgraph command. - -CALL_GRAPH = NO - -# If the CALLER_GRAPH and HAVE_DOT tags are set to YES then -# doxygen will generate a caller dependency graph for every global function -# or class method. Note that enabling this option will significantly increase -# the time of a run. So in most cases it will be better to enable caller -# graphs for selected functions only using the \callergraph command. - -CALLER_GRAPH = NO - -# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen -# will graphical hierarchy of all classes instead of a textual one. - -GRAPHICAL_HIERARCHY = YES - -# If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES -# then doxygen will show the dependencies a directory has on other directories -# in a graphical way. The dependency relations are determined by the #include -# relations between the files in the directories. - -DIRECTORY_GRAPH = YES - -# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images -# generated by dot. Possible values are png, jpg, or gif -# If left blank png will be used. - -DOT_IMAGE_FORMAT = png - -# The tag DOT_PATH can be used to specify the path where the dot tool can be -# found. If left blank, it is assumed the dot tool can be found in the path. - -DOT_PATH = "" - -# The DOTFILE_DIRS tag can be used to specify one or more directories that -# contain dot files that are included in the documentation (see the -# \dotfile command). - -DOTFILE_DIRS = - -# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of -# nodes that will be shown in the graph. If the number of nodes in a graph -# becomes larger than this value, doxygen will truncate the graph, which is -# visualized by representing a node as a red box. Note that doxygen if the -# number of direct children of the root node in a graph is already larger than -# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note -# that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH. - -DOT_GRAPH_MAX_NODES = 50 - -# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the -# graphs generated by dot. A depth value of 3 means that only nodes reachable -# from the root by following a path via at most 3 edges will be shown. Nodes -# that lay further from the root node will be omitted. Note that setting this -# option to 1 or 2 may greatly reduce the computation time needed for large -# code bases. Also note that the size of a graph can be further restricted by -# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction. - -MAX_DOT_GRAPH_DEPTH = 0 - -# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent -# background. This is disabled by default, because dot on Windows does not -# seem to support this out of the box. Warning: Depending on the platform used, -# enabling this option may lead to badly anti-aliased labels on the edges of -# a graph (i.e. they become hard to read). - -DOT_TRANSPARENT = YES - -# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output -# files in one run (i.e. multiple -o and -T options on the command line). This -# makes dot run faster, but since only newer versions of dot (>1.8.10) -# support this, this feature is disabled by default. - -DOT_MULTI_TARGETS = NO - -# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will -# generate a legend page explaining the meaning of the various boxes and -# arrows in the dot generated graphs. - -GENERATE_LEGEND = YES - -# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will -# remove the intermediate dot files that are used to generate -# the various graphs. - -DOT_CLEANUP = YES - -#--------------------------------------------------------------------------- -# Options related to the search engine -#--------------------------------------------------------------------------- - -# The SEARCHENGINE tag specifies whether or not a search engine should be -# used. If set to NO the values of all tags below this one will be ignored. - -SEARCHENGINE = NO From b326bca552d7c1d67f8cc431ff200537923889fe Mon Sep 17 00:00:00 2001 From: HanzZ Date: Sun, 8 Apr 2012 13:53:14 +0200 Subject: [PATCH 094/143] set sqlite3 as default backend --- include/transport/protocol.proto | 6 ++++++ src/storagebackend.cpp | 4 +++- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/include/transport/protocol.proto b/include/transport/protocol.proto index 8f3ac42c..8dddaf7e 100644 --- a/include/transport/protocol.proto +++ b/include/transport/protocol.proto @@ -44,6 +44,7 @@ message Login { required string user = 1; required string legacyName = 2; required string password = 3; + repeated string extraFields = 4; } message Logout { @@ -122,6 +123,10 @@ message FileTransferData { required bytes data = 2; } +message BackendConfig { + required string config = 1; +} + message WrapperMessage { enum Type { TYPE_CONNECTED = 1; @@ -152,6 +157,7 @@ message WrapperMessage { TYPE_FT_PAUSE = 27; TYPE_FT_CONTINUE = 28; TYPE_EXIT = 29; + TYPE_BACKEND_CONFIG = 30; } required Type type = 1; optional bytes payload = 2; diff --git a/src/storagebackend.cpp b/src/storagebackend.cpp index 17657a48..fabaed47 100644 --- a/src/storagebackend.cpp +++ b/src/storagebackend.cpp @@ -10,7 +10,8 @@ namespace Transport { StorageBackend *StorageBackend::createBackend(Config *config, std::string &error) { StorageBackend *storageBackend = NULL; #ifdef WITH_SQLITE - if (CONFIG_STRING(config, "database.type") == "sqlite3") { + if (CONFIG_STRING(config, "database.type") == "sqlite3" || + (CONFIG_STRING(config, "database.type") == "none" && CONFIG_BOOL(config, "service.server_mode"))) { storageBackend = new SQLite3Backend(config); } #else @@ -43,6 +44,7 @@ StorageBackend *StorageBackend::createBackend(Config *config, std::string &error && CONFIG_STRING(config, "database.type") != "pqxx" && CONFIG_STRING(config, "database.type") != "none") { error = "Unknown storage backend " + CONFIG_STRING(config, "database.type"); } + return storageBackend; } From 909381c6588b619f890bc4aebe57f0556f49a4dc Mon Sep 17 00:00:00 2001 From: HanzZ Date: Sun, 8 Apr 2012 14:01:46 +0200 Subject: [PATCH 095/143] Do not send vcard with from=legacy_network_name --- src/vcardresponder.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vcardresponder.cpp b/src/vcardresponder.cpp index 83ff2acc..a8c7a6f4 100644 --- a/src/vcardresponder.cpp +++ b/src/vcardresponder.cpp @@ -101,7 +101,7 @@ bool VCardResponder::handleGetRequest(const Swift::JID& from, const Swift::JID& LOG4CXX_INFO(logger, from.toBare().toString() << ": Requested VCard of " << name); m_queries[m_id].from = from; - m_queries[m_id].to = to_; + m_queries[m_id].to = to; m_queries[m_id].id = id; m_queries[m_id].received = time(NULL); onVCardRequired(user, name, m_id++); From 8b14d92f10a641bb5f096a2b3767808b998448e6 Mon Sep 17 00:00:00 2001 From: HanzZ Date: Sun, 8 Apr 2012 14:17:32 +0200 Subject: [PATCH 096/143] Don't crash when there are duplicated options and print error message instead --- src/config.cpp | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/config.cpp b/src/config.cpp index 816e6fba..a1c19273 100644 --- a/src/config.cpp +++ b/src/config.cpp @@ -193,8 +193,13 @@ bool Config::load(std::istream &ifs) { } bool Config::load(const std::string &configfile, const std::string &jid) { - options_description opts("Transport options"); - return load(configfile, opts, jid); + try { + options_description opts("Transport options"); + return load(configfile, opts, jid); + } catch ( const boost::program_options::multiple_occurrences& e ) { + std::cerr << configfile << " parsing error: " << e.what() << " from option: " << e.get_option_name() << std::endl; + return false; + } } bool Config::reload() { From 8b2e6e0bc26c01de4f8c0a353873a6da8daebbaf Mon Sep 17 00:00:00 2001 From: HanzZ Date: Sun, 8 Apr 2012 14:57:44 +0200 Subject: [PATCH 097/143] Changelog --- ChangeLog | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/ChangeLog b/ChangeLog index fe7ded53..c9399fde 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,20 @@ +Version 2.0.0-beta3 (2012-XX-XX): + General: + * Log errors related to backend spawning (Show proper log message for + example when path to backend binary is not found). + * Update buddies in database only when it's needed and do not execute + useless database statements. + * Answer to disco#info IQ with proper node (#206). + * Set SQLite3 as default database backend. + * Fixed disconnecting from server caused by sending VCard response + with bad "from" attribute. + + Libpurple: + * prpl-gg: Fetch the contact list properly (#252). + + Skype: + * Log more errors. + Version 2.0.0-beta2 (2012-03-28): General: * Fixed bug when Roster Item Exchange and subscribe stanzas were sent From 8d8ec5c94acb348ad56235392ab822254ddda702 Mon Sep 17 00:00:00 2001 From: HanzZ Date: Sun, 8 Apr 2012 14:59:08 +0200 Subject: [PATCH 098/143] Changelog --- ChangeLog | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/ChangeLog b/ChangeLog index c9399fde..9d973b38 100644 --- a/ChangeLog +++ b/ChangeLog @@ -15,6 +15,10 @@ Version 2.0.0-beta3 (2012-XX-XX): Skype: * Log more errors. + Backend API: + * Added Python NetworkPlugin class, so it is now easier to write backends + in Python (Thanks to Sarang). + Version 2.0.0-beta2 (2012-03-28): General: * Fixed bug when Roster Item Exchange and subscribe stanzas were sent From cf4730e69fda2dd96132972e4eba900423d86e19 Mon Sep 17 00:00:00 2001 From: HanzZ Date: Sun, 8 Apr 2012 15:19:27 +0200 Subject: [PATCH 099/143] Remove protobuf from libtransport dependencies --- src/CMakeLists.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index ae247e34..1f76ee35 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -41,9 +41,9 @@ if (CMAKE_COMPILER_IS_GNUCXX) endif() if (WIN32) - TARGET_LINK_LIBRARIES(transport transport-plugin ${PQXX_LIBRARY} ${PQ_LIBRARY} ${SQLITE3_LIBRARIES} ${MYSQL_LIBRARIES} ${SWIFTEN_LIBRARY} ${PROTOBUF_LIBRARIES} ${LOG4CXX_LIBRARIES}) + TARGET_LINK_LIBRARIES(transport transport-plugin ${PQXX_LIBRARY} ${PQ_LIBRARY} ${SQLITE3_LIBRARIES} ${MYSQL_LIBRARIES} ${SWIFTEN_LIBRARY} ${LOG4CXX_LIBRARIES}) else (WIN32) - TARGET_LINK_LIBRARIES(transport transport-plugin ${PQXX_LIBRARY} ${PQ_LIBRARY} ${SQLITE3_LIBRARIES} ${MYSQL_LIBRARIES} ${SWIFTEN_LIBRARY} ${PROTOBUF_LIBRARIES} ${LOG4CXX_LIBRARIES} ${POPT_LIBRARY}) + TARGET_LINK_LIBRARIES(transport transport-plugin ${PQXX_LIBRARY} ${PQ_LIBRARY} ${SQLITE3_LIBRARIES} ${MYSQL_LIBRARIES} ${SWIFTEN_LIBRARY} ${LOG4CXX_LIBRARIES} ${POPT_LIBRARY}) endif(WIN32) SET_TARGET_PROPERTIES(transport PROPERTIES From 9c212b8b065b157e369b69f642fe9c34db1c92bf Mon Sep 17 00:00:00 2001 From: Alexander Skovpen Date: Sun, 8 Apr 2012 17:35:06 +0400 Subject: [PATCH 100/143] added munin plugin --- munin/spectrum2_ | 110 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 110 insertions(+) create mode 100755 munin/spectrum2_ diff --git a/munin/spectrum2_ b/munin/spectrum2_ new file mode 100755 index 00000000..ff91fba1 --- /dev/null +++ b/munin/spectrum2_ @@ -0,0 +1,110 @@ +#!/usr/bin/perl + +# config: +# [spectrum2_*] +# env.admin_jid tradmin@host.org +# env.password jid_password +# env.transports icq.host.org xmpp.host.org +# +# symlinks: +# spectrum2_backends spectrum2_memory spectrum2_users +# +# +use AnyEvent; +use AnyEvent::XMPP::Client; +use AnyEvent::XMPP::Component; +use AnyEvent::XMPP::Ext::Disco; +use AnyEvent::XMPP::Ext::Version; +use AnyEvent::XMPP::Namespaces qw/xmpp_ns/; +use AnyEvent::XMPP::Util qw/simxml/; +use XML::Simple; +use Time::HiRes qw ( setitimer ITIMER_REAL time ); +use strict; +$|=1; + +$SIG{ALRM} = sub { exit; }; +setitimer(ITIMER_REAL, 30, 1); + + +my %config=( + users => { + title=>'Buddies online', + vlabel=>'users', + info=>'Number of users that currently use the spectrum transports.', + command=>'online_users_count', + base=>'--base 1000', + x=>'1', + }, + backends => { + title=>'Backends running', + vlabel=>'backends', + info=>'Number of backends that currently running.', + command=>'backends_count', + base=>'--base 1000', + x=>'1', + }, + memory => { + title=>'Memory usage of transports', + vlabel=>'megabytes', + info=>'Memory usage of spectrum transports.', + command=>'used_memory', + base=>'--base 1024', + x=>'1024', + }, +); +$0 =~ /spectrum2_(.+)*$/; +my $func = $1; +exit 2 unless defined $func; +my %tr; +my $count=0; + foreach (split(' ',$ENV{'transports'})){ + $tr{$_}=$count; + $count++; + } + +if (exists $ARGV[0] and $ARGV[0] eq "config") +{ + print "graph_title ".$config{$func}->{'title'}."\n"; + print "graph_vlabel ".$config{$func}->{'vlabel'}."\n"; + print "graph_category spectrum2\n"; + foreach (keys (%tr)){ + print "r".$tr{$_}.".label ".$_."\n"; + } + print "graph_args ".$config{$func}->{'base'}."\n"; + print "graph_info ".$config{$func}->{'info'}."\n"; + exit 0; +} + +binmode( STDOUT); +my $xs=new XML::Simple; +my $cl=AnyEvent::XMPP::Client->new(debug=>0); +my $j=AnyEvent->condvar; +$cl->add_account($ENV{'admin_jid'}.'/'.time,$ENV{'password'}); +$cl->reg_cb( + session_ready => \&cl_sess, + disconnect => \&cl_disc, + message => \&cl_msg, +); +$cl->start; +$j->wait; + + +sub cl_disc +{ +my ($cl,$acc,$h,$p,$reas)=@_; + print "disc ($h:$p) $reas\n"; +} +sub cl_sess +{ + my($cl,$acc)=@_; + foreach (keys (%tr)){ + $cl->send_message($config{$func}->{'command'},$_,undef,'chat'); + } +} +sub cl_msg +{ + my ($cl,$acc,$msg)=@_; + print "r".$tr{$msg->from}.".value ".int($msg->any_body/$config{$func}->{'x'})."\n"; + delete( $tr{$msg->from}); + exit if (scalar(keys %tr)==0); +} From e84ea9b1029b17a3dfeec3e032bcb398962a7487 Mon Sep 17 00:00:00 2001 From: HanzZ Date: Sun, 8 Apr 2012 16:44:31 +0200 Subject: [PATCH 101/143] Merged SoC teaser tasks solutions --- backends/template/main.cpp | 5 +++++ src/admininterface.cpp | 11 +++++++++++ src/config.cpp | 2 ++ src/gatewayresponder.cpp | 4 +++- 4 files changed, 21 insertions(+), 1 deletion(-) diff --git a/backends/template/main.cpp b/backends/template/main.cpp index 595ce42d..7568066f 100644 --- a/backends/template/main.cpp +++ b/backends/template/main.cpp @@ -56,6 +56,8 @@ class TemplatePlugin : public NetworkPlugin { void handleLoginRequest(const std::string &user, const std::string &legacyName, const std::string &password) { handleConnected(user); + LOG4CXX_INFO(logger, user << ": Added buddy - Echo."); + handleBuddyChanged(user, "echo", "Echo", std::vector(), pbnetwork::STATUS_ONLINE); } void handleLogoutRequest(const std::string &user, const std::string &legacyName) { @@ -63,6 +65,9 @@ class TemplatePlugin : public NetworkPlugin { void handleMessageSendRequest(const std::string &user, const std::string &legacyName, const std::string &message, const std::string &xhtml = "") { LOG4CXX_INFO(logger, "Sending message from " << user << " to " << legacyName << "."); + if (legacyName == "echo") { + handleMessage(user, legacyName, message); + } } void handleBuddyUpdatedRequest(const std::string &user, const std::string &buddyName, const std::string &alias, const std::vector &groups) { diff --git a/src/admininterface.cpp b/src/admininterface.cpp index c79db37c..769d002f 100644 --- a/src/admininterface.cpp +++ b/src/admininterface.cpp @@ -257,6 +257,14 @@ void AdminInterface::handleMessageReceived(Swift::Message::ref message) { } message->setBody(lst); } + else if (message->getBody() == "messages_from_xmpp") { + int msgCount = m_userManager->getMessagesToBackend(); + message->setBody(boost::lexical_cast(msgCount)); + } + else if (message->getBody() == "messages_to_xmpp") { + int msgCount = m_userManager->getMessagesToXMPP(); + message->setBody(boost::lexical_cast(msgCount)); + } else if (message->getBody().find("help") == 0) { std::string help; help += "General:\n"; @@ -267,6 +275,9 @@ void AdminInterface::handleMessageReceived(Swift::Message::ref message) { help += " online_users_count - number of online users\n"; help += " online_users_per_backend - shows online users per backends\n"; help += " has_online_user - returns 1 if user is online\n"; + help += "Messages:\n"; + help += " messages_from_xmpp - get number of messages received from XMPP users\n"; + help += " messages_to_xmpp - get number of messages sent to XMPP users\n"; help += "Backends:\n"; help += " backends_count - number of active backends\n"; help += " crashed_backends - returns IDs of crashed backends\n"; diff --git a/src/config.cpp b/src/config.cpp index a1c19273..6eb10e4e 100644 --- a/src/config.cpp +++ b/src/config.cpp @@ -99,6 +99,8 @@ bool Config::load(std::istream &ifs, boost::program_options::options_description ("registration.local_username_label", value()->default_value("Local username:"), "Label for local usernme field") ("registration.local_account_server", value()->default_value("localhost"), "The server on which the local accounts will be checked for validity") ("registration.local_account_server_timeout", value()->default_value(10000), "Timeout when checking local user on local_account_server (msecs)") + ("gateway_responder.prompt", value()->default_value("Contact ID"), "Value of field") + ("gateway_responder.label", value()->default_value("Enter legacy network contact ID."), "Label for add contact ID field") ("database.type", value()->default_value("none"), "Database type.") ("database.database", value()->default_value("/var/lib/spectrum2/$jid/database.sql"), "Database used to store data") ("database.server", value()->default_value("localhost"), "Database server.") diff --git a/src/gatewayresponder.cpp b/src/gatewayresponder.cpp index 2f7c0c35..c7cbee99 100644 --- a/src/gatewayresponder.cpp +++ b/src/gatewayresponder.cpp @@ -45,7 +45,9 @@ GatewayResponder::~GatewayResponder() { } bool GatewayResponder::handleGetRequest(const Swift::JID& from, const Swift::JID& to, const std::string& id, boost::shared_ptr payload) { - sendResponse(from, id, boost::shared_ptr(new GatewayPayload(Swift::JID(), "Enter legacy network contact ID.", "Contact ID"))); + std::string prompt = CONFIG_STRING(m_userManager->getComponent()->getConfig(), "gateway_responder.prompt"); + std::string label = CONFIG_STRING(m_userManager->getComponent()->getConfig(), "gateway_responder.label"); + sendResponse(from, id, boost::shared_ptr(new GatewayPayload(Swift::JID(), label, prompt))); return true; } From e71c01ded8f1641f69b625656f0efdd9654818f8 Mon Sep 17 00:00:00 2001 From: Alexander Skovpen Date: Sun, 8 Apr 2012 19:22:41 +0400 Subject: [PATCH 102/143] added messages statistic to munin plugin --- munin/spectrum2_ | 68 +++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 62 insertions(+), 6 deletions(-) diff --git a/munin/spectrum2_ b/munin/spectrum2_ index ff91fba1..5f13e46f 100755 --- a/munin/spectrum2_ +++ b/munin/spectrum2_ @@ -7,7 +7,7 @@ # env.transports icq.host.org xmpp.host.org # # symlinks: -# spectrum2_backends spectrum2_memory spectrum2_users +# spectrum2_backends spectrum2_memory spectrum2_users spectrum2_messages spectrum2_messages_sec # # use AnyEvent; @@ -51,15 +51,42 @@ my %config=( base=>'--base 1024', x=>'1024', }, + messages => { + title=>'Messages send over transport', + vlabel=>'messages', + info=>'Messages send over spectrum transports.', + command=>'', + base=>'--base 1000', + x=>'1', + }, + messages_sec => { + title=>'Messages send over transport', + vlabel=>'messages/sec', + info=>'Messages send per second over spectrum transports.', + command=>'', + base=>'--base 1000', + x=>'1', + }, ); +my @queue=('_out','_in'); $0 =~ /spectrum2_(.+)*$/; my $func = $1; exit 2 unless defined $func; my %tr; my $count=0; foreach (split(' ',$ENV{'transports'})){ - $tr{$_}=$count; - $count++; + if ($func=~/messages/) + { + $tr{$_."_in"}=$count; + $count++; + $tr{$_."_out"}=$count; + $count++; + } + else + { + $tr{$_}=$count; + $count++; + } } if (exists $ARGV[0] and $ARGV[0] eq "config") @@ -69,6 +96,11 @@ if (exists $ARGV[0] and $ARGV[0] eq "config") print "graph_category spectrum2\n"; foreach (keys (%tr)){ print "r".$tr{$_}.".label ".$_."\n"; + if ($func eq 'messages_sec') + { + print "r".$tr{$_}.".type DERIVE\n"; + print "r".$tr{$_}.".min 0\n"; + } } print "graph_args ".$config{$func}->{'base'}."\n"; print "graph_info ".$config{$func}->{'info'}."\n"; @@ -98,13 +130,37 @@ sub cl_sess { my($cl,$acc)=@_; foreach (keys (%tr)){ - $cl->send_message($config{$func}->{'command'},$_,undef,'chat'); + if ($func=~/messages/) + { + if (s/_in$//) + { + $cl->send_message("messages_from_xmpp",$_,undef,'chat'); + }; + if (s/_out$//) + { + $cl->send_message("messages_to_xmpp",$_,undef,'chat'); + } + } + else + { + $cl->send_message($config{$func}->{'command'},$_,undef,'chat'); + } } } sub cl_msg { my ($cl,$acc,$msg)=@_; - print "r".$tr{$msg->from}.".value ".int($msg->any_body/$config{$func}->{'x'})."\n"; - delete( $tr{$msg->from}); + if ($func=~/messages/) + { + print "r".$tr{$msg->from.$queue[-1]}.".value ".int($msg->any_body/$config{$func}->{'x'})."\n"; + delete( $tr{$msg->from.$queue[-1]}); + pop(@queue); + if ($#queue==-1){@queue=("_out","_in");} + } + else + { + print "r".$tr{$msg->from}.".value ".int($msg->any_body/$config{$func}->{'x'})."\n"; + delete( $tr{$msg->from}); + } exit if (scalar(keys %tr)==0); } From 94337d703e241dc6d7b0abc8a5c455de5a713206 Mon Sep 17 00:00:00 2001 From: Alexander Skovpen Date: Mon, 9 Apr 2012 00:28:42 +0400 Subject: [PATCH 103/143] partially #258 --- src/admininterface.cpp | 10 ++++++---- src/usermanager.cpp | 25 +++++++++++++++++++++++++ src/userregistry.cpp | 21 ++++++++++++--------- 3 files changed, 43 insertions(+), 13 deletions(-) diff --git a/src/admininterface.cpp b/src/admininterface.cpp index 769d002f..5b5a50a3 100644 --- a/src/admininterface.cpp +++ b/src/admininterface.cpp @@ -59,11 +59,13 @@ void AdminInterface::handleMessageReceived(Swift::Message::ref message) { if (!message->getTo().getNode().empty()) return; - if (message->getFrom().toBare().toString() != CONFIG_STRING(m_component->getConfig(), "service.admin_jid")) { - LOG4CXX_WARN(logger, "Message not from admin user, but from " << message->getFrom().toBare().toString()); - return; + std::list const &x = CONFIG_LIST(m_component->getConfig(),"service.admin_jid"); + if (std::find(x.begin(), x.end(), message->getFrom().toBare().toString()) == x.end()) { + LOG4CXX_WARN(logger, "Message not from admin user, but from " << message->getFrom().toBare().toString()); + return; + } - + // Ignore empty messages if (message->getBody().empty()) { return; diff --git a/src/usermanager.cpp b/src/usermanager.cpp index 671509f4..618be97e 100644 --- a/src/usermanager.cpp +++ b/src/usermanager.cpp @@ -150,6 +150,7 @@ void UserManager::handlePresence(Swift::Presence::ref presence) { // Create user class if it's not there if (!user) { // Admin user is not legacy network user, so do not create User class instance for him +/* if (m_component->inServerMode() && CONFIG_STRING(m_component->getConfig(), "service.admin_jid") == presence->getFrom().toBare().toString()) { // Send admin contact to the user. Swift::RosterPayload::ref payload = Swift::RosterPayload::ref(new Swift::RosterPayload()); @@ -168,6 +169,30 @@ void UserManager::handlePresence(Swift::Presence::ref presence) { m_component->getStanzaChannel()->sendPresence(response); return; } +*/ + if (m_component->inServerMode()) { + // && CONFIG_STRING(m_component->getConfig(), "service.admin_jid") == presence->getFrom().toBare().toString()) { + std::list const &x = CONFIG_LIST(m_component->getConfig(),"service.admin_jid"); + if (std::find(x.begin(), x.end(), presence->getFrom().toBare().toString()) != x.end()) { + + // Send admin contact to the user. + Swift::RosterPayload::ref payload = Swift::RosterPayload::ref(new Swift::RosterPayload()); + Swift::RosterItemPayload item; + item.setJID(m_component->getJID()); + item.setName("Admin"); + item.setSubscription(Swift::RosterItemPayload::Both); + payload->addItem(item); + + Swift::SetRosterRequest::ref request = Swift::SetRosterRequest::create(payload, presence->getFrom(), m_component->getIQRouter()); + request->send(); + + Swift::Presence::ref response = Swift::Presence::create(); + response->setTo(presence->getFrom()); + response->setFrom(m_component->getJID()); + m_component->getStanzaChannel()->sendPresence(response); + return; + } + } // No user and unavailable presence -> answer with unavailable if (presence->getType() == Swift::Presence::Unavailable) { diff --git a/src/userregistry.cpp b/src/userregistry.cpp index 81f6806c..1b79c014 100644 --- a/src/userregistry.cpp +++ b/src/userregistry.cpp @@ -38,16 +38,19 @@ UserRegistry::UserRegistry(Config *cfg, Swift::NetworkFactories *factories) { UserRegistry::~UserRegistry() { m_removeTimer->stop(); } void UserRegistry::isValidUserPassword(const Swift::JID& user, Swift::ServerFromClientSession *session, const Swift::SafeByteArray& password) { - if (!CONFIG_STRING(config, "service.admin_jid").empty() && user.toBare().toString() == CONFIG_STRING(config, "service.admin_jid")) { - if (Swift::safeByteArrayToString(password) == CONFIG_STRING(config, "service.admin_password")) { - session->handlePasswordValid(); - } - else { - session->handlePasswordInvalid(); - } - return; - } + if (!CONFIG_STRING(config, "service.admin_jid").empty() ) { + std::list const &x = CONFIG_LIST(config,"service.admin_jid"); + if (std::find(x.begin(), x.end(), user.toBare().toString()) != x.end()) { + if (Swift::safeByteArrayToString(password) == CONFIG_STRING(config, "service.admin_password")) { + session->handlePasswordValid(); + } + else { + session->handlePasswordInvalid(); + } + return; + } + } std::string key = user.toBare().toString(); // Users try to connect twice From 75f0f7507762c22ed1a32e6dbc8f9500a64fae92 Mon Sep 17 00:00:00 2001 From: Alexander Skovpen Date: Mon, 9 Apr 2012 01:40:30 +0400 Subject: [PATCH 104/143] #258 --- src/admininterface.cpp | 2 +- src/config.cpp | 2 +- src/usermanager.cpp | 23 +---------------------- src/userregistry.cpp | 6 +++--- 4 files changed, 6 insertions(+), 27 deletions(-) diff --git a/src/admininterface.cpp b/src/admininterface.cpp index 5b5a50a3..db3c53a6 100644 --- a/src/admininterface.cpp +++ b/src/admininterface.cpp @@ -59,7 +59,7 @@ void AdminInterface::handleMessageReceived(Swift::Message::ref message) { if (!message->getTo().getNode().empty()) return; - std::list const &x = CONFIG_LIST(m_component->getConfig(),"service.admin_jid"); + std::vector const &x = CONFIG_VECTOR(m_component->getConfig(),"service.admin_jid"); if (std::find(x.begin(), x.end(), message->getFrom().toBare().toString()) == x.end()) { LOG4CXX_WARN(logger, "Message not from admin user, but from " << message->getFrom().toBare().toString()); return; diff --git a/src/config.cpp b/src/config.cpp index 6eb10e4e..b3b263ff 100644 --- a/src/config.cpp +++ b/src/config.cpp @@ -77,7 +77,7 @@ bool Config::load(std::istream &ifs, boost::program_options::options_description ("service.backend_port", value()->default_value("0"), "Port to bind backend server to") ("service.cert", value()->default_value(""), "PKCS#12 Certificate.") ("service.cert_password", value()->default_value(""), "PKCS#12 Certificate password.") - ("service.admin_jid", value()->default_value(""), "Administrator jid.") + ("service.admin_jid", value >()->multitoken(), "Administrator jid.") ("service.admin_password", value()->default_value(""), "Administrator password.") ("service.reuse_old_backends", value()->default_value(true), "True if Spectrum should use old backends which were full in the past.") ("service.idle_reconnect_time", value()->default_value(0), "Time in seconds after which idle users are reconnected to let their backend die.") diff --git a/src/usermanager.cpp b/src/usermanager.cpp index 618be97e..ee46277b 100644 --- a/src/usermanager.cpp +++ b/src/usermanager.cpp @@ -150,29 +150,8 @@ void UserManager::handlePresence(Swift::Presence::ref presence) { // Create user class if it's not there if (!user) { // Admin user is not legacy network user, so do not create User class instance for him -/* - if (m_component->inServerMode() && CONFIG_STRING(m_component->getConfig(), "service.admin_jid") == presence->getFrom().toBare().toString()) { - // Send admin contact to the user. - Swift::RosterPayload::ref payload = Swift::RosterPayload::ref(new Swift::RosterPayload()); - Swift::RosterItemPayload item; - item.setJID(m_component->getJID()); - item.setName("Admin"); - item.setSubscription(Swift::RosterItemPayload::Both); - payload->addItem(item); - - Swift::SetRosterRequest::ref request = Swift::SetRosterRequest::create(payload, presence->getFrom(), m_component->getIQRouter()); - request->send(); - - Swift::Presence::ref response = Swift::Presence::create(); - response->setTo(presence->getFrom()); - response->setFrom(m_component->getJID()); - m_component->getStanzaChannel()->sendPresence(response); - return; - } -*/ if (m_component->inServerMode()) { - // && CONFIG_STRING(m_component->getConfig(), "service.admin_jid") == presence->getFrom().toBare().toString()) { - std::list const &x = CONFIG_LIST(m_component->getConfig(),"service.admin_jid"); + std::vector const &x = CONFIG_VECTOR(m_component->getConfig(),"service.admin_jid"); if (std::find(x.begin(), x.end(), presence->getFrom().toBare().toString()) != x.end()) { // Send admin contact to the user. diff --git a/src/userregistry.cpp b/src/userregistry.cpp index 1b79c014..265ee692 100644 --- a/src/userregistry.cpp +++ b/src/userregistry.cpp @@ -39,8 +39,8 @@ UserRegistry::~UserRegistry() { m_removeTimer->stop(); } void UserRegistry::isValidUserPassword(const Swift::JID& user, Swift::ServerFromClientSession *session, const Swift::SafeByteArray& password) { - if (!CONFIG_STRING(config, "service.admin_jid").empty() ) { - std::list const &x = CONFIG_LIST(config,"service.admin_jid"); +// if (!CONFIG_STRING(config, "service.admin_jid").empty() ) { + std::vector const &x = CONFIG_VECTOR(config,"service.admin_jid"); if (std::find(x.begin(), x.end(), user.toBare().toString()) != x.end()) { if (Swift::safeByteArrayToString(password) == CONFIG_STRING(config, "service.admin_password")) { session->handlePasswordValid(); @@ -50,7 +50,7 @@ void UserRegistry::isValidUserPassword(const Swift::JID& user, Swift::ServerFrom } return; } - } +// } std::string key = user.toBare().toString(); // Users try to connect twice From 461e670e015336f9be3c1b790866b936d178e03f Mon Sep 17 00:00:00 2001 From: HanzZ Date: Mon, 9 Apr 2012 08:33:13 +0200 Subject: [PATCH 105/143] Probably log that DBus error --- backends/libpurple/main.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/backends/libpurple/main.cpp b/backends/libpurple/main.cpp index 8320ea28..938c7113 100644 --- a/backends/libpurple/main.cpp +++ b/backends/libpurple/main.cpp @@ -1424,6 +1424,8 @@ debug_init(void) REGISTER_G_LOG_HANDLER("GModule"); REGISTER_G_LOG_HANDLER("GLib-GObject"); REGISTER_G_LOG_HANDLER("GThread"); + REGISTER_G_LOG_HANDLER("GConf"); + #undef REGISTER_G_LOD_HANDLER } From 9b39d3ebea493773c77e4d7028cc59009dfad031 Mon Sep 17 00:00:00 2001 From: HanzZ Date: Mon, 9 Apr 2012 09:16:23 +0200 Subject: [PATCH 106/143] Preparation for PluginConfig --- include/transport/networkplugin.h | 18 ++++++++++++++++++ plugin/cpp/networkplugin.cpp | 5 +++++ 2 files changed, 23 insertions(+) diff --git a/include/transport/networkplugin.h b/include/transport/networkplugin.h index 9a0dfb9b..9f440152 100644 --- a/include/transport/networkplugin.h +++ b/include/transport/networkplugin.h @@ -34,6 +34,22 @@ namespace Transport { /// development. class NetworkPlugin { public: + + class PluginConfig { + public: + PluginConfig() : m_needPassword(true) {} + virtual ~PluginConfig() {} + + void setNeedPassword(bool needPassword = true) { m_needPassword = needPassword; } + void setExtraFields(const std::vector &fields) { m_extraFields = fields; } + + private: + bool m_needPassword; + std::vector m_extraFields; + + friend class NetworkPlugin; + }; + /// Creates new NetworkPlugin and connects the Spectrum2 NetworkPluginServer. /// \param loop Event loop. /// \param host Host where Spectrum2 NetworkPluginServer runs. @@ -43,6 +59,8 @@ class NetworkPlugin { /// Destructor. virtual ~NetworkPlugin(); + void sendConfig(const PluginConfig &cfg); + /// Call this function when legacy network buddy changed. /// \param user XMPP JID of user for which this event occurs. You can get it from NetworkPlugin::handleLoginRequest(). (eg. "user%gmail.com@xmpp.domain.tld") /// \param buddyName Name of legacy network buddy. (eg. "user2@gmail.com") diff --git a/plugin/cpp/networkplugin.cpp b/plugin/cpp/networkplugin.cpp index 179b2f08..1b2436ca 100644 --- a/plugin/cpp/networkplugin.cpp +++ b/plugin/cpp/networkplugin.cpp @@ -60,6 +60,11 @@ NetworkPlugin::NetworkPlugin() { NetworkPlugin::~NetworkPlugin() { } +void NetworkPlugin::sendConfig(const PluginConfig &cfg) { + std::string data = "[registration]"; + data += std::string("needPassword=") + (cfg.m_needPassword ? "1" : "0"); +} + void NetworkPlugin::handleMessage(const std::string &user, const std::string &legacyName, const std::string &msg, const std::string &nickname, const std::string &xhtml) { pbnetwork::ConversationMessage m; m.set_username(user); From 10f94e5e82e4ecff7d8bd929857efdbe6531783d Mon Sep 17 00:00:00 2001 From: HanzZ Date: Mon, 9 Apr 2012 09:17:42 +0200 Subject: [PATCH 107/143] spectrum2_manager fix --- spectrum_manager/src/main.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spectrum_manager/src/main.cpp b/spectrum_manager/src/main.cpp index c22569d0..1f95a936 100644 --- a/spectrum_manager/src/main.cpp +++ b/spectrum_manager/src/main.cpp @@ -315,7 +315,7 @@ static void ask_local_servers(ManagerConfig *config, Swift::BoostNetworkFactorie } finished++; - Swift::Client *client = new Swift::Client(CONFIG_STRING(&cfg, "service.admin_jid"), CONFIG_STRING(&cfg, "service.admin_password"), &networkFactories); + Swift::Client *client = new Swift::Client(CONFIG_VECTOR(&cfg, "service.admin_jid")[0], CONFIG_STRING(&cfg, "service.admin_password"), &networkFactories); client->setAlwaysTrustCertificates(); client->onConnected.connect(boost::bind(&handleConnected, client, CONFIG_STRING(&cfg, "service.jid"))); client->onDisconnected.connect(bind(&handleDisconnected, client, _1, CONFIG_STRING(&cfg, "service.jid"))); From 996a48005b0d1d69007ecc8517ab318b9e627315 Mon Sep 17 00:00:00 2001 From: HanzZ Date: Mon, 9 Apr 2012 09:27:26 +0200 Subject: [PATCH 108/143] more fixes --- spectrum_manager/src/main.cpp | 2 +- src/userregistry.cpp | 23 ++++++++++------------- 2 files changed, 11 insertions(+), 14 deletions(-) diff --git a/spectrum_manager/src/main.cpp b/spectrum_manager/src/main.cpp index 1f95a936..1229cdb1 100644 --- a/spectrum_manager/src/main.cpp +++ b/spectrum_manager/src/main.cpp @@ -310,7 +310,7 @@ static void ask_local_servers(ManagerConfig *config, Swift::BoostNetworkFactorie std::cerr << "Can't load config file " << itr->path().string() << ". Skipping...\n"; } - if (CONFIG_STRING(&cfg, "service.admin_jid").empty() || CONFIG_STRING(&cfg, "service.admin_password").empty()) { + if (CONFIG_VECTOR(&cfg, "service.admin_jid").empty() || CONFIG_STRING(&cfg, "service.admin_password").empty()) { std::cerr << itr->path().string() << ": service.admin_jid or service.admin_password empty. This server can't be queried over XMPP.\n"; } diff --git a/src/userregistry.cpp b/src/userregistry.cpp index 265ee692..5394671d 100644 --- a/src/userregistry.cpp +++ b/src/userregistry.cpp @@ -38,19 +38,16 @@ UserRegistry::UserRegistry(Config *cfg, Swift::NetworkFactories *factories) { UserRegistry::~UserRegistry() { m_removeTimer->stop(); } void UserRegistry::isValidUserPassword(const Swift::JID& user, Swift::ServerFromClientSession *session, const Swift::SafeByteArray& password) { - -// if (!CONFIG_STRING(config, "service.admin_jid").empty() ) { - std::vector const &x = CONFIG_VECTOR(config,"service.admin_jid"); - if (std::find(x.begin(), x.end(), user.toBare().toString()) != x.end()) { - if (Swift::safeByteArrayToString(password) == CONFIG_STRING(config, "service.admin_password")) { - session->handlePasswordValid(); - } - else { - session->handlePasswordInvalid(); - } - return; - } -// } + std::vector const &x = CONFIG_VECTOR(config,"service.admin_jid"); + if (std::find(x.begin(), x.end(), user.toBare().toString()) != x.end()) { + if (Swift::safeByteArrayToString(password) == CONFIG_STRING(config, "service.admin_password")) { + session->handlePasswordValid(); + } + else { + session->handlePasswordInvalid(); + } + return; + } std::string key = user.toBare().toString(); // Users try to connect twice From 775c2a2e173c8e71745ced32e3df30cef148d694 Mon Sep 17 00:00:00 2001 From: HanzZ Date: Mon, 9 Apr 2012 09:33:14 +0200 Subject: [PATCH 109/143] fixed allowed_servers --- src/config.cpp | 2 +- src/userregistration.cpp | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/config.cpp b/src/config.cpp index b3b263ff..263a2507 100644 --- a/src/config.cpp +++ b/src/config.cpp @@ -70,7 +70,7 @@ bool Config::load(std::istream &ifs, boost::program_options::options_description ("service.protocol", value()->default_value(""), "Protocol") ("service.pidfile", value()->default_value("/var/run/spectrum2/$jid.pid"), "Full path to pid file") ("service.working_dir", value()->default_value("/var/lib/spectrum2/$jid"), "Working dir") - ("service.allowed_servers", value()->default_value(""), "Only users from these servers can connect") + ("service.allowed_servers", value >()->multitoken(), "Only users from these servers can connect") ("service.server_mode", value()->default_value(false), "True if Spectrum should behave as server") ("service.users_per_backend", value()->default_value(100), "Number of users per one legacy network backend") ("service.backend_host", value()->default_value("localhost"), "Host to bind backend server to") diff --git a/src/userregistration.cpp b/src/userregistration.cpp index 0e23217f..2be05fb2 100644 --- a/src/userregistration.cpp +++ b/src/userregistration.cpp @@ -168,7 +168,7 @@ bool UserRegistration::handleGetRequest(const Swift::JID& from, const Swift::JID std::string barejid = from.toBare().toString(); if (!CONFIG_BOOL(m_config,"registration.enable_public_registration")) { - std::list const &x = CONFIG_LIST(m_config,"service.allowed_servers"); + std::vector const &x = CONFIG_VECTOR(m_config,"service.allowed_servers"); if (std::find(x.begin(), x.end(), from.getDomain()) == x.end()) { LOG4CXX_INFO(logger, barejid << ": This user has no permissions to register an account") sendError(from, id, ErrorPayload::BadRequest, ErrorPayload::Modify); @@ -275,7 +275,7 @@ bool UserRegistration::handleSetRequest(const Swift::JID& from, const Swift::JID std::string barejid = from.toBare().toString(); if (!CONFIG_BOOL(m_config,"registration.enable_public_registration")) { - std::list const &x = CONFIG_LIST(m_config,"service.allowed_servers"); + std::vector const &x = CONFIG_VECTOR(m_config,"service.allowed_servers"); if (std::find(x.begin(), x.end(), from.getDomain()) == x.end()) { LOG4CXX_INFO(logger, barejid << ": This user has no permissions to register an account") sendError(from, id, ErrorPayload::BadRequest, ErrorPayload::Modify); From ad2735a27657a4cc9b906b7d047b7f3a6090b86d Mon Sep 17 00:00:00 2001 From: Jan Kaluza Date: Tue, 10 Apr 2012 10:13:22 +0200 Subject: [PATCH 110/143] Fixed config.cpp compilation issues --- src/config.cpp | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/config.cpp b/src/config.cpp index 263a2507..9672f00d 100644 --- a/src/config.cpp +++ b/src/config.cpp @@ -27,10 +27,16 @@ #define PATH_MAX MAX_PATH #endif +#include "iostream" +#include "boost/version.hpp" + +#define BOOST_MAJOR_VERSION BOOST_VERSION / 100000 +#define BOOST_MINOR_VERSION BOOST_VERSION / 100 % 1000 + using namespace boost::program_options; namespace Transport { -int getRandomPort(const std::string &s) { +static int getRandomPort(const std::string &s) { unsigned long r = 0; BOOST_FOREACH(char c, s) { r += (int) c; @@ -199,7 +205,11 @@ bool Config::load(const std::string &configfile, const std::string &jid) { options_description opts("Transport options"); return load(configfile, opts, jid); } catch ( const boost::program_options::multiple_occurrences& e ) { +#if (BOOST_MAJOR_VERSION >= 1 && BOOST_MINOR_VERSION >= 42) std::cerr << configfile << " parsing error: " << e.what() << " from option: " << e.get_option_name() << std::endl; +#else + std::cerr << configfile << " parsing error: " << e.what() << std::endl; +#endif return false; } } From 592c3ab0d88f0e269a133415ec7e31ff07eafd98 Mon Sep 17 00:00:00 2001 From: HanzZ Date: Tue, 10 Apr 2012 10:19:07 +0200 Subject: [PATCH 111/143] purple_defs and windows loader generator --- CMakeLists.txt | 4 +- backends/libpurple/gen_dynamic_purple.py | 165 +++++++++++++++++++++++ backends/libpurple/geventloop.cpp | 2 + backends/libpurple/main.cpp | 4 + backends/libpurple/purple_defs.cpp | 5 + backends/libpurple/purple_defs.h | 3 + backends/libpurple/utils.cpp | 2 + 7 files changed, 183 insertions(+), 2 deletions(-) create mode 100644 backends/libpurple/gen_dynamic_purple.py create mode 100644 backends/libpurple/purple_defs.cpp create mode 100644 backends/libpurple/purple_defs.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 9ded7aba..1b5d98ba 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -31,10 +31,10 @@ set(event_DIR "${CMAKE_SOURCE_DIR}/cmake_modules") find_package(event) set(Swiften_DIR "${CMAKE_SOURCE_DIR}/cmake_modules") -find_package(Swiften REQUIRED) +find_package(Swiften) set(openssl_DIR "${CMAKE_SOURCE_DIR}/cmake_modules") -find_package(openssl REQUIRED) +find_package(openssl) set(Boost_DIR "${CMAKE_SOURCE_DIR}/cmake_modules") if (WIN32) diff --git a/backends/libpurple/gen_dynamic_purple.py b/backends/libpurple/gen_dynamic_purple.py new file mode 100644 index 00000000..eea3341b --- /dev/null +++ b/backends/libpurple/gen_dynamic_purple.py @@ -0,0 +1,165 @@ +import sys +import os + +methods = [] +definitions = [] + +if len(sys.argv) != 2: + print "Usage:", sys.argv[0], "" + sys.exit(1) + + +def handle_file(cpp): + global methods + + new_file = "" + f = open(cpp, "r") + for line in f.readlines(): + new_line = "" + index = 0 + while index < len(line): + new_line += line[index] + if line[index:].startswith("purple_") or line[index:].startswith("wpurple_"): + if line[index:].find("=") != -1 and line[index:].find("=") < line[index:].find("("): + index += 1 + continue + if line[index-1] == "_" or line[index:].find("(") == -1: + index += 1 + continue + m = line[index:line[index:].find("(")+index] + new_line += m[1:] + "_wrapped(" + index += len(m) + if not m in methods and len(m) != 0: + methods += [m + "("] + index += 1 + new_file += new_line + f.close() + return new_file + +def handle_header(header, method): + global definitions + + f = open(os.path.join(sys.argv[1], header), "r") + + lines = f.readlines() + for i in range(len(lines)): + line = lines[i] + if line.find(method) != -1: + m = line[:-1] + l = unicode(m).strip() + if l.endswith(")"): + continue + + index = i; + while not m.endswith(";"): + index += 1 + m += " " + lines[index][:-1].lstrip() + + l = unicode(m).strip() + if (l.startswith("#") or l.startswith("*") or l.startswith("/*") or l.count("***") != 0 or l.count("&&") != 0 + or l.endswith(")")): + continue; + + if not m in definitions: + definitions += [m] + break + f.close() + +def get_raw_args(d): + return d[d.find("(")+1:-2] + +def get_args(d): + x = d[d.find("(")+1:-2] + x = x.split(",") + + args = [] + for arg in x: + y = arg.split(" ") + if len(y) == 1: + continue + args += [y[-1].replace("*", "")] + + return args + +def get_name(d): + x = d[:d.find("(")+1].lstrip() + return x[x.find("purple_"):] + +def get_rtype(d): + return d[:d.find("purple_") - 1].lstrip() + +def output(): + global definitions + + header = open("purple_defs.h", "w") + print >> header, "#pragma once" + print >> header, "#ifdef WIN32" + + for d in definitions: + #typedef void (WINAPI * purple_util_set_user_wrapped_func)(const char *dir); + print >> header, "typedef", get_rtype(d), "(WINAPI *", get_name(d)[:-1] + "spectrum_fnc)(" + get_raw_args(d) + ");" + #extern purple_util_set_user_wrapped_func purple_util_set_user_wrapped; + print >> header, "extern", get_name(d)[:-1] + "_wrapped_fnc", get_name(d)[:-1] + "_wrapped;" + print >> header, "" + + print >> header, "" + print >> header, "#else" + print >> header, "" + for d in definitions: + #define purple_util_set_user_wrapped purple_util_set_user + print >> header, "#define", get_name(d)[:-1] + "_wrapped", get_name(d)[:-1] + + print >> header, "#endif" + print >> header, "" + print >> header, "bool resolvePurpleFunctions();" + print >> header, "" + + + cpp = open("purple_defs.cpp", "w") + print >> cpp, "#include \"purple_defs.h\"" + print >> cpp, "" + print >> cpp, "#ifdef WIN32" + print >> cpp, "static HMODULE f_hPurple = NULL;" + for d in definitions: + #purple_util_set_user_wrapped_fnc purple_util_set_user_wrapped = NULL; + print >> cpp, get_name(d)[:-1] + "_wrapped_fnc", get_name(d)[:-1] + "_wrapped = NULL;" + + print >> cpp, "#endif" + + print >> cpp, "bool resolvePurpleFunctions() {" + print >> cpp, "#ifdef WIN32" + print >> cpp, "\tf_hPurple = LoadLibrary(\"libpurple.dll\");" + print >> cpp, "\tif (!f_hPurple)" + print >> cpp, "\t\t\treturn false;" + for d in definitions: + #purple_util_set_user_wrapped = (purple_util_set_user_wrapped_func)GetProcAddress(f_hPurple, "purple_util_set_user_dir"); + print >> cpp, "\t" + get_name(d)[:-1] + "_wrapped = (" + get_name(d)[:-1] + "_wrapped_fnc)GetProcAddress(f_hPurple, \"" + get_name(d)[:-1] + "\");" + #if (!purple_util_set_user_wrapped) + print >> cpp, "\tif (!" + get_name(d)[:-1] + "_wrapped)" + print >> cpp, "\t\treturn false"; + print >> cpp, "" + print >> cpp, "#endif" + + print >> cpp, "\treturn true;" + print >> cpp, "}" + print >> cpp, "" + + cpp.close() + header.close() + + +for f in os.listdir("."): + if not f.endswith(".cpp") or f.startswith("purple_defs"): + continue + new_file = handle_file(f) + fd = open(f, "w") + fd.write(new_file) + fd.close() + +for f in os.listdir(sys.argv[1]): + if not f.endswith(".h"): + continue + for m in methods: + handle_header(f, m) + +output() diff --git a/backends/libpurple/geventloop.cpp b/backends/libpurple/geventloop.cpp index 1dacea40..a603955f 100644 --- a/backends/libpurple/geventloop.cpp +++ b/backends/libpurple/geventloop.cpp @@ -28,6 +28,8 @@ #include "event.h" #endif +#include "purple_defs.h + #include "transport/logging.h" DEFINE_LOGGER(logger, "EventLoop"); diff --git a/backends/libpurple/main.cpp b/backends/libpurple/main.cpp index 938c7113..e3d0f7e4 100644 --- a/backends/libpurple/main.cpp +++ b/backends/libpurple/main.cpp @@ -27,6 +27,8 @@ #define getpid _getpid #endif +#include "purple_defs.h" + DEFINE_LOGGER(logger_libpurple, "libpurple"); DEFINE_LOGGER(logger, "backend"); @@ -1516,6 +1518,8 @@ static void gotAttention(PurpleAccount *account, const char *who, PurpleConversa static bool initPurple() { bool ret; + resolvePurpleFunctions(); + purple_util_set_user_dir("./"); remove("./accounts.xml"); remove("./blist.xml"); diff --git a/backends/libpurple/purple_defs.cpp b/backends/libpurple/purple_defs.cpp new file mode 100644 index 00000000..c6df1b68 --- /dev/null +++ b/backends/libpurple/purple_defs.cpp @@ -0,0 +1,5 @@ +#include "purple_defs.h" +bool resolvePurpleFunctions() { + return true; +} + diff --git a/backends/libpurple/purple_defs.h b/backends/libpurple/purple_defs.h new file mode 100644 index 00000000..3058786c --- /dev/null +++ b/backends/libpurple/purple_defs.h @@ -0,0 +1,3 @@ +#pragma once + +bool resolvePurpleFunctions(); diff --git a/backends/libpurple/utils.cpp b/backends/libpurple/utils.cpp index 76759798..574e9874 100644 --- a/backends/libpurple/utils.cpp +++ b/backends/libpurple/utils.cpp @@ -47,6 +47,8 @@ #include "win32/win32dep.h" #endif +#include "purple_defs.h" + static GHashTable *ui_info = NULL; void execute_purple_plugin_action(PurpleConnection *gc, const std::string &name) { From 6e8ae7e0375a5d32fc9e8b2a875952798b60b774 Mon Sep 17 00:00:00 2001 From: HanzZ Date: Tue, 10 Apr 2012 10:20:26 +0200 Subject: [PATCH 112/143] fixed include --- backends/libpurple/geventloop.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backends/libpurple/geventloop.cpp b/backends/libpurple/geventloop.cpp index a603955f..bccf4b38 100644 --- a/backends/libpurple/geventloop.cpp +++ b/backends/libpurple/geventloop.cpp @@ -28,7 +28,7 @@ #include "event.h" #endif -#include "purple_defs.h +#include "purple_defs.h" #include "transport/logging.h" From 7c7da424b6e421abd1f003dce2b5c840a549c6ca Mon Sep 17 00:00:00 2001 From: HanzZ Date: Tue, 10 Apr 2012 10:20:40 +0200 Subject: [PATCH 113/143] fixed include --- backends/libpurple/gen_dynamic_purple.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backends/libpurple/gen_dynamic_purple.py b/backends/libpurple/gen_dynamic_purple.py index eea3341b..71d03e49 100644 --- a/backends/libpurple/gen_dynamic_purple.py +++ b/backends/libpurple/gen_dynamic_purple.py @@ -5,7 +5,7 @@ methods = [] definitions = [] if len(sys.argv) != 2: - print "Usage:", sys.argv[0], "" + print "Usage:", sys.argv[0], "" sys.exit(1) From c178e4daa301f053d0561a4e9855d6b1ad685a4a Mon Sep 17 00:00:00 2001 From: HanzZ Date: Tue, 10 Apr 2012 10:22:45 +0200 Subject: [PATCH 114/143] show error message when libpurple.dll can't be loaded --- backends/libpurple/main.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/backends/libpurple/main.cpp b/backends/libpurple/main.cpp index e3d0f7e4..09e1b6f7 100644 --- a/backends/libpurple/main.cpp +++ b/backends/libpurple/main.cpp @@ -1518,7 +1518,10 @@ static void gotAttention(PurpleAccount *account, const char *who, PurpleConversa static bool initPurple() { bool ret; - resolvePurpleFunctions(); + if (!resolvePurpleFunctions()) { + LOG4CXX_ERROR(logger, "Unable to load libpurple.dll or some of the needed methods"); + return false; + } purple_util_set_user_dir("./"); remove("./accounts.xml"); From 9d96506fce9e736e3e41ae5bbb1668088e4e5c8c Mon Sep 17 00:00:00 2001 From: HanzZ Date: Tue, 10 Apr 2012 10:29:18 +0200 Subject: [PATCH 115/143] show error message when libpurple.dll can't be loaded --- backends/libpurple/gen_dynamic_purple.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/backends/libpurple/gen_dynamic_purple.py b/backends/libpurple/gen_dynamic_purple.py index 71d03e49..34cae5a2 100644 --- a/backends/libpurple/gen_dynamic_purple.py +++ b/backends/libpurple/gen_dynamic_purple.py @@ -1,7 +1,9 @@ import sys import os -methods = [] +# intialize for methods used in libpurple macros +methods = ["purple_connection_get_state", "purple_conversation_get_im_data", + "purple_conversation_get_chat_data"] definitions = [] if len(sys.argv) != 2: From ac88ee23b0cfc247183566f7e8dd88313a40a474 Mon Sep 17 00:00:00 2001 From: HanzZ Date: Tue, 10 Apr 2012 10:35:48 +0200 Subject: [PATCH 116/143] Fixed typo --- backends/libpurple/gen_dynamic_purple.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/backends/libpurple/gen_dynamic_purple.py b/backends/libpurple/gen_dynamic_purple.py index 34cae5a2..0a5c8359 100644 --- a/backends/libpurple/gen_dynamic_purple.py +++ b/backends/libpurple/gen_dynamic_purple.py @@ -2,8 +2,8 @@ import sys import os # intialize for methods used in libpurple macros -methods = ["purple_connection_get_state", "purple_conversation_get_im_data", - "purple_conversation_get_chat_data"] +methods = ["purple_connection_get_state(", "purple_conversation_get_im_data(", + "purple_conversation_get_chat_data("] definitions = [] if len(sys.argv) != 2: @@ -99,7 +99,7 @@ def output(): for d in definitions: #typedef void (WINAPI * purple_util_set_user_wrapped_func)(const char *dir); - print >> header, "typedef", get_rtype(d), "(WINAPI *", get_name(d)[:-1] + "spectrum_fnc)(" + get_raw_args(d) + ");" + print >> header, "typedef", get_rtype(d), "(WINAPI *", get_name(d)[:-1] + "_wrapped_fnc)(" + get_raw_args(d) + ");" #extern purple_util_set_user_wrapped_func purple_util_set_user_wrapped; print >> header, "extern", get_name(d)[:-1] + "_wrapped_fnc", get_name(d)[:-1] + "_wrapped;" print >> header, "" @@ -158,6 +158,7 @@ for f in os.listdir("."): fd.write(new_file) fd.close() +print methods for f in os.listdir(sys.argv[1]): if not f.endswith(".h"): continue From dea27821a7e87ad8432ecfbb95f496ccbba2113e Mon Sep 17 00:00:00 2001 From: HanzZ Date: Tue, 10 Apr 2012 10:51:12 +0200 Subject: [PATCH 117/143] Show methods which are not found + find also win32dep.h methods --- backends/libpurple/gen_dynamic_purple.py | 31 +++++++++++++++++++++--- 1 file changed, 28 insertions(+), 3 deletions(-) diff --git a/backends/libpurple/gen_dynamic_purple.py b/backends/libpurple/gen_dynamic_purple.py index 0a5c8359..b68d24d8 100644 --- a/backends/libpurple/gen_dynamic_purple.py +++ b/backends/libpurple/gen_dynamic_purple.py @@ -13,6 +13,10 @@ if len(sys.argv) != 2: def handle_file(cpp): global methods + sys.stdout.write("getting used methods in " + cpp + ": ") + sys.stdout.flush() + + counter = 0 new_file = "" f = open(cpp, "r") @@ -25,17 +29,20 @@ def handle_file(cpp): if line[index:].find("=") != -1 and line[index:].find("=") < line[index:].find("("): index += 1 continue - if line[index-1] == "_" or line[index:].find("(") == -1: + if line[index-1] == "_" or line[index:].find("(") == -1 or line[index:].startswith("purple_commands_init"): index += 1 continue m = line[index:line[index:].find("(")+index] new_line += m[1:] + "_wrapped(" index += len(m) - if not m in methods and len(m) != 0: + if not m + "(" in methods and len(m) != 0: methods += [m + "("] + counter += 1 index += 1 new_file += new_line f.close() + + print counter, "new methods found" return new_file def handle_header(header, method): @@ -63,6 +70,7 @@ def handle_header(header, method): continue; if not m in definitions: + print "found", method[:-1], "in", header definitions += [m] break f.close() @@ -154,15 +162,32 @@ for f in os.listdir("."): if not f.endswith(".cpp") or f.startswith("purple_defs"): continue new_file = handle_file(f) + + print "updating", f fd = open(f, "w") fd.write(new_file) fd.close() -print methods for f in os.listdir(sys.argv[1]): if not f.endswith(".h"): continue for m in methods: handle_header(f, m) +sys.argv[1] = sys.argv[1] + "/win32" +for f in os.listdir(sys.argv[1]): + if not f.endswith(".h"): + continue + for m in methods: + handle_header(f, m) + +for m in methods: + found = False + for d in definitions: + if d.find(m[:-1]) != -1: + found = True + break + if not found: + print "NOT FOUND:", m + output() From b3cdfe561929520e7f14580b236c6a65e69be028 Mon Sep 17 00:00:00 2001 From: HanzZ Date: Tue, 10 Apr 2012 11:05:09 +0200 Subject: [PATCH 118/143] fixed return types --- backends/libpurple/gen_dynamic_purple.py | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/backends/libpurple/gen_dynamic_purple.py b/backends/libpurple/gen_dynamic_purple.py index b68d24d8..e4cb8274 100644 --- a/backends/libpurple/gen_dynamic_purple.py +++ b/backends/libpurple/gen_dynamic_purple.py @@ -59,6 +59,13 @@ def handle_header(header, method): if l.endswith(")"): continue + if m.find("/*") > m.find(";"): + m = m[:m.find("/*")] + m.rstrip() + if len(m) != 0: + while m[-1] == " ": + m = m[:-1] + index = i; while not m.endswith(";"): index += 1 @@ -93,10 +100,14 @@ def get_args(d): def get_name(d): x = d[:d.find("(")+1].lstrip() + if x.find("wpurple_") != -1: + return x[x.find("wpurple_"):] return x[x.find("purple_"):] def get_rtype(d): - return d[:d.find("purple_") - 1].lstrip() + if d.find("wpurple_") != -1: + return d[:d.find("wpurple_")].lstrip() + return d[:d.find("purple_")].lstrip() def output(): global definitions From 839ddcee857dc1c3f7a12486aa3e4862cb6c22b9 Mon Sep 17 00:00:00 2001 From: HanzZ Date: Tue, 10 Apr 2012 18:38:27 +0200 Subject: [PATCH 119/143] print groups in backend log --- backends/libpurple/main.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/backends/libpurple/main.cpp b/backends/libpurple/main.cpp index 09e1b6f7..c02b7786 100644 --- a/backends/libpurple/main.cpp +++ b/backends/libpurple/main.cpp @@ -791,7 +791,8 @@ static void buddyListNewNode(PurpleBlistNode *node) { PurpleBuddy *buddy = (PurpleBuddy *) node; PurpleAccount *account = purple_buddy_get_account(buddy); - LOG4CXX_INFO(logger, "Buddy updated " << np->m_accounts[account] << " " << purple_buddy_get_name(buddy) << " " << getAlias(buddy)); + std::vector groups = getGroups(buddy); + LOG4CXX_INFO(logger, "Buddy updated " << np->m_accounts[account] << " " << purple_buddy_get_name(buddy) << " " << getAlias(buddy) << " group=" << groups[0]); // Status pbnetwork::StatusType status = pbnetwork::STATUS_NONE; From ee4e5ecb71cc6dc788543189ccc2195b5c885f8c Mon Sep 17 00:00:00 2001 From: HanzZ Date: Tue, 10 Apr 2012 18:49:40 +0200 Subject: [PATCH 120/143] send roster push on group change --- include/transport/localbuddy.h | 7 +------ src/localbuddy.cpp | 20 ++++++++++++++++++++ 2 files changed, 21 insertions(+), 6 deletions(-) diff --git a/include/transport/localbuddy.h b/include/transport/localbuddy.h index 16bf12c1..492a3c70 100644 --- a/include/transport/localbuddy.h +++ b/include/transport/localbuddy.h @@ -59,12 +59,7 @@ class LocalBuddy : public Buddy { } std::vector getGroups() { return m_groups; } - void setGroups(const std::vector &groups) { - bool changed = m_groups.size() != groups.size(); - m_groups = groups; - if (changed) - getRosterManager()->storeBuddy(this); - } + void setGroups(const std::vector &groups); private: std::string m_name; diff --git a/src/localbuddy.cpp b/src/localbuddy.cpp index 55f7e27c..6d8d7530 100644 --- a/src/localbuddy.cpp +++ b/src/localbuddy.cpp @@ -48,4 +48,24 @@ void LocalBuddy::setAlias(const std::string &alias) { } } +void LocalBuddy::setGroups(const std::vector &groups) { + bool changed = m_groups.size() != groups.size(); + if (!changed) { + for (int i = 0; i != m_groups.size(); i++) { + if (m_groups[i] != groups[i]) { + changed = true; + break; + } + } + } + + m_groups = groups; + if (changed) { + if (getRosterManager()->getUser()->getComponent()->inServerMode() || getRosterManager()->isRemoteRosterSupported()) { + getRosterManager()->sendBuddyRosterPush(this); + } + getRosterManager()->storeBuddy(this); + } +} + } From 2faab40fad47daafe003356e5bc72d4633c61e0c Mon Sep 17 00:00:00 2001 From: HanzZ Date: Tue, 10 Apr 2012 19:01:09 +0200 Subject: [PATCH 121/143] Fixed return values --- backends/libpurple/gen_dynamic_purple.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/backends/libpurple/gen_dynamic_purple.py b/backends/libpurple/gen_dynamic_purple.py index e4cb8274..bebfad8c 100644 --- a/backends/libpurple/gen_dynamic_purple.py +++ b/backends/libpurple/gen_dynamic_purple.py @@ -54,6 +54,8 @@ def handle_header(header, method): for i in range(len(lines)): line = lines[i] if line.find(method) != -1: + if line.startswith(method): + line = lines[i-1][:-1] + line m = line[:-1] l = unicode(m).strip() if l.endswith(")"): @@ -76,6 +78,8 @@ def handle_header(header, method): or l.endswith(")")): continue; + m = m.replace("G_GNUC_NULL_TERMINATE", "") + if not m in definitions: print "found", method[:-1], "in", header definitions += [m] From 036b2a30b94cb92089779c28c2388b8c46fef36d Mon Sep 17 00:00:00 2001 From: HanzZ Date: Tue, 10 Apr 2012 19:32:51 +0200 Subject: [PATCH 122/143] script fix --- backends/libpurple/gen_dynamic_purple.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backends/libpurple/gen_dynamic_purple.py b/backends/libpurple/gen_dynamic_purple.py index bebfad8c..6bd81d12 100644 --- a/backends/libpurple/gen_dynamic_purple.py +++ b/backends/libpurple/gen_dynamic_purple.py @@ -161,7 +161,7 @@ def output(): print >> cpp, "\t" + get_name(d)[:-1] + "_wrapped = (" + get_name(d)[:-1] + "_wrapped_fnc)GetProcAddress(f_hPurple, \"" + get_name(d)[:-1] + "\");" #if (!purple_util_set_user_wrapped) print >> cpp, "\tif (!" + get_name(d)[:-1] + "_wrapped)" - print >> cpp, "\t\treturn false"; + print >> cpp, "\t\treturn false;" print >> cpp, "" print >> cpp, "#endif" From c44d57135100cb7e86e6666998be580c572992c9 Mon Sep 17 00:00:00 2001 From: Jan Kaluza Date: Wed, 11 Apr 2012 09:16:56 +0200 Subject: [PATCH 123/143] Send backend config --- plugin/cpp/networkplugin.cpp | 16 +++++++++++++++- src/userregistry.cpp | 4 ++-- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/plugin/cpp/networkplugin.cpp b/plugin/cpp/networkplugin.cpp index 1b2436ca..c6d52eb7 100644 --- a/plugin/cpp/networkplugin.cpp +++ b/plugin/cpp/networkplugin.cpp @@ -62,7 +62,21 @@ NetworkPlugin::~NetworkPlugin() { void NetworkPlugin::sendConfig(const PluginConfig &cfg) { std::string data = "[registration]"; - data += std::string("needPassword=") + (cfg.m_needPassword ? "1" : "0"); + data += std::string("needPassword=") + (cfg.m_needPassword ? "1" : "0") + "\n"; + + for (std::vector::const_iterator it = cfg.m_extraFields.begin(); it != cfg.m_extraFields.end(); it++) { + data += std::string("extraField=") + (*it) + "\n"; + } + + pbnetwork::BackendConfig m; + m.set_config(data); + + std::string message; + m.SerializeToString(&message); + + WRAP(message, pbnetwork::WrapperMessage_Type_TYPE_BACKEND_CONFIG); + + send(message); } void NetworkPlugin::handleMessage(const std::string &user, const std::string &legacyName, const std::string &msg, const std::string &nickname, const std::string &xhtml) { diff --git a/src/userregistry.cpp b/src/userregistry.cpp index 5394671d..8d8a3975 100644 --- a/src/userregistry.cpp +++ b/src/userregistry.cpp @@ -41,10 +41,10 @@ void UserRegistry::isValidUserPassword(const Swift::JID& user, Swift::ServerFrom std::vector const &x = CONFIG_VECTOR(config,"service.admin_jid"); if (std::find(x.begin(), x.end(), user.toBare().toString()) != x.end()) { if (Swift::safeByteArrayToString(password) == CONFIG_STRING(config, "service.admin_password")) { - session->handlePasswordValid(); + session->handlePasswordValid(); } else { - session->handlePasswordInvalid(); + session->handlePasswordInvalid(); } return; } From fcb7bd6acdd3b88f1e528cc7b2613eff5b76b87f Mon Sep 17 00:00:00 2001 From: HanzZ Date: Wed, 11 Apr 2012 16:26:35 +0200 Subject: [PATCH 124/143] More debug --- backends/libpurple/main.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backends/libpurple/main.cpp b/backends/libpurple/main.cpp index c02b7786..13e1c022 100644 --- a/backends/libpurple/main.cpp +++ b/backends/libpurple/main.cpp @@ -792,7 +792,7 @@ static void buddyListNewNode(PurpleBlistNode *node) { PurpleAccount *account = purple_buddy_get_account(buddy); std::vector groups = getGroups(buddy); - LOG4CXX_INFO(logger, "Buddy updated " << np->m_accounts[account] << " " << purple_buddy_get_name(buddy) << " " << getAlias(buddy) << " group=" << groups[0]); + LOG4CXX_INFO(logger, "Buddy updated " << np->m_accounts[account] << " " << purple_buddy_get_name(buddy) << " " << getAlias(buddy) << " group (" << groups.size() << ")=" << groups[0]); // Status pbnetwork::StatusType status = pbnetwork::STATUS_NONE; From 9d5e0793e01107d3641b640148ea79e4673990ef Mon Sep 17 00:00:00 2001 From: HanzZ Date: Wed, 11 Apr 2012 17:37:42 +0200 Subject: [PATCH 125/143] Find communi in QT_LIBRARY_DIR --- cmake_modules/CommuniConfig.cmake | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/cmake_modules/CommuniConfig.cmake b/cmake_modules/CommuniConfig.cmake index 7f803847..436ad61e 100644 --- a/cmake_modules/CommuniConfig.cmake +++ b/cmake_modules/CommuniConfig.cmake @@ -1,5 +1,8 @@ -FIND_LIBRARY(IRC_LIBRARY NAMES Communi) -FIND_PATH(IRC_INCLUDE_DIR NAMES "ircglobal.h" PATH_SUFFIXES Communi qt4/Communi ) +find_package(Qt4 REQUIRED) +include( ${QT_USE_FILE} ) + +FIND_LIBRARY(IRC_LIBRARY NAMES Communi PATHS ${QT_LIBRARY_DIR}) +FIND_PATH(IRC_INCLUDE_DIR NAMES "ircglobal.h" PATHS ${QT_INCLUDE_DIR} PATH_SUFFIXES Communi) # message( STATUS ${IRC_LIBRARY}) if( IRC_LIBRARY AND IRC_INCLUDE_DIR ) From 64a0ece8d3f521b364a4521c67e6fa55222e5943 Mon Sep 17 00:00:00 2001 From: HanzZ Date: Wed, 11 Apr 2012 17:59:19 +0200 Subject: [PATCH 126/143] Do not treat transport contact as buddy --- src/rostermanager.cpp | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/rostermanager.cpp b/src/rostermanager.cpp index 81a453de..cdb13dbc 100644 --- a/src/rostermanager.cpp +++ b/src/rostermanager.cpp @@ -232,7 +232,10 @@ void RosterManager::handleRemoteRosterResponse(boost::shared_ptrgetFactory()->createBuddy(this, buddyInfo); setBuddy(buddy); @@ -291,6 +295,10 @@ void RosterManager::sendRIE() { void RosterManager::handleSubscription(Swift::Presence::ref presence) { std::string legacyName = Buddy::JIDToLegacyName(presence->getTo()); + if (legacyName.empty()) { + return; + } + // For server mode the subscription changes are handler in rosterresponder.cpp // using roster pushes. if (m_component->inServerMode()) { From 863966d10a2b65ec2d551c9ab41810022f7774bd Mon Sep 17 00:00:00 2001 From: HanzZ Date: Wed, 11 Apr 2012 20:40:50 +0200 Subject: [PATCH 127/143] Fixed out-of-source build again --- plugin/python/CMakeLists.txt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/plugin/python/CMakeLists.txt b/plugin/python/CMakeLists.txt index c851b4fd..7b5fd03e 100644 --- a/plugin/python/CMakeLists.txt +++ b/plugin/python/CMakeLists.txt @@ -2,12 +2,12 @@ cmake_minimum_required(VERSION 2.6) if (PROTOBUF_FOUND) ADD_CUSTOM_COMMAND( - OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/protocol_pb2.py - COMMAND ${PROTOBUF_PROTOC_EXECUTABLE} --python_out ${CMAKE_CURRENT_BINARY_DIR} --proto_path ${CMAKE_CURRENT_BINARY_DIR}/../../include/transport/ ${CMAKE_CURRENT_BINARY_DIR}/../../include/transport/protocol.proto + OUTPUT ${CMAKE_CURRENT_SOURCE_DIR}/protocol_pb2.py + COMMAND ${PROTOBUF_PROTOC_EXECUTABLE} --python_out ${CMAKE_CURRENT_SOURCE_DIR} --proto_path ${CMAKE_CURRENT_SOURCE_DIR}/../../include/transport/ ${CMAKE_CURRENT_SOURCE_DIR}/../../include/transport/protocol.proto COMMENT "Running Python protocol buffer compiler on protocol.proto" - DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/../../include/transport/protocol.proto + DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/../../include/transport/protocol.proto ) - ADD_CUSTOM_TARGET(pb-python ALL DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/protocol_pb2.py) + ADD_CUSTOM_TARGET(pb-python ALL DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/protocol_pb2.py) endif() From 3a3d4bad5198f6288ac9282f8988c53c25f0ced4 Mon Sep 17 00:00:00 2001 From: HanzZ Date: Wed, 11 Apr 2012 21:13:52 +0200 Subject: [PATCH 128/143] Changelog --- ChangeLog | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/ChangeLog b/ChangeLog index 9d973b38..9ef83b48 100644 --- a/ChangeLog +++ b/ChangeLog @@ -4,10 +4,15 @@ Version 2.0.0-beta3 (2012-XX-XX): example when path to backend binary is not found). * Update buddies in database only when it's needed and do not execute useless database statements. + * Send roster changes also when buddy's group change. + * Fixed bug when transport contact we in all groups. * Answer to disco#info IQ with proper node (#206). * Set SQLite3 as default database backend. * Fixed disconnecting from server caused by sending VCard response with bad "from" attribute. + * Added Munin plugin (Thanks to Askovpen). + * Added support for more admin_jid JIDs (Thanks to Askovpen). + * Fixed allowed_servers option. Libpurple: * prpl-gg: Fetch the contact list properly (#252). From 6a998310e0e8b5fe172d5fbd9d745a39e2987aa8 Mon Sep 17 00:00:00 2001 From: HanzZ Date: Wed, 11 Apr 2012 22:15:50 +0200 Subject: [PATCH 129/143] Find serv_ --- backends/libpurple/gen_dynamic_purple.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/backends/libpurple/gen_dynamic_purple.py b/backends/libpurple/gen_dynamic_purple.py index 6bd81d12..9f7f9cc0 100644 --- a/backends/libpurple/gen_dynamic_purple.py +++ b/backends/libpurple/gen_dynamic_purple.py @@ -25,11 +25,11 @@ def handle_file(cpp): index = 0 while index < len(line): new_line += line[index] - if line[index:].startswith("purple_") or line[index:].startswith("wpurple_"): + if line[index:].startswith("purple_") or line[index:].startswith("wpurple_") or line[index:].startswith("serv_"): if line[index:].find("=") != -1 and line[index:].find("=") < line[index:].find("("): index += 1 continue - if line[index-1] == "_" or line[index:].find("(") == -1 or line[index:].startswith("purple_commands_init"): + if line[index-1] == "_" or line[index:].find("(") == -1 or line[index:].startswith("purple_commands_init") or line[index:].startswith("serv_addr"): index += 1 continue m = line[index:line[index:].find("(")+index] @@ -106,11 +106,15 @@ def get_name(d): x = d[:d.find("(")+1].lstrip() if x.find("wpurple_") != -1: return x[x.find("wpurple_"):] + if x.find("serv_") != -1: + return x[x.find("serv_"):] return x[x.find("purple_"):] def get_rtype(d): if d.find("wpurple_") != -1: return d[:d.find("wpurple_")].lstrip() + if d.find("serv_") != -1: + return d[:d.find("serv_")].lstrip() return d[:d.find("purple_")].lstrip() def output(): From 2cd71973b48e71430284d1cc234556e66fe4aa2f Mon Sep 17 00:00:00 2001 From: Sarang Bharadwaj Date: Thu, 12 Apr 2012 01:55:47 +0530 Subject: [PATCH 130/143] Added code to throw handle errors during Server creation --- include/transport/transport.h | 2 ++ src/transport.cpp | 16 ++++++++++++++++ 2 files changed, 18 insertions(+) diff --git a/include/transport/transport.h b/include/transport/transport.h index 4a875754..3d81307f 100644 --- a/include/transport/transport.h +++ b/include/transport/transport.h @@ -37,6 +37,7 @@ #include "transport/config.h" #include "transport/factory.h" #include "transport/presenceoracle.h" +#include namespace Transport { // typedef enum { CLIENT_FEATURE_ROSTERX = 2, @@ -165,6 +166,7 @@ namespace Transport { private: void handleConnected(); void handleConnectionError(const Swift::ComponentError &error); + void handleServerStopped(boost::optional e); void handlePresence(Swift::Presence::ref presence); void handleDataRead(const Swift::SafeByteArray &data); void handleDataWritten(const Swift::SafeByteArray &data); diff --git a/src/transport.cpp b/src/transport.cpp index d32bad70..80e086a4 100644 --- a/src/transport.cpp +++ b/src/transport.cpp @@ -203,6 +203,11 @@ void Component::start() { else if (m_server) { LOG4CXX_INFO(logger, "Starting component in server mode on port " << CONFIG_INT(m_config, "service.port")); m_server->start(); + + //Type casting to BoostConnectionServer since onStopped signal is not defined in ConnectionServer + //Ideally, onStopped must be defined in ConnectionServer + boost::dynamic_pointer_cast(m_server->getConnectionServer())->onStopped.connect(boost::bind(&Component::handleServerStopped, this, _1)); + // We're connected right here, because we're in server mode... handleConnected(); } @@ -226,6 +231,17 @@ void Component::handleConnected() { m_reconnectCount = 0; } +void Component::handleServerStopped(boost::optional e) { + if(e != NULL ) { + if(*e == Swift::BoostConnectionServer::Conflict) + LOG4CXX_INFO(logger, "Port "<< CONFIG_INT(m_config, "service.port") << " already in use! Stopping server.."); + if(*e == Swift::BoostConnectionServer::UnknownError) + LOG4CXX_INFO(logger, "Unknown error occured! Stopping server.."); + exit(1); + } +} + + void Component::handleConnectionError(const ComponentError &error) { onConnectionError(error); // if (m_reconnectCount == 2) From 2b834d16abc8fd98eff91519031fdabcef7b359c Mon Sep 17 00:00:00 2001 From: Sarang Bharadwaj Date: Thu, 12 Apr 2012 01:55:47 +0530 Subject: [PATCH 131/143] Added code to handle errors during Server creation --- include/transport/transport.h | 2 ++ src/transport.cpp | 16 ++++++++++++++++ 2 files changed, 18 insertions(+) diff --git a/include/transport/transport.h b/include/transport/transport.h index 4a875754..3d81307f 100644 --- a/include/transport/transport.h +++ b/include/transport/transport.h @@ -37,6 +37,7 @@ #include "transport/config.h" #include "transport/factory.h" #include "transport/presenceoracle.h" +#include namespace Transport { // typedef enum { CLIENT_FEATURE_ROSTERX = 2, @@ -165,6 +166,7 @@ namespace Transport { private: void handleConnected(); void handleConnectionError(const Swift::ComponentError &error); + void handleServerStopped(boost::optional e); void handlePresence(Swift::Presence::ref presence); void handleDataRead(const Swift::SafeByteArray &data); void handleDataWritten(const Swift::SafeByteArray &data); diff --git a/src/transport.cpp b/src/transport.cpp index d32bad70..80e086a4 100644 --- a/src/transport.cpp +++ b/src/transport.cpp @@ -203,6 +203,11 @@ void Component::start() { else if (m_server) { LOG4CXX_INFO(logger, "Starting component in server mode on port " << CONFIG_INT(m_config, "service.port")); m_server->start(); + + //Type casting to BoostConnectionServer since onStopped signal is not defined in ConnectionServer + //Ideally, onStopped must be defined in ConnectionServer + boost::dynamic_pointer_cast(m_server->getConnectionServer())->onStopped.connect(boost::bind(&Component::handleServerStopped, this, _1)); + // We're connected right here, because we're in server mode... handleConnected(); } @@ -226,6 +231,17 @@ void Component::handleConnected() { m_reconnectCount = 0; } +void Component::handleServerStopped(boost::optional e) { + if(e != NULL ) { + if(*e == Swift::BoostConnectionServer::Conflict) + LOG4CXX_INFO(logger, "Port "<< CONFIG_INT(m_config, "service.port") << " already in use! Stopping server.."); + if(*e == Swift::BoostConnectionServer::UnknownError) + LOG4CXX_INFO(logger, "Unknown error occured! Stopping server.."); + exit(1); + } +} + + void Component::handleConnectionError(const ComponentError &error) { onConnectionError(error); // if (m_reconnectCount == 2) From 84741f552cbd9f3fc5bfee183c79890be4c4c8fa Mon Sep 17 00:00:00 2001 From: HanzZ Date: Thu, 12 Apr 2012 21:50:15 +0200 Subject: [PATCH 132/143] Some windows tweaks --- backends/libpurple/main.cpp | 10 ++++++++++ backends/libpurple/utils.cpp | 6 +++--- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/backends/libpurple/main.cpp b/backends/libpurple/main.cpp index 13e1c022..74cef363 100644 --- a/backends/libpurple/main.cpp +++ b/backends/libpurple/main.cpp @@ -655,7 +655,11 @@ class SpectrumNetworkPlugin : public NetworkPlugin { } void sendData(const std::string &string) { +#ifdef WIN32 + ::send(main_socket, string.c_str(), string.size(), 0); +#else write(main_socket, string.c_str(), string.size()); +#endif if (writeInput == 0) writeInput = purple_input_add(main_socket, PURPLE_INPUT_WRITE, &transportDataReceived, NULL); } @@ -1524,6 +1528,8 @@ static bool initPurple() { return false; } + purple_plugins_add_search_path("./plugins"); + purple_util_set_user_dir("./"); remove("./accounts.xml"); remove("./blist.xml"); @@ -1599,7 +1605,11 @@ static void transportDataReceived(gpointer data, gint source, PurpleInputConditi if (cond & PURPLE_INPUT_READ) { char buffer[65535]; char *ptr = buffer; +#ifdef WIN32 + ssize_t n = recv(source, ptr, sizeof(buffer), 0); +#else ssize_t n = read(source, ptr, sizeof(buffer)); +#endif if (n <= 0) { LOG4CXX_INFO(logger, "Diconnecting from spectrum2 server"); exit(errno); diff --git a/backends/libpurple/utils.cpp b/backends/libpurple/utils.cpp index 574e9874..a4ddf44b 100644 --- a/backends/libpurple/utils.cpp +++ b/backends/libpurple/utils.cpp @@ -146,8 +146,8 @@ int create_socket(char *host, int portno) { main_socket = 0; } - int flags = fcntl(main_socket, F_GETFL); - flags |= O_NONBLOCK; - fcntl(main_socket, F_SETFL, flags); +// int flags = fcntl(main_socket, F_GETFL); +// flags |= O_NONBLOCK; +// fcntl(main_socket, F_SETFL, flags); return main_socket; } From d241422571c618107fa8b77d0a6e968b2a4a2ed7 Mon Sep 17 00:00:00 2001 From: HanzZ Date: Thu, 12 Apr 2012 21:56:16 +0200 Subject: [PATCH 133/143] Better python generator --- backends/libpurple/gen_dynamic_purple.py | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/backends/libpurple/gen_dynamic_purple.py b/backends/libpurple/gen_dynamic_purple.py index 9f7f9cc0..bb1813f5 100644 --- a/backends/libpurple/gen_dynamic_purple.py +++ b/backends/libpurple/gen_dynamic_purple.py @@ -39,6 +39,11 @@ def handle_file(cpp): methods += [m + "("] counter += 1 index += 1 + + new_line = new_line.replace("PURPLE_CONV_IM", "PURPLE_CONV_IM_WRAPPED") + new_line = new_line.replace("PURPLE_CONV_CHAT", "PURPLE_CONV_CHAT_WRAPPED") + new_line = new_line.replace("PURPLE_BLIST_NODE_IS_BUDDY", "PURPLE_BLIST_NODE_IS_BUDDY_WRAPPED") + new_line = new_line.replace("PURPLE_CONNECTION_IS_CONNECTED", "PURPLE_CONNECTION_IS_CONNECTED_WRAPPED") new_file += new_line f.close() @@ -124,6 +129,22 @@ def output(): print >> header, "#pragma once" print >> header, "#ifdef WIN32" + print >> header, """ +#include +#include + +#define PURPLE_BLIST_NODE_IS_CHAT_WRAPPED(n) (purple_blist_node_get_type_wrapped(n) == PURPLE_BLIST_CHAT_NODE) +#define PURPLE_BLIST_NODE_IS_BUDDY_WRAPPED(n) (purple_blist_node_get_type_wrapped(n) == PURPLE_BLIST_BUDDY_NODE) +#define PURPLE_BLIST_NODE_IS_CONTACT_WRAPPED(n) (purple_blist_node_get_type_wrapped(n) == PURPLE_BLIST_CONTACT_NODE) +#define PURPLE_BLIST_NODE_IS_GROUP_WRAPPED(n) (purple_blist_node_get_type_wrapped(n) == PURPLE_BLIST_GROUP_NODE) + +#define PURPLE_CONV_IM_WRAPPED(c) (purple_conversation_get_im_data_wrapped(c)) +#define PURPLE_CONV_CHAT_WRAPPED(c) (purple_conversation_get_chat_data_wrapped(c)) + +#define PURPLE_CONNECTION_IS_CONNECTED_WRAPPED(gc) \ + (purple_connection_get_state_wrapped(gc) == PURPLE_CONNECTED) +""" + for d in definitions: #typedef void (WINAPI * purple_util_set_user_wrapped_func)(const char *dir); print >> header, "typedef", get_rtype(d), "(WINAPI *", get_name(d)[:-1] + "_wrapped_fnc)(" + get_raw_args(d) + ");" From 328ba6166b6fac90a217512fd5a49be9a8cd72f8 Mon Sep 17 00:00:00 2001 From: HanzZ Date: Thu, 12 Apr 2012 22:01:30 +0200 Subject: [PATCH 134/143] cdecl --- backends/libpurple/gen_dynamic_purple.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/backends/libpurple/gen_dynamic_purple.py b/backends/libpurple/gen_dynamic_purple.py index bb1813f5..c7463159 100644 --- a/backends/libpurple/gen_dynamic_purple.py +++ b/backends/libpurple/gen_dynamic_purple.py @@ -146,8 +146,8 @@ def output(): """ for d in definitions: - #typedef void (WINAPI * purple_util_set_user_wrapped_func)(const char *dir); - print >> header, "typedef", get_rtype(d), "(WINAPI *", get_name(d)[:-1] + "_wrapped_fnc)(" + get_raw_args(d) + ");" + #typedef void (_cdecl * purple_util_set_user_wrapped_func)(const char *dir); + print >> header, "typedef", get_rtype(d), "(_cdecl *", get_name(d)[:-1] + "_wrapped_fnc)(" + get_raw_args(d) + ");" #extern purple_util_set_user_wrapped_func purple_util_set_user_wrapped; print >> header, "extern", get_name(d)[:-1] + "_wrapped_fnc", get_name(d)[:-1] + "_wrapped;" print >> header, "" From 7d6bef6ac6d1947ad80e49037ed393d2c9329cb4 Mon Sep 17 00:00:00 2001 From: HanzZ Date: Fri, 13 Apr 2012 08:56:46 +0200 Subject: [PATCH 135/143] Fixed export + gen_dynamic_purple can be called repeatedly --- backends/libpurple/gen_dynamic_purple.py | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/backends/libpurple/gen_dynamic_purple.py b/backends/libpurple/gen_dynamic_purple.py index c7463159..5097e2c0 100644 --- a/backends/libpurple/gen_dynamic_purple.py +++ b/backends/libpurple/gen_dynamic_purple.py @@ -3,7 +3,8 @@ import os # intialize for methods used in libpurple macros methods = ["purple_connection_get_state(", "purple_conversation_get_im_data(", - "purple_conversation_get_chat_data("] + "purple_conversation_get_chat_data(", "purple_blist_node_get_type("] +macros = ["PURPLE_CONV_IM", "PURPLE_CONV_CHAT", "PURPLE_BLIST_NODE_IS_BUDDY", "PURPLE_CONNECTION_IS_CONNECTED"] definitions = [] if len(sys.argv) != 2: @@ -13,6 +14,7 @@ if len(sys.argv) != 2: def handle_file(cpp): global methods + global macros sys.stdout.write("getting used methods in " + cpp + ": ") sys.stdout.flush() @@ -33,17 +35,20 @@ def handle_file(cpp): index += 1 continue m = line[index:line[index:].find("(")+index] - new_line += m[1:] + "_wrapped(" index += len(m) + if m.find("_wrapped") != -1: + new_line += m[1:] + "(" + m = m.replace("_wrapped", "") + else: + new_line += m[1:] + "_wrapped(" if not m + "(" in methods and len(m) != 0: methods += [m + "("] counter += 1 index += 1 - new_line = new_line.replace("PURPLE_CONV_IM", "PURPLE_CONV_IM_WRAPPED") - new_line = new_line.replace("PURPLE_CONV_CHAT", "PURPLE_CONV_CHAT_WRAPPED") - new_line = new_line.replace("PURPLE_BLIST_NODE_IS_BUDDY", "PURPLE_BLIST_NODE_IS_BUDDY_WRAPPED") - new_line = new_line.replace("PURPLE_CONNECTION_IS_CONNECTED", "PURPLE_CONNECTION_IS_CONNECTED_WRAPPED") + for x in macros: + if new_line.find(x + "_WRAPPED") == -1: + new_line = new_line.replace(x, x + "_WRAPPED") new_file += new_line f.close() From c031ba344efae9c2154d5dcd6586ec7c55955b7e Mon Sep 17 00:00:00 2001 From: HanzZ Date: Fri, 13 Apr 2012 09:04:06 +0200 Subject: [PATCH 136/143] define macros also in linux --- backends/libpurple/gen_dynamic_purple.py | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/backends/libpurple/gen_dynamic_purple.py b/backends/libpurple/gen_dynamic_purple.py index 5097e2c0..2666e791 100644 --- a/backends/libpurple/gen_dynamic_purple.py +++ b/backends/libpurple/gen_dynamic_purple.py @@ -160,6 +160,19 @@ def output(): print >> header, "" print >> header, "#else" print >> header, "" + + print >> header, """ +#define PURPLE_BLIST_NODE_IS_CHAT_WRAPPED PURPLE_BLIST_NODE_IS_CHAT +#define PURPLE_BLIST_NODE_IS_BUDDY_WRAPPED PURPLE_BLIST_NODE_IS_BUDDY +#define PURPLE_BLIST_NODE_IS_CONTACT_WRAPPED PURPLE_BLIST_NODE_IS_CONTACT +#define PURPLE_BLIST_NODE_IS_GROUP_WRAPPED PURPLE_BLIST_NODE_IS_GROUP + +#define PURPLE_CONV_IM_WRAPPED PURPLE_CONV_IM +#define PURPLE_CONV_CHAT_WRAPPED PURPLE_CONV_CHAT + +#define PURPLE_CONNECTION_IS_CONNECTED_WRAPPED PURPLE_CONNECTION_IS_CONNECTED +""" + for d in definitions: #define purple_util_set_user_wrapped purple_util_set_user print >> header, "#define", get_name(d)[:-1] + "_wrapped", get_name(d)[:-1] From a330a15807446e0eb46bcc6857d3236ae0ae3bb5 Mon Sep 17 00:00:00 2001 From: HanzZ Date: Sat, 14 Apr 2012 09:14:52 +0200 Subject: [PATCH 137/143] Shutdown logging before exit() call to fix potential freeze --- backends/skype/main.cpp | 4 ++++ include/transport/logging.h | 2 ++ src/logging.cpp | 8 ++++++++ 3 files changed, 14 insertions(+) diff --git a/backends/skype/main.cpp b/backends/skype/main.cpp index 1ccd81e4..838d9231 100644 --- a/backends/skype/main.cpp +++ b/backends/skype/main.cpp @@ -165,6 +165,7 @@ class SpectrumNetworkPlugin : public NetworkPlugin { if (skype) { LOG4CXX_INFO(logger, "User wants to logout, logging out"); skype->logout(); + Logging::shutdownLogging(); exit(1); } } @@ -801,6 +802,7 @@ static int create_socket(char *host, int portno) { if ((hos = gethostbyname(host)) == NULL) { // strerror() will not work for gethostbyname() and hstrerror() // is supposedly obsolete + Logging::shutdownLogging(); exit(1); } serv_addr.sin_addr.s_addr = *((unsigned long *) hos->h_addr_list[0]); @@ -823,6 +825,7 @@ static gboolean transportDataReceived(GIOChannel *source, GIOCondition condition ssize_t n = read(m_sock, ptr, sizeof(buffer)); if (n <= 0) { LOG4CXX_INFO(logger, "Diconnecting from spectrum2 server"); + Logging::shutdownLogging(); exit(errno); } std::string d = std::string(buffer, n); @@ -831,6 +834,7 @@ static gboolean transportDataReceived(GIOChannel *source, GIOCondition condition } static void io_destroy(gpointer data) { + Logging::shutdownLogging(); exit(1); } diff --git a/include/transport/logging.h b/include/transport/logging.h index 4abf92dd..d3103103 100644 --- a/include/transport/logging.h +++ b/include/transport/logging.h @@ -35,6 +35,7 @@ #include "log4cxx/helpers/fileinputstream.h" #include "log4cxx/helpers/transcoder.h" #include "log4cxx/logger.h" +#include "log4cxx/logmanager.h" #define DEFINE_LOGGER(VAR, NAME) static log4cxx::LoggerPtr VAR = log4cxx::Logger::getLogger(NAME); @@ -55,6 +56,7 @@ namespace Logging { void initBackendLogging(Config *config); void initMainLogging(Config *config); +void shutdownLogging(); } diff --git a/src/logging.cpp b/src/logging.cpp index 3d56878f..bd78eec8 100644 --- a/src/logging.cpp +++ b/src/logging.cpp @@ -139,11 +139,19 @@ void initMainLogging(Config *config) { initLogging(config, "logging.config"); } +void shutdownLogging() { + log4cxx::LogManager::shutdown(); +} + #else /* WITH_LOG4CXX */ void initBackendLogging(Config */*config*/) { } void initMainLogging(Config */*config*/) { +} + +void shutdownLogging() { + } #endif /* WITH_LOG4CXX */ From bb8e202db996b748950adcdd1ac79e3e0570f816 Mon Sep 17 00:00:00 2001 From: HanzZ Date: Sat, 14 Apr 2012 15:52:25 +0200 Subject: [PATCH 138/143] Fixed default database for gatewaymode --- src/storagebackend.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/storagebackend.cpp b/src/storagebackend.cpp index fabaed47..2247dee9 100644 --- a/src/storagebackend.cpp +++ b/src/storagebackend.cpp @@ -11,7 +11,7 @@ StorageBackend *StorageBackend::createBackend(Config *config, std::string &error StorageBackend *storageBackend = NULL; #ifdef WITH_SQLITE if (CONFIG_STRING(config, "database.type") == "sqlite3" || - (CONFIG_STRING(config, "database.type") == "none" && CONFIG_BOOL(config, "service.server_mode"))) { + (CONFIG_STRING(config, "database.type") == "none" && !CONFIG_BOOL(config, "service.server_mode"))) { storageBackend = new SQLite3Backend(config); } #else From 47f86754eae605bff97cd73a9d49e68f64eee99e Mon Sep 17 00:00:00 2001 From: HanzZ Date: Tue, 17 Apr 2012 18:26:21 +0200 Subject: [PATCH 139/143] Allow setting config file options also from command line --- include/transport/config.h | 4 +++- spectrum/src/main.cpp | 2 +- spectrum/src/sample.cfg | 6 +++--- src/config.cpp | 5 +++++ 4 files changed, 12 insertions(+), 5 deletions(-) diff --git a/include/transport/config.h b/include/transport/config.h index 4ff5b8fa..7d01eaa0 100644 --- a/include/transport/config.h +++ b/include/transport/config.h @@ -50,7 +50,7 @@ typedef boost::program_options::variables_map Variables; class Config { public: /// Constructor. - Config() {} + Config(int argc = 0, char **argv = NULL) : m_argc(argc), m_argv(argv) {} /// Destructor virtual ~Config() {} @@ -99,6 +99,8 @@ class Config { boost::signal onConfigReloaded; private: + int m_argc; + char **m_argv; Variables m_variables; std::map m_unregistered; std::string m_file; diff --git a/spectrum/src/main.cpp b/spectrum/src/main.cpp index 82540d11..ea3b288e 100644 --- a/spectrum/src/main.cpp +++ b/spectrum/src/main.cpp @@ -114,7 +114,7 @@ static void daemonize(const char *cwd, const char *lock_file) { int main(int argc, char **argv) { - Config config; + Config config(argc, argv); boost::program_options::variables_map vm; bool no_daemon = false; diff --git a/spectrum/src/sample.cfg b/spectrum/src/sample.cfg index 5018ae8b..9097e3b4 100644 --- a/spectrum/src/sample.cfg +++ b/spectrum/src/sample.cfg @@ -8,13 +8,13 @@ backend_host=localhost pidfile=./test.pid # < this option doesn't work yet #backend_port=10001 -admin_jid=admin@localhost +#admin_jid=admin@localhost admin_password=test #cert=server.pfx #patch to PKCS#12 certificate #cert_password=test #password to that certificate if any users_per_backend=10 -#backend=../..//backends/libpurple/spectrum2_libpurple_backend -backend=../../backends/template/template_backend.py +backend=../..//backends/libpurple/spectrum2_libpurple_backend +#backend=../../backends/template/template_backend.py protocol=prpl-jabber #protocol=prpl-msn #protocol=any diff --git a/src/config.cpp b/src/config.cpp index 9672f00d..2505614e 100644 --- a/src/config.cpp +++ b/src/config.cpp @@ -187,6 +187,11 @@ bool Config::load(std::istream &ifs, boost::program_options::options_description } } + // Load configs passed by command line + if (m_argc != 0 && m_argv) { + store(parse_command_line(m_argc, m_argv, opts), m_variables); + } + store(parsed, m_variables); notify(m_variables); From 70b93a4fb82971089c2d40d567992ea538f7bdfc Mon Sep 17 00:00:00 2001 From: HanzZ Date: Tue, 17 Apr 2012 22:03:28 +0200 Subject: [PATCH 140/143] hack for gfire --- backends/libpurple/main.cpp | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/backends/libpurple/main.cpp b/backends/libpurple/main.cpp index 74cef363..d01c2138 100644 --- a/backends/libpurple/main.cpp +++ b/backends/libpurple/main.cpp @@ -289,6 +289,13 @@ class SpectrumNetworkPlugin : public NetworkPlugin { i++; } g_strfreev (keys); + + char* contents; + gsize length; + gboolean ret = g_file_get_contents ("gfire.cfg", &contents, &length, NULL); + if (ret) { + purple_account_set_int(account, "version", fromString(std::string(contents, length))); + } } void handleLoginRequest(const std::string &user, const std::string &legacyName, const std::string &password) { @@ -348,6 +355,10 @@ class SpectrumNetworkPlugin : public NetworkPlugin { void handleLogoutRequest(const std::string &user, const std::string &legacyName) { PurpleAccount *account = m_sessions[user]; if (account) { + if (purple_account_get_int(account, "version", 0) != 0) { + std::string data = stringOf(purple_account_get_int(account, "version", 0)); + g_file_set_contents ("gfire.cfg", data.c_str(), data.size(), NULL); + } // VALGRIND_DO_LEAK_CHECK; m_sessions.erase(user); purple_account_disconnect(account); From e1d14b695134ec18777df5b35ba4f69aed898908 Mon Sep 17 00:00:00 2001 From: Jan Kaluza Date: Thu, 19 Apr 2012 09:48:39 +0200 Subject: [PATCH 141/143] Fixed unregistered-options parsing --- spectrum/src/main.cpp | 2 +- src/config.cpp | 12 +++++++----- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/spectrum/src/main.cpp b/spectrum/src/main.cpp index ea3b288e..ab5bc790 100644 --- a/spectrum/src/main.cpp +++ b/spectrum/src/main.cpp @@ -147,7 +147,7 @@ int main(int argc, char **argv) boost::program_options::positional_options_description p; p.add("config", -1); boost::program_options::store(boost::program_options::command_line_parser(argc, argv). - options(desc).positional(p).run(), vm); + options(desc).positional(p).allow_unregistered().run(), vm); boost::program_options::notify(vm); if (vm.count("version")) { diff --git a/src/config.cpp b/src/config.cpp index 2505614e..08f7451d 100644 --- a/src/config.cpp +++ b/src/config.cpp @@ -122,6 +122,13 @@ bool Config::load(std::istream &ifs, boost::program_options::options_description ("backend.no_vcard_fetch", value()->default_value(false), "True if VCards for buddies should not be fetched. Only avatars will be forwarded.") ; + // Load configs passed by command line + if (m_argc != 0 && m_argv) { + basic_command_line_parser parser = command_line_parser(m_argc, m_argv).options(opts).allow_unregistered(); + parsed_options parsed = parser.run(); + store(parsed, m_variables); + } + parsed_options parsed = parse_config_file(ifs, opts, true); bool found_working = false; @@ -187,11 +194,6 @@ bool Config::load(std::istream &ifs, boost::program_options::options_description } } - // Load configs passed by command line - if (m_argc != 0 && m_argv) { - store(parse_command_line(m_argc, m_argv, opts), m_variables); - } - store(parsed, m_variables); notify(m_variables); From ce67e1623fee0c1bbd125ba03b7f27a55a220206 Mon Sep 17 00:00:00 2001 From: HanzZ Date: Mon, 30 Apr 2012 14:13:56 +0200 Subject: [PATCH 142/143] Fixed unhandled exception when admin_jid is not set --- include/transport/config.h | 6 +++--- spectrum_manager/src/managerconfig.h | 4 ++++ 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/include/transport/config.h b/include/transport/config.h index 7d01eaa0..903480e9 100644 --- a/include/transport/config.h +++ b/include/transport/config.h @@ -28,13 +28,13 @@ #include #include - +#define CONFIG_HAS_KEY(PTR, KEY) (*PTR).hasKey(KEY) #define CONFIG_STRING(PTR, KEY) (*PTR)[KEY].as() #define CONFIG_INT(PTR, KEY) (*PTR)[KEY].as() #define CONFIG_BOOL(PTR, KEY) (*PTR)[KEY].as() #define CONFIG_LIST(PTR, KEY) (*PTR)[KEY].as >() -#define CONFIG_VECTOR(PTR, KEY) (*PTR)[KEY].as >() -#define CONFIG_HAS_KEY(PTR, KEY) (*PTR).hasKey(KEY) +#define CONFIG_VECTOR(PTR, KEY) ((*PTR).hasKey(KEY) ? (*PTR)[KEY].as >() : std::vector()) + namespace Transport { diff --git a/spectrum_manager/src/managerconfig.h b/spectrum_manager/src/managerconfig.h index 933843c3..48ca15b8 100644 --- a/spectrum_manager/src/managerconfig.h +++ b/spectrum_manager/src/managerconfig.h @@ -68,6 +68,10 @@ class ManagerConfig { return m_variables[key]; } + bool hasKey(const std::string &key) { + return m_variables.find(key) != m_variables.end(); + } + /// Returns path to config file from which data were loaded. const std::string &getManagerConfigFile() { return m_file; } From 31687c4a0947b98dd5f721ae4f67958bea39d2ca Mon Sep 17 00:00:00 2001 From: Jan Kaluza Date: Wed, 2 May 2012 12:03:12 +0200 Subject: [PATCH 143/143] Support for prpl-novell --- backends/libpurple/main.cpp | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/backends/libpurple/main.cpp b/backends/libpurple/main.cpp index d01c2138..e06fdb2b 100644 --- a/backends/libpurple/main.cpp +++ b/backends/libpurple/main.cpp @@ -50,6 +50,21 @@ template std::string stringOf(T object) { return (os.str()); } +static std::vector &split(const std::string &s, char delim, std::vector &elems) { + std::stringstream ss(s); + std::string item; + while(std::getline(ss, item, delim)) { + elems.push_back(item); + } + return elems; +} + + +static std::vector split(const std::string &s, char delim) { + std::vector elems; + return split(s, delim, elems); +} + static void transportDataReceived(gpointer data, gint source, PurpleInputCondition cond); class SpectrumNetworkPlugin; @@ -296,6 +311,17 @@ class SpectrumNetworkPlugin : public NetworkPlugin { if (ret) { purple_account_set_int(account, "version", fromString(std::string(contents, length))); } + + + if (KEYFILE_STRING("service", "protocol") == "prpl-novell") { + std::string username(purple_account_get_username(account)); + std::vector u = split(username, '@'); + purple_account_set_username(account, (const char*) u.front().c_str()); + std::vector s = split(u.back(), ':'); + purple_account_set_string(account, "server", s.front().c_str()); + purple_account_set_int(account, "port", atoi(s.back().c_str())); + } + } void handleLoginRequest(const std::string &user, const std::string &legacyName, const std::string &password) {