windows-nt/Source/XPSP1/NT/ds/security/services/ca/certlib/exitdisp.cpp

309 lines
5.6 KiB
C++
Raw Normal View History

2020-09-26 03:20:57 -05:00
#include <pch.cpp>
#pragma hdrstop
#include "csdisp.h"
#include "csprop.h"
#define __dwFILE__ __dwFILE_CERTLIB_EXITDISP_CPP__
//+------------------------------------------------------------------------
// ICertExit dispatch support
//+------------------------------------
// Initialize method:
OLECHAR *exit_apszInitialize[] = {
TEXT("Initialize"),
TEXT("strConfig"),
};
//+------------------------------------
// Notify method:
OLECHAR *exit_apszNotify[] = {
TEXT("Notify"),
TEXT("ExitEvent"),
TEXT("Context"),
};
//+------------------------------------
// GetDescription method:
OLECHAR *exit_apszGetDescription[] = {
TEXT("GetDescription"),
};
//+------------------------------------
// GetManageModule method:
OLECHAR *exit_apszGetManageModule[] = {
TEXT("GetManageModule"),
};
//+------------------------------------
// Dispatch Table:
DISPATCHTABLE g_adtExit[] =
{
DECLARE_DISPATCH_ENTRY(exit_apszInitialize)
DECLARE_DISPATCH_ENTRY(exit_apszNotify)
DECLARE_DISPATCH_ENTRY(exit_apszGetDescription)
DECLARE_DISPATCH_ENTRY(exit_apszGetManageModule)
};
DWORD CEXITDISPATCH (ARRAYSIZE(g_adtExit));
DWORD s_acExitDispatch[] = {
CEXITDISPATCH_V2,
CEXITDISPATCH_V1,
};
IID const *s_apExitiid[] = {
&IID_ICertExit2,
&IID_ICertExit,
};
HRESULT
Exit_Init(
IN DWORD Flags,
IN LPCWSTR pcwszProgID,
IN CLSID const *pclsid,
OUT DISPATCHINTERFACE *pdi)
{
HRESULT hr;
hr = DispatchSetup2(
Flags,
CLSCTX_INPROC_SERVER,
pcwszProgID, // g_wszRegKeyCIPolicyClsid,
pclsid,
ARRAYSIZE(s_acExitDispatch),
s_apExitiid,
s_acExitDispatch,
g_adtExit,
pdi);
_JumpIfError(hr, error, "DispatchSetup");
pdi->pDispatchTable = g_adtPolicy;
error:
return(hr);
}
VOID
Exit_Release(
IN OUT DISPATCHINTERFACE *pdiManage)
{
DispatchRelease(pdiManage);
}
HRESULT
ExitVerifyVersion(
IN DISPATCHINTERFACE *pdiExit,
IN DWORD RequiredVersion)
{
HRESULT hr;
CSASSERT(NULL != pdiExit && NULL != pdiExit->pDispatchTable);
switch (pdiExit->m_dwVersion)
{
case 1:
CSASSERT(
NULL == pdiExit->pDispatch ||
CEXITDISPATCH_V1 == pdiExit->m_cDispatchTable);
break;
case 2:
CSASSERT(
NULL == pdiExit->pDispatch ||
CEXITDISPATCH_V2 == pdiExit->m_cDispatchTable);
break;
default:
hr = HRESULT_FROM_WIN32(ERROR_INTERNAL_ERROR);
_JumpError(hr, error, "m_dwVersion");
}
if (pdiExit->m_dwVersion < RequiredVersion)
{
hr = E_NOTIMPL;
_JumpError(hr, error, "old interface");
}
hr = S_OK;
error:
return(hr);
}
HRESULT
Exit_Initialize(
IN DISPATCHINTERFACE *pdiExit,
IN BSTR strDescription,
IN WCHAR const *pwszConfig,
OUT LONG *pEventMask)
{
HRESULT hr;
BSTR strConfig = NULL;
if (!ConvertWszToBstr(&strConfig, pwszConfig, -1))
{
hr = E_OUTOFMEMORY;
goto error;
}
__try
{
if (NULL != pdiExit->pDispatch)
{
VARIANT avar[1];
CSASSERT(NULL != pdiExit->pDispatchTable);
avar[0].vt = VT_BSTR;
avar[0].bstrVal = strConfig;
hr = DispatchInvoke(
pdiExit,
EXIT_INITIALIZE,
ARRAYSIZE(avar),
avar,
VT_I4,
pEventMask);
_JumpIfError(hr, error, "Invoke(Initialize)");
}
else
{
hr = ((ICertExit *) pdiExit->pUnknown)->Initialize(
strConfig,
pEventMask);
_JumpIfError(hr, error, "ICertExit::Initialize");
}
}
_finally
{
if (NULL != strConfig)
{
SysFreeString(strConfig);
}
}
error:
return(hr);
}
HRESULT
Exit_Notify(
IN DISPATCHINTERFACE *pdiExit,
IN BSTR strDescription,
IN LONG ExitEvent,
IN LONG Context)
{
HRESULT hr;
if (NULL != pdiExit->pDispatch)
{
VARIANT avar[2];
CSASSERT(NULL != pdiExit->pDispatchTable);
avar[0].vt = VT_I4;
avar[0].lVal = ExitEvent;
avar[1].vt = VT_I4;
avar[1].lVal = Context;
hr = DispatchInvoke(
pdiExit,
EXIT_NOTIFY,
ARRAYSIZE(avar),
avar,
0,
NULL);
_JumpIfError(hr, error, "Invoke(Notify)");
}
else
{
hr = ((ICertExit *) pdiExit->pUnknown)->Notify(ExitEvent, Context);
_JumpIfError(hr, error, "ICertExit::Notify");
}
error:
return(hr);
}
HRESULT
Exit_GetDescription(
IN DISPATCHINTERFACE *pdiExit,
OUT BSTR *pstrDescription)
{
HRESULT hr;
if (NULL != pdiExit->pDispatch)
{
CSASSERT(NULL != pdiExit->pDispatchTable);
hr = DispatchInvoke(
pdiExit,
EXIT_GETDESCRIPTION,
0,
NULL,
VT_BSTR,
pstrDescription);
_JumpIfError(hr, error, "Invoke(GetDescription)");
}
else
{
hr = ((ICertExit *) pdiExit->pUnknown)->GetDescription(pstrDescription);
_JumpIfError(hr, error, "ICertExit::GetDescription");
}
error:
return(hr);
}
HRESULT
Exit2_GetManageModule(
IN DISPATCHINTERFACE *pdiExit,
OUT DISPATCHINTERFACE *pdiManageModule)
{
HRESULT hr;
ICertManageModule *pManageModule = NULL;
hr = ExitVerifyVersion(pdiExit, 2);
_JumpIfError(hr, error, "ExitVerifyVersion");
if (NULL != pdiExit->pDispatch)
{
CSASSERT(NULL != pdiExit->pDispatchTable);
hr = DispatchInvoke(
pdiExit,
EXIT2_GETMANAGEMODULE,
0,
NULL,
VT_DISPATCH,
&pManageModule);
_JumpIfError(hr, error, "Invoke(GetManageModule)");
}
else
{
hr = ((ICertExit2 *) pdiExit->pUnknown)->GetManageModule(
&pManageModule);
_JumpIfError(hr, error, "ICertExit::GetManageModule");
}
hr = ManageModule_Init2(
NULL != pdiExit->pDispatch,
pManageModule,
pdiManageModule);
_JumpIfError(hr, error, "ManageModule_Init2");
error:
return(hr);
}