1 | #ifndef __MSPADDR_H_
|
---|
2 | #define __MSPADDR_H_
|
---|
3 |
|
---|
4 | typedef struct {
|
---|
5 | LIST_ENTRY Link;
|
---|
6 | MSP_EVENT_INFO MSPEventInfo;
|
---|
7 | } MSPEVENTITEM,*PMSPEVENTITEM;
|
---|
8 |
|
---|
9 | MSPEVENTITEM *AllocateEventItem(SIZE_T nExtraBytes = 0);
|
---|
10 | WINBOOL FreeEventItem(MSPEVENTITEM *pEventItemToFree);
|
---|
11 |
|
---|
12 | typedef HRESULT (*PFNCREATETERM)(CComPtr<IMoniker> pMoniker,MSP_HANDLE htAddress,ITTerminal **pTerm);
|
---|
13 |
|
---|
14 | typedef struct {
|
---|
15 | DWORD dwMediaType;
|
---|
16 | const CLSID *clsidClassManager;
|
---|
17 | PFNCREATETERM pfnCreateTerm;
|
---|
18 | } STATIC_TERMINAL_TYPE;
|
---|
19 |
|
---|
20 | class ATL_NO_VTABLE CPlugTerminalClassInfo : public IDispatchImpl<ITPluggableTerminalClassInfo,&IID_ITPluggableTerminalClassInfo,&LIBID_TAPI3Lib>,public CComObjectRootEx<CComMultiThreadModel>,public CMSPObjectSafetyImpl
|
---|
21 | {
|
---|
22 | public:
|
---|
23 | DECLARE_GET_CONTROLLING_UNKNOWN()
|
---|
24 | virtual HRESULT FinalConstruct(void);
|
---|
25 | BEGIN_COM_MAP(CPlugTerminalClassInfo)
|
---|
26 | COM_INTERFACE_ENTRY(ITPluggableTerminalClassInfo)
|
---|
27 | COM_INTERFACE_ENTRY(IDispatch)
|
---|
28 | COM_INTERFACE_ENTRY(IObjectSafety)
|
---|
29 | COM_INTERFACE_ENTRY_AGGREGATE(IID_IMarshal,m_pFTM)
|
---|
30 | END_COM_MAP()
|
---|
31 | public:
|
---|
32 | CPlugTerminalClassInfo() : m_bstrName(NULL),m_bstrCompany(NULL),m_bstrVersion(NULL),m_bstrCLSID(NULL),m_bstrTerminalClass(NULL),m_lMediaType(1),m_Direction(TD_CAPTURE),m_pFTM(NULL)
|
---|
33 | {
|
---|
34 | }
|
---|
35 | ~CPlugTerminalClassInfo() {
|
---|
36 | if(m_bstrName) {
|
---|
37 | SysFreeString(m_bstrName);
|
---|
38 | }
|
---|
39 | if(m_bstrCompany) {
|
---|
40 | SysFreeString(m_bstrCompany);
|
---|
41 | }
|
---|
42 | if(m_bstrVersion) {
|
---|
43 | SysFreeString(m_bstrVersion);
|
---|
44 | }
|
---|
45 | if(m_bstrCLSID) {
|
---|
46 | SysFreeString(m_bstrCLSID);
|
---|
47 | }
|
---|
48 | if(m_bstrTerminalClass) {
|
---|
49 | SysFreeString(m_bstrTerminalClass);
|
---|
50 | }
|
---|
51 | if(m_pFTM) {
|
---|
52 | m_pFTM->Release();
|
---|
53 | }
|
---|
54 | }
|
---|
55 | public:
|
---|
56 | STDMETHOD(get_Name)(BSTR *pName);
|
---|
57 | STDMETHOD(get_Company)(BSTR *pCompany);
|
---|
58 | STDMETHOD(get_Version)(BSTR *pVersion);
|
---|
59 | STDMETHOD(get_TerminalClass)(BSTR *pTerminalClass);
|
---|
60 | STDMETHOD(get_CLSID)(BSTR *pCLSID);
|
---|
61 | STDMETHOD(get_Direction)(TERMINAL_DIRECTION *pDirection);
|
---|
62 | STDMETHOD(get_MediaTypes)(__LONG32 *pMediaTypes);
|
---|
63 | private:
|
---|
64 | CMSPCritSection m_CritSect;
|
---|
65 | BSTR m_bstrName;
|
---|
66 | BSTR m_bstrCompany;
|
---|
67 | BSTR m_bstrVersion;
|
---|
68 | BSTR m_bstrTerminalClass;
|
---|
69 | BSTR m_bstrCLSID;
|
---|
70 | __LONG32 m_lMediaType;
|
---|
71 | TERMINAL_DIRECTION m_Direction;
|
---|
72 | IUnknown *m_pFTM;
|
---|
73 | private:
|
---|
74 | STDMETHOD(put_Name)(BSTR bstrName);
|
---|
75 | STDMETHOD(put_Company)(BSTR bstrCompany);
|
---|
76 | STDMETHOD(put_Version)(BSTR bstrVersion);
|
---|
77 | STDMETHOD(put_TerminalClass)(BSTR bstrTerminalClass);
|
---|
78 | STDMETHOD(put_CLSID)(BSTR bstrCLSID);
|
---|
79 | STDMETHOD(put_Direction)(TERMINAL_DIRECTION nDirection);
|
---|
80 | STDMETHOD(put_MediaTypes)(__LONG32 nMediaTypes);
|
---|
81 | friend class CMSPAddress;
|
---|
82 | };
|
---|
83 |
|
---|
84 | class ATL_NO_VTABLE CPlugTerminalSuperclassInfo : public IDispatchImpl<ITPluggableTerminalSuperclassInfo,&IID_ITPluggableTerminalSuperclassInfo,&LIBID_TAPI3Lib>,public CComObjectRootEx<CComMultiThreadModel>,public CMSPObjectSafetyImpl
|
---|
85 | {
|
---|
86 | public:
|
---|
87 | DECLARE_GET_CONTROLLING_UNKNOWN()
|
---|
88 | virtual HRESULT FinalConstruct(void);
|
---|
89 | BEGIN_COM_MAP(CPlugTerminalSuperclassInfo)
|
---|
90 | COM_INTERFACE_ENTRY(ITPluggableTerminalSuperclassInfo)
|
---|
91 | COM_INTERFACE_ENTRY(IDispatch)
|
---|
92 | COM_INTERFACE_ENTRY(IObjectSafety)
|
---|
93 | COM_INTERFACE_ENTRY_AGGREGATE(IID_IMarshal,m_pFTM)
|
---|
94 | END_COM_MAP()
|
---|
95 | public:
|
---|
96 | CPlugTerminalSuperclassInfo() : m_bstrCLSID(NULL),m_bstrName(NULL),m_pFTM(NULL) {
|
---|
97 | }
|
---|
98 | ~CPlugTerminalSuperclassInfo() {
|
---|
99 | if(m_bstrName) {
|
---|
100 | SysFreeString(m_bstrName);
|
---|
101 | }
|
---|
102 | if(m_bstrCLSID) {
|
---|
103 | SysFreeString(m_bstrCLSID);
|
---|
104 | }
|
---|
105 | if(m_pFTM) {
|
---|
106 | m_pFTM->Release();
|
---|
107 | }
|
---|
108 | }
|
---|
109 | public:
|
---|
110 | STDMETHOD(get_Name)(BSTR *pName);
|
---|
111 | STDMETHOD(get_CLSID)(BSTR *pCLSID);
|
---|
112 | private:
|
---|
113 | CMSPCritSection m_CritSect;
|
---|
114 | BSTR m_bstrCLSID;
|
---|
115 | BSTR m_bstrName;
|
---|
116 | IUnknown *m_pFTM;
|
---|
117 | private:
|
---|
118 | STDMETHOD(put_Name)(BSTR bstrName);
|
---|
119 | STDMETHOD(put_CLSID)(BSTR bstrCLSID);
|
---|
120 | friend class CMSPAddress;
|
---|
121 | };
|
---|
122 |
|
---|
123 | class ATL_NO_VTABLE CMSPAddress : public CComObjectRootEx<CComMultiThreadModelNoCS>,public ITMSPAddress,public IDispatchImpl<ITTerminalSupport2,&IID_ITTerminalSupport2,&LIBID_TAPI3Lib>
|
---|
124 | {
|
---|
125 | public:
|
---|
126 | BEGIN_COM_MAP(CMSPAddress)
|
---|
127 | COM_INTERFACE_ENTRY(ITMSPAddress)
|
---|
128 | COM_INTERFACE_ENTRY(IDispatch)
|
---|
129 | COM_INTERFACE_ENTRY(ITTerminalSupport)
|
---|
130 | COM_INTERFACE_ENTRY(ITTerminalSupport2)
|
---|
131 | END_COM_MAP()
|
---|
132 | DECLARE_GET_CONTROLLING_UNKNOWN()
|
---|
133 | DECLARE_VQI()
|
---|
134 | CMSPAddress();
|
---|
135 | virtual ~CMSPAddress();
|
---|
136 | virtual ULONG MSPAddressAddRef(void) = 0;
|
---|
137 | virtual ULONG MSPAddressRelease(void) = 0;
|
---|
138 | STDMETHOD (Initialize) (MSP_HANDLE htEvent);
|
---|
139 | STDMETHOD (Shutdown) ();
|
---|
140 | STDMETHOD (CreateMSPCall) (MSP_HANDLE htCall,DWORD dwReserved,DWORD dwMediaType,IUnknown *pOuterUnknown,IUnknown **ppMSPCall) = 0;
|
---|
141 | STDMETHOD (ShutdownMSPCall) (IUnknown *pMSPCall) = 0;
|
---|
142 | STDMETHOD (ReceiveTSPData) (IUnknown *pMSPCall,LPBYTE pBuffer,DWORD dwBufferSize);
|
---|
143 | STDMETHOD (GetEvent) (DWORD *pdwSize,BYTE *pBuffer);
|
---|
144 | STDMETHOD (get_StaticTerminals) (VARIANT *pVariant);
|
---|
145 | STDMETHOD (EnumerateStaticTerminals) (IEnumTerminal **ppTerminalEnumerator);
|
---|
146 | STDMETHOD (get_DynamicTerminalClasses) (VARIANT *pVariant);
|
---|
147 | STDMETHOD (EnumerateDynamicTerminalClasses) (IEnumTerminalClass **ppTerminalClassEnumerator);
|
---|
148 | STDMETHOD (CreateTerminal) (BSTR pTerminalClass,__LONG32 lMediaType,TERMINAL_DIRECTION Direction,ITTerminal **ppTerminal);
|
---|
149 | STDMETHOD (GetDefaultStaticTerminal) (__LONG32 lMediaType,TERMINAL_DIRECTION Direction,ITTerminal **ppTerminal);
|
---|
150 | STDMETHOD (get_PluggableSuperclasses)(VARIANT *pVariant);
|
---|
151 | STDMETHOD (EnumeratePluggableSuperclasses)(IEnumPluggableSuperclassInfo **ppSuperclassEnumerator);
|
---|
152 | STDMETHOD (get_PluggableTerminalClasses)(BSTR bstrTerminalSuperclass,__LONG32 lMediaType,VARIANT *pVariant);
|
---|
153 | STDMETHOD (EnumeratePluggableTerminalClasses)(CLSID iidTerminalSuperclass,__LONG32 lMediaType,IEnumPluggableTerminalClassInfo **ppClassEnumerator);
|
---|
154 | protected:
|
---|
155 | virtual HRESULT GetStaticTerminals (DWORD *pdwNumTerminals,ITTerminal **ppTerminals);
|
---|
156 | virtual HRESULT GetDynamicTerminalClasses (DWORD *pdwNumClasses,IID *pTerminalClasses);
|
---|
157 | public:
|
---|
158 | virtual WINBOOL IsValidSetOfMediaTypes(DWORD dwMediaType,DWORD dwMask);
|
---|
159 | virtual HRESULT PostEvent(MSPEVENTITEM *EventItem);
|
---|
160 | virtual DWORD GetCallMediaTypes(void) = 0;
|
---|
161 | protected:
|
---|
162 | virtual HRESULT IsMonikerInTerminalList(IMoniker *pMoniker);
|
---|
163 | virtual HRESULT UpdateTerminalListForPnp(WINBOOL bDeviceArrival);
|
---|
164 | virtual HRESULT UpdateTerminalList(void);
|
---|
165 | virtual HRESULT ReceiveTSPAddressData(PBYTE pBuffer,DWORD dwSize);
|
---|
166 | public:
|
---|
167 | virtual HRESULT PnpNotifHandler(WINBOOL bDeviceArrival);
|
---|
168 | protected:
|
---|
169 | HANDLE m_htEvent;
|
---|
170 | LIST_ENTRY m_EventList;
|
---|
171 | CMSPCritSection m_EventDataLock;
|
---|
172 | ITTerminalManager *m_pITTerminalManager;
|
---|
173 | CMSPArray <ITTerminal *> m_Terminals;
|
---|
174 | WINBOOL m_fTerminalsUpToDate;
|
---|
175 | CMSPCritSection m_TerminalDataLock;
|
---|
176 | private:
|
---|
177 | static const STATIC_TERMINAL_TYPE m_saTerminalTypes[];
|
---|
178 | static const DWORD m_sdwTerminalTypesCount;
|
---|
179 | };
|
---|
180 |
|
---|
181 | template <class T> HRESULT CreateMSPCallHelper(CMSPAddress *pCMSPAddress,MSP_HANDLE htCall,DWORD dwReserved,DWORD dwMediaType,IUnknown *pOuterUnknown,IUnknown **ppMSPCall,T **ppCMSPCall)
|
---|
182 | {
|
---|
183 | LOG((MSP_TRACE,"CreateMSPCallHelper - enter"));
|
---|
184 | HRESULT hr;
|
---|
185 | T *pMSPCall;
|
---|
186 | IUnknown *pUnknown = NULL;
|
---|
187 | if(IsBadReadPtr(pCMSPAddress,sizeof(CMSPAddress))) {
|
---|
188 | LOG((MSP_ERROR,"CreateMSPCallHelper - bad address pointer - exit E_POINTER"));
|
---|
189 | return E_POINTER;
|
---|
190 | }
|
---|
191 | if(IsBadReadPtr(pOuterUnknown,sizeof(IUnknown))) {
|
---|
192 | LOG((MSP_ERROR,"CreateMSPCallHelper - bad outer unknown - we require aggregation - exit E_POINTER"));
|
---|
193 | return E_POINTER;
|
---|
194 | }
|
---|
195 | if(IsBadReadPtr(ppMSPCall,sizeof(IUnknown *))) {
|
---|
196 | LOG((MSP_ERROR,"CreateMSPCallHelper - bad iunknown return ptr - exit E_POINTER"));
|
---|
197 | return E_POINTER;
|
---|
198 | }
|
---|
199 | if(IsBadReadPtr(ppCMSPCall,sizeof(T *))) {
|
---|
200 | LOG((MSP_ERROR,"CreateMSPCallHelper - bad class return ptr - exit E_POINTER"));
|
---|
201 | return E_POINTER;
|
---|
202 | }
|
---|
203 | if(! pCMSPAddress->IsValidSetOfMediaTypes(dwMediaType,pCMSPAddress->GetCallMediaTypes())) {
|
---|
204 | LOG((MSP_ERROR,"CreateMSPCallHelper - unsupported media types - exit TAPI_E_INVALIDMEDIATYPE"));
|
---|
205 | return TAPI_E_INVALIDMEDIATYPE;
|
---|
206 | }
|
---|
207 | CComAggObject<T> *pCall;
|
---|
208 | pCall = new CComAggObject<T>(pOuterUnknown);
|
---|
209 | if(!pCall) {
|
---|
210 | LOG((MSP_ERROR,"CreateMSPCallHelper - could not create agg call instance - exit E_OUTOFMEMORY"));
|
---|
211 | return E_OUTOFMEMORY;
|
---|
212 | }
|
---|
213 | hr = pCall->QueryInterface(IID_IUnknown,(void **)&pUnknown);
|
---|
214 | if(FAILED(hr)) {
|
---|
215 | LOG((MSP_ERROR,"CreateMSPCallHelper - QueryInterface failed: %x",hr));
|
---|
216 | delete pCall;
|
---|
217 | return hr;
|
---|
218 | }
|
---|
219 | hr = pCall->FinalConstruct();
|
---|
220 | if(FAILED(hr)) {
|
---|
221 | LOG((MSP_ERROR,"CreateMSPCallHelper - FinalConstruct failed: %x.",hr));
|
---|
222 | pUnknown->Release();
|
---|
223 | return hr;
|
---|
224 | }
|
---|
225 | pMSPCall = dynamic_cast<T *>(&(pCall->m_contained));
|
---|
226 | if(!pMSPCall) {
|
---|
227 | LOG((MSP_ERROR,"CreateMSPCallHelper - can not cast to agg object to class pointer - exit E_UNEXPECTED"));
|
---|
228 | pUnknown->Release();
|
---|
229 | return E_UNEXPECTED;
|
---|
230 | }
|
---|
231 | hr = pMSPCall->Init(pCMSPAddress,htCall,dwReserved,dwMediaType);
|
---|
232 | if(FAILED(hr)) {
|
---|
233 | LOG((MSP_ERROR,"CreateMSPCallHelper - call init failed: %x",hr));
|
---|
234 | pUnknown->Release();
|
---|
235 | return hr;
|
---|
236 | }
|
---|
237 | *ppMSPCall = pUnknown;
|
---|
238 | *ppCMSPCall = pMSPCall;
|
---|
239 | LOG((MSP_TRACE,"CreateMSPCallHelper - exit S_OK"));
|
---|
240 | return hr;
|
---|
241 | }
|
---|
242 |
|
---|
243 | template <class T> HRESULT ShutdownMSPCallHelper(IUnknown *pUnknown,T **ppCMSPCall)
|
---|
244 | {
|
---|
245 | LOG((MSP_TRACE,"ShutdownMSPCallHelper - enter"));
|
---|
246 | if(IsBadReadPtr(pUnknown,sizeof(IUnknown))) {
|
---|
247 | LOG((MSP_ERROR,"ShutdownMSPCallHelper - bad IUnknown pointer - exit E_POINTER"));
|
---|
248 | return E_POINTER;
|
---|
249 | }
|
---|
250 | if(IsBadWritePtr(ppCMSPCall,sizeof(T *))) {
|
---|
251 | LOG((MSP_ERROR,"ShutdownMSPCallHelper - bad return pointer - exit E_POINTER"));
|
---|
252 | return E_POINTER;
|
---|
253 | }
|
---|
254 | T *pMSPCall;
|
---|
255 | CComAggObject<T> *pCall = dynamic_cast<CComAggObject<T> *> (pUnknown);
|
---|
256 | if(!pCall) {
|
---|
257 | LOG((MSP_ERROR,"ShutdownMSPCallHelper - can't cast unknown to agg object pointer - exit E_UNEXPECTED"));
|
---|
258 | return E_UNEXPECTED;
|
---|
259 | }
|
---|
260 | pMSPCall = dynamic_cast<T *> (&(pCall->m_contained));
|
---|
261 | if(!pMSPCall) {
|
---|
262 | LOG((MSP_ERROR,"ShutdownMSPCallHelper - can't cast contained unknown to class pointer - exit E_UNEXPECTED"));
|
---|
263 | return E_UNEXPECTED;
|
---|
264 | }
|
---|
265 | HRESULT hr = pMSPCall->ShutDown();
|
---|
266 | if(FAILED(hr)) {
|
---|
267 | LOG((MSP_ERROR,"ShutdownMSPCallHelper - ShutDownMSPCall failed: %x",hr));
|
---|
268 | return hr;
|
---|
269 | }
|
---|
270 | *ppCMSPCall = pMSPCall;
|
---|
271 | LOG((MSP_TRACE,"ShutdownMSPCallHelper - exit S_OK"));
|
---|
272 | return S_OK;
|
---|
273 | }
|
---|
274 | #endif
|
---|