📄 qinfo.cpp
字号:
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
//
// Use of this source code is subject to the terms of the Microsoft shared
// source or premium shared source license agreement under which you licensed
// this source code. If you did not accept the terms of the license agreement,
// you are not authorized to use this source code. For the terms of the license,
// please see the license agreement between you and Microsoft or, if applicable,
// see the SOURCE.RTF on your install media or the root of your tools installation.
// THE SOURCE CODE IS PROVIDED "AS IS", WITH NO WARRANTIES.
//
//=--------------------------------------------------------------------------=
// MSMQQueueInfoObj.Cpp
//=--------------------------------------------------------------------------=
//
// the MSMQQueueInfo object
//
//
#include "IPServer.H"
#include "LocalObj.H"
#include "oautil.h"
#include "q.h"
#include "qinfo.H"
#include "limits.h"
#include "time.h"
#if DEBUG
extern VOID RemBstrNode(void *pv);
#endif // DEBUG
// Falcon includes
// #include "rt.h"
// for ASSERT and FAIL
//
SZTHISFILE
// debug...
#define new DEBUG_NEW
#if DEBUG
#define SysAllocString DebSysAllocString
#define SysReAllocString DebSysReAllocString
#define SysFreeString DebSysFreeString
#endif // DEBUG
//=--------------------------------------------------------------------------=
// HELPER::InitQueueProps
//=--------------------------------------------------------------------------=
// Inits MQQUEUEPROPS struct.
//
// Parameters:
//
// Output:
//
// Notes:
//
void InitQueueProps(MQQUEUEPROPS *pqueueprops)
{
pqueueprops->aPropID = NULL;
pqueueprops->aPropVar = NULL;
pqueueprops->aStatus = NULL;
}
//=--------------------------------------------------------------------------=
// HELPER: GetFormatNameOfPathName
//=--------------------------------------------------------------------------=
// Gets formatname member if necessary from pathname
//
// Parameters:
// pbstrFormatName [out] callee-allocated, caller-freed
//
// Output:
// HRESULT - S_OK, E_OUTOFMEMORY
//
// Notes:
//
HRESULT GetFormatNameOfPathName(
BSTR bstrPathName,
BSTR *pbstrFormatName)
{
ULONG uiFormatNameLen = FORMAT_NAME_INIT_BUFFER;
#if _DEBUG
ULONG uiFormatNameLenSave = uiFormatNameLen;
#endif // _DEBUG
BSTR bstrFormatName = NULL;
HRESULT hresult = NOERROR;
// error if no pathname
if (bstrPathName == NULL) {
return E_INVALIDARG;
}
//
// synthesize from pathname
//
IfNullRet(
bstrFormatName = SysAllocStringLen(NULL, uiFormatNameLen));
IfFailGo(
MQPathNameToFormatName(bstrPathName,
bstrFormatName,
&uiFormatNameLen));
// FormatName mucking...
#if _DEBUG
ASSERT(uiFormatNameLen <= uiFormatNameLenSave,
L"insufficient buffer.");
#endif
IfNullGo(SysReAllocString(pbstrFormatName, bstrFormatName));
// fall through...
Error:
SysFreeString(bstrFormatName);
return hresult;
}
//=--------------------------------------------------------------------------=
// CMSMQQueueInfo::Create
//=--------------------------------------------------------------------------=
// creates a new MSMQQueueInfo object.
//
// Parameters:
// IUnknown * - [in] controlling unkonwn
//
// Output:
// IUnknown * - new object.
//
// Notes:
//
IUnknown *CMSMQQueueInfo::Create
(
IUnknown *pUnkOuter
)
{
// make sure we return the private unknown so that we support aggegation
// correctly!
//
CMSMQQueueInfo *pNew = new CMSMQQueueInfo(pUnkOuter);
return pNew ? pNew->PrivateUnknown() : NULL;
}
//=--------------------------------------------------------------------------=
// CMSMQQueueInfo::CMSMQQueueInfo
//=--------------------------------------------------------------------------=
// create the object and initialize the refcount
//
// Parameters:
// IUnknown * - [in] controlling unknown
//
// Notes:
//
#pragma warning(disable:4355) // using 'this' in constructor
CMSMQQueueInfo::CMSMQQueueInfo
(
IUnknown *pUnkOuter
)
: CAutomationObject(pUnkOuter, OBJECT_TYPE_OBJMQQUEUEINFO, (void *)this)
{
// TODO: initialize anything here
// UNDONE: use DEFAULT_ values
//
m_pguidQueue = new GUID(GUID_NULL);
m_pguidServiceType = new GUID(GUID_NULL);
m_bstrLabel = SysAllocString(L"");
m_bstrFormatName = NULL;
m_isValidFormatName = FALSE; // 2026
m_bstrPathName = NULL;
m_isTransactional = FALSE;
m_lPrivLevel = (long)DEFAULT_Q_PRIV_LEVEL;
m_lJournal = DEFAULT_Q_JOURNAL;
m_lQuota = (long)DEFAULT_Q_QUOTA;
m_lBasePriority = DEFAULT_Q_BASEPRIORITY;
m_lCreateTime = 0;
m_lModifyTime = 0;
m_lAuthenticate = (long)DEFAULT_Q_AUTHENTICATE;
m_lJournalQuota = (long)DEFAULT_Q_JOURNAL_QUOTA ;
m_isRefreshed = FALSE; // 2536
}
#pragma warning(default:4355) // using 'this' in constructor
//=--------------------------------------------------------------------------=
// CMSMQQueueInfo::CMSMQQueueInfo
//=--------------------------------------------------------------------------=
// "We all labour against our own cure, for death is the cure of all diseases"
// - Sir Thomas Browne (1605 - 82)
//
// Notes:
//
CMSMQQueueInfo::~CMSMQQueueInfo ()
{
// TODO: clean up anything here.
SysFreeString(m_bstrFormatName);
SysFreeString(m_bstrPathName);
SysFreeString(m_bstrLabel);
delete m_pguidQueue;
delete m_pguidServiceType;
}
//=--------------------------------------------------------------------------=
// CMSMQQueueInfo::InternalQueryInterface
//=--------------------------------------------------------------------------=
// the controlling unknown will call this for us in the case where they're
// looking for a specific interface.
//
// Parameters:
// REFIID - [in] interface they want
// void ** - [out] where they want to put the resulting object ptr.
//
// Output:
// HRESULT - S_OK, E_NOINTERFACE
//
// Notes:
//
HRESULT CMSMQQueueInfo::InternalQueryInterface
(
REFIID riid,
void **ppvObjOut
)
{
CHECK_POINTER(ppvObjOut);
// we support IMSMQQueueInfo and ISupportErrorInfo
//
if (DO_GUIDS_MATCH(riid, IID_IMSMQQueueInfo)) {
*ppvObjOut = (void *)(IMSMQQueueInfo *)this;
AddRef();
return S_OK;
} else if (DO_GUIDS_MATCH(riid, IID_ISupportErrorInfo)) {
*ppvObjOut = (void *)(ISupportErrorInfo *)this;
AddRef();
return S_OK;
}
// call the super-class version and see if it can oblige.
//
return CAutomationObject::InternalQueryInterface(riid, ppvObjOut);
}
// TODO: implement your interface methods and property exchange functions
// here.
//=--------------------------------------------------------------------------=
// CMSMQQueueInfo::SetProperty
//=--------------------------------------------------------------------------=
// Helper: to set a single Falcon property when ActiveX
// property has been updated.
//
// Parameters:
// queuepropid
//
// Output:
// HRESULT - S_OK, E_NOINTERFACE
//
// Notes:
// NOP if no format name yet.
//
#if 0
HRESULT CMSMQQueueInfo::SetProperty(QUEUEPROPID queuepropid)
{
MQQUEUEPROPS queueprops;
HRESULT hresult = NOERROR;
// Set queue prop if we have a formatname,
// if not, means they haven't created or opened queue yet.
//
if (m_bstrFormatName) {
IfFailRet(CreateQueueProps(
TRUE,
1,
&queueprops,
FALSE, // isTransactional
queuepropid));
hresult = MQSetQueueProperties(m_bstrFormatName, &queueprops);
//
// we ignore MQ_ERROR_QUEUE_NOT_FOUND because it might never
// have been opened/created yet though the formatname has
// been set...
// REVIEW: is this dangerous?
//
if (hresult == MQ_ERROR_QUEUE_NOT_FOUND) {
hresult = NOERROR;
}
FreeQueueProps(&queueprops);
};
return hresult;
}
#endif // 0
//=--------------------------------------------------------------------------=
// CMSMQQueueInfo::get_QueueGuid
//=--------------------------------------------------------------------------=
//
// Parameters:
// pbstrGuidQueue [out] this queue's guid
//
// Output:
// HRESULT - S_OK, E_NOINTERFACE
//
// Notes:
//
HRESULT CMSMQQueueInfo::get_QueueGuid(BSTR *pbstrGuidQueue)
{
int cbStr;
InitProps();
*pbstrGuidQueue = SysAllocStringLen(NULL, LENSTRCLSID);
if (*pbstrGuidQueue) {
cbStr = StringFromGUID2(*m_pguidQueue, *pbstrGuidQueue, LENSTRCLSID*2);
#if DEBUG
RemBstrNode(*pbstrGuidQueue);
#endif // DEBUG
return cbStr == 0 ? E_OUTOFMEMORY : NOERROR;
}
else {
return E_OUTOFMEMORY;
}
}
//=--------------------------------------------------------------------------=
// CMSMQQueueInfo::get_ServiceTypeGuid
//=--------------------------------------------------------------------------=
//
// Parameters:
// pbstrGuidQueue [out] this queue's service type guid
//
// Output:
// HRESULT - S_OK
//
// Notes:
//
HRESULT CMSMQQueueInfo::get_ServiceTypeGuid(BSTR *pbstrGuidServiceType)
{
int cbStr;
InitProps();
*pbstrGuidServiceType = SysAllocStringLen(NULL, LENSTRCLSID);
if (*pbstrGuidServiceType) {
cbStr = StringFromGUID2(*m_pguidServiceType, *pbstrGuidServiceType, LENSTRCLSID*2);
#if DEBUG
RemBstrNode(*pbstrGuidServiceType);
#endif // DEBUG
return cbStr == 0 ? E_OUTOFMEMORY : NOERROR;
}
else {
return E_OUTOFMEMORY;
}
}
//=--------------------------------------------------------------------------=
// CMSMQQueueInfo::PutServiceType
//=--------------------------------------------------------------------------=
//
// Parameters:
// bstrGuidServiceType [in] this queue's guid
// pguidServiceType [out] where to put it
//
// Output:
// HRESULT - S_OK, E_OUTOFMEMORY
//
// Notes:
//
#if 0 // no longer used
HRESULT CMSMQQueueInfo::PutServiceType(
BSTR bstrGuidServiceType,
GUID *pguidServiceType)
{
BSTR bstrTemp;
HRESULT hresult;
IfNullRet(bstrTemp = SYSALLOCSTRING(bstrGuidServiceType));
hresult = CLSIDFromString(bstrTemp, pguidServiceType);
if (FAILED(hresult)) {
// 1194: map OLE error to Falcon
hresult = MQ_ERROR_ILLEGAL_PROPERTY_VALUE;
}
// fall through...
SysFreeString(bstrTemp);
return CreateErrorHelper(hresult, m_ObjectType);
}
#endif // 0
//=--------------------------------------------------------------------------=
// CMSMQQueueInfo::put_ServiceTypeGuid
//=--------------------------------------------------------------------------=
//
// Parameters:
// bstrGuidServiceType [in] this queue's guid
//
// Output:
// HRESULT - S_OK, E_OUTOFMEMORY
//
// Notes:
//
HRESULT CMSMQQueueInfo::put_ServiceTypeGuid(BSTR bstrGuidServiceType)
{
BSTR bstrTemp;
HRESULT hresult;
IfNullRet(bstrTemp = SYSALLOCSTRING(bstrGuidServiceType));
EnterCriticalSection(&m_CSlocal);
hresult = CLSIDFromString(bstrTemp, m_pguidServiceType);
LeaveCriticalSection(&m_CSlocal);
if (FAILED(hresult)) {
// 1194: map OLE error to Falcon
hresult = MQ_ERROR_ILLEGAL_PROPERTY_VALUE;
}
// fall through...
SysFreeString(bstrTemp);
return CreateErrorHelper(hresult, m_ObjectType);
}
//=--------------------------------------------------------------------------=
// CMSMQQueueInfo::get_Label
//=--------------------------------------------------------------------------=
//
// Parameters:
// pbstrLabel [in] this queue's label
//
// Output:
// HRESULT - S_OK
//
// Notes:
//
HRESULT CMSMQQueueInfo::get_Label(BSTR *pbstrLabel)
{
InitProps();
//
// Copy our member variable and return ownership of
// the copy to the caller.
//
IfNullRet(*pbstrLabel = SYSALLOCSTRING(m_bstrLabel));
#if DEBUG
RemBstrNode(*pbstrLabel);
#endif // DEBUG
return NOERROR;
}
//=--------------------------------------------------------------------------=
// CMSMQQueueInfo::PutLabel
//=--------------------------------------------------------------------------=
//
// Parameters:
// bstrLabel [in] this queue's label
// pbstrLabel [in] where to put it
//
// Output:
// HRESULT - S_OK, E_OUTOFMEMORY
//
// Notes:
//
#if 0 // no longer used
HRESULT CMSMQQueueInfo::PutLabel(
BSTR bstrLabel,
BSTR *pbstrLabel)
{
SysFreeString(*pbstrLabel);
IfNullRet(*pbstrLabel = SYSALLOCSTRING(bstrLabel));
return NOERROR;
}
#endif // 0
//=--------------------------------------------------------------------------=
// CMSMQQueueInfo::put_Label
//=--------------------------------------------------------------------------=
//
// Parameters:
// bstrLabel [in] this queue's label
//
// Output:
// HRESULT - S_OK, E_OUTOFMEMORY
//
// Notes:
//
HRESULT CMSMQQueueInfo::put_Label(BSTR bstrLabel)
{
HRESULT hr = NOERROR;
EnterCriticalSection(&m_CSlocal);
SysFreeString(m_bstrLabel);
m_bstrLabel = SYSALLOCSTRING(bstrLabel);
LeaveCriticalSection(&m_CSlocal);
if(m_bstrLabel == NULL)
hr = E_OUTOFMEMORY;
return hr;
}
//=--------------------------------------------------------------------------=
// CMSMQQueueInfo::get_PathName
//=--------------------------------------------------------------------------=
//
// Parameters:
// pbstrPathName [in] this queue's pathname
//
// Output:
// HRESULT - S_OK
//
// Notes:
//
HRESULT CMSMQQueueInfo::get_PathName(BSTR *pbstrPathName)
{
InitProps();
IfNullRet(*pbstrPathName = SYSALLOCSTRING(m_bstrPathName));
#if DEBUG
RemBstrNode(*pbstrPathName);
#endif // DEBUG
return NOERROR;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -