summaryrefslogtreecommitdiffstats
path: root/Src/Xml.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Src/Xml.cpp')
-rw-r--r--Src/Xml.cpp251
1 files changed, 251 insertions, 0 deletions
diff --git a/Src/Xml.cpp b/Src/Xml.cpp
new file mode 100644
index 0000000..44a814e
--- /dev/null
+++ b/Src/Xml.cpp
@@ -0,0 +1,251 @@
+/*
+ * Video On Demand Samples
+ *
+ * Copyright (C) 2015 Microchip Technology Germany II GmbH & Co. KG
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ * You may also obtain this software under a propriety license from Microchip.
+ * Please contact Microchip for further information.
+ *
+ */
+
+#include "Types.h"
+#include "Xml.h"
+
+#define CHILD(x) ( (x) ? (x)->xmlChildrenNode : NULL )
+
+
+
+
+CXml::CXml( const char *szFile )
+{
+ m_Doc = xmlReadFile( szFile, NULL, 0 );
+
+ if( NULL == m_Doc )
+ LOG("unable to open XML file\n");
+ else
+ m_bDocOpened = true;
+}
+
+
+
+CXml::CXml( const char *szBuffer, uint32_t nBufferLen )
+{
+ if( NULL == szBuffer || strlen( szBuffer ) >= nBufferLen )
+ {
+ LOG("Parameter error in constructor of memory driven CXml\n");
+ }
+ m_Doc = xmlReadMemory( szBuffer, strlen( szBuffer ), "config.xml", NULL, 0 );
+
+ if( NULL == m_Doc )
+ LOG("unable to open XML buffer\n");
+ else
+ m_bDocOpened = true;
+}
+
+
+
+
+CXml::CXml( CXml &Node ) : m_Doc( Node.m_Doc ), m_Node( Node.m_Node ), m_bDocOpened( false )
+{
+}
+
+
+
+
+
+CXml::~CXml()
+{
+ if( m_bDocOpened )
+ xmlFreeDoc( m_Doc );
+}
+
+
+
+
+
+bool CXml::SetToTopNode()
+{
+ m_Node = xmlDocGetRootElement( m_Doc );
+ m_Node = CHILD(m_Node);
+
+ return ( NULL != m_Node );
+}
+
+
+
+
+
+bool CXml::FindFirstChildNode()
+{
+ m_Node = CHILD(m_Node);
+ return ( NULL != m_Node );
+}
+
+
+
+
+
+bool CXml::FindNextNode()
+{
+ if( NULL == m_Node )
+ return false;
+
+ m_Node = m_Node->next;
+
+ return NULL != m_Node;
+}
+
+
+
+
+
+bool CXml::FindNode( const xmlChar *szTag )
+{
+ if( NULL == m_Node || NULL == szTag )
+ {
+ m_Node = NULL;
+ return false;
+ }
+
+ while( m_Node && xmlStrcmp( m_Node->name, szTag ) ) // search in all nodes
+ m_Node = m_Node->next;
+
+ return ( NULL != m_Node );
+}
+
+
+
+
+
+bool CXml::GetChildValue( const xmlChar *szTag, xmlChar *szValue, int nMaxLen )
+{
+ xmlNode *nodeMem = m_Node;
+ FindFirstChildNode();
+ FindNode( szTag );
+
+ if( NULL == m_Node )
+ {
+ m_Node = nodeMem;
+ return false;
+ }
+
+ xmlChar *szTmp = xmlNodeListGetString( m_Doc, m_Node->xmlChildrenNode, 1 );
+ m_Node = nodeMem;
+
+ if( NULL == szTmp )
+ return false;
+
+ if( xmlStrlen( szTmp ) >= nMaxLen )
+ {
+ xmlFree( szTmp );
+ return false;
+ }
+
+ memcpy( szValue, szTmp, sizeof( xmlChar ) * ( xmlStrlen( szTmp ) + 1 ) );
+ xmlFree( szTmp );
+
+ return true;
+}
+
+
+
+
+
+bool CXml::GetChildValueInt( const xmlChar *szTag, int &nValue )
+{
+ xmlNode *nodeMem = m_Node;
+ FindFirstChildNode();
+ FindNode( szTag );
+ xmlNode *node = m_Node;
+ m_Node = nodeMem;
+
+ if( NULL == node )
+ {
+ return false;
+ }
+
+ xmlChar *szVal = xmlNodeListGetString( m_Doc, node->xmlChildrenNode, 1 );
+
+ if( NULL == szVal )
+ return false;
+
+ nValue = (szVal[0] == '0' && (szVal[1] =='x' || szVal[1] =='X')) ?
+ strtol( ( char * )szVal + 2, NULL, 16 ) :
+ atoi( ( char * )szVal );
+
+ xmlFree( szVal );
+
+ return true;
+}
+
+
+
+
+
+bool CXml::FindNodeWithValue( const xmlChar *szNodeTag, const xmlChar *szValueTag, const xmlChar *szValue )
+{
+ while( FindNode( szNodeTag ) )
+ { // search node fitting to NodeTag
+ xmlChar *szCmp = NULL;
+
+ if( GetChildValue( szValueTag, szCmp ) )
+ { // get nodes value fitting to ValueTag
+ int nCmp = xmlStrcmp( szValue, szCmp ); // value fitting to compare value
+ xmlFree( szCmp );
+
+ if( 0 == nCmp ) // search completed?
+ break;
+ }
+
+ m_Node = m_Node->next; // continue with next node
+ }
+
+ return ( NULL != m_Node );
+}
+
+
+
+
+
+bool CXml::FindNodeWithValueInt( const xmlChar *szNodeTag, const xmlChar *szValueTag, int nValue )
+{
+ int nCmp;
+
+ while( FindNode( szNodeTag ) &&
+ GetChildValueInt( szValueTag, nCmp ) &&
+ nValue != nCmp )
+ {
+ FindNextNode();
+ }
+
+ return NULL !=
+ m_Node; // return found node or NULL;
+}
+
+
+int CXml::ConvertToInt( xmlChar *xString )
+{
+ char *cString = ( char * )xString; //Convertion may be needed..
+ for( uint32_t i = 0; i < strlen( cString ); i++ )
+ {
+ if( cString[i] >= 65 && cString[i] <= 90 )
+ {
+ //convert upper case to lower case
+ cString[i] += 32;
+ }
+ }
+ return strtol( cString, NULL, 16 );
+}