ReactOS 0.4.15-dev-8434-g155a7c7
CRecycleBin.cpp File Reference
#include <precomp.h>
#include <mmsystem.h>
#include <ntquery.h>
Include dependency graph for CRecycleBin.cpp:

Go to the source code of this file.

Classes

struct  columninfo
 
struct  _SEARCH_CONTEXT
 
class  CRecycleBinEnum
 
class  CRecycleBinItemContextMenu
 

Macros

#define COLUMN_NAME   0
 
#define COLUMN_DELFROM   1
 
#define COLUMN_DATEDEL   2
 
#define COLUMN_SIZE   3
 
#define COLUMN_TYPE   4
 
#define COLUMN_MTIME   5
 
#define COLUMNS_COUNT   6
 

Typedefs

typedef struct _SEARCH_CONTEXT SEARCH_CONTEXT
 
typedef struct _SEARCH_CONTEXTPSEARCH_CONTEXT
 

Functions

 WINE_DEFAULT_DEBUG_CHANNEL (CRecycleBin)
 
BOOL WINAPI CBSearchRecycleBin (IN PVOID Context, IN HDELFILE hDeletedFile)
 
static PIDLRecycleStruct * _ILGetRecycleStruct (LPCITEMIDLIST pidl)
 
HRESULT CRecyclerExtractIcon_CreateInstance (LPCITEMIDLIST pidl, REFIID riid, LPVOID *ppvOut)
 
static LPITEMIDLIST _ILCreateRecycleItem (PDELETED_FILE_DETAILS_W pFileDetails)
 
PDELETED_FILE_DETAILS_W UnpackDetailsFromPidl (LPCITEMIDLIST pidl)
 
static HRESULT FormatDateTime (LPWSTR buffer, int size, FILETIME *ft)
 
BOOL TRASH_CanTrashFile (LPCWSTR wszPath)
 
BOOL TRASH_TrashFile (LPCWSTR wszPath)
 
static void TRASH_PlayEmptyRecycleBinSound ()
 
EXTERN_C HRESULT WINAPI SHUpdateRecycleBinIcon (void)
 
HRESULT WINAPI SHEmptyRecycleBinA (HWND hwnd, LPCSTR pszRootPath, DWORD dwFlags)
 
HRESULT WINAPI SHEmptyRecycleBinW (HWND hwnd, LPCWSTR pszRootPath, DWORD dwFlags)
 
HRESULT WINAPI SHQueryRecycleBinA (LPCSTR pszRootPath, LPSHQUERYRBINFO pSHQueryRBInfo)
 
HRESULT WINAPI SHQueryRecycleBinW (LPCWSTR pszRootPath, LPSHQUERYRBINFO pSHQueryRBInfo)
 

Variables

static const columninfo RecycleBinColumns []
 

Macro Definition Documentation

◆ COLUMN_DATEDEL

#define COLUMN_DATEDEL   2

Definition at line 54 of file CRecycleBin.cpp.

◆ COLUMN_DELFROM

#define COLUMN_DELFROM   1

Definition at line 53 of file CRecycleBin.cpp.

◆ COLUMN_MTIME

#define COLUMN_MTIME   5

Definition at line 57 of file CRecycleBin.cpp.

◆ COLUMN_NAME

#define COLUMN_NAME   0

Definition at line 52 of file CRecycleBin.cpp.

◆ COLUMN_SIZE

#define COLUMN_SIZE   3

Definition at line 55 of file CRecycleBin.cpp.

◆ COLUMN_TYPE

#define COLUMN_TYPE   4

Definition at line 56 of file CRecycleBin.cpp.

◆ COLUMNS_COUNT

#define COLUMNS_COUNT   6

Definition at line 59 of file CRecycleBin.cpp.

Typedef Documentation

◆ PSEARCH_CONTEXT

◆ SEARCH_CONTEXT

Function Documentation

◆ _ILCreateRecycleItem()

static LPITEMIDLIST _ILCreateRecycleItem ( PDELETED_FILE_DETAILS_W  pFileDetails)
static

Definition at line 251 of file CRecycleBin.cpp.

