280 lines
5.7 KiB
C++
280 lines
5.7 KiB
C++
//XMLWbemCallResult.cpp - the CXMLWbemCallResult class implementation (our version of IWbemCallResult
|
|
|
|
#include "XMLProx.h"
|
|
#include "XMLClientpacket.h"
|
|
#include "XMLClientPacketFactory.h"
|
|
#include "SinkMap.h"
|
|
#include "XMLWbemServices.h"
|
|
#include "XMLWbemCallResult.h"
|
|
|
|
extern long g_lComponents; //Declared in the XMLProx.dll
|
|
|
|
// The amount of quantums, in milliseconds between which we check for results
|
|
static const LONG YIELDTIME=70;
|
|
|
|
CXMLWbemCallResult::CXMLWbemCallResult(): m_lStatus(WBEM_S_TIMEDOUT),
|
|
m_pWbemClassObject(NULL),
|
|
m_pWbemServices(NULL),
|
|
m_strResultString(NULL),
|
|
m_cRef(1)
|
|
{
|
|
InterlockedIncrement(&g_lComponents);
|
|
InitializeCriticalSection(&m_CriticalSection);
|
|
m_bStatusSet = m_bJobDone = false;
|
|
}
|
|
|
|
CXMLWbemCallResult::~CXMLWbemCallResult()
|
|
{
|
|
InterlockedDecrement(&g_lComponents);
|
|
SysFreeString(m_strResultString);
|
|
RELEASEINTERFACE(m_pWbemServices);
|
|
RELEASEINTERFACE(m_pWbemClassObject);
|
|
DeleteCriticalSection(&m_CriticalSection);
|
|
}
|
|
|
|
HRESULT CXMLWbemCallResult::GetCallStatus(LONG lTimeout, LONG *plStatus)
|
|
{
|
|
if(NULL == plStatus)
|
|
return (E_INVALIDARG);
|
|
|
|
LONG dwYield = YIELDTIME;
|
|
if((lTimeout < dwYield) && (lTimeout != WBEM_INFINITE))
|
|
dwYield = lTimeout;
|
|
|
|
DWORD dwTickEnd = 0;
|
|
DWORD dwTickStart = GetTickCount();
|
|
while(!m_bStatusSet)
|
|
{
|
|
dwTickEnd = GetTickCount();
|
|
|
|
if(((LONG)(dwTickEnd - dwTickStart) > lTimeout)&&(lTimeout != WBEM_INFINITE))
|
|
break;
|
|
|
|
Sleep(dwYield);
|
|
}
|
|
if(!m_bStatusSet)
|
|
*plStatus = WBEM_S_TIMEDOUT; //timedout before we could set the callstatus..
|
|
else
|
|
*plStatus = m_lStatus;
|
|
|
|
return (*plStatus);
|
|
}
|
|
|
|
HRESULT CXMLWbemCallResult::GetResultObject(LONG lTimeout,IWbemClassObject **ppResultObject)
|
|
{
|
|
if(NULL == ppResultObject)
|
|
return E_INVALIDARG;
|
|
|
|
LONG dwYield = YIELDTIME;
|
|
|
|
if((lTimeout < dwYield)&&(lTimeout != WBEM_INFINITE))
|
|
dwYield = lTimeout;
|
|
|
|
DWORD dwTickEnd = 0;
|
|
|
|
DWORD dwTickStart = GetTickCount();
|
|
|
|
while(!m_bJobDone)
|
|
{
|
|
dwTickEnd = GetTickCount();
|
|
|
|
if(((LONG)(dwTickEnd - dwTickStart) > lTimeout)&&(lTimeout != WBEM_INFINITE))
|
|
break;
|
|
|
|
Sleep(dwYield);
|
|
}
|
|
|
|
if(!m_bJobDone)
|
|
{
|
|
//operation timed out before we could get the object..
|
|
*ppResultObject = NULL;
|
|
SetCallStatus(WBEM_S_TIMEDOUT);
|
|
}
|
|
else
|
|
{
|
|
*ppResultObject = m_pWbemClassObject;
|
|
m_pWbemClassObject->AddRef();
|
|
}
|
|
|
|
return m_lStatus;
|
|
}
|
|
|
|
|
|
HRESULT CXMLWbemCallResult::GetResultServices(LONG lTimeout,IWbemServices **ppServices)
|
|
{
|
|
if(NULL == ppServices)
|
|
return E_INVALIDARG;
|
|
|
|
LONG dwYield = YIELDTIME;
|
|
|
|
if((lTimeout < dwYield)&&(lTimeout != WBEM_INFINITE))
|
|
dwYield = lTimeout;
|
|
|
|
DWORD dwTickEnd = 0;
|
|
|
|
DWORD dwTickStart = GetTickCount();
|
|
|
|
while(!m_bJobDone)
|
|
{
|
|
dwTickEnd = GetTickCount();
|
|
|
|
if(((LONG)(dwTickEnd - dwTickStart) > lTimeout)&&(lTimeout != WBEM_INFINITE))
|
|
break;
|
|
|
|
Sleep(dwYield);
|
|
}
|
|
|
|
if(!m_bJobDone)
|
|
{
|
|
//operation timed out before we could get the object..
|
|
*ppServices = NULL;
|
|
SetCallStatus(WBEM_S_TIMEDOUT);
|
|
}
|
|
else
|
|
{
|
|
*ppServices = m_pWbemServices;
|
|
m_pWbemServices->AddRef();
|
|
}
|
|
|
|
return m_lStatus;
|
|
}
|
|
|
|
|
|
HRESULT CXMLWbemCallResult::GetResultString(LONG lTimeout,BSTR *pstrResultString)
|
|
{
|
|
if(NULL == pstrResultString)
|
|
return E_INVALIDARG;
|
|
|
|
LONG dwYield = YIELDTIME;
|
|
|
|
if((lTimeout < dwYield)&&(lTimeout != WBEM_INFINITE))
|
|
dwYield = lTimeout;
|
|
|
|
DWORD dwTickEnd = 0;
|
|
|
|
DWORD dwTickStart = GetTickCount();
|
|
|
|
while(!m_bJobDone)
|
|
{
|
|
dwTickEnd = GetTickCount();
|
|
|
|
if(((LONG)(dwTickEnd - dwTickStart) > lTimeout)&&(lTimeout != WBEM_INFINITE))
|
|
break;
|
|
|
|
Sleep(dwYield);
|
|
}
|
|
|
|
*pstrResultString = NULL;
|
|
if(!m_bJobDone)
|
|
{
|
|
//operation timed out before we could get the object..
|
|
SetCallStatus(WBEM_S_TIMEDOUT);
|
|
}
|
|
else
|
|
{
|
|
if(!(*pstrResultString = SysAllocString(m_strResultString)))
|
|
return E_OUTOFMEMORY;
|
|
}
|
|
|
|
return m_lStatus;
|
|
}
|
|
|
|
|
|
|
|
HRESULT CXMLWbemCallResult::SetCallStatus(LONG lStatus)
|
|
{
|
|
EnterCriticalSection(&m_CriticalSection);
|
|
|
|
HRESULT hr = S_OK;
|
|
|
|
m_lStatus = lStatus;
|
|
|
|
m_bStatusSet = true;
|
|
|
|
LeaveCriticalSection(&m_CriticalSection);
|
|
|
|
return hr;
|
|
}
|
|
|
|
|
|
HRESULT CXMLWbemCallResult::SetResultObject(IWbemClassObject *pResultObject)
|
|
{
|
|
EnterCriticalSection(&m_CriticalSection);
|
|
|
|
HRESULT hr = S_OK;
|
|
|
|
if(m_pWbemClassObject)
|
|
{
|
|
m_pWbemClassObject->Release();
|
|
m_pWbemClassObject = NULL;
|
|
}
|
|
|
|
if(m_pWbemClassObject = pResultObject)
|
|
m_pWbemClassObject->AddRef();
|
|
|
|
m_bJobDone = true;
|
|
|
|
LeaveCriticalSection(&m_CriticalSection);
|
|
|
|
return hr;
|
|
}
|
|
|
|
|
|
HRESULT CXMLWbemCallResult::SetResultServices(IWbemServices *pResultServices)
|
|
{
|
|
EnterCriticalSection(&m_CriticalSection);
|
|
|
|
HRESULT hr = S_OK;
|
|
|
|
if(m_pWbemServices)
|
|
{
|
|
m_pWbemServices->Release();
|
|
m_pWbemServices = NULL;
|
|
}
|
|
|
|
if(m_pWbemServices = pResultServices)
|
|
m_pWbemServices->AddRef();
|
|
|
|
m_bJobDone = true;
|
|
|
|
LeaveCriticalSection(&m_CriticalSection);
|
|
|
|
return hr;
|
|
}
|
|
|
|
|
|
// Caution - The memory in pwszResultString will belong to us once this call is invoked
|
|
HRESULT CXMLWbemCallResult::SetResultString(BSTR strResultString)
|
|
{
|
|
EnterCriticalSection(&m_CriticalSection);
|
|
m_strResultString = strResultString;
|
|
m_bJobDone = true;
|
|
LeaveCriticalSection(&m_CriticalSection);
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
HRESULT CXMLWbemCallResult::QueryInterface(REFIID riid,void ** ppv)
|
|
{
|
|
if (riid == IID_IUnknown || riid == IID_IWbemCallResult)
|
|
{
|
|
*ppv = (IWbemCallResult*) this;
|
|
AddRef();
|
|
return WBEM_S_NO_ERROR;
|
|
}
|
|
else return E_NOINTERFACE;
|
|
}
|
|
|
|
ULONG CXMLWbemCallResult::AddRef()
|
|
{
|
|
return InterlockedIncrement(&m_cRef);
|
|
}
|
|
|
|
ULONG CXMLWbemCallResult::Release()
|
|
{
|
|
if(InterlockedDecrement(&m_cRef) == 0)
|
|
delete this;
|
|
|
|
return m_cRef;
|
|
}
|