windows-nt/Source/XPSP1/NT/admin/wmi/wbem/winmgmt/msg/msmqq.cpp
2020-09-26 16:20:57 +08:00

140 lines
2.6 KiB
C++

/*++
Copyright (C) 1996-2001 Microsoft Corporation
Module Name:
Abstract:
History:
--*/
#include "precomp.h"
#include <wbemcli.h>
#include <wstring.h>
#include "msmqq.h"
#include "msmqcomn.h"
#define CALLFUNC(FUNC) m_Api.m_fp ## FUNC
/*************************************************************************
CMsgMsmqQueue
**************************************************************************/
void* CMsgMsmqQueue::GetInterface( REFIID riid )
{
if ( riid == IID_IWmiMessageQueue )
{
return &m_XQueue;
}
return NULL;
}
HRESULT CMsgMsmqQueue::EnsureQueue( LPCWSTR wszEndpoint, DWORD dwFlags )
{
HRESULT hr;
CInCritSec ics( &m_cs );
if ( m_hQueue != NULL )
{
return WBEM_S_NO_ERROR;
}
WString wsFormat;
hr = NormalizeQueueName( m_Api, wszEndpoint, wsFormat );
if ( FAILED(hr) )
{
return hr;
}
return CALLFUNC(MQOpenQueue)( wsFormat,
MQ_RECEIVE_ACCESS,
MQ_DENY_NONE,
&m_hQueue );
}
HRESULT CMsgMsmqQueue::Open( LPCWSTR wszEndpoint,
DWORD dwFlags,
IWmiMessageSendReceive* pRcv,
IWmiMessageQueueReceiver** ppRcvr )
{
ENTER_API_CALL
HRESULT hr;
*ppRcvr = NULL;
hr = m_Api.Initialize();
if ( FAILED(hr) )
{
return hr;
}
hr = EnsureMsmqService( m_Api );
if ( FAILED(hr) )
{
return hr;
}
hr = EnsureQueue( wszEndpoint, dwFlags );
if ( FAILED(hr) )
{
return MqResToWmiRes(hr, WMIMSG_E_TARGETNOTFOUND );
}
CWbemPtr<CMsgMsmqHandler> pHndlr;
hr = CMsgMsmqHandler::Create( m_Api,
pRcv,
m_hQueue,
dwFlags,
&pHndlr );
if ( FAILED(hr) )
{
return hr;
}
//
// we will pass this object in to the handler. This will keep this object
// alive until the handler is released. The benefit of this is that the
// client doesn't have to hold a reference to both a queue object and a
// queue receiver object if they don't need to.
//
pHndlr->SetContainer( this );
return pHndlr->QueryInterface( IID_IWmiMessageQueueReceiver,
(void**)ppRcvr );
EXIT_API_CALL
}
HRESULT CMsgMsmqQueue::Clear()
{
if ( m_hQueue != NULL )
{
CALLFUNC(MQCloseQueue)( m_hQueue );
}
m_hQueue = NULL;
return S_OK;
}