|
Packit |
f70c98 |
/* --------------------------------------------------------------------------
|
|
Packit |
f70c98 |
|
|
Packit |
f70c98 |
libmusicbrainz5 - Client library to access MusicBrainz
|
|
Packit |
f70c98 |
|
|
Packit |
f70c98 |
Copyright (C) 2012 Christophe Fergeau
|
|
Packit |
f70c98 |
|
|
Packit |
f70c98 |
This file is part of libmusicbrainz5.
|
|
Packit |
f70c98 |
|
|
Packit |
f70c98 |
This library is free software; you can redistribute it and/or
|
|
Packit |
f70c98 |
modify it under the terms of the GNU Lesser General Public
|
|
Packit |
f70c98 |
License as published by the Free Software Foundation; either
|
|
Packit |
f70c98 |
version 2.1 of the License, or (at your option) any later version.
|
|
Packit |
f70c98 |
|
|
Packit |
f70c98 |
libmusicbrainz5 is distributed in the hope that it will be useful,
|
|
Packit |
f70c98 |
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
Packit |
f70c98 |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
Packit |
f70c98 |
Lesser General Public License for more details.
|
|
Packit |
f70c98 |
|
|
Packit |
f70c98 |
You should have received a copy of the GNU General Public License
|
|
Packit |
f70c98 |
along with this library. If not, see <http://www.gnu.org/licenses/>.
|
|
Packit |
f70c98 |
|
|
Packit |
f70c98 |
$Id$
|
|
Packit |
f70c98 |
|
|
Packit |
f70c98 |
----------------------------------------------------------------------------*/
|
|
Packit |
f70c98 |
|
|
Packit |
f70c98 |
#include "config.h"
|
|
Packit |
f70c98 |
#include "musicbrainz5/defines.h"
|
|
Packit |
f70c98 |
|
|
Packit |
f70c98 |
#include "musicbrainz5/xmlParser.h"
|
|
Packit |
f70c98 |
|
|
Packit |
f70c98 |
#include <cstring>
|
|
Packit |
f70c98 |
#include <libxml/tree.h>
|
|
Packit |
f70c98 |
|
|
Packit |
f70c98 |
XMLResults::XMLResults()
|
|
Packit |
f70c98 |
: line(0),
|
|
Packit |
f70c98 |
code(eXMLErrorNone)
|
|
Packit |
f70c98 |
{}
|
|
Packit |
f70c98 |
|
|
Packit |
f70c98 |
XMLNode::XMLNode(xmlNodePtr node)
|
|
Packit |
f70c98 |
: mNode(node)
|
|
Packit |
f70c98 |
{
|
|
Packit |
f70c98 |
}
|
|
Packit |
f70c98 |
|
|
Packit |
f70c98 |
XMLNode::~XMLNode()
|
|
Packit |
f70c98 |
{
|
|
Packit |
f70c98 |
}
|
|
Packit |
f70c98 |
|
|
Packit |
f70c98 |
XMLNode XMLNode::emptyNode()
|
|
Packit |
f70c98 |
{
|
|
Packit |
f70c98 |
return XMLNode(NULL);
|
|
Packit |
f70c98 |
}
|
|
Packit |
f70c98 |
|
|
Packit |
f70c98 |
XMLNode *XMLRootNode::parseFile(const std::string &filename, XMLResults* results)
|
|
Packit |
f70c98 |
{
|
|
Packit |
f70c98 |
xmlDocPtr doc;
|
|
Packit |
f70c98 |
|
|
Packit |
f70c98 |
doc = xmlParseFile(filename.c_str());
|
|
Packit |
f70c98 |
if ((doc == NULL) && (results != NULL)) {
|
|
Packit |
f70c98 |
xmlErrorPtr error = xmlGetLastError();
|
|
Packit |
f70c98 |
results->message = error->message;
|
|
Packit |
f70c98 |
results->line = error->line;
|
|
Packit |
f70c98 |
results->code = error->code;
|
|
Packit |
f70c98 |
}
|
|
Packit |
f70c98 |
|
|
Packit |
f70c98 |
return new XMLRootNode(doc);
|
|
Packit |
f70c98 |
}
|
|
Packit |
f70c98 |
|
|
Packit |
f70c98 |
XMLNode *XMLRootNode::parseString(const std::string &xml, XMLResults* results)
|
|
Packit |
f70c98 |
{
|
|
Packit |
f70c98 |
xmlDocPtr doc;
|
|
Packit |
f70c98 |
|
|
Packit |
f70c98 |
doc = xmlParseMemory(xml.c_str(), xml.length());
|
|
Packit |
f70c98 |
if ((doc == NULL) && (results != NULL)) {
|
|
Packit |
f70c98 |
xmlErrorPtr error = xmlGetLastError();
|
|
Packit |
f70c98 |
results->message = error->message;
|
|
Packit |
f70c98 |
results->line = error->line;
|
|
Packit |
f70c98 |
results->code = error->code;
|
|
Packit |
f70c98 |
}
|
|
Packit |
f70c98 |
|
|
Packit |
f70c98 |
return new XMLRootNode(doc);
|
|
Packit |
f70c98 |
}
|
|
Packit |
f70c98 |
|
|
Packit |
f70c98 |
const char *XMLNode::getName() const
|
|
Packit |
f70c98 |
{
|
|
Packit |
f70c98 |
return (char *)mNode->name;
|
|
Packit |
f70c98 |
}
|
|
Packit |
f70c98 |
|
|
Packit |
f70c98 |
const char *XMLNode::getText() const
|
|
Packit |
f70c98 |
{
|
|
Packit |
f70c98 |
if (mNode->children == NULL)
|
|
Packit |
f70c98 |
return NULL;
|
|
Packit |
f70c98 |
if (!xmlNodeIsText(mNode->children))
|
|
Packit |
f70c98 |
return NULL;
|
|
Packit |
f70c98 |
|
|
Packit |
f70c98 |
return (char*)mNode->children->content;
|
|
Packit |
f70c98 |
}
|
|
Packit |
f70c98 |
|
|
Packit |
f70c98 |
xmlAttrPtr XMLNode::getAttributeRaw(const char *name) const
|
|
Packit |
f70c98 |
{
|
|
Packit |
f70c98 |
xmlAttrPtr attr;
|
|
Packit |
f70c98 |
|
|
Packit |
f70c98 |
for (attr = mNode->properties; attr != NULL; attr = attr->next)
|
|
Packit |
f70c98 |
if (strcmp(name, (char *)attr->name) == 0)
|
|
Packit |
f70c98 |
return attr;
|
|
Packit |
f70c98 |
|
|
Packit |
f70c98 |
return NULL;
|
|
Packit |
f70c98 |
}
|
|
Packit |
f70c98 |
|
|
Packit |
f70c98 |
const XMLAttribute XMLNode::getAttribute(const char *name) const
|
|
Packit |
f70c98 |
{
|
|
Packit |
f70c98 |
xmlAttrPtr attr;
|
|
Packit |
f70c98 |
|
|
Packit |
f70c98 |
if (name == NULL)
|
|
Packit |
f70c98 |
return XMLAttribute(mNode->properties);
|
|
Packit |
f70c98 |
|
|
Packit |
f70c98 |
attr = this->getAttributeRaw(name);
|
|
Packit |
f70c98 |
if (attr != NULL)
|
|
Packit |
f70c98 |
return XMLAttribute(attr);
|
|
Packit |
f70c98 |
|
|
Packit |
f70c98 |
return XMLAttribute(NULL);
|
|
Packit |
f70c98 |
}
|
|
Packit |
f70c98 |
|
|
Packit |
f70c98 |
bool XMLNode::isAttributeSet(const char *name) const
|
|
Packit |
f70c98 |
{
|
|
Packit |
f70c98 |
return (this->getAttributeRaw(name) != NULL);
|
|
Packit |
f70c98 |
}
|
|
Packit |
f70c98 |
|
|
Packit |
f70c98 |
bool XMLNode::operator ==(const XMLNode &rhs) const
|
|
Packit |
f70c98 |
{
|
|
Packit |
f70c98 |
return mNode == rhs.mNode;
|
|
Packit |
f70c98 |
}
|
|
Packit |
f70c98 |
|
|
Packit |
f70c98 |
bool operator !=(const XMLNode &lhs, const XMLNode &rhs)
|
|
Packit |
f70c98 |
{
|
|
Packit |
f70c98 |
return !(lhs == rhs);
|
|
Packit |
f70c98 |
}
|
|
Packit |
f70c98 |
|
|
Packit |
f70c98 |
XMLRootNode::XMLRootNode(xmlDocPtr doc): XMLNode(xmlDocGetRootElement(doc)),
|
|
Packit |
f70c98 |
mDoc(doc)
|
|
Packit |
f70c98 |
{
|
|
Packit |
f70c98 |
}
|
|
Packit |
f70c98 |
|
|
Packit |
f70c98 |
XMLRootNode::~XMLRootNode()
|
|
Packit |
f70c98 |
{
|
|
Packit |
f70c98 |
if (mDoc != NULL)
|
|
Packit |
f70c98 |
xmlFreeDoc(mDoc);
|
|
Packit |
f70c98 |
}
|
|
Packit |
f70c98 |
|
|
Packit |
f70c98 |
static xmlNodePtr skipTextNodes(xmlNodePtr node)
|
|
Packit |
f70c98 |
{
|
|
Packit |
f70c98 |
xmlNodePtr it = node;
|
|
Packit |
f70c98 |
|
|
Packit |
f70c98 |
while ((it != NULL) && xmlNodeIsText(it))
|
|
Packit |
f70c98 |
it = it->next;
|
|
Packit |
f70c98 |
|
|
Packit |
f70c98 |
return it;
|
|
Packit |
f70c98 |
}
|
|
Packit |
f70c98 |
|
|
Packit |
f70c98 |
XMLNode XMLNode::next() const
|
|
Packit |
f70c98 |
{
|
|
Packit |
f70c98 |
return XMLNode(skipTextNodes(mNode->next));
|
|
Packit |
f70c98 |
}
|
|
Packit |
f70c98 |
|
|
Packit |
f70c98 |
XMLNode XMLNode::getChildNode(const char *name) const
|
|
Packit |
f70c98 |
{
|
|
Packit |
f70c98 |
xmlNodePtr it;
|
|
Packit |
f70c98 |
if (name == NULL)
|
|
Packit |
f70c98 |
return XMLNode(skipTextNodes(mNode->children));
|
|
Packit |
f70c98 |
|
|
Packit |
f70c98 |
for (it = mNode->children; it != NULL; it = it->next) {
|
|
Packit |
f70c98 |
if (xmlNodeIsText(it))
|
|
Packit |
f70c98 |
continue;
|
|
Packit |
f70c98 |
if (strcmp(name, (char *)it->name) == 0)
|
|
Packit |
f70c98 |
return XMLNode(it);
|
|
Packit |
f70c98 |
}
|
|
Packit |
f70c98 |
|
|
Packit |
f70c98 |
return emptyNode();
|
|
Packit |
f70c98 |
}
|
|
Packit |
f70c98 |
|
|
Packit |
f70c98 |
bool XMLNode::isEmpty() const
|
|
Packit |
f70c98 |
{
|
|
Packit |
f70c98 |
return mNode == NULL;
|
|
Packit |
f70c98 |
}
|
|
Packit |
f70c98 |
|
|
Packit |
f70c98 |
XMLAttribute::XMLAttribute(xmlAttrPtr attr)
|
|
Packit |
f70c98 |
: mAttr(attr)
|
|
Packit |
f70c98 |
{
|
|
Packit |
f70c98 |
}
|
|
Packit |
f70c98 |
|
|
Packit |
f70c98 |
bool XMLAttribute::isEmpty() const {
|
|
Packit |
f70c98 |
return (mAttr == NULL);
|
|
Packit |
f70c98 |
}
|
|
Packit |
f70c98 |
|
|
Packit |
f70c98 |
std::string XMLAttribute::name() const {
|
|
Packit |
f70c98 |
return std::string((const char *)mAttr->name);
|
|
Packit |
f70c98 |
}
|
|
Packit |
f70c98 |
|
|
Packit |
f70c98 |
std::string XMLAttribute::value() const {
|
|
Packit |
f70c98 |
return std::string((const char *)mAttr->children->content);
|
|
Packit |
f70c98 |
}
|
|
Packit |
f70c98 |
|
|
Packit |
f70c98 |
const XMLAttribute XMLAttribute::next() const {
|
|
Packit |
f70c98 |
return XMLAttribute(mAttr->next);
|
|
Packit |
f70c98 |
}
|
|
Packit |
f70c98 |
|