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 _MSPSTRM_H_
7 #define _MSPSTRM_H_
8 
9 #define STRM_INITIAL 0x00000000
10 #define STRM_TERMINALSELECTED 0x00000001
11 #define STRM_CONFIGURED 0x00000002
12 #define STRM_RUNNING 0x00000004
13 #define STRM_PAUSED 0x00000008
14 #define STRM_STOPPED 0x00000010
15 
16 class CMSPStream;
17 
18 class ATL_NO_VTABLE CPTEventSink : public CComObjectRootEx<CComMultiThreadModel>,public ITPluggableTerminalEventSink {
19 public:
20   CPTEventSink();
21   ~CPTEventSink();
22   BEGIN_COM_MAP(CPTEventSink)
23     COM_INTERFACE_ENTRY(ITPluggableTerminalEventSink)
24   END_COM_MAP()
25 public:
26   STDMETHOD(FireEvent)(const MSP_EVENT_INFO *pMspEventInfo);
27 public:
28   HRESULT SetSinkStream(CMSPStream *pStream);
29 private:
30   struct AsyncEventStruct {
31     CMSPStream *pMSPStream;
32     MSPEVENTITEM *pEventItem;
AsyncEventStructAsyncEventStruct33     AsyncEventStruct() : pMSPStream(NULL),pEventItem(NULL) {
34       LOG((MSP_TRACE,"AsyncEventStruct::AsyncEventStruct[%p]",this));
35     }
~AsyncEventStructAsyncEventStruct36     ~AsyncEventStruct() {
37       pMSPStream = NULL;
38       pEventItem = NULL;
39       LOG((MSP_TRACE,"AsyncEventStruct::~AsyncEventStruct[%p]",this));
40     }
41   };
42   static DWORD WINAPI FireEventCallBack(LPVOID pEventStructure);
43 private:
44   CMSPStream *m_pMSPStream;
45 };
46 
47 class ATL_NO_VTABLE CMSPStream : public CComObjectRootEx<CComMultiThreadModelNoCS>,public IDispatchImpl<ITStream,&IID_ITStream,&LIBID_TAPI3Lib> {
48 public:
49   BEGIN_COM_MAP(CMSPStream)
50     COM_INTERFACE_ENTRY(IDispatch)
51     COM_INTERFACE_ENTRY(ITStream)
52     COM_INTERFACE_ENTRY_AGGREGATE(IID_IMarshal,m_pFTM)
53   END_COM_MAP()
54   DECLARE_GET_CONTROLLING_UNKNOWN()
55   CMSPStream();
56   ~CMSPStream();
57   virtual void FinalRelease();
58   STDMETHOD (get_MediaType) (__LONG32 *plMediaType);
59   STDMETHOD (get_Direction) (TERMINAL_DIRECTION *pTerminalDirection);
60   STDMETHOD (get_Name) (BSTR *ppName) = 0;
61   STDMETHOD (SelectTerminal) (ITTerminal *pTerminal);
62   STDMETHOD (UnselectTerminal) (ITTerminal *pTerminal);
63   STDMETHOD (EnumerateTerminals) (IEnumTerminal **ppEnumTerminal);
64   STDMETHOD (get_Terminals) (VARIANT *pTerminals);
65   STDMETHOD (StartStream) ();
66   STDMETHOD (PauseStream) ();
67   STDMETHOD (StopStream) ();
68   virtual HRESULT Init(HANDLE hAddress,CMSPCallBase *pMSPCall,IMediaEvent *pGraph,DWORD dwMediaType,TERMINAL_DIRECTION Direction);
69   virtual HRESULT ShutDown();
GetState(DWORD * pdwStatus)70   virtual HRESULT GetState(DWORD *pdwStatus) { return E_NOTIMPL; }
71   virtual HRESULT HandleTSPData(BYTE *pData,DWORD dwSize);
72   virtual HRESULT ProcessGraphEvent(__LONG32 lEventCode,LONG_PTR lParam1,LONG_PTR lParam2);
73 protected:
74   HRESULT RegisterPluggableTerminalEventSink(ITTerminal *pTerminal);
75   HRESULT UnregisterPluggableTerminalEventSink(ITTerminal *pTerminal);
76   HRESULT ReleaseSink();
77   ULONG InternalAddRef();
78   ULONG InternalRelease();
79 public:
80   HRESULT HandleSinkEvent(MSPEVENTITEM *pEventItem);
81 protected:
82   IUnknown *m_pFTM;
83   DWORD m_dwState;
84   DWORD m_dwMediaType;
85   TERMINAL_DIRECTION m_Direction;
86   HANDLE m_hAddress;
87   CMSPCallBase *m_pMSPCall;
88   IGraphBuilder *m_pIGraphBuilder;
89   IMediaControl *m_pIMediaControl;
90   CMSPArray <ITTerminal *> m_Terminals;
91   CMSPCritSection m_lock;
92   CMSPCritSection m_lockRefCount;
93   ITPluggableTerminalEventSink *m_pPTEventSink;
94   __LONG32 m_lMyPersonalRefcount;
95   WINBOOL m_bFirstAddRef;
96 };
97 
98 #endif
99