1
0

providerParser.cpp 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  1. #include "./providerParser.h"
  2. #include "./loginProvider.h"
  3. #include "./loginTemplate.h"
  4. #include "./loginCommand.h"
  5. #include "./common.h"
  6. //#include "../api.h"
  7. #include "../../xml/obj_xml.h"
  8. typedef void (CALLBACK *PROVIDERTAGCALLBACK)(LoginProvider* /*provider*/, LPCWSTR /*value*/);
  9. typedef struct __PROVIDERTAG
  10. {
  11. LPCWSTR name;
  12. PROVIDERTAGCALLBACK callback;
  13. } PROVIDERTAG;
  14. static void CALLBACK ProviderTag_Name(LoginProvider *provider, LPCWSTR value)
  15. {
  16. provider->SetName(value);
  17. }
  18. static void CALLBACK ProviderTag_ImagePath(LoginProvider *provider, LPCWSTR value)
  19. {
  20. provider->SetImagePath(value);
  21. }
  22. static void CALLBACK ProviderTag_Description(LoginProvider *provider, LPCWSTR value)
  23. {
  24. provider->SetDescription(value);
  25. }
  26. static void CALLBACK ProviderTag_TosLink(LoginProvider *provider, LPCWSTR value)
  27. {
  28. provider->SetTosLink(value);
  29. }
  30. static void CALLBACK ProviderTag_PrivacyLink(LoginProvider *provider, LPCWSTR value)
  31. {
  32. provider->SetPrivacyLink(value);
  33. }
  34. static void CALLBACK ProviderTag_HelpLink(LoginProvider *provider, LPCWSTR value)
  35. {
  36. provider->SetHelpLink(value);
  37. }
  38. static const PROVIDERTAG szProviderTags[PROVIDER_TAG_MAX] =
  39. {
  40. {L"name", ProviderTag_Name},
  41. {L"icon", ProviderTag_ImagePath},
  42. {L"description", ProviderTag_Description},
  43. {L"tos", ProviderTag_TosLink},
  44. {L"privacy", ProviderTag_PrivacyLink},
  45. {L"help", ProviderTag_HelpLink},
  46. };
  47. LoginProviderParser::LoginProviderParser()
  48. : reader(NULL), provider(NULL)
  49. {
  50. ZeroMemory(hitList, sizeof(hitList));
  51. }
  52. LoginProviderParser::~LoginProviderParser()
  53. {
  54. if (NULL != reader)
  55. reader->Release();
  56. if (NULL != provider)
  57. provider->Release();
  58. }
  59. HRESULT LoginProviderParser::SetReader(obj_xml *pReader)
  60. {
  61. if (NULL != reader)
  62. {
  63. reader->Release();
  64. }
  65. reader = pReader;
  66. if (NULL != reader)
  67. reader->AddRef();
  68. return S_OK;
  69. }
  70. HRESULT LoginProviderParser::Begin(ifc_xmlreaderparams *params)
  71. {
  72. if (NULL != provider)
  73. return E_PENDING;
  74. if (NULL == reader) return E_UNEXPECTED;
  75. if (NULL == params) return E_INVALIDARG;
  76. GUID providerId;
  77. LPCWSTR pszId = params->getItemValue(L"id");
  78. if (NULL != pszId && RPC_S_OK == UuidFromString((RPC_WSTR)pszId, &providerId))
  79. {
  80. if (FAILED(LoginProvider::CreateInstance(&providerId, &provider)))
  81. provider = NULL;
  82. }
  83. if (NULL == provider)
  84. return E_FAIL;
  85. reader->xmlreader_registerCallback(L"loginProviders\fprovider\fname", this);
  86. reader->xmlreader_registerCallback(L"loginProviders\fprovider\ficon", this);
  87. reader->xmlreader_registerCallback(L"loginProviders\fprovider\fdescription", this);
  88. reader->xmlreader_registerCallback(L"loginProviders\fprovider\ftos", this);
  89. reader->xmlreader_registerCallback(L"loginProviders\fprovider\fprivacy", this);
  90. reader->xmlreader_registerCallback(L"loginProviders\fprovider\fhelp", this);
  91. ZeroMemory(hitList, sizeof(hitList));
  92. templateNodeParser.Begin(reader, provider);
  93. commandNodeParser.Begin(reader, provider);
  94. return S_OK;
  95. }
  96. HRESULT LoginProviderParser::End(LoginProvider **ppProvider)
  97. {
  98. templateNodeParser.End();
  99. commandNodeParser.End();
  100. reader->xmlreader_unregisterCallback(this);
  101. if (NULL == provider || S_OK != provider->IsValid())
  102. {
  103. if (NULL != provider)
  104. {
  105. provider->Release();
  106. provider = NULL;
  107. }
  108. if (NULL != ppProvider)
  109. *ppProvider = NULL;
  110. return E_FAIL;
  111. }
  112. if (NULL != ppProvider)
  113. {
  114. *ppProvider = provider;
  115. if (NULL != provider)
  116. provider->AddRef();
  117. }
  118. provider->Release();
  119. provider = NULL;
  120. return S_OK;
  121. }
  122. void LoginProviderParser::Event_XmlStartElement(const wchar_t *xmlpath, const wchar_t *xmltag, ifc_xmlreaderparams *params)
  123. {
  124. elementString.Clear();
  125. }
  126. void LoginProviderParser::Event_XmlEndElement(const wchar_t *xmlpath, const wchar_t *xmltag)
  127. {
  128. for (INT i = 0; i < PROVIDER_TAG_MAX; i++)
  129. {
  130. if (FALSE == hitList[i] &&
  131. CSTR_EQUAL == CompareString(CSTR_INVARIANT, NORM_IGNORECASE, szProviderTags[i].name, -1, xmltag, -1))
  132. {
  133. szProviderTags[i].callback(provider, elementString.Get());
  134. hitList[i] = TRUE;
  135. break;
  136. }
  137. }
  138. }
  139. void LoginProviderParser::Event_XmlCharData(const wchar_t *xmlpath, const wchar_t *xmltag, const wchar_t *value)
  140. {
  141. elementString.Append(value);
  142. }
  143. void LoginProviderParser::Event_XmlError(int linenum, int errcode, const wchar_t *errstr)
  144. {
  145. elementString.Clear();
  146. }
  147. #define CBCLASS LoginProviderParser
  148. START_DISPATCH;
  149. VCB(ONSTARTELEMENT, Event_XmlStartElement)
  150. VCB(ONENDELEMENT, Event_XmlEndElement)
  151. VCB(ONCHARDATA, Event_XmlCharData)
  152. VCB(ONERROR, Event_XmlError)
  153. END_DISPATCH;
  154. #undef CBCLASS