|  | /** | 
|  | * This file has no copyright assigned and is placed in the Public Domain. | 
|  | * This file is part of the mingw-w64 runtime package. | 
|  | * No warranty is given; refer to the file DISCLAIMER.PD within this package. | 
|  | */ | 
|  | #ifndef __MSPCALL_H_ | 
|  | #define __MSPCALL_H_ | 
|  |  | 
|  | class ATL_NO_VTABLE CMSPCallBase : public CComObjectRootEx<CComMultiThreadModelNoCS>,public IDispatchImpl<ITStreamControl,&IID_ITStreamControl,&LIBID_TAPI3Lib> { | 
|  | public: | 
|  | DECLARE_POLY_AGGREGATABLE(CMSPCallBase) | 
|  | BEGIN_COM_MAP(CMSPCallBase) | 
|  | COM_INTERFACE_ENTRY(IDispatch) | 
|  | COM_INTERFACE_ENTRY(ITStreamControl) | 
|  | END_COM_MAP() | 
|  | DECLARE_GET_CONTROLLING_UNKNOWN() | 
|  | DECLARE_VQI() | 
|  | CMSPCallBase(); | 
|  | virtual ~CMSPCallBase(); | 
|  | virtual ULONG MSPCallAddRef (void) = 0; | 
|  | virtual ULONG MSPCallRelease (void) = 0; | 
|  | STDMETHOD (CreateStream) (__LONG32 lMediaType,TERMINAL_DIRECTION Direction,ITStream **ppStream); | 
|  | STDMETHOD (EnumerateStreams) (IEnumStream **ppEnumStream); | 
|  | STDMETHOD (RemoveStream) (ITStream *pStream) = 0; | 
|  | STDMETHOD (get_Streams) (VARIANT *pStreams); | 
|  | virtual HRESULT Init(CMSPAddress *pMSPAddress,MSP_HANDLE htCall,DWORD dwReserved,DWORD dwMediaType) = 0; | 
|  | virtual HRESULT ShutDown() = 0; | 
|  | virtual HRESULT ReceiveTSPCallData(PBYTE pBuffer,DWORD dwSize); | 
|  | HRESULT HandleStreamEvent(MSPEVENTITEM *EventItem) const; | 
|  | protected: | 
|  | virtual HRESULT InternalCreateStream(DWORD dwMediaType,TERMINAL_DIRECTION Direction,ITStream **ppStream) = 0; | 
|  | virtual HRESULT CreateStreamObject(DWORD dwMediaType,TERMINAL_DIRECTION Direction,IMediaEvent *pGraph,ITStream **ppStream) = 0; | 
|  | protected: | 
|  | CMSPAddress *m_pMSPAddress; | 
|  | MSP_HANDLE m_htCall; | 
|  | DWORD m_dwMediaType; | 
|  | CMSPArray <ITStream *> m_Streams; | 
|  | CMSPCritSection m_lock; | 
|  | }; | 
|  |  | 
|  | class ATL_NO_VTABLE CMSPCallMultiGraph : public CMSPCallBase { | 
|  | public: | 
|  | typedef struct { | 
|  | CMSPCallMultiGraph *pMSPCall; | 
|  | ITStream *pITStream; | 
|  | IMediaEvent *pIMediaEvent; | 
|  | } MSPSTREAMCONTEXT,*PMSPSTREAMCONTEXT; | 
|  | typedef struct _THREADPOOLWAITBLOCK { | 
|  | HANDLE hWaitHandle; | 
|  | MSPSTREAMCONTEXT *pContext; | 
|  | WINBOOL operator ==(struct _THREADPOOLWAITBLOCK &t) { return ((hWaitHandle==t.hWaitHandle) && (pContext==t.pContext)); } | 
|  | } THREADPOOLWAITBLOCK,*PTHREADPOOLWAITBLOCK; | 
|  | public: | 
|  | CMSPCallMultiGraph(); | 
|  | virtual ~CMSPCallMultiGraph(); | 
|  | STDMETHOD (RemoveStream) (ITStream *ppStream); | 
|  | HRESULT Init(CMSPAddress *pMSPAddress,MSP_HANDLE htCall,DWORD dwReserved,DWORD dwMediaType); | 
|  | HRESULT ShutDown(); | 
|  | static VOID NTAPI DispatchGraphEvent(VOID *pContext,BOOLEAN bFlag); | 
|  | virtual VOID HandleGraphEvent(MSPSTREAMCONTEXT *pContext); | 
|  | virtual HRESULT ProcessGraphEvent(ITStream *pITStream,__LONG32 lEventCode,LONG_PTR lParam1,LONG_PTR lParam2); | 
|  | protected: | 
|  | HRESULT RegisterWaitEvent(IMediaEvent *pIMediaEvent,ITStream *pITStream); | 
|  | HRESULT UnregisterWaitEvent(int index); | 
|  | virtual HRESULT InternalCreateStream(DWORD dwMediaType,TERMINAL_DIRECTION Direction,ITStream **ppStream); | 
|  | protected: | 
|  | CMSPArray <THREADPOOLWAITBLOCK> m_ThreadPoolWaitBlocks; | 
|  | }; | 
|  |  | 
|  | struct MULTI_GRAPH_EVENT_DATA { | 
|  | CMSPCallMultiGraph *pCall; | 
|  | ITStream *pITStream; | 
|  | __LONG32 lEventCode; | 
|  | LONG_PTR lParam1; | 
|  | LONG_PTR lParam2; | 
|  | IMediaEvent *pIMediaEvent; | 
|  | MULTI_GRAPH_EVENT_DATA() : pIMediaEvent(NULL),pITStream(NULL),lEventCode(0),lParam1(0),lParam2(0) { } | 
|  | }; | 
|  |  | 
|  | DWORD WINAPI AsyncMultiGraphEvent(LPVOID pVoid); | 
|  | #endif |