From 53beda0af7fd8550b9e846b84245ee7ddd6b79ca Mon Sep 17 00:00:00 2001 From: Francois Cartegnie Date: Wed, 24 Dec 2014 22:26:56 +0100 Subject: [PATCH] demux: dash: fix and debug DOM Parsing --- modules/stream_filter/dash/xml/DOMParser.cpp | 80 ++++++++++++++------ modules/stream_filter/dash/xml/Node.cpp | 28 ++++--- modules/stream_filter/dash/xml/Node.h | 2 +- 3 files changed, 73 insertions(+), 37 deletions(-) diff --git a/modules/stream_filter/dash/xml/DOMParser.cpp b/modules/stream_filter/dash/xml/DOMParser.cpp index 447e14fd29..1ebc3d5c2a 100644 --- a/modules/stream_filter/dash/xml/DOMParser.cpp +++ b/modules/stream_filter/dash/xml/DOMParser.cpp @@ -29,6 +29,7 @@ #include "../Helper.h" #include +#include #include #include @@ -68,43 +69,74 @@ bool DOMParser::parse () if(!this->vlc_reader) return false; - this->root = this->processNode(); - if ( this->root == NULL ) + root = processNode(); + if ( root == NULL ) return false; return true; } -Node* DOMParser::processNode () + +Node* DOMParser::processNode() { const char *data; - int type = xml_ReaderNextNode(this->vlc_reader, &data); - if(type != -1 && type != XML_READER_NONE && type != XML_READER_ENDELEM) - { - Node *node = new Node(); - node->setType( type ); + int type; + std::stack lifo; - if ( type != XML_READER_TEXT ) + while( (type = xml_ReaderNextNode(vlc_reader, &data)) > 0 ) + { + switch(type) { - std::string name = data; - bool isEmpty = xml_ReaderIsEmptyElement(this->vlc_reader); - node->setName(name); - - this->addAttributesToNode(node); + case XML_READER_STARTELEM: + { + bool empty = xml_ReaderIsEmptyElement(vlc_reader); + Node *node = new (std::nothrow) Node(); + if(node) + { + if(!lifo.empty()) + lifo.top()->addSubNode(node); + lifo.push(node); + + node->setName(std::string(data)); + addAttributesToNode(node); + } + + if(empty) + lifo.pop(); + break; + } + + case XML_READER_TEXT: + { + if(!lifo.empty()) + lifo.top()->setText(std::string(data)); + break; + } + + case XML_READER_ENDELEM: + { + if(lifo.empty()) + return NULL; + + Node *node = lifo.top(); + lifo.pop(); + if(lifo.empty()) + return node; + } + + default: + break; + } + } - if(isEmpty) - return node; + while( lifo.size() > 1 ) + lifo.pop(); - Node *subnode = NULL; + if(!lifo.empty()) + delete lifo.top(); - while((subnode = this->processNode()) != NULL) - node->addSubNode(subnode); - } - else - node->setText( data ); - return node; - } return NULL; } + void DOMParser::addAttributesToNode (Node *node) { const char *attrValue; diff --git a/modules/stream_filter/dash/xml/Node.cpp b/modules/stream_filter/dash/xml/Node.cpp index ace85ee998..c2140cfdd1 100644 --- a/modules/stream_filter/dash/xml/Node.cpp +++ b/modules/stream_filter/dash/xml/Node.cpp @@ -94,20 +94,9 @@ std::vector Node::getAttributeKeys () const return keys; } -bool Node::hasText () const -{ - return false; -} - const std::string& Node::getText () const { - if ( this->type == XML_READER_TEXT ) - return this->text; - else - { - assert( this->subNodes.size() == 1 ); - return this->subNodes[0]->getText(); - } + return text; } void Node::setText(const std::string &text) @@ -129,3 +118,18 @@ void Node::setType(int type) { this->type = type; } + +std::vector Node::toString(int indent) const +{ + std::vector ret; + std::string text(indent, ' '); + text.append(getName()); + ret.push_back(text); + std::vector::const_iterator l; + for(l = subNodes.begin(); l < subNodes.end(); l++) + { + std::vector sub = (*l)->toString(indent + 1); + ret.insert(ret.end(), sub.begin(), sub.end()); + } + return ret; +} diff --git a/modules/stream_filter/dash/xml/Node.h b/modules/stream_filter/dash/xml/Node.h index cca07fda41..ebd3ff9625 100644 --- a/modules/stream_filter/dash/xml/Node.h +++ b/modules/stream_filter/dash/xml/Node.h @@ -48,12 +48,12 @@ namespace dash void addAttribute (const std::string& key, const std::string& value); const std::string& getAttributeValue (const std::string& key) const; std::vector getAttributeKeys () const; - bool hasText () const; const std::string& getText () const; void setText( const std::string &text ); const std::map& getAttributes () const; int getType() const; void setType( int type ); + std::vector toString(int) const; private: static const std::string EmptyString; -- 2.39.2