50f69faf55e2f60a010bfdc0bb39a3c9666e30ea
[reactos.git] / base / applications / rapps / settingsdlg.cpp
1 /*
2 * PROJECT: ReactOS Applications Manager
3 * LICENSE: GPL-2.0-or-later (https://spdx.org/licenses/GPL-2.0-or-later)
4 * PURPOSE: Settings Dialog
5 * COPYRIGHT: Copyright 2009 Dmitry Chapyshev (dmitry@reactos.org)
6 * Copyright 2017 Alexander Shaposhnikov (sanchaez@reactos.org)
7 */
8 #include "rapps.h"
9
10 SETTINGS_INFO NewSettingsInfo;
11
12 BOOL ChooseFolder(HWND hwnd)
13 {
14 BOOL bRet = FALSE;
15 BROWSEINFOW bi;
16 ATL::CStringW szChooseFolderText;
17
18 szChooseFolderText.LoadStringW(IDS_CHOOSE_FOLDER_TEXT);
19
20 ZeroMemory(&bi, sizeof(bi));
21 bi.hwndOwner = hwnd;
22 bi.pidlRoot = NULL;
23 bi.lpszTitle = szChooseFolderText.GetString();
24 bi.ulFlags = BIF_USENEWUI | BIF_DONTGOBELOWDOMAIN | BIF_RETURNONLYFSDIRS | /* BIF_BROWSEFILEJUNCTIONS | */ BIF_VALIDATE;
25
26 if (SUCCEEDED(CoInitializeEx(NULL, COINIT_APARTMENTTHREADED)))
27 {
28 ATL::CStringW szBuf;
29
30 LPITEMIDLIST lpItemList = SHBrowseForFolderW(&bi);
31 if (lpItemList && SHGetPathFromIDListW(lpItemList, szBuf.GetBuffer(MAX_PATH)))
32 {
33 szBuf.ReleaseBuffer();
34 if (!szBuf.IsEmpty())
35 {
36 SetDlgItemTextW(hwnd, IDC_DOWNLOAD_DIR_EDIT, szBuf.GetString());
37 bRet = TRUE;
38 }
39 }
40 else
41 {
42 szBuf.ReleaseBuffer();
43 }
44
45 CoTaskMemFree(lpItemList);
46 CoUninitialize();
47 }
48
49 return bRet;
50 }
51
52 BOOL IsUrlValid(const WCHAR * Url)
53 {
54 URL_COMPONENTSW UrlComponmentInfo = { 0 };
55 UrlComponmentInfo.dwStructSize = sizeof(UrlComponmentInfo);
56 UrlComponmentInfo.dwSchemeLength = 1;
57
58 BOOL bSuccess = InternetCrackUrlW(Url, wcslen(Url), 0, &UrlComponmentInfo);
59 if(!bSuccess)
60 {
61 return FALSE;
62 }
63
64 switch(UrlComponmentInfo.nScheme)
65 {
66 case INTERNET_SCHEME_HTTP:
67 case INTERNET_SCHEME_HTTPS:
68 case INTERNET_SCHEME_FTP:
69 case INTERNET_SCHEME_FILE:
70 // supported
71 return TRUE;
72
73 default:
74 return FALSE;
75 }
76 }
77
78 namespace
79 {
80 inline BOOL IsCheckedDlgItem(HWND hDlg, INT nIDDlgItem)
81 {
82 return (SendDlgItemMessageW(hDlg, nIDDlgItem, BM_GETCHECK, 0, 0) == BST_CHECKED) ? TRUE : FALSE;
83 }
84
85 VOID InitSettingsControls(HWND hDlg, PSETTINGS_INFO Info)
86 {
87 SendDlgItemMessageW(hDlg, IDC_SAVE_WINDOW_POS, BM_SETCHECK, Info->bSaveWndPos, 0);
88 SendDlgItemMessageW(hDlg, IDC_UPDATE_AVLIST, BM_SETCHECK, Info->bUpdateAtStart, 0);
89 SendDlgItemMessageW(hDlg, IDC_LOG_ENABLED, BM_SETCHECK, Info->bLogEnabled, 0);
90 SendDlgItemMessageW(hDlg, IDC_DEL_AFTER_INSTALL, BM_SETCHECK, Info->bDelInstaller, 0);
91
92 SetWindowTextW(GetDlgItem(hDlg, IDC_DOWNLOAD_DIR_EDIT),
93 Info->szDownloadDir);
94
95 CheckRadioButton(hDlg, IDC_PROXY_DEFAULT, IDC_USE_PROXY, IDC_PROXY_DEFAULT + Info->Proxy);
96
97 if (Info->Proxy == 2)
98 {
99 EnableWindow(GetDlgItem(hDlg, IDC_PROXY_SERVER), TRUE);
100 EnableWindow(GetDlgItem(hDlg, IDC_NO_PROXY_FOR), TRUE);
101 }
102 else
103 {
104 EnableWindow(GetDlgItem(hDlg, IDC_PROXY_SERVER), FALSE);
105 EnableWindow(GetDlgItem(hDlg, IDC_NO_PROXY_FOR), FALSE);
106 }
107
108 CheckRadioButton(hDlg, IDC_SOURCE_DEFAULT, IDC_USE_SOURCE, Info->bUseSource ? IDC_USE_SOURCE : IDC_SOURCE_DEFAULT);
109
110 EnableWindow(GetDlgItem(hDlg, IDC_SOURCE_URL), Info->bUseSource);
111
112 SetWindowTextW(GetDlgItem(hDlg, IDC_SOURCE_URL), Info->szSourceURL);
113 SetWindowTextW(GetDlgItem(hDlg, IDC_PROXY_SERVER), Info->szProxyServer);
114 SetWindowTextW(GetDlgItem(hDlg, IDC_NO_PROXY_FOR), Info->szNoProxyFor);
115 }
116
117 INT_PTR CALLBACK SettingsDlgProc(HWND hDlg, UINT Msg, WPARAM wParam, LPARAM lParam)
118 {
119 switch (Msg)
120 {
121 case WM_INITDIALOG:
122 {
123 NewSettingsInfo = SettingsInfo;
124 InitSettingsControls(hDlg, &SettingsInfo);
125 }
126 break;
127
128 case WM_COMMAND:
129 {
130 switch (LOWORD(wParam))
131 {
132 case IDC_CHOOSE:
133 ChooseFolder(hDlg);
134 break;
135
136 case IDC_SAVE_WINDOW_POS:
137 NewSettingsInfo.bSaveWndPos = IsCheckedDlgItem(hDlg, IDC_SAVE_WINDOW_POS);
138 break;
139
140 case IDC_UPDATE_AVLIST:
141 NewSettingsInfo.bUpdateAtStart = IsCheckedDlgItem(hDlg, IDC_UPDATE_AVLIST);
142 break;
143
144 case IDC_LOG_ENABLED:
145 NewSettingsInfo.bLogEnabled = IsCheckedDlgItem(hDlg, IDC_LOG_ENABLED);
146 break;
147
148 case IDC_DEL_AFTER_INSTALL:
149 NewSettingsInfo.bDelInstaller = IsCheckedDlgItem(hDlg, IDC_DEL_AFTER_INSTALL);
150 break;
151
152 case IDC_SOURCE_DEFAULT:
153 NewSettingsInfo.bUseSource = FALSE;
154 EnableWindow(GetDlgItem(hDlg, IDC_SOURCE_URL), NewSettingsInfo.bUseSource);
155 break;
156
157 case IDC_USE_SOURCE:
158 NewSettingsInfo.bUseSource = TRUE;
159 EnableWindow(GetDlgItem(hDlg, IDC_SOURCE_URL), NewSettingsInfo.bUseSource);
160 break;
161
162 case IDC_PROXY_DEFAULT:
163 NewSettingsInfo.Proxy = 0;
164 EnableWindow(GetDlgItem(hDlg, IDC_PROXY_SERVER), FALSE);
165 EnableWindow(GetDlgItem(hDlg, IDC_NO_PROXY_FOR), FALSE);
166 break;
167
168 case IDC_NO_PROXY:
169 NewSettingsInfo.Proxy = 1;
170 EnableWindow(GetDlgItem(hDlg, IDC_PROXY_SERVER), FALSE);
171 EnableWindow(GetDlgItem(hDlg, IDC_NO_PROXY_FOR), FALSE);
172 break;
173
174 case IDC_USE_PROXY:
175 NewSettingsInfo.Proxy = 2;
176 EnableWindow(GetDlgItem(hDlg, IDC_PROXY_SERVER), TRUE);
177 EnableWindow(GetDlgItem(hDlg, IDC_NO_PROXY_FOR), TRUE);
178 break;
179
180 case IDC_DEFAULT_SETTINGS:
181 FillDefaultSettings(&NewSettingsInfo);
182 InitSettingsControls(hDlg, &NewSettingsInfo);
183 break;
184
185 case IDOK:
186 {
187 ATL::CStringW szDir;
188 ATL::CStringW szSource;
189 ATL::CStringW szProxy;
190 ATL::CStringW szNoProxy;
191 DWORD dwAttr;
192
193 GetWindowTextW(GetDlgItem(hDlg, IDC_DOWNLOAD_DIR_EDIT),
194 szDir.GetBuffer(MAX_PATH), MAX_PATH);
195 szDir.ReleaseBuffer();
196
197 GetWindowTextW(GetDlgItem(hDlg, IDC_SOURCE_URL),
198 szSource.GetBuffer(INTERNET_MAX_URL_LENGTH), INTERNET_MAX_URL_LENGTH);
199 szSource.ReleaseBuffer();
200
201 GetWindowTextW(GetDlgItem(hDlg, IDC_PROXY_SERVER),
202 szProxy.GetBuffer(MAX_PATH), MAX_PATH);
203 szProxy.ReleaseBuffer();
204 ATL::CStringW::CopyChars(NewSettingsInfo.szProxyServer,
205 _countof(NewSettingsInfo.szProxyServer),
206 szProxy.GetString(),
207 szProxy.GetLength() + 1);
208
209 GetWindowTextW(GetDlgItem(hDlg, IDC_NO_PROXY_FOR),
210 szNoProxy.GetBuffer(MAX_PATH), MAX_PATH);
211 szNoProxy.ReleaseBuffer();
212 ATL::CStringW::CopyChars(NewSettingsInfo.szNoProxyFor,
213 _countof(NewSettingsInfo.szNoProxyFor),
214 szNoProxy.GetString(),
215 szNoProxy.GetLength() + 1);
216
217 dwAttr = GetFileAttributesW(szDir.GetString());
218 if (dwAttr != INVALID_FILE_ATTRIBUTES &&
219 (dwAttr & FILE_ATTRIBUTE_DIRECTORY))
220 {
221 ATL::CStringW::CopyChars(NewSettingsInfo.szDownloadDir,
222 _countof(NewSettingsInfo.szDownloadDir),
223 szDir.GetString(),
224 szDir.GetLength() + 1);
225 }
226 else
227 {
228 ATL::CStringW szMsgText;
229 szMsgText.LoadStringW(IDS_CHOOSE_FOLDER_ERROR);
230
231 if (MessageBoxW(hDlg, szMsgText.GetString(), NULL, MB_YESNO) == IDYES)
232 {
233 if (CreateDirectoryW(szDir.GetString(), NULL))
234 {
235 EndDialog(hDlg, LOWORD(wParam));
236 }
237 }
238 else
239 {
240 SetFocus(GetDlgItem(hDlg, IDC_DOWNLOAD_DIR_EDIT));
241 break;
242 }
243 }
244
245
246 if(NewSettingsInfo.bUseSource && !IsUrlValid(szSource.GetString()))
247 {
248 ATL::CStringW szMsgText;
249 szMsgText.LoadStringW(IDS_URL_INVALID);
250
251 MessageBoxW(hDlg, szMsgText.GetString(), NULL, 0);
252 SetFocus(GetDlgItem(hDlg, IDC_SOURCE_URL));
253 break;
254 }
255 else
256 {
257 ATL::CStringW::CopyChars(NewSettingsInfo.szSourceURL,
258 _countof(NewSettingsInfo.szSourceURL),
259 szSource.GetString(),
260 szSource.GetLength() + 1);
261 }
262
263 SettingsInfo = NewSettingsInfo;
264 SaveSettings(GetParent(hDlg), &SettingsInfo);
265 EndDialog(hDlg, LOWORD(wParam));
266 }
267 break;
268
269 case IDCANCEL:
270 EndDialog(hDlg, LOWORD(wParam));
271 break;
272 }
273 }
274 break;
275 }
276
277 return FALSE;
278 }
279 }
280
281 VOID CreateSettingsDlg(HWND hwnd)
282 {
283 DialogBoxW(hInst,
284 MAKEINTRESOURCEW(IDD_SETTINGS_DIALOG),
285 hwnd,
286 SettingsDlgProc);
287 }