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 ()
46 xml_ReaderDelete(this->vlc_reader);
48 xml_Delete( this->vlc_xml );
51 Node* DOMParser::getRootNode ()
55 bool DOMParser::parse ()
57 this->vlc_xml = xml_Create(this->stream);
62 this->vlc_reader = xml_ReaderCreate(this->vlc_xml, this->stream);
67 this->root = this->processNode();
71 Node* DOMParser::processNode ()
74 int type = xml_ReaderNextNode(this->vlc_reader, &data);
75 if(type != -1 && type != XML_READER_TEXT && type != XML_READER_NONE && type != XML_READER_ENDELEM)
77 Node *node = new Node();
79 std::string name = data;
80 bool isEmpty = xml_ReaderIsEmptyElement(this->vlc_reader);
83 this->addAttributesToNode(node);
90 while((subnode = this->processNode()) != NULL)
91 node->addSubNode(subnode);
97 void DOMParser::addAttributesToNode (Node *node)
99 const char *attrValue;
100 const char *attrName;
102 while((attrName = xml_ReaderNextAttr(this->vlc_reader, &attrValue)) != NULL)
104 std::string key = attrName;
105 std::string value = attrValue;
106 node->addAttribute(key, value);
109 void DOMParser::print (Node *node, int offset)
111 for(int i = 0; i < offset; i++)
112 msg_Dbg(this->stream, " ");
114 msg_Dbg(this->stream, "%s", node->getName().c_str());
116 std::vector<std::string> keys = node->getAttributeKeys();
118 for(size_t i = 0; i < keys.size(); i++)
119 msg_Dbg(this->stream, " %s=%s", keys.at(i).c_str(), node->getAttributeValue(keys.at(i)).c_str());
121 msg_Dbg(this->stream, "\n");
125 for(size_t i = 0; i < node->getSubNodes().size(); i++)
127 this->print(node->getSubNodes().at(i), offset);
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)
146 const char* psz_namespace = "urn:mpeg:mpegB:schema:DASH:MPD:DIS2011";
149 int peek_size = stream_Peek(stream, &peek, 1024);
150 if (peek_size < (int)strlen(psz_namespace))
153 std::string header((const char*)peek, peek_size);
154 return header.find(psz_namespace) != std::string::npos;