Home | History | Annotate | Download | only in include
      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
    275