Added options and advanced options dialogs which should've been

part of an earlier checkin.  Also now saving and restoring
options that aren't in the configuration file to/from the
registry.
This commit is contained in:
crs 2003-03-17 22:32:10 +00:00
parent a7e2141ede
commit a5633b1971
11 changed files with 396 additions and 169 deletions

View File

@ -16,6 +16,7 @@
#include "ProtocolTypes.h"
#include "CStringUtil.h"
#include "CArch.h"
#include "CArchMiscWindows.h"
#include "CAdvancedOptions.h"
#include "LaunchUtil.h"
#include "resource.h"
@ -96,6 +97,28 @@ CAdvancedOptions::getCommandLine(bool isClient, const CString& serverName) const
void
CAdvancedOptions::init(HWND hwnd)
{
// get values from registry
HKEY key = CArchMiscWindows::openKey(HKEY_CURRENT_USER, getSettingsPath());
if (key != NULL) {
DWORD newPort = CArchMiscWindows::readValueInt(key, "port");
CString newName = CArchMiscWindows::readValueString(key, "name");
if (newPort != 0) {
m_port = static_cast<int>(newPort);
}
if (!newName.empty()) {
m_screenName = newName;
}
CArchMiscWindows::closeKey(key);
}
// now set GUI
doInit(hwnd);
}
void
CAdvancedOptions::doInit(HWND hwnd)
{
// set values in GUI
HWND child;
char buffer[20];
sprintf(buffer, "%d", m_port);
@ -144,9 +167,28 @@ CAdvancedOptions::save(HWND hwnd)
m_screenName = name;
m_port = port;
// save values to registry
HKEY key = CArchMiscWindows::openKey(HKEY_CURRENT_USER, getSettingsPath());
if (key != NULL) {
CArchMiscWindows::setValue(key, "port", m_port);
CArchMiscWindows::setValue(key, "name", m_screenName);
CArchMiscWindows::closeKey(key);
}
return true;
}
void
CAdvancedOptions::setDefaults(HWND hwnd)
{
// restore defaults
m_screenName = ARCH->getHostName();
m_port = kDefaultPort;
// update GUI
doInit(hwnd);
}
BOOL
CAdvancedOptions::doDlgProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM)
{
@ -166,6 +208,10 @@ CAdvancedOptions::doDlgProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM)
case IDCANCEL:
EndDialog(hwnd, 0);
return TRUE;
case IDC_ADVANCED_DEFAULTS:
setDefaults(hwnd);
return TRUE;
}
break;

View File

@ -55,7 +55,9 @@ public:
private:
void init(HWND hwnd);
void doInit(HWND hwnd);
bool save(HWND hwnd);
void setDefaults(HWND hwnd);
// message handling
BOOL doDlgProc(HWND, UINT, WPARAM, LPARAM);

View File

@ -214,3 +214,15 @@ saveConfig(const CConfig& config, bool sysOnly)
return false;
}
const TCHAR* const*
getSettingsPath()
{
static const TCHAR* s_keyNames[] = {
TEXT("Software"),
TEXT("Synergy"),
TEXT("Synergy"),
NULL
};
return s_keyNames;
}

View File

@ -50,4 +50,6 @@ CString getAppPath(const CString& appName);
bool loadConfig(CConfig& config);
bool saveConfig(const CConfig& config, bool sysOnly);
const TCHAR* const* getSettingsPath();
#endif

View File