252{
253 PIDLDATA tmp;
254 LPITEMIDLIST pidl;
255 PIDLRecycleStruct * p;
256 int size0 = (char*)&tmp.u.crecycle.szName - (char*)&tmp.u.crecycle;
257 int size = size0;
258
259 tmp.type = 0x00;
260 size += (wcslen(pFileDetails->FileName) + 1) * sizeof(WCHAR);
261
262 pidl = (LPITEMIDLIST)SHAlloc(size + 4);
263 if (!pidl)
264 return pidl;
265
266 pidl->mkid.cb = size + 2;
267 memcpy(pidl->mkid.abID, &tmp, 2 + size0);
268
269 p = &((PIDLDATA*)pidl->mkid.abID)->u.crecycle;
270 RtlCopyMemory(p, pFileDetails, sizeof(DELETED_FILE_DETAILS_W));
271 wcscpy(p->szName, pFileDetails->FileName);
272 *(WORD*)((char*)pidl + (size + 2)) = 0;
273 return pidl;
274}
LPVOID WINAPI SHAlloc(SIZE_T len)
Definition: shellole.c:304
unsigned short WORD
Definition: ntddk_ex.h:93
GLsizeiptr size
Definition: glext.h:5919
GLfloat GLfloat p
Definition: glext.h:8902
_CRTIMP size_t __cdecl wcslen(_In_z_ const wchar_t *_Str)
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
_CRTIMP wchar_t *__cdecl wcscpy(_Out_writes_z_(_String_length_(_Source)+1) wchar_t *_Dest, _In_z_ const wchar_t *_Source)
ITEMIDLIST UNALIGNED * LPITEMIDLIST
Definition: shtypes.idl:41
WCHAR FileName[ANY_SIZE]
Definition: recyclebin.h:40
#define RtlCopyMemory(Destination, Source, Length)
Definition: typedefs.h:263
__wchar_t WCHAR
Definition: xmlstorage.h:180

Referenced by CRecycleBinEnum::CBEnumRecycleBin().

◆ _ILGetRecycleStruct()

static PIDLRecycleStruct * _ILGetRecycleStruct ( LPCITEMIDLIST  pidl)
static

Definition at line 206 of file CRecycleBin.cpp.

207{
209
210 if (pdata && pdata->type == 0x00)
211 return (PIDLRecycleStruct*) & (pdata->u.crecycle);
212
213 return NULL;
214}
#define NULL
Definition: types.h:112
static PROTOCOLDATA * pdata
Definition: protocol.c:158
LPPIDLDATA _ILGetDataPointer(LPCITEMIDLIST pidl)
Definition: pidl.c:2154

Referenced by CRecycleBin::CompareIDs(), CRecyclerExtractIcon_CreateInstance(), CRecycleBin::GetDetailsOf(), CRecycleBin::GetDisplayNameOf(), and CRecycleBinItemContextMenu::InvokeCommand().

◆ CBSearchRecycleBin()

BOOL WINAPI CBSearchRecycleBin ( IN PVOID  Context,
IN HDELFILE  hDeletedFile 
)

Definition at line 158 of file CRecycleBin.cpp.

