/* * Descent 3 * Copyright (C) 2024 Parallax Software * * 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 . --- HISTORICAL COMMENTS FOLLOW --- * $Logfile: /DescentIII/Main/win32/windata.cpp $ * $Revision: 8 $ * $Date: 4/24/99 5:47p $ * $Author: Samir $ * * Windows registry functions * * $Log: /DescentIII/Main/win32/windata.cpp $ * * 8 4/24/99 5:47p Samir * added functions to set current win32 resource dll or exe. * * 7 2/15/99 1:22p Kevin * Changes for GameGauge * * 6 9/22/98 1:55p Matt * Change the registry path to "Outrage\Descent3". * * 5 11/16/97 2:32p Matt * Allow writing of registry string variables with an empty string as the * value * * 4 7/24/97 3:06p Matt * Added functions to read & write bools & variable-length integers, and * fixed a few small bugs. * * 3 7/22/97 7:07p Matt * Changed registry path from Software\Parallax Software\Outrage * Entertainment to just Software\Outrage Entertainment * * 6 6/11/97 1:10p Samir * Fixup of database. * * 5 5/13/97 11:25a Samir * Create_record now sets that record as the default. * * 4 5/08/97 1:58p Samir * When initializing database, check if there is an outrage entry in the * registry. * * 3 3/14/97 6:10 PM Jeremy * added get_user_name to osWinDatabase * * 2 3/03/97 4:36p Samir * removed instance of pserror.h. this lib shouldn't need it. * * 1 3/03/97 4:28p Samir * * $NoKeywords: $ */ #include "AppDatabase.h" #include #include #include "log.h" #include "pserror.h" // Construction and destruction. oeWin32AppDatabase::oeWin32AppDatabase() { bool res; hCurKey = 0; hBaseKey = (unsigned)HKEY_CURRENT_USER; // create outrage entertainment key lstrcpy(m_Basepath, "SOFTWARE\\Outrage"); res = lookup_record(m_Basepath); if (!res) { res = create_record(m_Basepath); if (!res) { LOG_WARNING << "Unable to create registry directory."; } } } oeWin32AppDatabase::oeWin32AppDatabase(oeWin32AppDatabase *parent) { hCurKey = 0; hBaseKey = parent->hCurKey; } oeWin32AppDatabase::~oeWin32AppDatabase() { if (hCurKey) { RegCloseKey((HKEY)hCurKey); } } // Record functions // these are actual folders of information // creates an empty classification or structure where you can store information bool oeWin32AppDatabase::create_record(const char *pathname) { LONG lres; HKEY hkey; DWORD disp; assert(hBaseKey); lres = RegCreateKeyEx((HKEY)hBaseKey, pathname, 0, "", REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hkey, &disp); if (lres != ERROR_SUCCESS) { LOG_WARNING.printf("Unable to create key %s (%x)", pathname, lres); return 0; } hCurKey = (unsigned)hkey; return 1; } // set current database focus to a particular record bool oeWin32AppDatabase::lookup_record(const char *pathname) { LONG lres; HKEY hkey; assert(hBaseKey); if (hCurKey) { RegCloseKey((HKEY)hCurKey); } lres = RegOpenKeyEx((HKEY)hBaseKey, pathname, 0, KEY_READ | KEY_WRITE | KEY_EXECUTE, &hkey); if (lres != ERROR_SUCCESS) { LOG_WARNING.printf("Unable to open key %s (%x)", pathname, lres); return 0; } hCurKey = (unsigned)hkey; return 1; } // read either a string from the current record bool oeWin32AppDatabase::read(const char *label, char *entry, int *entrylen) { LONG lres; DWORD type; assert(hBaseKey); assert(label != NULL); assert(entry != NULL); assert(entrylen != NULL); lres = RegQueryValueEx((HKEY)hCurKey, label, NULL, &type, (LPBYTE)entry, (LPDWORD)entrylen); assert(type != REG_DWORD); if (lres != ERROR_SUCCESS) { LOG_WARNING.printf("Unable to query str key %s (%x)", label, lres); return 0; } return 1; } // read a variable-sized integer from the current record bool oeWin32AppDatabase::read(const char *label, void *entry, int wordsize) { LONG lres; DWORD len = 4; DWORD type; int t; assert(hBaseKey); assert(label != NULL); assert(entry != NULL); lres = RegQueryValueEx((HKEY)hCurKey, label, NULL, &type, (LPBYTE)&t, &len); assert(len == 4); if (lres != ERROR_SUCCESS) { LOG_WARNING.printf("Unable to query int key %s (%x)", label, lres); return 0; } assert(type == REG_DWORD); switch (wordsize) { case 1: *((char *)entry) = (char)t; break; case 2: *((int16_t *)entry) = (int16_t)t; break; case 4: *((int *)entry) = (int)t; break; default: Int3(); break; // invalid word size } return 1; } bool oeWin32AppDatabase::read(const char *label, bool *entry) { int t; if (read(label, &t, sizeof(t))) { *entry = (t != 0); return 1; } else return 0; } // write either an integer or string to a record. bool oeWin32AppDatabase::write(const char *label, const char *entry, int entrylen) { LONG lres; assert(hBaseKey); assert(label != NULL); assert(entry != NULL); // assert(entrylen > 0); lres = RegSetValueEx((HKEY)hCurKey, label, 0, REG_SZ, (LPBYTE)entry, entrylen); if (lres != ERROR_SUCCESS) { LOG_WARNING.printf("Unable to write str key %s (%x)", label, lres); return 0; } return 1; } bool oeWin32AppDatabase::write(const char *label, int entry) { LONG lres; assert(hBaseKey); assert(label != NULL); lres = RegSetValueEx((HKEY)hCurKey, label, 0, REG_DWORD, (LPBYTE)&entry, sizeof(int)); if (lres != ERROR_SUCCESS) { LOG_WARNING.printf("Unable to write int key %s (%x)", label, lres); return 0; } return 1; } // get the current user's name from the os void oeWin32AppDatabase::get_user_name(char *buffer, size_t *size) { GetUserName(buffer, reinterpret_cast(size)); } ///////////////////////////////////////////////////////////////////////////////// // pass name of dll which contains desired language // NULL library is the default resource DLL static HINSTANCE hThisResourceModule = NULL; bool win32_SetResourceDLL(const char *libname) { if (hThisResourceModule) { FreeLibrary(hThisResourceModule); hThisResourceModule = NULL; } if (libname) { hThisResourceModule = LoadLibrary(libname); } return (hThisResourceModule) ? true : false; } // returns a string from the current resource bool win32_GetStringResource(int txt_id, char *buffer, int buflen) { if (LoadString(hThisResourceModule, txt_id, buffer, buflen)) { buffer[buflen - 1] = 0; return true; } strncpy(buffer, "!!!ERROR MISSING DLL STRING!!!", buflen - 1); buffer[buflen - 1] = 0; return false; }