123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226 |
- #include "main.h"
- #include "./testSuiteLoader.h"
- #include "../../xml/obj_xml.h"
- #include <api/service/waservicefactory.h>
- #include <strsafe.h>
- typedef void (CALLBACK *LOADERTAGCALLBACK)(TestSuiteLoader* /*loader*/, const wchar_t* /*value*/);
- typedef struct LOADERTAG
- {
- const wchar_t *name;
- LOADERTAGCALLBACK callback;
- } LOADERTAG;
- static void CALLBACK
- LoaderTag_ImageBase(TestSuiteLoader *loader, const wchar_t *value)
- {
- String_Free(loader->imageBase);
- loader->imageBase = String_Duplicate(value);
- }
- static void CALLBACK
- LoaderTag_Connect(TestSuiteLoader *loader, const wchar_t *value)
- {
- if (IS_STRING_EMPTY(value))
- return;
- const wchar_t *block, *cursor;
- char *name;
- size_t length;
- block = value;
- cursor = block;
- for(;;)
- {
- if (L'\0' == *cursor ||
- L';' == *cursor ||
- L',' == *cursor)
- {
-
- if (block < cursor)
- {
- length = cursor - block;
- name = String_ToAnsi(CP_UTF8, 0, block, (int)length, NULL, NULL);
- if (NULL != name)
- loader->connectList.push_back(name);
- }
- if (L'\0' == *cursor)
- break;
- block = cursor + 1;
- }
- cursor++;
- }
- //loader->SetImageBase(value);
- }
- static const LOADERTAG knownTags[LOADER_TAG_MAX] =
- {
- {L"imageBase", LoaderTag_ImageBase},
- {L"connect", LoaderTag_Connect},
- };
- TestSuiteLoader::TestSuiteLoader()
- : imageBase(NULL)
- {
- }
- TestSuiteLoader::~TestSuiteLoader()
- {
- size_t index;
- index = connectList.size();
- while(index--)
- {
- AnsiString_Free(connectList[index]);
- }
- String_Free(imageBase);
- }
- BOOL TestSuiteLoader::Load(const wchar_t *path, TestSuite *testSuite)
- {
- BOOL result;
- HANDLE fileHandle;
- obj_xml *reader;
- if (NULL == testSuite)
- return FALSE;
- if (NULL == path || L'\0' == *path)
- return FALSE;
- fileHandle = CreateFile(path, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, NULL);
- if (INVALID_HANDLE_VALUE == fileHandle)
- return FALSE;
- result = FALSE;
- if (NULL != WASABI_API_SVC)
- {
- waServiceFactory *sf = WASABI_API_SVC->service_getServiceByGuid(obj_xmlGUID);
- reader = (NULL != sf) ? (obj_xml*)sf->getInterface() : NULL;
- if (NULL != reader)
- {
- if (OBJ_XML_SUCCESS == reader->xmlreader_open())
- {
- reader->xmlreader_registerCallback(L"testprovider\fimageBase", this);
- reader->xmlreader_registerCallback(L"testprovider\fconnect", this);
- ZeroMemory(hitList, sizeof(hitList));
- deviceParser.Begin(reader, testSuite);
- typeParser.Begin(reader, testSuite);
- connectionParser.Begin(reader, testSuite);
- commandParser.Begin(reader, testSuite);
- result = FeedFile(reader, fileHandle, 8192);
- deviceParser.End();
- typeParser.End();
- connectionParser.End();
- commandParser.End();
- reader->xmlreader_close();
-
- testSuite->SetIconBase(imageBase);
- testSuite->SetConnectList(connectList.begin(), connectList.size());
- }
- sf->releaseInterface(reader);
- }
- }
- CloseHandle(fileHandle);
- return result;
- }
- BOOL TestSuiteLoader::FeedFile(obj_xml *reader, HANDLE fileHandle, DWORD bufferSize)
- {
- BOOL result;
- DWORD read;
- BYTE *buffer;
- int readerCode;
- if (NULL == reader ||
- INVALID_HANDLE_VALUE == fileHandle ||
- 0 == bufferSize)
- {
- return FALSE;
- }
- buffer = (BYTE*)malloc(bufferSize);
- if (NULL == buffer)
- return FALSE;
-
-
- readerCode = OBJ_XML_SUCCESS;
- result = TRUE;
- for(;;)
- {
- if (FALSE == ReadFile(fileHandle, buffer, bufferSize, &read, NULL) || 0 == read)
- {
- result = FALSE;
- if (0 == read && OBJ_XML_SUCCESS == readerCode)
- reader->xmlreader_feed(0, 0);
- break;
- }
-
- readerCode = reader->xmlreader_feed(buffer, read);
- if (OBJ_XML_SUCCESS != readerCode)
- {
- result = FALSE;
- break;
- }
- }
-
- free(buffer);
- return result;
- }
- void TestSuiteLoader::Event_XmlStartElement(const wchar_t *xmlpath, const wchar_t *xmltag, ifc_xmlreaderparams *params)
- {
- elementString.Clear();
- }
- void TestSuiteLoader::Event_XmlEndElement(const wchar_t *xmlpath, const wchar_t *xmltag)
- {
- for (size_t i = 0; i < LOADER_TAG_MAX; i++)
- {
- if (FALSE == hitList[i] &&
- CSTR_EQUAL == CompareString(CSTR_INVARIANT, NORM_IGNORECASE, knownTags[i].name, -1, xmltag, -1))
- {
- knownTags[i].callback(this, elementString.Get());
- hitList[i] = TRUE;
- break;
- }
- }
- }
- void TestSuiteLoader::Event_XmlCharData(const wchar_t *xmlpath, const wchar_t *xmltag, const wchar_t *value)
- {
- elementString.Append(value);
- }
- void TestSuiteLoader::Event_XmlError(int linenum, int errcode, const wchar_t *errstr)
- {
- elementString.Clear();
- }
- #define CBCLASS TestSuiteLoader
- START_DISPATCH;
- VCB(ONSTARTELEMENT, Event_XmlStartElement)
- VCB(ONENDELEMENT, Event_XmlEndElement)
- VCB(ONCHARDATA, Event_XmlCharData)
- VCB(ONERROR, Event_XmlError)
- END_DISPATCH;
- #undef CBCLASS
|