diff options
| author | Edwin Mons <edwin.mons@isode.com> | 2019-07-22 08:54:55 (GMT) |
|---|---|---|
| committer | Edwin Mons <edwin.mons@isode.com> | 2019-07-22 10:13:33 (GMT) |
| commit | f6fb85ba98fdd6601c4b8323c51c8367ccc4b52e (patch) | |
| tree | 16f37c7ad860a527aac7e29e4b9d7e61bf1b635f /Swiften/Parser/ExpatParser.cpp | |
| parent | f4b6bfbf4c1573e9914185e2ef170f47838ea11a (diff) | |
| download | swift-f6fb85ba98fdd6601c4b8323c51c8367ccc4b52e.zip swift-f6fb85ba98fdd6601c4b8323c51c8367ccc4b52e.tar.bz2 | |
Signal namespace declarations to ParserClients
Prior to calling handleStartElement, the ParserClient
handleNamespaceDeclaration will fire for each namespace declared on the
element.
Test-Information:
Unit tests pass on Debian 9 for both expat and libxml2
Change-Id: Ic42e83aee83edfbb2aa5c971997808eb6e133223
Diffstat (limited to 'Swiften/Parser/ExpatParser.cpp')
| -rw-r--r-- | Swiften/Parser/ExpatParser.cpp | 5 |
1 files changed, 5 insertions, 0 deletions
diff --git a/Swiften/Parser/ExpatParser.cpp b/Swiften/Parser/ExpatParser.cpp index e4e66f2..a50949b 100644 --- a/Swiften/Parser/ExpatParser.cpp +++ b/Swiften/Parser/ExpatParser.cpp @@ -58,30 +58,35 @@ static void handleEndElement(void* parser, const XML_Char* name) { static void handleCharacterData(void* parser, const XML_Char* data, int len) { assert(len >= 0); static_cast<XMLParser*>(parser)->getClient()->handleCharacterData(std::string(data, static_cast<size_t>(len))); } static void handleXMLDeclaration(void*, const XML_Char*, const XML_Char*, int) { } +static void handleNamespaceDeclaration(void* parser, const XML_Char* prefix, const XML_Char* uri) { + static_cast<XMLParser*>(parser)->getClient()->handleNamespaceDeclaration(std::string(prefix ? prefix : ""), std::string(uri ? uri : "")); +} + static void handleEntityDeclaration(void* parser, const XML_Char*, int, const XML_Char*, int, const XML_Char*, const XML_Char*, const XML_Char*, const XML_Char*) { static_cast<ExpatParser*>(parser)->stopParser(); } ExpatParser::ExpatParser(XMLParserClient* client) : XMLParser(client), p(new Private()) { p->parser_ = XML_ParserCreateNS("UTF-8", NAMESPACE_SEPARATOR); XML_SetUserData(p->parser_, this); XML_SetElementHandler(p->parser_, handleStartElement, handleEndElement); XML_SetCharacterDataHandler(p->parser_, handleCharacterData); XML_SetXmlDeclHandler(p->parser_, handleXMLDeclaration); XML_SetEntityDeclHandler(p->parser_, handleEntityDeclaration); + XML_SetNamespaceDeclHandler(p->parser_, handleNamespaceDeclaration, nullptr); } ExpatParser::~ExpatParser() { XML_ParserFree(p->parser_); } bool ExpatParser::parse(const std::string& data, bool finalData) { if (data.size() > std::numeric_limits<int>::max()) { return false; |
Swift