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))));