2 * PROJECT: ReactOS Applications Manager
3 * LICENSE: GPL-2.0-or-later (https://spdx.org/licenses/GPL-2.0-or-later)
4 * PURPOSE: Functions to load / save settings from reg.
5 * COPYRIGHT: Copyright 2020 He Yang (1160386205@qq.com)
15 virtual ~SettingsField() { ; }
16 virtual BOOL
Save(CRegKey
&key
) = 0;
17 virtual BOOL
Load(CRegKey
&key
) = 0;
20 class SettingsFieldBool
: public SettingsField
23 SettingsFieldBool(BOOL
*pValue
, LPCWSTR szRegName
)
24 : m_pValueStore(pValue
), m_RegName(szRegName
)
28 virtual BOOL
Save(CRegKey
&key
) override
30 return key
.SetDWORDValue(m_RegName
, (DWORD
)(*m_pValueStore
)) == ERROR_SUCCESS
;
32 virtual BOOL
Load(CRegKey
&key
) override
35 LONG lResult
= key
.QueryDWORDValue(m_RegName
, dwField
);
36 if (lResult
!= ERROR_SUCCESS
)
40 *m_pValueStore
= (BOOL
)dwField
;
45 BOOL
*m_pValueStore
; // where to read/store the value
46 LPCWSTR m_RegName
; // key name in registery
49 class SettingsFieldInt
: public SettingsField
52 SettingsFieldInt(INT
*pValue
, LPCWSTR szRegName
)
53 : m_pValueStore(pValue
), m_RegName(szRegName
)
57 virtual BOOL
Save(CRegKey
&key
) override
59 return key
.SetDWORDValue(m_RegName
, (DWORD
)(*m_pValueStore
)) == ERROR_SUCCESS
;
61 virtual BOOL
Load(CRegKey
&key
) override
64 LONG lResult
= key
.QueryDWORDValue(m_RegName
, dwField
);
65 if (lResult
!= ERROR_SUCCESS
)
69 *m_pValueStore
= (INT
)dwField
;
74 INT
*m_pValueStore
; // where to read/store the value
75 LPCWSTR m_RegName
; // key name in registery
78 class SettingsFieldString
: public SettingsField
81 SettingsFieldString(WCHAR
*pString
, ULONG cchLen
, LPCWSTR szRegName
)
82 : m_pStringStore(pString
), m_StringLen(cchLen
), m_RegName(szRegName
)
86 virtual BOOL
Save(CRegKey
&key
) override
88 return key
.SetStringValue(m_RegName
, m_pStringStore
) == ERROR_SUCCESS
;
90 virtual BOOL
Load(CRegKey
&key
) override
92 ULONG nChar
= m_StringLen
- 1; // make sure the terminating L'\0'
93 LONG lResult
= key
.QueryStringValue(m_RegName
, m_pStringStore
, &nChar
);
94 return lResult
== ERROR_SUCCESS
;
98 WCHAR
*m_pStringStore
; // where to read/store the value
99 ULONG m_StringLen
; // string length, in chars
100 LPCWSTR m_RegName
; // key name in registery
104 void AddInfoFields(ATL::CAtlList
<SettingsField
*> &infoFields
, SETTINGS_INFO
&settings
)
106 infoFields
.AddTail(new SettingsFieldBool(&(settings
.bSaveWndPos
), L
"bSaveWndPos"));
107 infoFields
.AddTail(new SettingsFieldBool(&(settings
.bUpdateAtStart
), L
"bUpdateAtStart"));
108 infoFields
.AddTail(new SettingsFieldBool(&(settings
.bLogEnabled
), L
"bLogEnabled"));
109 infoFields
.AddTail(new SettingsFieldString(settings
.szDownloadDir
, MAX_PATH
, L
"szDownloadDir"));
110 infoFields
.AddTail(new SettingsFieldBool(&(settings
.bDelInstaller
), L
"bDelInstaller"));
111 infoFields
.AddTail(new SettingsFieldBool(&(settings
.Maximized
), L
"WindowPosMaximized"));
112 infoFields
.AddTail(new SettingsFieldInt(&(settings
.Left
), L
"WindowPosLeft"));
113 infoFields
.AddTail(new SettingsFieldInt(&(settings
.Top
), L
"WindowPosTop"));
114 infoFields
.AddTail(new SettingsFieldInt(&(settings
.Width
), L
"WindowPosWidth"));
115 infoFields
.AddTail(new SettingsFieldInt(&(settings
.Height
), L
"WindowPosHeight"));
116 infoFields
.AddTail(new SettingsFieldInt(&(settings
.Proxy
), L
"ProxyMode"));
117 infoFields
.AddTail(new SettingsFieldString((settings
.szProxyServer
), MAX_PATH
, L
"ProxyServer"));
118 infoFields
.AddTail(new SettingsFieldString((settings
.szNoProxyFor
), MAX_PATH
, L
"NoProxyFor"));
119 infoFields
.AddTail(new SettingsFieldBool(&(settings
.bUseSource
), L
"bUseSource"));
120 infoFields
.AddTail(new SettingsFieldString((settings
.szSourceURL
), INTERNET_MAX_URL_LENGTH
, L
"SourceURL"));
125 BOOL
SaveAllSettings(CRegKey
&key
, SETTINGS_INFO
&settings
)
127 BOOL bAllSuccess
= TRUE
;
128 ATL::CAtlList
<SettingsField
*> infoFields
;
130 AddInfoFields(infoFields
, settings
);
132 POSITION InfoListPosition
= infoFields
.GetHeadPosition();
133 while (InfoListPosition
)
135 SettingsField
*Info
= infoFields
.GetNext(InfoListPosition
);
136 if (!Info
->Save(key
))
146 BOOL
LoadAllSettings(CRegKey
&key
, SETTINGS_INFO
&settings
)
148 BOOL bAllSuccess
= TRUE
;
149 ATL::CAtlList
<SettingsField
*> infoFields
;
151 AddInfoFields(infoFields
, settings
);
153 POSITION InfoListPosition
= infoFields
.GetHeadPosition();
154 while (InfoListPosition
)
156 SettingsField
*Info
= infoFields
.GetNext(InfoListPosition
);
157 if (!Info
->Load(key
))
167 VOID
FillDefaultSettings(PSETTINGS_INFO pSettingsInfo
)
169 ATL::CStringW szDownloadDir
;
170 ZeroMemory(pSettingsInfo
, sizeof(SETTINGS_INFO
));
172 pSettingsInfo
->bSaveWndPos
= TRUE
;
173 pSettingsInfo
->bUpdateAtStart
= FALSE
;
174 pSettingsInfo
->bLogEnabled
= TRUE
;
175 pSettingsInfo
->bUseSource
= FALSE
;
177 if (FAILED(SHGetFolderPathW(NULL
, CSIDL_PERSONAL
, NULL
, SHGFP_TYPE_CURRENT
, szDownloadDir
.GetBuffer(MAX_PATH
))))
179 szDownloadDir
.ReleaseBuffer();
180 if (!szDownloadDir
.GetEnvironmentVariableW(L
"SystemDrive"))
182 szDownloadDir
= L
"C:";
187 szDownloadDir
.ReleaseBuffer();
190 PathAppendW(szDownloadDir
.GetBuffer(MAX_PATH
), L
"\\RAPPS Downloads");
191 szDownloadDir
.ReleaseBuffer();
193 ATL::CStringW::CopyChars(pSettingsInfo
->szDownloadDir
,
194 _countof(pSettingsInfo
->szDownloadDir
),
195 szDownloadDir
.GetString(),
196 szDownloadDir
.GetLength() + 1);
198 pSettingsInfo
->bDelInstaller
= FALSE
;
199 pSettingsInfo
->Maximized
= FALSE
;
200 pSettingsInfo
->Left
= CW_USEDEFAULT
;
201 pSettingsInfo
->Top
= CW_USEDEFAULT
;
202 pSettingsInfo
->Width
= 680;
203 pSettingsInfo
->Height
= 450;
206 BOOL
LoadSettings(PSETTINGS_INFO pSettingsInfo
)
209 if (RegKey
.Open(HKEY_CURRENT_USER
, L
"Software\\ReactOS\\rapps", KEY_READ
) != ERROR_SUCCESS
)
214 return LoadAllSettings(RegKey
, *pSettingsInfo
);
217 BOOL
SaveSettings(HWND hwnd
, PSETTINGS_INFO pSettingsInfo
)
222 if (pSettingsInfo
->bSaveWndPos
)
224 wp
.length
= sizeof(wp
);
225 GetWindowPlacement(hwnd
, &wp
);
227 pSettingsInfo
->Left
= wp
.rcNormalPosition
.left
;
228 pSettingsInfo
->Top
= wp
.rcNormalPosition
.top
;
229 pSettingsInfo
->Width
= wp
.rcNormalPosition
.right
- wp
.rcNormalPosition
.left
;
230 pSettingsInfo
->Height
= wp
.rcNormalPosition
.bottom
- wp
.rcNormalPosition
.top
;
231 pSettingsInfo
->Maximized
= (wp
.showCmd
== SW_MAXIMIZE
232 || (wp
.showCmd
== SW_SHOWMINIMIZED
233 && (wp
.flags
& WPF_RESTORETOMAXIMIZED
)));
236 if (RegKey
.Create(HKEY_CURRENT_USER
, L
"Software\\ReactOS\\rapps", NULL
,
237 REG_OPTION_NON_VOLATILE
, KEY_WRITE
, NULL
, NULL
) != ERROR_SUCCESS
)
242 return SaveAllSettings(RegKey
, *pSettingsInfo
);