159{
161
162 PDELETED_FILE_DETAILS_W pFileDetails;
164 BOOL ret;
165
166 if (!GetDeletedFileDetailsW(hDeletedFile,
167 0,
168 NULL,
169 &dwSize) &&
171 {
172 ERR("GetDeletedFileDetailsW failed\n");
173 return FALSE;
174 }
175
176 pFileDetails = (DELETED_FILE_DETAILS_W *)SHAlloc(dwSize);
177 if (!pFileDetails)
178 {
179 ERR("No memory\n");
180 return FALSE;
181 }
182
183 if (!GetDeletedFileDetailsW(hDeletedFile,
184 dwSize,
185 pFileDetails,
186 NULL))
187 {
188 ERR("GetDeletedFileDetailsW failed\n");
189 SHFree(pFileDetails);
190 return FALSE;
191 }
192
193 ret = memcmp(pFileDetails, pContext->pFileDetails, dwSize);
194 if (!ret)
195 {
196 pContext->hDeletedFile = hDeletedFile;
197 pContext->bFound = TRUE;
198 }
199 else
200 CloseRecycleBinHandle(hDeletedFile);
201
202 SHFree(pFileDetails);
203 return ret;
204}
struct _SEARCH_CONTEXT * PSEARCH_CONTEXT
int memcmp(void *Buffer1, void *Buffer2, ACPI_SIZE Count)
Definition: utclib.c:112
#define ERR(fmt,...)
Definition: precomp.h:57
#define ERROR_INSUFFICIENT_BUFFER
Definition: dderror.h:10
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
BOOL WINAPI CloseRecycleBinHandle(IN HDELFILE hDeletedFile)
Definition: recyclebin.c:12
BOOL WINAPI GetDeletedFileDetailsW(IN HDELFILE hDeletedFile, IN DWORD BufferSize, IN OUT PDELETED_FILE_DETAILS_W FileDetails OPTIONAL, OUT LPDWORD RequiredSize OPTIONAL)
Definition: recyclebin.c:327
void WINAPI SHFree(LPVOID pv)
Definition: shellole.c:326
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
PSDBQUERYRESULT_VISTA PVOID DWORD * dwSize
Definition: env.c:56
PIDLRecycleStruct * pFileDetails
Definition: CRecycleBin.cpp:71
HDELFILE hDeletedFile
Definition: CRecycleBin.cpp:72
int ret
DWORD WINAPI GetLastError(void)
Definition: except.c:1042

Referenced by CRecyclerExtractIcon_CreateInstance(), CRecycleBin::GetDetailsOf(), and CRecycleBinItemContextMenu::InvokeCommand().

◆ CRecyclerExtractIcon_CreateInstance()

HRESULT CRecyclerExtractIcon_CreateInstance ( LPCITEMIDLIST  pidl,
REFIID  riid,
LPVOID ppvOut 
)

Definition at line 76 of file CRecycleBin.cpp.

78{
79 PIDLRecycleStruct *pFileDetails = _ILGetRecycleStruct(pidl);
80 if (pFileDetails == NULL)
81 goto fallback;
82
83 // Try to obtain the file
85 Context.pFileDetails = pFileDetails;
86 Context.bFound = FALSE;
87
89 if (Context.bFound)
90 {
91 // This should be executed any time, if not, there are some errors in the implementation
92 IRecycleBinFile* pRecycleFile = (IRecycleBinFile*)Context.hDeletedFile;
93
94 // Query the interface from the private interface
95 HRESULT hr = pRecycleFile->QueryInterface(riid, ppvOut);
96
97 // Close the file handle as we don't need it anymore
98 CloseRecycleBinHandle(Context.hDeletedFile);
99
100 return hr;
101 }
102
103fallback:
104 // In case the search fails we use a default icon
105 ERR("Recycler could not retrieve the icon, this shouldn't happen\n");
106
107 CComPtr<IDefaultExtractIconInit> initIcon;
110 return hr;
111
112 initIcon->SetNormalIcon(swShell32Name, 0);
113
114 return initIcon->QueryInterface(riid, ppvOut);
115}
HRESULT WINAPI SHCreateDefaultExtractIcon(REFIID riid, void **ppv)
static PIDLRecycleStruct * _ILGetRecycleStruct(LPCITEMIDLIST pidl)
BOOL WINAPI CBSearchRecycleBin(IN PVOID Context, IN HDELFILE hDeletedFile)
#define FAILED_UNEXPECTEDLY(hr)
Definition: precomp.h:121
BOOL WINAPI EnumerateRecycleBinW(IN LPCWSTR pszRoot OPTIONAL, IN PENUMERATE_RECYCLEBIN_CALLBACK pFnCallback, IN PVOID Context OPTIONAL)
Definition: recyclebin.c:205
WCHAR swShell32Name[MAX_PATH]
Definition: folders.cpp:22
REFIID riid
Definition: atlbase.h:39
HRESULT QueryInterface([in] REFIID riid, [out, iid_is(riid)] void **ppvObject)
HRESULT hr
Definition: shlfolder.c:183
#define IID_PPV_ARG(Itype, ppType)

Referenced by CRecycleBin::GetUIObjectOf().

◆ FormatDateTime()

static HRESULT FormatDateTime ( LPWSTR  buffer,
int  size,
FILETIME ft 
)
static

Definition at line 722 of file CRecycleBin.cpp.

723{
724 FILETIME lft;
726 int ret;
727
728 FileTimeToLocalFileTime(ft, &lft);
730
732 if (ret > 0 && ret < size)
733 {
734 /* Append space + time without seconds */
735 buffer[ret-1] = ' ';
737 }
738
739 return (ret != 0 ? E_FAIL : S_OK);
740}
#define E_FAIL
Definition: ddrawi.h:102
BOOL WINAPI FileTimeToSystemTime(IN CONST FILETIME *lpFileTime, OUT LPSYSTEMTIME lpSystemTime)
Definition: time.c:188
BOOL WINAPI FileTimeToLocalFileTime(IN CONST FILETIME *lpFileTime, OUT LPFILETIME lpLocalFileTime)
Definition: time.c:221
GLuint buffer
Definition: glext.h:5915
#define S_OK
Definition: intsafe.h:52
INT WINAPI GetTimeFormatW(LCID lcid, DWORD dwFlags, const SYSTEMTIME *lpTime, LPCWSTR lpFormat, LPWSTR lpTimeStr, INT cchOut)
Definition: lcformat.c:1093
INT WINAPI GetDateFormatW(LCID lcid, DWORD dwFlags, const SYSTEMTIME *lpTime, LPCWSTR lpFormat, LPWSTR lpDateStr, INT cchOut)
Definition: lcformat.c:993
__u16 time
Definition: mkdosfs.c:8
#define LOCALE_USER_DEFAULT
#define TIME_NOSECONDS
Definition: winnls.h:278
#define DATE_SHORTDATE
Definition: winnls.h:196

◆ SHEmptyRecycleBinA()

HRESULT WINAPI SHEmptyRecycleBinA ( HWND  hwnd,
LPCSTR  pszRootPath,
DWORD  dwFlags 
)

Definition at line 1097 of file CRecycleBin.cpp.

1098{
1099 LPWSTR szRootPathW = NULL;
1100 int len;
1101 HRESULT hr;
1102
1103 TRACE("%p, %s, 0x%08x\n", hwnd, debugstr_a(pszRootPath), dwFlags);
1104
1105 if (pszRootPath)
1106 {
1107 len = MultiByteToWideChar(CP_ACP, 0, pszRootPath, -1, NULL, 0);
1108 if (len == 0)
1110 szRootPathW = (LPWSTR)HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR));
1111 if (!szRootPathW)
1112 return E_OUTOFMEMORY;
1113 if (MultiByteToWideChar(CP_ACP, 0, pszRootPath, -1, szRootPathW, len) == 0)
1114 {
1115 HeapFree(GetProcessHeap(), 0, szRootPathW);
1117 }
1118 }
1119
1120 hr = SHEmptyRecycleBinW(hwnd, szRootPathW, dwFlags);
1121 HeapFree(GetProcessHeap(), 0, szRootPathW);
1122
1123 return hr;
1124}
HRESULT WINAPI SHEmptyRecycleBinW(HWND hwnd, LPCWSTR pszRootPath, DWORD dwFlags)
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
#define GetProcessHeap()
Definition: compat.h:736
#define CP_ACP
Definition: compat.h:109
#define HeapAlloc
Definition: compat.h:733
#define HeapFree(x, y, z)
Definition: compat.h:735
#define MultiByteToWideChar
Definition: compat.h:110
GLenum GLsizei len
Definition: glext.h:6722
#define debugstr_a
Definition: kernel32.h:31
#define TRACE(s)
Definition: solgame.cpp:4
_In_ PCCERT_CONTEXT _In_ DWORD dwFlags
Definition: wincrypt.h:1176
_In_ LONG _In_ HWND hwnd
Definition: winddi.h:4023
#define HRESULT_FROM_WIN32(x)
Definition: winerror.h:92
WCHAR * LPWSTR
Definition: xmlstorage.h:184

