ReactOS 0.4.16-dev-905-gc1b8c4f
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
10
13 IN HDELFILE hDeletedFile)
14{
15 IRecycleBinFile *rbf = IRecycleBinFileFromHDELFILE(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
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
76 if (!SUCCEEDED(hr))
77 goto cleanup;
78
79 hr = IRecycleBin_DeleteFile(prb, FileName);
80 IRecycleBin_Release(prb);
81
83 if (SUCCEEDED(hr))
84 return TRUE;
87 else
89 return FALSE;
90}
91
94 IN HDELFILE hDeletedFile)
95{
96 IRecycleBinFile *rbf = IRecycleBinFileFromHDELFILE(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
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
139cleanup:
140 HeapFree(GetProcessHeap(), 0, szRootW);
141 return ret;
142}
143
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
160cleanup:
161 if (SUCCEEDED(hr))
162 return TRUE;
165 else
167 return FALSE;
168}
169
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
199cleanup:
200 HeapFree(GetProcessHeap(), 0, szRootW);
201 return ret;
202}
203
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
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, (HDELFILE)prbf))
235 {
238 goto cleanup;
239 }
240 }
241
242cleanup:
243 if (prb)
244 IRecycleBin_Release(prb);
245 if (prbel)
246 IRecycleBinEnumList_Release(prbel);
247 if (SUCCEEDED(hr))
248 return TRUE;
251 else
253 return FALSE;
254}
255
256typedef struct _BBENUMFILECONTEXT
257{
259 HDELFILE hDelFile;
261
262static BOOL CALLBACK
264{
266 IRecycleBinFile *pRBF = IRecycleBinFileFromHDELFILE(hDeletedFile);
267 if (IRecycleBinFile_IsEqualIdentity(pRBF, pCtx->pFI) == S_OK)
268 {
269 pCtx->hDelFile = hDeletedFile;
270 return FALSE;
271 }
272 CloseRecycleBinHandle(hDeletedFile);
273 return TRUE;
274}
275
276EXTERN_C HDELFILE
278 IN LPCWSTR pszRoot OPTIONAL,
279 IN const RECYCLEBINFILEIDENTITY *pFI)
280{
281 BBENUMFILECONTEXT context = { pFI, NULL };
283 return context.hDelFile;
284}
285
288 IN const RECYCLEBINFILEIDENTITY *pFI)
289{
290 BOOL ret = FALSE;
291 HDELFILE hDelFile = GetRecycleBinFileHandle(NULL, pFI);
292 if (hDelFile)
293 {
294 IRecycleBinFile *rbf = IRecycleBinFileFromHDELFILE(hDelFile);
295 ret = SUCCEEDED(IRecycleBinFile_RemoveFromDatabase(rbf));
296 CloseRecycleBinHandle(hDelFile);
297 }
298 return ret;
299}
300
303 IN HDELFILE hDeletedFile)
304{
305 IRecycleBinFile *rbf = IRecycleBinFileFromHDELFILE(hDeletedFile);
306 HRESULT hr;
307
308 TRACE("(%p)\n", hDeletedFile);
309
310 hr = IRecycleBinFile_Restore(rbf);
311 if (SUCCEEDED(hr))
312 return TRUE;
315 else
317 return FALSE;
318}
319
322 IN LPCWSTR pszVolume OPTIONAL,
323 OUT IRecycleBin **pprb)
324{
325 IUnknown *pUnk;
326 HRESULT hr;
327
328 TRACE("(%s, %p)\n", debugstr_w(pszVolume), pprb);
329
330 if (!pprb)
331 return E_POINTER;
332
333 if (!pszVolume)
335 else
336 {
337 /* FIXME: do a better validation! */
338 if (wcslen(pszVolume) != 3 || pszVolume[1] != ':' || pszVolume[2] != '\\')
340
341 /* For now, only support this type of recycle bins... */
342 hr = RecycleBin5_Constructor(pszVolume, &pUnk);
343 }
344 if (!SUCCEEDED(hr))
345 return hr;
346 hr = IUnknown_QueryInterface(pUnk, &IID_IRecycleBin, (void **)pprb);
347 IUnknown_Release(pUnk);
348 return hr;
349}
350
353{
354 const WCHAR volume[] = { LOWORD('A' + Drive), ':', '\\', '\0' };
355 IRecycleBin *pRB;
357 if (SUCCEEDED(hr))
358 {
359 hr = IRecycleBin_GetDirectory(pRB, Path);
360 IRecycleBin_Release(pRB);
361 }
362 return hr;
363}
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
#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:263
BOOL WINAPI EnumerateRecycleBinW(IN LPCWSTR pszRoot OPTIONAL, IN PENUMERATE_RECYCLEBIN_CALLBACK pFnCallback, IN PVOID Context OPTIONAL)
Definition: recyclebin.c:205
EXTERN_C HRESULT GetRecycleBinPathFromDriveNumber(UINT Drive, LPWSTR Path)
Definition: recyclebin.c:352
BOOL WINAPI EnumerateRecycleBinA(IN LPCSTR pszRoot OPTIONAL, IN PENUMERATE_RECYCLEBIN_CALLBACK pFnCallback, IN PVOID Context OPTIONAL)
Definition: recyclebin.c:171
BOOL WINAPI DeleteFileToRecycleBinA(IN LPCSTR FileName)
Definition: recyclebin.c:31
BOOL WINAPI DeleteFileToRecycleBinW(IN LPCWSTR FileName)
Definition: recyclebin.c:67
EXTERN_C HRESULT GetDefaultRecycleBin(IN LPCWSTR pszVolume OPTIONAL, OUT IRecycleBin **pprb)
Definition: recyclebin.c:321
EXTERN_C BOOL RemoveFromRecycleBinDatabase(IN const RECYCLEBINFILEIDENTITY *pFI)
Definition: recyclebin.c:287
BOOL WINAPI CloseRecycleBinHandle(IN HDELFILE hDeletedFile)
Definition: recyclebin.c:12
BOOL WINAPI DeleteFileInRecycleBin(IN HDELFILE hDeletedFile)
Definition: recyclebin.c:93
BOOL WINAPI RestoreFileFromRecycleBin(IN HDELFILE hDeletedFile)
Definition: recyclebin.c:302
struct _BBENUMFILECONTEXT BBENUMFILECONTEXT
BOOL WINAPI EmptyRecycleBinA(IN LPCSTR pszRoot OPTIONAL)
Definition: recyclebin.c:113
BOOL WINAPI EmptyRecycleBinW(IN LPCWSTR pszRoot OPTIONAL)
Definition: recyclebin.c:145
EXTERN_C HDELFILE GetRecycleBinFileHandle(IN LPCWSTR pszRoot OPTIONAL, IN const RECYCLEBINFILEIDENTITY *pFI)
Definition: recyclebin.c:277
static void *static void *static LPDIRECTPLAY IUnknown * pUnk
Definition: dplayx.c:30
unsigned int BOOL
Definition: ntddk_ex.h:94
GLenum GLsizei len
Definition: glext.h:6722
_CRTIMP size_t __cdecl wcslen(_In_z_ const wchar_t *_Str)
#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
#define error(str)
Definition: mkdosfs.c:1605
unsigned int UINT
Definition: ndis.h:50
#define LOWORD(l)
Definition: pedump.c:82
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)
HRESULT hr
Definition: shlfolder.c:183
#define TRACE(s)
Definition: solgame.cpp:4
PULONG MinorVersion OPTIONAL
Definition: CrossNt.h:68
const RECYCLEBINFILEIDENTITY * pFI
Definition: recyclebin.c:258
Definition: http.c:7252
#define IN
Definition: typedefs.h:39
#define OUT
Definition: typedefs.h:40
int ret
DWORD WINAPI GetLastError(void)
Definition: except.c:1042
#define WINAPI
Definition: msvc.h:6
#define S_FALSE
Definition: winerror.h:2357
#define HRESULT_FACILITY(hr)
Definition: winerror.h:79
#define ERROR_GEN_FAILURE
Definition: winerror.h:134
#define HRESULT_FROM_WIN32(x)
Definition: winerror.h:92
#define FACILITY_WIN32
Definition: winerror.h:27
#define E_POINTER
Definition: winerror.h:2365
#define HRESULT_CODE(hr)
Definition: winerror.h:76
const char * LPCSTR
Definition: xmlstorage.h:183
__wchar_t WCHAR
Definition: xmlstorage.h:180
WCHAR * LPWSTR
Definition: xmlstorage.h:184
const WCHAR * LPCWSTR
Definition: xmlstorage.h:185