922 lines
28 KiB
C++
922 lines
28 KiB
C++
///////////////////////////////////////////////////////////////////////
|
|
// Microsoft Windows //
|
|
// Copyright(c) Microsoft Corp., 1995 //
|
|
///////////////////////////////////////////////////////////////////////
|
|
//
|
|
// GENERAL.C - "General" property page for InetCpl
|
|
//
|
|
|
|
// HISTORY:
|
|
//
|
|
// 6/22/96 t-gpease moved code from dialdlg.c - no changes
|
|
//
|
|
|
|
#include "inetcplp.h"
|
|
|
|
#include <urlhist.h>
|
|
#include <initguid.h>
|
|
#include <shlguid.h>
|
|
#include <cleanoc.h>
|
|
|
|
#include <mluisupp.h>
|
|
|
|
//#include <shdocvw.h>
|
|
SHDOCAPI_(BOOL) ParseURLFromOutsideSourceA (LPCSTR psz, LPSTR pszOut, LPDWORD pcchOut, LPBOOL pbWasSearchURL);
|
|
SHDOCAPI_(BOOL) ParseURLFromOutsideSourceW (LPCWSTR psz, LPWSTR pszOut, LPDWORD pcchOut, LPBOOL pbWasSearchURL);
|
|
#ifdef UNICODE
|
|
#define ParseURLFromOutsideSource ParseURLFromOutsideSourceW
|
|
#else
|
|
#define ParseURLFromOutsideSource ParseURLFromOutsideSourceA
|
|
#endif
|
|
|
|
//
|
|
// See inetcplp.h for documentation on this flag
|
|
//
|
|
BOOL g_fReloadHomePage = FALSE;
|
|
|
|
//
|
|
// Private Functions and Structures
|
|
//
|
|
// from cachecpl.c
|
|
#define CONTENT 0
|
|
BOOL InvokeCachevu(HWND hDlg);
|
|
INT_PTR CALLBACK EmptyCacheDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam,LPARAM lParam);
|
|
INT_PTR CALLBACK EmptyCacheCookiesDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam,LPARAM lParam);
|
|
BOOL DeleteCacheCookies();
|
|
|
|
INT_PTR CALLBACK ColorsDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam,LPARAM lParam);
|
|
INT_PTR CALLBACK AccessibilityDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam,LPARAM lParam);
|
|
|
|
/////// General Tab Info Structure ///////
|
|
|
|
typedef struct _GeneralTabInfo {
|
|
HWND hDlg;
|
|
HWND hwndUrl;
|
|
TCHAR szCurrentURL[INTERNET_MAX_URL_LENGTH]; // current url in browser
|
|
TCHAR szStartPageURL[INTERNET_MAX_URL_LENGTH]; // current url for start page
|
|
|
|
BOOL fInternalChange;
|
|
BOOL fChanged;
|
|
|
|
HRESULT hrOle; // result of com initialization
|
|
} GeneralTabInfo, *LPGENERALTABINFO, GENERALTABINFO;
|
|
|
|
void SetandSelectText(LPGENERALTABINFO pgti, HWND hwnd, LPTSTR psz);
|
|
BOOL GetHistoryFolderPath(LPTSTR pszPath);
|
|
void EmptyHistory(LPGENERALTABINFO pgti);
|
|
void HistorySave(LPGENERALTABINFO pgti);
|
|
static DWORD GetDaysToKeep(VOID);
|
|
VOID SetDaysToKeep(DWORD dwDays);
|
|
void GetDefaultStartPage(LPGENERALTABINFO pgti);
|
|
HRESULT _GetStdLocation(LPTSTR pszPath, DWORD cbPathSize, UINT id);
|
|
HRESULT _SetStdLocation(LPTSTR szPath, UINT id);
|
|
|
|
// from shdocvw
|
|
#define IDS_DEF_HOME 998 //// WARNING!!! DO NOT CHANGE THESE VALUES
|
|
#define IDS_DEF_SEARCH 999 //// WARNING!!! INETCPL RELIES ON THEM
|
|
|
|
#define IDS_SEARCHPAGE IDS_DEF_SEARCH
|
|
#define IDS_STARTPAGE IDS_DEF_HOME
|
|
|
|
#if defined(ux10) && defined(UNIX)
|
|
//Work around for mmap limitation in hp-ux10
|
|
#define MAX_HISTORY_DAYS 30
|
|
#else
|
|
#define MAX_HISTORY_DAYS 999
|
|
#endif
|
|
|
|
#define DEFAULT_DAYS_TO_KEEP 14
|
|
#define SAFERELEASE(p) if(p) {(p)->Release(); (p) = NULL;}
|
|
|
|
TCHAR szDefURLValueNames[] = TEXT("Default_Page_URL");
|
|
|
|
//
|
|
// Functions
|
|
//
|
|
BOOL General_InitDialog(HWND hDlg)
|
|
{
|
|
DWORD cb = sizeof(DWORD);
|
|
LPGENERALTABINFO pgti;
|
|
#ifdef UNIX
|
|
BOOL bCacheIsReadOnly = FALSE;
|
|
#endif /* UNIX */
|
|
|
|
// allocate memory for a structure which will hold all the info
|
|
// gathered from this page
|
|
//
|
|
pgti = (LPGENERALTABINFO)LocalAlloc(LPTR, sizeof(GENERALTABINFO));
|
|
if (!pgti)
|
|
{
|
|
EndDialog(hDlg, 0);
|
|
return FALSE;
|
|
}
|
|
SetWindowLongPtr(hDlg, DWLP_USER, (LPARAM)pgti);
|
|
|
|
// NOTE (andrewgu): ie5.5 b#106468 - need to initialize COM before calling SHAutoComplete.
|
|
// it will be uninitialized during WM_DESTROY.
|
|
pgti->hrOle = SHCoInitialize();
|
|
|
|
// cross-lang platform support
|
|
SHSetDefaultDialogFont(hDlg, IDC_START_ADDRESS);
|
|
SHAutoComplete(GetDlgItem(hDlg, IDC_START_ADDRESS), SHACF_DEFAULT);
|
|
|
|
pgti->hDlg = hDlg;
|
|
// enable the "Use Current" button if we have a current url
|
|
StrCpyN(pgti->szCurrentURL, g_szCurrentURL, ARRAYSIZE(pgti->szCurrentURL));
|
|
EnableWindow(GetDlgItem(hDlg, IDC_USECURRENT), pgti->szCurrentURL[0]);
|
|
|
|
// get the url edit control and set the text limit
|
|
pgti->hwndUrl = GetDlgItem(hDlg, IDC_START_ADDRESS);
|
|
SendMessage(pgti->hwndUrl, EM_LIMITTEXT, ARRAYSIZE(pgti->szStartPageURL)-1, 0);
|
|
|
|
GetDefaultStartPage(pgti);
|
|
_GetStdLocation(pgti->szStartPageURL, ARRAYSIZE(pgti->szStartPageURL), IDS_STARTPAGE);
|
|
SetandSelectText(pgti, pgti->hwndUrl, (LPTSTR)pgti->szStartPageURL);
|
|
// set restrictions on history controls
|
|
SendDlgItemMessage(pgti->hDlg, IDC_HISTORY_SPIN,
|
|
UDM_SETRANGE, 0, MAKELPARAM(MAX_HISTORY_DAYS, 0));
|
|
|
|
SendDlgItemMessage(pgti->hDlg, IDC_HISTORY_SPIN,
|
|
UDM_SETPOS, 0, MAKELPARAM((WORD) GetDaysToKeep(), 0));
|
|
|
|
Edit_LimitText(GetDlgItem(hDlg,IDC_HISTORY_DAYS),3); // limit edit ctrl to 3 chars
|
|
|
|
// only when invoked from View|Options
|
|
if (g_szCurrentURL[0])
|
|
{
|
|
TCHAR szTitle[128];
|
|
MLLoadString(IDS_INTERNETOPTIONS, szTitle, ARRAYSIZE(szTitle));
|
|
SendMessage(GetParent(hDlg), WM_SETTEXT, 0, (LPARAM)szTitle);
|
|
}
|
|
|
|
// disable stuff based on restrictions
|
|
if (g_restrict.fPlaces)
|
|
{
|
|
EnableWindow(GetDlgItem(hDlg, IDC_START_ADDRESS), FALSE);
|
|
EnableWindow(GetDlgItem(hDlg, IDC_USEDEFAULT), FALSE);
|
|
EnableWindow(GetDlgItem(hDlg, IDC_USEBLANK), FALSE);
|
|
EnableWindow(GetDlgItem(hDlg, IDC_USECURRENT), FALSE);
|
|
}
|
|
|
|
if (g_restrict.fCacheReadOnly)
|
|
{
|
|
EnableWindow(GetDlgItem(hDlg, IDC_CACHE_DELETE_COOKIES), FALSE);
|
|
EnableWindow(GetDlgItem(hDlg, IDC_CACHE_DELETE_FILES), FALSE);
|
|
EnableWindow(GetDlgItem(hDlg, IDC_CACHE_SETTINGS), FALSE);
|
|
}
|
|
|
|
#ifdef UNIX
|
|
bCacheIsReadOnly = IsCacheReadOnly();
|
|
|
|
if (bCacheIsReadOnly)
|
|
{
|
|
EnableWindow(GetDlgItem(hDlg, IDC_CACHE_DELETE_COOKIES), FALSE);
|
|
EnableWindow(GetDlgItem(hDlg, IDC_CACHE_DELETE_FILES), FALSE);
|
|
EnableWindow(GetDlgItem(hDlg, IDC_CACHE_SETTINGS), FALSE);
|
|
}
|
|
|
|
if (g_restrict.fCache || bCacheIsReadOnly)
|
|
{
|
|
TCHAR szText[1024];
|
|
|
|
MLLoadString(IDS_READONLY_CACHE_TEXT, szText, ARRAYSIZE(szText));
|
|
|
|
SetWindowText(GetDlgItem(hDlg, IDC_READONLY_CACHE_WARNING), szText);
|
|
ShowWindow( GetDlgItem(hDlg, IDC_READONLY_CACHE_WARNING), SW_SHOW );
|
|
|
|
ShowWindow( GetDlgItem(hDlg, IDC_TEMP_INTERNET_TEXT), SW_HIDE);
|
|
}
|
|
#endif /* !UNIX */
|
|
if (g_restrict.fHistory)
|
|
{
|
|
EnableWindow(GetDlgItem(hDlg, IDC_HISTORY_DAYS), FALSE);
|
|
EnableWindow(GetDlgItem(hDlg, IDC_HISTORY_SPIN), FALSE);
|
|
EnableWindow(GetDlgItem(hDlg, IDC_HISTORY_CLEAR), FALSE);
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL General_OnCommand(LPGENERALTABINFO pgti, UINT id, UINT nCmd)
|
|
{
|
|
switch (id)
|
|
{
|
|
|
|
case IDC_START_ADDRESS:
|
|
switch (nCmd)
|
|
{
|
|
case EN_CHANGE:
|
|
if (!pgti->fInternalChange)
|
|
{
|
|
PropSheet_Changed(GetParent(pgti->hDlg),pgti->hDlg);
|
|
pgti->fChanged = TRUE;
|
|
}
|
|
break;
|
|
}
|
|
break;
|
|
|
|
case IDC_USECURRENT:
|
|
if (nCmd == BN_CLICKED)
|
|
{
|
|
StrCpyN(pgti->szStartPageURL, pgti->szCurrentURL, ARRAYSIZE(pgti->szStartPageURL));
|
|
SetandSelectText(pgti, pgti->hwndUrl, pgti->szStartPageURL);
|
|
PropSheet_Changed(GetParent(pgti->hDlg),pgti->hDlg);
|
|
pgti->fChanged = TRUE;
|
|
}
|
|
break;
|
|
|
|
case IDC_USEDEFAULT:
|
|
if (nCmd == BN_CLICKED)
|
|
{
|
|
GetDefaultStartPage(pgti);
|
|
SetandSelectText(pgti, pgti->hwndUrl, pgti->szStartPageURL);
|
|
PropSheet_Changed(GetParent(pgti->hDlg),pgti->hDlg);
|
|
pgti->fChanged = TRUE;
|
|
}
|
|
break;
|
|
|
|
case IDC_USEBLANK:
|
|
if (nCmd == BN_CLICKED)
|
|
{
|
|
StrCpyN(pgti->szStartPageURL, TEXT("about:blank"), ARRAYSIZE(pgti->szStartPageURL));
|
|
SetandSelectText(pgti, pgti->hwndUrl, pgti->szStartPageURL);
|
|
PropSheet_Changed(GetParent(pgti->hDlg),pgti->hDlg);
|
|
pgti->fChanged = TRUE;
|
|
}
|
|
break;
|
|
|
|
case IDC_HISTORY_SPIN:
|
|
case IDC_HISTORY_DAYS:
|
|
if (pgti && (nCmd == EN_CHANGE))
|
|
{
|
|
PropSheet_Changed(GetParent(pgti->hDlg),pgti->hDlg);
|
|
pgti->fChanged = TRUE;
|
|
}
|
|
break;
|
|
|
|
case IDC_HISTORY_VIEW:
|
|
{
|
|
TCHAR szPath[MAX_PATH];
|
|
|
|
if (!GetHistoryFolderPath(szPath))
|
|
{
|
|
GetWindowsDirectory(szPath, ARRAYSIZE(szPath));
|
|
PathAppend(szPath, TEXT("history"));
|
|
}
|
|
|
|
SHELLEXECUTEINFO shei= { 0 };
|
|
|
|
shei.cbSize = sizeof(shei);
|
|
shei.lpFile = szPath;
|
|
shei.lpClass = TEXT("Folder");
|
|
shei.fMask = SEE_MASK_CLASSNAME;
|
|
shei.nShow = SW_SHOWNORMAL;
|
|
ShellExecuteEx(&shei);
|
|
|
|
break;
|
|
}
|
|
|
|
case IDC_HISTORY_CLEAR:
|
|
if (MsgBox(pgti->hDlg, IDS_ClearHistory, MB_ICONQUESTION,
|
|
MB_YESNO | MB_DEFBUTTON2 )
|
|
== IDYES)
|
|
{
|
|
|
|
HCURSOR hOldCursor = NULL;
|
|
HCURSOR hNewCursor = NULL;
|
|
|
|
// IEUNIX-Removing redundant use of MAKEINTRESOURCE
|
|
#ifndef UNIX
|
|
hNewCursor = LoadCursor(NULL, MAKEINTRESOURCE(IDC_WAIT));
|
|
#else
|
|
hNewCursor = LoadCursor(NULL, IDC_WAIT);
|
|
#endif
|
|
|
|
if (hNewCursor)
|
|
hOldCursor = SetCursor(hNewCursor);
|
|
|
|
EmptyHistory(pgti);
|
|
|
|
if(hOldCursor)
|
|
SetCursor(hOldCursor);
|
|
|
|
}
|
|
break;
|
|
|
|
case IDC_CACHE_SETTINGS:
|
|
DialogBox(MLGetHinst(), MAKEINTRESOURCE(IDD_TEMP_FILES),
|
|
pgti->hDlg, TemporaryDlgProc);
|
|
|
|
break; // IDC_ADVANCED_CACHE_FILES_BUTTON
|
|
|
|
case IDC_CACHE_DELETE_COOKIES:
|
|
{
|
|
INT_PTR iRet = DialogBox(MLGetHinst(), MAKEINTRESOURCE(IDD_CACHE_COOKIES_EMPTY),
|
|
pgti->hDlg, EmptyCacheCookiesDlgProc);
|
|
|
|
if (iRet == 1)
|
|
{
|
|
HCURSOR hOldCursor = NULL;
|
|
HCURSOR hAdvancedCursor = NULL;
|
|
#ifndef UNIX
|
|
hAdvancedCursor = LoadCursor(NULL, MAKEINTRESOURCE(IDC_WAIT));
|
|
#else
|
|
//IEUNIX-Removing redundant use of MAKEINTRESOURCE
|
|
hAdvancedCursor = LoadCursor(NULL, IDC_WAIT);
|
|
#endif
|
|
if (hAdvancedCursor)
|
|
hOldCursor = SetCursor(hAdvancedCursor);
|
|
|
|
DeleteCacheCookies();
|
|
|
|
if (hOldCursor)
|
|
SetCursor(hOldCursor);
|
|
}
|
|
break;
|
|
}
|
|
case IDC_CACHE_DELETE_FILES:
|
|
{
|
|
INT_PTR iRet = DialogBox(MLGetHinst(), MAKEINTRESOURCE(IDD_CACHE_EMPTY),
|
|
pgti->hDlg, EmptyCacheDlgProc);
|
|
|
|
if ((iRet == 1) || (iRet == 3))
|
|
{
|
|
HCURSOR hOldCursor = NULL;
|
|
HCURSOR hAdvancedCursor = NULL;
|
|
INTERNET_CACHE_CONFIG_INFOA icci;
|
|
icci.dwContainer = CONTENT;
|
|
|
|
GetUrlCacheConfigInfoA(&icci, NULL, CACHE_CONFIG_DISK_CACHE_PATHS_FC);
|
|
|
|
#ifndef UNIX
|
|
hAdvancedCursor = LoadCursor(NULL, MAKEINTRESOURCE(IDC_WAIT));
|
|
#else
|
|
//IEUNIX-Removing redundant use of MAKEINTRESOURCE
|
|
hAdvancedCursor = LoadCursor(NULL, IDC_WAIT);
|
|
#endif
|
|
|
|
if (hAdvancedCursor)
|
|
hOldCursor = SetCursor(hAdvancedCursor);
|
|
|
|
switch (iRet) {
|
|
case 1:
|
|
FreeUrlCacheSpaceA(icci.CachePath, 100, STICKY_CACHE_ENTRY);
|
|
TraceMsg(TF_GENERAL, "Call FreeUrlCacheSpace with 0x%x",STICKY_CACHE_ENTRY);
|
|
break;
|
|
case 3:
|
|
FreeUrlCacheSpaceA(icci.CachePath, 100, 0 /*remove all*/);
|
|
TraceMsg(TF_GENERAL, "Call FreeUrlCacheSpace with 0");
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
|
|
// Remove expired controls from Downloaded Program Files ( OCCache )
|
|
// We'll do this silently, which leaves uncertain stuff behing, cuz
|
|
// this is preferrable to raising a variable number of confirmation dialogs.
|
|
RemoveExpiredControls( REC_SILENT, 0);
|
|
TraceMsg(TF_GENERAL, "Call RemoveExpiredControls (silent)");
|
|
|
|
if (hOldCursor)
|
|
SetCursor(hOldCursor);
|
|
|
|
}
|
|
break;
|
|
}
|
|
|
|
case IDC_LANGUAGES:
|
|
if (nCmd == BN_CLICKED)
|
|
{
|
|
KickLanguageDialog(pgti->hDlg);
|
|
}
|
|
break;
|
|
|
|
case IDC_FONTS:
|
|
if (nCmd == BN_CLICKED)
|
|
OpenFontsDialogEx( pgti->hDlg, NULL );
|
|
break;
|
|
|
|
case IDC_COLORS:
|
|
if (nCmd == BN_CLICKED)
|
|
DialogBox(MLGetHinst(), MAKEINTRESOURCE(IDD_COLORS), pgti->hDlg, ColorsDlgProc);
|
|
break;
|
|
|
|
case IDC_ACCESSIBILITY:
|
|
if (nCmd == BN_CLICKED)
|
|
DialogBox(MLGetHinst(), MAKEINTRESOURCE(IDD_ACCESSIBILITY), pgti->hDlg, AccessibilityDlgProc);
|
|
break;
|
|
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
void General_Apply(HWND hDlg)
|
|
{
|
|
LPGENERALTABINFO pgti = (LPGENERALTABINFO) GetWindowLongPtr(hDlg, DWLP_USER);
|
|
|
|
if (pgti->fChanged)
|
|
{
|
|
INT_PTR iDays = SendDlgItemMessage(pgti->hDlg, IDC_HISTORY_SPIN, UDM_GETPOS, 0, 0 );
|
|
TCHAR szStartPageURL[MAX_URL_STRING];
|
|
|
|
SendMessage(pgti->hwndUrl, WM_GETTEXT, (WPARAM)ARRAYSIZE(szStartPageURL), (LPARAM)(szStartPageURL));
|
|
|
|
if (szStartPageURL[0])
|
|
{
|
|
StrCpyN(pgti->szStartPageURL, szStartPageURL, ARRAYSIZE(pgti->szStartPageURL));
|
|
PathRemoveBlanks(pgti->szStartPageURL);
|
|
_SetStdLocation(pgti->szStartPageURL, IDS_STARTPAGE);
|
|
}
|
|
else
|
|
{
|
|
SendMessage(pgti->hwndUrl, WM_SETTEXT, (WPARAM)ARRAYSIZE(pgti->szStartPageURL), (LPARAM)(pgti->szStartPageURL));
|
|
}
|
|
|
|
// make sure that the edit box is not beyond the maximum allowed value
|
|
if (iDays>=0xFFFF)
|
|
iDays = MAX_HISTORY_DAYS;
|
|
SetDaysToKeep((DWORD)iDays);
|
|
|
|
UpdateAllWindows();
|
|
// reset this flag, now that we've applied the changes
|
|
pgti->fChanged = FALSE;
|
|
}
|
|
}
|
|
|
|
void ReloadHomePageIfNeeded(LPGENERALTABINFO pgti)
|
|
{
|
|
ASSERT(pgti);
|
|
if (!pgti)
|
|
return;
|
|
|
|
if (g_fReloadHomePage)
|
|
{
|
|
//
|
|
// If needed, reload the homepage url from the registry
|
|
//
|
|
_GetStdLocation(pgti->szStartPageURL, ARRAYSIZE(pgti->szStartPageURL), IDS_STARTPAGE);
|
|
SetandSelectText(pgti, pgti->hwndUrl, (LPTSTR)pgti->szStartPageURL);
|
|
|
|
g_fReloadHomePage = FALSE;
|
|
}
|
|
}
|
|
|
|
INT_PTR CALLBACK General_DlgProc(HWND hDlg, UINT uMsg, WPARAM wParam,LPARAM lParam)
|
|
{
|
|
// get our tab info structure
|
|
LPGENERALTABINFO pgti;
|
|
|
|
if (uMsg == WM_INITDIALOG)
|
|
return General_InitDialog(hDlg);
|
|
|
|
else
|
|
pgti = (LPGENERALTABINFO) GetWindowLongPtr(hDlg, DWLP_USER);
|
|
|
|
if (!pgti)
|
|
return FALSE;
|
|
|
|
switch (uMsg)
|
|
{
|
|
case WM_NOTIFY:
|
|
{
|
|
NMHDR *lpnm = (NMHDR *) lParam;
|
|
|
|
switch (lpnm->code)
|
|
{
|
|
case PSN_SETACTIVE:
|
|
ReloadHomePageIfNeeded(pgti);
|
|
return TRUE;
|
|
|
|
case PSN_KILLACTIVE:
|
|
#if defined(ux10) && defined(UNIX)
|
|
//Work around for mmap limitation in hp-ux10
|
|
INT_PTR iDays = SendDlgItemMessage(pgti->hDlg, IDC_HISTORY_SPIN, UDM_GETPOS, 0, 0 );
|
|
if (iDays > MAX_HISTORY_DAYS)
|
|
{
|
|
MessageBox(pgti->hDlg, TEXT("Days to keep pages in history cannot be greater 30."), NULL, MB_OK);
|
|
Edit_SetText(GetDlgItem(hDlg,IDC_HISTORY_DAYS), TEXT("30"));
|
|
SetWindowLongPtr(hDlg, DWLP_MSGRESULT, TRUE);
|
|
return TRUE;
|
|
}
|
|
else
|
|
{
|
|
SetWindowLongPtr(hDlg, DWLP_MSGRESULT, FALSE);
|
|
return TRUE;
|
|
}
|
|
#endif
|
|
case PSN_QUERYCANCEL:
|
|
case PSN_RESET:
|
|
SetWindowLongPtr(hDlg, DWLP_MSGRESULT, FALSE);
|
|
return TRUE;
|
|
|
|
case PSN_APPLY:
|
|
ReloadHomePageIfNeeded(pgti);
|
|
General_Apply(hDlg);
|
|
break;
|
|
}
|
|
break;
|
|
}
|
|
|
|
case WM_COMMAND:
|
|
General_OnCommand(pgti, LOWORD(wParam), HIWORD(wParam));
|
|
break;
|
|
|
|
case WM_HELP: // F1
|
|
ResWinHelp( (HWND)((LPHELPINFO)lParam)->hItemHandle, IDS_HELPFILE,
|
|
HELP_WM_HELP, (DWORD_PTR)(LPSTR)mapIDCsToIDHs);
|
|
break;
|
|
|
|
case WM_CONTEXTMENU: // right mouse click
|
|
ResWinHelp( (HWND) wParam, IDS_HELPFILE,
|
|
HELP_CONTEXTMENU, (DWORD_PTR)(LPSTR)mapIDCsToIDHs);
|
|
break;
|
|
|
|
case WM_DESTROY:
|
|
// destroying this deliberately flushes its update (see WM_DESTROY in the UpdateWndProc);
|
|
SHRemoveDefaultDialogFont(hDlg);
|
|
|
|
#ifndef UNIX
|
|
// Should only be destroyed in process detach
|
|
if (g_hwndUpdate)
|
|
DestroyWindow(g_hwndUpdate);
|
|
#endif
|
|
|
|
SHCoUninitialize(pgti->hrOle);
|
|
|
|
if (pgti)
|
|
LocalFree(pgti);
|
|
|
|
SetWindowLongPtr(hDlg, DWLP_USER, (LONG_PTR)NULL); // make sure we don't re-enter
|
|
break;
|
|
|
|
}
|
|
return FALSE;
|
|
}
|
|
|
|
|
|
////////////////////////////////////////////////////////
|
|
//
|
|
// helper functions
|
|
//
|
|
////////////////////////////////////////////////////////
|
|
|
|
VOID SetDaysToKeep(DWORD dwDays)
|
|
{
|
|
HKEY hk;
|
|
DWORD dwDisp;
|
|
|
|
DWORD Error = RegCreateKeyEx(
|
|
HKEY_CURRENT_USER,
|
|
REGSTR_PATH_URLHISTORY,
|
|
0, NULL, 0,
|
|
KEY_WRITE,
|
|
NULL,
|
|
&hk,
|
|
&dwDisp);
|
|
|
|
if(ERROR_SUCCESS != Error)
|
|
{
|
|
ASSERT(FALSE);
|
|
return;
|
|
}
|
|
|
|
Error = RegSetValueEx(
|
|
hk,
|
|
REGSTR_VAL_DAYSTOKEEP,
|
|
0,
|
|
REG_DWORD,
|
|
(LPBYTE) &dwDays,
|
|
sizeof(dwDays));
|
|
|
|
ASSERT(ERROR_SUCCESS == Error);
|
|
|
|
RegCloseKey(hk);
|
|
|
|
return;
|
|
}
|
|
|
|
static DWORD GetDaysToKeep(VOID)
|
|
{
|
|
HKEY hk;
|
|
DWORD cbDays = sizeof(DWORD);
|
|
DWORD dwDays = DEFAULT_DAYS_TO_KEEP;
|
|
|
|
|
|
DWORD Error = RegOpenKeyEx(
|
|
HKEY_CURRENT_USER,
|
|
REGSTR_PATH_URLHISTORY,
|
|
0,
|
|
KEY_READ,
|
|
&hk);
|
|
|
|
|
|
if(Error)
|
|
{
|
|
Error = RegOpenKeyEx(
|
|
HKEY_LOCAL_MACHINE,
|
|
REGSTR_PATH_URLHISTORY,
|
|
0,
|
|
KEY_READ,
|
|
&hk);
|
|
}
|
|
|
|
|
|
if(!Error)
|
|
{
|
|
|
|
Error = RegQueryValueEx(
|
|
hk,
|
|
REGSTR_VAL_DAYSTOKEEP,
|
|
0,
|
|
NULL,
|
|
(LPBYTE) &dwDays,
|
|
&cbDays);
|
|
|
|
|
|
RegCloseKey(hk);
|
|
}
|
|
|
|
return dwDays;
|
|
}
|
|
|
|
typedef HRESULT (* PCOINIT) (LPVOID);
|
|
typedef VOID (* PCOUNINIT) (VOID);
|
|
typedef VOID (* PCOMEMFREE) (LPVOID);
|
|
typedef HRESULT (* PCOCREINST) (REFCLSID, LPUNKNOWN, DWORD, REFIID, LPVOID * );
|
|
|
|
HMODULE hOLE32 = NULL;
|
|
PCOINIT pCoInitialize = NULL;
|
|
PCOUNINIT pCoUninitialize = NULL;
|
|
PCOMEMFREE pCoTaskMemFree = NULL;
|
|
PCOCREINST pCoCreateInstance = NULL;
|
|
|
|
BOOL _StartOLE32()
|
|
{
|
|
if (!hOLE32)
|
|
hOLE32 = LoadLibrary(TEXT("OLE32.DLL"));
|
|
|
|
if(!hOLE32)
|
|
return FALSE;
|
|
|
|
pCoInitialize = (PCOINIT) GetProcAddress(hOLE32, "CoInitialize");
|
|
pCoUninitialize = (PCOUNINIT) GetProcAddress(hOLE32, "CoUninitialize");
|
|
pCoTaskMemFree = (PCOMEMFREE) GetProcAddress(hOLE32, "CoTaskMemFree");
|
|
pCoCreateInstance = (PCOCREINST) GetProcAddress(hOLE32, "CoCreateInstance");
|
|
|
|
|
|
if(!pCoInitialize || !pCoUninitialize || !pCoTaskMemFree || !pCoCreateInstance)
|
|
return FALSE;
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
void EmptyHistory(LPGENERALTABINFO pgti)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
IUrlHistoryStg2 *piuhs = NULL;
|
|
|
|
#ifdef UNIX
|
|
LONG lResult;
|
|
HKEY hkSubKey;
|
|
DWORD dwIndex;
|
|
TCHAR szSubKeyName[MAX_PATH + 1];
|
|
DWORD cchSubKeyName = ARRAYSIZE(szSubKeyName);
|
|
TCHAR szClass[MAX_PATH];
|
|
DWORD cbClass = ARRAYSIZE(szClass);
|
|
|
|
/* v-sriran: 12/18/97
|
|
* In shdocvw/aclmru.cpp, we keep m_hKey as a handle to the key TypedURLs.
|
|
* After deleting history, if somebody types something in the address bar,
|
|
* we create the key again. So, here we are just deleting the contents of
|
|
* the key TypedURLs and not the key itself.
|
|
*/
|
|
/* Open the subkey so we can enumerate any children */
|
|
lResult = RegOpenKeyEx(HKEY_CURRENT_USER,
|
|
TEXT("Software\\Microsoft\\Internet Explorer\\TypedURLs"),
|
|
0,
|
|
KEY_ALL_ACCESS,
|
|
&hkSubKey);
|
|
if (ERROR_SUCCESS == lResult)
|
|
{
|
|
/* I can't just call RegEnumKey with an ever-increasing index, because */
|
|
/* I'm deleting the subkeys as I go, which alters the indices of the */
|
|
/* remaining subkeys in an implementation-dependent way. In order to */
|
|
/* be safe, I have to count backwards while deleting the subkeys. */
|
|
|
|
/* Find out how many subkeys there are */
|
|
lResult = RegQueryInfoKey(hkSubKey,
|
|
szClass,
|
|
&cbClass,
|
|
NULL,
|
|
&dwIndex, /* The # of subkeys -- all we need */
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL);
|
|
|
|
if (ERROR_SUCCESS == lResult) {
|
|
/* dwIndex is now the count of subkeys, but it needs to be */
|
|
/* zero-based for RegEnumKey, so I'll pre-decrement, rather */
|
|
/* than post-decrement. */
|
|
while (ERROR_SUCCESS == RegEnumKey(hkSubKey, --dwIndex, szSubKeyName, cchSubKeyName))
|
|
{
|
|
RegDeleteKey(hkSubKey, szSubKeyName);
|
|
}
|
|
}
|
|
|
|
RegCloseKey(hkSubKey);
|
|
}
|
|
#else
|
|
// Warning : if you ever have subkeys - this will fail on NT
|
|
RegDeleteKey(HKEY_CURRENT_USER, TEXT("Software\\Microsoft\\Internet Explorer\\TypedURLs"));
|
|
#endif
|
|
|
|
// Warning : if you ever have subkeys - this will fail on NT
|
|
RegDeleteKey(HKEY_CURRENT_USER, TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\RunMRU"));
|
|
|
|
// this broadcast will nuke the address bars
|
|
SendBroadcastMessage(WM_SETTINGCHANGE, 0, (LPARAM)TEXT("Software\\Microsoft\\Internet Explorer\\TypedURLs"));
|
|
SendBroadcastMessage(WM_SETTINGCHANGE, 0, (LPARAM)TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\RunMRU"));
|
|
|
|
//
|
|
// As requested (bug 60089) we remove these reg values when history is
|
|
// cleared. This will reset the encoding menu UI to the defaults.
|
|
//
|
|
HKEY hkeyInternational = NULL;
|
|
|
|
if (ERROR_SUCCESS ==
|
|
RegOpenKeyEx(
|
|
HKEY_CURRENT_USER,
|
|
REGSTR_PATH_INTERNATIONAL,
|
|
0,
|
|
KEY_WRITE,
|
|
&hkeyInternational))
|
|
{
|
|
|
|
ASSERT(hkeyInternational);
|
|
|
|
RegDeleteValue(hkeyInternational, TEXT("CpCache"));
|
|
RegDeleteValue(hkeyInternational, TEXT("CNum_CpCache"));
|
|
|
|
RegCloseKey(hkeyInternational);
|
|
|
|
}
|
|
|
|
// we will enumerate and kill each entry. <gryn>
|
|
// this way we only kill peruser
|
|
if (FAILED(pgti->hrOle))
|
|
return;
|
|
|
|
hr = SHCoCreateInstance(NULL, &CLSID_CUrlHistory, NULL, IID_IUrlHistoryStg2, (LPVOID *)&piuhs);
|
|
if (SUCCEEDED(hr))
|
|
piuhs->ClearHistory();
|
|
|
|
else
|
|
AssertMsg(FALSE, TEXT("Couldn't create CLSID_CUrlHistory object!"));
|
|
|
|
SAFERELEASE(piuhs);
|
|
}
|
|
|
|
#define HISTORY 2
|
|
|
|
BOOL GetHistoryFolderPath(LPTSTR pszPath)
|
|
{
|
|
INTERNET_CACHE_CONFIG_INFOA cci;
|
|
cci.dwContainer = HISTORY;
|
|
|
|
if (GetUrlCacheConfigInfoA(&cci, NULL, CACHE_CONFIG_DISK_CACHE_PATHS_FC))
|
|
{
|
|
#ifdef UNICODE
|
|
SHAnsiToUnicode(cci.CachePath, pszPath, MAX_PATH);
|
|
#else
|
|
StrCpyN(pszPath, cci.CachePath, MAX_PATH);
|
|
#endif
|
|
return TRUE;
|
|
}
|
|
return FALSE;
|
|
}
|
|
|
|
void SetandSelectText(LPGENERALTABINFO pgti, HWND hwnd, LPTSTR psz)
|
|
{
|
|
pgti->fInternalChange = TRUE;
|
|
SendMessage(hwnd, WM_SETTEXT, 0, (LPARAM)psz);
|
|
Edit_SetSel(hwnd, 0, 0); // makesure everything is scrolled over first
|
|
Edit_SetSel(hwnd, 0, -1); // select everything
|
|
pgti->fInternalChange = FALSE;
|
|
}
|
|
|
|
void GetDefaultStartPage(LPGENERALTABINFO pgti)
|
|
{
|
|
#ifdef UNICODE
|
|
CHAR szPath[MAX_PATH];
|
|
CHAR szValue[MAX_PATH];
|
|
CHAR szURL[INTERNET_MAX_URL_LENGTH];
|
|
|
|
SHUnicodeToAnsi(REGSTR_PATH_MAIN,szPath,ARRAYSIZE(szPath));
|
|
SHUnicodeToAnsi(szDefURLValueNames,szValue,ARRAYSIZE(szValue));
|
|
URLSubRegQueryA(szPath,
|
|
szValue,
|
|
TRUE,
|
|
szURL,
|
|
ARRAYSIZE(pgti->szStartPageURL),
|
|
URLSUB_ALL);
|
|
SHAnsiToUnicode(szURL,pgti->szStartPageURL,ARRAYSIZE(pgti->szStartPageURL));
|
|
#else
|
|
URLSubRegQueryA(REGSTR_PATH_MAIN,
|
|
szDefURLValueNames,
|
|
TRUE,
|
|
pgti->szStartPageURL,
|
|
ARRAYSIZE(pgti->szStartPageURL),
|
|
URLSUB_ALL);
|
|
#endif
|
|
}
|
|
|
|
HRESULT _GetStdLocation(LPTSTR pszPath, DWORD cbPathSize, UINT id)
|
|
{
|
|
HRESULT hres = E_FAIL;
|
|
LPCTSTR pszName;
|
|
|
|
switch(id) {
|
|
case IDS_STARTPAGE:
|
|
pszName = REGSTR_VAL_STARTPAGE;
|
|
break;
|
|
|
|
case IDS_SEARCHPAGE:
|
|
pszName = REGSTR_VAL_SEARCHPAGE;
|
|
break;
|
|
#if 0
|
|
case IDM_GOLOCALPAGE:
|
|
pszName = REGSTR_VAL_LOCALPAGE;
|
|
break;
|
|
#endif
|
|
default:
|
|
return E_INVALIDARG;
|
|
}
|
|
|
|
#ifdef UNICODE
|
|
CHAR szPath[MAX_PATH];
|
|
CHAR szValue[MAX_PATH];
|
|
CHAR szURL[INTERNET_MAX_URL_LENGTH];
|
|
|
|
SHUnicodeToAnsi(REGSTR_PATH_MAIN,szPath,ARRAYSIZE(szPath));
|
|
SHUnicodeToAnsi(pszName,szValue,ARRAYSIZE(szValue));
|
|
if (SUCCEEDED(hres = URLSubRegQueryA(szPath, szValue, TRUE,
|
|
szURL, ARRAYSIZE(szURL), URLSUB_ALL)))
|
|
#else
|
|
TCHAR szPath[MAX_URL_STRING];
|
|
if (SUCCEEDED(hres = URLSubRegQueryA(REGSTR_PATH_MAIN, pszName, TRUE,
|
|
szPath, ARRAYSIZE(szPath), URLSUB_ALL)))
|
|
#endif
|
|
{
|
|
#ifdef UNICODE
|
|
SHAnsiToUnicode(szURL,pszPath,cbPathSize);
|
|
#else
|
|
StrCpyN(pszPath, szPath, cbPathSize);
|
|
#endif
|
|
}
|
|
return hres;
|
|
}
|
|
|
|
HRESULT _SetStdLocation(LPTSTR szPath, UINT id)
|
|
{
|
|
HRESULT hres = E_FAIL;
|
|
HKEY hkey;
|
|
TCHAR szPage[MAX_URL_STRING];
|
|
TCHAR szNewPage[MAX_URL_STRING];
|
|
|
|
DWORD cchNewPage = ARRAYSIZE(szNewPage);
|
|
BOOL bSearch = FALSE;
|
|
|
|
// FEATURE: Share this code!!!
|
|
// This is Internet Explorer Specific
|
|
|
|
_GetStdLocation(szPage, ARRAYSIZE(szPage), IDS_STARTPAGE);
|
|
|
|
if ( ParseURLFromOutsideSource(szPath, szNewPage, &cchNewPage, &bSearch) &&
|
|
(StrCmp(szPage, szNewPage) != 0) )
|
|
{
|
|
if (RegOpenKeyEx(HKEY_CURRENT_USER,
|
|
REGSTR_PATH_MAIN,
|
|
0,
|
|
KEY_WRITE,
|
|
&hkey)==ERROR_SUCCESS)
|
|
{
|
|
DWORD cbSize = (lstrlen(szNewPage)+1)*sizeof(TCHAR);
|
|
if (RegSetValueEx(hkey,
|
|
REGSTR_VAL_STARTPAGE,
|
|
0,
|
|
REG_SZ,
|
|
(LPBYTE)szNewPage, cbSize)==ERROR_SUCCESS)
|
|
{
|
|
hres = S_OK;
|
|
}
|
|
RegCloseKey(hkey);
|
|
}
|
|
}
|
|
return hres;
|
|
}
|