◆ SHEmptyRecycleBinW()

HRESULT WINAPI SHEmptyRecycleBinW ( HWND  hwnd,
LPCWSTR  pszRootPath,
DWORD  dwFlags 
)

Definition at line 1126 of file CRecycleBin.cpp.

1127{
1128 WCHAR szBuffer[MAX_PATH];
1129 DWORD count;
1130 LONG ret;
1131 IShellFolder *pDesktop, *pRecycleBin;
1132 PIDLIST_ABSOLUTE pidlRecycleBin;
1133 PITEMID_CHILD pidl;
1134 HRESULT hr = S_OK;
1135 LPENUMIDLIST penumFiles;
1136 STRRET StrRet;
1137
1138 TRACE("%p, %s, 0x%08x\n", hwnd, debugstr_w(pszRootPath), dwFlags);
1139
1141 {
1142 hr = SHGetDesktopFolder(&pDesktop);
1143 if (FAILED(hr))
1144 return hr;
1145 hr = SHGetFolderLocation(NULL, CSIDL_BITBUCKET, NULL, 0, &pidlRecycleBin);
1146 if (FAILED(hr))
1147 {
1148 pDesktop->Release();
1149 return hr;
1150 }
1151 hr = pDesktop->BindToObject(pidlRecycleBin, NULL, IID_PPV_ARG(IShellFolder, &pRecycleBin));
1152 CoTaskMemFree(pidlRecycleBin);
1153 pDesktop->Release();
1154 if (FAILED(hr))
1155 return hr;
1156 hr = pRecycleBin->EnumObjects(hwnd, SHCONTF_FOLDERS | SHCONTF_NONFOLDERS | SHCONTF_INCLUDEHIDDEN, &penumFiles);
1157 if (FAILED(hr))
1158 {
1159 pRecycleBin->Release();
1160 return hr;
1161 }
1162
1163 count = 0;
1164 if (hr != S_FALSE)
1165 {
1166 while (penumFiles->Next(1, &pidl, NULL) == S_OK)
1167 {
1168 count++;
1169 pRecycleBin->GetDisplayNameOf(pidl, SHGDN_NORMAL, &StrRet);
1170 StrRetToBuf(&StrRet, pidl, szBuffer, _countof(szBuffer));
1171 CoTaskMemFree(pidl);
1172 }
1173 penumFiles->Release();
1174 }
1175 pRecycleBin->Release();
1176
1177 switch (count)
1178 {
1179 case 0:
1180 /* no files, don't need confirmation */
1181 break;
1182
1183 case 1:
1184 /* we have only one item inside the bin, so show a message box with its name */
1187 {
1188 return S_OK;
1189 }
1190 break;
1191
1192 default:
1193 /* we have more than one item, so show a message box with the count of the items */
1194 StringCbPrintfW(szBuffer, sizeof(szBuffer), L"%u", count);
1197 {
1198 return S_OK;
1199 }
1200 break;
1201 }
1202 }
1203
1205 {
1206 ret = EmptyRecycleBinW(pszRootPath);
1207 }
1208 else
1209 {
1210 /* FIXME
1211 * show a progress dialog
1212 */
1213 ret = EmptyRecycleBinW(pszRootPath);
1214 }
1215
1216 if (!ret)
1218
1219 if (!(dwFlags & SHERB_NOSOUND))
1220 {
1222 }
1223 return S_OK;
1224}
HRESULT WINAPI SHGetDesktopFolder(IShellFolder **psf)
static void TRASH_PlayEmptyRecycleBinSound()
#define shell32_hInstance
#define MAX_PATH
Definition: compat.h:34
#define ShellMessageBoxW
Definition: precomp.h:62
BOOL WINAPI EmptyRecycleBinW(IN LPCWSTR pszRoot OPTIONAL)
Definition: recyclebin.c:145
HRESULT WINAPI SHGetFolderLocation(HWND hwndOwner, int nFolder, HANDLE hToken, DWORD dwReserved, LPITEMIDLIST *ppidl)
Definition: shellpath.c:3150
GLuint GLuint GLsizei count
Definition: gl.h:1545
VOID WINAPI CoTaskMemFree(LPVOID ptr)
Definition: ifs.c:442
HRESULT EnumObjects([in] HWND hwndOwner, [in] SHCONTF grfFlags, [out] IEnumIDList **ppenumIDList)
HRESULT BindToObject([in] PCUIDLIST_RELATIVE pidl, [in] LPBC pbcReserved, [in] REFIID riid, [out, iid_is(riid)] void **ppvOut)
HRESULT GetDisplayNameOf([in] PCUITEMID_CHILD pidl, [in] SHGDNF uFlags, [out] STRRET *lpName)
ULONG Release()
#define FAILED(hr)
Definition: intsafe.h:51
#define debugstr_w
Definition: kernel32.h:32
#define L(x)
Definition: ntvdm.h:50
long LONG
Definition: pedump.c:60
#define SHERB_NOSOUND
Definition: shellapi.h:398
#define SHERB_NOPROGRESSUI
Definition: shellapi.h:397
#define SHERB_NOCONFIRMATION
Definition: shellapi.h:396
#define StrRet
Definition: shellclasses.h:871
#define CSIDL_BITBUCKET
Definition: shlobj.h:2182
#define StrRetToBuf
Definition: shlwapi.h:1769
#define IDS_DELETEITEM_TEXT
Definition: shresdef.h:126
#define IDS_EMPTY_BITBUCKET
Definition: shresdef.h:188
#define IDS_DELETEMULTIPLE_TEXT
Definition: shresdef.h:127
#define _countof(array)
Definition: sndvol32.h:70
STRSAFEAPI StringCbPrintfW(STRSAFE_LPWSTR pszDest, size_t cbDest, STRSAFE_LPCWSTR pszFormat,...)
Definition: strsafe.h:557
#define S_FALSE
Definition: winerror.h:2357
#define MB_YESNO
Definition: winuser.h:817
#define IDNO
Definition: winuser.h:836
#define MB_ICONEXCLAMATION
Definition: winuser.h:785
#define MB_DEFBUTTON2
Definition: winuser.h:799
#define MAKEINTRESOURCEW(i)
Definition: winuser.h:582

