ReactOS 0.4.17-dev-1196-gb6224c3
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
11
14 IN HDELFILE hDeletedFile)
15{
16 IRecycleBinFile *rbf = IRecycleBinFileFromHDELFILE(hDeletedFile);
17 HRESULT hr;
18
19 TRACE("(%p)\n", hDeletedFile);
20
21 hr = IRecycleBinFile_Release(rbf);
22 if (SUCCEEDED(hr))
23 return TRUE;
26 else
28 return FALSE;
29}
30
34{
35 int len;
36 LPWSTR FileNameW = NULL;
37 BOOL ret = FALSE;
38
39 TRACE("(%s)\n", debugstr_a(FileName));
40
41 /* Check parameters */
42 if (FileName == NULL)
43 {
45 goto cleanup;
46 }
47
49 if (len == 0)
50 goto cleanup;
51 FileNameW = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR));
52 if (!FileNameW)
53 {
55 goto cleanup;
56 }
57 if (MultiByteToWideChar(CP_ACP, 0, FileName, -1, FileNameW, len) == 0)
58 goto cleanup;
59
60 ret = DeleteFileToRecycleBinW(FileNameW);
61
63 HeapFree(GetProcessHeap(), 0, FileNameW);
64 return ret;
65}
66
70{
71 IRecycleBin *prb;
72 HRESULT hr;
73
74 TRACE("(%s)\n", debugstr_w(FileName));
75
77 if (!SUCCEEDED(hr))
78 goto cleanup;
79
80 hr = IRecycleBin_DeleteFile(prb, FileName);
81 IRecycleBin_Release(prb);
82
84 if (SUCCEEDED(hr))
85 return TRUE;
88 else
90 return FALSE;
91}
92
95 IN HDELFILE hDeletedFile)
96{
97 IRecycleBinFile *rbf = IRecycleBinFileFromHDELFILE(hDeletedFile);
98 HRESULT hr;
99
100 TRACE("(%p)\n", hDeletedFile);
101
102 hr = IRecycleBinFile_Delete(rbf);
103
104 if (SUCCEEDED(hr))
105 return TRUE;
108 else
110 return FALSE;
111}
112
115 IN LPCSTR pszRoot OPTIONAL)
116{
117 int len;
118 LPWSTR szRootW = NULL;
119 BOOL ret = FALSE;
120
121 TRACE("(%s)\n", debugstr_a(pszRoot));
122
123 if (pszRoot)
124 {
125 len = MultiByteToWideChar(CP_ACP, 0, pszRoot, -1, NULL, 0);
126 if (len == 0)
127 goto cleanup;
128 szRootW = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR));
129 if (!szRootW)
130 {
132 goto cleanup;
133 }
134 if (MultiByteToWideChar(CP_ACP, 0, pszRoot, -1, szRootW, len) == 0)
135 goto cleanup;
136 }
137
138 ret = EmptyRecycleBinW(szRootW);
139
140cleanup:
141 HeapFree(GetProcessHeap(), 0, szRootW);
142 return ret;
143}
144
147 IN LPCWSTR pszRoot OPTIONAL)
148{
149 IRecycleBin *prb;
150 HRESULT hr;
151
152 TRACE("(%s)\n", debugstr_w(pszRoot));
153
154 hr = GetDefaultRecycleBin(pszRoot, &prb);
155 if (!SUCCEEDED(hr))
156 goto cleanup;
157
158 hr = IRecycleBin_EmptyRecycleBin(prb);
159 IRecycleBin_Release(prb);
160
161cleanup:
162 if (SUCCEEDED(hr))
163 return TRUE;
166 else
168 return FALSE;
169}
170
173 IN LPCSTR pszRoot OPTIONAL,
176{
177 int len;
178 LPWSTR szRootW = NULL;
179 BOOL ret = FALSE;
180
181 TRACE("(%s, %p, %p)\n", debugstr_a(pszRoot), pFnCallback, Context);
182
183 if (pszRoot)
184 {
185 len = MultiByteToWideChar(CP_ACP, 0, pszRoot, -1, NULL, 0);
186 if (len == 0)
187 goto cleanup;
188 szRootW = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR));
189 if (!szRootW)
190 {
192 goto cleanup;
193 }
194 if (MultiByteToWideChar(CP_ACP, 0, pszRoot, -1, szRootW, len) == 0)
195 goto cleanup;
196 }
197
198 ret = EnumerateRecycleBinW(szRootW, pFnCallback, Context);
199
200cleanup:
201 HeapFree(GetProcessHeap(), 0, szRootW);
202 return ret;
203}
204
207 IN LPCWSTR pszRoot OPTIONAL,
210{
211 IRecycleBin *prb = NULL;
212 IRecycleBinEnumList *prbel = NULL;
213 IRecycleBinFile *prbf;
214 HRESULT hr;
215
216 TRACE("(%s, %p, %p)\n", debugstr_w(pszRoot), pFnCallback, Context);
217
219 if (!SUCCEEDED(hr))
220 goto cleanup;
221
222 hr = IRecycleBin_EnumObjects(prb, &prbel);
223 if (!SUCCEEDED(hr))
224 goto cleanup;
225 while (TRUE)
226 {
227 hr = IRecycleBinEnumList_Next(prbel, 1, &prbf, NULL);
228 if (hr == S_FALSE)
229 {
230 hr = S_OK;
231 goto cleanup;
232 }
233 else if (!SUCCEEDED(hr))
234 goto cleanup;
235 if (!pFnCallback(Context, (HDELFILE)prbf))
236 {
239 goto cleanup;
240 }
241 }
242
243cleanup:
244 if (prb)
245 IRecycleBin_Release(prb);
246 if (prbel)
247 IRecycleBinEnumList_Release(prbel);
248 if (SUCCEEDED(hr))
249 return TRUE;
252 else
254 return FALSE;
255}
256
257typedef struct _BBENUMFILECONTEXT
258{
260 HDELFILE hDelFile;
262
263static BOOL CALLBACK
265{
267 IRecycleBinFile *pRBF = IRecycleBinFileFromHDELFILE(hDeletedFile);
268 if (IRecycleBinFile_IsEqualIdentity(pRBF, pCtx->pFI) == S_OK)
269 {
270 pCtx->hDelFile = hDeletedFile;
271 return FALSE;
272 }
273 CloseRecycleBinHandle(hDeletedFile);
274 return TRUE;
275}
276
277EXTERN_C HDELFILE
279 IN LPCWSTR pszRoot OPTIONAL,
280 IN const RECYCLEBINFILEIDENTITY *pFI)
281{
282 BBENUMFILECONTEXT context = { pFI, NULL };
284 return context.hDelFile;
285}
286
289 IN const RECYCLEBINFILEIDENTITY *pFI)
290{
291 BOOL ret = FALSE;
292 HDELFILE hDelFile = GetRecycleBinFileHandle(NULL, pFI);
293 if (hDelFile)
294 {
295 IRecycleBinFile *rbf = IRecycleBinFileFromHDELFILE(hDelFile);
296 ret = SUCCEEDED(IRecycleBinFile_RemoveFromDatabase(rbf));
297 CloseRecycleBinHandle(hDelFile);
298 }
299 return ret;
300}
301
304 IN HDELFILE hDeletedFile)
305{
306 IRecycleBinFile *rbf = IRecycleBinFileFromHDELFILE(hDeletedFile);
307 HRESULT hr;
308
309 TRACE("(%p)\n", hDeletedFile);
310
311 hr = IRecycleBinFile_Restore(rbf);
312 if (SUCCEEDED(hr))
313 return TRUE;
316 else
318 return FALSE;
319}
320
323 IN LPCWSTR pszVolume OPTIONAL,
324 OUT IRecycleBin **pprb)
325{
326 IUnknown *pUnk;
327 HRESULT hr;
328
329 TRACE("(%s, %p)\n", debugstr_w(pszVolume), pprb);
330
331 if (!pprb)
332 return E_POINTER;
333
334 if (!pszVolume)
336 else
337 {
338 WCHAR szRootPath[4] = { *pszVolume, L':', L'\\', UNICODE_NULL };
339 int drive = PathGetDriveNumberW(pszVolume);
340 if (drive < 0 || pszVolume[2] != L'\\')
342
343 /* For now, only support this type of recycle bins... */
344 hr = RecycleBin5_Constructor(szRootPath, &pUnk);
345 }
346 if (!SUCCEEDED(hr))
347 return hr;
348 hr = IUnknown_QueryInterface(pUnk, &IID_IRecycleBin, (void **)pprb);
349 IUnknown_Release(pUnk);
350 return hr;
351}
352
355{
356 const WCHAR volume[] = { LOWORD('A' + Drive), ':', '\\', '\0' };
357 IRecycleBin *pRB;
359 if (SUCCEEDED(hr))
360 {
361 hr = IRecycleBin_GetDirectory(pRB, Path);
362 IRecycleBin_Release(pRB);
363 }
364 return hr;
365}
PRTL_UNICODE_STRING_BUFFER Path
PWCHAR Drive
Definition: chkdsk.c:73
#define EXTERN_C
Definition: basetyps.h:12
#define ERROR_NOT_ENOUGH_MEMORY
Definition: dderror.h:7
HRESULT hr
Definition: delayimp.cpp:582
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define GetProcessHeap()
Definition: compat.h:736
#define ERROR_INVALID_PARAMETER
Definition: compat.h:101
#define CP_ACP
Definition: compat.h:109
#define SetLastError(x)
Definition: compat.h:752
#define HeapAlloc
Definition: compat.h:733
#define HeapFree(x, y, z)
Definition: compat.h:735
#define CALLBACK
Definition: compat.h:35
#define MultiByteToWideChar
Definition: compat.h:110
#define ERROR_INVALID_NAME
Definition: compat.h:103
static void cleanup(void)
Definition: main.c:1335
static BOOL CALLBACK GetRecycleBinFileHandleCallback(IN PVOID Context, IN HDELFILE hDeletedFile)
Definition: recyclebin.c:264
BOOL WINAPI EnumerateRecycleBinW(IN LPCWSTR pszRoot OPTIONAL, IN PENUMERATE_RECYCLEBIN_CALLBACK pFnCallback, IN PVOID Context OPTIONAL)
Definition: recyclebin.c:206
EXTERN_C HRESULT GetRecycleBinPathFromDriveNumber(UINT Drive, LPWSTR Path)
Definition: recyclebin.c:354
BOOL WINAPI EnumerateRecycleBinA(IN LPCSTR pszRoot OPTIONAL, IN PENUMERATE_RECYCLEBIN_CALLBACK pFnCallback, IN PVOID Context OPTIONAL)
Definition: recyclebin.c:172
BOOL WINAPI DeleteFileToRecycleBinA(IN LPCSTR FileName)
Definition: recyclebin.c:32
BOOL WINAPI DeleteFileToRecycleBinW(IN LPCWSTR FileName)
Definition: recyclebin.c:68
EXTERN_C HRESULT GetDefaultRecycleBin(IN LPCWSTR pszVolume OPTIONAL, OUT IRecycleBin **pprb)
Definition: recyclebin.c:322
EXTERN_C BOOL RemoveFromRecycleBinDatabase(IN const RECYCLEBINFILEIDENTITY *pFI)
Definition: recyclebin.c:288
BOOL WINAPI CloseRecycleBinHandle(IN HDELFILE hDeletedFile)
Definition: recyclebin.c:13
BOOL WINAPI DeleteFileInRecycleBin(IN HDELFILE hDeletedFile)
Definition: recyclebin.c:94
BOOL WINAPI RestoreFileFromRecycleBin(IN HDELFILE hDeletedFile)
Definition: recyclebin.c:303
struct _BBENUMFILECONTEXT BBENUMFILECONTEXT
BOOL WINAPI EmptyRecycleBinA(IN LPCSTR pszRoot OPTIONAL)
Definition: recyclebin.c:114
BOOL WINAPI EmptyRecycleBinW(IN LPCWSTR pszRoot OPTIONAL)
Definition: recyclebin.c:146
EXTERN_C HDELFILE GetRecycleBinFileHandle(IN LPCWSTR pszRoot OPTIONAL, IN const RECYCLEBINFILEIDENTITY *pFI)
Definition: recyclebin.c:278
EXTERN_C int WINAPI PathGetDriveNumberW(_In_ LPCWSTR)
static void *static void *static LPDIRECTPLAY IUnknown * pUnk
Definition: dplayx.c:41
return ret
Definition: mutex.c:147
#define L(x)
Definition: resources.c:13
unsigned int BOOL
Definition: ntddk_ex.h:94
GLenum GLsizei len
Definition: glext.h:6722
unsigned int UINT
Definition: sysinfo.c:13
#define S_OK
Definition: intsafe.h:52
#define SUCCEEDED(hr)
Definition: intsafe.h:50
#define debugstr_a
Definition: kernel32.h:31
#define debugstr_w
Definition: kernel32.h:32
_In_ PIRP _In_ PIO_COMPLETION_ROUTINE _In_ PVOID Context
Definition: kse.h:81
#define error(str)
Definition: mkdosfs.c:1605
#define _In_
Definition: no_sal2.h:158
#define UNICODE_NULL
#define LOWORD(l)
Definition: pedump.c:82
short WCHAR
Definition: pedump.c:58
EXTERN_C const IID IID_IRecycleBin
Definition: recyclebin.h:241
BOOL(CALLBACK * PENUMERATE_RECYCLEBIN_CALLBACK)(IN PVOID Context, IN HDELFILE hDeletedFile)
Definition: recyclebin.h:77
#define IRecycleBinFileFromHDELFILE(hDF)
Definition: recyclebin.h:50
EXTERN_C HRESULT RecycleBinGeneric_Constructor(OUT IUnknown **ppUnknown)
EXTERN_C HRESULT RecycleBin5_Constructor(_In_ LPCWSTR VolumePath, _Out_ IUnknown **ppUnknown)
#define TRACE(s)
Definition: solgame.cpp:4
PULONG MinorVersion OPTIONAL
Definition: CrossNt.h:68
const RECYCLEBINFILEIDENTITY * pFI
Definition: recyclebin.c:259
Definition: http.c:7783
const char * LPCSTR
Definition: typedefs.h:52
const uint16_t * LPCWSTR
Definition: typedefs.h:57
uint16_t * LPWSTR
Definition: typedefs.h:56
#define IN
Definition: typedefs.h:39
#define OUT
Definition: typedefs.h:40
DWORD WINAPI GetLastError(void)
Definition: except.c:1042
#define WINAPI
Definition: msvc.h:6
#define S_FALSE
Definition: winerror.h:3451
static HRESULT HRESULT_FROM_WIN32(unsigned int x)
Definition: winerror.h:210
#define HRESULT_FACILITY(hr)
Definition: winerror.h:191
#define ERROR_GEN_FAILURE
Definition: winerror.h:256
#define FACILITY_WIN32
Definition: winerror.h:29
#define E_POINTER
Definition: winerror.h:3480
#define HRESULT_CODE(hr)
Definition: winerror.h:188