186 lines
4.5 KiB
C++
186 lines
4.5 KiB
C++
/*++
|
|
|
|
Copyright (C) 1996-2001 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
UNLOAD.CPP
|
|
|
|
Abstract:
|
|
|
|
Unloading helper.
|
|
|
|
History:
|
|
|
|
--*/
|
|
|
|
#include "precomp.h"
|
|
#include <stdio.h>
|
|
#include <wbemcomn.h>
|
|
#include <unload.h>
|
|
#include <arrtempl.h>
|
|
|
|
CUnloadInstruction::CUnloadInstruction(LPCWSTR wszPath,
|
|
IWbemContext* pFirstContext)
|
|
: CBasicUnloadInstruction(), m_strPath(SysAllocString(wszPath)),
|
|
m_pFirstContext(pFirstContext), m_pNamespace(NULL)
|
|
{
|
|
m_Interval.SetMilliseconds(0);
|
|
if(m_pFirstContext)
|
|
m_pFirstContext->AddRef();
|
|
}
|
|
|
|
void CUnloadInstruction::Clear()
|
|
{
|
|
}
|
|
|
|
CUnloadInstruction::~CUnloadInstruction()
|
|
{
|
|
if(m_pNamespace)
|
|
m_pNamespace->Release();
|
|
|
|
SysFreeString(m_strPath);
|
|
if(m_pFirstContext)
|
|
m_pFirstContext->Release();
|
|
}
|
|
|
|
void CUnloadInstruction::SetToDefault()
|
|
{
|
|
m_Interval.SetMilliseconds(3600000);
|
|
}
|
|
|
|
void CUnloadInstruction::Reread(IWbemContext* pContext)
|
|
{
|
|
HRESULT hres;
|
|
if(m_pNamespace == NULL)
|
|
{
|
|
IWbemLocator * pLocator = NULL;
|
|
hres = CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL,
|
|
CLSCTX_INPROC_SERVER, IID_IWbemLocator, (void**)&pLocator);
|
|
if(hres == S_OK)
|
|
{
|
|
hres = pLocator->ConnectServer(L"ROOT", NULL, NULL, NULL,
|
|
0, NULL, NULL, &m_pNamespace);
|
|
pLocator->Release();
|
|
}
|
|
|
|
|
|
if(m_pNamespace == NULL)
|
|
{
|
|
SetToDefault();
|
|
return;
|
|
}
|
|
}
|
|
|
|
m_Interval = staticRead(m_pNamespace, pContext, m_strPath);
|
|
}
|
|
|
|
|
|
CWbemTime CUnloadInstruction::GetFirstFiringTime() const
|
|
{
|
|
if(m_Interval.IsZero())
|
|
{
|
|
// This function is const, but Reread is not, so have to cast
|
|
// ==========================================================
|
|
|
|
((CUnloadInstruction*)this)->Reread(m_pFirstContext);
|
|
}
|
|
|
|
return CBasicUnloadInstruction::GetFirstFiringTime();
|
|
}
|
|
|
|
//*****************************************************************************
|
|
//
|
|
// BASIC VERSION
|
|
//
|
|
//*****************************************************************************
|
|
CBasicUnloadInstruction::CBasicUnloadInstruction(CWbemInterval Interval)
|
|
: m_lRef(0), m_bTerminate(FALSE), m_Interval(Interval)
|
|
{
|
|
}
|
|
|
|
void CBasicUnloadInstruction::Terminate()
|
|
{
|
|
CInCritSec ics(&m_cs);
|
|
m_bTerminate = TRUE;
|
|
}
|
|
|
|
|
|
|
|
// static
|
|
CWbemInterval CBasicUnloadInstruction::staticRead(IWbemServices* pRoot,
|
|
IWbemContext* pContext, LPCWSTR wszPath)
|
|
{
|
|
HRESULT hres;
|
|
|
|
BSTR strPath = SysAllocString(wszPath);
|
|
if(strPath == NULL)
|
|
return CWbemInterval::GetInfinity();
|
|
CSysFreeMe sfm1(strPath);
|
|
|
|
IWbemClassObject* pObj = NULL;
|
|
hres = pRoot->GetObject(strPath, 0, pContext, &pObj, NULL);
|
|
if(FAILED(hres))
|
|
{
|
|
ERRORTRACE((LOG_WBEMCORE, "Unable to read cache configuration object "
|
|
"at %S: %X\n", strPath, hres));
|
|
return CWbemInterval::GetInfinity();
|
|
}
|
|
CReleaseMe rm1(pObj);
|
|
|
|
VARIANT var;
|
|
VariantInit(&var);
|
|
hres = pObj->Get(L"ClearAfter", 0, &var, NULL, NULL);
|
|
if(FAILED(hres))
|
|
{
|
|
ERRORTRACE((LOG_WBEMCORE, "No ClearCache property in cache "
|
|
"configuration object at %S: %X\n", strPath, hres));
|
|
return CWbemInterval::GetInfinity();
|
|
}
|
|
CClearMe cm(&var);
|
|
|
|
if(var.vt != VT_BSTR)
|
|
{
|
|
return CWbemInterval::GetInfinity();
|
|
}
|
|
|
|
DWORD dwYears, dwMonths, dwDays, dwHours, dwMinutes, dwSeconds;
|
|
if(swscanf(var.bstrVal, L"%4u%2u%2u%2u%2u%2u", &dwYears, &dwMonths,
|
|
&dwDays, &dwHours, &dwMinutes, &dwSeconds) != 6)
|
|
{
|
|
ERRORTRACE((LOG_WBEMCORE, "Unparsable ClearCache property in cache "
|
|
"configuration object at %S: %X\n", strPath, hres));
|
|
return CWbemInterval::GetInfinity();
|
|
}
|
|
|
|
if(dwYears != 0 || dwMonths != 0)
|
|
{
|
|
// makes no sense
|
|
// ==============
|
|
|
|
return CWbemInterval::GetInfinity();
|
|
}
|
|
|
|
dwSeconds += dwMinutes * 60 + dwHours * 3600 + dwDays * 3600 * 24;
|
|
CWbemInterval Interval;
|
|
Interval.SetMilliseconds(1000 * dwSeconds);
|
|
return Interval;
|
|
}
|
|
|
|
|
|
CWbemTime CBasicUnloadInstruction::GetFirstFiringTime() const
|
|
{
|
|
return CWbemTime::GetCurrentTime() + m_Interval;
|
|
}
|
|
|
|
CWbemTime CBasicUnloadInstruction::GetNextFiringTime(CWbemTime LastFiringTime,
|
|
OUT long* plFiringCount) const
|
|
{
|
|
if(m_bTerminate)
|
|
return CWbemTime::GetInfinity();
|
|
|
|
*plFiringCount = 1;
|
|
return LastFiringTime + m_Interval;
|
|
}
|
|
|