Referenced by CRecycleBin::InvokeCommand(), and SHEmptyRecycleBinA().

◆ SHQueryRecycleBinA()

HRESULT WINAPI SHQueryRecycleBinA ( LPCSTR  pszRootPath,
LPSHQUERYRBINFO  pSHQueryRBInfo 
)

Definition at line 1226 of file CRecycleBin.cpp.

1227{
1228 LPWSTR szRootPathW = NULL;
1229 int len;
1230 HRESULT hr;
1231
1232 TRACE("%s, %p\n", debugstr_a(pszRootPath), pSHQueryRBInfo);
1233
1234 if (pszRootPath)
1235 {
1236 len = MultiByteToWideChar(CP_ACP, 0, pszRootPath, -1, NULL, 0);
1237 if (len == 0)
1239 szRootPathW = (LPWSTR)HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR));
1240 if (!szRootPathW)
1241 return E_OUTOFMEMORY;
1242 if (MultiByteToWideChar(CP_ACP, 0, pszRootPath, -1, szRootPathW, len) == 0)
1243 {
1244 HeapFree(GetProcessHeap(), 0, szRootPathW);
1246 }
1247 }
1248
1249 hr = SHQueryRecycleBinW(szRootPathW, pSHQueryRBInfo);
1250 HeapFree(GetProcessHeap(), 0, szRootPathW);
1251
1252 return hr;
1253}
HRESULT WINAPI SHQueryRecycleBinW(LPCWSTR pszRootPath, LPSHQUERYRBINFO pSHQueryRBInfo)

◆ SHQueryRecycleBinW()

HRESULT WINAPI SHQueryRecycleBinW ( LPCWSTR  pszRootPath,
LPSHQUERYRBINFO  pSHQueryRBInfo 
)

Definition at line 1255 of file CRecycleBin.cpp.

