1
0

providerLoader.cpp 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. #include "./providerLoader.h"
  2. #include "./providerEnumerator.h"
  3. #include "./xmlInt32Parser.h"
  4. #include "../api.h"
  5. #include "../../xml/obj_xml.h"
  6. #include <api/service/waservicefactory.h>
  7. LoginProviderLoader::LoginProviderLoader()
  8. {
  9. }
  10. LoginProviderLoader::~LoginProviderLoader()
  11. {
  12. }
  13. HRESULT LoginProviderLoader::ReadXml(LPCWSTR pszPath, LoginProviderEnumerator **enumerator, INT *prefVisible)
  14. {
  15. if (NULL == enumerator) return E_POINTER;
  16. *enumerator = NULL;
  17. if (NULL == pszPath || L'\0' == *pszPath)
  18. return E_INVALIDARG;
  19. HANDLE hFile = CreateFile(pszPath, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, NULL);
  20. if (INVALID_HANDLE_VALUE == hFile)
  21. {
  22. DWORD error = GetLastError();
  23. return HRESULT_FROM_WIN32(error);
  24. }
  25. HRESULT hr;
  26. if (NULL != WASABI_API_SVC)
  27. {
  28. waServiceFactory *sf = WASABI_API_SVC->service_getServiceByGuid(obj_xmlGUID);
  29. obj_xml *reader = (NULL != sf) ? (obj_xml*)sf->getInterface() : NULL;
  30. if (NULL != reader)
  31. {
  32. if (OBJ_XML_SUCCESS == reader->xmlreader_open())
  33. {
  34. providerList.clear();
  35. parser.SetReader(reader);
  36. XmlInt32Parser visibleParser;
  37. reader->xmlreader_registerCallback(L"loginProviders\fprovider", this);
  38. if (NULL != prefVisible)
  39. reader->xmlreader_registerCallback(L"loginProviders\fvisibleProviders", &visibleParser);
  40. hr = FeedFile(reader, hFile, 8192);
  41. reader->xmlreader_close();
  42. parser.SetReader(NULL);
  43. if (SUCCEEDED(hr))
  44. hr = LoginProviderEnumerator::CreateInstance(providerList.begin(), providerList.size(), enumerator);
  45. if (NULL != prefVisible && FAILED(visibleParser.GetValue(prefVisible)))
  46. *prefVisible = 0;
  47. }
  48. else
  49. hr = E_FAIL;
  50. sf->releaseInterface(reader);
  51. }
  52. else
  53. hr = E_FAIL;
  54. }
  55. else
  56. hr = E_UNEXPECTED;
  57. CloseHandle(hFile);
  58. return hr;
  59. }
  60. HRESULT LoginProviderLoader::FeedFile(obj_xml *reader, HANDLE hFile, DWORD bufferSize)
  61. {
  62. if (NULL == reader || INVALID_HANDLE_VALUE == hFile || 0 == bufferSize)
  63. return E_INVALIDARG;
  64. BYTE *buffer = (BYTE*)calloc(bufferSize, sizeof(BYTE));
  65. if (NULL == buffer) return E_OUTOFMEMORY;
  66. HRESULT hr;
  67. INT readerCode = OBJ_XML_SUCCESS;
  68. for(;;)
  69. {
  70. DWORD read = 0;
  71. if (FALSE == ReadFile(hFile, buffer, bufferSize, &read, NULL) || 0 == read)
  72. {
  73. DWORD errorCode = GetLastError();
  74. hr = HRESULT_FROM_WIN32(errorCode);
  75. if (0 == read && OBJ_XML_SUCCESS == readerCode)
  76. reader->xmlreader_feed(0, 0);
  77. break;
  78. }
  79. readerCode = reader->xmlreader_feed(buffer, read);
  80. if (OBJ_XML_SUCCESS != readerCode)
  81. {
  82. hr = E_FAIL;
  83. break;
  84. }
  85. }
  86. free(buffer);
  87. return hr;
  88. }
  89. void LoginProviderLoader::Event_XmlStartElement(const wchar_t *xmlpath, const wchar_t *xmltag, ifc_xmlreaderparams *params)
  90. {
  91. parser.Begin(params);
  92. }
  93. void LoginProviderLoader::Event_XmlEndElement(const wchar_t *xmlpath, const wchar_t *xmltag)
  94. {
  95. LoginProvider *provider;
  96. if (SUCCEEDED(parser.End(&provider)))
  97. {
  98. providerList.push_back(provider);
  99. }
  100. }
  101. void LoginProviderLoader::Event_XmlError(int linenum, int errcode, const wchar_t *errstr)
  102. {
  103. parser.End(NULL);
  104. }
  105. #define CBCLASS LoginProviderLoader
  106. START_DISPATCH;
  107. VCB(ONSTARTELEMENT, Event_XmlStartElement)
  108. VCB(ONENDELEMENT, Event_XmlEndElement)
  109. VCB(ONERROR, Event_XmlError)
  110. END_DISPATCH;
  111. #undef CBCLASS