| /** | 
 |  * 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 |