3 *****************************************************************************
4 * Copyright (C) 2010 - 2011 Klagenfurt University
6 * Created on: Aug 10, 2010
7 * Authors: Christopher Mueller <christopher.mueller@itec.uni-klu.ac.at>
8 * Christian Timmerer <christian.timmerer@itec.uni-klu.ac.at>
10 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU Lesser General Public License as published
12 * by the Free Software Foundation; either version 2.1 of the License, or
13 * (at your option) any later version.
15 * This program is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU General Public License for more details.
20 * You should have received a copy of the GNU Lesser General Public License
21 * along with this program; if not, write to the Free Software
22 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
23 *****************************************************************************/
28 #include "DOMParser.h"
30 using namespace dash::xml;
31 using namespace dash::http;
32 using namespace dash::mpd;
34 DOMParser::DOMParser (stream_t *stream) :
42 DOMParser::~DOMParser ()
45 xml_ReaderDelete(this->vlc_reader);
47 xml_Delete( this->vlc_xml );
50 Node* DOMParser::getRootNode ()
54 bool DOMParser::parse ()
56 this->vlc_xml = xml_Create(this->stream);
61 this->vlc_reader = xml_ReaderCreate(this->vlc_xml, this->stream);
66 this->root = this->processNode();
70 Node* DOMParser::processNode ()
73 int type = xml_ReaderNextNode(this->vlc_reader, &data);
74 if(type != XML_READER_TEXT && type != XML_READER_NONE && type != XML_READER_ENDELEM)
76 Node *node = new Node();
78 std::string name = data;
79 bool isEmpty = xml_ReaderIsEmptyElement(this->vlc_reader);
82 this->addAttributesToNode(node);
89 while((subnode = this->processNode()) != NULL)
90 node->addSubNode(subnode);
96 void DOMParser::addAttributesToNode (Node *node)
98 const char *attrValue;
101 while((attrName = xml_ReaderNextAttr(this->vlc_reader, &attrValue)) != NULL)
103 std::string key = attrName;
104 std::string value = attrValue;
105 node->addAttribute(key, value);
108 void DOMParser::print (Node *node, int offset)
110 for(int i = 0; i < offset; i++)
111 msg_Dbg(this->stream, " ");
113 msg_Dbg(this->stream, "%s", node->getName().c_str());
115 std::vector<std::string> keys = node->getAttributeKeys();
117 for(size_t i = 0; i < keys.size(); i++)
118 msg_Dbg(this->stream, " %s=%s", keys.at(i).c_str(), node->getAttributeValue(keys.at(i)).c_str());
120 msg_Dbg(this->stream, "\n");
124 for(size_t i = 0; i < node->getSubNodes().size(); i++)
126 this->print(node->getSubNodes().at(i), offset);
130 void DOMParser::print ()
132 this->print(this->root, 0);
134 Profile DOMParser::getProfile (dash::xml::Node *node)
136 std::string profile = node->getAttributeValue("profiles");
138 if(!profile.compare("urn:mpeg:mpegB:profile:dash:isoff-basic-on-demand:cm"))
139 return dash::mpd::BasicCM;
141 return dash::mpd::NotValid;
143 bool DOMParser::isDash (stream_t *stream)
147 const char* psz_namespace = "urn:mpeg:mpegB:schema:DASH:MPD:DIS2011";
148 if(stream_Peek(stream, &peek, 1024) < (int)strlen(psz_namespace))
151 const char *p = strstr((const char*)peek, psz_namespace );