@ -19,6 +19,7 @@
#include "CLog.h"
#include "CStringUtil.h"
#include "CArch.h"
#include "CArchMiscWindows.h"
#include "Version.h"
#include "stdvector.h"
#include "resource.h"
@ -703,12 +704,39 @@ initMainWindow(HWND hwnd)
ARG->m_oldConfig = ARG->m_config;
enableSaveControls(hwnd);
// get settings from registry
bool isServer = configLoaded;
int debugLevel = s_defaultDebug;
CString server;
HKEY key = CArchMiscWindows::openKey(HKEY_CURRENT_USER, getSettingsPath());
if (key != NULL) {
if (isServer && CArchMiscWindows::hasValue(key, "isServer")) {
isServer = (CArchMiscWindows::readValueInt(key, "isServer") != 0);
}
if (CArchMiscWindows::hasValue(key, "debug")) {
debugLevel = static_cast<int>(
CArchMiscWindows::readValueInt(key, "debug"));
if (debugLevel < 0) {
debugLevel = 0;
}
else if (debugLevel > CLog::kDEBUG2) {
debugLevel = CLog::kDEBUG2;
}
}
server = CArchMiscWindows::readValueString(key, "server");
CArchMiscWindows::closeKey(key);
}
// choose client/server radio buttons
HWND child;
child = getItem(hwnd, IDC_MAIN_CLIENT_RADIO);
setItemChecked(child, !configLoaded);
setItemChecked(child, !isServer);
child = getItem(hwnd, IDC_MAIN_SERVER_RADIO);
setItemChecked(child, configLoaded);
setItemChecked(child, isServer);
// set server name
child = getItem(hwnd, IDC_MAIN_CLIENT_SERVER_NAME_EDIT);
setWindowText(child, server);
// if config is loaded then initialize server controls
if (configLoaded) {
@ -728,13 +756,31 @@ initMainWindow(HWND hwnd)
sizeof(s_debugName[0]); ++i) {
SendMessage(child, CB_ADDSTRING, 0, (LPARAM)s_debugName[i][0]);
}
SendMessage(child, CB_SETCURSEL, s_defaultDebug, 0);
SendMessage(child, CB_SETCURSEL, debugLevel, 0);
// update neighbor combo boxes
enableMainWindowControls(hwnd);
updateNeighbors(hwnd);
}
static
void
saveMainWindow(HWND hwnd)
{
HKEY key = CArchMiscWindows::openKey(HKEY_CURRENT_USER, getSettingsPath());
if (key != NULL) {
HWND child;
child = getItem(hwnd, IDC_MAIN_CLIENT_SERVER_NAME_EDIT);
CArchMiscWindows::setValue(key, "server", getWindowText(child));
child = getItem(hwnd, IDC_MAIN_DEBUG);
CArchMiscWindows::setValue(key, "debug",
SendMessage(child, CB_GETCURSEL, 0, 0));
CArchMiscWindows::setValue(key, "isServer",
isClientChecked(hwnd) ? 0 : 1);
CArchMiscWindows::closeKey(key);
}
}
static
BOOL CALLBACK
addDlgProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
@ -1128,16 +1174,16 @@ WinMain(HINSTANCE instance, HINSTANCE, LPSTR, int nCmdShow)
RegisterClassEx(&classInfo);
// create main window
HWND m_mainWindow = CreateDialog(s_instance,
HWND mainWindow = CreateDialog(s_instance,
MAKEINTRESOURCE(IDD_MAIN), 0, NULL);
// prep windows
initMainWindow(m_mainWindow);
s_globalOptions = new CGlobalOptions(m_mainWindow, &ARG->m_config);
s_advancedOptions = new CAdvancedOptions(m_mainWindow, &ARG->m_config);
initMainWindow(mainWindow);
s_globalOptions = new CGlobalOptions(mainWindow, &ARG->m_config);
s_advancedOptions = new CAdvancedOptions(mainWindow, &ARG->m_config);
// show window
ShowWindow(m_mainWindow, nCmdShow);
ShowWindow(mainWindow, nCmdShow);
// main loop
MSG msg;
@ -1154,7 +1200,7 @@ WinMain(HINSTANCE instance, HINSTANCE, LPSTR, int nCmdShow)
break;
default:
if (!IsDialogMessage(m_mainWindow, &msg)) {
if (!IsDialogMessage(mainWindow, &msg)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
@ -1162,5 +1208,8 @@ WinMain(HINSTANCE instance, HINSTANCE, LPSTR, int nCmdShow)
}
} while (!done);
// save values to registry
saveMainWindow(mainWindow);
return msg.wParam;
}

