[1166] | 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
|
---|