|
|
#include "pch.h"
#pragma hdrstop
#include "wuauengi_i.c"
CAUInternals::~CAUInternals() { if (m_pUpdates != NULL) { m_pUpdates->Release(); } }
HRESULT CAUInternals::m_setReminderState(DWORD dwState) { HRESULT hr = S_OK;
// save selections so we have them after the reminder
if ( AUSTATE_NOT_CONFIGURED == dwState || (SUCCEEDED(hr = m_saveSelectionsToServer(m_pUpdates)))) { hr = SetRegDWordValue(TIMEOUTSTATE, dwState); } return hr; }
/*****
Takes the number of seconds we want to wait before reminding the user and records it in the current user's registry along with a timestamp. *****/ HRESULT CAUInternals::m_setReminderTimeout(UINT iTimeout) { //const int NanoSec100PerSec = 10000000;
DEBUGMSG("WUAUCLT Setting timeout = %lu", ReminderTimes[iTimeout].timeout);
DWORD timeout;
if ( TIMEOUT_INX_TOMORROW == iTimeout ) { // time to wait is midnight - current time.
SYSTEMTIME tmCurrent; SYSTEMTIME tmMidnight; FILETIME ftCurrent; FILETIME ftMidnight;
GetLocalTime(&tmCurrent); tmMidnight = tmCurrent; tmMidnight.wHour = 23; tmMidnight.wMinute = 59; tmMidnight.wSecond = 59; tmMidnight.wMilliseconds = 999;
SystemTimeToFileTime(&tmCurrent, &ftCurrent); SystemTimeToFileTime(&tmMidnight, &ftMidnight); ULONGLONG diff = *((ULONGLONG *)&ftMidnight) - *((ULONGLONG *)&ftCurrent); timeout = DWORD(diff / NanoSec100PerSec); DEBUGMSG("WUAUCLT: tomorrow is %lu secs away", timeout); } else { timeout = ReminderTimes[iTimeout].timeout; }
return setAddedTimeout(timeout, TIMEOUTVALUE); }
HRESULT CAUInternals::m_getServiceState(AUSTATE *pAuState) { #ifdef TESTUI
return S_OK; #else
if (NULL == m_pUpdates) { return E_FAIL; } HRESULT hr = m_pUpdates->get_State(pAuState); if (FAILED(hr)) { DEBUGMSG("WUAUCLT m_getServiceState failed, hr=%#lx", hr); } return hr; #endif
}
HRESULT TransformSafeArrayToItemList(VARIANT & var, AUCatalogItemList & ItemList) { HRESULT hr; //= S_OK;
// determine how many elements there are.
if (FAILED(hr = ItemList.Allocate(var))) { DEBUGMSG("WUAUCLT fail to allocate item list with error %#lx", hr); goto done; } DEBUGMSG("ItemList had %d elements", ItemList.Count()); #if 0
if ( !m_bValid ) { DEBUGMSG("Catalog::getUpdateList fails because catalog is not valid"); goto done; } #endif
for ( UINT index = 0; index < ItemList.Count(); index++ ) { VARIANT varg; VariantInit(&varg);
struct { VARTYPE vt; void * pv; } grMembers[] = { { VT_I4, &ItemList[index].m_dwStatus }, { VT_BSTR, &ItemList[index].m_bstrID }, { VT_BSTR, &ItemList[index].m_bstrProviderName }, { VT_BSTR, &ItemList[index].m_bstrTitle }, { VT_BSTR, &ItemList[index].m_bstrDescription }, { VT_BSTR, &ItemList[index].m_bstrRTFPath }, { VT_BSTR, &ItemList[index].m_bstrEULAPath } };
for ( int index2 = 0; index2 < ARRAYSIZE(grMembers); index2++ ) { long dex = (index * 7) + index2;
if ( FAILED(hr = SafeArrayGetElement(var.parray, &dex, &varg)) ) { DEBUGMSG("Failed to get element %ld", dex); goto done; }
switch (grMembers[index2].vt) { case VT_I4: *((long *)grMembers[index2].pv) = varg.lVal; break; case VT_BSTR: *((BSTR *)grMembers[index2].pv) = varg.bstrVal; break; } } }
done: return hr; }
HRESULT CAUInternals::m_getServiceUpdatesList(void) { #ifdef TESTUI
return S_OK; #else
VARIANT var; HRESULT hr; if ( SUCCEEDED(hr = m_pUpdates->GetUpdatesList(&var)) && SUCCEEDED(hr = TransformSafeArrayToItemList(var, m_ItemList)) ) { // gItemList.DbgDump();
} else { DEBUGMSG("WUAUCLT m_getUpdatesList failed, hr=%#lx", hr); }
VariantClear(&var);
return hr; #endif
}
HRESULT CAUInternals::m_saveSelectionsToServer(IUpdates *pUpdates) { HRESULT hr = E_FAIL; SAFEARRAYBOUND bound[1] = { m_ItemList.Count() * 2, 0};
if ( 0 == m_ItemList.Count() ) { DEBUGMSG("Catalog::m_saveSelectionsToServer fails because getNumItems is 0"); hr = E_UNEXPECTED; goto Done; }
VARIANT varSelections; varSelections.vt = VT_ARRAY | VT_VARIANT;
if (NULL == (varSelections.parray = SafeArrayCreate(VT_VARIANT, 1, bound))) { hr = E_OUTOFMEMORY; goto Done; }
VARIANT *grVariant = NULL; if (FAILED(hr = SafeArrayAccessData(varSelections.parray, (void **)&grVariant))) { goto CleanUp; }
for ( UINT n = 0; n < m_ItemList.Count(); n++ ) { if (NULL == (grVariant[n*2+0].bstrVal = SysAllocString(m_ItemList[n].bstrID()))) { hr = E_OUTOFMEMORY; break; } grVariant[n*2+0].vt = VT_BSTR; grVariant[n*2+1].vt = VT_I4; grVariant[n*2+1].lVal = m_ItemList[n].dwStatus(); } HRESULT hr2 = SafeArrayUnaccessData(varSelections.parray); if (SUCCEEDED(hr) && FAILED(hr2)) { hr = hr2; goto CleanUp; }
if (SUCCEEDED(hr)) { hr = pUpdates->SaveSelections(varSelections); }
CleanUp: VariantClear(&varSelections);
Done: return hr; }
HRESULT CAUInternals::m_startDownload(void) { //fixcode this call is probably unneccesary
HRESULT hr = m_saveSelectionsToServer(m_pUpdates); DEBUGMSG("WUAUCLT %s download", FAILED(hr) ? "skip" : "start"); if ( SUCCEEDED(hr) ) { hr = m_pUpdates->StartDownload();
if (FAILED(hr)) { DEBUGMSG("WUAUCLT m_startDownload failed, hr=%#lx", hr); } }
return hr; }
HRESULT CAUInternals::m_getDownloadStatus(UINT *percent, DWORD *status) { HRESULT hr = m_pUpdates->GetDownloadStatus(percent, status); if (FAILED(hr)) { DEBUGMSG("WUAUCLT m_getDownloadStatus failed, hr=%#lx", hr); } return hr; }
HRESULT CAUInternals::m_setDownloadPaused(BOOL bPaused) { HRESULT hr = m_pUpdates->SetDownloadPaused(bPaused); if (FAILED(hr)) { DEBUGMSG("WUAUCLT m_setDownloadPaused failed, hr=%#lx", hr); } return hr; }
//fAutoInstall TRUE if client doing install via local system
// FALSE if installing via local admin
HRESULT CAUInternals::m_startInstall(BOOL fAutoInstall) { HRESULT hr = m_pUpdates->ClientMessage(AUMSG_PRE_INSTALL);
if (FAILED(hr)) { DEBUGMSG("WUAUCLT m_startInstall failed, hr=%#lx", hr); } else { gpClientCatalog->m_WrkThread.m_DoDirective(fAutoInstall ? enWrkThreadAutoInstall : enWrkThreadInstall); } return hr; }
//fixcode: should change name to complete wizard
HRESULT CAUInternals::m_configureAU() { HRESULT hr = m_pUpdates->ConfigureAU(); if (FAILED(hr)) { DEBUGMSG("WUAUCLT m_ConfigureAU failed, hr=%#lx", hr); } return hr; }
#if 0
long CAUInternals::m_getNum(DWORD dwSelectionStatus) { long total = 0; for (UINT index = 0; index < gItemList.Count(); index++ ) { if ( dwSelectionStatus == gItemList[index].dwStatus() ) { total++; } }
return total; } #endif
HRESULT CAUInternals::m_AvailableSessions(LPUINT pcSess) { if (NULL == pcSess) { return E_INVALIDARG; } return m_pUpdates->AvailableSessions(pcSess); }
HRESULT CAUInternals::m_getEvtHandles(DWORD dwProcId, AUEVTHANDLES *pAuEvtHandles) { HRESULT hr = m_pUpdates->get_EvtHandles(dwProcId, pAuEvtHandles); if (FAILED(hr)) { DEBUGMSG("WUAUCLT get_EvtHandles failed hr=%#lx", hr); } return hr; }
|