1256{
1257 TRACE("%s, %p\n", debugstr_w(pszRootPath), pSHQueryRBInfo);
1258
1259 if (!pszRootPath || (pszRootPath[0] == 0) ||
1260 !pSHQueryRBInfo || (pSHQueryRBInfo->cbSize < sizeof(SHQUERYRBINFO)))
1261 {
1262 return E_INVALIDARG;
1263 }
1264
1265 pSHQueryRBInfo->i64Size = 0;
1266 pSHQueryRBInfo->i64NumItems = 0;
1267
1268 CComPtr<IRecycleBin> spRecycleBin;
1269 HRESULT hr;
1270 if (FAILED_UNEXPECTEDLY((hr = GetDefaultRecycleBin(pszRootPath, &spRecycleBin))))
1271 return hr;
1272
1273 CComPtr<IRecycleBinEnumList> spEnumList;
1274 hr = spRecycleBin->EnumObjects(&spEnumList);
1275 if (!SUCCEEDED(hr))
1276 return hr;
1277
1278 while (TRUE)
1279 {
1280 CComPtr<IRecycleBinFile> spFile;
1281 hr = spEnumList->Next(1, &spFile, NULL);
1282 if (hr == S_FALSE)
1283 return S_OK;
1284
1286 return hr;
1287
1288 ULARGE_INTEGER Size = {};
1289 if (FAILED_UNEXPECTEDLY((hr = spFile->GetFileSize(&Size))))
1290 return hr;
1291
1292 pSHQueryRBInfo->i64Size += Size.QuadPart;
1293 pSHQueryRBInfo->i64NumItems++;
1294 }
1295
1296 return S_OK;
1297}
#define E_INVALIDARG
Definition: ddrawi.h:101
HRESULT WINAPI GetDefaultRecycleBin(IN LPCWSTR pszVolume OPTIONAL, OUT IRecycleBin **pprb)
Definition: recyclebin.c:399
#define SUCCEEDED(hr)
Definition: intsafe.h:50
__int64 i64Size
Definition: shellapi.h:380
__int64 i64NumItems
Definition: shellapi.h:381
DWORD cbSize
Definition: shellapi.h:379
_Must_inspect_result_ _In_ WDFDEVICE _In_ PWDF_DEVICE_PROPERTY_DATA _In_ DEVPROPTYPE _In_ ULONG Size
Definition: wdfdevice.h:4533

Referenced by SHQueryRecycleBinA().

◆ SHUpdateRecycleBinIcon()

EXTERN_C HRESULT WINAPI SHUpdateRecycleBinIcon ( void  )

Definition at line 1082 of file CRecycleBin.cpp.

1083{
1084 FIXME("stub\n");
1085
1086 // HACK! This dwItem2 should be the icon index in the system image list that has changed.
1087 // FIXME: Call SHMapPIDLToSystemImageListIndex
1088 DWORD dwItem2 = -1;
1089
1091 return S_OK;
1092}
#define FIXME(fmt,...)
Definition: precomp.h:53
EXTERN_C void WINAPI SHChangeNotify(LONG wEventId, UINT uFlags, LPCVOID dwItem1, LPCVOID dwItem2)
#define SHCNE_UPDATEIMAGE
Definition: shlobj.h:1904
#define SHCNF_DWORD
Definition: shlobj.h:1923

Referenced by SHFileOperationW().

◆ TRASH_CanTrashFile()

BOOL TRASH_CanTrashFile ( LPCWSTR  wszPath)

Tests whether a file can be trashed

Parameters
wszPathPath to the file to be trash
Returns
TRUE if the file can be trashed, FALSE otherwise

Definition at line 937 of file CRecycleBin.cpp.

