summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'Swiften/Serializer')
-rw-r--r--Swiften/Serializer/PayloadSerializers/BytestreamsSerializer.cpp2
-rw-r--r--Swiften/Serializer/PayloadSerializers/FullPayloadSerializerCollection.cpp3
-rw-r--r--Swiften/Serializer/PayloadSerializers/IBBSerializer.cpp4
-rw-r--r--Swiften/Serializer/PayloadSerializers/JingleFileTransferFileInfoSerializer.cpp4
-rw-r--r--Swiften/Serializer/PayloadSerializers/JingleIBBTransportPayloadSerializer.cpp2
-rw-r--r--Swiften/Serializer/PayloadSerializers/JinglePayloadSerializer.cpp6
-rw-r--r--Swiften/Serializer/PayloadSerializers/JingleS5BTransportPayloadSerializer.cpp4
-rw-r--r--Swiften/Serializer/PayloadSerializers/LastSerializer.h2
-rw-r--r--Swiften/Serializer/PayloadSerializers/MIXUpdateSubscriptionSerializer.h4
-rw-r--r--Swiften/Serializer/PayloadSerializers/MUCPayloadSerializer.cpp6
-rw-r--r--Swiften/Serializer/PayloadSerializers/PrioritySerializer.h2
-rw-r--r--Swiften/Serializer/PayloadSerializers/PubSubItemsSerializer.cpp2
-rw-r--r--Swiften/Serializer/PayloadSerializers/ReferencePayloadSerializer.cpp64
-rw-r--r--Swiften/Serializer/PayloadSerializers/ReferencePayloadSerializer.h26
-rw-r--r--Swiften/Serializer/PayloadSerializers/ResultSetSerializer.cpp8
-rw-r--r--Swiften/Serializer/PayloadSerializers/S5BProxyRequestSerializer.h2
-rw-r--r--Swiften/Serializer/PayloadSerializers/StreamInitiationFileInfoSerializer.cpp4
-rw-r--r--Swiften/Serializer/PayloadSerializers/StreamInitiationSerializer.cpp2
-rw-r--r--Swiften/Serializer/PayloadSerializers/UnitTest/ReferencePayloadSerializerTest.cpp81
-rw-r--r--Swiften/Serializer/PayloadSerializers/UserTuneSerializer.cpp4
-rw-r--r--Swiften/Serializer/PayloadSerializers/WhiteboardSerializer.cpp66
-rw-r--r--Swiften/Serializer/StanzaAckSerializer.h2
-rw-r--r--Swiften/Serializer/StanzaSerializer.cpp4
-rw-r--r--Swiften/Serializer/StreamErrorSerializer.cpp2
-rw-r--r--Swiften/Serializer/StreamResumeSerializer.cpp2
-rw-r--r--Swiften/Serializer/StreamResumedSerializer.cpp2
-rw-r--r--Swiften/Serializer/XML/UnitTest/XMLElementTest.cpp7
-rw-r--r--Swiften/Serializer/XML/XMLElement.cpp17
-rw-r--r--Swiften/Serializer/XML/XMLElement.h1
-rw-r--r--Swiften/Serializer/XMPPSerializer.cpp4
30 files changed, 262 insertions, 77 deletions
diff --git a/Swiften/Serializer/PayloadSerializers/BytestreamsSerializer.cpp b/Swiften/Serializer/PayloadSerializers/BytestreamsSerializer.cpp
index 78bb0eb..37a9c03 100644
--- a/Swiften/Serializer/PayloadSerializers/BytestreamsSerializer.cpp
+++ b/Swiften/Serializer/PayloadSerializers/BytestreamsSerializer.cpp
@@ -25,7 +25,7 @@ std::string BytestreamsSerializer::serializePayload(std::shared_ptr<Bytestreams>
std::shared_ptr<XMLElement> streamHostElement(new XMLElement("streamhost"));
streamHostElement->setAttribute("host", streamHost.host);
streamHostElement->setAttribute("jid", streamHost.jid.toString());
- streamHostElement->setAttribute("port", boost::lexical_cast<std::string>(streamHost.port));
+ streamHostElement->setAttribute("port", std::to_string(streamHost.port));
queryElement.addNode(streamHostElement);
}
diff --git a/Swiften/Serializer/PayloadSerializers/FullPayloadSerializerCollection.cpp b/Swiften/Serializer/PayloadSerializers/FullPayloadSerializerCollection.cpp
index 428ce76..31294f1 100644
--- a/Swiften/Serializer/PayloadSerializers/FullPayloadSerializerCollection.cpp
+++ b/Swiften/Serializer/PayloadSerializers/FullPayloadSerializerCollection.cpp
@@ -69,6 +69,7 @@
#include <Swiften/Serializer/PayloadSerializers/PubSubOwnerPubSubSerializer.h>
#include <Swiften/Serializer/PayloadSerializers/PubSubSerializer.h>
#include <Swiften/Serializer/PayloadSerializers/RawXMLPayloadSerializer.h>
+#include <Swiften/Serializer/PayloadSerializers/ReferencePayloadSerializer.h>
#include <Swiften/Serializer/PayloadSerializers/ReplaceSerializer.h>
#include <Swiften/Serializer/PayloadSerializers/ResourceBindSerializer.h>
#include <Swiften/Serializer/PayloadSerializers/ResultSetSerializer.h>
@@ -186,6 +187,8 @@ FullPayloadSerializerCollection::FullPayloadSerializerCollection() {
serializers_.push_back(new IsodeIQDelegationSerializer(this));
+ serializers_.push_back(new ReferencePayloadSerializer(this));
+
for (auto serializer : serializers_) {
addSerializer(serializer);
}
diff --git a/Swiften/Serializer/PayloadSerializers/IBBSerializer.cpp b/Swiften/Serializer/PayloadSerializers/IBBSerializer.cpp
index e41ff8c..74a8e7b 100644
--- a/Swiften/Serializer/PayloadSerializers/IBBSerializer.cpp
+++ b/Swiften/Serializer/PayloadSerializers/IBBSerializer.cpp
@@ -26,7 +26,7 @@ std::string IBBSerializer::serializePayload(std::shared_ptr<IBB> ibb) const {
XMLElement ibbElement("data", "http://jabber.org/protocol/ibb");
ibbElement.setAttribute("sid", ibb->getStreamID());
if (ibb->getSequenceNumber() >= 0) {
- ibbElement.setAttribute("seq", boost::lexical_cast<std::string>(ibb->getSequenceNumber()));
+ ibbElement.setAttribute("seq", std::to_string(ibb->getSequenceNumber()));
}
ibbElement.addNode(std::make_shared<XMLTextNode>(Base64::encode(ibb->getData())));
return ibbElement.serialize();
@@ -39,7 +39,7 @@ std::string IBBSerializer::serializePayload(std::shared_ptr<IBB> ibb) const {
case IBB::MessageStanza: ibbElement.setAttribute("stanza", "message"); break;
}
assert(ibb->getBlockSize() > 0);
- ibbElement.setAttribute("block-size", boost::lexical_cast<std::string>(ibb->getBlockSize()));
+ ibbElement.setAttribute("block-size", std::to_string(ibb->getBlockSize()));
return ibbElement.serialize();
}
case IBB::Close: {
diff --git a/Swiften/Serializer/PayloadSerializers/JingleFileTransferFileInfoSerializer.cpp b/Swiften/Serializer/PayloadSerializers/JingleFileTransferFileInfoSerializer.cpp
index 35a0a6e..95996c7 100644
--- a/Swiften/Serializer/PayloadSerializers/JingleFileTransferFileInfoSerializer.cpp
+++ b/Swiften/Serializer/PayloadSerializers/JingleFileTransferFileInfoSerializer.cpp
@@ -44,13 +44,13 @@ std::string JingleFileTransferFileInfoSerializer::serializePayload(std::shared_p
if (fileInfo->getSupportsRangeRequests()) {
std::shared_ptr<XMLElement> range = std::make_shared<XMLElement>("range");
if (fileInfo->getRangeOffset() != 0) {
- range->setAttribute("offset", boost::lexical_cast<std::string>(fileInfo->getRangeOffset()));
+ range->setAttribute("offset", std::to_string(fileInfo->getRangeOffset()));
}
fileElement.addNode(range);
}
if (fileInfo->getSize() > 0) {
- fileElement.addNode(std::make_shared<XMLElement>("size", "", boost::lexical_cast<std::string>(fileInfo->getSize())));
+ fileElement.addNode(std::make_shared<XMLElement>("size", "", std::to_string(fileInfo->getSize())));
}
for (const auto& hashElement : fileInfo->getHashes()) {
diff --git a/Swiften/Serializer/PayloadSerializers/JingleIBBTransportPayloadSerializer.cpp b/Swiften/Serializer/PayloadSerializers/JingleIBBTransportPayloadSerializer.cpp
index 9930e44..c5c45e1 100644
--- a/Swiften/Serializer/PayloadSerializers/JingleIBBTransportPayloadSerializer.cpp
+++ b/Swiften/Serializer/PayloadSerializers/JingleIBBTransportPayloadSerializer.cpp
@@ -28,7 +28,7 @@ JingleIBBTransportPayloadSerializer::JingleIBBTransportPayloadSerializer() {
std::string JingleIBBTransportPayloadSerializer::serializePayload(std::shared_ptr<JingleIBBTransportPayload> payload) const {
XMLElement payloadXML("transport", "urn:xmpp:jingle:transports:ibb:1");
if (payload->getBlockSize()) {
- payloadXML.setAttribute("block-size", boost::lexical_cast<std::string>(*payload->getBlockSize()));
+ payloadXML.setAttribute("block-size", std::to_string(*payload->getBlockSize()));
}
payloadXML.setAttribute("sid", payload->getSessionID());
diff --git a/Swiften/Serializer/PayloadSerializers/JinglePayloadSerializer.cpp b/Swiften/Serializer/PayloadSerializers/JinglePayloadSerializer.cpp
index aaac757..566d556 100644
--- a/Swiften/Serializer/PayloadSerializers/JinglePayloadSerializer.cpp
+++ b/Swiften/Serializer/PayloadSerializers/JinglePayloadSerializer.cpp
@@ -5,7 +5,7 @@
*/
/*
- * Copyright (c) 2015-2016 Isode Limited.
+ * Copyright (c) 2015-2019 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -93,7 +93,7 @@ std::string JinglePayloadSerializer::actionToString(JinglePayload::Action action
case JinglePayload::TransportReplace:
return "transport-replace";
case JinglePayload::UnknownAction:
- SWIFT_LOG(warning) << "Serializing unknown action value." << std::endl;
+ SWIFT_LOG(warning) << "Serializing unknown action value.";
return "";
}
assert(false);
@@ -103,7 +103,7 @@ std::string JinglePayloadSerializer::actionToString(JinglePayload::Action action
std::string JinglePayloadSerializer::reasonTypeToString(JinglePayload::Reason::Type type) const {
switch(type) {
case JinglePayload::Reason::UnknownType:
- SWIFT_LOG(warning) << "Unknown jingle reason type!" << std::endl;
+ SWIFT_LOG(warning) << "Unknown jingle reason type!";
return "";
case JinglePayload::Reason::AlternativeSession:
return "alternative-session";
diff --git a/Swiften/Serializer/PayloadSerializers/JingleS5BTransportPayloadSerializer.cpp b/Swiften/Serializer/PayloadSerializers/JingleS5BTransportPayloadSerializer.cpp
index 5e74d8e..f9a1832 100644
--- a/Swiften/Serializer/PayloadSerializers/JingleS5BTransportPayloadSerializer.cpp
+++ b/Swiften/Serializer/PayloadSerializers/JingleS5BTransportPayloadSerializer.cpp
@@ -39,8 +39,8 @@ std::string JingleS5BTransportPayloadSerializer::serializePayload(std::shared_pt
candidateXML->setAttribute("cid", candidate.cid);
candidateXML->setAttribute("host", candidate.hostPort.getAddress().toString());
candidateXML->setAttribute("jid", candidate.jid.toString());
- candidateXML->setAttribute("port", boost::lexical_cast<std::string>(candidate.hostPort.getPort()));
- candidateXML->setAttribute("priority", boost::lexical_cast<std::string>(candidate.priority));
+ candidateXML->setAttribute("port", std::to_string(candidate.hostPort.getPort()));
+ candidateXML->setAttribute("priority", std::to_string(candidate.priority));
candidateXML->setAttribute("type", typeToString(candidate.type));
payloadXML.addNode(candidateXML);
}
diff --git a/Swiften/Serializer/PayloadSerializers/LastSerializer.h b/Swiften/Serializer/PayloadSerializers/LastSerializer.h
index 1710bc0..719eff5 100644
--- a/Swiften/Serializer/PayloadSerializers/LastSerializer.h
+++ b/Swiften/Serializer/PayloadSerializers/LastSerializer.h
@@ -18,7 +18,7 @@ namespace Swift {
LastSerializer() : GenericPayloadSerializer<Last>() {}
virtual std::string serializePayload(std::shared_ptr<Last> last) const {
- return "<query xmlns='jabber:iq:last' seconds='" + boost::lexical_cast<std::string>(last->getSeconds()) + "'/>";
+ return "<query xmlns='jabber:iq:last' seconds='" + std::to_string(last->getSeconds()) + "'/>";
}
};
}
diff --git a/Swiften/Serializer/PayloadSerializers/MIXUpdateSubscriptionSerializer.h b/Swiften/Serializer/PayloadSerializers/MIXUpdateSubscriptionSerializer.h
index ee59bf7..4ba9584 100644
--- a/Swiften/Serializer/PayloadSerializers/MIXUpdateSubscriptionSerializer.h
+++ b/Swiften/Serializer/PayloadSerializers/MIXUpdateSubscriptionSerializer.h
@@ -5,7 +5,7 @@
*/
/*
- * Copyright (c) 2017 Isode Limited.
+ * Copyright (c) 2017-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -23,7 +23,7 @@ namespace Swift {
class SWIFTEN_API MIXUpdateSubscriptionSerializer : public GenericPayloadSerializer<MIXUpdateSubscription> {
public:
MIXUpdateSubscriptionSerializer();
- virtual ~MIXUpdateSubscriptionSerializer();
+ virtual ~MIXUpdateSubscriptionSerializer() override;
virtual std::string serializePayload(std::shared_ptr<MIXUpdateSubscription>) const override;
};
diff --git a/Swiften/Serializer/PayloadSerializers/MUCPayloadSerializer.cpp b/Swiften/Serializer/PayloadSerializers/MUCPayloadSerializer.cpp
index 4f0f637..cde129e 100644
--- a/Swiften/Serializer/PayloadSerializers/MUCPayloadSerializer.cpp
+++ b/Swiften/Serializer/PayloadSerializers/MUCPayloadSerializer.cpp
@@ -25,15 +25,15 @@ std::string MUCPayloadSerializer::serializePayload(std::shared_ptr<MUCPayload> m
std::shared_ptr<XMLElement> historyElement(new XMLElement("history"));
bool history = false;
if (muc->getMaxChars() >= 0) {
- historyElement->setAttribute("maxchars", boost::lexical_cast<std::string>(muc->getMaxChars()));
+ historyElement->setAttribute("maxchars", std::to_string(muc->getMaxChars()));
history = true;
}
if (muc->getMaxStanzas() >= 0) {
- historyElement->setAttribute("maxstanzas", boost::lexical_cast<std::string>(muc->getMaxStanzas()));
+ historyElement->setAttribute("maxstanzas", std::to_string(muc->getMaxStanzas()));
history = true;
}
if (muc->getSeconds() >= 0) {
- historyElement->setAttribute("seconds", boost::lexical_cast<std::string>(muc->getSeconds()));
+ historyElement->setAttribute("seconds", std::to_string(muc->getSeconds()));
history = true;
}
if (muc->getSince() != boost::posix_time::not_a_date_time) {
diff --git a/Swiften/Serializer/PayloadSerializers/PrioritySerializer.h b/Swiften/Serializer/PayloadSerializers/PrioritySerializer.h
index 687d07f..fa2cef0 100644
--- a/Swiften/Serializer/PayloadSerializers/PrioritySerializer.h
+++ b/Swiften/Serializer/PayloadSerializers/PrioritySerializer.h
@@ -18,7 +18,7 @@ namespace Swift {
PrioritySerializer() : GenericPayloadSerializer<Priority>() {}
virtual std::string serializePayload(std::shared_ptr<Priority> priority) const {
- return "<priority>" + boost::lexical_cast<std::string>(priority->getPriority()) + "</priority>";
+ return "<priority>" + std::to_string(priority->getPriority()) + "</priority>";
}
};
}
diff --git a/Swiften/Serializer/PayloadSerializers/PubSubItemsSerializer.cpp b/Swiften/Serializer/PayloadSerializers/PubSubItemsSerializer.cpp
index 9786f51..b2c7326 100644
--- a/Swiften/Serializer/PayloadSerializers/PubSubItemsSerializer.cpp
+++ b/Swiften/Serializer/PayloadSerializers/PubSubItemsSerializer.cpp
@@ -37,7 +37,7 @@ std::string PubSubItemsSerializer::serializePayload(std::shared_ptr<PubSubItems>
element.addNode(std::make_shared<XMLRawTextNode>(PubSubItemSerializer(serializers).serialize(item)));
}
if (payload->getMaximumItems()) {
- element.setAttribute("max_items", boost::lexical_cast<std::string>(*payload->getMaximumItems()));
+ element.setAttribute("max_items", std::to_string(*payload->getMaximumItems()));
}
if (payload->getSubscriptionID()) {
element.setAttribute("subid", *payload->getSubscriptionID());
diff --git a/Swiften/Serializer/PayloadSerializers/ReferencePayloadSerializer.cpp b/Swiften/Serializer/PayloadSerializers/ReferencePayloadSerializer.cpp
new file mode 100644
index 0000000..128aac7
--- /dev/null
+++ b/Swiften/Serializer/PayloadSerializers/ReferencePayloadSerializer.cpp
@@ -0,0 +1,64 @@
+/*
+ * Copyright (c) 2018-2019 Isode Limited.
+ * All rights reserved.
+ * See the COPYING file for more information.
+ */
+
+#include <Swiften/Serializer/PayloadSerializers/ReferencePayloadSerializer.h>
+
+#include <memory>
+
+#include <Swiften/Base/Log.h>
+#include <Swiften/Serializer/XML/XMLElement.h>
+#include <Swiften/Serializer/XML/XMLRawTextNode.h>
+#include <Swiften/Serializer/PayloadSerializerCollection.h>
+
+namespace Swift {
+
+ReferencePayloadSerializer::ReferencePayloadSerializer(PayloadSerializerCollection* payloadSerializers) : GenericPayloadSerializer<ReferencePayload>(), payloadSerializers_(payloadSerializers) {
+}
+
+std::string ReferencePayloadSerializer::serializePayload(ReferencePayload::ref reference) const {
+ XMLElement element("reference", "urn:xmpp:reference:0");
+
+ auto type = reference->getType();
+ if (type != ReferencePayload::Type::Unknown) {
+ element.setAttribute("type", getTypeString(type));
+
+ if (auto uri = reference->getUri()) {
+ element.setAttribute("uri", *uri);
+ }
+ if (auto begin = reference->getBegin()) {
+ element.setAttribute("begin", *begin);
+ }
+ if (auto end = reference->getEnd()) {
+ element.setAttribute("end", *end);
+ }
+ if (auto anchor = reference->getAnchor()) {
+ element.setAttribute("anchor", *anchor);
+ }
+
+ std::string serializedPayloads;
+ for (const auto& payload : reference->getPayloads()) {
+ if (auto serializer = payloadSerializers_->getPayloadSerializer(payload)) {
+ element.addNode(std::make_shared<XMLRawTextNode>(serializer->serialize(payload)));
+ }
+ else {
+ SWIFT_LOG(warning) << "Could not find serializer for " << typeid(*(payload.get())).name();
+ }
+ }
+ }
+ return element.serialize();
+}
+
+const std::string ReferencePayloadSerializer::getTypeString(const ReferencePayload::Type type) const {
+ switch(type) {
+ case ReferencePayload::Type::Data: return "data";
+ case ReferencePayload::Type::Mention: return "mention";
+ case ReferencePayload::Type::PubSub: return "pubsub";
+ case ReferencePayload::Type::Unknown: return "unknown";
+ }
+ return "";
+}
+
+}
diff --git a/Swiften/Serializer/PayloadSerializers/ReferencePayloadSerializer.h b/Swiften/Serializer/PayloadSerializers/ReferencePayloadSerializer.h
new file mode 100644
index 0000000..2af6045
--- /dev/null
+++ b/Swiften/Serializer/PayloadSerializers/ReferencePayloadSerializer.h
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 2018 Isode Limited.
+ * All rights reserved.
+ * See the COPYING file for more information.
+ */
+
+#pragma once
+
+#include <Swiften/Base/API.h>
+#include <Swiften/Elements/ReferencePayload.h>
+#include <Swiften/Serializer/GenericPayloadSerializer.h>
+
+namespace Swift {
+ class PayloadSerializerCollection;
+
+ class SWIFTEN_API ReferencePayloadSerializer : public GenericPayloadSerializer<ReferencePayload> {
+ public:
+ ReferencePayloadSerializer(PayloadSerializerCollection* payloadSerializers);
+ virtual std::string serializePayload(ReferencePayload::ref reference) const;
+
+ private:
+ const std::string getTypeString(const ReferencePayload::Type type) const;
+
+ PayloadSerializerCollection* payloadSerializers_;
+ };
+}
diff --git a/Swiften/Serializer/PayloadSerializers/ResultSetSerializer.cpp b/Swiften/Serializer/PayloadSerializers/ResultSetSerializer.cpp
index 3302863..3d13ce3 100644
--- a/Swiften/Serializer/PayloadSerializers/ResultSetSerializer.cpp
+++ b/Swiften/Serializer/PayloadSerializers/ResultSetSerializer.cpp
@@ -29,21 +29,21 @@ std::string ResultSetSerializer::serializePayload(std::shared_ptr<ResultSet> pay
XMLElement element("set", "http://jabber.org/protocol/rsm");
if (payload->getMaxItems()) {
- element.addNode(std::make_shared<XMLElement>("max", "", boost::lexical_cast<std::string>(*payload->getMaxItems())));
+ element.addNode(std::make_shared<XMLElement>("max", "", std::to_string(*payload->getMaxItems())));
}
if (payload->getCount()) {
- element.addNode(std::make_shared<XMLElement>("count", "", boost::lexical_cast<std::string>(*payload->getCount())));
+ element.addNode(std::make_shared<XMLElement>("count", "", std::to_string(*payload->getCount())));
}
if (payload->getIndex()) {
- element.addNode(std::make_shared<XMLElement>("index", "", boost::lexical_cast<std::string>(*payload->getIndex())));
+ element.addNode(std::make_shared<XMLElement>("index", "", std::to_string(*payload->getIndex())));
}
if (payload->getFirstID()) {
std::shared_ptr<XMLElement> firstElement = std::make_shared<XMLElement>("first", "", *payload->getFirstID());
if (payload->getFirstIDIndex()) {
- firstElement->setAttribute("index", boost::lexical_cast<std::string>(*payload->getFirstIDIndex()));
+ firstElement->setAttribute("index", std::to_string(*payload->getFirstIDIndex()));
}
element.addNode(firstElement);
}
diff --git a/Swiften/Serializer/PayloadSerializers/S5BProxyRequestSerializer.h b/Swiften/Serializer/PayloadSerializers/S5BProxyRequestSerializer.h
index 14cbd14..e992f72 100644
--- a/Swiften/Serializer/PayloadSerializers/S5BProxyRequestSerializer.h
+++ b/Swiften/Serializer/PayloadSerializers/S5BProxyRequestSerializer.h
@@ -29,7 +29,7 @@ namespace Swift {
if (s5bProxyRequest && s5bProxyRequest->getStreamHost()) {
std::shared_ptr<XMLElement> streamHost = std::make_shared<XMLElement>("streamhost");
streamHost->setAttribute("host", s5bProxyRequest->getStreamHost().get().host);
- streamHost->setAttribute("port", boost::lexical_cast<std::string>(s5bProxyRequest->getStreamHost().get().port));
+ streamHost->setAttribute("port", std::to_string(s5bProxyRequest->getStreamHost().get().port));
streamHost->setAttribute("jid", s5bProxyRequest->getStreamHost().get().jid.toString());
queryElement.addNode(streamHost);
} else if (s5bProxyRequest && s5bProxyRequest->getActivate()) {
diff --git a/Swiften/Serializer/PayloadSerializers/StreamInitiationFileInfoSerializer.cpp b/Swiften/Serializer/PayloadSerializers/StreamInitiationFileInfoSerializer.cpp
index ba296f9..718e550 100644
--- a/Swiften/Serializer/PayloadSerializers/StreamInitiationFileInfoSerializer.cpp
+++ b/Swiften/Serializer/PayloadSerializers/StreamInitiationFileInfoSerializer.cpp
@@ -40,7 +40,7 @@ std::string StreamInitiationFileInfoSerializer::serializePayload(std::shared_ptr
fileElement.setAttribute("name", fileInfo->getName());
}
if (fileInfo->getSize() != 0) {
- fileElement.setAttribute("size", boost::lexical_cast<std::string>(fileInfo->getSize()));
+ fileElement.setAttribute("size", std::to_string(fileInfo->getSize()));
}
if (!fileInfo->getDescription().empty()) {
std::shared_ptr<XMLElement> desc = std::make_shared<XMLElement>("desc", "", fileInfo->getDescription());
@@ -49,7 +49,7 @@ std::string StreamInitiationFileInfoSerializer::serializePayload(std::shared_ptr
if (fileInfo->getSupportsRangeRequests()) {
std::shared_ptr<XMLElement> range = std::make_shared<XMLElement>("range");
if (fileInfo->getRangeOffset() != 0) {
- range->setAttribute("offset", boost::lexical_cast<std::string>(fileInfo->getRangeOffset()));
+ range->setAttribute("offset", std::to_string(fileInfo->getRangeOffset()));
}
fileElement.addNode(range);
}
diff --git a/Swiften/Serializer/PayloadSerializers/StreamInitiationSerializer.cpp b/Swiften/Serializer/PayloadSerializers/StreamInitiationSerializer.cpp
index 3faa5b7..813edb4 100644
--- a/Swiften/Serializer/PayloadSerializers/StreamInitiationSerializer.cpp
+++ b/Swiften/Serializer/PayloadSerializers/StreamInitiationSerializer.cpp
@@ -38,7 +38,7 @@ std::string StreamInitiationSerializer::serializePayload(std::shared_ptr<StreamI
std::shared_ptr<XMLElement> fileElement(new XMLElement("file", "http://jabber.org/protocol/si/profile/file-transfer"));
fileElement->setAttribute("name", file.getName());
if (file.getSize() != 0) {
- fileElement->setAttribute("size", boost::lexical_cast<std::string>(file.getSize()));
+ fileElement->setAttribute("size", std::to_string(file.getSize()));
}
if (!file.getDescription().empty()) {
std::shared_ptr<XMLElement> descElement(new XMLElement("desc"));
diff --git a/Swiften/Serializer/PayloadSerializers/UnitTest/ReferencePayloadSerializerTest.cpp b/Swiften/Serializer/PayloadSerializers/UnitTest/ReferencePayloadSerializerTest.cpp
new file mode 100644
index 0000000..82465d7
--- /dev/null
+++ b/Swiften/Serializer/PayloadSerializers/UnitTest/ReferencePayloadSerializerTest.cpp
@@ -0,0 +1,81 @@
+/*
+ * Copyright (c) 2018 Isode Limited.
+ * All rights reserved.
+ * See the COPYING file for more information.
+ */
+
+#include <gtest/gtest.h>
+
+#include <Swiften/Serializer/PayloadSerializers/ReferencePayloadSerializer.h>
+
+#include <Swiften/Elements/Body.h>
+#include <Swiften/Serializer/PayloadSerializers/FullPayloadSerializerCollection.h>
+
+using namespace Swift;
+
+static FullPayloadSerializerCollection serializers;
+
+TEST(ReferencePayloadSerializerTest, testSerialize) {
+ ReferencePayloadSerializer testling(&serializers);
+ auto reference = std::make_shared<ReferencePayload>();
+ reference->setType(ReferencePayload::Type::Data);
+ reference->setUri(boost::optional<std::string>("https://www.example.com/mindBlowingImage.jpeg"));
+ reference->setBegin(boost::optional<std::string>("11"));
+ reference->setEnd(boost::optional<std::string>("22"));
+ reference->setAnchor(boost::optional<std::string>("xmpp:data@localhost.example.test"));
+
+ std::string expectedResult =
+ "<reference "
+ "anchor=\"xmpp:data@localhost.example.test\" "
+ "begin=\"11\" "
+ "end=\"22\" "
+ "type=\"data\" "
+ "uri=\"https://www.example.com/mindBlowingImage.jpeg\" "
+ "xmlns=\"urn:xmpp:reference:0\"/>";
+
+ ASSERT_EQ(expectedResult, testling.serialize(reference));
+}
+
+TEST(ReferencePayloadSerializerTest, testSerializeNoType) {
+ ReferencePayloadSerializer testling(&serializers);
+ auto reference = std::make_shared<ReferencePayload>();
+ reference->setUri(boost::optional<std::string>("https://www.example.com/mindBlowingImage.jpeg"));
+ reference->setBegin(boost::optional<std::string>("11"));
+ reference->setEnd(boost::optional<std::string>("22"));
+ reference->setAnchor(boost::optional<std::string>("xmpp:data@localhost.example.test"));
+
+ std::string expectedResult =
+ "<reference "
+ "anchor=\"xmpp:data@localhost.example.test\" "
+ "begin=\"11\" "
+ "end=\"22\" "
+ "type=\"data\" "
+ "uri=\"https://www.example.com/mindBlowingImage.jpeg\" "
+ "xmlns=\"urn:xmpp:reference:0\"/>";
+
+ ASSERT_EQ(expectedResult, testling.serialize(reference));
+}
+
+TEST(ReferencePayloadSerializerTest, testSerializeWithEmbeddedPayload) {
+ ReferencePayloadSerializer testling(&serializers);
+ auto reference = std::make_shared<ReferencePayload>();
+ reference->setUri(boost::optional<std::string>("https://www.example.com/mindBlowingImage.jpeg"));
+ reference->setBegin(boost::optional<std::string>("11"));
+ reference->setEnd(boost::optional<std::string>("22"));
+ reference->setAnchor(boost::optional<std::string>("xmpp:data@localhost.example.test"));
+ auto payload = std::make_shared<Body>(std::string("Look, I'm in a reference"));
+ reference->addPayload(payload);
+
+ std::string expectedResult =
+ "<reference "
+ "anchor=\"xmpp:data@localhost.example.test\" "
+ "begin=\"11\" "
+ "end=\"22\" "
+ "type=\"data\" "
+ "uri=\"https://www.example.com/mindBlowingImage.jpeg\" "
+ "xmlns=\"urn:xmpp:reference:0\">"
+ "<body>Look, I'm in a reference</body>"
+ "</reference>";
+
+ ASSERT_EQ(expectedResult, testling.serialize(reference));
+}
diff --git a/Swiften/Serializer/PayloadSerializers/UserTuneSerializer.cpp b/Swiften/Serializer/PayloadSerializers/UserTuneSerializer.cpp
index 687b566..8bb3a4b 100644
--- a/Swiften/Serializer/PayloadSerializers/UserTuneSerializer.cpp
+++ b/Swiften/Serializer/PayloadSerializers/UserTuneSerializer.cpp
@@ -26,7 +26,7 @@ std::string UserTuneSerializer::serializePayload(std::shared_ptr<UserTune> paylo
}
XMLElement element("tune", "http://jabber.org/protocol/tune");
if (payload->getRating()) {
- element.addNode(std::make_shared<XMLElement>("rating", "", boost::lexical_cast<std::string>(*payload->getRating())));
+ element.addNode(std::make_shared<XMLElement>("rating", "", std::to_string(*payload->getRating())));
}
if (payload->getTitle()) {
element.addNode(std::make_shared<XMLElement>("title", "", *payload->getTitle()));
@@ -44,7 +44,7 @@ std::string UserTuneSerializer::serializePayload(std::shared_ptr<UserTune> paylo
element.addNode(std::make_shared<XMLElement>("source", "", *payload->getSource()));
}
if (payload->getLength()) {
- element.addNode(std::make_shared<XMLElement>("length", "", boost::lexical_cast<std::string>(*payload->getLength())));
+ element.addNode(std::make_shared<XMLElement>("length", "", std::to_string(*payload->getLength())));
}
return element.serialize();
}
diff --git a/Swiften/Serializer/PayloadSerializers/WhiteboardSerializer.cpp b/Swiften/Serializer/PayloadSerializers/WhiteboardSerializer.cpp
index 34fd149..f38f5b7 100644
--- a/Swiften/Serializer/PayloadSerializers/WhiteboardSerializer.cpp
+++ b/Swiften/Serializer/PayloadSerializers/WhiteboardSerializer.cpp
@@ -5,7 +5,7 @@
*/
/*
- * Copyright (c) 2016 Isode Limited.
+ * Copyright (c) 2016-2019 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -26,13 +26,13 @@ namespace Swift {
void WhiteboardElementSerializingVisitor::visit(WhiteboardLineElement& line) {
element = std::make_shared<XMLElement>("line");
try {
- element->setAttribute("x1", boost::lexical_cast<std::string>(line.x1()));
- element->setAttribute("y1", boost::lexical_cast<std::string>(line.y1()));
- element->setAttribute("x2", boost::lexical_cast<std::string>(line.x2()));
- element->setAttribute("y2", boost::lexical_cast<std::string>(line.y2()));
+ element->setAttribute("x1", std::to_string(line.x1()));
+ element->setAttribute("y1", std::to_string(line.y1()));
+ element->setAttribute("x2", std::to_string(line.x2()));
+ element->setAttribute("y2", std::to_string(line.y2()));
element->setAttribute("id", line.getID());
element->setAttribute("stroke", line.getColor().toHex());
- element->setAttribute("stroke-width", boost::lexical_cast<std::string>(line.getPenWidth()));
+ element->setAttribute("stroke-width", std::to_string(line.getPenWidth()));
element->setAttribute("opacity", alphaToOpacity(line.getColor().getAlpha()));
} catch (boost::bad_lexical_cast&) {
}
@@ -43,14 +43,14 @@ namespace Swift {
element->setAttribute("id", path.getID());
element->setAttribute("stroke", path.getColor().toHex());
try {
- element->setAttribute("stroke-width", boost::lexical_cast<std::string>(path.getPenWidth()));
+ element->setAttribute("stroke-width", std::to_string(path.getPenWidth()));
element->setAttribute("opacity", alphaToOpacity(path.getColor().getAlpha()));
std::string pathData;
if (path.getPoints().size() != 0) {
std::vector<std::pair<int, int> >::const_iterator it = path.getPoints().begin();
- pathData = "M"+boost::lexical_cast<std::string>(it->first)+" "+boost::lexical_cast<std::string>(it->second)+"L";
+ pathData = "M"+std::to_string(it->first)+" "+std::to_string(it->second)+"L";
for (; it != path.getPoints().end(); ++it) {
- pathData += boost::lexical_cast<std::string>(it->first)+" "+boost::lexical_cast<std::string>(it->second)+" ";
+ pathData += std::to_string(it->first)+" "+std::to_string(it->second)+" ";
}
}
element->setAttribute("d", pathData);
@@ -61,14 +61,14 @@ namespace Swift {
void WhiteboardElementSerializingVisitor::visit(WhiteboardRectElement& rect) {
element = std::make_shared<XMLElement>("rect");
try {
- element->setAttribute("x", boost::lexical_cast<std::string>(rect.getX()));
- element->setAttribute("y", boost::lexical_cast<std::string>(rect.getY()));
- element->setAttribute("width", boost::lexical_cast<std::string>(rect.getWidth()));
- element->setAttribute("height", boost::lexical_cast<std::string>(rect.getHeight()));
+ element->setAttribute("x", std::to_string(rect.getX()));
+ element->setAttribute("y", std::to_string(rect.getY()));
+ element->setAttribute("width", std::to_string(rect.getWidth()));
+ element->setAttribute("height", std::to_string(rect.getHeight()));
element->setAttribute("id", rect.getID());
element->setAttribute("stroke", rect.getPenColor().toHex());
- element->setAttribute("fill", rect.getBrushColor().toHex());;
- element->setAttribute("stroke-width", boost::lexical_cast<std::string>(rect.getPenWidth()));
+ element->setAttribute("fill", rect.getBrushColor().toHex());
+ element->setAttribute("stroke-width", std::to_string(rect.getPenWidth()));
element->setAttribute("opacity", alphaToOpacity(rect.getPenColor().getAlpha()));
element->setAttribute("fill-opacity", alphaToOpacity(rect.getBrushColor().getAlpha()));
} catch (boost::bad_lexical_cast&) {
@@ -80,14 +80,14 @@ namespace Swift {
try {
element->setAttribute("id", polygon.getID());
element->setAttribute("stroke", polygon.getPenColor().toHex());
- element->setAttribute("fill", polygon.getBrushColor().toHex());;
- element->setAttribute("stroke-width", boost::lexical_cast<std::string>(polygon.getPenWidth()));
+ element->setAttribute("fill", polygon.getBrushColor().toHex());
+ element->setAttribute("stroke-width", std::to_string(polygon.getPenWidth()));
element->setAttribute("opacity", alphaToOpacity(polygon.getPenColor().getAlpha()));
element->setAttribute("fill-opacity", alphaToOpacity(polygon.getBrushColor().getAlpha()));
std::string points;
std::vector<std::pair<int, int> >::const_iterator it = polygon.getPoints().begin();
for (; it != polygon.getPoints().end(); ++it) {
- points += boost::lexical_cast<std::string>(it->first)+","+boost::lexical_cast<std::string>(it->second)+" ";
+ points += std::to_string(it->first)+","+std::to_string(it->second)+" ";
}
element->setAttribute("points", points);
} catch (boost::bad_lexical_cast&) {
@@ -97,9 +97,9 @@ namespace Swift {
void WhiteboardElementSerializingVisitor::visit(WhiteboardTextElement& text) {
element = std::make_shared<XMLElement>("text");
try {
- element->setAttribute("x", boost::lexical_cast<std::string>(text.getX()));
- element->setAttribute("y", boost::lexical_cast<std::string>(text.getY()));
- element->setAttribute("font-size", boost::lexical_cast<std::string>(text.getSize()));
+ element->setAttribute("x", std::to_string(text.getX()));
+ element->setAttribute("y", std::to_string(text.getY()));
+ element->setAttribute("font-size", std::to_string(text.getSize()));
element->setAttribute("id", text.getID());
element->setAttribute("fill", text.getColor().toHex());
element->setAttribute("opacity", alphaToOpacity(text.getColor().getAlpha()));
@@ -111,14 +111,14 @@ namespace Swift {
void WhiteboardElementSerializingVisitor::visit(WhiteboardEllipseElement& ellipse) {
element = std::make_shared<XMLElement>("ellipse");
try {
- element->setAttribute("cx", boost::lexical_cast<std::string>(ellipse.getCX()));
- element->setAttribute("cy", boost::lexical_cast<std::string>(ellipse.getCY()));
- element->setAttribute("rx", boost::lexical_cast<std::string>(ellipse.getRX()));
- element->setAttribute("ry", boost::lexical_cast<std::string>(ellipse.getRY()));
+ element->setAttribute("cx", std::to_string(ellipse.getCX()));
+ element->setAttribute("cy", std::to_string(ellipse.getCY()));
+ element->setAttribute("rx", std::to_string(ellipse.getRX()));
+ element->setAttribute("ry", std::to_string(ellipse.getRY()));
element->setAttribute("id", ellipse.getID());
element->setAttribute("stroke", ellipse.getPenColor().toHex());
- element->setAttribute("fill", ellipse.getBrushColor().toHex());;
- element->setAttribute("stroke-width", boost::lexical_cast<std::string>(ellipse.getPenWidth()));
+ element->setAttribute("fill", ellipse.getBrushColor().toHex());
+ element->setAttribute("stroke-width", std::to_string(ellipse.getPenWidth()));
element->setAttribute("opacity", alphaToOpacity(ellipse.getPenColor().getAlpha()));
element->setAttribute("fill-opacity", alphaToOpacity(ellipse.getBrushColor().getAlpha()));
} catch (boost::bad_lexical_cast&) {
@@ -134,7 +134,7 @@ namespace Swift {
if (opacity == 100) {
return "1";
} else {
- return "."+boost::lexical_cast<std::string>(opacity);
+ return "."+std::to_string(opacity);
}
}
@@ -148,7 +148,7 @@ namespace Swift {
if (insertOp) {
try {
operationNode->setAttribute("type", "insert");
- operationNode->setAttribute("pos", boost::lexical_cast<std::string>(insertOp->getPos()));
+ operationNode->setAttribute("pos", std::to_string(insertOp->getPos()));
operationNode->setAttribute("id", insertOp->getID());
operationNode->setAttribute("parentid", insertOp->getParentID());
} catch (boost::bad_lexical_cast&) {
@@ -160,10 +160,10 @@ namespace Swift {
if (updateOp) {
try {
operationNode->setAttribute("type", "update");
- operationNode->setAttribute("pos", boost::lexical_cast<std::string>(updateOp->getPos()));
+ operationNode->setAttribute("pos", std::to_string(updateOp->getPos()));
operationNode->setAttribute("id", updateOp->getID());
operationNode->setAttribute("parentid", updateOp->getParentID());
- operationNode->setAttribute("newpos", boost::lexical_cast<std::string>(updateOp->getNewPos()));
+ operationNode->setAttribute("newpos", std::to_string(updateOp->getNewPos()));
} catch (boost::bad_lexical_cast&) {
}
updateOp->getElement()->accept(visitor);
@@ -175,7 +175,7 @@ namespace Swift {
if (deleteOp) {
try {
operationNode->setAttribute("type", "delete");
- operationNode->setAttribute("pos", boost::lexical_cast<std::string>(deleteOp->getPos()));
+ operationNode->setAttribute("pos", std::to_string(deleteOp->getPos()));
operationNode->setAttribute("id", deleteOp->getID());
operationNode->setAttribute("parentid", deleteOp->getParentID());
operationNode->setAttribute("elementid", deleteOp->getElementID());
@@ -199,7 +199,7 @@ namespace Swift {
case WhiteboardPayload::SessionTerminate:
return "session-terminate";
case WhiteboardPayload::UnknownType:
- SWIFT_LOG(warning) << "Serializing unknown action value." << std::endl;
+ SWIFT_LOG(warning) << "Serializing unknown action value.";
return "";
}
assert(false);
diff --git a/Swiften/Serializer/StanzaAckSerializer.h b/Swiften/Serializer/StanzaAckSerializer.h
index f5a27dc..228d67b 100644
--- a/Swiften/Serializer/StanzaAckSerializer.h
+++ b/Swiften/Serializer/StanzaAckSerializer.h
@@ -25,7 +25,7 @@ namespace Swift {
StanzaAck::ref stanzaAck(std::dynamic_pointer_cast<StanzaAck>(element));
assert(stanzaAck->isValid());
XMLElement result("a", "urn:xmpp:sm:2");
- result.setAttribute("h", std::string(boost::lexical_cast<std::string>(stanzaAck->getHandledStanzasCount())));
+ result.setAttribute("h", std::string(std::to_string(stanzaAck->getHandledStanzasCount())));
return createSafeByteArray(result.serialize());
}
};
diff --git a/Swiften/Serializer/StanzaSerializer.cpp b/Swiften/Serializer/StanzaSerializer.cpp
index 3de706d..d4231c5 100644
--- a/Swiften/Serializer/StanzaSerializer.cpp
+++ b/Swiften/Serializer/StanzaSerializer.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010-2016 Isode Limited.
+ * Copyright (c) 2010-2019 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -53,7 +53,7 @@ SafeByteArray StanzaSerializer::serialize(std::shared_ptr<ToplevelElement> eleme
serializedPayloads += serializer->serialize(payload);
}
else {
- SWIFT_LOG(warning) << "Could not find serializer for " << typeid(*(payload.get())).name() << std::endl;
+ SWIFT_LOG(warning) << "Could not find serializer for " << typeid(*(payload.get())).name();
}
}
serializedPayloads = String::sanitizeXMPPString(serializedPayloads);
diff --git a/Swiften/Serializer/StreamErrorSerializer.cpp b/Swiften/Serializer/StreamErrorSerializer.cpp
index 66a71ca..684e8fe 100644
--- a/Swiften/Serializer/StreamErrorSerializer.cpp
+++ b/Swiften/Serializer/StreamErrorSerializer.cpp
@@ -30,7 +30,6 @@ SafeByteArray StreamErrorSerializer::serialize(std::shared_ptr<ToplevelElement>
case StreamError::ImproperAddressing: typeTag = "improper-addressing"; break;
case StreamError::InternalServerError: typeTag = "internal-server-error"; break;
case StreamError::InvalidFrom: typeTag = "invalid-from"; break;
- case StreamError::InvalidID: typeTag = "invalid-id"; break;
case StreamError::InvalidNamespace: typeTag = "invalid-namespace"; break;
case StreamError::InvalidXML: typeTag = "invalid-xml"; break;
case StreamError::NotAuthorized: typeTag = "not-authorized"; break;
@@ -44,6 +43,7 @@ SafeByteArray StreamErrorSerializer::serialize(std::shared_ptr<ToplevelElement>
case StreamError::SystemShutdown: typeTag = "system-shutdown"; break;
case StreamError::UndefinedCondition: typeTag = "undefined-condition"; break;
case StreamError::UnsupportedEncoding: typeTag = "unsupported-encoding"; break;
+ case StreamError::UnsupportedFeature: typeTag = "unsupported-feature"; break;
case StreamError::UnsupportedStanzaType: typeTag = "unsupported-stanza-type"; break;
case StreamError::UnsupportedVersion: typeTag = "unsupported-version"; break;
}
diff --git a/Swiften/Serializer/StreamResumeSerializer.cpp b/Swiften/Serializer/StreamResumeSerializer.cpp
index 619ac9c..e4a40c9 100644
--- a/Swiften/Serializer/StreamResumeSerializer.cpp
+++ b/Swiften/Serializer/StreamResumeSerializer.cpp
@@ -23,7 +23,7 @@ SafeByteArray StreamResumeSerializer::serialize(std::shared_ptr<ToplevelElement>
XMLElement element("resume", "urn:xmpp:sm:2");
element.setAttribute("previd", e->getResumeID());
if (e->getHandledStanzasCount()) {
- element.setAttribute("h", boost::lexical_cast<std::string>(e->getHandledStanzasCount().get()));
+ element.setAttribute("h", std::to_string(e->getHandledStanzasCount().get()));
}
return createSafeByteArray(element.serialize());
}
diff --git a/Swiften/Serializer/StreamResumedSerializer.cpp b/Swiften/Serializer/StreamResumedSerializer.cpp
index 5b88ded..2398335 100644
--- a/Swiften/Serializer/StreamResumedSerializer.cpp
+++ b/Swiften/Serializer/StreamResumedSerializer.cpp
@@ -23,7 +23,7 @@ SafeByteArray StreamResumedSerializer::serialize(std::shared_ptr<ToplevelElement
XMLElement element("resumed", "urn:xmpp:sm:2");
element.setAttribute("previd", e->getResumeID());
if (e->getHandledStanzasCount()) {
- element.setAttribute("h", boost::lexical_cast<std::string>(e->getHandledStanzasCount().get()));
+ element.setAttribute("h", std::to_string(e->getHandledStanzasCount().get()));
}
return createSafeByteArray(element.serialize());
}
diff --git a/Swiften/Serializer/XML/UnitTest/XMLElementTest.cpp b/Swiften/Serializer/XML/UnitTest/XMLElementTest.cpp
index ed3f8ab..ce6d7fa 100644
--- a/Swiften/Serializer/XML/UnitTest/XMLElementTest.cpp
+++ b/Swiften/Serializer/XML/UnitTest/XMLElementTest.cpp
@@ -65,6 +65,13 @@ class XMLElementTest : public CppUnit::TestFixture
CPPUNIT_ASSERT_EQUAL(std::string("<foo myatt=\"\"/>"), testling.serialize());
}
+
+ void testEscape_SpecialAttributeCharacters() {
+ auto testling = XMLElement::escapeAttributeValue(R"(<"'&>not escaped.)");
+
+ CPPUNIT_ASSERT_EQUAL(std::string("&lt;&quot;&apos;&amp;&gt;not escaped."), testling);
+ }
+
};
CPPUNIT_TEST_SUITE_REGISTRATION(XMLElementTest);
diff --git a/Swiften/Serializer/XML/XMLElement.cpp b/Swiften/Serializer/XML/XMLElement.cpp
index f2397ca..7515061 100644
--- a/Swiften/Serializer/XML/XMLElement.cpp
+++ b/Swiften/Serializer/XML/XMLElement.cpp
@@ -39,14 +39,17 @@ std::string XMLElement::serialize() {
return result;
}
+std::string XMLElement::escapeAttributeValue(std::string value) {
+ String::replaceAll(value, '&', "&amp;");
+ String::replaceAll(value, '<', "&lt;");
+ String::replaceAll(value, '>', "&gt;");
+ String::replaceAll(value, '\'', "&apos;");
+ String::replaceAll(value, '"', "&quot;");
+ return value;
+}
+
void XMLElement::setAttribute(const std::string& attribute, const std::string& value) {
- std::string escapedValue(value);
- String::replaceAll(escapedValue, '&', "&amp;");
- String::replaceAll(escapedValue, '<', "&lt;");
- String::replaceAll(escapedValue, '>', "&gt;");
- String::replaceAll(escapedValue, '\'', "&apos;");
- String::replaceAll(escapedValue, '"', "&quot;");
- attributes_[attribute] = escapedValue;
+ attributes_[attribute] = escapeAttributeValue(value);
}
void XMLElement::addNode(std::shared_ptr<XMLNode> node) {
diff --git a/Swiften/Serializer/XML/XMLElement.h b/Swiften/Serializer/XML/XMLElement.h
index 54de041..db74626 100644
--- a/Swiften/Serializer/XML/XMLElement.h
+++ b/Swiften/Serializer/XML/XMLElement.h
@@ -21,6 +21,7 @@ namespace Swift {
XMLElement(const std::string& tag, const std::string& xmlns = "", const std::string& text = "");
+ static std::string escapeAttributeValue(std::string value);
void setAttribute(const std::string& attribute, const std::string& value);
void addNode(std::shared_ptr<XMLNode> node);
diff --git a/Swiften/Serializer/XMPPSerializer.cpp b/Swiften/Serializer/XMPPSerializer.cpp
index 9cde777..7a003fb 100644
--- a/Swiften/Serializer/XMPPSerializer.cpp
+++ b/Swiften/Serializer/XMPPSerializer.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010-2016 Isode Limited.
+ * Copyright (c) 2010-2019 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -89,7 +89,7 @@ SafeByteArray XMPPSerializer::serializeElement(std::shared_ptr<ToplevelElement>
return (*i)->serialize(element);
}
else {
- SWIFT_LOG(warning) << "Could not find serializer for " << typeid(*(element.get())).name() << std::endl;
+ SWIFT_LOG(warning) << "Could not find serializer for " << typeid(*(element.get())).name();
return createSafeByteArray("");
}
}