1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
|
#include "./commandNodeParser.h"
#include "./loginCommand.h"
#include "./loginProvider.h"
#include "../../xml/obj_xml.h"
LoginCommandNodeParser::LoginCommandNodeParser()
: reader(NULL), provider(NULL)
{
}
LoginCommandNodeParser::~LoginCommandNodeParser()
{
End();
}
HRESULT LoginCommandNodeParser::Begin(obj_xml *pReader, LoginProvider *pProvider)
{
if (NULL != reader || NULL != provider)
return E_PENDING;
if (NULL == pReader || NULL == pProvider)
return E_INVALIDARG;
reader = pReader;
reader->AddRef();
provider = pProvider;
provider->AddRef();
reader->xmlreader_registerCallback(L"loginProviders\fprovider\fcommand", this);
return S_OK;
}
HRESULT LoginCommandNodeParser::End()
{
if (NULL != reader)
{
reader->xmlreader_unregisterCallback(this);
reader->Release();
reader = NULL;
}
if (NULL != provider)
{
provider->Release();
provider = NULL;
}
return S_OK;
}
void LoginCommandNodeParser::Event_XmlStartElement(const wchar_t *xmlpath, const wchar_t *xmltag, ifc_xmlreaderparams *params)
{
elementParser.Begin(reader, params);
}
void LoginCommandNodeParser::Event_XmlEndElement(const wchar_t *xmlpath, const wchar_t *xmltag)
{
LoginCommand *result;
if (SUCCEEDED(elementParser.End(reader, &result)))
{
if (NULL != provider)
provider->SetCommand(result);
result->Release();
}
}
void LoginCommandNodeParser::Event_XmlError(int linenum, int errcode, const wchar_t *errstr)
{
}
#define CBCLASS LoginCommandNodeParser
START_DISPATCH;
VCB(ONSTARTELEMENT, Event_XmlStartElement)
VCB(ONENDELEMENT, Event_XmlEndElement)
VCB(ONERROR, Event_XmlError)
END_DISPATCH;
#undef CBCLASS
|