/*
** Command & Conquer Generals(tm)
** Copyright 2025 Electronic Arts Inc.
**
** This program is free software: you can redistribute it and/or modify
** it under the terms of the GNU General Public License as published by
** the Free Software Foundation, either version 3 of the License, or
** (at your option) any later version.
**
** This program is distributed in the hope that it will be useful,
** but WITHOUT ANY WARRANTY; without even the implied warranty of
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
** GNU General Public License for more details.
**
** You should have received a copy of the GNU General Public License
** along with this program. If not, see .
*/
/***********************************************************************************************
*** C O N F I D E N T I A L --- W E S T W O O D S T U D I O S ***
***********************************************************************************************
* *
* Project Name : Westwood Library *
* *
* $Archive:: /Commando/Code/wwlib/registry.cpp $*
* *
* $Author:: Patrick $*
* *
* $Modtime:: 8/16/01 11:40a $*
* *
* $Revision:: 10 $*
* *
*---------------------------------------------------------------------------------------------*
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
#include "registry.h"
#include
#include
//#include "wwdebug.h"
/*
**
*/
RegistryClass::RegistryClass( const char * sub_key ) :
IsValid( false )
{
DWORD disposition;
HKEY key;
assert( sizeof(HKEY) == sizeof(int) );
if (::RegCreateKeyEx( HKEY_LOCAL_MACHINE, sub_key,
0, NULL, 0, KEY_ALL_ACCESS, NULL,
&key, &disposition ) == ERROR_SUCCESS) {
IsValid = true;
Key = (int)key;
}
}
RegistryClass::~RegistryClass( void )
{
if ( IsValid ) {
if (::RegCloseKey( (HKEY)Key ) != ERROR_SUCCESS) { // Close the reg key
}
IsValid = false;
}
}
int RegistryClass::Get_Int( const char * name, int def_value )
{
assert( IsValid );
DWORD type, data = 0, data_len = sizeof( data );
if (( ::RegQueryValueEx( (HKEY)Key, name, NULL, &type, (LPBYTE)&data, &data_len ) ==
ERROR_SUCCESS ) && ( type == REG_DWORD )) {
} else {
data = def_value;
}
return data;
}
void RegistryClass::Set_Int( const char * name, int value )
{
assert( IsValid );
if (::RegSetValueEx( (HKEY)Key, name, 0, REG_DWORD, (LPBYTE)&value, sizeof( DWORD ) ) !=
ERROR_SUCCESS) {
}
}
bool RegistryClass::Get_Bool( const char * name, bool def_value )
{
return (Get_Int( name, def_value ) != 0);
}
void RegistryClass::Set_Bool( const char * name, bool value )
{
Set_Int( name, value ? 1 : 0 );
}
float RegistryClass::Get_Float( const char * name, float def_value )
{
assert( IsValid );
float data = 0;
DWORD type, data_len = sizeof( data );
if (( ::RegQueryValueEx( (HKEY)Key, name, NULL, &type, (LPBYTE)&data, &data_len ) ==
ERROR_SUCCESS ) && ( type == REG_DWORD )) {
} else {
data = def_value;
}
return data;
}
void RegistryClass::Set_Float( const char * name, float value )
{
assert( IsValid );
if (::RegSetValueEx( (HKEY)Key, name, 0, REG_DWORD, (LPBYTE)&value, sizeof( DWORD ) ) !=
ERROR_SUCCESS) {
}
}
int RegistryClass::Get_Bin_Size( const char * name )
{
assert( IsValid );
unsigned long size = 0;
::RegQueryValueEx( (HKEY)Key, name, NULL, NULL, NULL, &size );
return size;
}
void RegistryClass::Get_Bin( const char * name, void *buffer, int buffer_size )
{
assert( IsValid );
assert( buffer != NULL );
assert( buffer_size > 0 );
unsigned long size = buffer_size;
::RegQueryValueEx( (HKEY)Key, name, NULL, NULL, (LPBYTE)buffer, &size );
return ;
}
void RegistryClass::Set_Bin( const char * name, const void *buffer, int buffer_size )
{
assert( IsValid );
assert( buffer != NULL );
assert( buffer_size > 0 );
::RegSetValueEx( (HKEY)Key, name, 0, REG_BINARY, (LPBYTE)buffer, buffer_size );
return ;
}
void RegistryClass::Get_String( const char * name, StringClass &string, const char *default_string )
{
assert( IsValid );
string = (default_string == NULL) ? "" : default_string;
//
// Get the size of the entry
//
DWORD data_size = 0;
DWORD type = 0;
LONG result = ::RegQueryValueEx ((HKEY)Key, name, NULL, &type, NULL, &data_size);
if (result == ERROR_SUCCESS && type == REG_SZ) {
//
// Read the entry from the registry
//
::RegQueryValueEx ((HKEY)Key, name, NULL, &type,
(LPBYTE)string.Get_Buffer (data_size), &data_size);
}
return ;
}
char *RegistryClass::Get_String( const char * name, char *value, int value_size,
const char * default_string )
{
assert( IsValid );
DWORD type = 0;
if (( ::RegQueryValueEx( (HKEY)Key, name, NULL, &type, (LPBYTE)value, (DWORD*)&value_size ) ==
ERROR_SUCCESS ) && ( type == REG_SZ )) {
} else {
//*value = 0;
//value = (char *) default_string;
if (default_string == NULL) {
*value = 0;
} else {
assert(strlen(default_string) < (unsigned int) value_size);
strcpy(value, default_string);
}
}
return value;
}
void RegistryClass::Set_String( const char * name, const char *value )
{
assert( IsValid );
int size = strlen( value ) + 1; // must include NULL
if (::RegSetValueEx( (HKEY)Key, name, 0, REG_SZ, (LPBYTE)value, size ) !=
ERROR_SUCCESS ) {
}
}
void RegistryClass::Get_Value_List( DynamicVectorClass &list )
{
char value_name[128];
//
// Simply enumerate all the values in this key
//
int index = 0;
unsigned long sizeof_name = sizeof (value_name);
while (::RegEnumValue ((HKEY)Key, index ++,
value_name, &sizeof_name, 0, NULL, NULL, NULL) == ERROR_SUCCESS)
{
sizeof_name = sizeof (value_name);
//
// Add this value name to the list
//
list.Add( value_name );
}
return ;
}
void RegistryClass::Delete_Value( const char * name)
{
::RegDeleteValue( (HKEY)Key, name );
return ;
}
void RegistryClass::Deleta_All_Values( void )
{
//
// Build a list of the values in this key
//
DynamicVectorClass value_list;
Get_Value_List (value_list);
//
// Loop over and delete each value
//
for (int index = 0; index < value_list.Count (); index ++) {
Delete_Value( value_list[index] );
}
return ;
}
void RegistryClass::Get_String( const WCHAR * name, WideStringClass &string, const WCHAR *default_string )
{
assert( IsValid );
string = (default_string == NULL) ? L"" : default_string;
//
// Get the size of the entry
//
DWORD data_size = 0;
DWORD type = 0;
LONG result = ::RegQueryValueExW ((HKEY)Key, name, NULL, &type, NULL, &data_size);
if (result == ERROR_SUCCESS && type == REG_SZ) {
//
// Read the entry from the registry
//
::RegQueryValueExW ((HKEY)Key, name, NULL, &type,
(LPBYTE)string.Get_Buffer ((data_size / 2) + 1), &data_size);
}
return ;
}
void RegistryClass::Set_String( const WCHAR * name, const WCHAR *value )
{
assert( IsValid );
//
// Determine the size
//
int size = wcslen( value ) + 1;
size = size * 2;
//
// Set the registry key
//
::RegSetValueExW ( (HKEY)Key, name, 0, REG_SZ, (LPBYTE)value, size );
return ;
}