938{
939 LONG ret;
940 DWORD dwNukeOnDelete, dwType, VolSerialNumber, MaxComponentLength;
941 DWORD FileSystemFlags, dwSize, dwDisposition;
942 HKEY hKey;
943 WCHAR szBuffer[10];
944 WCHAR szKey[150] = L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\BitBucket\\Volume\\";
945
946 if (wszPath[1] != L':')
947 {
948 /* path is UNC */
949 return FALSE;
950 }
951
952 // Copy and retrieve the root path from get given string
953 WCHAR wszRootPathName[MAX_PATH];
954 StringCbCopyW(wszRootPathName, sizeof(wszRootPathName), wszPath);
955 PathStripToRootW(wszRootPathName);
956
957 // Test to see if the drive is fixed (non removable)
958 if (GetDriveTypeW(wszRootPathName) != DRIVE_FIXED)
959 {
960 /* no bitbucket on removable media */
961 return FALSE;
962 }
963
964 if (!GetVolumeInformationW(wszRootPathName, NULL, 0, &VolSerialNumber, &MaxComponentLength, &FileSystemFlags, NULL, 0))
965 {
966 ERR("GetVolumeInformationW failed with %u wszRootPathName=%s\n", GetLastError(), debugstr_w(wszRootPathName));
967 return FALSE;
968 }
969
970 swprintf(szBuffer, L"%04X-%04X", LOWORD(VolSerialNumber), HIWORD(VolSerialNumber));
971 wcscat(szKey, szBuffer);
972
973 if (RegCreateKeyExW(HKEY_CURRENT_USER, szKey, 0, NULL, 0, KEY_WRITE, NULL, &hKey, &dwDisposition) != ERROR_SUCCESS)
974 {
975 ERR("RegCreateKeyExW failed\n");
976 return FALSE;
977 }
978
979 if (dwDisposition & REG_CREATED_NEW_KEY)
980 {
981 /* per default move to bitbucket */
982 dwNukeOnDelete = 0;
983 RegSetValueExW(hKey, L"NukeOnDelete", 0, REG_DWORD, (LPBYTE)&dwNukeOnDelete, sizeof(DWORD));
984 /* per default unlimited size */
985 dwSize = -1;
986 RegSetValueExW(hKey, L"MaxCapacity", 0, REG_DWORD, (LPBYTE)&dwSize, sizeof(DWORD));
988 return TRUE;
989 }
990 else
991 {
992 dwSize = sizeof(dwNukeOnDelete);
993 ret = RegQueryValueExW(hKey, L"NukeOnDelete", NULL, &dwType, (LPBYTE)&dwNukeOnDelete, &dwSize);
994 if (ret != ERROR_SUCCESS)
995 {
997 {
998 /* restore key and enable bitbucket */
999 dwNukeOnDelete = 0;
1000 RegSetValueExW(hKey, L"NukeOnDelete", 0, REG_DWORD, (LPBYTE)&dwNukeOnDelete, sizeof(DWORD));
1001 }
1003 return TRUE;
1004 }
1005 else if (dwNukeOnDelete)
1006 {
1007 /* do not delete to bitbucket */
1009 return FALSE;
1010 }
1011 /* FIXME
1012 * check if bitbucket is full
1013 */
1015 return TRUE;
1016 }
1017}
#define RegCloseKey(hKey)
Definition: registry.h:49
#define ERROR_SUCCESS
Definition: deptool.c:10
LONG WINAPI RegCreateKeyExW(_In_ HKEY hKey, _In_ LPCWSTR lpSubKey, _In_ DWORD Reserved, _In_opt_ LPWSTR lpClass, _In_ DWORD dwOptions, _In_ REGSAM samDesired, _In_opt_ LPSECURITY_ATTRIBUTES lpSecurityAttributes, _Out_ PHKEY phkResult, _Out_opt_ LPDWORD lpdwDisposition)
Definition: reg.c:1096
LONG WINAPI RegSetValueExW(_In_ HKEY hKey, _In_ LPCWSTR lpValueName, _In_ DWORD Reserved, _In_ DWORD dwType, _In_ CONST BYTE *lpData, _In_ DWORD cbData)
Definition: reg.c:4882
LONG WINAPI RegQueryValueExW(_In_ HKEY hkeyorg, _In_ LPCWSTR name, _In_ LPDWORD reserved, _In_ LPDWORD type, _In_ LPBYTE data, _In_ LPDWORD count)
Definition: reg.c:4103
UINT WINAPI GetDriveTypeW(IN LPCWSTR lpRootPathName)
Definition: disk.c:497
BOOL WINAPI GetVolumeInformationW(IN LPCWSTR lpRootPathName, IN LPWSTR lpVolumeNameBuffer, IN DWORD nVolumeNameSize, OUT LPDWORD lpVolumeSerialNumber OPTIONAL, OUT LPDWORD lpMaximumComponentLength OPTIONAL, OUT LPDWORD lpFileSystemFlags OPTIONAL, OUT LPWSTR lpFileSystemNameBuffer OPTIONAL, IN DWORD nFileSystemNameSize)
Definition: volume.c:226
BOOL WINAPI PathStripToRootW(LPWSTR lpszPath)
Definition: path.c:733
#define swprintf
Definition: precomp.h:40
FxAutoRegKey hKey
#define ERROR_FILE_NOT_FOUND
Definition: disk.h:79
#define REG_CREATED_NEW_KEY
Definition: nt_native.h:1084
#define KEY_WRITE
Definition: nt_native.h:1031
#define LOWORD(l)
Definition: pedump.c:82
#define REG_DWORD
Definition: sdbapi.c:596
_CRTIMP wchar_t *__cdecl wcscat(_Inout_updates_z_(_String_length_(_Dest)+_String_length_(_Source)+1) wchar_t *_Dest, _In_z_ const wchar_t *_Source)
STRSAFEAPI StringCbCopyW(STRSAFE_LPWSTR pszDest, size_t cbDest, STRSAFE_LPCWSTR pszSrc)
Definition: strsafe.h:166
unsigned char * LPBYTE
Definition: typedefs.h:53
#define HIWORD(l)
Definition: typedefs.h:247
#define DRIVE_FIXED
Definition: winbase.h:252
#define HKEY_CURRENT_USER
Definition: winreg.h:11

Referenced by delete_files().

◆ TRASH_PlayEmptyRecycleBinSound()

static void TRASH_PlayEmptyRecycleBinSound ( )
static

Definition at line 1026 of file CRecycleBin.cpp.

