msvcp: Sync num_get<>::_Getifld.
[wine.git] / dlls / inetcpl.cpl / general.c
blob42948eaea09436a396d4580adbf9d3dee5dfdc02
1 /*
2 * Internet control panel applet: general propsheet
4 * Copyright 2010 Detlef Riekenberg
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.
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.
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
22 #define NONAMELESSUNION
24 #include <stdarg.h>
25 #include <windef.h>
26 #include <winbase.h>
27 #include <winuser.h>
28 #include <wininet.h>
29 #include <winreg.h>
30 #include <shlwapi.h>
31 #include <prsht.h>
32 #include <shlobj.h>
34 #include "inetcpl.h"
35 #include "wine/debug.h"
37 WINE_DEFAULT_DEBUG_CHANNEL(inetcpl);
39 static const WCHAR about_blank[] = {'a','b','o','u','t',':','b','l','a','n','k',0};
40 static const WCHAR start_page[] = {'S','t','a','r','t',' ','P','a','g','e',0};
41 static const WCHAR reg_ie_main[] = {'S','o','f','t','w','a','r','e','\\',
42 'M','i','c','r','o','s','o','f','t','\\',
43 'I','n','t','e','r','n','e','t',' ','E','x','p','l','o','r','e','r','\\',
44 'M','a','i','n',0};
46 /* list of unimplemented buttons */
47 static DWORD disabled_general_buttons[] = {IDC_HOME_CURRENT,
48 IDC_HOME_DEFAULT,
49 IDC_HISTORY_SETTINGS,
50 0};
51 static DWORD disabled_delhist_buttons[] = {IDC_DELETE_FORM_DATA,
52 IDC_DELETE_PASSWORDS,
53 0};
55 /*********************************************************************
56 * delhist_on_command [internal]
58 * handle WM_COMMAND in Delete browsing history dialog
61 static INT_PTR delhist_on_command(HWND hdlg, WPARAM wparam)
63 switch (wparam)
65 case MAKEWPARAM(IDOK, BN_CLICKED):
66 if (IsDlgButtonChecked(hdlg, IDC_DELETE_TEMP_FILES))
67 FreeUrlCacheSpaceW(NULL, 100, 0);
69 if (IsDlgButtonChecked(hdlg, IDC_DELETE_COOKIES))
71 WCHAR pathW[MAX_PATH];
73 if(SHGetSpecialFolderPathW(NULL, pathW, CSIDL_COOKIES, TRUE))
74 FreeUrlCacheSpaceW(pathW, 100, 0);
77 if (IsDlgButtonChecked(hdlg, IDC_DELETE_HISTORY))
79 WCHAR pathW[MAX_PATH];
81 if(SHGetSpecialFolderPathW(NULL, pathW, CSIDL_HISTORY, TRUE))
82 FreeUrlCacheSpaceW(pathW, 100, 0);
85 EndDialog(hdlg, IDOK);
86 return TRUE;
88 case MAKEWPARAM(IDCANCEL, BN_CLICKED):
89 EndDialog(hdlg, IDCANCEL);
90 return TRUE;
92 case MAKEWPARAM(IDC_DELETE_TEMP_FILES, BN_CLICKED):
93 case MAKEWPARAM(IDC_DELETE_COOKIES, BN_CLICKED):
94 case MAKEWPARAM(IDC_DELETE_HISTORY, BN_CLICKED):
95 case MAKEWPARAM(IDC_DELETE_FORM_DATA, BN_CLICKED):
96 case MAKEWPARAM(IDC_DELETE_PASSWORDS, BN_CLICKED):
98 BOOL any = IsDlgButtonChecked(hdlg, IDC_DELETE_TEMP_FILES) ||
99 IsDlgButtonChecked(hdlg, IDC_DELETE_COOKIES) ||
100 IsDlgButtonChecked(hdlg, IDC_DELETE_HISTORY) ||
101 IsDlgButtonChecked(hdlg, IDC_DELETE_FORM_DATA) ||
102 IsDlgButtonChecked(hdlg, IDC_DELETE_PASSWORDS);
103 EnableWindow(GetDlgItem(hdlg, IDOK), any);
104 break;
107 default:
108 break;
110 return FALSE;
114 /*********************************************************************
115 * delhist_dlgproc [internal]
117 * Delete browsing history dialog procedure
120 static INT_PTR CALLBACK delhist_dlgproc(HWND hdlg, UINT msg, WPARAM wparam, LPARAM lparam)
122 switch (msg)
124 case WM_COMMAND:
125 return delhist_on_command(hdlg, wparam);
127 case WM_INITDIALOG:
129 DWORD *ptr = disabled_delhist_buttons;
130 while (*ptr)
132 EnableWindow(GetDlgItem(hdlg, *ptr), FALSE);
133 ptr++;
135 CheckDlgButton(hdlg, IDC_DELETE_TEMP_FILES, BST_CHECKED);
136 break;
139 default:
140 break;
142 return FALSE;
145 /*********************************************************************
146 * parse_url_from_outside [internal]
148 * Filter an URL, add a usable scheme, when needed
151 static DWORD parse_url_from_outside(LPCWSTR url, LPWSTR out, DWORD maxlen)
153 HMODULE hdll;
154 DWORD (WINAPI *pParseURLFromOutsideSourceW)(LPCWSTR, LPWSTR, LPDWORD, LPDWORD);
155 DWORD res;
157 hdll = LoadLibraryA("shdocvw.dll");
158 pParseURLFromOutsideSourceW = (void *) GetProcAddress(hdll, (LPSTR) 170);
160 if (pParseURLFromOutsideSourceW)
162 res = pParseURLFromOutsideSourceW(url, out, &maxlen, NULL);
163 FreeLibrary(hdll);
164 return res;
167 ERR("failed to get ordinal 170: %d\n", GetLastError());
168 FreeLibrary(hdll);
169 return 0;
172 /*********************************************************************
173 * general_on_command [internal]
175 * handle WM_COMMAND
178 static INT_PTR general_on_command(HWND hwnd, WPARAM wparam)
181 switch (wparam)
183 case MAKEWPARAM(IDC_HOME_EDIT, EN_CHANGE):
184 /* enable apply button */
185 SendMessageW(GetParent(hwnd), PSM_CHANGED, (WPARAM)hwnd, 0);
186 break;
188 case MAKEWPARAM(IDC_HOME_BLANK, BN_CLICKED):
189 SetDlgItemTextW(hwnd, IDC_HOME_EDIT, about_blank);
190 break;
192 case MAKEWPARAM(IDC_HISTORY_DELETE, BN_CLICKED):
193 DialogBoxW(hcpl, MAKEINTRESOURCEW(IDD_DELETE_HISTORY), hwnd,
194 delhist_dlgproc);
195 break;
197 default:
198 TRACE("not implemented for command: %d/%d\n", HIWORD(wparam), LOWORD(wparam));
199 return FALSE;
201 return TRUE;
204 /*********************************************************************
205 * general_on_initdialog [internal]
207 * handle WM_INITDIALOG
210 static VOID general_on_initdialog(HWND hwnd)
212 WCHAR buffer[INTERNET_MAX_URL_LENGTH];
213 DWORD len;
214 DWORD type;
215 LONG res;
216 DWORD *ptr = disabled_general_buttons;
218 /* disable unimplemented buttons */
219 while (*ptr)
221 EnableWindow(GetDlgItem(hwnd, *ptr), FALSE);
222 ptr++;
225 /* read current homepage from the registry. Try HCU first, then HKLM */
226 *buffer = 0;
227 len = sizeof(buffer);
228 type = REG_SZ;
229 res = SHRegGetUSValueW(reg_ie_main, start_page, &type, buffer, &len, FALSE, (LPBYTE) about_blank, sizeof(about_blank));
231 if (!res && (type == REG_SZ))
233 SetDlgItemTextW(hwnd, IDC_HOME_EDIT, buffer);
237 /*********************************************************************
238 * general_on_notify [internal]
240 * handle WM_NOTIFY
243 static INT_PTR general_on_notify(HWND hwnd, WPARAM wparam, LPARAM lparam)
245 PSHNOTIFY *psn;
246 WCHAR buffer[INTERNET_MAX_URL_LENGTH];
247 WCHAR parsed[INTERNET_MAX_URL_LENGTH];
248 LONG res;
250 psn = (PSHNOTIFY *) lparam;
251 TRACE("WM_NOTIFY (%p, 0x%lx, 0x%lx) from %p with code: %d\n", hwnd, wparam, lparam,
252 psn->hdr.hwndFrom, psn->hdr.code);
254 if (psn->hdr.code == PSN_APPLY)
256 *buffer = 0;
257 GetDlgItemTextW(hwnd, IDC_HOME_EDIT, buffer, sizeof(buffer)/sizeof(WCHAR));
258 TRACE("EDITTEXT has %s\n", debugstr_w(buffer));
260 res = parse_url_from_outside(buffer, parsed, sizeof(parsed)/sizeof(WCHAR));
261 TRACE("got %d with %s\n", res, debugstr_w(parsed));
263 if (res)
265 HKEY hkey;
267 /* update the dialog, when needed */
268 if (lstrcmpW(buffer, parsed))
269 SetDlgItemTextW(hwnd, IDC_HOME_EDIT, parsed);
271 /* update the registry */
272 res = RegOpenKeyW(HKEY_CURRENT_USER, reg_ie_main, &hkey);
273 if (!res)
275 res = RegSetValueExW(hkey, start_page, 0, REG_SZ, (const BYTE *)parsed,
276 (lstrlenW(parsed) + 1) * sizeof(WCHAR));
277 RegCloseKey(hkey);
278 return !res;
282 return FALSE;
285 /*********************************************************************
286 * general_dlgproc [internal]
289 INT_PTR CALLBACK general_dlgproc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
292 switch (msg)
294 case WM_INITDIALOG:
295 general_on_initdialog(hwnd);
296 return TRUE;
298 case WM_COMMAND:
299 return general_on_command(hwnd, wparam);
301 case WM_NOTIFY:
302 return general_on_notify(hwnd, wparam, lparam);
304 default:
305 /* do not flood the log */
306 if ((msg == WM_SETCURSOR) || (msg == WM_NCHITTEST) || (msg == WM_MOUSEMOVE))
307 return FALSE;
309 TRACE("(%p, 0x%08x/%d, 0x%lx, 0x%lx)\n", hwnd, msg, msg, wparam, lparam);
312 return FALSE;