ReactOS 0.4.16-dev-965-gf669426
CCleanupHandlerList.cpp
Go to the documentation of this file.
1/*
2 * PROJECT: ReactOS Disk Cleanup
3 * LICENSE: MIT (https://spdx.org/licenses/MIT)
4 * PURPOSE: CCleanupHandlerList implementation
5 * COPYRIGHT: Copyright 2023-2025 Mark Jansen <mark.jansen@reactos.org>
6 */
7
8#include "cleanmgr.h"
9
11{
12 m_DriveStr.Format(L"%c:", Drive);
13
14 CRegKey VolumeCaches;
15 if (VolumeCaches.Open(HKEY_LOCAL_MACHINE, L"Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\VolumeCaches", KEY_READ) != ERROR_SUCCESS)
16 return;
17
18 LONG ItemIndex = 0;
19 WCHAR szKeyName[MAX_PATH];
20
21 WCHAR wszVolume[] = { Drive, L':', L'\\', UNICODE_NULL };
22
23 while (TRUE)
24 {
25 DWORD dwSize = _countof(szKeyName);
26 if (VolumeCaches.EnumKey(ItemIndex++, szKeyName, &dwSize) != ERROR_SUCCESS)
27 {
28 break;
29 }
30
31
32 CRegKey hSubKey;
33 if (hSubKey.Open(VolumeCaches, szKeyName, KEY_READ) == ERROR_SUCCESS)
34 {
35 WCHAR GuidStr[50] = {};
36 dwSize = _countof(GuidStr);
37 if (hSubKey.QueryStringValue(NULL, GuidStr, &dwSize) != ERROR_SUCCESS)
38 {
39 continue;
40 }
41
42 GUID guid = {};
44 continue;
45
46 CCleanupHandler* handler = new CCleanupHandler(hSubKey, szKeyName, guid);
47
48 if (!handler->Initialize(wszVolume))
49 {
50 delete handler;
51 continue;
52 }
53
54 m_Handlers.AddTail(handler);
55 }
56 }
57
58 // Sort handlers
59 BOOL fChanged = m_Handlers.GetCount() > 0;
60 while (fChanged)
61 {
62 fChanged = FALSE;
63
64 for (size_t n = 0; n < m_Handlers.GetCount() - 1; n++)
65 {
66 POSITION leftPos = m_Handlers.FindIndex(n);
67 POSITION rightPos = m_Handlers.FindIndex(n+1);
68 CCleanupHandler* left = m_Handlers.GetAt(leftPos);
69 CCleanupHandler* right = m_Handlers.GetAt(rightPos);
70
71 if (right->Priority < left->Priority)
72 {
73 m_Handlers.SwapElements(leftPos, rightPos);
74 fChanged = TRUE;
75 }
76 else if (right->Priority == left->Priority)
77 {
78 CStringW leftStr(left->wszDisplayName);
79 if (leftStr.Compare(right->wszDisplayName) > 0)
80 {
81 m_Handlers.SwapElements(leftPos, rightPos);
82 fChanged = TRUE;
83 }
84 }
85 }
86 }
87}
88
89
92{
94 CString Caption;
97 progress.Start((DWORD)m_Handlers.GetCount(), Title, Caption);
98 int ItemIndex = 0;
99 DWORDLONG TotalSpaceUsed = 0;
100 ForEach(
102 {
103 Caption.Format(IDS_SCANNING, current->wszDisplayName.m_pData);
104 progress.Step(++ItemIndex, Caption);
105
106 HRESULT hr = current->Handler->GetSpaceUsed(&current->SpaceUsed, picb);
107
109 {
110 current->ShowHandler = false;
111 current->StateFlags &= ~HANDLER_STATE_SELECTED;
112 return;
113 }
114
115 if (current->SpaceUsed == 0 && current->DontShowIfZero())
116 {
117 current->ShowHandler = false;
118 current->StateFlags &= ~HANDLER_STATE_SELECTED;
119 }
120 TotalSpaceUsed += current->SpaceUsed;
121 });
122 progress.Stop();
123
124 return TotalSpaceUsed;
125}
126
127void
129{
131 CString Caption;
133
134 DWORD TotalSelected = 0;
135 ForEach(
137 {
138 if (current->StateFlags & HANDLER_STATE_SELECTED)
139 TotalSelected++;
140 });
141
143 progress.Start(TotalSelected, Title, Caption);
144 int ItemIndex = 0;
145 ForEach(
147 {
148 if (!(current->StateFlags & HANDLER_STATE_SELECTED))
149 return;
150
151 Caption.Format(IDS_CLEANING, current->wszDisplayName.m_pData);
152 progress.Step(++ItemIndex, Caption);
153
154 // If there is nothing to clean, we might get STG_E_NOMOREFILES
155 if (current->SpaceUsed > 0)
156 {
157 HRESULT hr = current->Handler->Purge(-1, picb);
158 if (FAILED_UNEXPECTEDLY(hr))
159 return;
160 }
161 });
162 progress.Stop();
163}
#define HANDLER_STATE_SELECTED
#define IDS_CLEANING
Definition: resource.h:30
#define IDS_CLEANING_CAPTION
Definition: resource.h:29
#define IDS_DISK_CLEANUP
Definition: resource.h:25
#define IDS_CALCULATING
Definition: resource.h:27
#define IDS_SCANNING
Definition: resource.h:28
PWCHAR Drive
Definition: chkdsk.c:73
cd_progress_ptr progress
Definition: cdjpeg.h:152
LONG Open(HKEY hKeyParent, LPCTSTR lpszKeyName, REGSAM samDesired=KEY_READ|KEY_WRITE) noexcept
Definition: atlbase.h:1173
LONG QueryStringValue(LPCTSTR pszValueName, LPTSTR pszValue, ULONG *pnChars) noexcept
Definition: atlbase.h:1240
LONG EnumKey(DWORD iIndex, LPTSTR pszName, LPDWORD pnNameLength, FILETIME *pftLastWriteTime=NULL) noexcept
Definition: atlbase.h:1421
PXSTR GetString() noexcept
Definition: atlsimpstr.h:367
void __cdecl Format(UINT nFormatID,...)
Definition: cstringt.h:818
int Compare(_In_z_ PCXSTR psz) const
Definition: cstringt.h:738
void ForEach(Fn callback)
DWORDLONG ScanDrive(IEmptyVolumeCacheCallBack *picb)
void LoadHandlers(WCHAR Drive)
void ExecuteCleanup(IEmptyVolumeCacheCallBack *picb)
CAtlList< CCleanupHandler * > m_Handlers
#define ERROR_SUCCESS
Definition: deptool.c:10
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
static const WCHAR Title[]
Definition: oid.c:1259
#define MAX_PATH
Definition: compat.h:34
#define FAILED_UNEXPECTEDLY(hr)
Definition: precomp.h:121
UINT(* handler)(MSIPACKAGE *)
Definition: action.c:7512
HRESULT WINAPI CLSIDFromString(LPCOLESTR idstr, LPCLSID id)
Definition: compobj.c:2338
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
GLdouble n
Definition: glext.h:7729
GLdouble GLdouble right
Definition: glext.h:10859
GLint left
Definition: glext.h:7726
unsigned long long DWORDLONG
Definition: intsafe.h:93
if(dx< 0)
Definition: linetemp.h:194
const GUID * guid
struct task_struct * current
Definition: linux.c:32
PSDBQUERYRESULT_VISTA PVOID DWORD * dwSize
Definition: env.c:56
#define KEY_READ
Definition: nt_native.h:1023
#define UNICODE_NULL
#define L(x)
Definition: ntvdm.h:50
long LONG
Definition: pedump.c:60
HRESULT hr
Definition: shlfolder.c:183
#define _countof(array)
Definition: sndvol32.h:70
#define HKEY_LOCAL_MACHINE
Definition: winreg.h:12
#define MAKEINTRESOURCE
Definition: winuser.h:591
__wchar_t WCHAR
Definition: xmlstorage.h:180