master
 1/**
 2 * This file has no copyright assigned and is placed in the Public Domain.
 3 * This file is part of the mingw-w64 runtime package.
 4 * No warranty is given; refer to the file DISCLAIMER.PD within this package.
 5 */
 6#ifndef __MSPCALL_H_
 7#define __MSPCALL_H_
 8
 9class ATL_NO_VTABLE CMSPCallBase : public CComObjectRootEx<CComMultiThreadModelNoCS>,public IDispatchImpl<ITStreamControl,&IID_ITStreamControl,&LIBID_TAPI3Lib> {
10public:
11  DECLARE_POLY_AGGREGATABLE(CMSPCallBase)
12  BEGIN_COM_MAP(CMSPCallBase)
13    COM_INTERFACE_ENTRY(IDispatch)
14    COM_INTERFACE_ENTRY(ITStreamControl)
15  END_COM_MAP()
16  DECLARE_GET_CONTROLLING_UNKNOWN()
17  DECLARE_VQI()
18  CMSPCallBase();
19  virtual ~CMSPCallBase();
20  virtual ULONG MSPCallAddRef (void) = 0;
21  virtual ULONG MSPCallRelease (void) = 0;
22  STDMETHOD (CreateStream) (__LONG32 lMediaType,TERMINAL_DIRECTION Direction,ITStream **ppStream);
23  STDMETHOD (EnumerateStreams) (IEnumStream **ppEnumStream);
24  STDMETHOD (RemoveStream) (ITStream *pStream) = 0;
25  STDMETHOD (get_Streams) (VARIANT *pStreams);
26  virtual HRESULT Init(CMSPAddress *pMSPAddress,MSP_HANDLE htCall,DWORD dwReserved,DWORD dwMediaType) = 0;
27  virtual HRESULT ShutDown() = 0;
28  virtual HRESULT ReceiveTSPCallData(PBYTE pBuffer,DWORD dwSize);
29  HRESULT HandleStreamEvent(MSPEVENTITEM *EventItem) const;
30protected:
31  virtual HRESULT InternalCreateStream(DWORD dwMediaType,TERMINAL_DIRECTION Direction,ITStream **ppStream) = 0;
32  virtual HRESULT CreateStreamObject(DWORD dwMediaType,TERMINAL_DIRECTION Direction,IMediaEvent *pGraph,ITStream **ppStream) = 0;
33protected:
34  CMSPAddress *m_pMSPAddress;
35  MSP_HANDLE m_htCall;
36  DWORD m_dwMediaType;
37  CMSPArray <ITStream *> m_Streams;
38  CMSPCritSection m_lock;
39};
40
41class ATL_NO_VTABLE CMSPCallMultiGraph : public CMSPCallBase {
42public:
43  typedef struct {
44    CMSPCallMultiGraph *pMSPCall;
45    ITStream *pITStream;
46    IMediaEvent *pIMediaEvent;
47  } MSPSTREAMCONTEXT,*PMSPSTREAMCONTEXT;
48  typedef struct _THREADPOOLWAITBLOCK {
49    HANDLE hWaitHandle;
50    MSPSTREAMCONTEXT *pContext;
51    WINBOOL operator ==(struct _THREADPOOLWAITBLOCK &t) { return ((hWaitHandle==t.hWaitHandle) && (pContext==t.pContext)); }
52  } THREADPOOLWAITBLOCK,*PTHREADPOOLWAITBLOCK;
53public:
54  CMSPCallMultiGraph();
55  virtual ~CMSPCallMultiGraph();
56  STDMETHOD (RemoveStream) (ITStream *ppStream);
57  HRESULT Init(CMSPAddress *pMSPAddress,MSP_HANDLE htCall,DWORD dwReserved,DWORD dwMediaType);
58  HRESULT ShutDown();
59  static VOID NTAPI DispatchGraphEvent(VOID *pContext,BOOLEAN bFlag);
60  virtual VOID HandleGraphEvent(MSPSTREAMCONTEXT *pContext);
61  virtual HRESULT ProcessGraphEvent(ITStream *pITStream,__LONG32 lEventCode,LONG_PTR lParam1,LONG_PTR lParam2);
62protected:
63  HRESULT RegisterWaitEvent(IMediaEvent *pIMediaEvent,ITStream *pITStream);
64  HRESULT UnregisterWaitEvent(int index);
65  virtual HRESULT InternalCreateStream(DWORD dwMediaType,TERMINAL_DIRECTION Direction,ITStream **ppStream);
66protected:
67  CMSPArray <THREADPOOLWAITBLOCK> m_ThreadPoolWaitBlocks;
68};
69
70struct MULTI_GRAPH_EVENT_DATA {
71  CMSPCallMultiGraph *pCall;
72  ITStream *pITStream;
73  __LONG32 lEventCode;
74  LONG_PTR lParam1;
75  LONG_PTR lParam2;
76  IMediaEvent *pIMediaEvent;
77  MULTI_GRAPH_EVENT_DATA() : pIMediaEvent(NULL),pITStream(NULL),lEventCode(0),lParam1(0),lParam2(0) { }
78};
79
80DWORD WINAPI AsyncMultiGraphEvent(LPVOID pVoid);
81#endif