Mspterm.h
上传用户:dzyhzl
上传日期:2019-04-29
资源大小:56270k
文件大小:10k
源码类别:

模拟服务器

开发平台:

C/C++

  1. /*++
  2. Copyright (c) Microsoft Corporation. All rights reserved.
  3. Module Name:
  4.     mspterm.h
  5. Abstract:
  6.     Definitions for the CBaseTerminal and CSingleFilterTerminal classes.
  7. --*/
  8. #ifndef _MSPTERM_H_
  9. #define _MSPTERM_H_
  10. template <class T>
  11. class  ITTerminalVtblBase : public ITTerminal
  12. {
  13. };
  14. /////////////////////////////////////////////////////////////////////////////
  15. /////////////////////////////////////////////////////////////////////////////
  16. //                                                                         
  17. // CBaseTerminal                                                           
  18. //                                                                         
  19. // This is the base terminal implementation. All terminals must derive     
  20. // from this class.                                                         
  21. //                                                                         
  22. /////////////////////////////////////////////////////////////////////////////
  23. /////////////////////////////////////////////////////////////////////////////
  24. class CBaseTerminal : 
  25.     virtual public CComObjectRootEx<CComMultiThreadModelNoCS>, // we have our own CS implementation
  26.     public IDispatchImpl<ITTerminalVtblBase<CBaseTerminal>, &IID_ITTerminal, &LIBID_TAPI3Lib>,
  27.     public ITTerminalControl
  28. {
  29. BEGIN_COM_MAP(CBaseTerminal)
  30.     COM_INTERFACE_ENTRY(IDispatch)
  31.     COM_INTERFACE_ENTRY(ITTerminal)
  32.     COM_INTERFACE_ENTRY(ITTerminalControl)
  33.     COM_INTERFACE_ENTRY_AGGREGATE(IID_IMarshal, m_pFTM)
  34. END_COM_MAP()
  35. DECLARE_VQI()
  36. DECLARE_GET_CONTROLLING_UNKNOWN()
  37. public:
  38.     CBaseTerminal();
  39.     virtual ~CBaseTerminal();
  40. // ITTerminal -- COM interface for use by MSP or application
  41. public:
  42.     STDMETHOD(get_TerminalClass)(OUT  BSTR *pVal);
  43.     STDMETHOD(get_TerminalType) (OUT  TERMINAL_TYPE *pVal);
  44.     STDMETHOD(get_State)        (OUT  TERMINAL_STATE *pVal);
  45.     STDMETHOD(get_Name)         (OUT  BSTR *pVal);
  46.     STDMETHOD(get_MediaType)    (OUT  long * plMediaType);
  47.     STDMETHOD(get_Direction)    (OUT  TERMINAL_DIRECTION *pDirection);
  48. public:
  49.     // Public methods that the MSP implementation calls.
  50.     
  51.     virtual HRESULT Initialize (
  52.             IN  IID                   iidTerminalClass,
  53.             IN  DWORD                 dwMediaType,
  54.             IN  TERMINAL_DIRECTION    Direction,
  55.             IN  MSP_HANDLE            htAddress
  56.             );
  57. public:
  58. // ITTerminalControl -- COM interface for use by MSP only
  59. // This has to be a COM interface rather than a set of public methods because
  60. // the MSP needs to be able to call them for dynamic terminals as well.
  61.     //
  62.     // We implement get_AddressHandle, ConnectTerminal and DisconnectTerminal
  63.     // The derived classes must implement RunRenderFilter and
  64.     // StopRenderFilter (implementation depends on # of filters)
  65.     //
  66.     STDMETHOD (get_AddressHandle) (
  67.             OUT     MSP_HANDLE    * phtAddress
  68.             );
  69.     //
  70.     // enters each of the internal filters into the filter graph
  71.     // connects the internal filters together (if applicable)
  72.     // and returns all the filters to be used as connection points
  73.     //
  74.     STDMETHOD (ConnectTerminal) (
  75.             IN      IGraphBuilder  * pGraph,
  76.             IN      DWORD            dwTerminalDirection,
  77.             IN OUT  DWORD          * pdwNumPins,
  78.             OUT     IPin          ** ppPins
  79.             );
  80.     //
  81.     // CompleteConnectTerminal -- called after a successful ConnectTerminal
  82.     // so that the terminal can do post-connection intitialization
  83.     //
  84.     STDMETHOD (CompleteConnectTerminal) (void);
  85.     //
  86.     // disconnects the internal filters from each other (if applicable)
  87.     // and removes them from the filter graph (thus breaking connections to
  88.     // the stream). 
  89.     // Filter graph parameter is used for validation, to make sure the terminal
  90.     // is disconnected from the same graph that it was originally connected to.
  91.     //
  92.     STDMETHOD (DisconnectTerminal) (
  93.             IN      IGraphBuilder  * pGraph,
  94.             IN      DWORD            dwReserved
  95.             );
  96.     //
  97.     // stops the rightmost render filter in the terminal
  98.     // (needed for dynamic filter graphs)
  99.     //
  100.     STDMETHOD (RunRenderFilter) (void) = 0;
  101.     //
  102.     // stops the rightmost render filter in the terminal
  103.     // (needed for dynamic filter graphs)
  104.     //
  105.     STDMETHOD (StopRenderFilter) (void) = 0;
  106. protected:
  107.     // The lock that protects the data members.
  108.     CMSPCritSection     m_CritSec;
  109. public:
  110.     TERMINAL_DIRECTION  m_TerminalDirection;
  111.     TERMINAL_TYPE       m_TerminalType;
  112.     TERMINAL_STATE      m_TerminalState;
  113.     TCHAR               m_szName[MAX_PATH + 1];
  114.     IID                 m_TerminalClassID;
  115.     DWORD               m_dwMediaType;
  116.     MSP_HANDLE          m_htAddress;
  117.     // Pointer to the free threaded marshaler.
  118.     IUnknown *          m_pFTM;
  119.     // stores the filter graph builder (derives from IFilterGraph)
  120.     CComPtr<IGraphBuilder> m_pGraph;
  121.     // The following functions are to be implemented by the derived terminals
  122.     virtual HRESULT AddFiltersToGraph() = 0;
  123.     // By default terminals do nothing for preconnect
  124.     virtual HRESULT ConnectFilters() { return S_OK; }
  125.     // Returns the number of pins that will be exposed by
  126.     // GetExposedPins(). The implementation can use pGraph
  127.     // to actually mess with filters in a graph if it needs to
  128.     // do so in order to figure out how many pins it has, but normally
  129.     // that's not the case.
  130.     // Arguments are checked by the caller.
  131.     virtual HRESULT GetNumExposedPins(
  132.         IN   IGraphBuilder * pGraph,
  133.         OUT  DWORD         * pdwNumPins
  134.         ) = 0;
  135.     // Returns an array of pins that the stream can connect to.
  136.     // Arguments are checked by the caller.
  137.     virtual HRESULT GetExposedPins(
  138.         OUT    IPin  ** ppPins
  139.         ) = 0;
  140.     virtual DWORD GetSupportedMediaTypes(void) = 0;
  141.     virtual HRESULT RemoveFiltersFromGraph() = 0;
  142.     // Do we support this media?
  143.     BOOL MediaTypeSupported(long lMediaType);
  144. };
  145. /////////////////////////////////////////////////////////////////////////////
  146. /////////////////////////////////////////////////////////////////////////////
  147. //                                                                         //
  148. // CSingleFilterTerminal                                                   //
  149. //                                                                         //
  150. // This is a base class for a terminal with a single filter and pin. The   //
  151. // terminal could be any direction or media type, and it could be static   //
  152. // or dynamic.                                                             //
  153. //                                                                         //
  154. /////////////////////////////////////////////////////////////////////////////
  155. /////////////////////////////////////////////////////////////////////////////
  156. class CSingleFilterTerminal :
  157.     public CBaseTerminal
  158. {
  159. // If we add any additional interfaces to this class then
  160. // we must uncomment and expand the following.
  161. //
  162. // BEGIN_COM_MAP(CSingleFilterTerminal)
  163. //    COM_INTERFACE_ENTRY_CHAIN(CBaseTerminal)
  164. // END_COM_MAP()
  165. public:
  166.     // Implementation: We know we have a single filter.
  167.     CComPtr<IPin>        m_pIPin;
  168.     CComPtr<IBaseFilter> m_pIFilter;
  169. public:
  170. // ITCoreTerminal
  171.     // the rest of this interface is implemented by CBaseTerminal
  172.     // stops the rightmost render filter in the terminal
  173.     // (needed for dynamic filter graphs)
  174.     STDMETHOD(RunRenderFilter)(void);
  175.     // stops the rightmost render filter in the terminal
  176.     // (needed for dynamic filter graphs)
  177.     STDMETHOD(StopRenderFilter)(void);
  178. // CBaseTerminal overrides for non-COM methods
  179.     // AddFiltersToGraph cannot be implemented here because of the various
  180.     // hacks regarding their names
  181.     virtual HRESULT GetNumExposedPins(
  182.         IN   IGraphBuilder * pGraph,
  183.         OUT  DWORD         * pdwNumPins
  184.         );
  185.     virtual HRESULT GetExposedPins(
  186.         OUT    IPin  ** ppPins
  187.         );
  188.     virtual HRESULT RemoveFiltersFromGraph();
  189. };
  190. /////////////////////////////////////////////////////////////////////////////
  191. /////////////////////////////////////////////////////////////////////////////
  192. //                                                                         //
  193. // CSingleFilterStaticTerminal                                             //
  194. //                                                                         //
  195. // This is a base class for a static terminal with a single filter and     //
  196. // pin. The terminal could be any direction or media type.                 //
  197. //                                                                         //
  198. //                                                                         //
  199. /////////////////////////////////////////////////////////////////////////////
  200. /////////////////////////////////////////////////////////////////////////////
  201. class CSingleFilterStaticTerminal :
  202.     public CSingleFilterTerminal
  203. {
  204. // If we add any additional interfaces to this class then
  205. // we must uncomment and expand the following.
  206. //
  207. // BEGIN_COM_MAP(CSingleFilterStaticTerminal)
  208. //    COM_INTERFACE_ENTRY_CHAIN(CSingleFilterTerminal)
  209. // END_COM_MAP()
  210. public:
  211.     // public because CreateTerminal and CMSPAddress::UpdateTerminalListForPnp accesses it
  212.     CComPtr<IMoniker> m_pMoniker;
  213.     // this flag allows CMSPAddress::UpdateTerminalListForPnp to perform a mark and sweep
  214.     // on the terminal list
  215.     BOOL m_bMark;
  216.     //
  217.     // Compares this terminal's moniker to pMoniker, returns S_OK if they match, S_FALSE if they don't
  218.     //
  219.     virtual HRESULT CompareMoniker(
  220.                                     IMoniker *pMoniker
  221.                                   );
  222. };
  223. #endif // _MSPTERM_H_