View File

@ -62,7 +62,7 @@ BEGIN
IDC_STATIC,7,7,286,19
GROUPBOX "",IDC_STATIC,7,29,286,31
GROUPBOX "",IDC_STATIC,7,67,286,103
GROUPBOX "Advanced Options",IDC_STATIC,7,177,286,56
GROUPBOX "Options",IDC_STATIC,7,177,286,56
CONTROL "&Client",IDC_MAIN_CLIENT_RADIO,"Button",
BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP,11,29,33,10
CONTROL "Server",IDC_MAIN_SERVER_RADIO,"Button",
@ -79,26 +79,23 @@ BEGIN
PUSHBUTTON "&Remove",IDC_MAIN_SERVER_REMOVE_BUTTON,12,150,50,14
LTEXT "&Layout:",IDC_MAIN_SERVER_LAYOUT_LABEL,138,79,24,8
LTEXT "Left:",IDC_MAIN_SERVER_LEFT_LABEL,144,93,15,8
COMBOBOX IDC_MAIN_SERVER_LEFT_COMBO,175,91,118,46,
COMBOBOX IDC_MAIN_SERVER_LEFT_COMBO,175,91,111,46,
CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP
LTEXT "Right:",IDC_MAIN_SERVER_RIGHT_LABEL,144,109,20,8
COMBOBOX IDC_MAIN_SERVER_RIGHT_COMBO,175,107,118,46,
COMBOBOX IDC_MAIN_SERVER_RIGHT_COMBO,175,107,112,46,
CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP
LTEXT "Above:",IDC_MAIN_SERVER_TOP_LABEL,144,125,24,8
COMBOBOX IDC_MAIN_SERVER_TOP_COMBO,175,123,118,46,
COMBOBOX IDC_MAIN_SERVER_TOP_COMBO,175,123,112,46,
CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP
LTEXT "Below:",IDC_MAIN_SERVER_BOTTOM_LABEL,144,141,22,8
COMBOBOX IDC_MAIN_SERVER_BOTTOM_COMBO,175,139,118,46,
COMBOBOX IDC_MAIN_SERVER_BOTTOM_COMBO,175,139,112,46,
CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP
LTEXT "Screen &Name:",IDC_STATIC,12,192,46,8
EDITTEXT IDC_MAIN_ADVANCED_NAME_EDIT,64,190,106,12,ES_AUTOHSCROLL
LTEXT "&Port:",IDC_STATIC,194,192,16,8
EDITTEXT IDC_MAIN_ADVANCED_PORT_EDIT,216,190,40,12,ES_AUTOHSCROLL |
ES_NUMBER
LTEXT "Automatic Startup:",IDC_STATIC,12,212,59,8
PUSHBUTTON "Con&figure...",IDC_MAIN_AUTOSTART,78,210,50,14
LTEXT "Test &Debug Level:",IDC_STATIC,151,212,60,8
COMBOBOX IDC_MAIN_DEBUG,216,210,61,60,CBS_DROPDOWNLIST |
PUSHBUTTON "&Options...",IDC_MAIN_OPTIONS,12,191,50,14
PUSHBUTTON "Adva&nced...",IDC_MAIN_ADVANCED,68,191,50,14
LTEXT "Automatic Startup:",IDC_STATIC,138,193,59,8
PUSHBUTTON "Con&figure...",IDC_MAIN_AUTOSTART,202,191,50,14
LTEXT "Test &Debug Level:",IDC_STATIC,12,216,60,8
COMBOBOX IDC_MAIN_DEBUG,78,213,61,60,CBS_DROPDOWNLIST |
WS_VSCROLL | WS_TABSTOP
PUSHBUTTON "Sa&ve",IDC_MAIN_SAVE,75,241,50,14
DEFPUSHBUTTON "&Test",IDC_MAIN_TEST,131,241,50,14
@ -157,6 +154,50 @@ BEGIN
IDC_STATIC,7,43,181,17
END
IDD_GLOBAL_OPTIONS DIALOG DISCARDABLE 0, 0, 207, 148
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "Options"
FONT 8, "MS Sans Serif"
BEGIN
LTEXT "It's easy to unintentionally switch screens when the pointer is near a screen's edge. Synergy can prevent switching until certain conditions are met to reduce unintentional switching.",
IDC_STATIC,7,7,191,26
LTEXT "Synergy can wait to switch until the cursor has been at a screen's edge for some amount of time.",
IDC_STATIC,7,37,193,16
CONTROL "Switch after waiting",IDC_GLOBAL_DELAY_CHECK,"Button",
BS_AUTOCHECKBOX | WS_TABSTOP,7,59,77,10
EDITTEXT IDC_GLOBAL_DELAY_TIME,112,58,45,12,ES_AUTOHSCROLL |
ES_NUMBER
LTEXT "ms",IDC_STATIC,159,60,10,8
LTEXT "Synergy can switch only when the cursor hits a screen edge twice within some amount of time.",
IDC_STATIC,7,77,193,16
CONTROL "Switch on double tap within",IDC_GLOBAL_TWO_TAP_CHECK,
"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,99,103,10
EDITTEXT IDC_GLOBAL_TWO_TAP_TIME,112,98,45,12,ES_AUTOHSCROLL |
ES_NUMBER
LTEXT "ms",IDC_STATIC,159,100,10,8
DEFPUSHBUTTON "OK",IDOK,94,127,50,14
PUSHBUTTON "Cancel",IDCANCEL,150,127,50,14
END
IDD_ADVANCED_OPTIONS DIALOG DISCARDABLE 0, 0, 230, 133
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "Advanced Options"
FONT 8, "MS Sans Serif"
BEGIN
LTEXT "Synergy normally uses this computer's name as its screen name. Enter another name here if you want to use a different screen name.",
IDC_STATIC,7,7,216,19
LTEXT "Screen &Name:",IDC_STATIC,7,34,46,8
EDITTEXT IDC_ADVANCED_NAME_EDIT,63,32,106,12,ES_AUTOHSCROLL
LTEXT "Synergy normally uses a particular network port number. Enter an alternative port here. (The server and all clients must use the same port number.)",
IDC_STATIC,7,56,216,26
LTEXT "&Port:",IDC_STATIC,7,90,16,8
EDITTEXT IDC_ADVANCED_PORT_EDIT,63,88,40,12,ES_AUTOHSCROLL |
ES_NUMBER
PUSHBUTTON "&Defaults",IDC_ADVANCED_DEFAULTS,7,112,50,14
DEFPUSHBUTTON "OK",IDOK,118,112,50,14
PUSHBUTTON "Cancel",IDCANCEL,173,112,50,14
END
/////////////////////////////////////////////////////////////////////////////
//
@ -197,6 +238,22 @@ BEGIN
TOPMARGIN, 7
BOTTOMMARGIN, 182
END
IDD_GLOBAL_OPTIONS, DIALOG
BEGIN
LEFTMARGIN, 7
RIGHTMARGIN, 200
TOPMARGIN, 7
BOTTOMMARGIN, 141
END
IDD_ADVANCED_OPTIONS, DIALOG
BEGIN
LEFTMARGIN, 7
RIGHTMARGIN, 223
TOPMARGIN, 7
BOTTOMMARGIN, 126
END
END
#endif // APSTUDIO_INVOKED

