You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
1144 lines
36 KiB
1144 lines
36 KiB
/*
|
|
**------------------------------------------------------------------------------
|
|
** Module: Disk Cleanup Applet
|
|
** File: dmgrdlg.cpp
|
|
**
|
|
** Purpose: Implements the Disk Space Cleanup Drive dialog
|
|
** Notes:
|
|
** Mod Log: Created by Jason Cobb (2/97)
|
|
**
|
|
** Copyright (c)1997 Microsoft Corporation, All Rights Reserved
|
|
**------------------------------------------------------------------------------
|
|
*/
|
|
|
|
/*
|
|
**------------------------------------------------------------------------------
|
|
** Project include files
|
|
**------------------------------------------------------------------------------
|
|
*/
|
|
#include "common.h"
|
|
#include "dmgrdlg.h"
|
|
#include "dmgrinfo.h"
|
|
#include "diskutil.h"
|
|
#include "msprintf.h"
|
|
|
|
#include <help.h>
|
|
|
|
|
|
// To work around a "feature" of listview we need the ability to temporarily ignore certain LVN_ITEMCHANGED messages:
|
|
BOOL g_bIgnoreCheckStateChanges = TRUE;
|
|
|
|
/*
|
|
**------------------------------------------------------------------------------
|
|
** Local defines
|
|
**------------------------------------------------------------------------------
|
|
*/
|
|
#define crSliceUsed RGB( 0, 0, 255 )
|
|
#define crSliceFree RGB( 255, 0, 255)
|
|
#define crSliceCleanup RGB( 255, 255, 0 )
|
|
|
|
const DWORD aHelpIDs[]=
|
|
{
|
|
IDC_INTRO_TEXT, IDH_CLEANMGR_INTRO_TEXT,
|
|
IDC_FILES_TO_REMOVE_TEXT, IDH_CLEANMGR_CLIENT_LIST,
|
|
IDC_CLIENT_LIST, IDH_CLEANMGR_CLIENT_LIST,
|
|
IDC_TOTAL_SPACE_DESCRIPTION, IDH_CLEANMGR_TOTAL_SPACE,
|
|
IDC_TOTAL_SPACE_TEXT, IDH_CLEANMGR_TOTAL_SPACE,
|
|
IDC_DESCRIPTION_GROUP, IDH_CLEANMGR_DESCRIPTION_GROUP,
|
|
IDC_DESCRIPTION_TEXT, IDH_CLEANMGR_DESCRIPTION_GROUP,
|
|
IDC_DETAILS_BUTTON, IDH_CLEANMGR_DETAILS_BUTTON,
|
|
IDC_WINDOWS_SETUP_ICON, IDH_CLEANMGR_SETUP_GROUP,
|
|
IDC_WINDOWS_SETUP_GROUP, IDH_CLEANMGR_SETUP_GROUP,
|
|
IDC_WINDOWS_SETUP_TEXT, IDH_CLEANMGR_SETUP_GROUP,
|
|
IDC_WINDOWS_SETUP_BUTTON, IDH_CLEANMGR_SETUP_BUTTON,
|
|
IDC_INSTALLED_PROGRAMS_ICON, IDH_CLEANMGR_PROGRAMS_GROUP,
|
|
IDC_INSTALLED_PROGRAMS_GROUP, IDH_CLEANMGR_PROGRAMS_GROUP,
|
|
IDC_INSTALLED_PROGRAMS_TEXT, IDH_CLEANMGR_PROGRAMS_GROUP,
|
|
IDC_INSTALLED_PROGRAMS_BUTTON, IDH_CLEANMGR_PROGRAMS_BUTTON,
|
|
IDC_SYSTEM_RESTORE_ICON, IDH_CLEANMGR_SYSTEM_RESTORE_GROUP,
|
|
IDC_SYSTEM_RESTORE_GROUP, IDH_CLEANMGR_SYSTEM_RESTORE_GROUP,
|
|
IDC_SYSTEM_RESTORE_TEXT, IDH_CLEANMGR_SYSTEM_RESTORE_GROUP,
|
|
IDC_SYSTEM_RESTORE_BUTTON, IDH_CLEANMGR_SYSTEM_RESTORE_BUTTON,
|
|
IDC_AUTO_LAUNCH, IDH_CLEANMGR_AUTO_LAUNCH,
|
|
IDC_DRIVE_ICON_LOCATION, ((DWORD)-1),
|
|
IDC_SETTINGS_DRIVE_TEXT, ((DWORD)-1),
|
|
0, 0
|
|
};
|
|
|
|
|
|
/*
|
|
**------------------------------------------------------------------------------
|
|
** Local function prototypes
|
|
**------------------------------------------------------------------------------
|
|
*/
|
|
BOOL CleanupMgrDlgInit (HWND hDlg, LPARAM lParam);
|
|
void CleanupMgrDlgCleanup (HWND hDlg);
|
|
BOOL CleanupMgrDlgCommand (HWND hDlg, WPARAM wParam, LPARAM lParam);
|
|
BOOL CleanupMgrDlgNotify (HWND hDlg, UINT uiMessage, WPARAM wParam, LPARAM lParam);
|
|
|
|
BOOL CleanupMgrDlgInitText (HWND hDlg);
|
|
BOOL CleanupMgrDlgInitList (HWND hDlg);
|
|
VOID UpdateTotalSpaceToBeFreed(HWND hDlg);
|
|
|
|
INT_PTR CALLBACK MoreOptionsDlgProc(HWND hDlg, UINT Message, WPARAM wParam, LPARAM lParam);
|
|
INT_PTR CALLBACK SettingsDlgProc(HWND hDlg, UINT Message, WPARAM wParam, LPARAM lParam);
|
|
|
|
|
|
LPARAM ListView_GetItemData(HWND hwndList, int i)
|
|
{
|
|
LVITEM lvi = {0};
|
|
lvi.iItem = i;
|
|
lvi.mask = LVIF_PARAM;
|
|
if ( ListView_GetItem(hwndList, &lvi) )
|
|
{
|
|
return lvi.lParam;
|
|
}
|
|
return NULL;
|
|
}
|
|
|
|
/*
|
|
**------------------------------------------------------------------------------
|
|
** DisplayCleanMgrProperties
|
|
**
|
|
** Purpose: Creates the Cleanup Manager property sheet
|
|
** Parameters:
|
|
** hDlg - Handle to dialog window
|
|
** lParam - DWORD to pass onto the property pages
|
|
** Return: 1 if user pressed "OK"
|
|
** 0 if user pressed "Cancel"
|
|
** Notes;
|
|
** Mod Log: Created by Jason Cobb (7/97)
|
|
**------------------------------------------------------------------------------
|
|
*/
|
|
DWORD
|
|
DisplayCleanMgrProperties(
|
|
HWND hWnd,
|
|
LPARAM lParam
|
|
)
|
|
{
|
|
DWORD dwRet;
|
|
TCHAR *psz;
|
|
PROPSHEETPAGE psp;
|
|
PROPSHEETHEADER psh;
|
|
HPROPSHEETPAGE hpsp[2];
|
|
CleanupMgrInfo * pcmi = (CleanupMgrInfo *)lParam;
|
|
if (pcmi == NULL)
|
|
{
|
|
//
|
|
//Error - passed in invalid CleanupMgrInfo info
|
|
//
|
|
return 0;
|
|
}
|
|
|
|
memset(&psh, 0, sizeof(PROPSHEETHEADER));
|
|
|
|
psp.dwSize = sizeof(PROPSHEETPAGE);
|
|
psp.dwFlags = PSP_DEFAULT | PSP_USETITLE;
|
|
psp.hInstance = g_hInstance;
|
|
psp.lParam = lParam;
|
|
|
|
psp.pszTitle = MAKEINTRESOURCE(IDS_DISKCLEANUP);
|
|
psp.pszTemplate = MAKEINTRESOURCE(IDD_DISK_CLEANER);
|
|
psp.pfnDlgProc = DiskCleanupManagerProc;
|
|
hpsp[0] = CreatePropertySheetPage(&psp);
|
|
|
|
if (!(pcmi->dwUIFlags & FLAG_SAGESET))
|
|
{
|
|
// Only display the second tab if the user is an admin
|
|
if (IsUserAnAdmin())
|
|
{
|
|
psp.pszTitle = MAKEINTRESOURCE(IDS_MOREOPTIONS);
|
|
psp.pszTemplate = MAKEINTRESOURCE(IDD_MORE_OPTIONS);
|
|
psp.pfnDlgProc = MoreOptionsDlgProc;
|
|
hpsp[1] = CreatePropertySheetPage(&psp);
|
|
|
|
// commented out until after BEta 2
|
|
// psp.pszTitle = MAKEINTRESOURCE(IDS_SETTINGS);
|
|
// psp.pszTemplate = MAKEINTRESOURCE(IDD_SETTINGS);
|
|
// psp.pfnDlgProc = SettingsDlgProc;
|
|
// hpsp[2] = CreatePropertySheetPage(&psp);
|
|
|
|
// psh.nPages = 3;
|
|
psh.nPages = 2;
|
|
}
|
|
else
|
|
{
|
|
// User is not an admin so only display the first tab
|
|
psh.nPages = 1;
|
|
}
|
|
|
|
//
|
|
//Create the dialog title
|
|
//
|
|
psz = SHFormatMessage( MSG_APP_TITLE, pcmi->szVolName, pcmi->szRoot[0]);
|
|
}
|
|
|
|
else
|
|
{
|
|
psh.nPages = 1;
|
|
|
|
//
|
|
//Create the dialog title
|
|
//
|
|
psz = SHFormatMessage( MSG_APP_SETTINGS_TITLE );
|
|
}
|
|
|
|
psh.dwSize = sizeof(PROPSHEETHEADER);
|
|
psh.dwFlags = PSH_NOAPPLYNOW | PSH_USEICONID;
|
|
psh.hInstance = g_hInstance;
|
|
psh.hwndParent = hWnd;
|
|
psh.pszIcon = MAKEINTRESOURCE(ICON_CLEANMGR);
|
|
psh.phpage = hpsp;
|
|
psh.pszCaption = psz;
|
|
|
|
dwRet = (DWORD)PropertySheet(&psh);
|
|
|
|
LocalFree(psz);
|
|
return dwRet;
|
|
}
|
|
|
|
/*
|
|
**------------------------------------------------------------------------------
|
|
** DiskCleanupManagerProc
|
|
**
|
|
** Purpose: Dialog routine for Disk Cleanup Manager Property Sheet
|
|
** Parameters:
|
|
** hDlg - Handle to dialog window
|
|
** uMessage - behavior type
|
|
** wParam - depends on message
|
|
** lParam - depends on message
|
|
** Return: TRUE on sucess
|
|
** FALSE on failure
|
|
** Notes;
|
|
** Mod Log: Created by Jason Cobb (2/97)
|
|
**------------------------------------------------------------------------------
|
|
*/
|
|
INT_PTR CALLBACK
|
|
DiskCleanupManagerProc(
|
|
HWND hDlg,
|
|
UINT uiMessage,
|
|
WPARAM wParam,
|
|
LPARAM lParam
|
|
)
|
|
{
|
|
switch (uiMessage)
|
|
{
|
|
case WM_INITDIALOG:
|
|
return CleanupMgrDlgInit(hDlg, lParam);
|
|
|
|
case WM_DESTROY:
|
|
CleanupMgrDlgCleanup(hDlg);
|
|
break;
|
|
|
|
case WM_COMMAND:
|
|
return CleanupMgrDlgCommand(hDlg, wParam, lParam);
|
|
|
|
case WM_NOTIFY:
|
|
return CleanupMgrDlgNotify(hDlg, uiMessage, wParam, lParam);
|
|
|
|
case WM_HELP:
|
|
WinHelp((HWND)((LPHELPINFO) lParam)->hItemHandle, NULL,
|
|
HELP_WM_HELP, (DWORD_PTR)(LPTSTR) aHelpIDs);
|
|
return TRUE;
|
|
|
|
case WM_CONTEXTMENU:
|
|
WinHelp((HWND) wParam, NULL, HELP_CONTEXTMENU,
|
|
(DWORD_PTR)(LPVOID) aHelpIDs);
|
|
return TRUE;
|
|
|
|
case WM_SYSCOLORCHANGE:
|
|
SendMessage( GetDlgItem(hDlg, IDC_CLIENT_LIST), uiMessage, wParam, lParam);
|
|
break;
|
|
}
|
|
|
|
//Non-handled message
|
|
return FALSE;
|
|
}
|
|
|
|
/*
|
|
**------------------------------------------------------------------------------
|
|
** CleanupMgrDlgInit
|
|
**
|
|
** Purpose: Handles dialog initialization
|
|
** Parameters:
|
|
** hDlg - Handle to dialog window
|
|
** lParam - Property Sheet pointer
|
|
** Return: TRUE on sucess
|
|
** FALSE on failure
|
|
** Notes;
|
|
** Mod Log: Created by Jason Cobb (2/97)
|
|
**------------------------------------------------------------------------------
|
|
*/
|
|
BOOL
|
|
CleanupMgrDlgInit(
|
|
HWND hDlg,
|
|
LPARAM lParam
|
|
)
|
|
{
|
|
LPPROPSHEETPAGE lppsp;
|
|
|
|
g_hDlg = hDlg;
|
|
|
|
//
|
|
//Make sure we have an invalid pointer to start out with
|
|
//
|
|
SetWindowLongPtr (hDlg, DWLP_USER, 0L);
|
|
|
|
//
|
|
//Get the CleanupMgrInfo
|
|
//
|
|
lppsp = (LPPROPSHEETPAGE)lParam;
|
|
CleanupMgrInfo * pcmi = (CleanupMgrInfo *)lppsp->lParam;
|
|
if (pcmi == NULL)
|
|
{
|
|
//Error - passed in invalid CleanupMgrInfo info
|
|
return FALSE;
|
|
}
|
|
|
|
// now as we are becoming visible, we can dismiss the progress dialog
|
|
if ( pcmi->hAbortScanWnd )
|
|
{
|
|
pcmi->bAbortScan = TRUE;
|
|
|
|
//
|
|
//Wait for scan thread to finish
|
|
//
|
|
WaitForSingleObject(pcmi->hAbortScanThread, INFINITE);
|
|
|
|
pcmi->bAbortScan = FALSE;
|
|
}
|
|
|
|
//
|
|
//Save pointer to CleanupMgrInfo object
|
|
//
|
|
SetWindowLongPtr(hDlg, DWLP_USER, (LPARAM)pcmi);
|
|
|
|
//
|
|
//Initialize all text
|
|
//
|
|
if (!CleanupMgrDlgInitText(hDlg))
|
|
goto HAS_ERROR;
|
|
|
|
//
|
|
//Initialize the icon
|
|
//
|
|
SendDlgItemMessage(hDlg,IDC_DRIVE_ICON_LOCATION,STM_SETICON,(WPARAM)pcmi->hDriveIcon,0);
|
|
|
|
//
|
|
//If we are in SAGE settings mode then hide the total amount of space text
|
|
//
|
|
if (pcmi->dwUIFlags & FLAG_SAGESET)
|
|
{
|
|
ShowWindow(GetDlgItem(hDlg, IDC_TOTAL_SPACE_DESCRIPTION), SW_HIDE);
|
|
ShowWindow(GetDlgItem(hDlg, IDC_TOTAL_SPACE_TEXT), SW_HIDE);
|
|
}
|
|
|
|
//
|
|
//Initialize the list box (all of the cleanup clients)
|
|
//
|
|
if (!CleanupMgrDlgInitList(hDlg))
|
|
goto HAS_ERROR;
|
|
|
|
return TRUE;
|
|
|
|
HAS_ERROR:
|
|
//
|
|
//Delete any memory structures still hanging around
|
|
//
|
|
CleanupMgrDlgCleanup (hDlg);
|
|
return FALSE;
|
|
}
|
|
|
|
/*
|
|
**------------------------------------------------------------------------------
|
|
** CleanupMgrDlgCleanup
|
|
**
|
|
** Purpose:
|
|
** Parameters:
|
|
** Notes;
|
|
** Mod Log: Created by Jason Cobb (2/97)
|
|
**------------------------------------------------------------------------------
|
|
*/
|
|
void
|
|
CleanupMgrDlgCleanup(
|
|
HWND hDlg
|
|
)
|
|
{
|
|
//
|
|
//Make sure we have a valid parameter
|
|
//
|
|
if (!hDlg)
|
|
return;
|
|
|
|
//
|
|
//Hide the window right away since we might block waiting for a
|
|
//COM client to finish.
|
|
//
|
|
ShowWindow(hDlg, SW_HIDE);
|
|
|
|
g_hDlg = NULL;
|
|
}
|
|
|
|
/*
|
|
**------------------------------------------------------------------------------
|
|
** CleanupMgrWarningPrompt
|
|
**
|
|
** Purpose: Asks the user if they are sure they want to delete the files
|
|
** Parameters:
|
|
** hDlg - Handle to dialog window
|
|
** Return: TRUE if user says YES
|
|
** FALSE if user says NO
|
|
** Notes;
|
|
** Mod Log: Created by Jason Cobb (6/97)
|
|
**------------------------------------------------------------------------------
|
|
*/
|
|
BOOL
|
|
CleanupMgrWarningPrompt(
|
|
HWND hDlg
|
|
)
|
|
{
|
|
TCHAR szWarning[256];
|
|
TCHAR *pszWarningTitle;
|
|
int i;
|
|
BOOL bItemSelected = FALSE;
|
|
|
|
//
|
|
//First verify that at least one item is selected. If no items are selected then
|
|
//nothing will be deleted so we don't need to bother prompting the user.
|
|
//
|
|
CleanupMgrInfo * pcmi = GetCleanupMgrInfoPointer(hDlg);
|
|
if (pcmi == NULL)
|
|
return TRUE;
|
|
|
|
for (i=0; i<pcmi->iNumVolumeCacheClients; i++)
|
|
{
|
|
if (pcmi->pClientInfo[i].bSelected == TRUE)
|
|
{
|
|
bItemSelected = TRUE;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (bItemSelected)
|
|
{
|
|
LoadString(g_hInstance, IDS_DELETEWARNING, szWarning, ARRAYSIZE(szWarning));
|
|
pszWarningTitle = SHFormatMessage( MSG_APP_TITLE, pcmi->szVolName, pcmi->szRoot[0]);
|
|
|
|
if (MessageBox(hDlg, szWarning, pszWarningTitle, MB_YESNO | MB_ICONQUESTION) == IDYES)
|
|
{
|
|
LocalFree(pszWarningTitle);
|
|
return TRUE;
|
|
}
|
|
else
|
|
{
|
|
LocalFree(pszWarningTitle);
|
|
return FALSE;
|
|
}
|
|
}
|
|
|
|
//
|
|
//No items are selected so just return TRUE since nothing will be deleted.
|
|
//
|
|
return TRUE;
|
|
}
|
|
|
|
/*
|
|
**------------------------------------------------------------------------------
|
|
** CleanupMgrDlgCommand
|
|
**
|
|
** Purpose: Handles command messages
|
|
** Parameters:
|
|
** hDlg - Handle to dialog window
|
|
** wParam - depends on command
|
|
** lParam - depends on command
|
|
** Return: TRUE on sucess
|
|
** FALSE on failure
|
|
** Notes;
|
|
** Mod Log: Created by Jason Cobb (2/97)
|
|
**------------------------------------------------------------------------------
|
|
*/
|
|
BOOL CleanupMgrDlgCommand(HWND hDlg, WPARAM wParam, LPARAM lParam)
|
|
{
|
|
WORD wID = LOWORD(wParam);
|
|
|
|
if ( IDC_DETAILS_BUTTON == wID )
|
|
{
|
|
HWND hWndList = GetDlgItem(hDlg, IDC_CLIENT_LIST);
|
|
int wIndex;
|
|
|
|
wIndex = ListView_GetNextItem(hWndList, -1, LVNI_SELECTED);
|
|
if (-1 != wIndex)
|
|
{
|
|
PCLIENTINFO pClientInfo = (PCLIENTINFO)ListView_GetItemData(hWndList,wIndex);
|
|
if ( pClientInfo )
|
|
{
|
|
pClientInfo->pVolumeCache->ShowProperties(hDlg);
|
|
}
|
|
}
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
/*
|
|
**------------------------------------------------------------------------------
|
|
** CleanupMgrDlgNotify
|
|
**
|
|
** Purpose: Handles notify messages
|
|
** Parameters:
|
|
** hDlg - Handle to dialog window
|
|
** wParam - depends on command
|
|
** lParam - depends on command
|
|
** Return: TRUE on sucess
|
|
** FALSE on failure
|
|
** Notes;
|
|
** Mod Log: Created by Jason Cobb (7/97)
|
|
**------------------------------------------------------------------------------
|
|
*/
|
|
BOOL
|
|
CleanupMgrDlgNotify(
|
|
HWND hDlg,
|
|
UINT uiMessage,
|
|
WPARAM wParam,
|
|
LPARAM lParam
|
|
)
|
|
{
|
|
CleanupMgrInfo *pcmi;
|
|
LPNMHDR pnmhdr = (LPNMHDR)lParam;
|
|
|
|
if (IDC_CLIENT_LIST == pnmhdr->idFrom)
|
|
{
|
|
// a list view notification
|
|
#define pnmlv ((LPNMLISTVIEW)pnmhdr)
|
|
|
|
switch (pnmhdr->code)
|
|
{
|
|
case LVN_ITEMCHANGED:
|
|
if ( pnmlv->uChanged & LVIF_STATE )
|
|
{
|
|
LVITEM lvi;
|
|
lvi.iItem = pnmlv->iItem;
|
|
lvi.iSubItem = pnmlv->iSubItem;
|
|
lvi.mask = LVIF_PARAM;
|
|
ListView_GetItem( pnmhdr->hwndFrom, &lvi );
|
|
PCLIENTINFO pClientInfo = (PCLIENTINFO)lvi.lParam;
|
|
|
|
// check if an item was selected
|
|
if ( pnmlv->uNewState & LVIS_SELECTED )
|
|
{
|
|
if (pClientInfo->wcsDescription)
|
|
{
|
|
TCHAR szDescription[DESCRIPTION_LENGTH];
|
|
SHUnicodeToTChar(pClientInfo->wcsDescription, szDescription, ARRAYSIZE( szDescription ));
|
|
SetDlgItemText(hDlg, IDC_DESCRIPTION_TEXT, szDescription);
|
|
}
|
|
else
|
|
{
|
|
SetDlgItemText(hDlg, IDC_DESCRIPTION_TEXT, TEXT(""));
|
|
}
|
|
|
|
//
|
|
//Show or Hide the Settings button
|
|
//
|
|
if (pClientInfo->dwInitializeFlags & EVCF_HASSETTINGS)
|
|
{
|
|
TCHAR szButton[BUTTONTEXT_LENGTH];
|
|
SHUnicodeToTChar(pClientInfo->wcsAdvancedButtonText, szButton, ARRAYSIZE( szButton ));
|
|
SetDlgItemText(hDlg, IDC_DETAILS_BUTTON, szButton);
|
|
ShowWindow(GetDlgItem(hDlg, IDC_DETAILS_BUTTON), SW_SHOW);
|
|
}
|
|
else
|
|
{
|
|
ShowWindow(GetDlgItem(hDlg, IDC_DETAILS_BUTTON), SW_HIDE);
|
|
}
|
|
}
|
|
|
|
// Check if the state image changed. This results from checking or unchecking
|
|
// one of the list view checkboxes.
|
|
if ((pnmlv->uNewState ^ pnmlv->uOldState) & LVIS_STATEIMAGEMASK)
|
|
{
|
|
if ( !g_bIgnoreCheckStateChanges )
|
|
{
|
|
pClientInfo->bSelected = ListView_GetCheckState( pnmhdr->hwndFrom, pnmlv->iItem );
|
|
UpdateTotalSpaceToBeFreed(hDlg);
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
// must be a property sheet notification
|
|
switch(pnmhdr->code)
|
|
{
|
|
case PSN_RESET:
|
|
pcmi = GetCleanupMgrInfoPointer(hDlg);
|
|
pcmi->bPurgeFiles = FALSE;
|
|
break;
|
|
|
|
case PSN_APPLY:
|
|
pcmi = GetCleanupMgrInfoPointer(hDlg);
|
|
if (!(pcmi->dwUIFlags & FLAG_SAGESET))
|
|
{
|
|
// We're not in SAGESET mode
|
|
// Ask the user if they would like to proceed if there are items selected
|
|
if (!CleanupMgrWarningPrompt(hDlg))
|
|
{
|
|
// The user clicked no so drop them back to the main window
|
|
SetWindowLongPtr(hDlg, DWLP_MSGRESULT, PSNRET_INVALID_NOCHANGEPAGE);
|
|
pcmi->bPurgeFiles = FALSE;
|
|
return TRUE;
|
|
}
|
|
|
|
// User clicked yes so continue as normal
|
|
pcmi->bPurgeFiles = TRUE;
|
|
}
|
|
else
|
|
{
|
|
pcmi->bPurgeFiles = TRUE;
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
|
|
/*
|
|
**------------------------------------------------------------------------------
|
|
** CleanupMgrDlgInitText
|
|
**
|
|
** Purpose:
|
|
** Parameters:
|
|
** hDlg - Handle to dialog window
|
|
** Return: TRUE on sucess
|
|
** FALSE on failure
|
|
** Notes;
|
|
** Mod Log: Created by Jason Cobb (2/97)
|
|
**------------------------------------------------------------------------------
|
|
*/
|
|
BOOL
|
|
CleanupMgrDlgInitText(
|
|
HWND hDlg
|
|
)
|
|
{
|
|
if (hDlg == NULL)
|
|
return FALSE;
|
|
|
|
//
|
|
// Step 1. Get pointers to Info structures
|
|
//
|
|
|
|
CleanupMgrInfo * pcmi = GetCleanupMgrInfoPointer(hDlg);
|
|
if (pcmi == NULL)
|
|
return FALSE;
|
|
if (pcmi->dre == Drive_INV)
|
|
return FALSE;
|
|
|
|
//
|
|
// Step 2. Extract useful info
|
|
//
|
|
|
|
//
|
|
//get vol name
|
|
//
|
|
TCHAR * pszVolName = pcmi->szVolName;
|
|
if (pszVolName == NULL)
|
|
pszVolName = TEXT("");
|
|
|
|
//
|
|
//get drive letter
|
|
//
|
|
TCHAR chDrive = pcmi->dre + 'A';
|
|
|
|
//
|
|
// Step 3. Initialize text
|
|
//
|
|
|
|
//
|
|
//Set header
|
|
//
|
|
if (pcmi->dwUIFlags & FLAG_SAGESET)
|
|
{
|
|
TCHAR * psz;
|
|
psz = SHFormatMessage( MSG_INTRO_SETTINGS_TEXT );
|
|
SetDlgItemText (hDlg, IDC_INTRO_TEXT, psz);
|
|
LocalFree(psz);
|
|
}
|
|
else
|
|
{
|
|
TCHAR * psz;
|
|
TCHAR * pszDrive;
|
|
TCHAR szBuffer[50];
|
|
|
|
pszDrive = SHFormatMessage( MSG_VOL_NAME_DRIVE_LETTER, pszVolName, chDrive);
|
|
|
|
StrFormatKBSize(pcmi->cbEstCleanupSpace.QuadPart, szBuffer, ARRAYSIZE( szBuffer ));
|
|
psz = SHFormatMessage( MSG_INTRO_TEXT, pszDrive, szBuffer);
|
|
SetDlgItemText (hDlg, IDC_INTRO_TEXT, psz);
|
|
LocalFree(pszDrive);
|
|
LocalFree(psz);
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
/*
|
|
**------------------------------------------------------------------------------
|
|
** UpdateTotalSpaceToBeFreed
|
|
**
|
|
** Purpose:
|
|
** Parameters:
|
|
** hDlg - Handle to dialog window
|
|
** Return: NONE
|
|
** Notes;
|
|
** Mod Log: Created by Jason Cobb (7/97)
|
|
**------------------------------------------------------------------------------
|
|
*/
|
|
VOID UpdateTotalSpaceToBeFreed(HWND hDlg)
|
|
{
|
|
int i;
|
|
ULARGE_INTEGER TotalSpaceToFree;
|
|
|
|
TotalSpaceToFree.QuadPart = 0;
|
|
|
|
if (hDlg == NULL)
|
|
return;
|
|
|
|
CleanupMgrInfo * pcmi = GetCleanupMgrInfoPointer(hDlg);
|
|
if (pcmi == NULL)
|
|
return;
|
|
if (pcmi->dre == Drive_INV)
|
|
return;
|
|
|
|
//
|
|
//Calculate the total space to be freed by adding up the dwUsedSpace value
|
|
//on all of the selected clients
|
|
//
|
|
for (i=0; i<pcmi->iNumVolumeCacheClients; i++)
|
|
{
|
|
if (pcmi->pClientInfo[i].bSelected)
|
|
{
|
|
TotalSpaceToFree.QuadPart += pcmi->pClientInfo[i].dwUsedSpace.QuadPart;
|
|
}
|
|
}
|
|
|
|
//
|
|
//Display the total space to be freed
|
|
//
|
|
TCHAR szBuffer[10];
|
|
StrFormatKBSize(TotalSpaceToFree.QuadPart, szBuffer, ARRAYSIZE( szBuffer ));
|
|
SetDlgItemText(hDlg, IDC_TOTAL_SPACE_TEXT, szBuffer);
|
|
}
|
|
|
|
|
|
/*
|
|
**------------------------------------------------------------------------------
|
|
** CleanupMgrDlgInitList
|
|
**
|
|
** Purpose:
|
|
** Parameters:
|
|
** hDlg - Handle to dialog window
|
|
** Return: TRUE on sucess
|
|
** FALSE on failure
|
|
** Notes;
|
|
** Mod Log: Created by Jason Cobb (2/97)
|
|
**------------------------------------------------------------------------------
|
|
*/
|
|
|
|
#define NAME_COL_PERCENT 80
|
|
#define SIZE_COL_PERCENT 20
|
|
|
|
BOOL CleanupMgrDlgInitList(HWND hDlg)
|
|
{
|
|
int i;
|
|
|
|
if (hDlg == NULL)
|
|
return FALSE;
|
|
|
|
CleanupMgrInfo * pcmi = GetCleanupMgrInfoPointer(hDlg);
|
|
if (pcmi == NULL)
|
|
return FALSE;
|
|
|
|
if (pcmi->dre == Drive_INV)
|
|
return FALSE;
|
|
|
|
HWND hwndList = GetDlgItem(hDlg, IDC_CLIENT_LIST);
|
|
RECT rc;
|
|
GetClientRect(hwndList, &rc);
|
|
int cxList = rc.right - GetSystemMetrics(SM_CXVSCROLL);
|
|
|
|
// I have no idea what all this TUNEUP and SAGESET stuff means, but the old code
|
|
// only drew the sizes if the following condition was true. As such, I'm only
|
|
// showing the size column if the same condition is true:
|
|
BOOL bShowTwoCols = (!(pcmi->dwUIFlags & FLAG_TUNEUP) && !(pcmi->dwUIFlags & FLAG_SAGESET));
|
|
|
|
LVCOLUMN lvc;
|
|
lvc.mask = LVCF_SUBITEM | LVCF_WIDTH;
|
|
lvc.iSubItem = 0;
|
|
lvc.cx = bShowTwoCols ? MulDiv(cxList, NAME_COL_PERCENT, 100) : cxList;
|
|
ListView_InsertColumn( hwndList, 0, &lvc );
|
|
|
|
if ( bShowTwoCols )
|
|
{
|
|
lvc.mask = LVCF_SUBITEM | LVCF_WIDTH | LVCF_FMT;
|
|
lvc.iSubItem = 1;
|
|
lvc.cx = MulDiv(cxList, SIZE_COL_PERCENT, 100);
|
|
lvc.fmt = LVCFMT_RIGHT;
|
|
ListView_InsertColumn( hwndList, 1, &lvc );
|
|
}
|
|
|
|
HIMAGELIST himg = ImageList_Create(16, 16, ILC_COLOR|ILC_MASK, 4, 4);
|
|
ListView_SetImageList(hwndList, himg, LVSIL_SMALL );
|
|
ListView_SetExtendedListViewStyleEx(hwndList, LVS_EX_CHECKBOXES | LVS_EX_FULLROWSELECT, LVS_EX_CHECKBOXES | LVS_EX_FULLROWSELECT);
|
|
|
|
// When we add an item to the listview the listview code always initializes the item to the unchecked
|
|
// state. It then fires a WM_NOTIFY telling us the state changed to "off" which causes us to nuke our
|
|
// bSelected value. As such we need to ignore state image changes during the addition of list view
|
|
// items so that we can preserve our bSelected state.
|
|
g_bIgnoreCheckStateChanges = TRUE;
|
|
|
|
for (i=0; i<pcmi->iNumVolumeCacheClients; i++)
|
|
{
|
|
if ((pcmi->pClientInfo[i].pVolumeCache != NULL) &&
|
|
(pcmi->pClientInfo[i].wcsDisplayName != NULL) &&
|
|
(pcmi->pClientInfo[i].bShow == TRUE))
|
|
{
|
|
LPTSTR lpszDisplayName;
|
|
ULONG cb;
|
|
|
|
cb = WideCharToMultiByte(CP_ACP, 0, pcmi->pClientInfo[i].wcsDisplayName, -1, NULL, 0, NULL, NULL);
|
|
if ((lpszDisplayName = (LPTSTR)LocalAlloc(LPTR, (cb + 1) * sizeof( TCHAR ))) != NULL)
|
|
{
|
|
#ifdef UNICODE
|
|
StringCchCopy(lpszDisplayName, cb, pcmi->pClientInfo[i].wcsDisplayName);
|
|
#else
|
|
//
|
|
//Convert UNICODE display name to ANSI and then add it to the list
|
|
//
|
|
WideCharToMultiByte(CP_ACP, 0, pcmi->pClientInfo[i].wcsDisplayName, -1, lpszDisplayName, cb, NULL, NULL);
|
|
#endif
|
|
|
|
//
|
|
//Determine where in the list this item should go.
|
|
//
|
|
int iSortedPossition;
|
|
int totalSoFar = ListView_GetItemCount(hwndList);
|
|
|
|
for (iSortedPossition=0; iSortedPossition<totalSoFar; iSortedPossition++)
|
|
{
|
|
PCLIENTINFO pClientInfo = (PCLIENTINFO)ListView_GetItemData(hwndList, iSortedPossition);
|
|
if (!pClientInfo || (pcmi->pClientInfo[i].dwPriority < pClientInfo->dwPriority))
|
|
break;
|
|
}
|
|
|
|
//
|
|
//Insert this item at index j in the list
|
|
//
|
|
LVITEM lvi = {0};
|
|
lvi.mask = LVIF_TEXT | LVIF_PARAM | LVIF_IMAGE;
|
|
lvi.iItem = iSortedPossition;
|
|
lvi.iSubItem = 0;
|
|
lvi.pszText = lpszDisplayName;
|
|
lvi.lParam = (LPARAM)&(pcmi->pClientInfo[i]);
|
|
lvi.iImage = ImageList_AddIcon(himg, pcmi->pClientInfo[i].hIcon);
|
|
|
|
iSortedPossition = ListView_InsertItem(hwndList, &lvi);
|
|
|
|
if (bShowTwoCols)
|
|
{
|
|
TCHAR szBuffer[10];
|
|
|
|
StrFormatKBSize(pcmi->pClientInfo[i].dwUsedSpace.QuadPart, szBuffer, ARRAYSIZE( szBuffer ));
|
|
ListView_SetItemText( hwndList, iSortedPossition, 1, szBuffer );
|
|
}
|
|
|
|
// Set the initial check state. We can't do this when we add the item because the
|
|
// list view code specifically ingores your State Image Flags if you have the
|
|
// LVS_EX_CHECKBOX style set, which we do.
|
|
ListView_SetCheckState( hwndList, iSortedPossition, pcmi->pClientInfo[i].bSelected );
|
|
|
|
LocalFree( lpszDisplayName );
|
|
}
|
|
}
|
|
}
|
|
|
|
g_bIgnoreCheckStateChanges = FALSE;
|
|
|
|
UpdateTotalSpaceToBeFreed(hDlg);
|
|
ListView_SetItemState(hwndList, 0, LVIS_SELECTED, LVIS_SELECTED);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
typedef DWORD (WINAPI * PFNSRFIFO)(LPCWSTR pwszDrive, DWORD dwTargetRp, INT nPercent,
|
|
BOOL fIncludeCurrentRp);
|
|
|
|
|
|
INT_PTR CALLBACK
|
|
MoreOptionsDlgProc(
|
|
HWND hDlg,
|
|
UINT Message,
|
|
WPARAM wParam,
|
|
LPARAM lParam
|
|
)
|
|
{
|
|
CleanupMgrInfo *pcmi;
|
|
|
|
switch(Message)
|
|
{
|
|
case WM_INITDIALOG:
|
|
{
|
|
LPPROPSHEETPAGE lppsp;
|
|
HMODULE hSRClient;
|
|
|
|
lppsp = (LPPROPSHEETPAGE)lParam;
|
|
pcmi = (CleanupMgrInfo *)lppsp->lParam;
|
|
if (pcmi == NULL)
|
|
{
|
|
//Error - passed in invalid CleanupMgrInfo info
|
|
return FALSE;
|
|
}
|
|
SetWindowLongPtr (hDlg, DWLP_USER, (LONG_PTR) pcmi);
|
|
|
|
hSRClient = LoadLibraryEx(TEXT("srclient.dll"), NULL, DONT_RESOLVE_DLL_REFERENCES);
|
|
if (hSRClient)
|
|
{
|
|
FreeLibrary (hSRClient);
|
|
}
|
|
else
|
|
{
|
|
EnableWindow(GetDlgItem(hDlg, IDC_SYSTEM_RESTORE_GROUP), FALSE);
|
|
ShowWindow(GetDlgItem(hDlg, IDC_SYSTEM_RESTORE_ICON), SW_HIDE);
|
|
EnableWindow(GetDlgItem(hDlg, IDC_SYSTEM_RESTORE_TEXT), FALSE);
|
|
EnableWindow(GetDlgItem(hDlg, IDC_SYSTEM_RESTORE_BUTTON), FALSE);
|
|
}
|
|
}
|
|
break;
|
|
|
|
case WM_COMMAND:
|
|
switch(LOWORD(wParam))
|
|
{
|
|
case IDC_WINDOWS_SETUP_BUTTON:
|
|
{
|
|
TCHAR szSysDir[MAX_PATH];
|
|
if ( GetSystemDirectory(szSysDir, ARRAYSIZE(szSysDir)) )
|
|
{
|
|
TCHAR szParam[MAX_PATH];
|
|
|
|
StringCchPrintf(szParam, ARRAYSIZE(szParam), SZ_WINDOWS_SETUP, szSysDir);
|
|
|
|
// Use full path
|
|
if (PathAppend(szSysDir, SZ_SYSOCMGR))
|
|
{
|
|
ShellExecute(NULL, NULL, szSysDir, szParam, NULL, SW_SHOWNORMAL);
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
|
|
case IDC_INSTALLED_PROGRAMS_BUTTON:
|
|
{
|
|
TCHAR szPath[MAX_PATH];
|
|
|
|
if (GetSystemDirectory(szPath, ARRAYSIZE(szPath)))
|
|
{
|
|
// Use full path
|
|
if (PathAppend(szPath, SZ_RUNDLL32))
|
|
{
|
|
ShellExecute(NULL, NULL, szPath, SZ_INSTALLED_PROGRAMS, NULL, SW_SHOWNORMAL);
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
|
|
case IDC_SYSTEM_RESTORE_BUTTON:
|
|
pcmi = (CleanupMgrInfo *) GetWindowLongPtr (hDlg, DWLP_USER);
|
|
|
|
if (pcmi)
|
|
{
|
|
HMODULE hSRClient = NULL;
|
|
PFNSRFIFO pfnSRFifo;
|
|
TCHAR szCaption[100];
|
|
TCHAR szMessage[200];
|
|
INT iResult;
|
|
|
|
LoadString(g_hInstance, IDS_DISKCLEANUP, szCaption, ARRAYSIZE(szCaption));
|
|
LoadString(g_hInstance, IDS_SYSTEM_RESTORE_MESSAGE, szMessage, ARRAYSIZE(szMessage));
|
|
iResult = MessageBox(hDlg, szMessage, szCaption, MB_YESNO | MB_ICONQUESTION);
|
|
|
|
|
|
if (iResult == IDYES)
|
|
{
|
|
hSRClient = LoadLibrary(TEXT("srclient.dll"));
|
|
if (hSRClient)
|
|
{
|
|
pfnSRFifo = (PFNSRFIFO) GetProcAddress (hSRClient, "SRFifo");
|
|
|
|
if (pfnSRFifo)
|
|
{
|
|
pfnSRFifo ((LPCWSTR)pcmi->szRoot, NULL, 0, FALSE);
|
|
}
|
|
|
|
FreeLibrary (hSRClient);
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
break;
|
|
|
|
case WM_HELP:
|
|
WinHelp((HWND)((LPHELPINFO) lParam)->hItemHandle, NULL,
|
|
HELP_WM_HELP, (DWORD_PTR)(LPTSTR) aHelpIDs);
|
|
return TRUE;
|
|
|
|
case WM_CONTEXTMENU:
|
|
WinHelp((HWND) wParam, NULL, HELP_CONTEXTMENU,
|
|
(DWORD_PTR)(LPVOID) aHelpIDs);
|
|
return TRUE;
|
|
|
|
default:
|
|
return FALSE;
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
INT_PTR CALLBACK
|
|
SettingsDlgProc(
|
|
HWND hDlg,
|
|
UINT Message,
|
|
WPARAM wParam,
|
|
LPARAM lParam
|
|
)
|
|
{
|
|
LPPROPSHEETPAGE lppsp;
|
|
CleanupMgrInfo *pcmi;
|
|
DWORD dwType, cbBytes;
|
|
DWORD dwLDSDisable;
|
|
HKEY hk;
|
|
|
|
switch(Message)
|
|
{
|
|
case WM_INITDIALOG:
|
|
{
|
|
TCHAR * psz;
|
|
hardware hwType;
|
|
|
|
lppsp = (LPPROPSHEETPAGE)lParam;
|
|
pcmi = (CleanupMgrInfo *)lppsp->lParam;
|
|
if (pcmi == NULL)
|
|
{
|
|
//Error - passed in invalid CleanupMgrInfo info
|
|
return FALSE;
|
|
}
|
|
|
|
//
|
|
//Save pointer to CleanupMgrInfo object
|
|
//
|
|
SetWindowLongPtr(hDlg, DWLP_USER, (LPARAM)pcmi);
|
|
|
|
TCHAR * pszVolName = pcmi->szVolName;
|
|
if (pszVolName == NULL)
|
|
pszVolName = TEXT("");
|
|
|
|
TCHAR chDrive = pcmi->dre + TCHAR('A');
|
|
|
|
psz = SHFormatMessage( MSG_INTRO_SETTINGS_TAB, pszVolName, chDrive );
|
|
SetDlgItemText (hDlg, IDC_SETTINGS_DRIVE_TEXT, psz);
|
|
LocalFree(psz);
|
|
|
|
//
|
|
//Initialize the icon
|
|
//
|
|
SendDlgItemMessage(hDlg,IDC_DRIVE_ICON_LOCATION,STM_SETICON,(WPARAM)pcmi->hDriveIcon,0);
|
|
|
|
//
|
|
//Initialize the auto launch check box
|
|
//
|
|
if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, REGSTR_PATH_FILESYSTEM, 0, KEY_READ, &hk) == ERROR_SUCCESS)
|
|
{
|
|
dwLDSDisable = 0;
|
|
dwType = REG_DWORD;
|
|
cbBytes = sizeof(dwLDSDisable);
|
|
if (RegQueryValueEx(hk, REGSTR_VAL_DRIVE_LDS_BDCAST_DISABLE, NULL, &dwType, (LPBYTE)&dwLDSDisable, &cbBytes) == ERROR_SUCCESS)
|
|
{
|
|
if (dwLDSDisable & (0x01 << pcmi->dre))
|
|
{
|
|
CheckDlgButton(hDlg, IDC_AUTO_LAUNCH, 0);
|
|
}
|
|
else
|
|
{
|
|
CheckDlgButton(hDlg, IDC_AUTO_LAUNCH, 1);
|
|
}
|
|
}
|
|
|
|
RegCloseKey(hk);
|
|
}
|
|
|
|
//
|
|
//Gray out the auto launch option if this is not a fixed disk
|
|
//
|
|
if (!GetHardwareType(pcmi->dre, hwType) ||
|
|
(hwType != hwFixed))
|
|
{
|
|
CheckDlgButton(hDlg, IDC_AUTO_LAUNCH, 0);
|
|
EnableWindow(GetDlgItem(hDlg, IDC_AUTO_LAUNCH), FALSE);
|
|
}
|
|
}
|
|
break;
|
|
|
|
case WM_NOTIFY:
|
|
switch(((NMHDR *)lParam)->code)
|
|
{
|
|
case PSN_APPLY:
|
|
pcmi = (CleanupMgrInfo *)GetWindowLongPtr (hDlg, DWLP_USER);
|
|
|
|
if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, REGSTR_PATH_FILESYSTEM, 0, KEY_READ | KEY_WRITE, &hk) == ERROR_SUCCESS)
|
|
{
|
|
dwLDSDisable = 0;
|
|
dwType = REG_DWORD;
|
|
cbBytes = sizeof(dwLDSDisable);
|
|
if (RegQueryValueEx(hk, REGSTR_VAL_DRIVE_LDS_BDCAST_DISABLE, NULL, &dwType, (LPBYTE)&dwLDSDisable, &cbBytes) == ERROR_SUCCESS)
|
|
{
|
|
if (IsDlgButtonChecked(hDlg, IDC_AUTO_LAUNCH))
|
|
{
|
|
dwLDSDisable &= ~(0x01 << pcmi->dre);
|
|
}
|
|
else
|
|
{
|
|
dwLDSDisable |= (0x01 << pcmi->dre);
|
|
}
|
|
|
|
RegSetValueEx(hk, REGSTR_VAL_DRIVE_LDS_BDCAST_DISABLE, 0, REG_DWORD,
|
|
(LPBYTE)&dwLDSDisable, sizeof(dwLDSDisable));
|
|
}
|
|
|
|
RegCloseKey(hk);
|
|
}
|
|
break;
|
|
|
|
case PSN_RESET:
|
|
break;
|
|
}
|
|
break;
|
|
|
|
case WM_HELP:
|
|
WinHelp((HWND)((LPHELPINFO) lParam)->hItemHandle, NULL,
|
|
HELP_WM_HELP, (DWORD_PTR)(LPTSTR) aHelpIDs);
|
|
return TRUE;
|
|
|
|
case WM_CONTEXTMENU:
|
|
WinHelp((HWND) wParam, NULL, HELP_CONTEXTMENU,
|
|
(DWORD_PTR)(LPVOID) aHelpIDs);
|
|
return TRUE;
|
|
|
|
default:
|
|
return FALSE;
|
|
}
|
|
|
|
return TRUE;
|
|
}
|