diff options
author | Jean-Francois Mauguit <jfmauguit@mac.com> | 2024-09-24 09:03:25 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-09-24 09:03:25 -0400 |
commit | bab614c421ed7ae329d26bf028c4a3b1d2450f5a (patch) | |
tree | 12f17f78986871dd2cfb0a56e5e93b545c1ae0d0 /Src/plist/loader.cpp | |
parent | 4bde6044fddf053f31795b9eaccdd2a5a527d21f (diff) | |
parent | 20d28e80a5c861a9d5f449ea911ab75b4f37ad0d (diff) | |
download | winamp-bab614c421ed7ae329d26bf028c4a3b1d2450f5a.tar.gz |
Merge pull request #5 from WinampDesktop/community
Merge to main
Diffstat (limited to 'Src/plist/loader.cpp')
-rw-r--r-- | Src/plist/loader.cpp | 169 |
1 files changed, 169 insertions, 0 deletions
diff --git a/Src/plist/loader.cpp b/Src/plist/loader.cpp new file mode 100644 index 00000000..c3675593 --- /dev/null +++ b/Src/plist/loader.cpp @@ -0,0 +1,169 @@ +//------------------------------------------------------------------------ +// +// iTunes XML Library Reader +// Copyright (C) 2003-2011 Nullsoft, Inc. +// +//------------------------------------------------------------------------ + +#include "loader.h" +#include <windows.h> +#include <commdlg.h> +#include <bfc/string/stringdict.h> + + +#define ATTRIB_TRUE 256 +#define ATTRIB_FALSE 257 + +//------------------------------------------------------------------------ +// xml tags +//------------------------------------------------------------------------ +BEGIN_STRINGDICTIONARY(_itunestypes) +SDI(L"key", PLISTDATA_KEY); +SDI(L"dict", PLISTDATA_DICT); +SDI(L"integer", PLISTDATA_INTEGER); +SDI(L"string", PLISTDATA_STRING); +SDI(L"date", PLISTDATA_DATE); +SDI(L"array", PLISTDATA_ARRAY); +SDI(L"data", PLISTDATA_RAW); +SDI(L"true", ATTRIB_TRUE); +SDI(L"false", ATTRIB_FALSE); +END_STRINGDICTIONARY(_itunestypes, itunestypes) + +//------------------------------------------------------------------------ +plistLoader::plistLoader() : plistKey(L"root") +{ + m_context.push(this); +} + +//------------------------------------------------------------------------ +plistLoader::~plistLoader() +{ +} + + +//------------------------------------------------------------------------ +// element opens (or singleton), push new key/dictionary/array, handle value singletons (true/false), defer job to closing tag for other data types +//------------------------------------------------------------------------ +void plistLoader::xmlReaderOnStartElementCallback(const wchar_t *xmlpath, const wchar_t *xmltag, ifc_xmlreaderparams *params) { + m_cdata = 0; + int a = itunestypes.getId(xmltag); + switch (a) { + case PLISTDATA_KEY: + m_cdata = L""; + m_context.push(new plistKey()); + m_dict.top()->addKey((plistKey *)m_context.top()); + break; + case PLISTDATA_DICT: + { + m_dict.push(new plistDict()); + plistData *contextTop = m_context.top(); + contextTop->setData(static_cast<plistDict *>(m_dict.top())); + } + break; + case PLISTDATA_ARRAY: + { + plistArray *new_array = new plistArray; + plistData *contextTop = m_context.top(); + contextTop->setData(new_array); + m_context.push(new_array); + m_dict.push(new_array); + break; + } + case PLISTDATA_STRING: + break; + case PLISTDATA_INTEGER: + break; + case PLISTDATA_DATE: + break; + case PLISTDATA_RAW: + break; + case PLISTDATA_REAL: + break; + case ATTRIB_TRUE: { + m_context.top()->setData(new plistBoolean(true)); + if (m_context.top()->getType() == PLISTDATA_KEY) m_context.pop(); + break; + } + case ATTRIB_FALSE: { + m_context.top()->setData(new plistBoolean(false)); + if (m_context.top()->getType() == PLISTDATA_KEY) m_context.pop(); + break; + } + } +} + +//------------------------------------------------------------------------ +// element closes, set data for last key/array, pop key/array/dictionary from stack +//------------------------------------------------------------------------ +void plistLoader::xmlReaderOnEndElementCallback(const wchar_t *xmlpath, const wchar_t *xmltag) { + int a = itunestypes.getId(xmltag); + switch (a) { + case PLISTDATA_KEY: + ASSERT(m_context.top()->getType() == PLISTDATA_KEY); + ((plistKey*)m_context.top())->setName(m_cdata); + break; + case PLISTDATA_DICT: + if (m_context.top()->getType() == PLISTDATA_KEY) m_context.pop(); + m_dict.pop(); + break; + case PLISTDATA_ARRAY: { + /*if (m_context.top()->getType() == PLISTDATA_KEY)*/ m_context.pop(); + //ASSERT(m_context.top()->getType() == PLISTDATA_ARRAY); + //plistArray *a = (plistArray *)m_context.top(); + //m_context.pop(); + //m_context.top()->setData(a); + m_dict.pop(); + break; + } + case PLISTDATA_STRING: { + plistString *s = new plistString(m_cdata); + m_context.top()->setData(s); + if (m_context.top()->getType() == PLISTDATA_KEY) m_context.pop(); + break; + } + case PLISTDATA_INTEGER: { + plistInteger *i = new plistInteger(); + i->setString(m_cdata); + m_context.top()->setData(i); + if (m_context.top()->getType() == PLISTDATA_KEY) m_context.pop(); + break; + } + case PLISTDATA_REAL: { + plistReal *r = new plistReal(); + r->setString(m_cdata); + m_context.top()->setData(r); + if (m_context.top()->getType() == PLISTDATA_KEY) m_context.pop(); + break; + } + case PLISTDATA_DATE: { + plistDate *d = new plistDate(); + d->setString(m_cdata); + m_context.top()->setData(d); + if (m_context.top()->getType() == PLISTDATA_KEY) m_context.pop(); + break; + } + case PLISTDATA_RAW: { + plistRaw *r = new plistRaw(); + r->setString(m_cdata); + m_context.top()->setData(r); + if (m_context.top()->getType() == PLISTDATA_KEY) m_context.pop(); + break; + } + } + m_cdata = 0; +} + +//------------------------------------------------------------------------ +// record c_data +//------------------------------------------------------------------------ +void plistLoader::xmlReaderOnCharacterDataCallback(const wchar_t *xmlpath, const wchar_t *xmltag, const wchar_t *str) { + m_cdata += str; +} + +#define CBCLASS plistLoader +START_DISPATCH; +VCB(ONSTARTELEMENT, xmlReaderOnStartElementCallback) +VCB(ONCHARDATA, xmlReaderOnCharacterDataCallback) +VCB(ONENDELEMENT, xmlReaderOnEndElementCallback) +END_DISPATCH; +#undef CBCLASS
\ No newline at end of file |