View File

@ -95,15 +95,16 @@
#define IDC_ADD_MOD_ALT 1045
#define IDC_ADD_MOD_META 1046
#define IDC_ADD_MOD_SUPER 1047
#define IDC_ADVANCED_DEFAULTS 1049
// Next default values for new objects
//
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NO_MFC 1
#define _APS_NEXT_RESOURCE_VALUE 108
#define _APS_NEXT_RESOURCE_VALUE 110
#define _APS_NEXT_COMMAND_VALUE 40001
#define _APS_NEXT_CONTROL_VALUE 1044
#define _APS_NEXT_CONTROL_VALUE 1050
#define _APS_NEXT_SYMED_VALUE 101
#endif
#endif

View File

@ -93,10 +93,10 @@ CArchDaemonWindows::installDaemon(const char* name,
value += commandLine;
// install entry
setValue(key, name, value);
CArchMiscWindows::setValue(key, name, value);
// clean up
closeKey(key);
CArchMiscWindows::closeKey(key);
}
// windows NT family services
@ -137,7 +137,7 @@ CArchDaemonWindows::installDaemon(const char* name,
// open the registry key for this service
HKEY key = openNTServicesKey();
key = openKey(key, name);
key = CArchMiscWindows::openKey(key, name);
if (key == NULL) {
// can't open key
DWORD err = GetLastError();
@ -151,14 +151,14 @@ CArchDaemonWindows::installDaemon(const char* name,
}
// set the description
setValue(key, _T("Description"), description);
CArchMiscWindows::setValue(key, _T("Description"), description);
// set command line
key = openKey(key, _T("Parameters"));
key = CArchMiscWindows::openKey(key, _T("Parameters"));
if (key == NULL) {
// can't open key
DWORD err = GetLastError();
closeKey(key);
CArchMiscWindows::closeKey(key);
try {
uninstallDaemon(name, allUsers);
}
@ -167,10 +167,10 @@ CArchDaemonWindows::installDaemon(const char* name,
}
throw XArchDaemonInstallFailed(new XArchEvalWindows(err));
}
setValue(key, _T("CommandLine"), commandLine);
CArchMiscWindows::setValue(key, _T("CommandLine"), commandLine);
// done with registry
closeKey(key);
CArchMiscWindows::closeKey(key);
}
}
@ -189,20 +189,20 @@ CArchDaemonWindows::uninstallDaemon(const char* name, bool allUsers)
}
// remove entry
deleteValue(key, name);
CArchMiscWindows::deleteValue(key, name);
// clean up
closeKey(key);
CArchMiscWindows::closeKey(key);
}
// windows NT family services
else {
// remove parameters for this service. ignore failures.
HKEY key = openNTServicesKey();
key = openKey(key, name);
key = CArchMiscWindows::openKey(key, name);
if (key != NULL) {
deleteKey(key, _T("Parameters"));
closeKey(key);
CArchMiscWindows::deleteKey(key, _T("Parameters"));
CArchMiscWindows::closeKey(key);
}
// open service manager
@ -314,7 +314,7 @@ CArchDaemonWindows::canInstallDaemon(const char* name, bool allUsers)
// check if we can open the registry key
HKEY key = CArchMiscWindows::isWindows95Family() ?
open95ServicesKey() : openUserStartupKey();
closeKey(key);
CArchMiscWindows::closeKey(key);
return (key != NULL);
}
@ -329,9 +329,9 @@ CArchDaemonWindows::canInstallDaemon(const char* name, bool allUsers)
// check if we can open the registry key for this service
HKEY key = openNTServicesKey();
key = openKey(key, name);
key = openKey(key, _T("Parameters"));
closeKey(key);
key = CArchMiscWindows::openKey(key, name);
key = CArchMiscWindows::openKey(key, _T("Parameters"));
CArchMiscWindows::closeKey(key);
return (key != NULL);
}
@ -351,10 +351,11 @@ CArchDaemonWindows::isDaemonInstalled(const char* name, bool allUsers)
}
// check for entry
const bool installed = !readValueString(key, name).empty();
const bool installed = !CArchMiscWindows::readValueString(key,
name).empty();
// clean up
closeKey(key);
CArchMiscWindows::closeKey(key);
return installed;
}
@ -363,12 +364,12 @@ CArchDaemonWindows::isDaemonInstalled(const char* name, bool allUsers)
else {
// check parameters for this service
HKEY key = openNTServicesKey();
key = openKey(key, name);
key = openKey(key, _T("Parameters"));
key = CArchMiscWindows::openKey(key, name);
key = CArchMiscWindows::openKey(key, _T("Parameters"));
if (key != NULL) {
const bool installed = !readValueString(key,
const bool installed = !CArchMiscWindows::readValueString(key,
_T("CommandLine")).empty();
closeKey(key);
CArchMiscWindows::closeKey(key);
if (!installed) {
return false;
}
@ -393,106 +394,6 @@ CArchDaemonWindows::isDaemonInstalled(const char* name, bool allUsers)
}
}
HKEY
CArchDaemonWindows::openKey(HKEY key, const TCHAR* keyName)
{
// ignore if parent is NULL
if (key == NULL) {
return NULL;
}
// open next key
HKEY newKey;
LONG result = RegOpenKeyEx(key, keyName, 0,
KEY_WRITE | KEY_QUERY_VALUE, &newKey);
if (result != ERROR_SUCCESS) {
DWORD disp;
result = RegCreateKeyEx(key, keyName, 0, _T(""),
0, KEY_WRITE | KEY_QUERY_VALUE,
NULL, &newKey, &disp);
}
if (result != ERROR_SUCCESS) {
RegCloseKey(key);
return NULL;
}
// switch to new key
RegCloseKey(key);
return newKey;
}
HKEY
CArchDaemonWindows::openKey(HKEY key, const TCHAR** keyNames)
{
for (size_t i = 0; key != NULL && keyNames[i] != NULL; ++i) {
// open next key
key = openKey(key, keyNames[i]);
}
return key;
}
void
CArchDaemonWindows::closeKey(HKEY key)
{
assert(key != NULL);
RegCloseKey(key);
}
void
CArchDaemonWindows::deleteKey(HKEY key, const TCHAR* name)
{
assert(key != NULL);
assert(name != NULL);
RegDeleteKey(key, name);
}
void
CArchDaemonWindows::deleteValue(HKEY key, const TCHAR* name)
{
assert(key != NULL);
assert(name != NULL);
RegDeleteValue(key, name);
}
void
CArchDaemonWindows::setValue(HKEY key,
const TCHAR* name, const std::string& value)
{
assert(key != NULL);
assert(name != NULL);
RegSetValueEx(key, name, 0, REG_SZ,
reinterpret_cast<const BYTE*>(value.c_str()),
value.size() + 1);
}
std::string
CArchDaemonWindows::readValueString(HKEY key, const TCHAR* name)
{
// get the size of the string
DWORD type;
DWORD size = 0;
LONG result = RegQueryValueEx(key, name, 0, &type, NULL, &size);
if (result != ERROR_SUCCESS || type != REG_SZ) {
return std::string();
}
// allocate space
char* buffer = new char[size];
// read it
result = RegQueryValueEx(key, name, 0, &type,
reinterpret_cast<BYTE*>(buffer), &size);
if (result != ERROR_SUCCESS || type != REG_SZ) {
delete[] buffer;
return std::string();
}
// clean up and return value
std::string value(buffer);
delete[] buffer;
return value;
}
HKEY
CArchDaemonWindows::openNTServicesKey()
{
@ -503,7 +404,7 @@ CArchDaemonWindows::openNTServicesKey()
NULL
};
return openKey(HKEY_LOCAL_MACHINE, s_keyNames);
return CArchMiscWindows::openKey(HKEY_LOCAL_MACHINE, s_keyNames);
}
HKEY
@ -518,7 +419,7 @@ CArchDaemonWindows::open95ServicesKey()
NULL
};
return openKey(HKEY_LOCAL_MACHINE, s_keyNames);
return CArchMiscWindows::openKey(HKEY_LOCAL_MACHINE, s_keyNames);
}
HKEY
@ -533,7 +434,7 @@ CArchDaemonWindows::openUserStartupKey()
NULL
};
return openKey(HKEY_CURRENT_USER, s_keyNames);
return CArchMiscWindows::openKey(HKEY_CURRENT_USER, s_keyNames);
}
int
@ -730,10 +631,11 @@ CArchDaemonWindows::serviceMain(DWORD argc, LPTSTR* argvIn)
// read command line
std::string commandLine;
HKEY key = openNTServicesKey();
key = openKey(key, argvIn[0]);
key = openKey(key, _T("Parameters"));
key = CArchMiscWindows::openKey(key, argvIn[0]);
key = CArchMiscWindows::openKey(key, _T("Parameters"));
if (key != NULL) {
commandLine = readValueString(key, _T("CommandLine"));
commandLine = CArchMiscWindows::readValueString(key,
_T("CommandLine"));
}
// if the command line isn't empty then parse and use it

