/*++ Copyright (C) 1996-2001 Microsoft Corporation Module Name: UNLOAD.CPP Abstract: Unloading helper. History: --*/ #include "precomp.h" #include #include #include #include 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; }