summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJoanna Hulboj <joanna.hulboj@isode.com>2017-03-18 18:52:56 (GMT)
committerJoanna Hulboj <joanna.hulboj@isode.com>2017-03-28 14:19:18 (GMT)
commit0e503ccd97ca5287a14d3147b0deaa99892ccd6f (patch)
tree5500f9f6376f8fa6544fc281ed40ea8b18d7129b /Swiften/Client/XMLBeautifier.h
parentcc873b3f00db4cd0a778bc2ec04f8748d70a92f9 (diff)
downloadswift-0e503ccd97ca5287a14d3147b0deaa99892ccd6f.zip
swift-0e503ccd97ca5287a14d3147b0deaa99892ccd6f.tar.bz2
Modified XMLBeautifier to handle split payloads
When receiving network data we were processing it in chunks. Sometimes one XML message got split across multiple chunks. XMLBeautifier was stateless and would create a new parser for every single chunk. This was causing multi-chunk messages to be truncated in the beautified output. The change I made in XMLBeautifier allows it to maintain the state. Test-Information: Tested unger Windows 10 and CentOS. Unit tests pass OK. Change-Id: Idad2a8e0248ed3cbe2b47a12718b909e56ac1279
Diffstat (limited to 'Swiften/Client/XMLBeautifier.h')
-rw-r--r--Swiften/Client/XMLBeautifier.h24
1 files changed, 14 insertions, 10 deletions
diff --git a/Swiften/Client/XMLBeautifier.h b/Swiften/Client/XMLBeautifier.h
index 8da935a..7458211 100644
--- a/Swiften/Client/XMLBeautifier.h
+++ b/Swiften/Client/XMLBeautifier.h
@@ -12,6 +12,7 @@
#pragma once
+#include <memory>
#include <sstream>
#include <stack>
#include <string>
@@ -27,10 +28,12 @@ namespace Swift {
class SWIFTEN_API XMLBeautifier : public XMLParserClient {
public:
+
XMLBeautifier(bool indention, bool coloring);
- virtual ~XMLBeautifier();
std::string beautify(const std::string&);
+ bool wasReset() const;
+ int getLevel() const;
private:
void handleStartElement(const std::string& element, const std::string& ns, const AttributeMap& attributes);
@@ -39,6 +42,7 @@ private:
private:
void indent();
+ void reset();
private:
std::string styleTag(const std::string& text) const;
@@ -47,16 +51,16 @@ private:
std::string styleValue(const std::string& text) const;
private:
- bool doIndention;
- bool doColoring;
+ const bool doIndention_;
+ const bool doColoring_;
- int intLevel;
- std::string inputBuffer;
- std::stringstream buffer;
- XMLParserFactory* factory;
- XMLParser* parser;
+ std::unique_ptr<XMLParserFactory> factory_;
+ std::unique_ptr<XMLParser> parser_;
- bool lastWasStepDown;
- std::stack<std::string> parentNSs;
+ bool wasReset_ = true;
+ int intLevel_ = 0;
+ bool lastWasStepDown_ = false;
+ std::stringstream buffer_;
+ std::stack<std::string> parentNSs_;
};
}