aboutsummaryrefslogtreecommitdiff
path: root/Src/Wasabi/api/xml/LoadXML.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Src/Wasabi/api/xml/LoadXML.cpp')
-rw-r--r--Src/Wasabi/api/xml/LoadXML.cpp92
1 files changed, 92 insertions, 0 deletions
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 <precomp.h>
+#include "LoadXML.h"
+#include <bfc/file/wildcharsenum.h>
+#include <wchar.h>
+
+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 ;
+ }
+}