windows-nt/Source/XPSP1/NT/inetsrv/iis/svcs/wam/wamreg/comobj.cpp
2020-09-26 16:20:57 +08:00

345 lines
6.7 KiB
C++

// comobj.cpp : Implementation of CWamregApp and DLL registration.
#include "common.h"
#include "comobj.h"
#include "iwamreg.h"
#include "wamadm.h"
#define DEFAULT_TRACE_FLAGS (DEBUG_ERROR)
#include "auxfunc.h"
#include "dbgutil.h"
//==========================================================================
// Global variables
//
//==========================================================================
CWmRgSrvFactory* g_pWmRgSrvFactory = NULL;
DWORD g_dwRefCount = 0;
DWORD g_dwWamAdminRegister = 0;
//==========================================================================
// Static functions
//
//==========================================================================
/////////////////////////////////////////////////////////////////////////////
//
/*===================================================================
CWmRgSrv::CWmRgSrv
Constructor for CWmRgSrv.
Parameter: NONE
Return: NONE
Side affect: Init a Metabase pointer(via UNICODE DCOM interface), Create an Event.
===================================================================*/
CWmRgSrv::CWmRgSrv()
: m_cRef(1)
{
InterlockedIncrement((long *)&g_dwRefCount);
}
/*===================================================================
CWmRgSrv::~CWmRgSrv
Destructor for CWmRgSrv.
Parameter: NONE
Return: NONE
Side affect: Release the Metabase pointer, and Destroy the internal event object.
===================================================================*/
CWmRgSrv::~CWmRgSrv()
{
InterlockedDecrement((long *)&g_dwRefCount);
DBG_ASSERT(m_cRef == 0);
}
/*===================================================================
CWmRgSrv::QueryInterface
UNDONE
Parameter:
NONE.
Return: HRESULT
Side affect: .
===================================================================*/
STDMETHODIMP CWmRgSrv::QueryInterface(REFIID riid, void ** ppv)
{
if (riid == IID_IUnknown || riid == IID_IADMEXT)
{
*ppv = static_cast<IADMEXT*>(this);
}
else
{
*ppv = NULL;
return E_NOINTERFACE;
}
reinterpret_cast<IUnknown*>(*ppv)->AddRef();
return S_OK;
}
STDMETHODIMP_(ULONG) CWmRgSrv::AddRef( )
{
return InterlockedIncrement(&m_cRef);
}
STDMETHODIMP_(ULONG) CWmRgSrv::Release( )
{
if (InterlockedDecrement(&m_cRef) == 0)
{
delete this;
return 0;
}
return m_cRef;
}
/*===================================================================
CWmRgSrv::Initialize
UNDONE
Parameter:
NONE.
Return: HRESULT
Side affect: .
===================================================================*/
STDMETHODIMP CWmRgSrv::Initialize( )
{
HRESULT hrReturn = NOERROR;
CWamAdminFactory *pWamAdminFactory = new CWamAdminFactory();
if (pWamAdminFactory == NULL)
{
DBGPRINTF((DBG_CONTEXT, "WamRegSrv Init failed. error %08x\n",
GetLastError()));
hrReturn = E_OUTOFMEMORY;
goto LExit;
}
hrReturn = g_RegistryConfig.LoadWamDllPath();
if (SUCCEEDED(hrReturn))
{
hrReturn = WamRegMetabaseConfig::MetabaseInit();
}
if (SUCCEEDED(hrReturn))
{
hrReturn = CoRegisterClassObject(CLSID_WamAdmin,
static_cast<IUnknown *>(pWamAdminFactory),
CLSCTX_SERVER,
REGCLS_MULTIPLEUSE,
&g_dwWamAdminRegister);
if (FAILED(hrReturn))
{
DBGPRINTF((DBG_CONTEXT, "WamRegSrv Init failed. error %08x\n",
GetLastError()));
}
}
if (FAILED(hrReturn))
{
if (g_dwWamAdminRegister)
{
//
// PREfix has a problem with this code because we're not checking
// the return value of CoRevokeClassObject. There's really
// nothing different we could do in the event of failure, so
// there's no point in checking.
//
/* INTRINSA suppress=all */
CoRevokeClassObject(g_dwWamAdminRegister);
g_dwWamAdminRegister = 0;
}
RELEASE(pWamAdminFactory);
}
if (FAILED(hrReturn))
{
WamRegMetabaseConfig::MetabaseUnInit();
}
LExit:
return hrReturn;
}
/*===================================================================
CWmRgSrv::Terminate
UNDONE
Parameter:
NONE.
Return: HRESULT
Side affect: .
===================================================================*/
HRESULT CWmRgSrv::EnumDcomCLSIDs
(
/* [size_is][out] */CLSID *pclsidDcom,
/* [in] */ DWORD dwEnumIndex
)
{
HRESULT hr = HRESULT_FROM_WIN32(ERROR_NO_MORE_ITEMS);
if (dwEnumIndex == 0)
{
*pclsidDcom = CLSID_WamAdmin;
hr = S_OK;
}
return hr;
}
/*===================================================================
CWmRgSrv::Terminate
UNDONE
Parameter:
NONE.
Return: HRESULT
Side affect: .
===================================================================*/
STDMETHODIMP CWmRgSrv::Terminate( )
{
//
// PREfix has a problem with this code because we're not checking
// the return value of CoRevokeClassObject. There's really
// nothing different we could do in the event of failure, so
// there's no point in checking.
//
/* INTRINSA suppress=all */
CoRevokeClassObject(g_dwWamAdminRegister);
WamRegMetabaseConfig::MetabaseUnInit();
return S_OK;
}
/*
CWmRgSrvFactory: Class Factory IUnknown Implementation
*/
CWmRgSrvFactory::CWmRgSrvFactory()
: m_pWmRgServiceObj(NULL)
{
m_cRef = 0;
InterlockedIncrement((long *)&g_dwRefCount);
}
CWmRgSrvFactory::~CWmRgSrvFactory()
{
InterlockedDecrement((long *)&g_dwRefCount);
RELEASE(m_pWmRgServiceObj);
}
STDMETHODIMP CWmRgSrvFactory::QueryInterface(REFIID riid, void ** ppv)
{
HRESULT hrReturn = S_OK;
if (riid==IID_IUnknown || riid == IID_IClassFactory)
{
if (m_pWmRgServiceObj == NULL)
{
*ppv = (IClassFactory *) this;
AddRef();
hrReturn = S_OK;
}
else
{
*ppv = (IClassFactory *) this;
AddRef();
hrReturn = S_OK;
}
}
else
{
hrReturn = E_NOINTERFACE;
}
return hrReturn;
}
STDMETHODIMP_(ULONG) CWmRgSrvFactory::AddRef( )
{
DWORD dwRefCount;
dwRefCount = InterlockedIncrement((long *)&m_cRef);
return dwRefCount;
}
STDMETHODIMP_(ULONG) CWmRgSrvFactory::Release( )
{
DWORD dwRefCount;
dwRefCount = InterlockedDecrement((long *)&m_cRef);
return dwRefCount;
}
STDMETHODIMP CWmRgSrvFactory::CreateInstance(IUnknown * pUnknownOuter, REFIID riid, void ** ppv)
{
HRESULT hrReturn = NOERROR;
if (pUnknownOuter != NULL)
{
hrReturn = CLASS_E_NOAGGREGATION;
}
if (m_pWmRgServiceObj == NULL)
{
m_pWmRgServiceObj = new CWmRgSrv();
if (m_pWmRgServiceObj == NULL)
{
hrReturn = E_OUTOFMEMORY;
}
}
if (m_pWmRgServiceObj)
{
if (FAILED(m_pWmRgServiceObj->QueryInterface(riid, ppv)))
{
hrReturn = E_NOINTERFACE;
}
}
return hrReturn;
}
STDMETHODIMP CWmRgSrvFactory::LockServer(BOOL fLock)
{
if (fLock)
{
InterlockedIncrement((long *)&g_dwRefCount);
}
else
{
InterlockedDecrement((long *)&g_dwRefCount);
}
return S_OK;
}