aboutsummaryrefslogtreecommitdiff
path: root/Src/xml/XMLDOM.cpp
diff options
context:
space:
mode:
authorJef <jef@targetspot.com>2024-09-24 08:54:57 -0400
committerJef <jef@targetspot.com>2024-09-24 08:54:57 -0400
commit20d28e80a5c861a9d5f449ea911ab75b4f37ad0d (patch)
tree12f17f78986871dd2cfb0a56e5e93b545c1ae0d0 /Src/xml/XMLDOM.cpp
parent537bcbc86291b32fc04ae4133ce4d7cac8ebe9a7 (diff)
downloadwinamp-20d28e80a5c861a9d5f449ea911ab75b4f37ad0d.tar.gz
Initial community commit
Diffstat (limited to 'Src/xml/XMLDOM.cpp')
-rw-r--r--Src/xml/XMLDOM.cpp101
1 files changed, 101 insertions, 0 deletions
diff --git a/Src/xml/XMLDOM.cpp b/Src/xml/XMLDOM.cpp
new file mode 100644
index 00000000..431307fd
--- /dev/null
+++ b/Src/xml/XMLDOM.cpp
@@ -0,0 +1,101 @@
+#include "XMLDOM.h"
+
+XMLDOM::XMLDOM() : curtext(0), curtext_len(0), curNode(0)
+{
+ xmlNode = new XMLNode;
+ curNode = xmlNode;
+}
+
+XMLDOM::~XMLDOM()
+{
+ if (curtext)
+ {
+ free(curtext);
+ curtext = 0;
+ curtext_len = 0;
+ }
+ delete xmlNode;
+}
+
+void XMLDOM::StartTag(const wchar_t *xmlpath, const wchar_t *xmltag, ifc_xmlreaderparams *params)
+{
+ XMLNode *newNode = new XMLNode;
+
+ int num = (int)params->getNbItems();
+ for (int i = 0;i < num;i++)
+ newNode->SetProperty(params->getItemName(i), params->getItemValue(i));
+
+ newNode->parent = curNode;
+ curNode->SetContent_Own(curtext);
+ curtext = 0;
+
+ curNode->AddNode(xmltag, newNode);
+ curNode = newNode;
+}
+
+void XMLDOM::EndTag(const wchar_t *xmlpath, const wchar_t *xmltag)
+{
+ curNode->AppendContent(curtext);
+
+ if (curtext)
+ {
+ free(curtext);
+ curtext = 0;
+ curtext_len = 0;
+ }
+
+ curNode = curNode->parent;
+}
+
+void XMLDOM::TextHandler(const wchar_t *xmlpath, const wchar_t *xmltag, const wchar_t *str)
+{
+ if (str && *str)
+ {
+ if (curtext)
+ {
+ size_t len = wcslen(str), new_len = len + curtext_len;
+ wchar_t* newcurtext = (wchar_t *)realloc(curtext, (new_len+1)*sizeof(wchar_t));
+ if (newcurtext)
+ {
+ curtext = newcurtext;
+ wcsncpy(curtext+curtext_len, str, len);
+ *(curtext+curtext_len+len) = 0;
+ curtext_len = new_len;
+ }
+ else
+ {
+ newcurtext = (wchar_t *)malloc((new_len+1)*sizeof(wchar_t));
+ if (newcurtext)
+ {
+ memcpy(newcurtext, curtext, curtext_len*sizeof(wchar_t));
+ free(curtext);
+ curtext = newcurtext;
+
+ wcsncpy(curtext+curtext_len, str, len);
+ *(curtext+curtext_len+len) = 0;
+ curtext_len = new_len;
+ }
+ }
+ }
+ else
+ {
+ curtext_len = wcslen(str);
+ curtext = (wchar_t *)malloc((curtext_len+1)*sizeof(wchar_t));
+ if (curtext)
+ memcpy(curtext, str, (curtext_len+1)*sizeof(wchar_t));
+ }
+ }
+}
+
+const XMLNode *XMLDOM::GetRoot() const
+{
+ return xmlNode;
+}
+
+#define CBCLASS XMLDOM
+START_DISPATCH;
+VCB(ONSTARTELEMENT, StartTag)
+VCB(ONENDELEMENT, EndTag)
+VCB(ONCHARDATA, TextHandler)
+END_DISPATCH;
+#undef CBCLASS \ No newline at end of file