ReactOS  0.4.15-dev-5122-g72bdbdd
recyclebin.c
Go to the documentation of this file.
1 /*
2  * PROJECT: Recycle bin management
3  * LICENSE: GPL v2 - See COPYING in the top level directory
4  * FILE: lib/recyclebin/recyclebin.c
5  * PURPOSE: Public interface
6  * PROGRAMMERS: Copyright 2006-2007 HervĂ© Poussineau (hpoussin@reactos.org)
7  */
8 
9 #include "recyclebin_private.h"
10 
13  IN HANDLE hDeletedFile)
14 {
15  IRecycleBinFile *rbf = (IRecycleBinFile *)hDeletedFile;
16  HRESULT hr;
17 
18  TRACE("(%p)\n", hDeletedFile);
19 
20  hr = IRecycleBinFile_Release(rbf);
21  if (SUCCEEDED(hr))
22  return TRUE;
25  else
27  return FALSE;
28 }
29 
33 {
34  int len;
35  LPWSTR FileNameW = NULL;
36  BOOL ret = FALSE;
37 
38  TRACE("(%s)\n", debugstr_a(FileName));
39 
40  /* Check parameters */
41  if (FileName == NULL)
42  {
44  goto cleanup;
45  }
46 
48  if (len == 0)
49  goto cleanup;
50  FileNameW = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR));
51  if (!FileNameW)
52  {
54  goto cleanup;
55  }
56  if (MultiByteToWideChar(CP_ACP, 0, FileName, -1, FileNameW, len) == 0)
57  goto cleanup;
58 
59  ret = DeleteFileToRecycleBinW(FileNameW);
60 
61 cleanup:
62  HeapFree(GetProcessHeap(), 0, FileNameW);
63  return ret;
64 }
65 
69 {
70  IRecycleBin *prb;
71  HRESULT hr;
72 
73  TRACE("(%s)\n", debugstr_w(FileName));
74 
75  hr = GetDefaultRecycleBin(NULL, &prb);
76  if (!SUCCEEDED(hr))
77  goto cleanup;
78 
79  hr = IRecycleBin_DeleteFile(prb, FileName);
80  IRecycleBin_Release(prb);
81 
82 cleanup:
83  if (SUCCEEDED(hr))
84  return TRUE;
87  else
89  return FALSE;
90 }
91 
94  IN HANDLE hDeletedFile)
95 {
96  IRecycleBinFile *rbf = (IRecycleBinFile *)hDeletedFile;
97  HRESULT hr;
98 
99  TRACE("(%p)\n", hDeletedFile);
100 
101  hr = IRecycleBinFile_Delete(rbf);
102 
103  if (SUCCEEDED(hr))
104  return TRUE;
107  else
109  return FALSE;
110 }
111 
112 BOOL WINAPI
114  IN LPCSTR pszRoot OPTIONAL)
115 {
116  int len;
117  LPWSTR szRootW = NULL;
118  BOOL ret = FALSE;
119 
120  TRACE("(%s)\n", debugstr_a(pszRoot));
121 
122  if (pszRoot)
123  {
124  len = MultiByteToWideChar(CP_ACP, 0, pszRoot, -1, NULL, 0);
125  if (len == 0)
126  goto cleanup;
127  szRootW = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR));
128  if (!szRootW)
129  {
131  goto cleanup;
132  }
133  if (MultiByteToWideChar(CP_ACP, 0, pszRoot, -1, szRootW, len) == 0)
134  goto cleanup;
135  }
136 
137  ret = EmptyRecycleBinW(szRootW);
138 
139 cleanup:
140  HeapFree(GetProcessHeap(), 0, szRootW);
141  return ret;
142 }
143 
144 BOOL WINAPI
146  IN LPCWSTR pszRoot OPTIONAL)
147 {
148  IRecycleBin *prb;
149  HRESULT hr;
150 
151  TRACE("(%s)\n", debugstr_w(pszRoot));
152 
153  hr = GetDefaultRecycleBin(pszRoot, &prb);
154  if (!SUCCEEDED(hr))
155  goto cleanup;
156 
157  hr = IRecycleBin_EmptyRecycleBin(prb);
158  IRecycleBin_Release(prb);
159 
160 cleanup:
161  if (SUCCEEDED(hr))
162  return TRUE;
165  else
167  return FALSE;
168 }
169 
170 BOOL WINAPI
172  IN LPCSTR pszRoot OPTIONAL,
175 {
176  int len;
177  LPWSTR szRootW = NULL;
178  BOOL ret = FALSE;
179 
180  TRACE("(%s, %p, %p)\n", debugstr_a(pszRoot), pFnCallback, Context);
181 
182  if (pszRoot)
183  {
184  len = MultiByteToWideChar(CP_ACP, 0, pszRoot, -1, NULL, 0);
185  if (len == 0)
186  goto cleanup;
187  szRootW = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR));
188  if (!szRootW)
189  {
191  goto cleanup;
192  }
193  if (MultiByteToWideChar(CP_ACP, 0, pszRoot, -1, szRootW, len) == 0)
194  goto cleanup;
195  }
196 
197  ret = EnumerateRecycleBinW(szRootW, pFnCallback, Context);
198 
199 cleanup:
200  HeapFree(GetProcessHeap(), 0, szRootW);
201  return ret;
202 }
203 
204 BOOL WINAPI
206  IN LPCWSTR pszRoot OPTIONAL,
209 {
210  IRecycleBin *prb = NULL;
211  IRecycleBinEnumList *prbel = NULL;
212  IRecycleBinFile *prbf;
213  HRESULT hr;
214 
215  TRACE("(%s, %p, %p)\n", debugstr_w(pszRoot), pFnCallback, Context);
216 
217  hr = GetDefaultRecycleBin(NULL, &prb);
218  if (!SUCCEEDED(hr))
219  goto cleanup;
220 
221  hr = IRecycleBin_EnumObjects(prb, &prbel);
222  if (!SUCCEEDED(hr))
223  goto cleanup;
224  while (TRUE)
225  {
226  hr = IRecycleBinEnumList_Next(prbel, 1, &prbf, NULL);
227  if (hr == S_FALSE)
228  {
229  hr = S_OK;
230  goto cleanup;
231  }
232  else if (!SUCCEEDED(hr))
233  goto cleanup;
234  if (!pFnCallback(Context, (HANDLE)prbf))
235  {
237  goto cleanup;
238  }
239  }
240 
241 cleanup:
242  if (prb)
243  IRecycleBin_Release(prb);
244  if (prbel)
245  IRecycleBinEnumList_Release(prbel);
246  if (SUCCEEDED(hr))
247  return TRUE;
250  else
252  return FALSE;
253 }
254 
255 BOOL WINAPI
257  IN HANDLE hDeletedFile,
258  OUT LPWSTR pTypeName,
261 {
262  IRecycleBinFile *prbf = (IRecycleBinFile *)hDeletedFile;
263  SIZE_T FinalSize;
264 
265  HRESULT hr = IRecycleBinFile_GetTypeName(prbf, BufferSize, pTypeName, &FinalSize);
266 
267  if (SUCCEEDED(hr))
268  {
269  if (RequiredSize)
270  *RequiredSize = (DWORD)FinalSize;
271 
272  return TRUE;
273  }
276  else
278  return FALSE;
279 }
280 
281 BOOL WINAPI
283  IN HANDLE hDeletedFile,
287 {
288  PDELETED_FILE_DETAILS_W FileDetailsW = NULL;
289  DWORD BufferSizeW = 0;
290  BOOL ret = FALSE;
291 
292  TRACE("(%p, %lu, %p, %p)\n", hDeletedFile, BufferSize, FileDetails, RequiredSize);
293 
295  {
298  }
299  if (FileDetails && BufferSizeW)
300  {
301  FileDetailsW = HeapAlloc(GetProcessHeap(), 0, BufferSizeW);
302  if (!FileDetailsW)
303  {
305  goto cleanup;
306  }
307  }
308 
309  ret = GetDeletedFileDetailsW(hDeletedFile, BufferSizeW, FileDetailsW, RequiredSize);
310  if (!ret)
311  goto cleanup;
312 
313  if (FileDetails)
314  {
315  CopyMemory(FileDetails, FileDetailsW, FIELD_OFFSET(DELETED_FILE_DETAILS_A, FileName));
316  if (0 == WideCharToMultiByte(CP_ACP, 0, FileDetailsW->FileName, -1, FileDetails->FileName, BufferSize - FIELD_OFFSET(DELETED_FILE_DETAILS_A, FileName), NULL, NULL))
317  goto cleanup;
318  }
319  ret = TRUE;
320 
321 cleanup:
322  HeapFree(GetProcessHeap(), 0, FileDetailsW);
323  return ret;
324 }
325 
326 BOOL WINAPI
328  IN HANDLE hDeletedFile,
332 {
333  IRecycleBinFile *rbf = (IRecycleBinFile *)hDeletedFile;
334  HRESULT hr;
335  SIZE_T NameSize, Needed;
336 
337  TRACE("(%p, %lu, %p, %p)\n", hDeletedFile, BufferSize, FileDetails, RequiredSize);
338 
339  hr = IRecycleBinFile_GetFileName(rbf, 0, NULL, &NameSize);
340  if (!SUCCEEDED(hr))
341  goto cleanup;
342  Needed = FIELD_OFFSET(DELETED_FILE_DETAILS_W, FileName) + NameSize;
343  if (RequiredSize)
344  *RequiredSize = (DWORD)Needed;
345  if (Needed > BufferSize)
346  {
348  goto cleanup;
349  }
350  hr = IRecycleBinFile_GetFileName(rbf, NameSize, FileDetails->FileName, NULL);
351  if (!SUCCEEDED(hr))
352  goto cleanup;
353  hr = IRecycleBinFile_GetLastModificationTime(rbf, &FileDetails->LastModification);
354  if (!SUCCEEDED(hr))
355  goto cleanup;
356  hr = IRecycleBinFile_GetDeletionTime(rbf, &FileDetails->DeletionTime);
357  if (!SUCCEEDED(hr))
358  goto cleanup;
359  hr = IRecycleBinFile_GetFileSize(rbf, &FileDetails->FileSize);
360  if (!SUCCEEDED(hr))
361  goto cleanup;
362  hr = IRecycleBinFile_GetPhysicalFileSize(rbf, &FileDetails->PhysicalFileSize);
363  if (!SUCCEEDED(hr))
364  goto cleanup;
365  hr = IRecycleBinFile_GetAttributes(rbf, &FileDetails->Attributes);
366  if (!SUCCEEDED(hr))
367  goto cleanup;
368 
369 cleanup:
370  if (SUCCEEDED(hr))
371  return TRUE;
374  else
376  return FALSE;
377 }
378 
379 BOOL WINAPI
381  IN LPCWSTR pszVolume OPTIONAL,
382  OUT ULARGE_INTEGER *pulTotalItems,
383  OUT ULARGE_INTEGER *pulTotalSize)
384 {
385  pulTotalItems->QuadPart = 0;
386  pulTotalSize->QuadPart = 0;
388  return FALSE;
389 }
390 
391 BOOL WINAPI
393  IN HANDLE hDeletedFile)
394 {
395  IRecycleBinFile *rbf = (IRecycleBinFile *)hDeletedFile;
396  HRESULT hr;
397 
398  TRACE("(%p)\n", hDeletedFile);
399 
400  hr = IRecycleBinFile_Restore(rbf);
401  if (SUCCEEDED(hr))
402  return TRUE;
405  else
407  return FALSE;
408 }
409 
412  IN LPCWSTR pszVolume OPTIONAL,
413  OUT IRecycleBin **pprb)
414 {
415  IUnknown *pUnk;
416  HRESULT hr;
417 
418  TRACE("(%s, %p)\n", debugstr_w(pszVolume), pprb);
419 
420  if (!pprb)
421  return E_POINTER;
422 
423  if (!pszVolume)
425  else
426  {
427  /* FIXME: do a better validation! */
428  if (wcslen(pszVolume) != 3 || pszVolume[1] != ':' || pszVolume[2] != '\\')
430 
431  /* For now, only support this type of recycle bins... */
432  hr = RecycleBin5_Constructor(pszVolume, &pUnk);
433  }
434  if (!SUCCEEDED(hr))
435  return hr;
436  hr = IUnknown_QueryInterface(pUnk, &IID_IRecycleBin, (void **)pprb);
437  IUnknown_Release(pUnk);
438  return hr;
439 }
#define ERROR_INVALID_PARAMETER
Definition: compat.h:101
#define IN
Definition: typedefs.h:39
EXTERN_C const IID IID_IRecycleBin
Definition: recyclebin.h:254
#define HRESULT_FROM_WIN32(x)
Definition: winerror.h:92
#define WideCharToMultiByte
Definition: compat.h:111
HRESULT hr
Definition: shlfolder.c:183
const WCHAR * LPCWSTR
Definition: xmlstorage.h:185
#define TRUE
Definition: types.h:120
#define CP_ACP
Definition: compat.h:109
HRESULT WINAPI GetDefaultRecycleBin(IN LPCWSTR pszVolume OPTIONAL, OUT IRecycleBin **pprb)
Definition: recyclebin.c:411
HRESULT RecycleBinGeneric_Constructor(OUT IUnknown **ppUnknown)
#define ERROR_NOT_ENOUGH_MEMORY
Definition: dderror.h:7
DWORD WINAPI GetLastError(VOID)
Definition: except.c:1040
BOOL WINAPI DeleteFileToRecycleBinW(IN LPCWSTR FileName)
Definition: recyclebin.c:67
BOOL WINAPI DeleteFileToRecycleBinA(IN LPCSTR FileName)
Definition: recyclebin.c:31
#define DWORD
Definition: nt_native.h:44
BOOL WINAPI GetDeletedFileDetailsW(IN HANDLE hDeletedFile, IN DWORD BufferSize, IN OUT PDELETED_FILE_DETAILS_W FileDetails OPTIONAL, OUT LPDWORD RequiredSize OPTIONAL)
Definition: recyclebin.c:327
BOOL WINAPI DeleteFileHandleToRecycleBin(IN HANDLE hDeletedFile)
Definition: recyclebin.c:93
BOOL(WINAPI * PENUMERATE_RECYCLEBIN_CALLBACK)(IN PVOID Context, IN HANDLE hDeletedFile)
Definition: recyclebin.h:58
#define FALSE
Definition: types.h:117
unsigned int BOOL
Definition: ntddk_ex.h:94
#define HRESULT_FACILITY(hr)
Definition: winerror.h:79
BOOL WINAPI EmptyRecycleBinA(IN LPCSTR pszRoot OPTIONAL)
Definition: recyclebin.c:113
if SUCCEEDED(hr)
#define debugstr_w
Definition: kernel32.h:32
#define S_FALSE
Definition: winerror.h:2357
const char * LPCSTR
Definition: xmlstorage.h:183
WCHAR FileName[ANY_SIZE]
Definition: recyclebin.h:40
BOOL WINAPI CloseRecycleBinHandle(IN HANDLE hDeletedFile)
Definition: recyclebin.c:12
#define TRACE(s)
Definition: solgame.cpp:4
#define GetProcessHeap()
Definition: compat.h:595
PVOID WINAPI HeapAlloc(HANDLE, DWORD, SIZE_T)
__wchar_t WCHAR
Definition: xmlstorage.h:180
#define debugstr_a
Definition: kernel32.h:31
LONG HRESULT
Definition: typedefs.h:79
#define WINAPI
Definition: msvc.h:6
BOOL WINAPI RestoreFile(IN HANDLE hDeletedFile)
Definition: recyclebin.c:392
#define CopyMemory
Definition: winbase.h:1665
unsigned long DWORD
Definition: ntddk_ex.h:95
HRESULT RecycleBin5_Constructor(IN LPCWSTR VolumePath, OUT IUnknown **ppUnknown)
#define SetLastError(x)
Definition: compat.h:611
int ret
BOOL WINAPI GetDeletedFileTypeNameW(IN HANDLE hDeletedFile, OUT LPWSTR pTypeName, IN DWORD BufferSize, OUT LPDWORD RequiredSize OPTIONAL)
Definition: recyclebin.c:256
BOOL WINAPI EmptyRecycleBinW(IN LPCWSTR pszRoot OPTIONAL)
Definition: recyclebin.c:145
GLenum GLsizei len
Definition: glext.h:6722
BOOL WINAPI EnumerateRecycleBinW(IN LPCWSTR pszRoot OPTIONAL, IN PENUMERATE_RECYCLEBIN_CALLBACK pFnCallback, IN PVOID Context OPTIONAL)
Definition: recyclebin.c:205
#define FACILITY_WIN32
Definition: winerror.h:27
ULONG_PTR SIZE_T
Definition: typedefs.h:80
#define S_OK
Definition: intsafe.h:52
BOOL WINAPI EnumerateRecycleBinA(IN LPCSTR pszRoot OPTIONAL, IN PENUMERATE_RECYCLEBIN_CALLBACK pFnCallback, IN PVOID Context OPTIONAL)
Definition: recyclebin.c:171
#define FIELD_OFFSET(t, f)
Definition: typedefs.h:255
#define NULL
Definition: types.h:112
BOOL WINAPI GetDeletedFileDetailsA(IN HANDLE hDeletedFile, IN DWORD BufferSize, IN OUT PDELETED_FILE_DETAILS_A FileDetails OPTIONAL, OUT LPDWORD RequiredSize OPTIONAL)
Definition: recyclebin.c:282
_CRTIMP size_t __cdecl wcslen(_In_z_ const wchar_t *_Str)
#define MultiByteToWideChar
Definition: compat.h:110
#define HRESULT_CODE(hr)
Definition: winerror.h:76
#define OUT
Definition: typedefs.h:40
uint32_t * LPDWORD
Definition: typedefs.h:59
#define ERROR_CALL_NOT_IMPLEMENTED
Definition: compat.h:102
char * cleanup(char *str)
Definition: wpickclick.c:99
#define ERROR_INVALID_NAME
Definition: compat.h:103
BOOL WINAPI GetRecycleBinDetails(IN LPCWSTR pszVolume OPTIONAL, OUT ULARGE_INTEGER *pulTotalItems, OUT ULARGE_INTEGER *pulTotalSize)
Definition: recyclebin.c:380
_Must_inspect_result_ _In_ WDFDEVICE _In_ PWDF_DEVICE_PROPERTY_DATA _In_ ULONG _Out_ PVOID _Out_ PULONG RequiredSize
Definition: wdfdevice.h:4431
#define ERROR_GEN_FAILURE
Definition: winerror.h:134
WCHAR * LPWSTR
Definition: xmlstorage.h:184
#define E_POINTER
Definition: winerror.h:2365
static void *static void *static LPDIRECTPLAY IUnknown * pUnk
Definition: dplayx.c:30
#define HeapFree(x, y, z)
Definition: compat.h:594
_In_ WDFMEMORY _Out_opt_ size_t * BufferSize
Definition: wdfmemory.h:251
#define ERROR_INSUFFICIENT_BUFFER
Definition: dderror.h:10
PULONG MinorVersion OPTIONAL
Definition: CrossNt.h:68