View File

@ -75,14 +75,6 @@ public:
virtual bool isDaemonInstalled(const char* name, bool allUsers);
private:
static HKEY openKey(HKEY parent, const TCHAR*);
static HKEY openKey(HKEY parent, const TCHAR**);
static void closeKey(HKEY);
static void deleteKey(HKEY, const TCHAR* name);
static void deleteValue(HKEY, const TCHAR* name);
static void setValue(HKEY, const TCHAR* name,
const std::string& value);
static std::string readValueString(HKEY, const TCHAR* name);
static HKEY openNTServicesKey();
static HKEY open95ServicesKey();
static HKEY openUserStartupKey();

View File

@ -12,11 +12,7 @@
* GNU General Public License for more details.
*/
#define WIN32_LEAN_AND_MEAN
#include "CArchMiscWindows.h"
#include "CArchDaemonWindows.h"
#include <windows.h>
//
// CArchMiscWindows
@ -37,17 +33,150 @@ CArchMiscWindows::isWindows95Family()
int
CArchMiscWindows::runDaemon(RunFunc runFunc)
{
return CArchDaemonWindows::runDaemon(runFunc);
return CArchMiscWindows::runDaemon(runFunc);
}
void
CArchMiscWindows::daemonRunning(bool running)
{
CArchDaemonWindows::daemonRunning(running);
CArchMiscWindows::daemonRunning(running);
}
void
CArchMiscWindows::daemonFailed(int result)
{
CArchDaemonWindows::daemonFailed(result);
CArchMiscWindows::daemonFailed(result);
}
HKEY
CArchMiscWindows::openKey(HKEY key, const TCHAR* keyName)
{
// ignore if parent is NULL
if (key == NULL) {
return NULL;
}
// open next key
HKEY newKey;
LONG result = RegOpenKeyEx(key, keyName, 0,
KEY_WRITE | KEY_QUERY_VALUE, &newKey);
if (result != ERROR_SUCCESS) {
DWORD disp;
result = RegCreateKeyEx(key, keyName, 0, TEXT(""),
0, KEY_WRITE | KEY_QUERY_VALUE,
NULL, &newKey, &disp);
}
if (result != ERROR_SUCCESS) {
RegCloseKey(key);
return NULL;
}
// switch to new key
RegCloseKey(key);
return newKey;
}
HKEY
CArchMiscWindows::openKey(HKEY key, const TCHAR* const* keyNames)
{
for (size_t i = 0; key != NULL && keyNames[i] != NULL; ++i) {
// open next key
key = openKey(key, keyNames[i]);
}
return key;
}
void
CArchMiscWindows::closeKey(HKEY key)
{
assert(key != NULL);
RegCloseKey(key);
}
void
CArchMiscWindows::deleteKey(HKEY key, const TCHAR* name)
{
assert(key != NULL);
assert(name != NULL);
RegDeleteKey(key, name);
}
void
CArchMiscWindows::deleteValue(HKEY key, const TCHAR* name)
{
assert(key != NULL);
assert(name != NULL);
RegDeleteValue(key, name);
}
bool
CArchMiscWindows::hasValue(HKEY key, const TCHAR* name)
{
DWORD type;
LONG result = RegQueryValueEx(key, name, 0, &type, NULL, NULL);
return (result == ERROR_SUCCESS &&
(type == REG_DWORD || type == REG_SZ));
}
void
CArchMiscWindows::setValue(HKEY key,
const TCHAR* name, const std::string& value)
{
assert(key != NULL);
assert(name != NULL);
RegSetValueEx(key, name, 0, REG_SZ,
reinterpret_cast<const BYTE*>(value.c_str()),
value.size() + 1);
}
void
CArchMiscWindows::setValue(HKEY key, const TCHAR* name, DWORD value)
{
assert(key != NULL);
assert(name != NULL);
RegSetValueEx(key, name, 0, REG_DWORD,
reinterpret_cast<CONST BYTE*>(&value),
sizeof(DWORD));
}
std::string
CArchMiscWindows::readValueString(HKEY key, const TCHAR* name)
{
// get the size of the string
DWORD type;
DWORD size = 0;
LONG result = RegQueryValueEx(key, name, 0, &type, NULL, &size);
if (result != ERROR_SUCCESS || type != REG_SZ) {
return std::string();
}
// allocate space
char* buffer = new char[size];
// read it
result = RegQueryValueEx(key, name, 0, &type,
reinterpret_cast<BYTE*>(buffer), &size);
if (result != ERROR_SUCCESS || type != REG_SZ) {
delete[] buffer;
return std::string();
}
// clean up and return value
std::string value(buffer);
delete[] buffer;
return value;
}
DWORD
CArchMiscWindows::readValueInt(HKEY key, const TCHAR* name)
{
DWORD type;
DWORD value;
DWORD size = sizeof(value);
LONG result = RegQueryValueEx(key, name, 0, &type,
reinterpret_cast<BYTE*>(&value), &size);
if (result != ERROR_SUCCESS || type != REG_DWORD) {
return 0;
}
return value;
}

