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

模拟服务器

开发平台:

C/C++

  1. /*++
  2. Copyright (c) Microsoft Corporation. All rights reserved.
  3. Module Name:
  4.     MSPStrm.h
  5. Abstract:
  6.     Definitions for CMSPStream class.
  7. --*/
  8. #ifndef _MSPSTRM_H_
  9. #define _MSPSTRM_H_
  10. /*++
  11. Class Description:
  12.     Represents a stream in a call.
  13. --*/
  14. #define STRM_INITIAL            0x00000000
  15. #define STRM_TERMINALSELECTED   0x00000001
  16. #define STRM_CONFIGURED         0x00000002
  17. #define STRM_RUNNING            0x00000004
  18. #define STRM_PAUSED             0x00000008
  19. #define STRM_STOPPED            0x00000010
  20. class CMSPStream;
  21. class ATL_NO_VTABLE CPTEventSink :
  22.     public CComObjectRootEx<CComMultiThreadModel>,
  23.     public ITPluggableTerminalEventSink
  24. {
  25. public:
  26.     CPTEventSink();
  27.     ~CPTEventSink();
  28. BEGIN_COM_MAP( CPTEventSink )
  29.     COM_INTERFACE_ENTRY( ITPluggableTerminalEventSink )
  30. END_COM_MAP()
  31. public:
  32.     // --- ITDTEventSink ---
  33. STDMETHOD(FireEvent)(
  34.         /* in */ const MSP_EVENT_INFO *pMspEventInfo
  35.         );
  36.     
  37. public:
  38.     //
  39.     // set the stream which will be processing our events
  40.     //
  41.     // this method is called by the stream when it creates and initializes
  42.     // the sink object, and also when the stream is going away and want to 
  43.     // tell us that it is no longer available to process our events.
  44.     //
  45.     HRESULT SetSinkStream( CMSPStream *pStream );
  46. private:
  47.     //
  48.     // a nested structure that is used to pass event and stream to the
  49.     // asynchronous event processing routine.
  50.     //
  51.     struct AsyncEventStruct
  52.     {
  53.         //
  54.         // pointer to the stream on which to fire event
  55.         //
  56.         CMSPStream *pMSPStream;
  57.         
  58.         //
  59.         // pointer to the event item to be processed
  60.         //
  61.         MSPEVENTITEM *pEventItem;
  62.         //
  63.         // as a public service, initialize structure's data members 
  64.         //
  65.         AsyncEventStruct()
  66.             :pMSPStream(NULL),
  67.             pEventItem(NULL)
  68.         {
  69.             LOG((MSP_TRACE, "AsyncEventStruct::AsyncEventStruct[%p]", this));
  70.         }
  71.         //
  72.         // as a safety measure, set data members to NULL's in destructor 
  73.         // to make sure no one attemopts to use them after the strcuture is 
  74.         // gone. 
  75.         //
  76.         // note: we don't free any data members here -- that's responsibility 
  77.         // of the structure's client
  78.         //
  79.         ~AsyncEventStruct()
  80.         {
  81.             pMSPStream = NULL;
  82.             pEventItem = NULL;
  83.             
  84.             LOG((MSP_TRACE, "AsyncEventStruct::~AsyncEventStruct[%p]", this));
  85.         }
  86.     }; // AsyncEventStruct
  87.     //
  88.     // the callback function that is submitted to thread pool api for async 
  89.     // event processing. The argument is the event structure containing stream
  90.     // and the actual event
  91.     //
  92.     
  93.     static DWORD WINAPI FireEventCallBack(LPVOID pEventStructure);
  94. private:
  95.      CMSPStream*    m_pMSPStream;
  96. };
  97. class ATL_NO_VTABLE CMSPStream : 
  98.     public CComObjectRootEx<CComMultiThreadModelNoCS>,
  99.     public IDispatchImpl<ITStream, &IID_ITStream, &LIBID_TAPI3Lib>
  100. {
  101. public:
  102. BEGIN_COM_MAP(CMSPStream)
  103.     COM_INTERFACE_ENTRY(IDispatch)
  104.     COM_INTERFACE_ENTRY(ITStream)
  105.     COM_INTERFACE_ENTRY_AGGREGATE(IID_IMarshal, m_pFTM)
  106. END_COM_MAP()
  107. DECLARE_GET_CONTROLLING_UNKNOWN()
  108.     CMSPStream(); 
  109.     ~CMSPStream();
  110. // methods of the CComObject
  111.     virtual void FinalRelease();
  112. // ITStream methods, called by the app.
  113.     STDMETHOD (get_MediaType) (
  114.         OUT     long *                  plMediaType
  115.         );
  116.     STDMETHOD (get_Direction) (
  117.         OUT     TERMINAL_DIRECTION *    pTerminalDirection
  118.         );
  119.     STDMETHOD (get_Name) (
  120.         OUT     BSTR *                  ppName
  121.         ) = 0;
  122.     STDMETHOD (SelectTerminal) (
  123.         IN      ITTerminal *            pTerminal
  124.         );
  125.     STDMETHOD (UnselectTerminal) (
  126.         IN     ITTerminal *             pTerminal
  127.         );
  128.     STDMETHOD (EnumerateTerminals) (
  129.         OUT     IEnumTerminal **        ppEnumTerminal
  130.         );
  131.     STDMETHOD (get_Terminals) (
  132.         OUT     VARIANT *               pTerminals
  133.         );
  134.     STDMETHOD (StartStream) ();
  135.     STDMETHOD (PauseStream) ();
  136.     STDMETHOD (StopStream) ();
  137. // methods called by the MSPCall object.
  138.     virtual HRESULT Init(
  139.         IN     HANDLE                   hAddress,
  140.         IN     CMSPCallBase *           pMSPCall,
  141.         IN     IMediaEvent *            pGraph,
  142.         IN     DWORD                    dwMediaType,
  143.         IN     TERMINAL_DIRECTION       Direction
  144.         );
  145.     virtual HRESULT ShutDown();
  146.     virtual HRESULT GetState(
  147.         OUT     DWORD *                  pdwStatus
  148.         ) { return E_NOTIMPL; }
  149.     virtual HRESULT HandleTSPData(
  150.         IN     BYTE *                   pData,
  151.         IN     DWORD                    dwSize
  152.         );
  153.     virtual HRESULT ProcessGraphEvent(
  154.         IN  long lEventCode,
  155.         IN  LONG_PTR lParam1,
  156.         IN  LONG_PTR lParam2
  157.         );
  158. protected:
  159.     // --- Helper functions ---
  160.     HRESULT RegisterPluggableTerminalEventSink(
  161.         /*[in]*/ ITTerminal*     pTerminal
  162.         );
  163.     HRESULT UnregisterPluggableTerminalEventSink(
  164.         /*[in]*/ ITTerminal*     pTerminal
  165.         );
  166.     
  167.     HRESULT ReleaseSink();
  168. public:
  169.     
  170.     //
  171.     // this method is called by CPTEventSink when it has an event for us to 
  172.     // process
  173.     //
  174.     HRESULT HandleSinkEvent(MSPEVENTITEM *pEventItem);
  175. protected:
  176.     // Pointer to the free threaded marshaler.
  177.     IUnknown *                  m_pFTM;
  178.     // The current state of the stream.
  179.     DWORD                       m_dwState;
  180.     // The media type of this stream. Audio, video, or others.
  181.     DWORD                       m_dwMediaType;
  182.     // The direction of this stream. Incoming or outgoing.
  183.     TERMINAL_DIRECTION          m_Direction;
  184.     // The address on which this stream is being used.
  185.     HANDLE                      m_hAddress;
  186.     // The reference to the call object.
  187.     CMSPCallBase *              m_pMSPCall;
  188.     // The pointers to the graph object interfaces.
  189.     IGraphBuilder *             m_pIGraphBuilder;
  190.     IMediaControl *             m_pIMediaControl;
  191.     // The list of stream objects in the call.
  192.     CMSPArray <ITTerminal *>    m_Terminals;
  193.     // The lock that protects the stream object. The stream object 
  194.     // should never acquire the lock and then call a MSPCall method 
  195.     // that might lock.
  196.     CMSPCritSection             m_lock;
  197.     // The Event Sink for pluggable terminals
  198.     ITPluggableTerminalEventSink* m_pPTEventSink;
  199. };
  200. #endif // __MSPSTRM_H_