143 lines
3.2 KiB
C++
143 lines
3.2 KiB
C++
|
#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;
|
||
|
}
|