| /** |
| * This file has no copyright assigned and is placed in the Public Domain. |
| * This file is part of the w64 mingw-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) (long *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(long 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; |
| long m_lMyPersonalRefcount; |
| WINBOOL m_bFirstAddRef; |
| }; |
| |
| #endif |