mspstrm.h 3.3 KB

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