ReactOS  0.4.15-dev-1201-gb2cf5a4
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,
261 {
262  PDELETED_FILE_DETAILS_W FileDetailsW = NULL;
263  DWORD BufferSizeW = 0;
264  BOOL ret = FALSE;
265 
266  TRACE("(%p, %lu, %p, %p)\n", hDeletedFile, BufferSize, FileDetails, RequiredSize);
267 
269  {
272  }
273  if (FileDetails && BufferSizeW)
274  {
275  FileDetailsW = HeapAlloc(GetProcessHeap(), 0, BufferSizeW);
276  if (!FileDetailsW)
277  {
279  goto cleanup;
280  }
281  }
282 
283  ret = GetDeletedFileDetailsW(hDeletedFile, BufferSizeW, FileDetailsW, RequiredSize);
284  if (!ret)
285  goto cleanup;
286 
287  if (FileDetails)
288  {
289  CopyMemory(FileDetails, FileDetailsW, FIELD_OFFSET(DELETED_FILE_DETAILS_A, FileName));
290  if (0 == WideCharToMultiByte(CP_ACP, 0, FileDetailsW->FileName, -1, FileDetails->FileName, BufferSize - FIELD_OFFSET(DELETED_FILE_DETAILS_A, FileName), NULL, NULL))
291  goto cleanup;
292  }
293  ret = TRUE;
294 
295 cleanup:
296  HeapFree(GetProcessHeap(), 0, FileDetailsW);
297  return ret;
298 }
299 
300 BOOL WINAPI
302  IN HANDLE hDeletedFile,
306 {
307  IRecycleBinFile *rbf = (IRecycleBinFile *)hDeletedFile;
308  HRESULT hr;
309  SIZE_T NameSize, Needed;
310 
311  TRACE("(%p, %lu, %p, %p)\n", hDeletedFile, BufferSize, FileDetails, RequiredSize);
312 
313  hr = IRecycleBinFile_GetFileName(rbf, 0, NULL, &NameSize);
314  if (!SUCCEEDED(hr))
315  goto cleanup;
316  Needed = FIELD_OFFSET(DELETED_FILE_DETAILS_W, FileName) + NameSize;
317  if (RequiredSize)
318  *RequiredSize = (DWORD)Needed;
319  if (Needed > BufferSize)
320  {
322  goto cleanup;
323  }
324  hr = IRecycleBinFile_GetFileName(rbf, NameSize, FileDetails->FileName, NULL);
325  if (!SUCCEEDED(hr))
326  goto cleanup;
327  hr = IRecycleBinFile_GetLastModificationTime(rbf, &FileDetails->LastModification);
328  if (!SUCCEEDED(hr))
329  goto cleanup;
330  hr = IRecycleBinFile_GetDeletionTime(rbf, &FileDetails->DeletionTime);
331  if (!SUCCEEDED(hr))
332  goto cleanup;
333  hr = IRecycleBinFile_GetFileSize(rbf, &FileDetails->FileSize);
334  if (!SUCCEEDED(hr))
335  goto cleanup;
336  hr = IRecycleBinFile_GetPhysicalFileSize(rbf, &FileDetails->PhysicalFileSize);
337  if (!SUCCEEDED(hr))
338  goto cleanup;
339  hr = IRecycleBinFile_GetAttributes(rbf, &FileDetails->Attributes);
340  if (!SUCCEEDED(hr))
341  goto cleanup;
342 
343 cleanup:
344  if (SUCCEEDED(hr))
345  return TRUE;
348  else
350  return FALSE;
351 }
352 
353 BOOL WINAPI
355  IN LPCWSTR pszVolume OPTIONAL,
356  OUT ULARGE_INTEGER *pulTotalItems,
357  OUT ULARGE_INTEGER *pulTotalSize)
358 {
359  pulTotalItems->QuadPart = 0;
360  pulTotalSize->QuadPart = 0;
362  return FALSE;
363 }
364 
365 BOOL WINAPI
367  IN HANDLE hDeletedFile)
368 {
369  IRecycleBinFile *rbf = (IRecycleBinFile *)hDeletedFile;
370  HRESULT hr;
371 
372  TRACE("(%p)\n", hDeletedFile);
373 
374  hr = IRecycleBinFile_Restore(rbf);
375  if (SUCCEEDED(hr))
376  return TRUE;
379  else
381  return FALSE;
382 }
383 
386  IN LPCWSTR pszVolume OPTIONAL,
387  OUT IRecycleBin **pprb)
388 {
389  IUnknown *pUnk;
390  HRESULT hr;
391 
392  TRACE("(%s, %p)\n", debugstr_w(pszVolume), pprb);
393 
394  if (!pprb)
395  return E_POINTER;
396 
397  if (!pszVolume)
399  else
400  {
401  /* FIXME: do a better validation! */
402  if (wcslen(pszVolume) != 3 || pszVolume[1] != ':' || pszVolume[2] != '\\')
404 
405  /* For now, only support this type of recycle bins... */
406  hr = RecycleBin5_Constructor(pszVolume, &pUnk);
407  }
408  if (!SUCCEEDED(hr))
409  return hr;
410  hr = IUnknown_QueryInterface(pUnk, &IID_IRecycleBin, (void **)pprb);
411  IUnknown_Release(pUnk);
412  return hr;
413 }
#define ERROR_INVALID_PARAMETER
Definition: compat.h:101
#define IN
Definition: typedefs.h:39
EXTERN_C const IID IID_IRecycleBin
Definition: recyclebin.h:249
#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:385
HRESULT RecycleBinGeneric_Constructor(OUT IUnknown **ppUnknown)
#define ERROR_NOT_ENOUGH_MEMORY
Definition: dderror.h:7
DWORD WINAPI GetLastError(VOID)
Definition: except.c:1044
_Inout_ PRTL_BUFFER _In_ SIZE_T RequiredSize
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:301
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
#define debugstr_w
Definition: kernel32.h:32
#define S_FALSE
Definition: winerror.h:2357
smooth NULL
Definition: ftsmooth.c:416
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:366
#define CopyMemory
Definition: winbase.h:1646
#define BufferSize
Definition: mmc.h:75
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 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:51
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
BOOL WINAPI GetDeletedFileDetailsA(IN HANDLE hDeletedFile, IN DWORD BufferSize, IN OUT PDELETED_FILE_DETAILS_A FileDetails OPTIONAL, OUT LPDWORD RequiredSize OPTIONAL)
Definition: recyclebin.c:256
#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:354
#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
size_t __cdecl wcslen(_In_z_ const wchar_t *_Str)
#define HeapFree(x, y, z)
Definition: compat.h:594
#define SUCCEEDED(hr)
Definition: intsafe.h:49
#define ERROR_INSUFFICIENT_BUFFER
Definition: dderror.h:10
PULONG MinorVersion OPTIONAL
Definition: CrossNt.h:68