/**
 * 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 _MSPTERM_H_
#define _MSPTERM_H_

template <class T> class ITTerminalVtblBase : public ITTerminal {
};

class CBaseTerminal : virtual public CComObjectRootEx<CComMultiThreadModelNoCS>,public IDispatchImpl<ITTerminalVtblBase<CBaseTerminal>,&IID_ITTerminal,&LIBID_TAPI3Lib>,public ITTerminalControl
{
  BEGIN_COM_MAP(CBaseTerminal)
    COM_INTERFACE_ENTRY(IDispatch)
    COM_INTERFACE_ENTRY(ITTerminal)
    COM_INTERFACE_ENTRY(ITTerminalControl)
    COM_INTERFACE_ENTRY_AGGREGATE(IID_IMarshal,m_pFTM)
  END_COM_MAP()
  DECLARE_VQI()
  DECLARE_GET_CONTROLLING_UNKNOWN()
public:
  CBaseTerminal();
  virtual ~CBaseTerminal();
public:
  STDMETHOD(get_TerminalClass)(BSTR *pVal);
  STDMETHOD(get_TerminalType)(TERMINAL_TYPE *pVal);
  STDMETHOD(get_State)(TERMINAL_STATE *pVal);
  STDMETHOD(get_Name)(BSTR *pVal);
  STDMETHOD(get_MediaType)(long *plMediaType);
  STDMETHOD(get_Direction)(TERMINAL_DIRECTION *pDirection);
public:
  virtual HRESULT Initialize(IID iidTerminalClass,DWORD dwMediaType,TERMINAL_DIRECTION Direction,MSP_HANDLE htAddress);
public:
  STDMETHOD (get_AddressHandle)(MSP_HANDLE *phtAddress);
  STDMETHOD (ConnectTerminal)(IGraphBuilder *pGraph,DWORD dwTerminalDirection,DWORD *pdwNumPins,IPin **ppPins);
  STDMETHOD (CompleteConnectTerminal)(void);
  STDMETHOD (DisconnectTerminal)(IGraphBuilder *pGraph,DWORD dwReserved);
  STDMETHOD (RunRenderFilter)(void) = 0;
  STDMETHOD (StopRenderFilter)(void) = 0;
protected:
  CMSPCritSection m_CritSec;
public:
  TERMINAL_DIRECTION m_TerminalDirection;
  TERMINAL_TYPE m_TerminalType;
  TERMINAL_STATE m_TerminalState;
  TCHAR m_szName[MAX_PATH + 1];
  IID m_TerminalClassID;
  DWORD m_dwMediaType;
  MSP_HANDLE m_htAddress;
  IUnknown *m_pFTM;
  CComPtr<IGraphBuilder> m_pGraph;
  virtual HRESULT AddFiltersToGraph() = 0;
  virtual HRESULT ConnectFilters() { return S_OK; }
  virtual HRESULT GetNumExposedPins(IGraphBuilder *pGraph,DWORD *pdwNumPins) = 0;
  virtual HRESULT GetExposedPins(IPin **ppPins) = 0;
  virtual DWORD GetSupportedMediaTypes(void) = 0;
  virtual HRESULT RemoveFiltersFromGraph() = 0;
  WINBOOL MediaTypeSupported(long lMediaType);
};

class CSingleFilterTerminal : public CBaseTerminal {
public:
  CComPtr<IPin> m_pIPin;
  CComPtr<IBaseFilter> m_pIFilter;
public:
  STDMETHOD(RunRenderFilter)(void);
  STDMETHOD(StopRenderFilter)(void);
  virtual HRESULT GetNumExposedPins(IGraphBuilder *pGraph,DWORD *pdwNumPins);
  virtual HRESULT GetExposedPins(IPin **ppPins);
  virtual HRESULT RemoveFiltersFromGraph();
};

class CSingleFilterStaticTerminal : public CSingleFilterTerminal {
public:
  CComPtr<IMoniker> m_pMoniker;
  WINBOOL m_bMark;
  virtual HRESULT CompareMoniker(IMoniker *pMoniker);
};
#endif
