/*++ Copyright (C) 1996-2001 Microsoft Corporation Module Name: Abstract: History: --*/ #include "precomp.h" #include #include #include "msmqcomn.h" #include "msmqqmgr.h" static QUEUEPROPID g_aQueuePropID[] = { PROPID_Q_TRANSACTION, PROPID_Q_PATHNAME, PROPID_Q_AUTHENTICATE, PROPID_Q_QUOTA, PROPID_Q_TYPE }; const DWORD g_cQueueProp = sizeof(g_aQueuePropID) / sizeof(QUEUEPROPID); #define CALLFUNC(FUNC) m_Api.m_fp ## FUNC /************************************************************************* CMsgMsmqQueueMgr **************************************************************************/ HRESULT CMsgMsmqQueueMgr::EnsureMsmq() { HRESULT hr; CInCritSec ics( &m_cs ); hr = m_Api.Initialize(); if ( FAILED(hr) ) { return hr; } return EnsureMsmqService( m_Api ); } HRESULT CMsgMsmqQueueMgr::Create( LPCWSTR wszPathName, GUID guidType, BOOL bAuth, DWORD dwQos, DWORD dwQuota, PVOID pSecDesc ) { HRESULT hr; hr = EnsureMsmq(); if ( FAILED(hr) ) { return hr; } MQPROPVARIANT aPropVar[g_cQueueProp]; BOOL bXact = dwQos == WMIMSG_FLAG_QOS_XACT ? TRUE : FALSE; // // transaction // aPropVar[0].vt = VT_UI1; aPropVar[0].bVal = bXact ? MQ_TRANSACTIONAL : MQ_TRANSACTIONAL_NONE; // // pathname // aPropVar[1].vt = VT_LPWSTR; aPropVar[1].pwszVal = LPWSTR(wszPathName); // // auth // aPropVar[2].vt = VT_UI1; aPropVar[2].bVal = bAuth ? MQ_AUTHENTICATE : MQ_AUTHENTICATE_NONE; // // quota // aPropVar[3].vt = VT_UI4; aPropVar[3].ulVal = dwQuota; // // type // aPropVar[4].vt = VT_CLSID; aPropVar[4].puuid = &guidType; MQQUEUEPROPS QueueProps; QueueProps.cProp = g_cQueueProp; QueueProps.aPropID = g_aQueuePropID; QueueProps.aPropVar = aPropVar; QueueProps.aStatus = NULL; DWORD dwDummy = 0; hr = CALLFUNC(MQCreateQueue)( pSecDesc, &QueueProps, NULL, &dwDummy ); if ( FAILED(hr) ) { return MqResToWmiRes(hr); } return hr; } HRESULT CMsgMsmqQueueMgr::Destroy( LPCWSTR wszName ) { ENTER_API_CALL HRESULT hr; hr = EnsureMsmq(); if ( FAILED(hr) ) { return hr; } WString wsFormat; hr = NormalizeQueueName( m_Api, wszName, wsFormat ); if ( FAILED(hr) ) { return MqResToWmiRes( hr); } return CALLFUNC(MQDeleteQueue)( wsFormat ); EXIT_API_CALL } HRESULT CMsgMsmqQueueMgr::GetAllNames( GUID guidTypeFilter, BOOL bPrivateOnly, LPWSTR** ppwszNames, ULONG* pcNames ) { ENTER_API_CALL HRESULT hr; *ppwszNames = NULL; *pcNames = 0; hr = EnsureMsmq(); if ( FAILED(hr) ) { return hr; } if ( bPrivateOnly != TRUE ) { return WBEM_E_NOT_SUPPORTED; } // // First get all private queue names. // MGMTPROPID MgmtPropID = PROPID_MGMT_MSMQ_PRIVATEQ; MQPROPVARIANT MgmtPropVar; MgmtPropVar.vt = VT_LPWSTR | VT_VECTOR; MQMGMTPROPS MgmtProps; MgmtProps.cProp = 1; MgmtProps.aPropID = &MgmtPropID; MgmtProps.aPropVar = &MgmtPropVar; MgmtProps.aStatus = NULL; hr = CALLFUNC(MQMgmtGetInfo)( NULL, L"MACHINE", &MgmtProps ); if ( FAILED(hr) ) { return MqResToWmiRes( hr ); } // // Allocate return array to total number of private queues. // Because of the filter guid, the actual returned number // will most likely be smaller. // DWORD dwSize = sizeof(LPWSTR) * MgmtPropVar.calpwstr.cElems; LPWSTR* awszNames = (LPWSTR*)CoTaskMemAlloc( dwSize ); if ( awszNames == NULL ) { CALLFUNC(MQFreeMemory)( MgmtPropVar.calpwstr.pElems ); return WBEM_E_OUT_OF_MEMORY; } // // for each name, get the queue type guid for it and compare // with the filter type guid. // CLSID guidType; QUEUEPROPID QueuePropID = PROPID_Q_TYPE; MQPROPVARIANT QueuePropVar; QueuePropVar.vt = VT_CLSID; QueuePropVar.puuid = &guidType; MQQUEUEPROPS QueueProps; QueueProps.cProp = 1; QueueProps.aPropID = &QueuePropID; QueueProps.aPropVar = &QueuePropVar; QueueProps.aStatus = NULL; ULONG cNames = 0; for( ULONG i=0; i < MgmtPropVar.calpwstr.cElems; i++ ) { WString wsQueueName; LPWSTR wszPathname = MgmtPropVar.calpwstr.pElems[i]; hr = NormalizeQueueName( m_Api, wszPathname, wsQueueName ); if ( FAILED(hr) ) { return MqResToWmiRes( hr ); } hr = CALLFUNC(MQGetQueueProperties)( wsQueueName, &QueueProps ); if ( FAILED(hr) ) { continue; } if ( guidType == guidTypeFilter ) { DWORD dwSize = (wcslen(wszPathname)+1)*sizeof(WCHAR); awszNames[cNames] = (LPWSTR)CoTaskMemAlloc( dwSize ); if ( awszNames[cNames] == NULL ) { hr = WBEM_E_OUT_OF_MEMORY; break; } wcscpy( awszNames[cNames], wszPathname ); cNames++; } } if ( FAILED(hr) ) { for( i=0; i < cNames; i++ ) { CoTaskMemFree( awszNames[i] ); } CoTaskMemFree( awszNames ); } CALLFUNC(MQFreeMemory)( MgmtPropVar.calpwstr.pElems ); *ppwszNames = awszNames; *pcNames = cNames; return hr; EXIT_API_CALL }