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