Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

186 lines
4.7 KiB

//+-------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1997 - 1998.
//
// File: regauto.hxx
//
// Contents: CRegAutomatic class
// CRegAutoStringValue
// CRegAutoDWORDValue
//
// History: 23 Oct 97 AlanW Created
// 14 Aug 98 KLam Inlined methods
//
//--------------------------------------------------------------------------
#pragma once
#include <regacc.hxx>
#include <regevent.hxx>
//+-------------------------------------------------------------------------
//
// Class: CRegAutomatic
//
// Purpose: A base class for an automatically updating registry value(s)
//
// History: 23 Oct 97 AlanW Created
// 14 Aug 98 KLam Inlined CheckIfUpdated
//
//--------------------------------------------------------------------------
class CRegAutomatic : protected CRegChangeEvent
{
public:
CRegAutomatic( const WCHAR * wcsRegKey ) :
CRegChangeEvent( wcsRegKey ),
_mutex( )
{
}
~CRegAutomatic()
{
}
// check if reg event fired. If so, call derived ReadRegValues().
BOOL CheckIfUpdated( )
{
CLock lock( _mutex );
ULONG res = WaitForSingleObject( GetEventHandle(), 0 );
if ( WAIT_OBJECT_0 == res )
{
ReadRegValues();
Reset();
}
return (WAIT_OBJECT_0 == res);
}
virtual void ReadRegValues() = 0;
protected:
CMutexSem _mutex;
};
//+-------------------------------------------------------------------------
//
// Class: CRegAutoStringValue
//
// Purpose: An automatically updating registry value of type REG_SZ
//
// Notes: The value is assumed to fit in MAX_PATH characters.
// Careful casting away const since the class maintains
// pointers to the strings passed into the constructor.
//
// History: 23 Oct 97 AlanW Created
// 14 Aug 98 KLam Changed inheritance to public to allow
// access to CheckIfUpdated
// Inlined ReadRegValues
//
//--------------------------------------------------------------------------
class CRegAutoStringValue : public CRegAutomatic
{
public:
CRegAutoStringValue( const WCHAR * wcsRegKey,
const WCHAR * wcsRegValueName,
const WCHAR * wcsDefaultValue = 0 ) :
CRegAutomatic( wcsRegKey ),
_pwszRegValueName( wcsRegValueName ),
_pwszDefaultValue( wcsDefaultValue )
{
ReadRegValues();
}
~CRegAutoStringValue()
{
}
const ULONG Get( WCHAR *pwc, ULONG cch )
{
CheckIfUpdated();
CLock lock( _mutex );
// copy the whole string under lock
ULONG cchBuf = wcslen( _awchValue );
if ( cch > cchBuf )
wcscpy( pwc, _awchValue );
return cchBuf;
}
void ReadRegValues()
{
CRegAccess reg( RTL_REGISTRY_ABSOLUTE, GetKeyName() );
XPtrST<WCHAR> xwszValue( reg.Read( _pwszRegValueName, _pwszDefaultValue ) );
wcsncpy( _awchValue, xwszValue.GetPointer(), MAX_PATH );
}
private:
const WCHAR * _pwszRegValueName;
const WCHAR * _pwszDefaultValue;
WCHAR _awchValue[MAX_PATH];
};
//+-------------------------------------------------------------------------
//
// Class: CRegAutoDWORDValue
//
// Purpose: An automatically updating registry value of type REG_DWORD
//
// Notes: Careful casting away const since the class maintains
// pointers to the strings passed into the constructor.
//
// History: 13 Aug 98 KLam Created
//
//--------------------------------------------------------------------------
class CRegAutoDWORDValue : public CRegAutomatic
{
public:
CRegAutoDWORDValue( const WCHAR * wcsRegKey,
const WCHAR * wcsRegValueName,
DWORD dwDefaultValue ) :
CRegAutomatic( wcsRegKey ),
_pwszRegValueName( wcsRegValueName ),
_dwDefaultValue( dwDefaultValue )
{
ReadRegValues();
}
~CRegAutoDWORDValue()
{
}
BOOL Get ( DWORD *pdw )
{
BOOL fUpdated = CheckIfUpdated();
InterlockedExchange ( (long *)pdw, _dwValue );
return fUpdated;
}
void ReadRegValues()
{
CRegAccess reg( RTL_REGISTRY_ABSOLUTE, GetKeyName() );
_dwValue = reg.Read ( _pwszRegValueName, _dwDefaultValue );
}
private:
const WCHAR * _pwszRegValueName;
DWORD _dwDefaultValue;
DWORD _dwValue;
};