windows-nt/Source/XPSP1/NT/ds/security/services/ca/certlib/manage.cpp
2020-09-26 16:20:57 +08:00

488 lines
11 KiB
C++

//+--------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1996 - 1999
//
// File: manage.cpp
//
// Contents: Cert Server Policy & Exit manage module callouts
//
// History: 10-Sept-98 mattt created
//
//---------------------------------------------------------------------------
#include <pch.cpp>
#pragma hdrstop
#include "csdisp.h"
#include "csprop.h"
#define __dwFILE__ __dwFILE_CERTLIB_MANAGE_CPP__
//+-------------------------------------------------------------------------
// IManageModule dispatch support
//+------------------------------------
// GetProperty method:
OLECHAR *managemodule_apszGetProperty[] = {
TEXT("GetProperty"),
TEXT("strConfig"),
TEXT("strStorageLocation"),
TEXT("strPropertyName"),
TEXT("Flags"),
};
//+------------------------------------
// SetProperty method:
OLECHAR *managemodule_apszSetProperty[] = {
TEXT("SetProperty"),
TEXT("strConfig"),
TEXT("strStorageLocation"),
TEXT("strPropertyName"),
TEXT("Flags"),
TEXT("pvarProperty"),
};
//+------------------------------------
// Configure method:
OLECHAR *managemodule_apszConfigure[] = {
TEXT("Configure"),
TEXT("strConfig"),
TEXT("strStorageLocation"),
TEXT("Flags"),
};
//+------------------------------------
// Dispatch Table:
DISPATCHTABLE g_adtManageModule[] =
{
#define MANAGEMODULE_GETPROPERTY 0
DECLARE_DISPATCH_ENTRY(managemodule_apszGetProperty)
#define MANAGEMODULE_SETPROPERTY 1
DECLARE_DISPATCH_ENTRY(managemodule_apszSetProperty)
#define MANAGEMODULE_CONFIGURE 2
DECLARE_DISPATCH_ENTRY(managemodule_apszConfigure)
};
#define CMANAGEMODULEDISPATCH (ARRAYSIZE(g_adtManageModule))
HRESULT
ManageModule_GetProperty(
IN DISPATCHINTERFACE *pdiManage,
IN WCHAR const *pwszConfig,
IN WCHAR const *pwszStorageLocation,
IN WCHAR const *pwszPropertyName,
IN DWORD dwFlags,
IN LONG ColumnType,
OUT VOID *pProperty)
{
HRESULT hr;
BSTR strConfig = NULL;
BSTR strStorageLocation = NULL;
BSTR strPropertyName = NULL;
BOOL fException = FALSE;
ULONG_PTR ExceptionAddress;
LONG RetType;
VARIANT varResult;
VariantInit(&varResult);
CSASSERT(NULL != pdiManage && NULL != pdiManage->pDispatchTable);
hr = E_OUTOFMEMORY;
strConfig = SysAllocString(pwszConfig);
if (NULL == strConfig)
{
_JumpError(hr, error, "SysAllocString");
}
strStorageLocation = SysAllocString(pwszStorageLocation);
if (NULL == strStorageLocation)
{
_JumpError(hr, error, "SysAllocString");
}
strPropertyName = SysAllocString(pwszPropertyName);
if (NULL == strPropertyName)
{
_JumpError(hr, error, "SysAllocString");
}
switch (ColumnType)
{
case PROPTYPE_BINARY:
case PROPTYPE_STRING:
RetType = VT_BSTR;
break;
case PROPTYPE_DATE:
RetType = VT_DATE;
break;
case PROPTYPE_LONG:
RetType = VT_I4;
break;
default:
hr = E_INVALIDARG;
_JumpError(hr, error, "PropertyType");
}
__try
{
if (NULL != pdiManage->pDispatch)
{
VARIANT avar[4];
avar[0].vt = VT_BSTR;
avar[0].bstrVal = strConfig;
avar[1].vt = VT_BSTR;
avar[1].bstrVal = strStorageLocation;
avar[2].vt = VT_BSTR;
avar[2].bstrVal = strPropertyName;
avar[3].vt = VT_I4;
avar[3].lVal = dwFlags;
hr = DispatchInvoke(
pdiManage,
MANAGEMODULE_GETPROPERTY,
ARRAYSIZE(avar),
avar,
RetType,
pProperty);
_JumpIfError(hr, error, "Invoke(GetName)");
}
else
{
hr = ((ICertManageModule *) pdiManage->pUnknown)->GetProperty(
strConfig,
strStorageLocation,
strPropertyName,
dwFlags,
&varResult);
_JumpIfError(hr, error, "ICertManageModule::GetProperty");
hr = DispatchGetReturnValue(&varResult, RetType, pProperty);
_JumpIfError2(hr, error, "DispatchGetReturnValue", CERTSRV_E_PROPERTY_EMPTY);
}
}
__except(
ExceptionAddress = (ULONG_PTR) (GetExceptionInformation())->ExceptionRecord->ExceptionAddress,
hr = myHEXCEPTIONCODE(),
EXCEPTION_EXECUTE_HANDLER)
{
_PrintError(hr, "GetProperty: Exception");
fException = TRUE;
}
error:
if (NULL != strConfig)
{
SysFreeString(strConfig);
}
if (NULL != strStorageLocation)
{
SysFreeString(strStorageLocation);
}
if (NULL != strPropertyName)
{
SysFreeString(strPropertyName);
}
VariantClear(&varResult);
return(hr);
}
HRESULT
ManageModule_SetProperty(
IN DISPATCHINTERFACE *pdiManage,
IN WCHAR const *pwszConfig,
IN WCHAR const *pwszStorageLocation,
IN WCHAR const *pwszPropertyName,
IN DWORD dwFlags,
IN LONG ColumnType,
IN VOID* pProperty)
{
HRESULT hr;
BSTR strConfig = NULL;
BSTR strStorageLocation = NULL;
BSTR strPropertyName = NULL;
BOOL fException = FALSE;
ULONG_PTR ExceptionAddress;
VARIANT varResult;
CSASSERT(NULL != pdiManage && NULL != pdiManage->pDispatchTable);
hr = E_OUTOFMEMORY;
strConfig = SysAllocString(pwszConfig);
if (NULL == strConfig)
{
_JumpError(hr, error, "SysAllocString");
}
strStorageLocation = SysAllocString(pwszStorageLocation);
if (NULL == strStorageLocation)
{
_JumpError(hr, error, "SysAllocString");
}
strPropertyName = SysAllocString(pwszPropertyName);
if (NULL == strPropertyName)
{
_JumpError(hr, error, "SysAllocString");
}
switch (ColumnType)
{
case PROPTYPE_BINARY:
case PROPTYPE_STRING:
varResult.vt = VT_BSTR;
varResult.bstrVal = (BSTR) pProperty;
break;
case PROPTYPE_DATE:
varResult.vt = VT_DATE;
CopyMemory(&varResult.date, pProperty, sizeof(DATE));
break;
case PROPTYPE_LONG:
varResult.vt = VT_I4;
varResult.lVal = *(LONG *) pProperty;
break;
default:
hr = E_INVALIDARG;
_JumpError(hr, error, "PropertyType");
}
__try
{
if (NULL != pdiManage->pDispatch)
{
VARIANT avar[5];
avar[0].vt = VT_BSTR;
avar[0].bstrVal = strConfig;
avar[1].vt = VT_BSTR;
avar[1].bstrVal = strStorageLocation;
avar[2].vt = VT_BSTR;
avar[2].bstrVal = strPropertyName;
avar[3].vt = VT_I4;
avar[3].lVal = dwFlags;
avar[4] = varResult;
hr = DispatchInvoke(
pdiManage,
MANAGEMODULE_SETPROPERTY,
ARRAYSIZE(avar),
avar,
0,
NULL);
_JumpIfError(hr, error, "Invoke(GetName)");
}
else
{
hr = ((ICertManageModule *) pdiManage->pUnknown)->SetProperty(
strConfig,
strStorageLocation,
strPropertyName,
dwFlags,
&varResult);
_JumpIfError(hr, error, "ICertManageModule::SetProperty");
}
}
__except(
ExceptionAddress = (ULONG_PTR) (GetExceptionInformation())->ExceptionRecord->ExceptionAddress,
hr = myHEXCEPTIONCODE(),
EXCEPTION_EXECUTE_HANDLER)
{
_PrintError(hr, "SetProperty: Exception");
fException = TRUE;
}
error:
if (NULL != strConfig)
{
SysFreeString(strConfig);
}
if (NULL != strStorageLocation)
{
SysFreeString(strStorageLocation);
}
if (NULL != strPropertyName)
{
SysFreeString(strPropertyName);
}
//VariantInit(&varResult); // this owned no memory
return(hr);
}
HRESULT
ManageModule_Configure(
IN DISPATCHINTERFACE *pdiManage,
IN WCHAR const *pwszConfig,
IN WCHAR const *pwszStorageLocation,
IN DWORD dwFlags)
{
HRESULT hr;
BOOL fException = FALSE;
ULONG_PTR ExceptionAddress;
BSTR strConfig = NULL;
BSTR strStorageLocation = NULL;
CSASSERT(NULL != pdiManage && NULL != pdiManage->pDispatchTable);
hr = E_OUTOFMEMORY;
strConfig = SysAllocString(pwszConfig);
if (NULL == strConfig)
{
_JumpError(hr, error, "SysAllocString");
}
strStorageLocation = SysAllocString(pwszStorageLocation);
if (NULL == strStorageLocation)
{
_JumpError(hr, error, "SysAllocString");
}
__try
{
if (NULL != pdiManage->pDispatch)
{
VARIANT avar[3];
avar[0].vt = VT_BSTR;
avar[0].bstrVal = strConfig;
avar[1].vt = VT_BSTR;
avar[1].bstrVal = strStorageLocation;
avar[2].vt = VT_I4;
avar[2].lVal = dwFlags;
hr = DispatchInvoke(
pdiManage,
MANAGEMODULE_CONFIGURE,
ARRAYSIZE(avar),
avar,
0,
NULL);
_JumpIfError(hr, error, "Invoke(Configure)");
}
else
{
hr = ((ICertManageModule *) pdiManage->pUnknown)->Configure(
strConfig,
strStorageLocation,
dwFlags);
_JumpIfError(hr, error, "ICertManageModule::Configure");
}
}
__except(
ExceptionAddress = (ULONG_PTR) (GetExceptionInformation())->ExceptionRecord->ExceptionAddress,
hr = myHEXCEPTIONCODE(),
EXCEPTION_EXECUTE_HANDLER)
{
_PrintError(hr, "Configure: Exception");
fException = TRUE;
}
error:
if (NULL != strConfig)
{
SysFreeString(strConfig);
}
if (NULL != strStorageLocation)
{
SysFreeString(strStorageLocation);
}
return(hr);
}
HRESULT
ManageModule_Init(
IN DWORD Flags,
IN TCHAR const *pszProgID, // morph for difft instances of this class
IN CLSID const *pclsid,
OUT DISPATCHINTERFACE *pdiManage)
{
HRESULT hr;
hr = DispatchSetup(
Flags,
CLSCTX_INPROC_SERVER,
pszProgID,
pclsid,
&IID_ICertManageModule,
CMANAGEMODULEDISPATCH,
g_adtManageModule,
pdiManage);
_JumpIfError(hr, error, "DispatchSetup");
pdiManage->pDispatchTable = g_adtManageModule;
error:
return(hr);
}
HRESULT
ManageModule_Init2(
IN BOOL fIDispatch,
IN ICertManageModule *pManage,
OUT DISPATCHINTERFACE *pdiManage)
{
HRESULT hr;
IDispatch *pDispatch = NULL;
pdiManage->pDispatchTable = NULL;
pdiManage->pDispatch = NULL;
pdiManage->pUnknown = NULL;
if (fIDispatch)
{
hr = pManage->QueryInterface(
IID_IDispatch,
(VOID **) &pDispatch);
_JumpIfError(hr, error, "QueryInterface");
hr = DispatchGetIds(
pDispatch,
CMANAGEMODULEDISPATCH,
g_adtManageModule,
pdiManage);
_JumpIfError(hr, error, "DispatchGetIds");
pdiManage->pDispatch = pDispatch;
pDispatch = NULL;
}
else
{
pManage->AddRef();
pdiManage->pUnknown = (IUnknown *) pManage;
hr = S_OK;
}
pdiManage->pDispatchTable = g_adtManageModule;
error:
if (NULL != pDispatch)
{
pDispatch->Release();
}
return(hr);
}
VOID
ManageModule_Release(
IN OUT DISPATCHINTERFACE *pdiManage)
{
DispatchRelease(pdiManage);
}