Fix bug in libxml patch

See http://tickets.musicbrainz.org/browse/LMB-34?focusedCommentId=27184
and http://lists.musicbrainz.org/pipermail/musicbrainz-devel/2013-March/005191.html

The xmlError structure were not initialized before being used, causing
use of unitialized memory, and then failure of the test case
(use of -D_FORTIFY_SOURCE=2 seemed to make a difference on the test
case behaviour)
This commit is contained in:
Christophe Fergeau 2013-04-03 21:27:02 +02:00
parent e387f44242
commit 0ac7e2a2da

View File

@ -1,7 +1,8 @@
diff -up libmusicbrainz-5.0.1/CMakeLists.txt.xmlParser libmusicbrainz-5.0.1/CMakeLists.txt diff --git a/CMakeLists.txt b/CMakeLists.txt
--- libmusicbrainz-5.0.1/CMakeLists.txt.xmlParser 2012-05-16 15:48:34.000000000 -0400 index 16870b4..a1f5a65 100644
+++ libmusicbrainz-5.0.1/CMakeLists.txt 2013-01-07 12:51:33.916020435 -0500 --- a/CMakeLists.txt
@@ -20,6 +20,7 @@ SET(musicbrainz5_SOVERSION ${musicbrainz +++ b/CMakeLists.txt
@@ -20,6 +20,7 @@ SET(musicbrainz5_SOVERSION ${musicbrainz5_SOVERSION_MAJOR})
SET(CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake/modules) SET(CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake/modules)
FIND_PACKAGE(Neon REQUIRED) FIND_PACKAGE(Neon REQUIRED)
@ -9,9 +10,10 @@ diff -up libmusicbrainz-5.0.1/CMakeLists.txt.xmlParser libmusicbrainz-5.0.1/CMak
SET(LIB_SUFFIX "" CACHE STRING "Define suffix of directory name (32/64)") SET(LIB_SUFFIX "" CACHE STRING "Define suffix of directory name (32/64)")
SET(EXEC_INSTALL_PREFIX ${CMAKE_INSTALL_PREFIX} CACHE PATH "Installation prefix for executables and object code libraries" FORCE) SET(EXEC_INSTALL_PREFIX ${CMAKE_INSTALL_PREFIX} CACHE PATH "Installation prefix for executables and object code libraries" FORCE)
diff -up libmusicbrainz-5.0.1/examples/CMakeLists.txt.xmlParser libmusicbrainz-5.0.1/examples/CMakeLists.txt diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt
--- libmusicbrainz-5.0.1/examples/CMakeLists.txt.xmlParser 2012-05-16 15:48:34.000000000 -0400 index 3e11469..440d4f2 100644
+++ libmusicbrainz-5.0.1/examples/CMakeLists.txt 2013-01-07 12:51:33.917020435 -0500 --- a/examples/CMakeLists.txt
+++ b/examples/CMakeLists.txt
@@ -1,5 +1,5 @@ @@ -1,5 +1,5 @@
-INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/../include) -INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/../include)
-LINK_LIBRARIES(musicbrainz5 ${NEON_LIBRARIES}) -LINK_LIBRARIES(musicbrainz5 ${NEON_LIBRARIES})
@ -20,9 +22,10 @@ diff -up libmusicbrainz-5.0.1/examples/CMakeLists.txt.xmlParser libmusicbrainz-5
ADD_EXECUTABLE(cdlookup cdlookup.cc) ADD_EXECUTABLE(cdlookup cdlookup.cc)
ADD_EXECUTABLE(cdlookup_c cdlookup_c.c) ADD_EXECUTABLE(cdlookup_c cdlookup_c.c)
diff -up libmusicbrainz-5.0.1/include/musicbrainz5/xmlParser.h.xmlParser libmusicbrainz-5.0.1/include/musicbrainz5/xmlParser.h diff --git a/include/musicbrainz5/xmlParser.h b/include/musicbrainz5/xmlParser.h
--- libmusicbrainz-5.0.1/include/musicbrainz5/xmlParser.h.xmlParser 2012-05-16 15:48:34.000000000 -0400 index 56b29d7..45db5fc 100644
+++ libmusicbrainz-5.0.1/include/musicbrainz5/xmlParser.h 2013-01-07 12:51:33.918020435 -0500 --- a/include/musicbrainz5/xmlParser.h
+++ b/include/musicbrainz5/xmlParser.h
@@ -1,733 +1,111 @@ @@ -1,733 +1,111 @@
-/****************************************************************************/ -/****************************************************************************/
-/*! \mainpage XMLParser library -/*! \mainpage XMLParser library
@ -108,12 +111,15 @@ diff -up libmusicbrainz-5.0.1/include/musicbrainz5/xmlParser.h.xmlParser libmusi
- * work.has been done. - * work.has been done.
- * - *
- ****************************************************************************/ - ****************************************************************************/
- +/* --------------------------------------------------------------------------
-#ifndef __INCLUDE_XML_NODE__ -#ifndef __INCLUDE_XML_NODE__
-#define __INCLUDE_XML_NODE__ -#define __INCLUDE_XML_NODE__
- + libmusicbrainz5 - Client library to access MusicBrainz
-#include <stdlib.h> -#include <stdlib.h>
- + Copyright (C) 2012 Christophe Fergeau
-#ifdef _UNICODE -#ifdef _UNICODE
-// If you comment the next "define" line then the library will never "switch to" _UNICODE (wchar_t*) mode (16/32 bits per characters). -// If you comment the next "define" line then the library will never "switch to" _UNICODE (wchar_t*) mode (16/32 bits per characters).
-// This is useful when you get error messages like: -// This is useful when you get error messages like:
@ -122,14 +128,12 @@ diff -up libmusicbrainz-5.0.1/include/musicbrainz5/xmlParser.h.xmlParser libmusi
-// must be defined) or utf8-mode(the pre-processor variable must be undefined). -// must be defined) or utf8-mode(the pre-processor variable must be undefined).
-#define _XMLWIDECHAR -#define _XMLWIDECHAR
-#endif -#endif
+/* -------------------------------------------------------------------------- -
-#if defined(WIN32) || defined(UNDER_CE) || defined(_WIN32) || defined(WIN64) || defined(__BORLANDC__) -#if defined(WIN32) || defined(UNDER_CE) || defined(_WIN32) || defined(WIN64) || defined(__BORLANDC__)
-// comment the next line if you are under windows and the compiler is not Microsoft Visual Studio (6.0 or .NET) or Borland -// comment the next line if you are under windows and the compiler is not Microsoft Visual Studio (6.0 or .NET) or Borland
-#define _XMLWINDOWS -#define _XMLWINDOWS
-#endif -#endif
+ libmusicbrainz5 - Client library to access MusicBrainz -
-#ifdef XMLDLLENTRY -#ifdef XMLDLLENTRY
-#undef XMLDLLENTRY -#undef XMLDLLENTRY
-#endif -#endif
@ -142,19 +146,22 @@ diff -up libmusicbrainz-5.0.1/include/musicbrainz5/xmlParser.h.xmlParser libmusi
-#else -#else
-#define XMLDLLENTRY -#define XMLDLLENTRY
-#endif -#endif
+ Copyright (C) 2012 Christophe Fergeau + This file is part of libmusicbrainz5.
-// uncomment the next line if you want no support for wchar_t* (no need for the <wchar.h> or <tchar.h> libraries anymore to compile) -// uncomment the next line if you want no support for wchar_t* (no need for the <wchar.h> or <tchar.h> libraries anymore to compile)
-//#define XML_NO_WIDE_CHAR -//#define XML_NO_WIDE_CHAR
+ This file is part of libmusicbrainz5. + This library is free software; you can redistribute it and/or
+ modify it under the terms of v2 of the GNU Lesser General Public
+ License as published by the Free Software Foundation.
-#ifdef XML_NO_WIDE_CHAR -#ifdef XML_NO_WIDE_CHAR
-#undef _XMLWINDOWS -#undef _XMLWINDOWS
-#undef _XMLWIDECHAR -#undef _XMLWIDECHAR
-#endif -#endif
+ This library is free software; you can redistribute it and/or + libmusicbrainz5 is distributed in the hope that it will be useful,
+ modify it under the terms of v2 of the GNU Lesser General Public + but WITHOUT ANY WARRANTY; without even the implied warranty of
+ License as published by the Free Software Foundation. + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
-#ifdef _XMLWINDOWS -#ifdef _XMLWINDOWS
-#include <tchar.h> -#include <tchar.h>
@ -165,10 +172,8 @@ diff -up libmusicbrainz-5.0.1/include/musicbrainz5/xmlParser.h.xmlParser libmusi
- // to have 'mbsrtowcs' for WIDECHAR version - // to have 'mbsrtowcs' for WIDECHAR version
-#endif -#endif
-#endif -#endif
+ libmusicbrainz5 is distributed in the hope that it will be useful, + You should have received a copy of the GNU General Public License
+ but WITHOUT ANY WARRANTY; without even the implied warranty of + along with this library. If not, see <http://www.gnu.org/licenses/>.
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
-// Some common types for char set portable code -// Some common types for char set portable code
-#ifdef _XMLWIDECHAR -#ifdef _XMLWIDECHAR
@ -188,27 +193,15 @@ diff -up libmusicbrainz-5.0.1/include/musicbrainz5/xmlParser.h.xmlParser libmusi
-#ifndef TRUE -#ifndef TRUE
- #define TRUE 1 - #define TRUE 1
-#endif /* TRUE */ -#endif /* TRUE */
+ You should have received a copy of the GNU General Public License
+ along with this library. If not, see <http://www.gnu.org/licenses/>.
+
+ $Id$ + $Id$
+
+----------------------------------------------------------------------------*/ +----------------------------------------------------------------------------*/
+#ifndef _MUSICBRAINZ5_XMLPARSER_H +#ifndef _MUSICBRAINZ5_XMLPARSER_H
+#define _MUSICBRAINZ5_XMLPARSER_H +#define _MUSICBRAINZ5_XMLPARSER_H
+
+#include <string>
+#include <libxml/tree.h>
+
+typedef xmlError XMLResults;
+const int eXMLErrorNone = 0;
-/// Enumeration for XML parse errors. -/// Enumeration for XML parse errors.
-typedef enum XMLError -typedef enum XMLError
+class XMLAttribute; -{
+class XMLNode
{
- eXMLErrorNone = 0, - eXMLErrorNone = 0,
- eXMLErrorMissingEndTag, - eXMLErrorMissingEndTag,
- eXMLErrorNoXMLTagFound, - eXMLErrorNoXMLTagFound,
@ -232,47 +225,26 @@ diff -up libmusicbrainz-5.0.1/include/musicbrainz5/xmlParser.h.xmlParser libmusi
- eXMLErrorBase64DecodeTruncatedData, - eXMLErrorBase64DecodeTruncatedData,
- eXMLErrorBase64DecodeBufferTooSmall - eXMLErrorBase64DecodeBufferTooSmall
-} XMLError; -} XMLError;
+ public: +#include <string>
+ static XMLNode emptyNode(); +#include <libxml/tree.h>
+ bool isEmpty() const;
+ virtual ~XMLNode() {}; +typedef xmlError XMLResults;
-/// Enumeration used to manage type of data. Use in conjunction with structure XMLNodeContents -/// Enumeration used to manage type of data. Use in conjunction with structure XMLNodeContents
-typedef enum XMLElementType -typedef enum XMLElementType
+ const XMLAttribute getAttribute(const char *name = NULL) const; -{
+ bool isAttributeSet(const char *name) const;
+
+ XMLNode getChildNode(const char *name = NULL) const;
+ XMLNode next() const;
+ const char *getName() const;
+ const char *getText() const;
+
+ friend bool operator== (const XMLNode &lhs, const XMLNode &rhs);
+
+ protected:
+ XMLNode(xmlNodePtr node): mNode(node) {};
+
+ xmlNodePtr mNode;
+
+ private:
+ xmlAttrPtr getAttributeRaw(const char *name) const;
+};
+
+inline bool operator== (const XMLNode &lhs, const XMLNode &rhs)
{
- eNodeChild=0, - eNodeChild=0,
- eNodeAttribute=1, - eNodeAttribute=1,
- eNodeText=2, - eNodeText=2,
- eNodeClear=3, - eNodeClear=3,
- eNodeNULL=4 - eNodeNULL=4
-} XMLElementType; -} XMLElementType;
+ return (lhs.mNode == rhs.mNode); +const int eXMLErrorNone = 0;
+}
-/// Structure used to obtain error details if the parse fails. -/// Structure used to obtain error details if the parse fails.
-typedef struct XMLResults -typedef struct XMLResults
+inline bool operator!= (const XMLNode &lhs, const XMLNode &rhs) +class XMLAttribute;
+class XMLNode
{ {
- enum XMLError error; - enum XMLError error;
- int nLine,nColumn; - int nLine,nColumn;
@ -306,19 +278,11 @@ diff -up libmusicbrainz-5.0.1/include/musicbrainz5/xmlParser.h.xmlParser libmusi
- * <li> XMLNode::createXMLTopNode (or XMLNode::createXMLTopNode_WOSD)</li> - * <li> XMLNode::createXMLTopNode (or XMLNode::createXMLTopNode_WOSD)</li>
- * </ul> */ - * </ul> */
-typedef struct XMLDLLENTRY XMLNode -typedef struct XMLDLLENTRY XMLNode
+ return !(lhs == rhs); -{
+}
+
+class XMLRootNode: public XMLNode
{
- private: - private:
+ public: -
+ static XMLNode* parseString(std::string &xml, XMLResults *results);
+ static XMLNode* parseFile(const std::string &filename, XMLResults *results);
- struct XMLNodeDataTag; - struct XMLNodeDataTag;
+ virtual ~XMLRootNode() { if (mDoc != NULL) xmlFreeDoc(mDoc); }; -
- /// Constructors are protected, so use instead one of: XMLNode::parseString, XMLNode::parseFile, XMLNode::openFileHelper, XMLNode::createXMLTopNode - /// Constructors are protected, so use instead one of: XMLNode::parseString, XMLNode::parseFile, XMLNode::openFileHelper, XMLNode::createXMLTopNode
- XMLNode(struct XMLNodeDataTag *pParent, XMLSTR lpszName, char isDeclaration); - XMLNode(struct XMLNodeDataTag *pParent, XMLSTR lpszName, char isDeclaration);
- /// Constructors are protected, so use instead one of: XMLNode::parseString, XMLNode::parseFile, XMLNode::openFileHelper, XMLNode::createXMLTopNode - /// Constructors are protected, so use instead one of: XMLNode::parseString, XMLNode::parseFile, XMLNode::openFileHelper, XMLNode::createXMLTopNode
@ -356,7 +320,10 @@ diff -up libmusicbrainz-5.0.1/include/musicbrainz5/xmlParser.h.xmlParser libmusi
- * @param tag the name of the first tag inside the XML file. If the tag parameter is omitted, this function returns a node that represents the head of the xml document including the declaration term (<? ... ?>). - * @param tag the name of the first tag inside the XML file. If the tag parameter is omitted, this function returns a node that represents the head of the xml document including the declaration term (<? ... ?>).
- * @param pResults a pointer to a XMLResults variable that will contain some information that can be used to trace the XML parsing error. You can have a user-friendly explanation of the parsing error with the "getError" function. - * @param pResults a pointer to a XMLResults variable that will contain some information that can be used to trace the XML parsing error. You can have a user-friendly explanation of the parsing error with the "getError" function.
- */ - */
- + public:
+ static XMLNode emptyNode();
+ bool isEmpty() const;
- /// Parse an XML file and return the root of a XMLNode tree representing the file. A very crude error checking is made. An attempt to guess the Char Encoding used in the file is made. - /// Parse an XML file and return the root of a XMLNode tree representing the file. A very crude error checking is made. An attempt to guess the Char Encoding used in the file is made.
- static XMLNode openFileHelper(XMLCSTR filename, XMLCSTR tag=NULL); - static XMLNode openFileHelper(XMLCSTR filename, XMLCSTR tag=NULL);
- /**< The "openFileHelper" function reports to the screen all the warnings and errors that occurred during parsing of the XML file. - /**< The "openFileHelper" function reports to the screen all the warnings and errors that occurred during parsing of the XML file.
@ -375,16 +342,23 @@ diff -up libmusicbrainz-5.0.1/include/musicbrainz5/xmlParser.h.xmlParser libmusi
- * @param filename the path of the XML file to parse. - * @param filename the path of the XML file to parse.
- * @param tag the name of the first tag inside the XML file. If the tag parameter is omitted, this function returns a node that represents the head of the xml document including the declaration term (<? ... ?>). - * @param tag the name of the first tag inside the XML file. If the tag parameter is omitted, this function returns a node that represents the head of the xml document including the declaration term (<? ... ?>).
- */ - */
- + virtual ~XMLNode() {};
- static XMLCSTR getError(XMLError error); ///< this gives you a user-friendly explanation of the parsing error - static XMLCSTR getError(XMLError error); ///< this gives you a user-friendly explanation of the parsing error
- + const XMLAttribute getAttribute(const char *name = NULL) const;
+ bool isAttributeSet(const char *name) const;
- /// Create an XML string starting from the current XMLNode. - /// Create an XML string starting from the current XMLNode.
- XMLSTR createXMLString(int nFormat=1, int *pnSize=NULL) const; - XMLSTR createXMLString(int nFormat=1, int *pnSize=NULL) const;
- /**< The returned string should be free'd using the "freeXMLString" function. - /**< The returned string should be free'd using the "freeXMLString" function.
- * - *
- * If nFormat==0, no formatting is required otherwise this returns an user friendly XML string from a given element - * If nFormat==0, no formatting is required otherwise this returns an user friendly XML string from a given element
- * with appropriate white spaces and carriage returns. if pnSize is given it returns the size in character of the string. */ - * with appropriate white spaces and carriage returns. if pnSize is given it returns the size in character of the string. */
- + XMLNode getChildNode(const char *name = NULL) const;
+ XMLNode next() const;
+ const char *getName() const;
+ const char *getText() const;
- /// Save the content of an xmlNode inside a file - /// Save the content of an xmlNode inside a file
- XMLError writeToFile(XMLCSTR filename, - XMLError writeToFile(XMLCSTR filename,
- const char *encoding=NULL, - const char *encoding=NULL,
@ -395,7 +369,8 @@ diff -up libmusicbrainz-5.0.1/include/musicbrainz5/xmlParser.h.xmlParser libmusi
- * If "_XMLWIDECHAR=1", then the "encoding" parameter is ignored and always set to "utf-16". - * If "_XMLWIDECHAR=1", then the "encoding" parameter is ignored and always set to "utf-16".
- * If no "encoding" parameter is given the "ISO-8859-1" encoding is used. */ - * If no "encoding" parameter is given the "ISO-8859-1" encoding is used. */
- /** @} */ - /** @} */
- + friend bool operator== (const XMLNode &lhs, const XMLNode &rhs);
- /** @defgroup navigate Navigate the XMLNode structure - /** @defgroup navigate Navigate the XMLNode structure
- * @ingroup XMLParserGeneral - * @ingroup XMLParserGeneral
- * @{ */ - * @{ */
@ -414,7 +389,9 @@ diff -up libmusicbrainz-5.0.1/include/musicbrainz5/xmlParser.h.xmlParser libmusi
- ///< return the first child node with specific path - ///< return the first child node with specific path
- XMLNode getChildNodeByPathNonConst(XMLSTR path, char createNodeIfMissing=0, XMLCHAR sep='/'); - XMLNode getChildNodeByPathNonConst(XMLSTR path, char createNodeIfMissing=0, XMLCHAR sep='/');
- ///< return the first child node with specific path. - ///< return the first child node with specific path.
- + protected:
+ XMLNode(xmlNodePtr node): mNode(node) {};
- int nChildNode(XMLCSTR name) const; ///< return the number of child node with specific name - int nChildNode(XMLCSTR name) const; ///< return the number of child node with specific name
- int nChildNode() const; ///< nbr of child node - int nChildNode() const; ///< nbr of child node
- XMLAttribute getAttribute(int i=0) const; ///< return ith attribute - XMLAttribute getAttribute(int i=0) const; ///< return ith attribute
@ -433,11 +410,15 @@ diff -up libmusicbrainz-5.0.1/include/musicbrainz5/xmlParser.h.xmlParser libmusi
- XMLNode deepCopy() const; ///< deep copy (duplicate/clone) a XMLNode - XMLNode deepCopy() const; ///< deep copy (duplicate/clone) a XMLNode
- static XMLNode emptyNode(); ///< return XMLNode::emptyXMLNode; - static XMLNode emptyNode(); ///< return XMLNode::emptyXMLNode;
- /** @} */ - /** @} */
- + xmlNodePtr mNode;
- ~XMLNode(); - ~XMLNode();
- XMLNode(const XMLNode &A); ///< to allow shallow/fast copy: - XMLNode(const XMLNode &A); ///< to allow shallow/fast copy:
- XMLNode& operator=( const XMLNode& A ); ///< to allow shallow/fast copy: - XMLNode& operator=( const XMLNode& A ); ///< to allow shallow/fast copy:
- + private:
+ xmlAttrPtr getAttributeRaw(const char *name) const;
+};
- XMLNode(): d(NULL){}; - XMLNode(): d(NULL){};
- static XMLNode emptyXMLNode; - static XMLNode emptyXMLNode;
- static XMLClear emptyXMLClear; - static XMLClear emptyXMLClear;
@ -684,12 +665,11 @@ diff -up libmusicbrainz-5.0.1/include/musicbrainz5/xmlParser.h.xmlParser libmusi
- static void exactMemory(XMLNodeData *d); - static void exactMemory(XMLNodeData *d);
- static int detachFromParent(XMLNodeData *d); - static int detachFromParent(XMLNodeData *d);
-} XMLNode; -} XMLNode;
+ private: -
+ XMLRootNode(xmlDocPtr doc);
-/// This structure is given by the function XMLNode::enumContents. -/// This structure is given by the function XMLNode::enumContents.
-typedef struct XMLNodeContents -typedef struct XMLNodeContents
-{ +inline bool operator== (const XMLNode &lhs, const XMLNode &rhs)
{
- /// This dictates what's the content of the XMLNodeContent - /// This dictates what's the content of the XMLNodeContent
- enum XMLElementType etype; - enum XMLElementType etype;
- /**< should be an union to access the appropriate data. Compiler does not allow union of object with constructor... too bad. */ - /**< should be an union to access the appropriate data. Compiler does not allow union of object with constructor... too bad. */
@ -709,7 +689,9 @@ diff -up libmusicbrainz-5.0.1/include/musicbrainz5/xmlParser.h.xmlParser libmusi
- * a very handy function when used with all the "XMLNode::*_WOSD" functions (\link xmlWOSD \endlink). - * a very handy function when used with all the "XMLNode::*_WOSD" functions (\link xmlWOSD \endlink).
- * @param cbData If !=0 then cbData is the number of chars to duplicate. New strings allocated with - * @param cbData If !=0 then cbData is the number of chars to duplicate. New strings allocated with
- * this function should be free'd using the "freeXMLString" function. */ - * this function should be free'd using the "freeXMLString" function. */
- + return (lhs.mNode == rhs.mNode);
+}
-/// to free the string allocated inside the "stringDup" function or the "createXMLString" function. -/// to free the string allocated inside the "stringDup" function or the "createXMLString" function.
-XMLDLLENTRY void freeXMLString(XMLSTR t); // {free(t);} -XMLDLLENTRY void freeXMLString(XMLSTR t); // {free(t);}
-/** @} */ -/** @} */
@ -745,14 +727,17 @@ diff -up libmusicbrainz-5.0.1/include/musicbrainz5/xmlParser.h.xmlParser libmusi
- * you must not use the "ToXMLStringTool" class (because the "XMLNode" class does the - * you must not use the "ToXMLStringTool" class (because the "XMLNode" class does the
- * processing job for you during rendering).*/ - * processing job for you during rendering).*/
-typedef struct XMLDLLENTRY ToXMLStringTool -typedef struct XMLDLLENTRY ToXMLStringTool
-{ +inline bool operator!= (const XMLNode &lhs, const XMLNode &rhs)
{
-public: -public:
- ToXMLStringTool(): buf(NULL),buflen(0){} - ToXMLStringTool(): buf(NULL),buflen(0){}
- ~ToXMLStringTool(); - ~ToXMLStringTool();
- void freeBuffer();///<call this function when you have finished using this object to release memory used by the internal buffer. - void freeBuffer();///<call this function when you have finished using this object to release memory used by the internal buffer.
- -
- XMLSTR toXML(XMLCSTR source);///< returns a pointer to an internal buffer that contains a XML-encoded string based on the "source" parameter. - XMLSTR toXML(XMLCSTR source);///< returns a pointer to an internal buffer that contains a XML-encoded string based on the "source" parameter.
- + return !(lhs == rhs);
+}
- /** The "toXMLUnSafe" function is deprecated because there is a possibility of - /** The "toXMLUnSafe" function is deprecated because there is a possibility of
- * "destination-buffer-overflow". It converts the string - * "destination-buffer-overflow". It converts the string
- * "source" to the string "dest". */ - * "source" to the string "dest". */
@ -778,10 +763,7 @@ diff -up libmusicbrainz-5.0.1/include/musicbrainz5/xmlParser.h.xmlParser libmusi
- * functions can also be used to "encrypt/decrypt" some critical data contained inside - * functions can also be used to "encrypt/decrypt" some critical data contained inside
- * the XML (it's not a strong encryption at all, but sometimes it can be useful). */ - * the XML (it's not a strong encryption at all, but sometimes it can be useful). */
-typedef struct XMLDLLENTRY XMLParserBase64Tool -typedef struct XMLDLLENTRY XMLParserBase64Tool
+ mutable xmlDocPtr mDoc; +class XMLRootNode: public XMLNode
+};
+
+class XMLAttribute
{ {
-public: -public:
- XMLParserBase64Tool(): buf(NULL),buflen(0){} - XMLParserBase64Tool(): buf(NULL),buflen(0){}
@ -791,24 +773,32 @@ diff -up libmusicbrainz-5.0.1/include/musicbrainz5/xmlParser.h.xmlParser libmusi
- /** - /**
- * @param formatted If "formatted"=true, some space will be reserved for a carriage-return every 72 chars. */ - * @param formatted If "formatted"=true, some space will be reserved for a carriage-return every 72 chars. */
- static int encodeLength(int inBufLen, char formatted=0); ///< return the length of the base64 string that encodes a data buffer of size inBufLen bytes. - static int encodeLength(int inBufLen, char formatted=0); ///< return the length of the base64 string that encodes a data buffer of size inBufLen bytes.
- + public:
+ static XMLNode* parseString(std::string &xml, XMLResults *results);
+ static XMLNode* parseFile(const std::string &filename, XMLResults *results);
- /** - /**
- * The "base64Encode" function returns a string containing the base64 encoding of "inByteLen" bytes - * The "base64Encode" function returns a string containing the base64 encoding of "inByteLen" bytes
- * from "inByteBuf". If "formatted" parameter is true, then there will be a carriage-return every 72 chars. - * from "inByteBuf". If "formatted" parameter is true, then there will be a carriage-return every 72 chars.
- * The string will be free'd when the XMLParserBase64Tool object is deleted. - * The string will be free'd when the XMLParserBase64Tool object is deleted.
- * All returned strings are sharing the same memory space. */ - * All returned strings are sharing the same memory space. */
- XMLSTR encode(unsigned char *inByteBuf, unsigned int inByteLen, char formatted=0); ///< returns a pointer to an internal buffer containing the base64 string containing the binary data encoded from "inByteBuf" - XMLSTR encode(unsigned char *inByteBuf, unsigned int inByteLen, char formatted=0); ///< returns a pointer to an internal buffer containing the base64 string containing the binary data encoded from "inByteBuf"
- + virtual ~XMLRootNode() { if (mDoc != NULL) xmlFreeDoc(mDoc); };
- /// returns the number of bytes which will be decoded from "inString". - /// returns the number of bytes which will be decoded from "inString".
- static unsigned int decodeSize(XMLCSTR inString, XMLError *xe=NULL); - static unsigned int decodeSize(XMLCSTR inString, XMLError *xe=NULL);
- + private:
+ XMLRootNode(xmlDocPtr doc);
- /** - /**
- * The "decode" function returns a pointer to a buffer containing the binary data decoded from "inString" - * The "decode" function returns a pointer to a buffer containing the binary data decoded from "inString"
- * The output buffer will be free'd when the XMLParserBase64Tool object is deleted. - * The output buffer will be free'd when the XMLParserBase64Tool object is deleted.
- * All output buffer are sharing the same memory space. - * All output buffer are sharing the same memory space.
- * @param inString If "instring" is malformed, NULL will be returned */ - * @param inString If "instring" is malformed, NULL will be returned */
- unsigned char* decode(XMLCSTR inString, int *outByteLen=NULL, XMLError *xe=NULL); ///< returns a pointer to an internal buffer containing the binary data decoded from "inString" - unsigned char* decode(XMLCSTR inString, int *outByteLen=NULL, XMLError *xe=NULL); ///< returns a pointer to an internal buffer containing the binary data decoded from "inString"
- + mutable xmlDocPtr mDoc;
+};
- /** - /**
- * decodes data from "inString" to "outByteBuf". You need to provide the size (in byte) of "outByteBuf" - * decodes data from "inString" to "outByteBuf". You need to provide the size (in byte) of "outByteBuf"
- * in "inMaxByteOutBuflen". If "outByteBuf" is not large enough or if data is malformed, then "FALSE" - * in "inMaxByteOutBuflen". If "outByteBuf" is not large enough or if data is malformed, then "FALSE"
@ -821,6 +811,10 @@ diff -up libmusicbrainz-5.0.1/include/musicbrainz5/xmlParser.h.xmlParser libmusi
- void alloc(int newsize); - void alloc(int newsize);
-}XMLParserBase64Tool; -}XMLParserBase64Tool;
-/** @} */ -/** @} */
-
-#undef XMLDLLENTRY
+class XMLAttribute
+{
+ public: + public:
+ bool isEmpty() const { + bool isEmpty() const {
+ return (mAttr == NULL); + return (mAttr == NULL);
@ -838,18 +832,18 @@ diff -up libmusicbrainz-5.0.1/include/musicbrainz5/xmlParser.h.xmlParser libmusi
+ } + }
+ +
+ friend const XMLAttribute XMLNode::getAttribute(const char *name) const; + friend const XMLAttribute XMLNode::getAttribute(const char *name) const;
+
-#undef XMLDLLENTRY
+ private: + private:
+ XMLAttribute(xmlAttrPtr attr): mAttr(attr) {}; + XMLAttribute(xmlAttrPtr attr): mAttr(attr) {};
+ xmlAttrPtr mAttr; + xmlAttrPtr mAttr;
+}; +};
#endif #endif
diff -up libmusicbrainz-5.0.1/libmusicbrainz5.pc.cmake.xmlParser libmusicbrainz-5.0.1/libmusicbrainz5.pc.cmake diff --git a/libmusicbrainz5.pc.cmake b/libmusicbrainz5.pc.cmake
--- libmusicbrainz-5.0.1/libmusicbrainz5.pc.cmake.xmlParser 2012-05-16 15:48:34.000000000 -0400 index c2f45c9..fca0de1 100644
+++ libmusicbrainz-5.0.1/libmusicbrainz5.pc.cmake 2013-01-07 12:51:33.918020435 -0500 --- a/libmusicbrainz5.pc.cmake
@@ -8,6 +8,7 @@ Description: The Musicbrainz Client Libr +++ b/libmusicbrainz5.pc.cmake
@@ -8,6 +8,7 @@ Description: The Musicbrainz Client Library.
URL: http://musicbrainz.org/doc/libmusicbrainz URL: http://musicbrainz.org/doc/libmusicbrainz
Version: ${PROJECT_VERSION} Version: ${PROJECT_VERSION}
Requires.private: neon >= 0.25 Requires.private: neon >= 0.25
@ -857,35 +851,10 @@ diff -up libmusicbrainz-5.0.1/libmusicbrainz5.pc.cmake.xmlParser libmusicbrainz-
Libs: -L${LIB_INSTALL_DIR} -lmusicbrainz5 Libs: -L${LIB_INSTALL_DIR} -lmusicbrainz5
Cflags: -I${INCLUDE_INSTALL_DIR} Cflags: -I${INCLUDE_INSTALL_DIR}
diff -up libmusicbrainz-5.0.1/src/cinterface.xml.xmlParser libmusicbrainz-5.0.1/src/cinterface.xml diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
--- libmusicbrainz-5.0.1/src/cinterface.xml.xmlParser 2012-05-16 15:48:34.000000000 -0400 index 2ee102f..368dd93 100644
+++ libmusicbrainz-5.0.1/src/cinterface.xml 2013-01-07 12:52:21.992035823 -0500 --- a/src/CMakeLists.txt
@@ -1,5 +1,4 @@ +++ b/src/CMakeLists.txt
<!--
- --------------------------------------------------------------------------
libmusicbrainz5 - Client library to access MusicBrainz
@@ -21,7 +20,6 @@
$Id$
-----------------------------------------------------------------------------
-->
<cinterface>
@@ -218,7 +216,7 @@ extern "C"
<property name="artist" type="string"/>
<property name="length" type="integer"/>
</class>
- <class name="puid" uppername="PUID" uppername="PUID">
+ <class name="puid" uppername="PUID">
<property name="id" uppername="ID" type="string"/>
<property name="recordinglist" uppername="RecordingList" type="object"/>
</class>
diff -up libmusicbrainz-5.0.1/src/CMakeLists.txt.xmlParser libmusicbrainz-5.0.1/src/CMakeLists.txt
--- libmusicbrainz-5.0.1/src/CMakeLists.txt.xmlParser 2012-05-16 15:48:34.000000000 -0400
+++ libmusicbrainz-5.0.1/src/CMakeLists.txt 2013-01-07 12:51:33.919020436 -0500
@@ -1,14 +1,15 @@ @@ -1,14 +1,15 @@
SET(CMAKE_INCLUDE_CURRENT_DIR ON) SET(CMAKE_INCLUDE_CURRENT_DIR ON)
-INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/.. ${CMAKE_CURRENT_SOURCE_DIR}/../include ${NEON_INCLUDE_DIR}) -INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/.. ${CMAKE_CURRENT_SOURCE_DIR}/../include ${NEON_INCLUDE_DIR})
@ -923,10 +892,11 @@ diff -up libmusicbrainz-5.0.1/src/CMakeLists.txt.xmlParser libmusicbrainz-5.0.1/
ENDIF(CMAKE_COMPILER_IS_GNUCXX) ENDIF(CMAKE_COMPILER_IS_GNUCXX)
INSTALL(TARGETS musicbrainz5 DESTINATION ${LIB_INSTALL_DIR}) INSTALL(TARGETS musicbrainz5 DESTINATION ${LIB_INSTALL_DIR})
diff -up libmusicbrainz-5.0.1/src/Entity.cc.xmlParser libmusicbrainz-5.0.1/src/Entity.cc diff --git a/src/Entity.cc b/src/Entity.cc
--- libmusicbrainz-5.0.1/src/Entity.cc.xmlParser 2012-05-16 15:48:34.000000000 -0400 index 0644377..a1bb1ca 100644
+++ libmusicbrainz-5.0.1/src/Entity.cc 2013-01-07 12:51:33.919020436 -0500 --- a/src/Entity.cc
@@ -80,10 +80,12 @@ void MusicBrainz5::CEntity::Parse(const +++ b/src/Entity.cc
@@ -80,10 +80,12 @@ void MusicBrainz5::CEntity::Parse(const XMLNode& Node)
{ {
if (!Node.isEmpty()) if (!Node.isEmpty())
{ {
@ -942,7 +912,7 @@ diff -up libmusicbrainz-5.0.1/src/Entity.cc.xmlParser libmusicbrainz-5.0.1/src/E
if ("ext:"==Name.substr(0,4)) if ("ext:"==Name.substr(0,4))
m_d->m_ExtAttributes[Name.substr(4)]=Value; m_d->m_ExtAttributes[Name.substr(4)]=Value;
@@ -93,10 +95,10 @@ void MusicBrainz5::CEntity::Parse(const @@ -93,10 +95,10 @@ void MusicBrainz5::CEntity::Parse(const XMLNode& Node)
//std::cout << "Node: " << std::endl << Node.createXMLString(true) << std::endl; //std::cout << "Node: " << std::endl << Node.createXMLString(true) << std::endl;
@ -956,29 +926,107 @@ diff -up libmusicbrainz-5.0.1/src/Entity.cc.xmlParser libmusicbrainz-5.0.1/src/E
std::string Name=ChildNode.getName(); std::string Name=ChildNode.getName();
std::string Value; std::string Value;
if (ChildNode.getText()) if (ChildNode.getText())
diff -up libmusicbrainz-5.0.1/src/make-c-interface.cc.xmlParser libmusicbrainz-5.0.1/src/make-c-interface.cc diff --git a/src/Query.cc b/src/Query.cc
--- libmusicbrainz-5.0.1/src/make-c-interface.cc.xmlParser 2012-05-16 15:48:34.000000000 -0400 index d132ae7..a835c84 100644
+++ libmusicbrainz-5.0.1/src/make-c-interface.cc 2013-01-07 12:51:33.920020438 -0500 --- a/src/Query.cc
@@ -28,6 +28,7 @@ +++ b/src/Query.cc
@@ -158,15 +158,17 @@ MusicBrainz5::CMetadata MusicBrainz5::CQuery::PerformQuery(const std::string& Qu
#endif
XMLResults Results;
- XMLNode TopNode=XMLNode::parseString(strData.c_str(), 0, &Results);
- if (Results.error==eXMLErrorNone)
+ memset(&Results, 0, sizeof(Results));
+ XMLNode *TopNode = XMLRootNode::parseString(strData, &Results);
+ if (Results.code==eXMLErrorNone)
{
- XMLNode MetadataNode=TopNode.getChildNode("metadata");
+ XMLNode MetadataNode=*TopNode;
if (!MetadataNode.isEmpty())
{
Metadata=CMetadata(MetadataNode);
}
}
+ delete TopNode;
}
}
@@ -393,10 +395,11 @@ bool MusicBrainz5::CQuery::EditCollection(const std::string& CollectionID, const
#endif
XMLResults Results;
- XMLNode TopNode=XMLNode::parseString(strData.c_str(), 0, &Results);
- if (Results.error==eXMLErrorNone)
+ memset(&Results, 0, sizeof(Results));
+ XMLNode *TopNode = XMLRootNode::parseString(strData, &Results);
+ if (Results.code==eXMLErrorNone)
{
- XMLNode MetadataNode=TopNode.getChildNode("metadata");
+ XMLNode MetadataNode=*TopNode;
if (!MetadataNode.isEmpty())
{
CMetadata Metadata(MetadataNode);
@@ -405,6 +408,7 @@ bool MusicBrainz5::CQuery::EditCollection(const std::string& CollectionID, const
RetVal=RetVal && true;
}
}
+ delete TopNode;
}
}
diff --git a/src/cinterface.xml b/src/cinterface.xml
index ae5cf92..f492fd1 100644
--- a/src/cinterface.xml
+++ b/src/cinterface.xml
@@ -1,5 +1,4 @@
<!--
- --------------------------------------------------------------------------
libmusicbrainz5 - Client library to access MusicBrainz
@@ -21,7 +20,6 @@
$Id$
-----------------------------------------------------------------------------
-->
<cinterface>
@@ -218,7 +216,7 @@ extern "C"
<property name="artist" type="string"/>
<property name="length" type="integer"/>
</class>
- <class name="puid" uppername="PUID" uppername="PUID">
+ <class name="puid" uppername="PUID">
<property name="id" uppername="ID" type="string"/>
<property name="recordinglist" uppername="RecordingList" type="object"/>
</class>
diff --git a/src/make-c-interface.cc b/src/make-c-interface.cc
index 652a65b..97af3d9 100644
--- a/src/make-c-interface.cc
+++ b/src/make-c-interface.cc
@@ -28,6 +28,8 @@
#include <iostream> #include <iostream>
#include <fstream> #include <fstream>
#include <sstream> #include <sstream>
+#include <cstring>
+#include <unistd.h> +#include <unistd.h>
#include <vector> #include <vector>
#include <string> #include <string>
@@ -51,8 +52,8 @@ int main(int argc, const char *argv[]) @@ -51,8 +53,9 @@ int main(int argc, const char *argv[])
{ {
std::string XMLFile=std::string(argv[1])+"/"+argv[2]; std::string XMLFile=std::string(argv[1])+"/"+argv[2];
XMLResults Results; XMLResults Results;
- XMLNode TopNode=XMLNode::parseFile(XMLFile.c_str(),"cinterface",&Results); - XMLNode TopNode=XMLNode::parseFile(XMLFile.c_str(),"cinterface",&Results);
- if (!TopNode.isEmpty()) - if (!TopNode.isEmpty())
+ XMLNode *TopNode=XMLRootNode::parseFile(XMLFile.c_str(),&Results); + XMLNode *TopNode=XMLRootNode::parseFile(XMLFile.c_str(),&Results);
+ memset(&Results, 0, sizeof(Results));
+ if (!TopNode->isEmpty()) + if (!TopNode->isEmpty())
{ {
std::cout << "Generating '" << argv[3] << "/" << argv[4] << "' and '" << argv[3] << "/" << argv[5] << "'" << std::endl; std::cout << "Generating '" << argv[3] << "/" << argv[4] << "' and '" << argv[3] << "/" << argv[5] << "'" << std::endl;
@@ -74,9 +75,10 @@ int main(int argc, const char *argv[]) @@ -74,9 +77,10 @@ int main(int argc, const char *argv[])
return 1; return 1;
} }
@ -991,7 +1039,7 @@ diff -up libmusicbrainz-5.0.1/src/make-c-interface.cc.xmlParser libmusicbrainz-5
std::string Name=Node.getName(); std::string Name=Node.getName();
if ("boilerplate"==Name) if ("boilerplate"==Name)
@@ -84,7 +86,7 @@ int main(int argc, const char *argv[]) @@ -84,7 +88,7 @@ int main(int argc, const char *argv[])
else if ("header"==Name) else if ("header"==Name)
ProcessHeader(Node,Source,Include); ProcessHeader(Node,Source,Include);
else if ("declare"==Name) else if ("declare"==Name)
@ -1000,7 +1048,7 @@ diff -up libmusicbrainz-5.0.1/src/make-c-interface.cc.xmlParser libmusicbrainz-5
else if ("entity"==Name) else if ("entity"==Name)
ProcessEntity(Node,Source,Include); ProcessEntity(Node,Source,Include);
else if ("class"==Name) else if ("class"==Name)
@@ -100,9 +102,11 @@ int main(int argc, const char *argv[]) @@ -100,9 +104,11 @@ int main(int argc, const char *argv[])
} }
else else
{ {
@ -1013,7 +1061,7 @@ diff -up libmusicbrainz-5.0.1/src/make-c-interface.cc.xmlParser libmusicbrainz-5
} }
return 0; return 0;
@@ -114,7 +118,7 @@ std::ofstream *GetFile(const XMLNode& No @@ -114,7 +120,7 @@ std::ofstream *GetFile(const XMLNode& Node, std::ofstream& Source, std::ofstream
if (Node.isAttributeSet("target")) if (Node.isAttributeSet("target"))
{ {
@ -1022,7 +1070,7 @@ diff -up libmusicbrainz-5.0.1/src/make-c-interface.cc.xmlParser libmusicbrainz-5
if ("source"==Target) if ("source"==Target)
File=&Source; File=&Source;
else if ("include"==Target) else if ("include"==Target)
@@ -162,7 +166,7 @@ void ProcessBoilerplate(const XMLNode& N @@ -162,7 +168,7 @@ void ProcessBoilerplate(const XMLNode& Node, std::ofstream& Source, std::ofstrea
if (Node.isAttributeSet("file")) if (Node.isAttributeSet("file"))
{ {
@ -1031,7 +1079,7 @@ diff -up libmusicbrainz-5.0.1/src/make-c-interface.cc.xmlParser libmusicbrainz-5
std::ifstream InFile(FileName.c_str()); std::ifstream InFile(FileName.c_str());
if (InFile.is_open()) if (InFile.is_open())
*File << InFile.rdbuf() << std::endl; *File << InFile.rdbuf() << std::endl;
@@ -263,11 +267,11 @@ void ProcessClass(const XMLNode& Node, s @@ -263,11 +269,11 @@ void ProcessClass(const XMLNode& Node, std::ofstream& Source, std::ofstream& Inc
{ {
if (Node.isAttributeSet("name")) if (Node.isAttributeSet("name"))
{ {
@ -1045,7 +1093,7 @@ diff -up libmusicbrainz-5.0.1/src/make-c-interface.cc.xmlParser libmusicbrainz-5
else else
UpperName[0]=toupper(UpperName[0]); UpperName[0]=toupper(UpperName[0]);
@@ -294,24 +298,25 @@ void ProcessClass(const XMLNode& Node, s @@ -294,24 +300,25 @@ void ProcessClass(const XMLNode& Node, std::ofstream& Source, std::ofstream& Inc
Source << " MB5_C_CLONE(" << UpperName << "," << LowerName << ")" << std::endl; Source << " MB5_C_CLONE(" << UpperName << "," << LowerName << ")" << std::endl;
@ -1076,7 +1124,7 @@ diff -up libmusicbrainz-5.0.1/src/make-c-interface.cc.xmlParser libmusicbrainz-5
if ("string"==PropertyType) if ("string"==PropertyType)
{ {
@@ -320,13 +325,13 @@ void ProcessClass(const XMLNode& Node, s @@ -320,13 +327,13 @@ void ProcessClass(const XMLNode& Node, std::ofstream& Source, std::ofstream& Inc
if (ChildNode.isAttributeSet("deprecated")) if (ChildNode.isAttributeSet("deprecated"))
{ {
@ -1092,7 +1140,7 @@ diff -up libmusicbrainz-5.0.1/src/make-c-interface.cc.xmlParser libmusicbrainz-5
} }
Include << "/**" << std::endl; Include << "/**" << std::endl;
@@ -470,11 +475,11 @@ void ProcessList(const XMLNode& Node, st @@ -470,11 +477,11 @@ void ProcessList(const XMLNode& Node, std::ofstream& Source, std::ofstream& Incl
{ {
if (Node.isAttributeSet("name")) if (Node.isAttributeSet("name"))
{ {
@ -1106,7 +1154,7 @@ diff -up libmusicbrainz-5.0.1/src/make-c-interface.cc.xmlParser libmusicbrainz-5
else else
UpperName[0]=toupper(UpperName[0]); UpperName[0]=toupper(UpperName[0]);
@@ -532,24 +537,25 @@ void ProcessList(const XMLNode& Node, st @@ -532,24 +539,25 @@ void ProcessList(const XMLNode& Node, std::ofstream& Source, std::ofstream& Incl
Source << " MB5_C_CLONE(" << UpperName << "List," << LowerName << "_list)" << std::endl; Source << " MB5_C_CLONE(" << UpperName << "List," << LowerName << "_list)" << std::endl;
@ -1137,7 +1185,7 @@ diff -up libmusicbrainz-5.0.1/src/make-c-interface.cc.xmlParser libmusicbrainz-5
if ("string"==PropertyType) if ("string"==PropertyType)
{ {
@@ -637,18 +643,19 @@ void ProcessDeclare(const XMLNode& Node, @@ -637,18 +645,19 @@ void ProcessDeclare(const XMLNode& Node, std::ofstream& /*Source*/, std::ofstrea
std::vector<std::string> Classes; std::vector<std::string> Classes;
Classes.push_back("Entity"); Classes.push_back("Entity");
@ -1161,55 +1209,12 @@ diff -up libmusicbrainz-5.0.1/src/make-c-interface.cc.xmlParser libmusicbrainz-5
else else
UpperName[0]=toupper(UpperName[0]); UpperName[0]=toupper(UpperName[0]);
diff -up libmusicbrainz-5.0.1/src/Query.cc.xmlParser libmusicbrainz-5.0.1/src/Query.cc diff --git a/src/xmlParser.cc b/src/xmlParser.cc
--- libmusicbrainz-5.0.1/src/Query.cc.xmlParser 2012-05-16 15:48:34.000000000 -0400 new file mode 100644
+++ libmusicbrainz-5.0.1/src/Query.cc 2013-01-07 12:51:33.921020440 -0500 index 0000000..41af44b
@@ -158,15 +158,16 @@ MusicBrainz5::CMetadata MusicBrainz5::CQ --- /dev/null
#endif +++ b/src/xmlParser.cc
@@ -0,0 +1,145 @@
XMLResults Results;
- XMLNode TopNode=XMLNode::parseString(strData.c_str(), 0, &Results);
- if (Results.error==eXMLErrorNone)
+ XMLNode *TopNode = XMLRootNode::parseString(strData, &Results);
+ if (Results.code==eXMLErrorNone)
{
- XMLNode MetadataNode=TopNode.getChildNode("metadata");
+ XMLNode MetadataNode=*TopNode;
if (!MetadataNode.isEmpty())
{
Metadata=CMetadata(MetadataNode);
}
}
+ delete TopNode;
}
}
@@ -393,10 +394,10 @@ bool MusicBrainz5::CQuery::EditCollectio
#endif
XMLResults Results;
- XMLNode TopNode=XMLNode::parseString(strData.c_str(), 0, &Results);
- if (Results.error==eXMLErrorNone)
+ XMLNode *TopNode = XMLRootNode::parseString(strData, &Results);
+ if (Results.code==eXMLErrorNone)
{
- XMLNode MetadataNode=TopNode.getChildNode("metadata");
+ XMLNode MetadataNode=*TopNode;
if (!MetadataNode.isEmpty())
{
CMetadata Metadata(MetadataNode);
@@ -405,6 +406,7 @@ bool MusicBrainz5::CQuery::EditCollectio
RetVal=RetVal && true;
}
}
+ delete TopNode;
}
}
diff -up libmusicbrainz-5.0.1/src/xmlParser.cc.xmlParser libmusicbrainz-5.0.1/src/xmlParser.cc
--- libmusicbrainz-5.0.1/src/xmlParser.cc.xmlParser 2013-01-07 12:51:33.921020440 -0500
+++ libmusicbrainz-5.0.1/src/xmlParser.cc 2013-01-07 12:51:33.921020440 -0500
@@ -0,0 +1,147 @@
+/* -------------------------------------------------------------------------- +/* --------------------------------------------------------------------------
+ +
+ libmusicbrainz5 - Client library to access MusicBrainz + libmusicbrainz5 - Client library to access MusicBrainz
@ -1355,11 +1360,10 @@ diff -up libmusicbrainz-5.0.1/src/xmlParser.cc.xmlParser libmusicbrainz-5.0.1/sr
+{ +{
+ return mNode == NULL; + return mNode == NULL;
+} +}
+ diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt
+ index 645f8ae..8dd569c 100644
diff -up libmusicbrainz-5.0.1/tests/CMakeLists.txt.xmlParser libmusicbrainz-5.0.1/tests/CMakeLists.txt --- a/tests/CMakeLists.txt
--- libmusicbrainz-5.0.1/tests/CMakeLists.txt.xmlParser 2012-05-16 15:48:34.000000000 -0400 +++ b/tests/CMakeLists.txt
+++ libmusicbrainz-5.0.1/tests/CMakeLists.txt 2013-01-07 12:51:33.922020441 -0500
@@ -1,5 +1,5 @@ @@ -1,5 +1,5 @@
-INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/../include) -INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/../include)
-LINK_LIBRARIES(musicbrainz5 ${NEON_LIBRARIES}) -LINK_LIBRARIES(musicbrainz5 ${NEON_LIBRARIES})