xref: /reactos/dll/cpl/inetcpl/general.c (revision d02c7225)
1 /*
2  * Internet control panel applet: general propsheet
3  *
4  * Copyright 2010 Detlef Riekenberg
5  *
6  * This library is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 2.1 of the License, or (at your option) any later version.
10  *
11  * This library is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with this library; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
19  *
20  */
21 
22 #include <stdarg.h>
23 #include <windef.h>
24 #include <winbase.h>
25 #include <winuser.h>
26 #include <wininet.h>
27 #include <winreg.h>
28 #include <shlwapi.h>
29 #include <prsht.h>
30 #include <shlobj.h>
31 
32 #include "inetcpl.h"
33 #include "wine/debug.h"
34 
35 WINE_DEFAULT_DEBUG_CHANNEL(inetcpl);
36 
37 static const WCHAR about_blank[] = {'a','b','o','u','t',':','b','l','a','n','k',0};
38 static const WCHAR start_page[] = {'S','t','a','r','t',' ','P','a','g','e',0};
39 static const WCHAR default_page[] = {'D','e','f','a','u','l','t','_','P','a','g','e','_','U','R','L',0};
40 static const WCHAR reg_ie_main[] = {'S','o','f','t','w','a','r','e','\\',
41                                     'M','i','c','r','o','s','o','f','t','\\',
42                                     'I','n','t','e','r','n','e','t',' ','E','x','p','l','o','r','e','r','\\',
43                                     'M','a','i','n',0};
44 
45 /* list of unimplemented buttons */
46 static DWORD disabled_general_buttons[] = {IDC_HOME_CURRENT,
47                                            IDC_HISTORY_SETTINGS,
48                                            0};
49 static DWORD disabled_delhist_buttons[] = {IDC_DELETE_FORM_DATA,
50                                            IDC_DELETE_PASSWORDS,
51                                            0};
52 
53 /*********************************************************************
54  * delhist_on_command [internal]
55  *
56  * handle WM_COMMAND in Delete browsing history dialog
57  *
58  */
delhist_on_command(HWND hdlg,WPARAM wparam)59 static INT_PTR delhist_on_command(HWND hdlg, WPARAM wparam)
60 {
61     switch (wparam)
62     {
63         case MAKEWPARAM(IDOK, BN_CLICKED):
64             if (IsDlgButtonChecked(hdlg, IDC_DELETE_TEMP_FILES))
65                 FreeUrlCacheSpaceW(NULL, 100, 0);
66 
67             if (IsDlgButtonChecked(hdlg, IDC_DELETE_COOKIES))
68             {
69                 WCHAR pathW[MAX_PATH];
70 
71                 if(SHGetSpecialFolderPathW(NULL, pathW, CSIDL_COOKIES, TRUE))
72                     FreeUrlCacheSpaceW(pathW, 100, 0);
73             }
74 
75             if (IsDlgButtonChecked(hdlg, IDC_DELETE_HISTORY))
76             {
77                 WCHAR pathW[MAX_PATH];
78 
79                 if(SHGetSpecialFolderPathW(NULL, pathW, CSIDL_HISTORY, TRUE))
80                     FreeUrlCacheSpaceW(pathW, 100, 0);
81             }
82 
83             EndDialog(hdlg, IDOK);
84             return TRUE;
85 
86         case MAKEWPARAM(IDCANCEL, BN_CLICKED):
87             EndDialog(hdlg, IDCANCEL);
88             return TRUE;
89 
90         case MAKEWPARAM(IDC_DELETE_TEMP_FILES, BN_CLICKED):
91         case MAKEWPARAM(IDC_DELETE_COOKIES, BN_CLICKED):
92         case MAKEWPARAM(IDC_DELETE_HISTORY, BN_CLICKED):
93         case MAKEWPARAM(IDC_DELETE_FORM_DATA, BN_CLICKED):
94         case MAKEWPARAM(IDC_DELETE_PASSWORDS, BN_CLICKED):
95         {
96             BOOL any = IsDlgButtonChecked(hdlg, IDC_DELETE_TEMP_FILES) ||
97                        IsDlgButtonChecked(hdlg, IDC_DELETE_COOKIES) ||
98                        IsDlgButtonChecked(hdlg, IDC_DELETE_HISTORY) ||
99                        IsDlgButtonChecked(hdlg, IDC_DELETE_FORM_DATA) ||
100                        IsDlgButtonChecked(hdlg, IDC_DELETE_PASSWORDS);
101             EnableWindow(GetDlgItem(hdlg, IDOK), any);
102             break;
103         }
104 
105         default:
106             break;
107     }
108     return FALSE;
109 }
110 
111 
112 /*********************************************************************
113  * delhist_dlgproc [internal]
114  *
115  * Delete browsing history dialog procedure
116  *
117  */
delhist_dlgproc(HWND hdlg,UINT msg,WPARAM wparam,LPARAM lparam)118 static INT_PTR CALLBACK delhist_dlgproc(HWND hdlg, UINT msg, WPARAM wparam, LPARAM lparam)
119 {
120     switch (msg)
121     {
122         case WM_COMMAND:
123             return delhist_on_command(hdlg, wparam);
124 
125         case WM_INITDIALOG:
126         {
127             DWORD *ptr = disabled_delhist_buttons;
128             while (*ptr)
129             {
130                 EnableWindow(GetDlgItem(hdlg, *ptr), FALSE);
131                 ptr++;
132             }
133             CheckDlgButton(hdlg, IDC_DELETE_TEMP_FILES, BST_CHECKED);
134             break;
135         }
136 
137         default:
138             break;
139     }
140     return FALSE;
141 }
142 
143 /*********************************************************************
144  * parse_url_from_outside [internal]
145  *
146  * Filter an URL, add a usable scheme, when needed
147  *
148  */
parse_url_from_outside(LPCWSTR url,LPWSTR out,DWORD maxlen)149 static DWORD parse_url_from_outside(LPCWSTR url, LPWSTR out, DWORD maxlen)
150 {
151     HMODULE hdll;
152     DWORD (WINAPI *pParseURLFromOutsideSourceW)(LPCWSTR, LPWSTR, LPDWORD, LPDWORD);
153     DWORD res;
154 
155     hdll = LoadLibraryA("shdocvw.dll");
156     pParseURLFromOutsideSourceW = (void *) GetProcAddress(hdll, (LPSTR) 170);
157 
158     if (pParseURLFromOutsideSourceW)
159     {
160         res = pParseURLFromOutsideSourceW(url, out, &maxlen, NULL);
161         FreeLibrary(hdll);
162         return res;
163     }
164 
165     ERR("failed to get ordinal 170: %d\n", GetLastError());
166     FreeLibrary(hdll);
167     return 0;
168 }
169 
170 /*********************************************************************
171  * general_on_command [internal]
172  *
173  * handle WM_COMMAND
174  *
175  */
general_on_command(HWND hwnd,WPARAM wparam)176 static INT_PTR general_on_command(HWND hwnd, WPARAM wparam)
177 {
178     WCHAR buffer[INTERNET_MAX_URL_LENGTH];
179     DWORD len;
180     DWORD type;
181     LONG res;
182 
183     switch (wparam)
184     {
185         case MAKEWPARAM(IDC_HOME_EDIT, EN_CHANGE):
186             /* enable apply button */
187             SendMessageW(GetParent(hwnd), PSM_CHANGED, (WPARAM)hwnd, 0);
188             break;
189 
190         case MAKEWPARAM(IDC_HOME_BLANK, BN_CLICKED):
191             SetDlgItemTextW(hwnd, IDC_HOME_EDIT, about_blank);
192             break;
193 
194         case MAKEWPARAM(IDC_HOME_DEFAULT, BN_CLICKED):
195             len = sizeof(buffer);
196             type = REG_SZ;
197             res = SHRegGetUSValueW(reg_ie_main, default_page, &type, buffer, &len, FALSE, (LPBYTE) about_blank, sizeof(about_blank));
198             if (!res && (type == REG_SZ)) SetDlgItemTextW(hwnd, IDC_HOME_EDIT, buffer);
199             break;
200 
201         case MAKEWPARAM(IDC_HISTORY_DELETE, BN_CLICKED):
202             DialogBoxW(hcpl, MAKEINTRESOURCEW(IDD_DELETE_HISTORY), hwnd,
203                        delhist_dlgproc);
204             break;
205 
206         default:
207             TRACE("not implemented for command: %d/%d\n", HIWORD(wparam),  LOWORD(wparam));
208             return FALSE;
209     }
210     return TRUE;
211 }
212 
213 /*********************************************************************
214  * general_on_initdialog [internal]
215  *
216  * handle WM_INITDIALOG
217  *
218  */
general_on_initdialog(HWND hwnd)219 static VOID general_on_initdialog(HWND hwnd)
220 {
221     WCHAR buffer[INTERNET_MAX_URL_LENGTH];
222     DWORD len;
223     DWORD type;
224     LONG res;
225     DWORD *ptr = disabled_general_buttons;
226 
227     /* disable unimplemented buttons */
228     while (*ptr)
229     {
230         EnableWindow(GetDlgItem(hwnd, *ptr), FALSE);
231         ptr++;
232     }
233 
234     /* read current homepage from the registry. Try HCU first, then HKLM */
235     *buffer = 0;
236     len = sizeof(buffer);
237     type = REG_SZ;
238     res = SHRegGetUSValueW(reg_ie_main, start_page, &type, buffer, &len, FALSE, (LPBYTE) about_blank, sizeof(about_blank));
239 
240     if (!res && (type == REG_SZ))
241     {
242         SetDlgItemTextW(hwnd, IDC_HOME_EDIT, buffer);
243     }
244 }
245 
246 /*********************************************************************
247  * general_on_notify [internal]
248  *
249  * handle WM_NOTIFY
250  *
251  */
general_on_notify(HWND hwnd,WPARAM wparam,LPARAM lparam)252 static INT_PTR general_on_notify(HWND hwnd, WPARAM wparam, LPARAM lparam)
253 {
254     PSHNOTIFY *psn;
255     WCHAR buffer[INTERNET_MAX_URL_LENGTH];
256     WCHAR parsed[INTERNET_MAX_URL_LENGTH];
257     LONG res;
258 
259     psn = (PSHNOTIFY *) lparam;
260     TRACE("WM_NOTIFY (%p, 0x%lx, 0x%lx) from %p with code: %d\n", hwnd, wparam, lparam,
261             psn->hdr.hwndFrom, psn->hdr.code);
262 
263     if (psn->hdr.code == PSN_APPLY)
264     {
265         *buffer = 0;
266         GetDlgItemTextW(hwnd, IDC_HOME_EDIT, buffer, ARRAY_SIZE(buffer));
267         TRACE("EDITTEXT has %s\n", debugstr_w(buffer));
268 
269         res = parse_url_from_outside(buffer, parsed, ARRAY_SIZE(parsed));
270         TRACE("got %d with %s\n", res, debugstr_w(parsed));
271 
272         if (res)
273         {
274             HKEY hkey;
275 
276             /* update the dialog, when needed */
277             if (lstrcmpW(buffer, parsed))
278                 SetDlgItemTextW(hwnd, IDC_HOME_EDIT, parsed);
279 
280             /* update the registry */
281             res = RegOpenKeyW(HKEY_CURRENT_USER, reg_ie_main, &hkey);
282             if (!res)
283             {
284                 res = RegSetValueExW(hkey, start_page, 0, REG_SZ, (const BYTE *)parsed,
285                                     (lstrlenW(parsed) + 1) * sizeof(WCHAR));
286                 RegCloseKey(hkey);
287                 return !res;
288             }
289         }
290     }
291     return FALSE;
292 }
293 
294 /*********************************************************************
295  * general_dlgproc [internal]
296  *
297  */
general_dlgproc(HWND hwnd,UINT msg,WPARAM wparam,LPARAM lparam)298 INT_PTR CALLBACK general_dlgproc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
299 {
300 
301     switch (msg)
302     {
303         case WM_INITDIALOG:
304             general_on_initdialog(hwnd);
305             return TRUE;
306 
307         case WM_COMMAND:
308             return general_on_command(hwnd, wparam);
309 
310         case WM_NOTIFY:
311             return general_on_notify(hwnd, wparam, lparam);
312 
313         default:
314             /* do not flood the log */
315             if ((msg == WM_SETCURSOR) || (msg == WM_NCHITTEST) || (msg == WM_MOUSEMOVE))
316                 return FALSE;
317 
318             TRACE("(%p, 0x%08x/%d, 0x%lx, 0x%lx)\n", hwnd, msg, msg, wparam, lparam);
319 
320     }
321     return FALSE;
322 }
323