This repository has been archived on 2025-02-27. You can view files and clone it, but cannot push or open issues or pull requests.
CnC_Renegade/Code/Installer/RegistryManager.cpp

934 lines
49 KiB
C++
Raw Permalink Normal View History

/*
** Command & Conquer Renegade(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 <http://www.gnu.org/licenses/>.
*/
/***********************************************************************************************
*** Confidential - Westwood Studios ***
***********************************************************************************************
* *
* Project Name : Installer *
* *
* $Archive:: /Commando/Code/Installer/RegistryManager.cpp $*
* *
* $Author:: Ian_l $*
* *
* $Modtime:: 1/25/02 5:09p $*
* *
* $Revision:: 11 $*
* *
*---------------------------------------------------------------------------------------------*
* Functions: *
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
// Includes.
#include "Installer.h"
#include "ErrorHandler.h"
#include "RegistryManager.h"
#include "Resource.h"
#include "Translator.h"
#include "Utilities.h"
#include "Win.h"
#include <mmsystem.h>
#include <winreg.h>
// Defines.
#define SHELL_FOLDERS_KEY "Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders"
#define PROGRAMS_PATH_KEY "Programs"
#define DESKTOP_PATH_KEY "Desktop"
#define SOFTWARE_KEY "Software"
#define WESTWOOD_KEY "Westwood"
#define NAME_KEY "Name"
#define DESKTOP_SHORTCUT_PATHNAME_KEY "Desktop" // Pathname of shortcut file to launch game.
#define FOLDER_PATH_KEY "FolderPath"
#define INSTALL_PATHNAME_KEY "InstallPath" // NOTE: This is a misnomer. Actually refers to product pathname.
#define LANGUAGE_KEY "Language"
#define SERIAL_KEY "Serial"
#define SKU_KEY "SKU"
#define VERSION_KEY "Version"
#define WOLSETTINGS_KEY "WOLSettings"
#define URL_KEY "URL"
#define WOLAPI_KEY "WOLAPI"
#define WOLREGISTER_KEY "Register"
#define WOLBROWSER_KEY "WOLBrowser"
#define USAGE_KEY "Usage"
#define MICROSOFT_KEY "Microsoft"
#define WINDOWS_KEY "Windows"
#define CURRENT_VERSION_KEY "CurrentVersion"
#define APP_PATHS_KEY "App Paths"
#define PATH_KEY "Path"
#define UNINSTALL_KEY "Uninstall"
#define DISPLAY_NAME_KEY "DisplayName"
#define UNINSTALLER_FILENAME_KEY "UninstallString"
#define EXTENSIONS_KEY "Extensions"
#define DOCUMENT_KEY "doc"
#define WESTWOOD_CHAT_KEY "Wchat"
#define NICKNAME_INDEX_KEY "Nick%u"
#define NICKNAME_KEY "Nick"
#define PASSWORD_KEY "Pass"
#define PREFERRED_LOGIN_KEY "AutoLogin"
#define OPTIONS_KEY "Options"
// Internet Game Room flags.
#define IGR_NO_AUTO_LOGIN 0x01
#define IGR_NEVER_STORE_NICKS 0x02
#define IGR_NEVER_RUN_REG_APP 0x04
#define IGR_ALL (IGR_NO_AUTO_LOGIN | IGR_NEVER_STORE_NICKS | IGR_NEVER_RUN_REG_APP)
#define IGR_NONE 0x00
// Singleton.
RegistryManagerClass _RegistryManager;
/***********************************************************************************************
* RegistryManagerClass::RegistryManagerClass -- *
* *
* INPUT: *
* *
* OUTPUT: *
* *
* WARNINGS: *
* *
* HISTORY: *
* 08/22/01 IML : Created. *
*=============================================================================================*/
RegistryManagerClass::RegistryManagerClass()
{
WOLKeys [WOLAPI_COMPONENT] = WOLAPI_KEY;
WOLKeys [WOLREGISTER_COMPONENT] = WOLREGISTER_KEY;
WOLKeys [WOLBROWSER_COMPONENT] = WOLBROWSER_KEY;
}
/***********************************************************************************************
* RegistryManagerClass::Get_Folder_Path -- *
* *
* INPUT: *
* *
* OUTPUT: *
* *
* WARNINGS: *
* *
* HISTORY: *
* 08/22/01 IML : Created. *
*=============================================================================================*/
bool RegistryManagerClass::Get_Folder_Path (WideStringClass &path)
{
return (Get_String (HKEY_CURRENT_USER, &path, SHELL_FOLDERS_KEY, PROGRAMS_PATH_KEY, NULL));
}
/***********************************************************************************************
* RegistryManagerClass::Get_Desktop_Path -- *
* *
* INPUT: *
* *
* OUTPUT: *
* *
* WARNINGS: *
* *
* HISTORY: *
* 08/22/01 IML : Created. *
*=============================================================================================*/
bool RegistryManagerClass::Get_Desktop_Path (WideStringClass &path)
{
return (Get_String (HKEY_CURRENT_USER, &path, SHELL_FOLDERS_KEY, DESKTOP_PATH_KEY, NULL));
}
/***********************************************************************************************
* RegistryManagerClass::Get_Target_Game_Pathname -- *
* *
* INPUT: *
* *
* OUTPUT: *
* *
* WARNINGS: *
* *
* HISTORY: *
* 08/22/01 IML : Created. *
*=============================================================================================*/
bool RegistryManagerClass::Get_Target_Game_Pathname (WideStringClass &pathname)
{
return (Get_String (HKEY_LOCAL_MACHINE, &pathname, SOFTWARE_KEY, WESTWOOD_KEY, RxStringClass (IDS_GAME_PRODUCT_KEY), INSTALL_PATHNAME_KEY, NULL));
}
/***********************************************************************************************
* RegistryManagerClass::Get_Target_Game_Path -- *
* *
* INPUT: *
* *
* OUTPUT: *
* *
* WARNINGS: *
* *
* HISTORY: *
* 08/22/01 IML : Created. *
*=============================================================================================*/
bool RegistryManagerClass::Get_Target_Game_Path (WideStringClass &path)
{
bool success = false;
WideStringClass pathname;
if (Get_Target_Game_Pathname (pathname)) {
// Remove filename.
path = pathname;
Remove_Trailing_Name (path);
success = true;
}
return (success);
}
/***********************************************************************************************
* RegistryManagerClass::Get_Target_Game_Folder -- *
* *
* INPUT: *
* *
* OUTPUT: *
* *
* WARNINGS: *
* *
* HISTORY: *
* 08/22/01 IML : Created. *
*=============================================================================================*/
bool RegistryManagerClass::Get_Target_Game_Folder (WideStringClass &folder)
{
bool success = false;
WideStringClass path, folderpath;
WCHAR *suffixroot;
if (Get_String (HKEY_LOCAL_MACHINE, &path, SOFTWARE_KEY, WESTWOOD_KEY, RxStringClass (IDS_GAME_PRODUCT_KEY), FOLDER_PATH_KEY, NULL)) {
Get_Folder_Path (folderpath);
suffixroot = Extract_Suffix_Root (path, folderpath);
if (suffixroot != NULL) {
folder = path;
success = true;
}
}
return (success);
}
/***********************************************************************************************
* RegistryManagerClass::Get_Target_WOL_Pathname -- *
* *
* INPUT: *
* *
* OUTPUT: *
* *
* WARNINGS: *
* *
* HISTORY: *
* 08/22/01 IML : Created. *
*=============================================================================================*/
bool RegistryManagerClass::Get_Target_WOL_Pathname (WOLComponentEnum wolcomponent, WideStringClass &pathname)
{
return (Get_String (HKEY_LOCAL_MACHINE, &pathname, SOFTWARE_KEY, WESTWOOD_KEY, WOLKeys [wolcomponent], INSTALL_PATHNAME_KEY, NULL));
}
/***********************************************************************************************
* RegistryManagerClass::Get_Target_WOL_Path -- *
* *
* INPUT: *
* *
* OUTPUT: *
* *
* WARNINGS: *
* *
* HISTORY: *
* 08/22/01 IML : Created. *
*=============================================================================================*/
bool RegistryManagerClass::Get_Target_WOL_Path (WOLComponentEnum wolcomponent, WideStringClass &path)
{
bool success = false;
WideStringClass pathname;
if (Get_Target_WOL_Pathname (wolcomponent, pathname)) {
// Remove filename.
path = pathname;
Remove_Trailing_Name (path);
success = true;
}
return (success);
}
/***********************************************************************************************
* RegistryManagerClass::Get_Target_WOL_Folder -- *
* *
* INPUT: *
* *
* OUTPUT: *
* *
* WARNINGS: *
* *
* HISTORY: *
* 08/22/01 IML : Created. *
*=============================================================================================*/
bool RegistryManagerClass::Get_Target_WOL_Folder (WOLComponentEnum wolcomponent, WideStringClass &folder)
{
bool success = false;
WideStringClass path, folderpath;
WCHAR *suffixroot;
if (Get_String (HKEY_LOCAL_MACHINE, &path, SOFTWARE_KEY, WESTWOOD_KEY, WOLKeys [wolcomponent], FOLDER_PATH_KEY, NULL)) {
Get_Folder_Path (folderpath);
suffixroot = Extract_Suffix_Root (path, folderpath);
if (suffixroot != NULL) {
folder = path;
success = true;
}
}
return (success);
}
/***********************************************************************************************
* RegistryManagerClass::Get_WOL_Version -- *
* *
* INPUT: *
* *
* OUTPUT: *
* *
* WARNINGS: *
* *
* HISTORY: *
* 08/22/01 IML : Created. *
*=============================================================================================*/
bool RegistryManagerClass::Get_Target_WOL_Version (WOLComponentEnum wolcomponent, DWORD &version)
{
return (Get_Value (HKEY_LOCAL_MACHINE, &version, SOFTWARE_KEY, WESTWOOD_KEY, WOLKeys [wolcomponent], VERSION_KEY, NULL));
}
/***********************************************************************************************
* RegistryManagerClass::Use_IGR_Settings -- *
* *
* INPUT: *
* *
* OUTPUT: *
* *
* WARNINGS: *
* *
* HISTORY: *
* 08/22/01 IML : Created. *
*=============================================================================================*/
bool RegistryManagerClass::Use_IGR_Settings (bool &useigrsettings)
{
bool success;
DWORD igrsettings;
success = Get_Value (HKEY_LOCAL_MACHINE, &igrsettings, SOFTWARE_KEY, WESTWOOD_KEY, WOLAPI_KEY, OPTIONS_KEY, NULL);
if (success) {
useigrsettings = (igrsettings == IGR_ALL);
}
return (success);
}
/***********************************************************************************************
* RegistryManagerClass::Register_Game -- *
* *
* INPUT: *
* *
* OUTPUT: *
* *
* WARNINGS: *
* *
* HISTORY: *
* 08/22/01 IML : Created. *
*=============================================================================================*/
void RegistryManagerClass::Register_Game (const WideStringClass &name,
const WideStringClass &installpathname,
const WideStringClass &folderpath,
const WideStringClass &desktopshortcutpathname,
DWORD languageid,
const StringClass &serialnumber,
DWORD sku,
DWORD version)
{
DWORD maskedsku;
RxStringClass gameproductkey (IDS_GAME_PRODUCT_KEY);
WideStringClass wideserialnumber (serialnumber);
WideStringClass s, url;
// The input SKU also contains the languageid in the LSB, so mask this off.
maskedsku = sku & 0xffffff00;
Set_String (HKEY_LOCAL_MACHINE, name, SOFTWARE_KEY, WESTWOOD_KEY, gameproductkey, NAME_KEY, NULL);
Set_String (HKEY_LOCAL_MACHINE, installpathname, SOFTWARE_KEY, WESTWOOD_KEY, gameproductkey, INSTALL_PATHNAME_KEY, NULL);
Set_String (HKEY_LOCAL_MACHINE, folderpath, SOFTWARE_KEY, WESTWOOD_KEY, gameproductkey, FOLDER_PATH_KEY, NULL);
Set_String (HKEY_LOCAL_MACHINE, desktopshortcutpathname, SOFTWARE_KEY, WESTWOOD_KEY, gameproductkey, DESKTOP_SHORTCUT_PATHNAME_KEY, NULL);
Set_Value (HKEY_LOCAL_MACHINE, languageid, SOFTWARE_KEY, WESTWOOD_KEY, gameproductkey, LANGUAGE_KEY, NULL);
Set_String (HKEY_LOCAL_MACHINE, wideserialnumber, SOFTWARE_KEY, WESTWOOD_KEY, gameproductkey, SERIAL_KEY, NULL);
Set_Value (HKEY_LOCAL_MACHINE, sku, SOFTWARE_KEY, WESTWOOD_KEY, gameproductkey, SKU_KEY, NULL);
Set_Value (HKEY_LOCAL_MACHINE, version, SOFTWARE_KEY, WESTWOOD_KEY, gameproductkey, VERSION_KEY, NULL);
s = L"http://renchat2.westwood.com/cgi-bin/cgiclient?ren_clan_manager&request=expand_template&Template=index.html&SKU=%d&LANGCODE=%d&embedded=1";
url.Format (s, maskedsku, languageid);
Set_String (HKEY_LOCAL_MACHINE, url, SOFTWARE_KEY, WESTWOOD_KEY, gameproductkey, WOLSETTINGS_KEY, URL_KEY, "BattleClans", NULL);
s = L"http://renchat2.westwood.com/cgi-bin/cgiclient?ren_clan_manager&request=expand_template&Template=index.html&SKU=%d&LANGCODE=%d";
url.Format (s, maskedsku, languageid);
Set_String (HKEY_LOCAL_MACHINE, url, SOFTWARE_KEY, WESTWOOD_KEY, gameproductkey, WOLSETTINGS_KEY, URL_KEY, "BattleClansX", NULL);
s = L"http://renchat2.westwood.com/renegade_embedded/index.html";
url.Format (s);
Set_String (HKEY_LOCAL_MACHINE, url, SOFTWARE_KEY, WESTWOOD_KEY, gameproductkey, WOLSETTINGS_KEY, URL_KEY, "Ladder", NULL);
s = L"http://renchat2.westwood.com/renegade/index.html";
url.Format (s);
Set_String (HKEY_LOCAL_MACHINE, url, SOFTWARE_KEY, WESTWOOD_KEY, gameproductkey, WOLSETTINGS_KEY, URL_KEY, "LadderX", NULL);
s = L"http://battleclans.westwood.com/cgi-bin/cgiclient?rosetta&request=do_netstatus&LANGCODE=%d&SKU=%d&embedded=1";
url.Format (s, languageid, maskedsku);
Set_String (HKEY_LOCAL_MACHINE, url, SOFTWARE_KEY, WESTWOOD_KEY, gameproductkey, WOLSETTINGS_KEY, URL_KEY, "NetStatus", NULL);
s = L"http://battleclans.westwood.com/cgi-bin/cgiclient?rosetta&request=do_netstatus&LANGCODE=%d&SKU=%d";
url.Format (s, languageid, maskedsku);
Set_String (HKEY_LOCAL_MACHINE, url, SOFTWARE_KEY, WESTWOOD_KEY, gameproductkey, WOLSETTINGS_KEY, URL_KEY, "NetStatusX", NULL);
s = L"http://battleclans.westwood.com/cgi-bin/cgiclient?rosetta&request=do_news&LANGCODE=%d&SKU=%d&embedded=1";
url.Format (s, languageid, maskedsku);
Set_String (HKEY_LOCAL_MACHINE, url, SOFTWARE_KEY, WESTWOOD_KEY, gameproductkey, WOLSETTINGS_KEY, URL_KEY, "News", NULL);
s = L"http://battleclans.westwood.com/cgi-bin/cgiclient?rosetta&request=do_news&LANGCODE=%d&SKU=%d";
url.Format (s, languageid, maskedsku);
Set_String (HKEY_LOCAL_MACHINE, url, SOFTWARE_KEY, WESTWOOD_KEY, gameproductkey, WOLSETTINGS_KEY, URL_KEY, "NewsX", NULL);
s = L"http://renchat2.westwood.com/cgi-bin/cgiclient?live_ren_register&request=expand_template&Template=newreg_menu.html&LANGCODE=%d&embedded=1&SKU=%d";
url.Format (s, languageid, maskedsku);
Set_String (HKEY_LOCAL_MACHINE, url, SOFTWARE_KEY, WESTWOOD_KEY, gameproductkey, WOLSETTINGS_KEY, URL_KEY, "Signup", NULL);
s = L"http://renchat2.westwood.com/cgi-bin/cgiclient?live_ren_register&request=expand_template&Template=newreg_menu.html&LANGCODE=%d&SKU=%d";
url.Format (s, languageid, maskedsku);
Set_String (HKEY_LOCAL_MACHINE, url, SOFTWARE_KEY, WESTWOOD_KEY, gameproductkey, WOLSETTINGS_KEY, URL_KEY, "SignupX", NULL);
// Register the executable with the OS.
s = installpathname;
Remove_Trailing_Name (s);
Set_String (HKEY_LOCAL_MACHINE, s, SOFTWARE_KEY, MICROSOFT_KEY, WINDOWS_KEY, CURRENT_VERSION_KEY, APP_PATHS_KEY, RxStringClass (IDS_GAME_EXECUTABLE_FILENAME), PATH_KEY, NULL);
Set_String (HKEY_LOCAL_MACHINE, installpathname, SOFTWARE_KEY, MICROSOFT_KEY, WINDOWS_KEY, CURRENT_VERSION_KEY, APP_PATHS_KEY, RxStringClass (IDS_GAME_EXECUTABLE_FILENAME), "", NULL);
// Register the uninstall program with the OS.
Set_String (HKEY_LOCAL_MACHINE, TxWideStringClass (IDS_VERBOSE_GAME_PRODUCT_NAME), SOFTWARE_KEY, MICROSOFT_KEY, WINDOWS_KEY, CURRENT_VERSION_KEY, UNINSTALL_KEY, RxStringClass (IDS_GAME_PRODUCT_KEY), DISPLAY_NAME_KEY, NULL);
s += L"\\";
s += RxWideStringClass (IDS_GAME_UNINSTALL_FILENAME);
Set_String (HKEY_LOCAL_MACHINE, s, SOFTWARE_KEY, MICROSOFT_KEY, WINDOWS_KEY, CURRENT_VERSION_KEY, UNINSTALL_KEY, RxStringClass (IDS_GAME_PRODUCT_KEY), UNINSTALLER_FILENAME_KEY, NULL);
}
/***********************************************************************************************
* RegistryManagerClass::Register_WOLAPI -- *
* *
* INPUT: *
* *
* OUTPUT: *
* *
* WARNINGS: *
* *
* HISTORY: *
* 08/22/01 IML : Created. *
*=============================================================================================*/
void RegistryManagerClass::Register_WOLAPI (const WideStringClass &folderpath,
const WideStringClass &installpathname,
const WideStringClass &name,
DWORD sku,
DWORD version,
bool useigrsettings)
{
const DWORD igrsettings [] = {IGR_NONE, IGR_ALL};
WideStringClass s;
Set_String (HKEY_LOCAL_MACHINE, folderpath, SOFTWARE_KEY, WESTWOOD_KEY, WOLAPI_KEY, FOLDER_PATH_KEY, NULL);
Set_String (HKEY_LOCAL_MACHINE, installpathname, SOFTWARE_KEY, WESTWOOD_KEY, WOLAPI_KEY, INSTALL_PATHNAME_KEY, NULL);
Set_String (HKEY_LOCAL_MACHINE, name, SOFTWARE_KEY, WESTWOOD_KEY, WOLAPI_KEY, NAME_KEY, NULL);
Set_Value (HKEY_LOCAL_MACHINE, sku, SOFTWARE_KEY, WESTWOOD_KEY, WOLAPI_KEY, SKU_KEY, NULL);
Set_Value (HKEY_LOCAL_MACHINE, version, SOFTWARE_KEY, WESTWOOD_KEY, WOLAPI_KEY, VERSION_KEY, NULL);
// Register the uninstall program with the OS.
Set_String (HKEY_LOCAL_MACHINE, TxWideStringClass (IDS_VERBOSE_WOL_PRODUCT_NAME), SOFTWARE_KEY, MICROSOFT_KEY, WINDOWS_KEY, CURRENT_VERSION_KEY, UNINSTALL_KEY, WOLAPI_KEY, DISPLAY_NAME_KEY, NULL);
s = installpathname;
Remove_Trailing_Name (s);
s += L"\\";
s += RxWideStringClass (IDS_WOL_UNINSTALL_FILENAME);
Set_String (HKEY_LOCAL_MACHINE, s, SOFTWARE_KEY, MICROSOFT_KEY, WINDOWS_KEY, CURRENT_VERSION_KEY, UNINSTALL_KEY, WOLAPI_KEY, UNINSTALLER_FILENAME_KEY, NULL);
// Write the game room settings.
Set_Value (HKEY_LOCAL_MACHINE, igrsettings [useigrsettings], SOFTWARE_KEY, WESTWOOD_KEY, WOLAPI_KEY, OPTIONS_KEY, NULL);
}
/***********************************************************************************************
* RegistryManagerClass::Register_WOLRegister -- *
* *
* INPUT: *
* *
* OUTPUT: *
* *
* WARNINGS: *
* *
* HISTORY: *
* 08/22/01 IML : Created. *
*=============================================================================================*/
void RegistryManagerClass::Register_WOLRegister (const WideStringClass &folderpath,
const WideStringClass &installpathname,
const WideStringClass &name,
DWORD sku,
DWORD version)
{
Set_String (HKEY_LOCAL_MACHINE, folderpath, SOFTWARE_KEY, WESTWOOD_KEY, WOLREGISTER_KEY, FOLDER_PATH_KEY, NULL);
Set_String (HKEY_LOCAL_MACHINE, installpathname, SOFTWARE_KEY, WESTWOOD_KEY, WOLREGISTER_KEY, INSTALL_PATHNAME_KEY, NULL);
Set_String (HKEY_LOCAL_MACHINE, name, SOFTWARE_KEY, WESTWOOD_KEY, WOLREGISTER_KEY, NAME_KEY, NULL);
Set_Value (HKEY_LOCAL_MACHINE, sku, SOFTWARE_KEY, WESTWOOD_KEY, WOLREGISTER_KEY, SKU_KEY, NULL);
Set_Value (HKEY_LOCAL_MACHINE, version, SOFTWARE_KEY, WESTWOOD_KEY, WOLREGISTER_KEY, VERSION_KEY, NULL);
}
/***********************************************************************************************
* RegistryManagerClass::Register_WOLBrowser -- *
* *
* INPUT: *
* *
* OUTPUT: *
* *
* WARNINGS: *
* *
* HISTORY: *
* 08/22/01 IML : Created. *
*=============================================================================================*/
void RegistryManagerClass::Register_WOLBrowser (const WideStringClass &installpathname,
const WideStringClass &name,
DWORD version)
{
Set_String (HKEY_LOCAL_MACHINE, installpathname, SOFTWARE_KEY, WESTWOOD_KEY, WOLBROWSER_KEY, INSTALL_PATHNAME_KEY, NULL);
Set_String (HKEY_LOCAL_MACHINE, name, SOFTWARE_KEY, WESTWOOD_KEY, WOLBROWSER_KEY, NAME_KEY, NULL);
Set_Value (HKEY_LOCAL_MACHINE, version, SOFTWARE_KEY, WESTWOOD_KEY, WOLBROWSER_KEY, VERSION_KEY, NULL);
}
/***********************************************************************************************
* RegistryManagerClass::Update_WOLAPI -- *
* *
* INPUT: *
* *
* OUTPUT: *
* *
* WARNINGS: *
* *
* HISTORY: *
* 08/22/01 IML : Created. *
*=============================================================================================*/
void RegistryManagerClass::Update_WOLAPI()
{
DWORD keyindex, usagecount;
StringClass keyname;
keyindex = 0;
usagecount = 0;
while (Get_Key (HKEY_LOCAL_MACHINE, keyindex, &keyname, SOFTWARE_KEY, WESTWOOD_KEY, NULL)) {
DWORD sku;
WideStringClass serialnumber;
// If a SKU and a serial number exist...
if (Get_Value (HKEY_LOCAL_MACHINE, &sku, SOFTWARE_KEY, WESTWOOD_KEY, keyname, SKU_KEY, NULL)) {
if (Get_String (HKEY_LOCAL_MACHINE, &serialnumber, SOFTWARE_KEY, WESTWOOD_KEY, keyname, SERIAL_KEY, NULL)) {
WideStringClass widekeyname;
char skuname [MAX_NUMBER_STRING_LENGTH];
// Create a key for the key name under the WOLAPI key.
ltoa (sku, skuname, 10);
widekeyname = keyname;
Set_String (HKEY_LOCAL_MACHINE, widekeyname, SOFTWARE_KEY, WESTWOOD_KEY, WOLAPI_KEY, skuname, NAME_KEY, NULL);
usagecount++;
}
}
keyindex++;
}
// Update the WOLAPI usage count.
Set_Value (HKEY_LOCAL_MACHINE, usagecount, SOFTWARE_KEY, WESTWOOD_KEY, WOLAPI_KEY, USAGE_KEY, NULL);
}
/***********************************************************************************************
* RegistryManagerClass::Get_WOL_Account -- *
* *
* INPUT: *
* *
* OUTPUT: *
* *
* WARNINGS: *
* *
* HISTORY: *
* 08/22/01 IML : Created. *
*=============================================================================================*/
bool RegistryManagerClass::Get_WOL_Account (unsigned index, WideStringClass &name, WideStringClass &password)
{
unsigned nonemptyindex, i;
// Find the n'th key with a non-empty name string.
// NOTE: Conversion from zero-based to one-based index.
nonemptyindex = 0;
i = 1;
while (true) {
StringClass key;
key.Format (NICKNAME_INDEX_KEY, i);
if (Get_String (HKEY_CLASSES_ROOT, &name, WESTWOOD_CHAT_KEY, key, NICKNAME_KEY, "", NULL)) {
if (name != L"") {
if (index == nonemptyindex) {
return (Get_String (HKEY_CLASSES_ROOT, &password, WESTWOOD_CHAT_KEY, key, PASSWORD_KEY, "", NULL));
}
nonemptyindex++;
}
} else {
break;
}
i++;
}
// Key not found.
return (false);
}
/***********************************************************************************************
* RegistryManagerClass::Set_Preferred_WOL_Account -- *
* *
* INPUT: *
* *
* OUTPUT: *
* *
* WARNINGS: *
* *
* HISTORY: *
* 08/22/01 IML : Created. *
*=============================================================================================*/
void RegistryManagerClass::Set_Preferred_WOL_Account (const WideStringClass &accountname)
{
Set_String (HKEY_LOCAL_MACHINE, accountname, SOFTWARE_KEY, WESTWOOD_KEY, RxStringClass (IDS_GAME_PRODUCT_KEY), WOLSETTINGS_KEY, PREFERRED_LOGIN_KEY, NULL);
}
/***********************************************************************************************
* RegistryManagerClass::Get_Document_Application_Pathname -- *
* *
* INPUT: *
* *
* OUTPUT: *
* *
* WARNINGS: *
* *
* HISTORY: *
* 08/22/01 IML : Created. *
*=============================================================================================*/
bool RegistryManagerClass::Get_Document_Application_Pathname (WideStringClass &pathname)
{
return (Get_String (HKEY_CURRENT_USER, &pathname, SOFTWARE_KEY, MICROSOFT_KEY, WINDOWS_KEY, CURRENT_VERSION_KEY, EXTENSIONS_KEY, DOCUMENT_KEY, NULL));
}
/***********************************************************************************************
* RegistryManagerClass::Get_String -- *
* *
* INPUT: *
* *
* OUTPUT: *
* *
* WARNINGS: *
* *
* HISTORY: *
* 08/22/01 IML : Created. *
*=============================================================================================*/
bool RegistryManagerClass::Get_String (HKEY rootkey, WideStringClass *string, ...)
{
bool success = false;
va_list marker;
char *keyname, *nextkeyname;
StringClass keystring;
HKEY key;
va_start (marker, string);
keyname = va_arg (marker, char*);
if (keyname != NULL) {
// Concatenate all but the last key name.
nextkeyname = va_arg (marker, char*);
while (nextkeyname != NULL) {
if (keystring.Get_Length() > 0) keystring += "\\";
keystring += keyname;
keyname = nextkeyname;
nextkeyname = va_arg (marker, char*);
}
if (RegOpenKeyEx (rootkey, keystring, 0, KEY_ALL_ACCESS, &key) == ERROR_SUCCESS) {
DWORD type;
DWORD size;
if (RegQueryValueEx (key, keyname, NULL, &type, NULL, &size) == ERROR_SUCCESS) {
if (type == REG_SZ) {
StringClass multibytestring;
if (RegQueryValueEx (key, keyname, NULL, &type, (BYTE*) multibytestring.Get_Buffer (size), &size) == ERROR_SUCCESS) {
*string = multibytestring;
success = true;
}
}
}
RegCloseKey (key);
}
}
va_end (marker);
return (success);
}
/***********************************************************************************************
* RegistryManagerClass::Get_Value -- *
* *
* INPUT: *
* *
* OUTPUT: *
* *
* WARNINGS: *
* *
* HISTORY: *
* 08/22/01 IML : Created. *
*=============================================================================================*/
bool RegistryManagerClass::Get_Value (HKEY rootkey, DWORD *value, ...)
{
bool success = false;
va_list marker;
char *keyname, *nextkeyname;
StringClass keystring;
HKEY key;
va_start (marker, value);
keyname = va_arg (marker, char*);
if (keyname != NULL) {
// Concatenate all but the last key name.
nextkeyname = va_arg (marker, char*);
while (nextkeyname != NULL) {
if (keystring.Get_Length() > 0) {
keystring += "\\";
}
keystring += keyname;
keyname = nextkeyname;
nextkeyname = va_arg (marker, char*);
}
if (RegOpenKeyEx (rootkey, keystring, 0, KEY_ALL_ACCESS, &key) == ERROR_SUCCESS) {
DWORD type;
DWORD size;
if (RegQueryValueEx (key, keyname, NULL, &type, NULL, &size) == ERROR_SUCCESS) {
if (type == REG_DWORD) {
if (RegQueryValueEx (key, keyname, NULL, &type, (BYTE*) value, &size) == ERROR_SUCCESS) {
success = true;
}
}
}
RegCloseKey (key);
}
}
va_end (marker);
return (success);
}
/***********************************************************************************************
* RegistryManagerClass::Set_String -- *
* *
* INPUT: *
* *
* OUTPUT: *
* *
* WARNINGS: *
* *
* HISTORY: *
* 08/22/01 IML : Created. *
*=============================================================================================*/
bool _cdecl RegistryManagerClass::Set_String (HKEY rootkey, const WCHAR *string, ...)
{
HKEY key;
DWORD disposition;
bool success = false;
va_list marker;
char *keyname, *nextkeyname;
va_start (marker, string);
// Create subkeys (if necessary).
key = rootkey;
keyname = va_arg (marker, char*);
if (keyname != NULL) {
nextkeyname = va_arg (marker, char*);
while (true) {
if (nextkeyname == NULL) {
StringClass multibytestring (string);
if (RegSetValueEx (key, keyname, 0, REG_SZ, (BYTE*) multibytestring.Peek_Buffer(), multibytestring.Get_Length() + 1) == ERROR_SUCCESS) {
success = true;
}
break;
}
if (RegCreateKeyEx (key, keyname, 0, "", REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &key, &disposition) != ERROR_SUCCESS) {
break;
}
keyname = nextkeyname;
nextkeyname = va_arg (marker, char*);
}
}
va_end (marker);
return (success);
}
/***********************************************************************************************
* RegistryManagerClass::Set_Value -- *
* *
* INPUT: *
* *
* OUTPUT: *
* *
* WARNINGS: *
* *
* HISTORY: *
* 08/22/01 IML : Created. *
*=============================================================================================*/
bool _cdecl RegistryManagerClass::Set_Value (HKEY rootkey, DWORD value, ...)
{
HKEY key;
DWORD disposition;
bool success = false;
va_list marker;
char *keyname, *nextkeyname;
va_start (marker, value);
// Create subkeys (if necessary).
key = rootkey;
keyname = va_arg (marker, char*);
if (keyname != NULL) {
nextkeyname = va_arg (marker, char*);
while (true) {
if (nextkeyname == NULL) {
if (RegSetValueEx (key, keyname, 0, REG_DWORD, (BYTE*) &value, sizeof (value)) == ERROR_SUCCESS) {
success = true;
}
break;
}
if (RegCreateKeyEx (key, keyname, 0, "", REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &key, &disposition) != ERROR_SUCCESS) {
break;
}
keyname = nextkeyname;
nextkeyname = va_arg (marker, char*);
}
}
va_end (marker);
return (success);
}
/***********************************************************************************************
* RegistryManagerClass::Get_Key -- *
* *
* INPUT: *
* *
* OUTPUT: *
* *
* WARNINGS: *
* *
* HISTORY: *
* 08/22/01 IML : Created. *
*=============================================================================================*/
bool _cdecl RegistryManagerClass::Get_Key (HKEY rootkey, DWORD keyindex, StringClass *keyname, ...)
{
bool success = false;
va_list marker;
char *ckeyname;
StringClass keystring;
HKEY key;
va_start (marker, keyname);
while ((ckeyname = va_arg (marker, char*)) != NULL) {
if (keystring.Get_Length() > 0) {
keystring += "\\";
}
keystring += ckeyname;
}
if (RegOpenKeyEx (rootkey, keystring, 0, KEY_ALL_ACCESS, &key) == ERROR_SUCCESS) {
FILETIME lastwritetime;
DWORD size;
if (RegEnumKeyEx (key, keyindex, keyname->Get_Buffer (256), &size, 0, NULL, NULL, &lastwritetime) == ERROR_SUCCESS) {
success = true;
}
RegCloseKey (key);
}
va_end (marker);
return (success);
}