/** * 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 _MSPSTRM_H_ #define _MSPSTRM_H_ #define STRM_INITIAL 0x00000000 #define STRM_TERMINALSELECTED 0x00000001 #define STRM_CONFIGURED 0x00000002 #define STRM_RUNNING 0x00000004 #define STRM_PAUSED 0x00000008 #define STRM_STOPPED 0x00000010 class CMSPStream; class ATL_NO_VTABLE CPTEventSink : public CComObjectRootEx<CComMultiThreadModel>,public ITPluggableTerminalEventSink { public: CPTEventSink(); ~CPTEventSink(); BEGIN_COM_MAP(CPTEventSink) COM_INTERFACE_ENTRY(ITPluggableTerminalEventSink) END_COM_MAP() public: STDMETHOD(FireEvent)(const MSP_EVENT_INFO *pMspEventInfo); public: HRESULT SetSinkStream(CMSPStream *pStream); private: struct AsyncEventStruct { CMSPStream *pMSPStream; MSPEVENTITEM *pEventItem; AsyncEventStruct() : pMSPStream(NULL),pEventItem(NULL) { LOG((MSP_TRACE,"AsyncEventStruct::AsyncEventStruct[%p]",this)); } ~AsyncEventStruct() { pMSPStream = NULL; pEventItem = NULL; LOG((MSP_TRACE,"AsyncEventStruct::~AsyncEventStruct[%p]",this)); } }; static DWORD WINAPI FireEventCallBack(LPVOID pEventStructure); private: CMSPStream *m_pMSPStream; }; class ATL_NO_VTABLE CMSPStream : public CComObjectRootEx<CComMultiThreadModelNoCS>,public IDispatchImpl<ITStream,&IID_ITStream,&LIBID_TAPI3Lib> { public: BEGIN_COM_MAP(CMSPStream) COM_INTERFACE_ENTRY(IDispatch) COM_INTERFACE_ENTRY(ITStream) COM_INTERFACE_ENTRY_AGGREGATE(IID_IMarshal,m_pFTM) END_COM_MAP() DECLARE_GET_CONTROLLING_UNKNOWN() CMSPStream(); ~CMSPStream(); virtual void FinalRelease(); STDMETHOD (get_MediaType) (__LONG32 *plMediaType); STDMETHOD (get_Direction) (TERMINAL_DIRECTION *pTerminalDirection); STDMETHOD (get_Name) (BSTR *ppName) = 0; STDMETHOD (SelectTerminal) (ITTerminal *pTerminal); STDMETHOD (UnselectTerminal) (ITTerminal *pTerminal); STDMETHOD (EnumerateTerminals) (IEnumTerminal **ppEnumTerminal); STDMETHOD (get_Terminals) (VARIANT *pTerminals); STDMETHOD (StartStream) (); STDMETHOD (PauseStream) (); STDMETHOD (StopStream) (); virtual HRESULT Init(HANDLE hAddress,CMSPCallBase *pMSPCall,IMediaEvent *pGraph,DWORD dwMediaType,TERMINAL_DIRECTION Direction); virtual HRESULT ShutDown(); virtual HRESULT GetState(DWORD *pdwStatus) { return E_NOTIMPL; } virtual HRESULT HandleTSPData(BYTE *pData,DWORD dwSize); virtual HRESULT ProcessGraphEvent(__LONG32 lEventCode,LONG_PTR lParam1,LONG_PTR lParam2); protected: HRESULT RegisterPluggableTerminalEventSink(ITTerminal *pTerminal); HRESULT UnregisterPluggableTerminalEventSink(ITTerminal *pTerminal); HRESULT ReleaseSink(); ULONG InternalAddRef(); ULONG InternalRelease(); public: HRESULT HandleSinkEvent(MSPEVENTITEM *pEventItem); protected: IUnknown *m_pFTM; DWORD m_dwState; DWORD m_dwMediaType; TERMINAL_DIRECTION m_Direction; HANDLE m_hAddress; CMSPCallBase *m_pMSPCall; IGraphBuilder *m_pIGraphBuilder; IMediaControl *m_pIMediaControl; CMSPArray <ITTerminal *> m_Terminals; CMSPCritSection m_lock; CMSPCritSection m_lockRefCount; ITPluggableTerminalEventSink *m_pPTEventSink; __LONG32 m_lMyPersonalRefcount; WINBOOL m_bFirstAddRef; }; #endif