From 20d28e80a5c861a9d5f449ea911ab75b4f37ad0d Mon Sep 17 00:00:00 2001 From: Jef Date: Tue, 24 Sep 2024 14:54:57 +0200 Subject: Initial community commit --- Src/Wasabi/api/xml/LoadXML.cpp | 92 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 92 insertions(+) create mode 100644 Src/Wasabi/api/xml/LoadXML.cpp (limited to 'Src/Wasabi/api/xml/LoadXML.cpp') diff --git a/Src/Wasabi/api/xml/LoadXML.cpp b/Src/Wasabi/api/xml/LoadXML.cpp new file mode 100644 index 00000000..35709227 --- /dev/null +++ b/Src/Wasabi/api/xml/LoadXML.cpp @@ -0,0 +1,92 @@ +#include +#include "LoadXML.h" +#include +#include + +void LoadXmlServiceProvider(obj_xml *parser, const wchar_t *filename) +{ + /* TODO: + svc = XmlProviderEnum(filename).getNext(); + pbuf = svc->getXmlData(filename, incpath, &p); + SvcEnum::release(svc); + svc = NULL; + */ +} + +// when filename begins with "buf:" +void LoadXmlBuffer(obj_xml *parser, const wchar_t *filename) +{ + filename += 4; + if (parser->xmlreader_feed((void *)filename, wcslen(filename)*sizeof(wchar_t)) == API_XML_SUCCESS) + parser->xmlreader_feed(0, 0); +} + +bool LoadXmlFilename(obj_xml *parser, const wchar_t *filename) +{ + OSFILETYPE file = WFOPEN(filename, WF_READONLY_BINARY, NO_FILEREADERS); +// HANDLE file = CreateFileW(filename, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, NULL, NULL); + +// if (file == INVALID_HANDLE_VALUE) + if (file == OPEN_FAILED) + return false; + + size_t bytesRead=0; + do + { + char data[4096] = {0}; + bytesRead = FREAD(data, 1, sizeof(data), file); +// if (ReadFile(file, data, 1024, &bytesRead, NULL) && bytesRead) + if (bytesRead) + { + if (parser->xmlreader_feed(data, bytesRead)!=API_XML_SUCCESS) + { +// CloseHandle(file); + FCLOSE(file); + return false; + } + } + else + { + if (parser->xmlreader_feed(0, 0) != API_XML_SUCCESS) + { + FCLOSE(file); +// CloseHandle(file); + return false; + } + bytesRead=0; + } + } while (bytesRead); + + FCLOSE(file); +// CloseHandle(file); + return true; +} + +/*** TODO: + ** move this to a separate file + ** deal with wildcard filenames (e.g. *.xml) + */ +void LoadXmlFile(obj_xml *parser, const wchar_t *filename) +{ + if (!WCSNICMP(filename, L"buf:", 4)) + { + LoadXmlBuffer(parser, filename); + return ; + } + WildcharsEnumerator e(filename); + + if (e.getNumFiles() > 0) // if we're including multiple files + { + for (int i = 0;i < e.getNumFiles();i++) + { + if (i) // don't reset the first time around + parser->xmlreader_reset(); + LoadXmlFilename(parser, e.enumFile(i)); + } + } + else if (!LoadXmlFilename(parser, filename)) + { + LoadXmlServiceProvider(parser, filename); + return ; + } +} -- cgit