winamp/Src/auth/Loginbox/providerParser.cpp

194 lines
4.4 KiB
C++

#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