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)
36 this->stream = stream;
39 DOMParser::~DOMParser ()
42 xml_ReaderDelete(this->vlc_reader);
44 xml_Delete( this->vlc_xml );
47 Node* DOMParser::getRootNode ()
51 bool DOMParser::parse ()
53 this->vlc_xml = xml_Create(this->stream);
58 this->vlc_reader = xml_ReaderCreate(this->vlc_xml, this->stream);
63 this->root = this->processNode();
67 Node* DOMParser::processNode ()
70 int type = xml_ReaderNextNode(this->vlc_reader, &data);
71 if(type != XML_READER_TEXT && type != XML_READER_NONE && type != XML_READER_ENDELEM)
73 Node *node = new Node();
75 std::string name = data;
76 bool isEmpty = xml_ReaderIsEmptyElement(this->vlc_reader);
79 this->addAttributesToNode(node);
86 while((subnode = this->processNode()) != NULL)
87 node->addSubNode(subnode);
93 void DOMParser::addAttributesToNode (Node *node)
95 const char *attrValue;
98 while((attrName = xml_ReaderNextAttr(this->vlc_reader, &attrValue)) != NULL)
100 std::string key = attrName;
101 std::string value = attrValue;
102 node->addAttribute(key, value);
105 void DOMParser::print (Node *node, int offset)
107 for(int i = 0; i < offset; i++)
108 msg_Dbg(this->stream, " ");
110 msg_Dbg(this->stream, "%s", node->getName().c_str());
112 std::vector<std::string> keys = node->getAttributeKeys();
114 for(size_t i = 0; i < keys.size(); i++)
115 msg_Dbg(this->stream, " %s=%s", keys.at(i).c_str(), node->getAttributeValue(keys.at(i)).c_str());
117 msg_Dbg(this->stream, "\n");
121 for(size_t i = 0; i < node->getSubNodes().size(); i++)
123 this->print(node->getSubNodes().at(i), offset);
126 void DOMParser::init ()
129 this->vlc_reader = NULL;
131 void DOMParser::print ()
133 this->print(this->root, 0);
135 Profile DOMParser::getProfile (dash::xml::Node *node)
137 std::string profile = node->getAttributeValue("profiles");
139 if(!profile.compare("urn:mpeg:mpegB:profile:dash:isoff-basic-on-demand:cm"))
140 return dash::mpd::BasicCM;
142 return dash::mpd::NotValid;
144 bool DOMParser::isDash (stream_t *stream)
148 const char* psz_namespace = "urn:mpeg:mpegB:schema:DASH:MPD:DIS2011";
149 if(stream_Peek(stream, &peek, 1024) < (int)strlen(psz_namespace))
152 const char *p = strstr((const char*)peek, psz_namespace );