Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

384 lines
9.6 KiB

//***************************************************************************
//
// IISPROV.CPP
//
// Module: WMI IIS provider code
//
// Purpose: Defines the CIISInstProvider class. An object of this class is
// created by the class factory for each connection.
//
// Copyright (c)1998 Microsoft Corporation, All Rights Reserved
//
//***************************************************************************
#include <objbase.h>
#include "iisprov.h"
//***************************************************************************
//
// CIISInstProvider::CreateInstanceEnumAsync
//
// Purpose: Asynchronously enumerates the instances.
//
//***************************************************************************
HRESULT CIISInstProvider::DoCreateInstanceEnumAsync(
const BSTR a_ClassName,
long a_lFlags,
IWbemContext* a_pCtx,
IWbemObjectSink FAR* a_pHandler
)
{
HRESULT t_hr = WBEM_S_NO_ERROR;
IWbemClassObject FAR* t_pes = NULL;
// Do a check of arguments and make sure we have pointer to Namespace
if(a_pHandler == NULL || m_pNamespace == NULL)
return WBEM_E_INVALID_PARAMETER;
try
{
CUtils obj;
obj.EnumObjectAsync(a_ClassName, m_pNamespace, a_pHandler);
}
catch (CIIsProvException e)
{
t_pes = SetExtendedStatus(e.m_psz);
t_hr = e.m_hr;
}
catch (HRESULT hr)
{
t_hr = hr;
}
catch (...)
{
t_hr = WBEM_E_FAILED;
}
// Set status
SCODE t_sc = a_pHandler->SetStatus(WBEM_STATUS_COMPLETE, t_hr, NULL, t_pes);
if(t_pes)
t_pes->Release();
return t_sc;
}
HRESULT CIISInstProvider::DoDeleteInstanceAsync(
const BSTR a_ObjectPath,
long a_lFlags,
IWbemContext* a_pCtx,
IWbemObjectSink* a_pHandler
)
{
CObjectPathParser t_PathParser(e_ParserAcceptRelativeNamespace);
ParsedObjectPath* t_pParsedObject = NULL;
IWbemClassObject* t_pes = NULL;
HRESULT t_hr = WBEM_S_NO_ERROR;
try
{
if(a_ObjectPath == NULL || a_pHandler == NULL || m_pNamespace == NULL)
throw WBEM_E_INVALID_PARAMETER;
if (t_PathParser.Parse(a_ObjectPath, &t_pParsedObject) !=
CObjectPathParser::NoError)
throw WBEM_E_INVALID_PARAMETER;
if (t_pParsedObject == NULL)
throw WBEM_E_FAILED;
CUtils obj;
CMetabase t_metabase;
obj.DeleteObjectAsync(m_pNamespace, t_pParsedObject, t_metabase);
}
catch (CIIsProvException e)
{
t_pes = SetExtendedStatus(e.m_psz);
t_hr = e.m_hr;
}
catch (HRESULT hr)
{
t_hr = hr;
}
catch (...)
{
t_hr = WBEM_E_FAILED;
}
if (t_pParsedObject)
t_PathParser.Free(t_pParsedObject);
// Set status
SCODE t_sc = a_pHandler->SetStatus(WBEM_STATUS_COMPLETE, t_hr, NULL, t_pes);
if(t_pes)
t_pes->Release();
return t_sc;
}
//***************************************************************************
//
// CIISInstProvider::ExecMethodAsync
//
// Synopsis
//
//***************************************************************************
HRESULT CIISInstProvider::DoExecMethodAsync(
const BSTR a_strObjectPath,
const BSTR a_strMethodName,
long a_lFlags,
IWbemContext* a_pCtx,
IWbemClassObject* a_pInParams,
IWbemObjectSink* a_pHandler
)
{
HRESULT t_hr = WBEM_S_NO_ERROR;
IWbemClassObject* t_pes = NULL;
// Do a check of arguments and make sure we have pointer to Namespace
if( a_pHandler == NULL ||
m_pNamespace == NULL ||
a_strMethodName == NULL ||
a_strObjectPath == NULL )
return WBEM_E_INVALID_PARAMETER;
try
{
CUtils obj;
obj.ExecMethodAsync(
a_strObjectPath,
a_strMethodName,
a_pCtx,
a_pInParams,
a_pHandler,
m_pNamespace
);
}
catch (CIIsProvException e)
{
t_pes = SetExtendedStatus(e.m_psz);
t_hr = e.m_hr;
}
catch (HRESULT hr)
{
t_hr = hr;
}
catch (...)
{
t_hr = WBEM_E_FAILED;
}
// Set status
SCODE t_sc = a_pHandler->SetStatus(WBEM_STATUS_COMPLETE, t_hr, NULL, t_pes);
if(t_pes)
t_pes->Release();
return t_sc;
}
//***************************************************************************
//
// CIISInstProvider::GetObjectByPath
// CIISInstProvider::GetObjectByPathAsync
//
// Purpose: Creates an instance given a particular path value.
//
//***************************************************************************
HRESULT CIISInstProvider::DoGetObjectAsync(
const BSTR a_ObjectPath,
long a_lFlags,
IWbemContext* a_pCtx,
IWbemObjectSink* a_pHandler
)
{
CObjectPathParser t_PathParser(e_ParserAcceptRelativeNamespace);
ParsedObjectPath* t_pParsedObject = NULL;
IWbemClassObject* t_pObj = NULL;
IWbemClassObject* t_pes = NULL;
HRESULT t_hr = WBEM_S_NO_ERROR;
try
{
if(a_ObjectPath == NULL || a_pHandler == NULL || m_pNamespace == NULL)
throw WBEM_E_INVALID_PARAMETER;
if (t_PathParser.Parse(a_ObjectPath, &t_pParsedObject) !=
CObjectPathParser::NoError)
throw WBEM_E_INVALID_PARAMETER;
if (t_pParsedObject == NULL)
throw WBEM_E_FAILED;
CUtils obj;
CMetabase t_metabase;
t_hr = obj.GetObjectAsync(m_pNamespace, &t_pObj, t_pParsedObject, t_metabase);
if(SUCCEEDED(t_hr) && t_pObj)
{
t_hr = a_pHandler->Indicate(1,&t_pObj);
t_pObj->Release();
}
}
catch (CIIsProvException e)
{
t_pes = SetExtendedStatus(e.m_psz);
t_hr = e.m_hr;
}
catch (HRESULT hr)
{
t_hr = hr;
}
catch (...)
{
t_hr = WBEM_E_FAILED;
}
if (t_pParsedObject)
t_PathParser.Free(t_pParsedObject);
// Set status
SCODE t_sc = a_pHandler->SetStatus(WBEM_STATUS_COMPLETE, t_hr, NULL, t_pes);
if(t_pes)
t_pes->Release();
return t_sc;
}
HRESULT CIISInstProvider::DoPutInstanceAsync(
IWbemClassObject* a_pObj,
long a_lFlags,
IWbemContext* a_pCtx,
IWbemObjectSink* a_pHandler
)
{
HRESULT t_hr = ERROR_SUCCESS;
CObjectPathParser t_PathParser(e_ParserAcceptRelativeNamespace);
ParsedObjectPath* t_pParsedObject = NULL;
IWbemClassObject* t_pObjOld = NULL;
IWbemClassObject* t_pes = NULL;
CUtils obj;
CMetabase t_metabase;
try
{
if (a_pObj == NULL || a_pCtx == NULL || a_pHandler == NULL)
throw WBEM_E_INVALID_PARAMETER;
_bstr_t t_bstr = L"__RelPath";
_variant_t t_vt;
t_hr = a_pObj->Get(t_bstr, 0, &t_vt, NULL, NULL);
THROW_ON_ERROR(t_hr);
if (t_vt.vt != VT_BSTR)
throw WBEM_E_INVALID_OBJECT;
if (t_PathParser.Parse(t_vt.bstrVal, &t_pParsedObject) != CObjectPathParser::NoError)
throw WBEM_E_INVALID_PARAMETER;
if (t_pParsedObject == NULL)
throw WBEM_E_FAILED;
t_hr = obj.GetObjectAsync(m_pNamespace, &t_pObjOld, t_pParsedObject, t_metabase);
}
catch (CIIsProvException e)
{
t_pes = SetExtendedStatus(e.m_psz);
t_hr = e.m_hr;
}
catch (HRESULT hr)
{
t_hr = hr;
}
catch (...)
{
t_hr = WBEM_E_FAILED;
}
// a second try catch? messy.
// will cleanup when exception handling is removed
try
{
if(SUCCEEDED(t_hr) ||
HRESULT_CODE(t_hr) == ERROR_PATH_NOT_FOUND)
{
if(HRESULT_CODE(t_hr) == ERROR_PATH_NOT_FOUND) {
t_hr = 0;
}
obj.PutObjectAsync(a_pObj, t_pObjOld, t_pParsedObject, a_lFlags);
}
}
catch (CIIsProvException e)
{
t_pes = SetExtendedStatus(e.m_psz);
t_hr = e.m_hr;
}
catch (HRESULT hr)
{
t_hr = hr;
}
catch (...)
{
t_hr = WBEM_E_FAILED;
}
//
if (t_pObjOld)
t_pObjOld->Release();
if (t_pParsedObject)
t_PathParser.Free(t_pParsedObject);
// Set status
SCODE t_sc = a_pHandler->SetStatus(WBEM_STATUS_COMPLETE, t_hr, NULL, t_pes);
if(t_pes)
t_pes->Release();
return t_sc;
}
IWbemClassObject* CIISInstProvider::SetExtendedStatus(WCHAR* a_psz)
{
HRESULT t_hr;
IWbemClassObject* t_pclass;
IWbemClassObject* t_pes;
_bstr_t t_bstr = L"__ExtendedStatus";
t_hr = m_pNamespace->GetObject(
t_bstr,
0,
NULL,
&t_pclass,
NULL
);
if (t_hr != ERROR_SUCCESS)
return NULL;
t_hr = t_pclass->SpawnInstance(0, &t_pes);
t_pclass->Release();
if (t_hr != ERROR_SUCCESS || t_pes)
return NULL;
_variant_t t_vt = a_psz;
if (!t_vt.bstrVal)
return NULL;
t_hr = t_pes->Put(L"Description", 0, &t_vt, 0);
if (t_hr != ERROR_SUCCESS || t_pes)
{
t_pes->Release();
return NULL;
}
return t_pes;
}