|
|
/*++
Copyright (c) 1995 Microsoft Corporation
File Name:
cachecpl.c
Module :
inetcpl.cpl
Abstract:
This file contains code to set cache config information from the internet control panel
Author:
Shishir Pardikar
6/22/96 t-gpease moved entire dailog to this file from "dialdlg.c"
Environment:
User Mode - Win32
Revision History:
--*/
#include "inetcplp.h"
#include "cachecpl.h"
#include <mluisupp.h>
#include <winnls.h>
#ifdef unix
#define DIR_SEPARATOR_CHAR TEXT('/')
#else
#define DIR_SEPARATOR_CHAR TEXT('\\')
#endif /* unix */
#define CONSTANT_MEGABYTE (1024*1024)
INT_PTR CALLBACK EmptyCacheDlgProc( HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
INT_PTR CALLBACK EmptyCacheCookiesDlgProc( HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
#ifdef UNICODE
/* GetDiskInfo
A nice way to get volume information */ BOOL GetDiskInfo(PTSTR pszPath, PDWORD pdwClusterSize, PDWORDLONG pdlAvail, PDWORDLONG pdlTotal) { CHAR szGDFSEXA[MAX_PATH]; SHUnicodeToAnsi(pszPath, szGDFSEXA, ARRAYSIZE(szGDFSEXA)); return GetDiskInfoA(szGDFSEXA, pdwClusterSize, pdlAvail, pdlTotal); } #else
#define GetDiskInfo GetDiskInfoA
#endif
/* DispMessage
A quick and easy way to display messages for the cachecpl */
INT DispMessage(HWND hWnd, UINT Msg, UINT Title, UINT Type) { TCHAR szTitle[80]; TCHAR szMessage[1024]; // something went wrong with the registry
// notify user
MLLoadShellLangString(Msg, szMessage, ARRAYSIZE(szMessage)); MLLoadShellLangString(Title, szTitle, ARRAYSIZE(szTitle));
return MessageBox(hWnd, szMessage, szTitle, Type); }
typedef HRESULT (*PFNSHGETFOLDERPATH)(HWND hwnd, int csidl, HANDLE hToken, DWORD dwFlags, LPTSTR pszPath);
#undef SHGetFolderPath
#ifdef UNICODE
#define SHGETFOLDERPATH_STR "SHGetFolderPathW"
#else
#define SHGETFOLDERPATH_STR "SHGetFolderPathA"
#endif
HRESULT SHGetFolderPath(HWND hwnd, int csidl, HANDLE hToken, DWORD dwFlags, LPTSTR pszPath) { HMODULE hmodSHFolder = LoadLibrary(TEXT("shfolder.dll")); HRESULT hr = E_FAIL; if (hmodSHFolder) { PFNSHGETFOLDERPATH pfn = (PFNSHGETFOLDERPATH)GetProcAddress(hmodSHFolder, SHGETFOLDERPATH_STR); if (pfn) { hr = pfn(hwnd, csidl, hToken, dwFlags, pszPath); } FreeLibrary(hmodSHFolder); } return hr; }
// Cache maximum/minimum in MB
#define CACHE_SIZE_CAP 32000
#define CACHE_SIZE_MIN 1
DWORD UpdateCacheQuotaInfo(LPTEMPDLG pTmp, BOOL fUpdate) { // The following probably needs to be fixed.
DWORDLONG cKBLimit = pTmp->uiDiskSpaceTotal, cKBSpare = pTmp->uiCacheQuota;
if (cKBLimit==0) { return GetLastError(); }
// What's happening in the following sequence:
// We want to ensure that the cache size is
// 1. less than the drive's size (if larger, then reduce to 75% of drive's space
// 2. less than 32 GB
// And adjust percentage accordingly.
if (fUpdate) { ASSERT(pTmp->iCachePercent<=100); if (pTmp->iCachePercent==0) { cKBSpare = CACHE_SIZE_MIN; } else { cKBSpare = (cKBLimit * pTmp->iCachePercent)/ 100; } if (cKBSpare > cKBLimit) { pTmp->iCachePercent = 75; cKBSpare = (cKBLimit * pTmp->iCachePercent) / 100; } pTmp->uiCacheQuota = (DWORD)cKBSpare; SetDlgItemInt(pTmp->hDlg, IDC_ADVANCED_CACHE_TEXT_PERCENT, pTmp->uiCacheQuota, FALSE); }
if (cKBSpare > CACHE_SIZE_CAP) { if (fUpdate) { cKBSpare = pTmp->uiCacheQuota = CACHE_SIZE_CAP; SetDlgItemInt(pTmp->hDlg, IDC_ADVANCED_CACHE_TEXT_PERCENT, pTmp->uiCacheQuota, FALSE); } fUpdate = FALSE; } else if (cKBSpare < CACHE_SIZE_MIN) { if (fUpdate) { cKBSpare = pTmp->uiCacheQuota = CACHE_SIZE_MIN; SetDlgItemInt(pTmp->hDlg, IDC_ADVANCED_CACHE_TEXT_PERCENT, pTmp->uiCacheQuota, FALSE); } fUpdate = FALSE; } else if (cKBSpare > cKBLimit) { if (fUpdate) { cKBSpare = pTmp->uiCacheQuota = (DWORD)cKBLimit; SetDlgItemInt(pTmp->hDlg, IDC_ADVANCED_CACHE_TEXT_PERCENT, pTmp->uiCacheQuota, FALSE); } fUpdate = FALSE; }
if (!fUpdate) { pTmp->iCachePercent = (WORD)((cKBSpare * 100 + (cKBLimit/2))/cKBLimit); if (pTmp->iCachePercent>100) { pTmp->iCachePercent = 100; } SendMessage( pTmp->hwndTrack, TBM_SETPOS, TRUE, pTmp->iCachePercent ); } return ERROR_SUCCESS; }
VOID AdjustCacheRange(LPTEMPDLG pTmp) { UINT uiMax = 10; DWORDLONG dlTotal = 0;
if (GetDiskInfo(pTmp->bChangedLocation ? pTmp->szNewCacheLocation : pTmp->szCacheLocation, NULL, NULL, &dlTotal)) { dlTotal /= (DWORDLONG)CONSTANT_MEGABYTE; uiMax = (dlTotal < CACHE_SIZE_CAP) ? (UINT)dlTotal : CACHE_SIZE_CAP; } SendDlgItemMessage(pTmp->hDlg, IDC_ADVANCED_CACHE_SIZE_SPIN, UDM_SETRANGE, FALSE, MAKELPARAM(uiMax, CACHE_SIZE_MIN)); }
BOOL InvokeCachevu(HWND hDlg) { TCHAR szCache[MAX_PATH];
HRESULT hres = SHGetFolderPath(NULL, CSIDL_INTERNET_CACHE | CSIDL_FLAG_CREATE, NULL, 0, szCache); if (hres == S_OK) { DWORD dwAttrib = GetFileAttributes(szCache);
TCHAR szIniFile[MAX_PATH]; PathCombine(szIniFile, szCache, TEXT("desktop.ini"));
if (GetFileAttributes(szIniFile) == -1) { DWORD dwAttrib = GetFileAttributes(szCache); dwAttrib &= ~FILE_ATTRIBUTE_HIDDEN; dwAttrib |= FILE_ATTRIBUTE_SYSTEM;
// make sure system, but not hidden
SetFileAttributes(szCache, dwAttrib);
WritePrivateProfileString(TEXT(".ShellClassInfo"), TEXT("ConfirmFileOp"), TEXT("0"), szIniFile); WritePrivateProfileString(TEXT(".ShellClassInfo"), TEXT("UICLSID"), TEXT("{7BD29E00-76C1-11CF-9DD0-00A0C9034933}"), szIniFile); }
// All seems well, launch it.
SHELLEXECUTEINFO ei = { sizeof(SHELLEXECUTEINFO), 0}; ei.hwnd = hDlg; ei.lpFile = szCache; ei.nShow = SW_SHOWNORMAL; return ShellExecuteEx(&ei); }
return FALSE; }
// Following flag swiped from wininet
#define FIND_FLAGS_RETRIEVE_ONLY_STRUCT_INFO 0x2
#define DISK_SPACE_MARGIN 4*1024*1024
// IsEnoughDriveSpace
// verifies that there will enough space for the current contents of the cache
// on the new destination
BOOL IsEnoughDriveSpace(DWORD dwClusterSize, DWORDLONG dlAvailable) { // Adjust dlAvailable to leave some space free
if ((DISK_SPACE_MARGIN/dwClusterSize) > dlAvailable) { return FALSE; } else { dlAvailable -= DISK_SPACE_MARGIN/dwClusterSize; }; // Now, iterate through the cache to discover the actual size.
INTERNET_CACHE_ENTRY_INFOA cei; DWORD dwSize = sizeof(cei); DWORDLONG dlClustersNeeded = 0; BOOL fResult = FALSE; HANDLE hFind = FindFirstUrlCacheEntryExA(NULL, FIND_FLAGS_RETRIEVE_ONLY_STRUCT_INFO, NORMAL_CACHE_ENTRY, NULL, &cei, &dwSize, NULL, NULL, NULL);
if (hFind!=NULL) { do { ULARGE_INTEGER ulFileSize; ulFileSize.LowPart = cei.dwSizeLow; ulFileSize.HighPart = cei.dwSizeHigh; dlClustersNeeded += (ulFileSize.QuadPart / (DWORDLONG)dwClusterSize) + 1; fResult = FindNextUrlCacheEntryExA(hFind, &cei, &dwSize, NULL, NULL, NULL) && (dlClustersNeeded < dlAvailable); } while (fResult); FindCloseUrlCache(hFind);
if (GetLastError()==ERROR_NO_MORE_ITEMS) { fResult = dlClustersNeeded < dlAvailable; } } else { fResult = TRUE; } return fResult; }
//
// SaveTemporarySettings
//
// Save the Temporary Files Dialog (Cache) settings.
//
// History:
//
// 6/14/96 t-gpease created
//
BOOL SaveTemporarySettings(LPTEMPDLG pTmp) { if ((pTmp->uiCacheQuota<1) || (pTmp->uiCacheQuota>pTmp->uiDiskSpaceTotal)) { TCHAR szError[1024], szTemp[100]; MLLoadShellLangString(IDS_SIZE_FORMAT, szTemp, ARRAYSIZE(szTemp)); wnsprintf(szError, ARRAYSIZE(szError), szTemp, pTmp->uiDiskSpaceTotal); MLLoadShellLangString(IDS_ERROR, szTemp, ARRAYSIZE(szTemp)); MessageBox(pTmp->hDlg, szError, szTemp, MB_OK | MB_ICONEXCLAMATION); SetFocus(GetDlgItem(pTmp->hDlg, IDC_ADVANCED_CACHE_TEXT_PERCENT)); return FALSE; } if (pTmp->bChanged) { // derive the syncmode for the radio buttons
if (IsDlgButtonChecked(pTmp->hDlg, IDC_ADVANCED_CACHE_AUTOMATIC)) pTmp->iCacheUpdFrequency = WININET_SYNC_MODE_AUTOMATIC; else if (IsDlgButtonChecked(pTmp->hDlg, IDC_ADVANCED_CACHE_NEVER))
pTmp->iCacheUpdFrequency = WININET_SYNC_MODE_NEVER;
else if (IsDlgButtonChecked(pTmp->hDlg, IDC_ADVANCED_CACHE_ALWAYS))
pTmp->iCacheUpdFrequency = WININET_SYNC_MODE_ALWAYS;
else { ASSERT(IsDlgButtonChecked(pTmp->hDlg, IDC_ADVANCED_CACHE_ONCEPERSESS)); pTmp->iCacheUpdFrequency = WININET_SYNC_MODE_ONCE_PER_SESSION; }
// notify IE
INTERNET_CACHE_CONFIG_INFOA cci; cci.dwContainer = CONTENT; cci.dwQuota = pTmp->uiCacheQuota * 1024; // Make into KB
cci.dwSyncMode = pTmp->iCacheUpdFrequency;
ASSERT(cci.dwQuota); SetUrlCacheConfigInfoA(&cci, CACHE_CONFIG_SYNC_MODE_FC | CACHE_CONFIG_QUOTA_FC); }
if (pTmp->bChangedLocation) { OSVERSIONINFOA VerInfo; VerInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFOA); GetVersionExA(&VerInfo);
if (g_hwndPropSheet) { PropSheet_Apply(g_hwndPropSheet); } BOOL fRunningOnNT = (VerInfo.dwPlatformId == VER_PLATFORM_WIN32_NT); // Well, we're going to have to force a reboot now. Ciao. Confirm.
if (IDYES==DispMessage(pTmp->hDlg, fRunningOnNT ? IDS_LOGOFF_WARNING : IDS_REBOOTING_WARNING, fRunningOnNT ? IDS_LOGOFF_TITLE : IDS_REBOOTING_TITLE, MB_YESNO | MB_ICONEXCLAMATION)) { // fix registry entries and add RunOnce command
// NOTE: a REBOOT must be done for changes to take effect
// (see SetCacheLocation() ).
// On NT, we must adjust the token privileges
BOOL fSuccess = TRUE; if (fRunningOnNT) { HANDLE hToken; TOKEN_PRIVILEGES tkp; // get a token from this process
if (fSuccess=OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken)) { // get the LUID for the shutdown privilege
LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &tkp.Privileges[0].Luid);
tkp.PrivilegeCount = 1; tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
//get the shutdown privilege for this proces
fSuccess = AdjustTokenPrivileges( hToken, FALSE, &tkp, 0, (PTOKEN_PRIVILEGES)NULL, 0 ); } } if (fSuccess) { #ifdef UNICODE //UpdateUrlCacheContentPath takes LPSTR
char szNewPath[MAX_PATH]; SHTCharToAnsi(pTmp->szNewCacheLocation, szNewPath, ARRAYSIZE(szNewPath)); UpdateUrlCacheContentPath(szNewPath); #else
UpdateUrlCacheContentPath(pTmp->szNewCacheLocation); #endif
ExitWindowsEx((fRunningOnNT ? EWX_LOGOFF : EWX_REBOOT), 0); } else { DispMessage(pTmp->hDlg, IDS_ERROR_MOVE_MSG, IDS_ERROR_MOVE_TITLE, MB_OK | MB_ICONEXCLAMATION); } } } return TRUE; } // SaveTemporarySettings()
//
// IsValidDirectory()
//
// Checks out the path for mistakes... like just machine names...
// SHBrowseForFolder should NOT just return a machine name... BUG is
// shell code.
//
BOOL IsValidDirectory(LPTSTR szDir) { if (szDir) { if (!*szDir) return FALSE; // it's empty... that's not good
if (*szDir!= DIR_SEPARATOR_CHAR) return TRUE; // not a machine path... then OK
// move forward two chars ( the '\''\')
++szDir; ++szDir;
while ((*szDir) && (*szDir!=DIR_SEPARATOR_CHAR)) szDir++;
if (*szDir==DIR_SEPARATOR_CHAR) return TRUE; // found another '\' so we are happy.
return FALSE; // machine name only... ERROR!
}
return FALSE;
} // IsValidDirecotry()
#define NUM_LEVELS 3 // random dir + cachefile + safety (installed containers)
DWORD g_ccBrandName = 0;
int CALLBACK MoveFolderCallBack( HWND hwnd, UINT uMsg, LPARAM lParam, LPARAM lpData ) { if (uMsg==BFFM_SELCHANGED) { TCHAR szNewDest[1024]; TCHAR szStatusText[256]; UINT uErr = 0; LONG fValid = FALSE; if (SHGetPathFromIDList((LPCITEMIDLIST)lParam, szNewDest)) { // Account for "Temporary Internet Files\Content.IE?\randmdir.ext" + NUM_LEVELS*10
DWORD ccAvail = MAX_PATH - g_ccBrandName -1 - ARRAYSIZE("CONTENT.IE?\\") - (NUM_LEVELS*10); if ((DWORD)lstrlen(szNewDest)>ccAvail) // Win95 limit on how long paths can be
{ uErr = IDS_ERROR_ARCHITECTURE; } else if (StrStrI(szNewDest, TEXT("Content.IE"))) { uErr = IDS_ERROR_WRONG_PLACE; } else if (!IsValidDirectory(szNewDest)) { uErr = IDS_ERROR_INVALID_PATH_MSG; } else if (GetFileAttributes(szNewDest) & FILE_ATTRIBUTE_READONLY) { uErr = IDS_ERROR_STRANGENESS; } else { #ifdef UNICODE
CHAR szAnsiPath[MAX_PATH]; BOOL fProblems; WideCharToMultiByte(CP_ACP, NULL, szNewDest, -1, szAnsiPath, ARRAYSIZE(szAnsiPath), NULL, &fProblems); if (fProblems) { uErr = IDS_ERROR_INVALID_PATH; } else #endif
{ TCHAR szSystemPath[MAX_PATH+1];
GetSystemDirectory(szSystemPath, MAX_PATH); if (StrStrI(szNewDest, szSystemPath)) { uErr = IDC_ERROR_USING_SYSTEM_DIR; } else { fValid = TRUE; } } } } else { uErr = IDS_ERROR_STRANGENESS; } if (uErr) { MLLoadShellLangString(uErr, szStatusText, ARRAYSIZE(szStatusText)); } else { szStatusText[0] = 0; }
SendMessage(hwnd, BFFM_ENABLEOK, 0, (LPARAM)fValid); SendMessage(hwnd, BFFM_SETSTATUSTEXT, 0, (LPARAM)szStatusText); }
return 0; }
//
// MoveFolder()
//
// Handles the moving of the Temporary Files (Cache) Folder to
// another location. It checks for the existence of the new folder.
// It warns the user that a REBOOT is necessary before changes
// are made.
//
// History:
//
// 6/18/96 t-gpease created.
//
void MoveFolder(LPTEMPDLG pTmp) { TCHAR szTemp [1024]; TCHAR szWindowsPath [MAX_PATH+1]; BROWSEINFO biToFolder;
biToFolder.hwndOwner = pTmp->hDlg; biToFolder.pidlRoot = NULL; // start on the Desktop
biToFolder.pszDisplayName = szWindowsPath; // not used, just making it happy...
TCHAR szBrandName[MAX_PATH]; MLLoadString(IDS_BRAND_NAME, szBrandName, ARRAYSIZE(szBrandName)); g_ccBrandName = lstrlen(szBrandName); // load the title of the dialog box
MLLoadShellLangString(IDS_SELECT_CACHE, szTemp, ARRAYSIZE(szTemp)); biToFolder.lpszTitle = szTemp;
biToFolder.ulFlags = BIF_RETURNONLYFSDIRS | BIF_STATUSTEXT; // folders... nothing else
biToFolder.lpfn = MoveFolderCallBack; // nothing special
while (1) { // start shell dialog
LPITEMIDLIST pidl = SHBrowseForFolder(&biToFolder); if (pidl) // if everything went OK
{ DWORD dwClusterSize; DWORDLONG dlAvailable; DWORD dwError;
// get the choice the user selected
SHGetPathFromIDList(pidl, pTmp->szNewCacheLocation); SHFree(pidl);
// Resolve local device to UNC if possible
if ((GetDriveType(pTmp->szNewCacheLocation)==DRIVE_REMOTE) && (pTmp->szNewCacheLocation[0]!=DIR_SEPARATOR_CHAR)) { TCHAR szPath[MAX_PATH]; DWORD dwLen = ARRAYSIZE(szPath);
pTmp->szNewCacheLocation[2] = '\0';
dwError = WNetGetConnection(pTmp->szNewCacheLocation, szPath, &dwLen); if (dwError!=ERROR_SUCCESS) { DispMessage(pTmp->hDlg, IDS_ERROR_CANT_CONNECT, IDS_ERROR_MOVE_TITLE, MB_OK | MB_ICONEXCLAMATION); continue; } memcpy(pTmp->szNewCacheLocation, szPath, dwLen+1); } if (!GetDiskInfo(pTmp->szNewCacheLocation, &dwClusterSize, &dlAvailable, NULL)) { DispMessage(pTmp->hDlg, IDS_ERROR_CANT_CONNECT, IDS_ERROR_MOVE_TITLE, MB_OK | MB_ICONEXCLAMATION); continue; }
if (((*pTmp->szNewCacheLocation==*pTmp->szCacheLocation) && (pTmp->szNewCacheLocation[0]!=DIR_SEPARATOR_CHAR)) || (IsEnoughDriveSpace(dwClusterSize, dlAvailable) && (GetLastError()==ERROR_NO_MORE_ITEMS))) { pTmp->bChangedLocation = TRUE; } else { DispMessage(pTmp->hDlg, IDS_ERROR_CANT_MOVE_TIF, IDS_ERROR_MOVE_TITLE, MB_OK | MB_ICONEXCLAMATION); continue; } } break; }
if (pTmp->bChangedLocation) { DWORDLONG cbTotal;
pTmp->uiDiskSpaceTotal = 0; if (GetDiskInfo(pTmp->szNewCacheLocation, NULL, NULL, &cbTotal)) { pTmp->uiDiskSpaceTotal = (UINT)(cbTotal / (DWORDLONG)CONSTANT_MEGABYTE); }
DWORD ccPath = lstrlen(pTmp->szNewCacheLocation); if (pTmp->szNewCacheLocation[ccPath-1]!=DIR_SEPARATOR_CHAR) { pTmp->szNewCacheLocation[ccPath] = DIR_SEPARATOR_CHAR; ccPath++; } memcpy(pTmp->szNewCacheLocation + ccPath, szBrandName, (g_ccBrandName+1)*sizeof(TCHAR));
if (pTmp->uiCacheQuota > pTmp->uiDiskSpaceTotal) { pTmp->uiCacheQuota = pTmp->uiDiskSpaceTotal; SetDlgItemInt(pTmp->hDlg, IDC_ADVANCED_CACHE_TEXT_PERCENT, pTmp->uiCacheQuota, FALSE); }
SetDlgItemText( pTmp->hDlg, IDC_ADVANCED_CACHE_LOCATION, pTmp->szNewCacheLocation);
// set dialog text
MLLoadString(IDS_STATUS_FOLDER_NEW, szTemp, ARRAYSIZE(szTemp)); SetDlgItemText( pTmp->hDlg, IDC_ADVANCED_CACHE_STATUS, szTemp);
UpdateCacheQuotaInfo(pTmp, FALSE); AdjustCacheRange(pTmp); } } // MoveFolder()
//
// TemporaryInit()
//
// Handles the initialization of Temporary Files Dialog (Cache)
//
// History:
//
// 6/13/96 t-gpease created
//
BOOL TemporaryInit(HWND hDlg) { LPTEMPDLG pTmp; BOOL bAlways, bOnce, bNever, bAuto;
pTmp = (LPTEMPDLG)LocalAlloc(LPTR, sizeof(*pTmp)); if (!pTmp) { EndDialog(hDlg, 0); return FALSE; // no memory?
}
// tell dialog where to get info
SetWindowLongPtr(hDlg, DWLP_USER, (LONG_PTR)pTmp);
// get dialog item handles
pTmp->hDlg = hDlg; pTmp->hwndTrack = GetDlgItem( hDlg, IDC_ADVANCED_CACHE_PERCENT );
INTERNET_CACHE_CONFIG_INFOA icci; icci.dwContainer = CONTENT; if (GetUrlCacheConfigInfoA(&icci, NULL, CACHE_CONFIG_QUOTA_FC | CACHE_CONFIG_DISK_CACHE_PATHS_FC | CACHE_CONFIG_SYNC_MODE_FC)) { SHAnsiToTChar(icci.CachePath, pTmp->szCacheLocation, ARRAYSIZE(pTmp->szCacheLocation)); pTmp->iCachePercent = 0; pTmp->uiCacheQuota = icci.dwQuota / 1024; pTmp->iCacheUpdFrequency = (WORD)icci.dwSyncMode; } else { // GUCCIEx CAN NEVER FAIL.
ASSERT(FALSE); pTmp->iCacheUpdFrequency = WININET_SYNC_MODE_DEFAULT; pTmp->iCachePercent = 3; // YUCK, magic number.
pTmp->uiCacheQuota = 0; } SetDlgItemInt(pTmp->hDlg, IDC_ADVANCED_CACHE_TEXT_PERCENT, pTmp->uiCacheQuota, FALSE); // SendDlgItemMessage(pTmp->hDlg, IDC_ADVANCED_CACHE_TEXT_PERCENT, pTmp->uiCacheQuota, FALSE);
SendDlgItemMessage(pTmp->hDlg, IDC_ADVANCED_CACHE_TEXT_PERCENT, EM_SETLIMITTEXT, 6, 0);
// update cache fields
SendMessage( pTmp->hwndTrack, TBM_SETTICFREQ, 5, 0 ); SendMessage( pTmp->hwndTrack, TBM_SETRANGE, FALSE, MAKELONG(0, 100) ); SendMessage( pTmp->hwndTrack, TBM_SETPAGESIZE, 0, 5 );
DWORDLONG cbTotal; pTmp->uiDiskSpaceTotal = 0; if (GetDiskInfo(pTmp->szCacheLocation, NULL, NULL, &cbTotal)) { pTmp->uiDiskSpaceTotal = (UINT)(cbTotal / (DWORDLONG)CONSTANT_MEGABYTE); } UpdateCacheQuotaInfo(pTmp, FALSE); AdjustCacheRange(pTmp);
// set the rest of the dialog's items
TCHAR szBuf[MAX_PATH];
// Is the following line necessary?
ExpandEnvironmentStrings(pTmp->szCacheLocation,szBuf, ARRAYSIZE(szBuf));
// NOTE NOTE NOTE The following code might have to be altered if we start using
// shfolder.dll to gather the location of the cache
// pszEnd = szBuf + 3 because UNCs are "\\x*" and local drives are "C:\*"
// Move to the end of the string, before the traiiling slash. (This is how wininet works.)
PTSTR pszLast = szBuf + lstrlen(szBuf) - 2; while ((pszLast>=szBuf) && (*pszLast!=DIR_SEPARATOR_CHAR)) { pszLast--; } // The terminator should always be placed between the \Temporary Internet Files and the
// \Content.IE?. This must always be present.
*(pszLast+1) = TEXT('\0'); SetDlgItemText( hDlg, IDC_ADVANCED_CACHE_LOCATION, szBuf );
MLLoadString(IDS_STATUS_FOLDER_CURRENT, szBuf, ARRAYSIZE(szBuf)); SetDlgItemText( hDlg, IDC_ADVANCED_CACHE_STATUS, szBuf ); // activate the correct radio button
bAlways = bOnce = bNever = bAuto = FALSE; if (pTmp->iCacheUpdFrequency == WININET_SYNC_MODE_AUTOMATIC) bAuto = TRUE; else if (pTmp->iCacheUpdFrequency == WININET_SYNC_MODE_NEVER) bNever = TRUE; else if (pTmp->iCacheUpdFrequency == WININET_SYNC_MODE_ALWAYS) bAlways = TRUE; else bOnce = TRUE; // if something got messed up... reset to Once Per Session
CheckDlgButton(hDlg, IDC_ADVANCED_CACHE_ALWAYS, bAlways); CheckDlgButton(hDlg, IDC_ADVANCED_CACHE_ONCEPERSESS, bOnce); CheckDlgButton(hDlg, IDC_ADVANCED_CACHE_AUTOMATIC, bAuto); CheckDlgButton(hDlg, IDC_ADVANCED_CACHE_NEVER, bNever);
// nothing has chagned yet...
pTmp->bChanged = pTmp->bChangedLocation = FALSE;
if( g_restrict.fCache ) { EnableWindow( GetDlgItem(hDlg, IDC_ADVANCED_CACHE_ALWAYS), FALSE ); EnableWindow( GetDlgItem(hDlg, IDC_ADVANCED_CACHE_ONCEPERSESS), FALSE ); EnableWindow( GetDlgItem(hDlg, IDC_ADVANCED_CACHE_AUTOMATIC), FALSE ); EnableWindow( GetDlgItem(hDlg, IDC_ADVANCED_CACHE_NEVER), FALSE ); EnableWindow( GetDlgItem(hDlg, IDC_ADVANCED_CACHE_PERCENT), FALSE ); EnableWindow( GetDlgItem(hDlg, IDC_ADVANCED_CACHE_PERCENT_ACC), FALSE ); EnableWindow( GetDlgItem(hDlg, IDC_ADVANCED_CACHE_TEXT_PERCENT), FALSE ); EnableWindow( GetDlgItem(hDlg, IDC_ADVANCED_CACHE_SIZE_SPIN), FALSE ); EnableWindow( GetDlgItem(hDlg, IDC_ADVANCED_MOVE_CACHE_LOCATION), FALSE ); EnableWindow( GetDlgItem(hDlg, IDC_ADVANCED_CACHE_EMPTY), FALSE ); }
return TRUE; // worked!
}
//
// TemporaryOnCommand()
//
// Handles Temporary Files dialogs WM_COMMAND messages
//
// History:
//
// 6/13/96 t-gpease created
//
void TemporaryOnCommand(LPTEMPDLG pTmp, UINT id, UINT nCmd) { switch (id) { case IDC_ADVANCED_CACHE_TEXT_PERCENT: case IDC_ADVANCED_CACHE_SIZE_SPIN: if (pTmp && nCmd == EN_CHANGE) { UINT uiVal; BOOL fSuccess; uiVal = GetDlgItemInt(pTmp->hDlg, IDC_ADVANCED_CACHE_TEXT_PERCENT, &fSuccess, FALSE); if (fSuccess) { pTmp->uiCacheQuota = uiVal; UpdateCacheQuotaInfo(pTmp, FALSE); pTmp->bChanged = TRUE; } } break;
case IDC_ADVANCED_CACHE_ALWAYS: case IDC_ADVANCED_CACHE_ONCEPERSESS: case IDC_ADVANCED_CACHE_AUTOMATIC: case IDC_ADVANCED_CACHE_NEVER: pTmp->bChanged = TRUE; break;
case IDOK: // save it
if (!SaveTemporarySettings(pTmp)) { break; } // Fall through
case IDCANCEL: EndDialog(pTmp->hDlg, id); break; // IDCANCEL
case IDC_ADVANCED_CACHE_BROWSE: InvokeCachevu(pTmp->hDlg); break;
case IDC_ADVANCED_MOVE_CACHE_LOCATION: MoveFolder(pTmp); break; // IDC_ADVANCED_MOVE_CACHE_LOCATION
case IDC_ADVANCED_DOWNLOADED_CONTROLS: { TCHAR szPath[MAX_PATH]; #ifdef UNIX
TCHAR szExpPath[MAX_PATH]; #endif
DWORD cb=SIZEOF(szPath);
if (SHGetValue(HKEY_LOCAL_MACHINE, TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings"), TEXT("ActiveXCache"), NULL, szPath, &cb) == ERROR_SUCCESS) { SHELLEXECUTEINFO ei; #ifdef UNIX
int cbExp = ExpandEnvironmentStrings(szPath,szExpPath,MAX_PATH); #endif
ei.cbSize = sizeof(SHELLEXECUTEINFO); ei.hwnd = pTmp->hDlg; ei.lpVerb = NULL; #ifndef UNIX
ei.lpFile = szPath; #else
if( cbExp > 0 && cbExp < MAX_PATH ) ei.lpFile = szExpPath; else ei.lpFile = szPath; #endif
ei.lpParameters = NULL; ei.lpDirectory = NULL; ei.nShow = SW_SHOWNORMAL; ei.fMask = 0; ShellExecuteEx(&ei); } break; }
} // switch
} // TemporaryOnCommand()
//
// TemporaryDlgProc
//
// Take care of "Temporary Files" (Cache)
//
// History:
//
// ??/??/?? God created
// 6/13/96 t-gpease cleaned up code, separated functions, and
// changed it into a Dialog (was property
// sheet).
//
INT_PTR CALLBACK TemporaryDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { LPTEMPDLG pTmp = (LPTEMPDLG) GetWindowLongPtr(hDlg, DWLP_USER);
switch (uMsg) {
case WM_INITDIALOG: return TemporaryInit(hDlg);
case WM_HSCROLL: pTmp->iCachePercent = (WORD)SendMessage( pTmp->hwndTrack, TBM_GETPOS, 0, 0 ); UpdateCacheQuotaInfo(pTmp, TRUE); pTmp->bChanged = TRUE; return TRUE;
case WM_COMMAND: TemporaryOnCommand(pTmp, LOWORD(wParam), HIWORD(wParam)); return TRUE;
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: ASSERT(pTmp); LocalFree(pTmp); break;
} return FALSE; }
INT_PTR CALLBACK EmptyCacheDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch (uMsg) { case WM_COMMAND: switch (LOWORD(wParam)) { case IDCANCEL: EndDialog(hDlg, 0); break; case IDOK: #ifndef UNIX
if (Button_GetCheck(GetDlgItem(hDlg, IDC_DELETE_SUB))) EndDialog(hDlg, 3); else EndDialog(hDlg, 1); #else
// On Unix we alway return from this dialog with delete channel content
// option set, though we have removed this option from the UI.
EndDialog(hDlg, 3); #endif
break; } return TRUE; } return FALSE; }
INT_PTR CALLBACK EmptyCacheCookiesDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch (uMsg) { case WM_COMMAND: switch (LOWORD(wParam)) { case IDCANCEL: EndDialog(hDlg, 0); break; case IDOK: EndDialog(hDlg, 1); break; } return TRUE; } return FALSE; }
BOOL DeleteCacheCookies() { BOOL bRetval = TRUE; DWORD dwEntrySize, dwLastEntrySize; LPINTERNET_CACHE_ENTRY_INFOA lpCacheEntry; HANDLE hCacheDir = NULL; dwEntrySize = dwLastEntrySize = MAX_CACHE_ENTRY_INFO_SIZE; lpCacheEntry = (LPINTERNET_CACHE_ENTRY_INFOA) new BYTE[dwEntrySize]; if( lpCacheEntry == NULL) { bRetval = FALSE; goto Exit; } lpCacheEntry->dwStructSize = dwEntrySize;
Again: if (!(hCacheDir = FindFirstUrlCacheEntryA("cookie:",lpCacheEntry,&dwEntrySize))) { delete [] lpCacheEntry; switch(GetLastError()) { case ERROR_NO_MORE_ITEMS: goto Exit; case ERROR_INSUFFICIENT_BUFFER: lpCacheEntry = (LPINTERNET_CACHE_ENTRY_INFOA) new BYTE[dwEntrySize]; if( lpCacheEntry == NULL) { bRetval = FALSE; goto Exit; } lpCacheEntry->dwStructSize = dwLastEntrySize = dwEntrySize; goto Again; default: bRetval = FALSE; goto Exit; } }
do { if (lpCacheEntry->CacheEntryType & COOKIE_CACHE_ENTRY) DeleteUrlCacheEntryA(lpCacheEntry->lpszSourceUrlName); dwEntrySize = dwLastEntrySize; Retry: if (!FindNextUrlCacheEntryA(hCacheDir,lpCacheEntry, &dwEntrySize)) { delete [] lpCacheEntry; switch(GetLastError()) { case ERROR_NO_MORE_ITEMS: goto Exit; case ERROR_INSUFFICIENT_BUFFER: lpCacheEntry = (LPINTERNET_CACHE_ENTRY_INFOA) new BYTE[dwEntrySize]; if( lpCacheEntry == NULL) { bRetval = FALSE; goto Exit; } lpCacheEntry->dwStructSize = dwLastEntrySize = dwEntrySize; goto Retry; default: bRetval = FALSE; goto Exit; } } } while (TRUE);
Exit: if (hCacheDir) FindCloseUrlCache(hCacheDir); return bRetval; }
|