Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

133 lines
3.7 KiB

  1. /*++
  2. Copyright (C) 1996-2001 Microsoft Corporation
  3. Module Name:
  4. Abstract:
  5. History:
  6. --*/
  7. #ifndef __MSMQRECV_H__
  8. #define __MSMQRECV_H__
  9. #include <unk.h>
  10. #include <wstring.h>
  11. #include <sync.h>
  12. #include <wmimsg.h>
  13. #include <comutl.h>
  14. #include "msmqhdlr.h"
  15. #include "msmqrecv.h"
  16. #include "msmqcomn.h"
  17. /**************************************************************************
  18. CMsgMsmqReceiver
  19. ***************************************************************************/
  20. class CMsgMsmqReceiver
  21. : public CUnkBase<IWmiMessageReceiver,&IID_IWmiMessageReceiver>
  22. {
  23. CCritSec m_cs;
  24. CMsmqApi m_Api;
  25. DWORD m_dwFlags;
  26. WString m_wsEndpoint;
  27. QUEUEHANDLE m_hQueue;
  28. PVOID m_pSvcId;
  29. CWbemPtr<IWmiMessageService> m_pSvc;
  30. CWbemPtr<IWmiMessageSendReceive> m_pRecv;
  31. CWbemPtr<CMsgMsmqHandler> m_pHndlr;
  32. HRESULT EnsureReceiver();
  33. void* GetInterface( REFIID riid );
  34. public:
  35. CMsgMsmqReceiver( CLifeControl* pCtl );
  36. ~CMsgMsmqReceiver();
  37. //
  38. // called by Rcv Sinks on error.
  39. //
  40. HRESULT HandleError( HRESULT hr );
  41. HRESULT HandleReceiveError( HRESULT hr );
  42. STDMETHOD(Close)();
  43. STDMETHOD(Open)( LPCWSTR wszEndpoint,
  44. DWORD dwFlags,
  45. WMIMSG_RCVR_AUTH_INFOP pAuthInfo,
  46. IWmiMessageSendReceive* pRcv );
  47. };
  48. /*************************************************************************
  49. CMsgSimpleRcvSink - Receive operation is not safe. If something bad
  50. happens after receiving the message but before delivering to the handler,
  51. the message will be lost. Supports Overlapped I/O.
  52. **************************************************************************/
  53. class CMsgSimpleRcvSink
  54. : public CUnkBase<IWmiMessageReceiverSink, &IID_IWmiMessageReceiverSink>
  55. {
  56. //
  57. // does not hold ref counts on these because of circular ref.
  58. //
  59. CMsgMsmqHandler* m_pHndlr;
  60. CMsgMsmqReceiver* m_pRcvr;
  61. CMsgSimpleRcvSink( CLifeControl* pCtl,
  62. CMsgMsmqHandler* pHndlr,
  63. CMsgMsmqReceiver* pRcvr )
  64. : CUnkBase<IWmiMessageReceiverSink, &IID_IWmiMessageReceiverSink>( pCtl ),
  65. m_pHndlr( pHndlr ), m_pRcvr( pRcvr ) {}
  66. public:
  67. STDMETHOD(Receive)( PVOID pOverlapped );
  68. STDMETHOD(Notify)( PVOID pOverlapped );
  69. static HRESULT Create( CLifeControl* pControl,
  70. CMsgMsmqHandler* pHndlr,
  71. CMsgMsmqReceiver* pRcvr,
  72. IWmiMessageReceiverSink** ppRvcrSink );
  73. };
  74. /*************************************************************************
  75. CMsgSafeRcvSink - safely reads messages off a queue. It first peeks at
  76. messages, delivers to the handler on completion, and then removes the
  77. message. Supports Overlapped I/O. This implementation does NOT support
  78. multiple instances per queue.
  79. **************************************************************************/
  80. class CMsgSafeRcvSink
  81. : public CUnkBase<IWmiMessageReceiverSink, &IID_IWmiMessageReceiverSink>
  82. {
  83. //
  84. // does not hold ref counts on these because of circular ref.
  85. //
  86. CMsgMsmqHandler* m_pHndlr;
  87. CMsgMsmqReceiver* m_pRcvr;
  88. CMsgSafeRcvSink( CLifeControl* pCtl,
  89. CMsgMsmqHandler* pHndlr,
  90. CMsgMsmqReceiver* pRcvr )
  91. : CUnkBase<IWmiMessageReceiverSink, &IID_IWmiMessageReceiverSink>( pCtl ),
  92. m_pHndlr( pHndlr ), m_pRcvr( pRcvr ) {}
  93. public:
  94. STDMETHOD(Receive)( PVOID pOverlapped );
  95. STDMETHOD(Notify)( PVOID pOverlapped );
  96. static HRESULT Create( CLifeControl* pControl,
  97. CMsgMsmqHandler* pHndlr,
  98. CMsgMsmqReceiver* pRcvr,
  99. IWmiMessageReceiverSink** ppRvcrSink );
  100. };
  101. #endif // __MSMQRECV_H__