|
|
#include "shellprv.h"
#pragma hdrstop
#include "rssubdat.h"
///////////////////////////////////////////////////////////////////////////////
// Public methods
///////////////////////////////////////////////////////////////////////////////
BOOL CRSSubData::InitRegSupport(HKEY hkey, LPCTSTR pszKey1, LPCTSTR pszKey2, LPCTSTR pszKey3, DWORD cbSizeOfData, BOOL fVolatile) { DWORD dwDefaultOptions = REG_OPTION_NON_VOLATILE;
if (fVolatile) { dwDefaultOptions = REG_OPTION_VOLATILE; } _SetSizeOfData(cbSizeOfData);
RSInitRoot(hkey, pszKey1, pszKey2, REG_OPTION_NON_VOLATILE, dwDefaultOptions);
RSCVInitSubKey(pszKey3);
return TRUE; }
BOOL CRSSubData::Update() { BOOL fRet = TRUE; BOOL fNeedUpdate = FALSE;
if (!_fHoldUpdate) { if (_IsValid()) { if (!_RSCVIsValidVersion()) { DWORD cbSizeOfData = _cbSizeOfData;
if (RSGetDWORDValue(RSCVGetSubKey(), TEXT("LastUpdate"), _GetTickLastUpdatePtr()) && RSGetBinaryValue(RSCVGetSubKey(), TEXT("Cache"), (PBYTE)_GetDataPtr(), &cbSizeOfData)) { if (cbSizeOfData != _cbSizeOfData) { fNeedUpdate = TRUE; } else { _RSCVUpdateVersionOnCacheRead(); } } else { fNeedUpdate = TRUE; } }
// Is the information expired?
if (!fNeedUpdate && _IsExpired()) { // Yes
fNeedUpdate = TRUE; } }
if (!_IsValid() || fNeedUpdate) { Invalidate();
fRet = CSubData::Update();
if (fRet) { _Propagate(); } } }
return fRet; }
BOOL CRSSubData::Propagate() { return _Propagate(); }
BOOL CRSSubData::ExistInReg() { return RSSubKeyExist(RSCVGetSubKey()); }
void CRSSubData::WipeReg() { RSDeleteSubKey(RSCVGetSubKey()); }
void CRSSubData::Invalidate() { _RSCVIncrementRegVersion();
CSubData::Invalidate(); }
CRSSubData::CRSSubData() {}
void CRSSubData::_RSCVDeleteRegCache() { RSDeleteValue(RSCVGetSubKey(), TEXT("LastUpdate")); RSDeleteValue(RSCVGetSubKey(), TEXT("Cache")); }
BOOL CRSSubData::_Propagate() { RSSetDWORDValue(RSCVGetSubKey(), TEXT("LastUpdate"), _GetTickLastUpdate()); RSSetBinaryValue(RSCVGetSubKey(), TEXT("Cache"), (PBYTE)_GetDataPtr(), _cbSizeOfData);
// HACKHACK - we increment twice, because it dont work if we do it only once.
_RSCVUpdateVersionOnCacheWrite(); _RSCVUpdateVersionOnCacheWrite();
return TRUE; }
BOOL CRSSubData::_RSSDGetDataFromReg() { DWORD cbSizeOfData = _cbSizeOfData;
return RSGetBinaryValue(RSCVGetSubKey(), TEXT("Cache"), (PBYTE)_GetDataPtr(), &cbSizeOfData); }
void CRSSubData::_SetSizeOfData(DWORD cbSizeOfData) { _cbSizeOfData = cbSizeOfData; }
DWORD CRSSubData::_GetSizeOfData() { return _cbSizeOfData; }
|