2025-04-27 07:49:33 -04:00

353 lines
9.7 KiB
C++

// XMLWbemServices.cpp: implementation of the CXMLWbemServices class.
// our implementation of IWbemServices
//////////////////////////////////////////////////////////////////////
#include "XMLProx.h"
#include "XMLClientPacket.h"
#include "XMLClientPacketFactory.h"
#include "SinkMap.h"
#include "MapXMLtoWMI.h"
#include "XMLWbemServices.h"
#include "XMLEnumWbemClassObject.h"
#include <xmlparser.h>
#include "MyPendingStream.h"
#include "nodefact.h"
#include "XMLEnumWbemClassObject2.h"
#include "URLParser.h"
#include "XMLWbemCallResult.h"
HRESULT CXMLWbemServices::SpawnSemiSyncThreadWithNormalPackage( LPTHREAD_START_ROUTINE pfThreadFunction,
const BSTR strNsOrObjPath,
LONG lFlags,
IWbemContext *pCtx,
IWbemCallResult **ppCallResult,
IWbemClassObject *pObject,
IEnumWbemClassObject *pEnum,
bool bIsEnum,
bool bEnumTypeDedicated)
{
// For enumerations (class, instance and query) there is no CallResult.
if(!bIsEnum && (NULL == ppCallResult))
return WBEM_E_INVALID_PARAMETER;
HRESULT hr = WBEM_NO_ERROR;
// Create a Call Result object for the client, for non Enumeration operations
CXMLWbemCallResult *pCallResult = NULL;
if(!bIsEnum)
{
*ppCallResult = NULL;
if(pCallResult = new CXMLWbemCallResult())
{
}
else
hr = WBEM_E_OUT_OF_MEMORY;
}
if(SUCCEEDED(hr))
{
// Create a package for passing to the thread that executes this call
ASYNC_NORMAL_PACKAGE *pPackage = NULL;
if(pPackage = new ASYNC_NORMAL_PACKAGE())
{
if(SUCCEEDED(hr = pPackage->Initialize(strNsOrObjPath,
lFlags,
this,
pCtx,
pCallResult,
pObject,
pEnum,
bEnumTypeDedicated)))
{
// Kick off the request on the other thread
HANDLE hChild = NULL;
if(hChild = CreateThread(NULL, 0, pfThreadFunction, (void*)pPackage, 0, NULL))
{
// Set the out parameter for non-Enumeration operations
if(!bIsEnum)
{
*ppCallResult = (IWbemCallResult*)pCallResult;
pCallResult->AddRef();
}
CloseHandle(hChild);
}
else
hr = WBEM_E_FAILED;
}
// Thread wasnt created - hence our responsibility to delete the package
if(FAILED(hr))
delete pPackage;
}
else
hr = WBEM_E_OUT_OF_MEMORY;
if(!bIsEnum)
pCallResult->Release();
}
return hr;
}
/****************************************************************************************************
The thread functions that are used for SemiSync operations..
****************************************************************************************************/
DWORD WINAPI Thread_SemiSync_GetClass(LPVOID pPackage)
{
HRESULT hr = WBEM_NO_ERROR;
ASYNC_NORMAL_PACKAGE *pThisPackage = (ASYNC_NORMAL_PACKAGE *) pPackage;
CXMLWbemCallResult *pCallResult = pThisPackage->m_pCallResult;
if(SUCCEEDED(hr = CoInitialize(NULL)))
{
IWbemClassObject *pClassObject = NULL;
if(SUCCEEDED(hr = (pThisPackage->m_pCallingObject)->Actual_GetClass(
pThisPackage->m_strNsOrObjPath,
pThisPackage->m_lFlags,
pThisPackage->m_pCtx, &pClassObject)))
{
pCallResult->SetResultObject(pClassObject);
pClassObject->Release();
}
CoUninitialize();
}
pCallResult->SetCallStatus(hr);
delete pThisPackage;
return 0;
}
DWORD WINAPI Thread_SemiSync_GetInstance(LPVOID pPackage)
{
ASYNC_NORMAL_PACKAGE *pThisPackage = (ASYNC_NORMAL_PACKAGE *) pPackage;
CXMLWbemCallResult *pCallResult = pThisPackage->m_pCallResult;
HRESULT hr = WBEM_NO_ERROR;
IWbemClassObject *pClassObject = NULL;
if(SUCCEEDED(hr = (pThisPackage->m_pCallingObject)->Actual_GetInstance(
pThisPackage->m_strNsOrObjPath,
pThisPackage->m_lFlags,
pThisPackage->m_pCtx, &pClassObject)))
{
pCallResult->SetResultObject(pClassObject);
pClassObject->Release();
}
pCallResult->SetCallStatus(hr);
delete pThisPackage;
return 0;
}
DWORD WINAPI Thread_SemiSync_PutClass(LPVOID pPackage)
{
ASYNC_NORMAL_PACKAGE *pThisPackage = (ASYNC_NORMAL_PACKAGE *) pPackage;
CXMLWbemCallResult *pCallResult = pThisPackage->m_pCallResult;
HRESULT hr = WBEM_NO_ERROR;
if(SUCCEEDED(hr = CoInitialize(NULL)))
{
hr = (pThisPackage->m_pCallingObject)->Actual_PutClass(
pThisPackage->m_pWbemClassObject,
pThisPackage->m_lFlags,
pThisPackage->m_pCtx);
CoUninitialize();
}
// Nothing more to be set in the call status
pCallResult->SetCallStatus(hr);
delete pThisPackage;
return 0;
}
DWORD WINAPI Thread_SemiSync_PutInstance(LPVOID pPackage)
{
HRESULT hr = WBEM_NO_ERROR;
ASYNC_NORMAL_PACKAGE *pThisPackage = (ASYNC_NORMAL_PACKAGE *) pPackage;
CXMLWbemCallResult *pCallResult = pThisPackage->m_pCallResult;
if(SUCCEEDED(hr = CoInitialize(NULL)))
{
if(SUCCEEDED(hr = (pThisPackage->m_pCallingObject)->Actual_PutInstance(
pThisPackage->m_pWbemClassObject,
pThisPackage->m_lFlags,
pThisPackage->m_pCtx)))
{
VARIANT var;
VariantInit(&var);
if(SUCCEEDED(hr = (pThisPackage->m_pWbemClassObject)->Get(L"__RELPATH", 0, &var, NULL, NULL)))
pCallResult->SetResultString(var.bstrVal);
// No need to do a VariantClear() since the SetResultString owns the memory now
}
CoUninitialize();
}
pCallResult->SetCallStatus(hr);
delete pThisPackage;
return 0;
}
DWORD WINAPI Thread_SemiSync_DeleteClass(LPVOID pPackage)
{
ASYNC_NORMAL_PACKAGE *pThisPackage = (ASYNC_NORMAL_PACKAGE *) pPackage;
CXMLWbemCallResult *pCallResult = pThisPackage->m_pCallResult;
HRESULT hr = WBEM_NO_ERROR;
if(SUCCEEDED(hr = CoInitialize(NULL)))
{
hr = (pThisPackage->m_pCallingObject)->Actual_DeleteClass(
pThisPackage->m_strNsOrObjPath,
pThisPackage->m_lFlags,
pThisPackage->m_pCtx);
CoUninitialize();
}
// Nothing more to be set in the call status
pCallResult->SetCallStatus(hr);
delete pThisPackage;
return 0;
}
DWORD WINAPI Thread_SemiSync_DeleteInstance(LPVOID pPackage)
{
ASYNC_NORMAL_PACKAGE *pThisPackage = (ASYNC_NORMAL_PACKAGE *) pPackage;
CXMLWbemCallResult *pCallResult = pThisPackage->m_pCallResult;
HRESULT hr = WBEM_NO_ERROR;
if(SUCCEEDED(hr = CoInitialize(NULL)))
{
hr = (pThisPackage->m_pCallingObject)->Actual_DeleteInstance(
pThisPackage->m_strNsOrObjPath,
pThisPackage->m_lFlags,
pThisPackage->m_pCtx);
CoUninitialize();
}
// Nothing more to be set in the call status
pCallResult->SetCallStatus(hr);
delete pThisPackage;
return 0;
}
DWORD WINAPI Thread_SemiSync_CreateClassEnum(LPVOID pPackage)
{
ASYNC_NORMAL_PACKAGE *pThisPackage = (ASYNC_NORMAL_PACKAGE *) pPackage;
if(SUCCEEDED(CoInitialize(NULL)))
{
(pThisPackage->m_pCallingObject)->Actual_CreateClassEnum(
pThisPackage->m_strNsOrObjPath,
pThisPackage->m_lFlags,
pThisPackage->m_pCtx,
pThisPackage->m_pEnum,
pThisPackage->m_bDedicatedEnum);
CoUninitialize();
}
delete pThisPackage;
return 0;
}
DWORD WINAPI Thread_SemiSync_CreateInstanceEnum(LPVOID pPackage)
{
ASYNC_NORMAL_PACKAGE *pThisPackage = (ASYNC_NORMAL_PACKAGE *) pPackage;
if(SUCCEEDED(CoInitialize(NULL)))
{
(pThisPackage->m_pCallingObject)->Actual_CreateInstanceEnum(
pThisPackage->m_strNsOrObjPath,
pThisPackage->m_lFlags,
pThisPackage->m_pCtx,
pThisPackage->m_pEnum,
pThisPackage->m_bDedicatedEnum);
CoUninitialize();
}
delete pThisPackage;
return 0;
}
DWORD WINAPI Thread_SemiSync_ExecQuery(LPVOID pPackage)
{
ASYNC_QUERY_PACKAGE *pThisPackage = (ASYNC_QUERY_PACKAGE *) pPackage;
if(SUCCEEDED(CoInitialize(NULL)))
{
(pThisPackage->m_pCallingObject)->Actual_ExecQuery(
pThisPackage->m_strQueryLanguage,
pThisPackage->m_strQuery,
pThisPackage->m_lFlags,
pThisPackage->m_pCtx,
pThisPackage->m_pEnum);
CoUninitialize();
}
delete pThisPackage;
return 0;
}
DWORD WINAPI Thread_SemiSync_ExecMethod(LPVOID pPackage)
{
ASYNC_METHOD_PACKAGE *pThisPackage = (ASYNC_METHOD_PACKAGE *) pPackage;
CXMLWbemCallResult *pCallResult = pThisPackage->m_pCallResult;
HRESULT hr = S_OK;
IWbemClassObject *pOutParams = NULL;
if(SUCCEEDED(hr = CoInitialize(NULL)))
{
if(SUCCEEDED(hr = (pThisPackage->m_pCallingObject)->Actual_ExecMethod(
pThisPackage->m_strNsOrObjPath,
pThisPackage->m_strMethod,
pThisPackage->m_lFlags,
pThisPackage->m_pCtx,
pThisPackage->m_pWbemClassObject,
&pOutParams)))
{
if(pOutParams)
{
pCallResult->SetResultObject(pOutParams);
pOutParams->Release();
}
}
CoUninitialize();
}
pCallResult->SetCallStatus(hr);
delete pThisPackage;
return 0;
}
DWORD WINAPI Thread_SemiSync_OpenNamespace(LPVOID pPackage)
{
ASYNC_NORMAL_PACKAGE *pThisPackage = (ASYNC_NORMAL_PACKAGE *) pPackage;
CXMLWbemCallResult *pCallResult = pThisPackage->m_pCallResult;
HRESULT hr = S_OK;
if(SUCCEEDED(hr = CoInitialize(NULL)))
{
IWbemServices *pWbemServices = NULL;
if(SUCCEEDED(hr = (pThisPackage->m_pCallingObject)->Actual_OpenNamespace(
pThisPackage->m_strNsOrObjPath,
pThisPackage->m_lFlags,
pThisPackage->m_pCtx,
&pWbemServices)))
{
pCallResult->SetResultServices(pWbemServices);
pWbemServices->Release();
}
CoUninitialize();
}
pCallResult->SetCallStatus(hr);
delete pThisPackage;
return 0;
}
/****************************************************************************************************
End of threads that would be used for SemiSync operations..
****************************************************************************************************/