1027{
1028 CRegKey regKey;
1029 CHeapPtr<WCHAR> pszValue;
1030 CHeapPtr<WCHAR> pszSndPath;
1031 DWORD dwType, dwSize;
1032 LONG lError;
1033
1034 lError = regKey.Open(HKEY_CURRENT_USER,
1035 L"AppEvents\\Schemes\\Apps\\Explorer\\EmptyRecycleBin\\.Current",
1036 KEY_READ);
1037 if (lError != ERROR_SUCCESS)
1038 return;
1039
1040 lError = regKey.QueryValue(NULL, &dwType, NULL, &dwSize);
1041 if (lError != ERROR_SUCCESS)
1042 return;
1043
1044 if (!pszValue.AllocateBytes(dwSize))
1045 return;
1046
1047 lError = regKey.QueryValue(NULL, &dwType, pszValue, &dwSize);
1048 if (lError != ERROR_SUCCESS)
1049 return;
1050
1051 if (dwType == REG_EXPAND_SZ)
1052 {
1053 dwSize = ExpandEnvironmentStringsW(pszValue, NULL, 0);
1054 if (dwSize == 0)
1055 return;
1056
1057 if (!pszSndPath.Allocate(dwSize))
1058 return;
1059
1060 if (ExpandEnvironmentStringsW(pszValue, pszSndPath, dwSize) == 0)
1061 return;
1062 }
1063 else if (dwType == REG_SZ)
1064 {
1065 /* The type is REG_SZ, no need to expand */
1066 pszSndPath.Attach(pszValue.Detach());
1067 }
1068 else
1069 {
1070 /* Invalid type */
1071 return;
1072 }
1073
1075}
bool AllocateBytes(_In_ size_t nBytes)
Definition: atlalloc.h:127
T * Detach()
Definition: atlalloc.h:168
bool Allocate(_In_ size_t nElements=1)
Definition: atlalloc.h:143
void Attach(T *lp)
Definition: atlalloc.h:162
DWORD WINAPI ExpandEnvironmentStringsW(IN LPCWSTR lpSrc, IN LPWSTR lpDst, IN DWORD nSize)
Definition: environ.c:519
#define REG_SZ
Definition: layer.c:22
#define SND_FILENAME
Definition: mmsystem.h:162
#define SND_ASYNC
Definition: mmsystem.h:154
#define SND_NODEFAULT
Definition: mmsystem.h:155
#define KEY_READ
Definition: nt_native.h:1023
#define REG_EXPAND_SZ
Definition: nt_native.h:1494
BOOL WINAPI PlaySoundW(LPCWSTR pszSoundW, HMODULE hmod, DWORD fdwSound)
Definition: playsound.c:653

Referenced by SHEmptyRecycleBinW().

◆ TRASH_TrashFile()

BOOL TRASH_TrashFile ( LPCWSTR  wszPath)

Definition at line 1020 of file CRecycleBin.cpp.

1021{
1022 TRACE("(%s)\n", debugstr_w(wszPath));
1023 return DeleteFileToRecycleBin(wszPath);
1024}
#define DeleteFileToRecycleBin
Definition: recyclebin.h:85

Referenced by delete_files().

◆ UnpackDetailsFromPidl()

PDELETED_FILE_DETAILS_W UnpackDetailsFromPidl ( LPCITEMIDLIST  pidl)

Definition at line 511 of file CRecycleBin.cpp.

512{
513 return (PDELETED_FILE_DETAILS_W)&pidl->mkid.abID;
514}

◆ WINE_DEFAULT_DEBUG_CHANNEL()

WINE_DEFAULT_DEBUG_CHANNEL ( CRecycleBin  )

Variable Documentation

◆ RecycleBinColumns

const columninfo RecycleBinColumns[]
static
Initial value:
=
{
}
#define IDS_SHV_COLUMN_TYPE
Definition: resource.h:75
#define IDS_SHV_COLUMN_NAME
Definition: resource.h:74
#define PID_STG_STORAGETYPE
Definition: ntquery.h:50
#define PID_STG_WRITETIME
Definition: ntquery.h:60
#define PID_STG_SIZE
Definition: ntquery.h:58
#define PID_STG_NAME
Definition: ntquery.h:56
#define LVCFMT_LEFT
Definition: commctrl.h:2598
#define LVCFMT_RIGHT
Definition: commctrl.h:2599
#define PID_DISPLACED_FROM
Definition: shlguid.h:181
#define PID_DISPLACED_DATE
Definition: shlguid.h:182
#define IDS_SHV_COLUMN_DELFROM
Definition: shresdef.h:60
#define IDS_SHV_COLUMN_SIZE
Definition: shresdef.h:52
#define IDS_SHV_COLUMN_MODIFIED
Definition: shresdef.h:54
#define IDS_SHV_COLUMN_DELDATE
Definition: shresdef.h:61
@ SHCOLSTATE_TYPE_INT
Definition: shtypes.idl:122
@ SHCOLSTATE_TYPE_DATE
Definition: shtypes.idl:123
@ SHCOLSTATE_TYPE_STR
Definition: shtypes.idl:121
@ SHCOLSTATE_ONBYDEFAULT
Definition: shtypes.idl:125

Definition at line 40 of file CRecycleBin.cpp.

Referenced by CRecycleBin::GetDefaultColumnState(), CRecycleBin::GetDetailsOf(), and CRecycleBin::MapColumnToSCID().