aboutsummaryrefslogtreecommitdiff
path: root/Src/auth/Loginbox/providerLoader.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/auth/Loginbox/providerLoader.cpp
parent537bcbc86291b32fc04ae4133ce4d7cac8ebe9a7 (diff)
downloadwinamp-20d28e80a5c861a9d5f449ea911ab75b4f37ad0d.tar.gz
Initial community commit
Diffstat (limited to 'Src/auth/Loginbox/providerLoader.cpp')
-rw-r--r--Src/auth/Loginbox/providerLoader.cpp142
1 files changed, 142 insertions, 0 deletions
diff --git a/Src/auth/Loginbox/providerLoader.cpp b/Src/auth/Loginbox/providerLoader.cpp
new file mode 100644
index 00000000..ca2d4d87
--- /dev/null
+++ b/Src/auth/Loginbox/providerLoader.cpp
@@ -0,0 +1,142 @@
+#include "./providerLoader.h"
+#include "./providerEnumerator.h"
+#include "./xmlInt32Parser.h"
+
+#include "../api.h"
+#include "../../xml/obj_xml.h"
+#include <api/service/waservicefactory.h>
+
+
+LoginProviderLoader::LoginProviderLoader()
+{
+}
+
+LoginProviderLoader::~LoginProviderLoader()
+{
+}
+
+HRESULT LoginProviderLoader::ReadXml(LPCWSTR pszPath, LoginProviderEnumerator **enumerator, INT *prefVisible)
+{
+ if (NULL == enumerator) return E_POINTER;
+ *enumerator = NULL;
+
+ if (NULL == pszPath || L'\0' == *pszPath)
+ return E_INVALIDARG;
+
+ HANDLE hFile = CreateFile(pszPath, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, NULL);
+ if (INVALID_HANDLE_VALUE == hFile)
+ {
+ DWORD error = GetLastError();
+ return HRESULT_FROM_WIN32(error);
+ }
+
+ HRESULT hr;
+
+ if (NULL != WASABI_API_SVC)
+ {
+ waServiceFactory *sf = WASABI_API_SVC->service_getServiceByGuid(obj_xmlGUID);
+ obj_xml *reader = (NULL != sf) ? (obj_xml*)sf->getInterface() : NULL;
+ if (NULL != reader)
+ {
+ if (OBJ_XML_SUCCESS == reader->xmlreader_open())
+ {
+ providerList.clear();
+ parser.SetReader(reader);
+
+ XmlInt32Parser visibleParser;
+
+ reader->xmlreader_registerCallback(L"loginProviders\fprovider", this);
+ if (NULL != prefVisible)
+ reader->xmlreader_registerCallback(L"loginProviders\fvisibleProviders", &visibleParser);
+
+ hr = FeedFile(reader, hFile, 8192);
+ reader->xmlreader_close();
+
+ parser.SetReader(NULL);
+ if (SUCCEEDED(hr))
+ hr = LoginProviderEnumerator::CreateInstance(providerList.begin(), providerList.size(), enumerator);
+
+ if (NULL != prefVisible && FAILED(visibleParser.GetValue(prefVisible)))
+ *prefVisible = 0;
+
+ }
+ else
+ hr = E_FAIL;
+
+ sf->releaseInterface(reader);
+ }
+ else
+ hr = E_FAIL;
+ }
+ else
+ hr = E_UNEXPECTED;
+
+
+ CloseHandle(hFile);
+ return hr;
+}
+
+
+HRESULT LoginProviderLoader::FeedFile(obj_xml *reader, HANDLE hFile, DWORD bufferSize)
+{
+ if (NULL == reader || INVALID_HANDLE_VALUE == hFile || 0 == bufferSize)
+ return E_INVALIDARG;
+
+ BYTE *buffer = (BYTE*)calloc(bufferSize, sizeof(BYTE));
+ if (NULL == buffer) return E_OUTOFMEMORY;
+
+ HRESULT hr;
+ INT readerCode = OBJ_XML_SUCCESS;
+
+ for(;;)
+ {
+ DWORD read = 0;
+ if (FALSE == ReadFile(hFile, buffer, bufferSize, &read, NULL) || 0 == read)
+ {
+ DWORD errorCode = GetLastError();
+ hr = HRESULT_FROM_WIN32(errorCode);
+
+ if (0 == read && OBJ_XML_SUCCESS == readerCode)
+ reader->xmlreader_feed(0, 0);
+
+ break;
+ }
+
+ readerCode = reader->xmlreader_feed(buffer, read);
+ if (OBJ_XML_SUCCESS != readerCode)
+ {
+ hr = E_FAIL;
+ break;
+ }
+ }
+
+ free(buffer);
+ return hr;
+}
+
+void LoginProviderLoader::Event_XmlStartElement(const wchar_t *xmlpath, const wchar_t *xmltag, ifc_xmlreaderparams *params)
+{
+ parser.Begin(params);
+}
+
+void LoginProviderLoader::Event_XmlEndElement(const wchar_t *xmlpath, const wchar_t *xmltag)
+{
+ LoginProvider *provider;
+ if (SUCCEEDED(parser.End(&provider)))
+ {
+ providerList.push_back(provider);
+ }
+}
+
+void LoginProviderLoader::Event_XmlError(int linenum, int errcode, const wchar_t *errstr)
+{
+ parser.End(NULL);
+}
+
+#define CBCLASS LoginProviderLoader
+START_DISPATCH;
+VCB(ONSTARTELEMENT, Event_XmlStartElement)
+VCB(ONENDELEMENT, Event_XmlEndElement)
+VCB(ONERROR, Event_XmlError)
+END_DISPATCH;
+#undef CBCLASS \ No newline at end of file