aboutsummaryrefslogtreecommitdiff
path: root/Src/auth/Loginbox/providerParser.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/providerParser.cpp
parent537bcbc86291b32fc04ae4133ce4d7cac8ebe9a7 (diff)
downloadwinamp-20d28e80a5c861a9d5f449ea911ab75b4f37ad0d.tar.gz
Initial community commit
Diffstat (limited to 'Src/auth/Loginbox/providerParser.cpp')
-rw-r--r--Src/auth/Loginbox/providerParser.cpp194
1 files changed, 194 insertions, 0 deletions
diff --git a/Src/auth/Loginbox/providerParser.cpp b/Src/auth/Loginbox/providerParser.cpp
new file mode 100644
index 00000000..dcf0660b
--- /dev/null
+++ b/Src/auth/Loginbox/providerParser.cpp
@@ -0,0 +1,194 @@
+#include "./providerParser.h"
+#include "./loginProvider.h"
+#include "./loginTemplate.h"
+#include "./loginCommand.h"
+#include "./common.h"
+
+//#include "../api.h"
+#include "../../xml/obj_xml.h"
+
+
+typedef void (CALLBACK *PROVIDERTAGCALLBACK)(LoginProvider* /*provider*/, LPCWSTR /*value*/);
+
+typedef struct __PROVIDERTAG
+{
+ LPCWSTR name;
+ PROVIDERTAGCALLBACK callback;
+} PROVIDERTAG;
+
+static void CALLBACK ProviderTag_Name(LoginProvider *provider, LPCWSTR value)
+{
+ provider->SetName(value);
+}
+
+static void CALLBACK ProviderTag_ImagePath(LoginProvider *provider, LPCWSTR value)
+{
+ provider->SetImagePath(value);
+}
+
+static void CALLBACK ProviderTag_Description(LoginProvider *provider, LPCWSTR value)
+{
+ provider->SetDescription(value);
+}
+
+static void CALLBACK ProviderTag_TosLink(LoginProvider *provider, LPCWSTR value)
+{
+ provider->SetTosLink(value);
+}
+
+static void CALLBACK ProviderTag_PrivacyLink(LoginProvider *provider, LPCWSTR value)
+{
+ provider->SetPrivacyLink(value);
+}
+
+static void CALLBACK ProviderTag_HelpLink(LoginProvider *provider, LPCWSTR value)
+{
+ provider->SetHelpLink(value);
+}
+
+static const PROVIDERTAG szProviderTags[PROVIDER_TAG_MAX] =
+{
+ {L"name", ProviderTag_Name},
+ {L"icon", ProviderTag_ImagePath},
+ {L"description", ProviderTag_Description},
+ {L"tos", ProviderTag_TosLink},
+ {L"privacy", ProviderTag_PrivacyLink},
+ {L"help", ProviderTag_HelpLink},
+};
+
+LoginProviderParser::LoginProviderParser()
+ : reader(NULL), provider(NULL)
+{
+ ZeroMemory(hitList, sizeof(hitList));
+}
+
+LoginProviderParser::~LoginProviderParser()
+{
+ if (NULL != reader)
+ reader->Release();
+
+ if (NULL != provider)
+ provider->Release();
+}
+
+
+HRESULT LoginProviderParser::SetReader(obj_xml *pReader)
+{
+ if (NULL != reader)
+ {
+ reader->Release();
+ }
+
+ reader = pReader;
+ if (NULL != reader)
+ reader->AddRef();
+
+ return S_OK;
+}
+
+HRESULT LoginProviderParser::Begin(ifc_xmlreaderparams *params)
+{
+ if (NULL != provider)
+ return E_PENDING;
+
+ if (NULL == reader) return E_UNEXPECTED;
+ if (NULL == params) return E_INVALIDARG;
+
+ GUID providerId;
+ LPCWSTR pszId = params->getItemValue(L"id");
+ if (NULL != pszId && RPC_S_OK == UuidFromString((RPC_WSTR)pszId, &providerId))
+ {
+ if (FAILED(LoginProvider::CreateInstance(&providerId, &provider)))
+ provider = NULL;
+ }
+
+ if (NULL == provider)
+ return E_FAIL;
+
+ reader->xmlreader_registerCallback(L"loginProviders\fprovider\fname", this);
+ reader->xmlreader_registerCallback(L"loginProviders\fprovider\ficon", this);
+ reader->xmlreader_registerCallback(L"loginProviders\fprovider\fdescription", this);
+ reader->xmlreader_registerCallback(L"loginProviders\fprovider\ftos", this);
+ reader->xmlreader_registerCallback(L"loginProviders\fprovider\fprivacy", this);
+ reader->xmlreader_registerCallback(L"loginProviders\fprovider\fhelp", this);
+ ZeroMemory(hitList, sizeof(hitList));
+
+ templateNodeParser.Begin(reader, provider);
+ commandNodeParser.Begin(reader, provider);
+
+ return S_OK;
+}
+
+HRESULT LoginProviderParser::End(LoginProvider **ppProvider)
+{
+ templateNodeParser.End();
+ commandNodeParser.End();
+ reader->xmlreader_unregisterCallback(this);
+
+
+
+ if (NULL == provider || S_OK != provider->IsValid())
+ {
+ if (NULL != provider)
+ {
+ provider->Release();
+ provider = NULL;
+ }
+
+ if (NULL != ppProvider)
+ *ppProvider = NULL;
+
+ return E_FAIL;
+ }
+
+ if (NULL != ppProvider)
+ {
+ *ppProvider = provider;
+ if (NULL != provider)
+ provider->AddRef();
+ }
+
+ provider->Release();
+ provider = NULL;
+
+ return S_OK;
+}
+
+
+void LoginProviderParser::Event_XmlStartElement(const wchar_t *xmlpath, const wchar_t *xmltag, ifc_xmlreaderparams *params)
+{
+ elementString.Clear();
+}
+
+void LoginProviderParser::Event_XmlEndElement(const wchar_t *xmlpath, const wchar_t *xmltag)
+{
+ for (INT i = 0; i < PROVIDER_TAG_MAX; i++)
+ {
+ if (FALSE == hitList[i] &&
+ CSTR_EQUAL == CompareString(CSTR_INVARIANT, NORM_IGNORECASE, szProviderTags[i].name, -1, xmltag, -1))
+ {
+ szProviderTags[i].callback(provider, elementString.Get());
+ hitList[i] = TRUE;
+ break;
+ }
+ }
+}
+
+void LoginProviderParser::Event_XmlCharData(const wchar_t *xmlpath, const wchar_t *xmltag, const wchar_t *value)
+{
+ elementString.Append(value);
+}
+
+void LoginProviderParser::Event_XmlError(int linenum, int errcode, const wchar_t *errstr)
+{
+ elementString.Clear();
+}
+
+#define CBCLASS LoginProviderParser
+START_DISPATCH;
+VCB(ONSTARTELEMENT, Event_XmlStartElement)
+VCB(ONENDELEMENT, Event_XmlEndElement)
+VCB(ONCHARDATA, Event_XmlCharData)
+VCB(ONERROR, Event_XmlError)
+END_DISPATCH;
+#undef CBCLASS \ No newline at end of file