-
Notifications
You must be signed in to change notification settings - Fork 1
/
eventsink.h
162 lines (146 loc) · 4.04 KB
/
eventsink.h
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
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
/*
* Copyright(c) 2000 arton
*
* You may distribute under the terms of either the GNU General Public
* License
*
* $Date: 2006-11-03 04:23:11 +0900 (Fri, 03 11 2006) $
*/
#ifndef EVENTSINK_HEADER
#define EVENTSINK_HEADER
class CEventCode
{
public:
CEventCode(){};
CEventCode(int, LPCOLESTR);
CEventCode(const CEventCode&);
inline std::string& GetCode() { return m_strCode; }
inline int GetStartLine() const { return m_nStartLine; }
private:
int m_nStartLine;
std::string m_strCode;
};
typedef std::map<std::wstring, DISPID> DispMap;
typedef std::map<std::wstring, DISPID>::iterator DispMapIter;
typedef std::map<DISPID, CEventCode> IvkMap;
typedef std::map<DISPID, CEventCode>::iterator IvkMapIter;
class CEventSink : public IDispatchEx
{
public:
CEventSink(CRScriptCore*);
~CEventSink();
HRESULT Advise(IDispatch*);
HRESULT Advise(IDispatch*, LPOLESTR);
HRESULT Unadvise();
HRESULT ResolveEvent(LPCOLESTR pstrEventName, int nLineStart, LPCOLESTR pstrCode);
STDMETHOD(QueryInterface)(REFIID iid, void ** ppvObject)
{
if (IsEqualIID(iid, IID_IUnknown)
|| IsEqualIID(iid, IID_IDispatchEx)
|| IsEqualIID(iid, IID_IDispatch)
|| IsEqualIID(iid, m_iidEvent))
{
*ppvObject = this;
AddRef();
return S_OK;
}
return E_NOINTERFACE;
}
STDMETHOD_(ULONG,AddRef)()
{
return InterlockedIncrement(&m_lRefCount);
}
STDMETHOD_(ULONG,Release)()
{
long l = InterlockedDecrement(&m_lRefCount);
if (!l)
{
delete this;
}
return l;
}
STDMETHOD(GetTypeInfoCount)(unsigned int FAR *iTInfo)
{
return E_NOTIMPL;
}
STDMETHOD(GetTypeInfo)(unsigned int iTInfo, LCID lcid, ITypeInfo FAR* FAR* ppTInfo)
{
return E_NOTIMPL;
}
STDMETHOD(GetIDsOfNames)(
REFIID riid,
LPOLESTR* rgszNames,
unsigned int cNames,
LCID lcid,
DISPID FAR* rgDispId);
STDMETHOD(Invoke)(
DISPID dispIdMember,
REFIID riid,
LCID lcid,
WORD wFlags,
DISPPARAMS FAR* pDispParams,
VARIANT FAR* pVarResult,
EXCEPINFO FAR* pExcepInfo,
unsigned int FAR* puArgErr);
HRESULT STDMETHODCALLTYPE GetDispID(
/* [in] */ BSTR bstrName,
/* [in] */ DWORD grfdex,
/* [out] */ DISPID __RPC_FAR *pid);
HRESULT STDMETHODCALLTYPE InvokeEx(
/* [in] */ DISPID id,
/* [in] */ LCID lcid,
/* [in] */ WORD wFlags,
/* [in] */ DISPPARAMS __RPC_FAR *pdp,
/* [out] */ VARIANT __RPC_FAR *pvarRes,
/* [out] */ EXCEPINFO __RPC_FAR *pei,
/* [unique][in] */ IServiceProvider __RPC_FAR *pspCaller);
HRESULT STDMETHODCALLTYPE DeleteMemberByName(
/* [in] */ BSTR bstr,
/* [in] */ DWORD grfdex)
{
ATLTRACENOTIMPL(_T("DeleteMemberByName"));
}
HRESULT STDMETHODCALLTYPE DeleteMemberByDispID(
/* [in] */ DISPID id)
{
ATLTRACENOTIMPL(_T("DeleteMemberByDispID"));
}
HRESULT STDMETHODCALLTYPE GetMemberProperties(
/* [in] */ DISPID id,
/* [in] */ DWORD grfdexFetch,
/* [out] */ DWORD __RPC_FAR *pgrfdex)
{
ATLTRACENOTIMPL(_T("GetMemberProperties"));
}
HRESULT STDMETHODCALLTYPE GetMemberName(
/* [in] */ DISPID id,
/* [out] */ BSTR __RPC_FAR *pbstrName)
{
ATLTRACENOTIMPL(_T("GetMemberName"));
}
HRESULT STDMETHODCALLTYPE GetNextDispID(
/* [in] */ DWORD grfdex,
/* [in] */ DISPID id,
/* [out] */ DISPID __RPC_FAR *pid)
{
ATLTRACENOTIMPL(_T("GetNextDispID"));
}
HRESULT STDMETHODCALLTYPE GetNameSpaceParent(
/* [out] */ IUnknown __RPC_FAR *__RPC_FAR *ppunk)
{
ATLTRACENOTIMPL(_T("GetNameSpaceParent"));
}
inline void DisconnectDispatch() { m_pDisp = NULL; }
private:
HRESULT GetEventNames(IID&, ITypeInfo*);
IID m_iidEvent;
DispMap m_mapDisp;
IvkMap m_mapIvk;
IvkMapIter m_mapCurrentCmd;
CRScriptCore* m_pEngine;
IDispatch* m_pDisp;
DWORD m_dwCookie;
bool m_fDone;
long m_lRefCount;
};
#endif