View File

@ -15,7 +15,11 @@
#ifndef CARCHMISCWINDOWS_H
#define CARCHMISCWINDOWS_H
#define WIN32_LEAN_AND_MEAN
#include "common.h"
#include "stdstring.h"
#include <windows.h>
//! Miscellaneous win32 functions.
class CArchMiscWindows {
@ -45,6 +49,37 @@ public:
Delegates to CArchDaemonWindows.
*/
static void daemonFailed(int result);
//! Open and return a registry key, closing the parent key
static HKEY openKey(HKEY parent, const TCHAR* child);
//! Open and return a registry key, closing the parent key
static HKEY openKey(HKEY parent, const TCHAR* const* keyPath);
//! Close a key
static void closeKey(HKEY);
//! Delete a key (which should have no subkeys)
static void deleteKey(HKEY parent, const TCHAR* name);
//! Delete a value
static void deleteValue(HKEY parent, const TCHAR* name);
//! Test if a value exists
static bool hasValue(HKEY key, const TCHAR* name);
//! Set a string value in the registry
static void setValue(HKEY key, const TCHAR* name,
const std::string& value);
//! Set a DWORD value in the registry
static void setValue(HKEY key, const TCHAR* name, DWORD value);
//! Read a string value from the registry
static std::string readValueString(HKEY, const TCHAR* name);
//! Read a DWORD value from the registry
static DWORD readValueInt(HKEY, const TCHAR* name);
};
#endif