aboutsummaryrefslogtreecommitdiff
path: root/Src/auth/Loginbox/templateParser.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Src/auth/Loginbox/templateParser.cpp')
-rw-r--r--Src/auth/Loginbox/templateParser.cpp111
1 files changed, 111 insertions, 0 deletions
diff --git a/Src/auth/Loginbox/templateParser.cpp b/Src/auth/Loginbox/templateParser.cpp
new file mode 100644
index 00000000..4bcb884f
--- /dev/null
+++ b/Src/auth/Loginbox/templateParser.cpp
@@ -0,0 +1,111 @@
+#include "./templateParser.h"
+#include "./loginTemplate.h"
+#include "./templateCredentials.h"
+#include "./templateInfo.h"
+#include "./templateAddress.h"
+
+#include "./common.h"
+
+#include "../../xml/obj_xml.h"
+
+
+LoginTemplateParser::LoginTemplateParser()
+ : object(NULL)
+{
+}
+
+LoginTemplateParser::~LoginTemplateParser()
+{
+ if (NULL != object)
+ object->Release();
+
+}
+
+
+HRESULT LoginTemplateParser::Begin(obj_xml *reader, ifc_xmlreaderparams *params)
+{
+ if (NULL != object)
+ return E_PENDING;
+
+ if (NULL == reader || NULL == params)
+ return E_INVALIDARG;
+
+ GUID templateId;
+ LPCWSTR pszId = params->getItemValue(L"id");
+ if (NULL == pszId || RPC_S_OK != UuidFromString((RPC_WSTR)pszId, &templateId))
+ return E_INVALIDARG;
+
+ HRESULT hr;
+ if (IsEqualGUID(LTUID_CREDENTIALS, templateId))
+ hr = LoginTemplateCredentials::CreateInstance((LoginTemplateCredentials**)&object);
+ else if (IsEqualGUID(LTUID_INFO, templateId))
+ hr = LoginTemplateInfo::CreateInstance((LoginTemplateInfo**)&object);
+ else if (IsEqualGUID(LTUID_ADDRESS, templateId))
+ hr = LoginTemplateAddress::CreateInstance((LoginTemplateAddress**)&object);
+ else
+ hr = E_INVALIDARG;
+
+ if (SUCCEEDED(hr))
+ reader->xmlreader_registerCallback(L"loginProviders\fprovider\ftemplate\f*", this);
+
+ return hr;
+}
+
+HRESULT LoginTemplateParser::End(obj_xml *reader, LoginTemplate **instance)
+{
+ if (NULL == object)
+ return E_UNEXPECTED;
+
+ HRESULT hr;
+
+ if (SUCCEEDED(object->IsValid()))
+ {
+ if (NULL != instance)
+ {
+ *instance = object;
+ object->AddRef();
+ }
+ hr = S_OK;
+ }
+ else
+ hr = E_FAIL;
+
+ object->Release();
+ object = NULL;
+
+ if (NULL != reader)
+ reader->xmlreader_unregisterCallback(this);
+
+ return hr;
+}
+
+
+void LoginTemplateParser::Event_XmlStartElement(const wchar_t *xmlpath, const wchar_t *xmltag, ifc_xmlreaderparams *params)
+{
+ elementString.Clear();
+}
+
+void LoginTemplateParser::Event_XmlEndElement(const wchar_t *xmlpath, const wchar_t *xmltag)
+{
+ if (NULL != object)
+ object->SetParameter(xmltag, elementString.Get());
+}
+
+void LoginTemplateParser::Event_XmlCharData(const wchar_t *xmlpath, const wchar_t *xmltag, const wchar_t *value)
+{
+ elementString.Append(value);
+}
+
+void LoginTemplateParser::Event_XmlError(int linenum, int errcode, const wchar_t *errstr)
+{
+ elementString.Clear();
+}
+
+#define CBCLASS LoginTemplateParser
+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