wstring GetSettingString(const string& settingName, wstring defaultValue, bool writeDefault=false) { AutoMUTEX lock(g_registryMutex); wstring value; if (!ReadRegistryStringValue(settingName.c_str(), value)) { value = defaultValue; if (writeDefault) { RegistryFailureReason reason = REGISTRY_FAILURE_NO_REASON; WriteRegistryStringValue(settingName, value, reason); } } return value; }
void Settings::SetWindowPlacement(const string& value) { RegistryFailureReason reason = REGISTRY_FAILURE_NO_REASON; (void)WriteRegistryStringValue(WINDOW_PLACEMENT_NAME, value, reason); // ignoring failures }
void Settings::SetCookies(const string& value) { RegistryFailureReason reason = REGISTRY_FAILURE_NO_REASON; (void)WriteRegistryStringValue(COOKIES_NAME, value, reason); // ignoring failures }
// FromJson updates the stores settings from an object stored in JSON format. bool Settings::FromJson( const string& utf8JSON, bool& o_reconnectRequired) { o_reconnectRequired = false; Json::Value json; Json::Reader reader; bool parsingSuccessful = reader.parse(utf8JSON, json); if (!parsingSuccessful) { my_print(NOT_SENSITIVE, false, _T("Failed to save settings!")); return false; } bool reconnectRequiredValueChanged = false; try { AutoMUTEX lock(g_registryMutex); // Note: We're purposely not bothering to check registry write return values. RegistryFailureReason failReason; BOOL splitTunnel = json.get("SplitTunnel", SPLIT_TUNNEL_DEFAULT).asUInt(); reconnectRequiredValueChanged = reconnectRequiredValueChanged || !!splitTunnel != Settings::SplitTunnel(); WriteRegistryDwordValue(SPLIT_TUNNEL_NAME, splitTunnel); wstring transport = json.get("VPN", TRANSPORT_DEFAULT).asUInt() ? TRANSPORT_VPN : TRANSPORT_DEFAULT; reconnectRequiredValueChanged = reconnectRequiredValueChanged || transport != Settings::Transport(); WriteRegistryStringValue( TRANSPORT_NAME, transport, failReason); DWORD httpPort = json.get("LocalHttpProxyPort", HTTP_PROXY_PORT_DEFAULT).asUInt(); reconnectRequiredValueChanged = reconnectRequiredValueChanged || httpPort != Settings::LocalHttpProxyPort(); WriteRegistryDwordValue(HTTP_PROXY_PORT_NAME, httpPort); DWORD socksPort = json.get("LocalSocksProxyPort", SOCKS_PROXY_PORT_DEFAULT).asUInt(); reconnectRequiredValueChanged = reconnectRequiredValueChanged || socksPort != Settings::LocalSocksProxyPort(); WriteRegistryDwordValue(SOCKS_PROXY_PORT_NAME, socksPort); string upstreamProxyHostname = json.get("UpstreamProxyHostname", UPSTREAM_PROXY_HOSTNAME_DEFAULT).asString(); reconnectRequiredValueChanged = reconnectRequiredValueChanged || upstreamProxyHostname != Settings::UpstreamProxyHostname(); WriteRegistryStringValue( UPSTREAM_PROXY_HOSTNAME_NAME, upstreamProxyHostname, failReason); DWORD upstreamProxyPort = json.get("UpstreamProxyPort", UPSTREAM_PROXY_PORT_DEFAULT).asUInt(); reconnectRequiredValueChanged = reconnectRequiredValueChanged || upstreamProxyPort != Settings::UpstreamProxyPort(); WriteRegistryDwordValue(UPSTREAM_PROXY_PORT_NAME, upstreamProxyPort); BOOL skipUpstreamProxy = json.get("SkipUpstreamProxy", SKIP_UPSTREAM_PROXY_DEFAULT).asUInt(); reconnectRequiredValueChanged = reconnectRequiredValueChanged || !!skipUpstreamProxy != Settings::SkipUpstreamProxy(); WriteRegistryDwordValue(SKIP_UPSTREAM_PROXY_NAME, skipUpstreamProxy); string egressRegion = json.get("EgressRegion", EGRESS_REGION_DEFAULT).asString(); reconnectRequiredValueChanged = reconnectRequiredValueChanged || egressRegion != Settings::EgressRegion(); WriteRegistryStringValue( EGRESS_REGION_NAME, egressRegion, failReason); BOOL systrayMinimize = json.get("SystrayMinimize", SYSTRAY_MINIMIZE_DEFAULT).asUInt(); // Does not require reconnect to apply change. WriteRegistryDwordValue(SYSTRAY_MINIMIZE_NAME, systrayMinimize); } catch (exception& e) { my_print(NOT_SENSITIVE, false, _T("%s:%d: JSON parse exception: %S"), __TFUNCTION__, __LINE__, e.what()); return false; } o_reconnectRequired = reconnectRequiredValueChanged; return true; }
// Get/set registry values for all versions (common) void SharedUtil::SetCommonRegistryValue ( const SString& strPath, const SString& strName, const SString& strValue ) { WriteRegistryStringValue ( HKEY_LOCAL_MACHINE, MakeVersionRegistryPath ( "Common", strPath ), strName, strValue ); }
// // Registry values // // Get/set registry values for the current version void SharedUtil::SetRegistryValue ( const SString& strPath, const SString& strName, const SString& strValue ) { WriteRegistryStringValue ( HKEY_LOCAL_MACHINE, MakeVersionRegistryPath ( GetMajorVersionString (), strPath ), strName, strValue ); }
// Get/set registry values for a version using the old (HKCU) layout void SharedUtil::SetVersionRegistryValueLegacy ( const SString& strVersion, const SString& strPath, const SString& strName, const SString& strValue ) { WriteRegistryStringValue ( HKEY_CURRENT_USER, MakeVersionRegistryPathLegacy ( strVersion, strPath ), strName, strValue ); }