2 * PROJECT: Recycle bin management
3 * LICENSE: GPL v2 - See COPYING in the top level directory
4 * FILE: lib/recyclebin/recyclebin_generic.c
5 * PURPOSE: Deals with a system-wide recycle bin
6 * PROGRAMMERS: Copyright 2007 Hervé Poussineau (hpoussin@reactos.org)
10 #include "recyclebin_private.h"
13 struct RecycleBinGeneric
16 IRecycleBin recycleBinImpl
;
19 static HRESULT STDMETHODCALLTYPE
20 RecycleBinGenericVtbl_RecycleBin_QueryInterface(
25 struct RecycleBinGeneric
*s
= CONTAINING_RECORD(This
, struct RecycleBinGeneric
, recycleBinImpl
);
30 if (IsEqualIID(riid
, &IID_IUnknown
))
31 *ppvObject
= &s
->recycleBinImpl
;
32 else if (IsEqualIID(riid
, &IID_IRecycleBin
))
33 *ppvObject
= &s
->recycleBinImpl
;
40 IUnknown_AddRef(This
);
44 static ULONG STDMETHODCALLTYPE
45 RecycleBinGenericVtbl_RecycleBin_AddRef(
48 struct RecycleBinGeneric
*s
= CONTAINING_RECORD(This
, struct RecycleBinGeneric
, recycleBinImpl
);
49 ULONG refCount
= InterlockedIncrement((PLONG
)&s
->ref
);
53 static ULONG STDMETHODCALLTYPE
54 RecycleBinGenericVtbl_RecycleBin_Release(
57 struct RecycleBinGeneric
*s
= CONTAINING_RECORD(This
, struct RecycleBinGeneric
, recycleBinImpl
);
63 refCount
= InterlockedDecrement((PLONG
)&s
->ref
);
71 static HRESULT STDMETHODCALLTYPE
72 RecycleBinGenericVtbl_RecycleBin_DeleteFile(
74 IN LPCWSTR szFileName
)
77 LPWSTR szFullName
= NULL
;
78 DWORD dwBufferLength
= 0;
80 WCHAR szVolume
[MAX_PATH
];
83 /* Get full file name */
86 len
= GetFullPathNameW(szFileName
, dwBufferLength
, szFullName
, NULL
);
90 CoTaskMemFree(szFullName
);
91 return HRESULT_FROM_WIN32(GetLastError());
93 else if (len
< dwBufferLength
)
96 CoTaskMemFree(szFullName
);
98 szFullName
= CoTaskMemAlloc(dwBufferLength
* sizeof(WCHAR
));
100 return HRESULT_FROM_WIN32(ERROR_NOT_ENOUGH_MEMORY
);
103 /* Get associated volume path */
105 if (!GetVolumePathNameW(szFullName
, szVolume
, MAX_PATH
))
107 CoTaskMemFree(szFullName
);
108 return HRESULT_FROM_WIN32(GetLastError());
111 swprintf(szVolume
, L
"%c:\\", szFullName
[0]);
114 /* Skip namespace (if any) */
115 if (szVolume
[0] == '\\'
116 && szVolume
[1] == '\\'
117 && (szVolume
[2] == '.' || szVolume
[2] == '?')
118 && szVolume
[3] == '\\')
120 MoveMemory(szVolume
, &szVolume
[4], (MAX_PATH
- 4) * sizeof(WCHAR
));
123 hr
= GetDefaultRecycleBin(szVolume
, &prb
);
126 CoTaskMemFree(szFullName
);
130 hr
= IRecycleBin_DeleteFile(prb
, szFullName
);
131 CoTaskMemFree(szFullName
);
132 IRecycleBin_Release(prb
);
136 static HRESULT STDMETHODCALLTYPE
137 RecycleBinGenericVtbl_RecycleBin_EmptyRecycleBin(
138 IN IRecycleBin
*This
)
140 WCHAR szVolumeName
[MAX_PATH
];
141 DWORD dwLogicalDrives
, i
;
145 dwLogicalDrives
= GetLogicalDrives();
146 if (dwLogicalDrives
== 0)
147 return HRESULT_FROM_WIN32(GetLastError());
149 for (i
= 0; i
< 26; i
++)
151 if (!(dwLogicalDrives
& (1 << i
)))
153 swprintf(szVolumeName
, L
"%c:\\", 'A' + i
);
154 if (GetDriveTypeW(szVolumeName
) != DRIVE_FIXED
)
157 hr
= GetDefaultRecycleBin(szVolumeName
, &prb
);
161 hr
= IRecycleBin_EmptyRecycleBin(prb
);
162 IRecycleBin_Release(prb
);
168 static HRESULT STDMETHODCALLTYPE
169 RecycleBinGenericVtbl_RecycleBin_EnumObjects(
170 IN IRecycleBin
*This
,
171 OUT IRecycleBinEnumList
**ppEnumList
)
173 return RecycleBinGeneric_Enumerator_Constructor(ppEnumList
);
176 CONST_VTBL
struct IRecycleBinVtbl RecycleBinGenericVtbl
=
178 RecycleBinGenericVtbl_RecycleBin_QueryInterface
,
179 RecycleBinGenericVtbl_RecycleBin_AddRef
,
180 RecycleBinGenericVtbl_RecycleBin_Release
,
181 RecycleBinGenericVtbl_RecycleBin_DeleteFile
,
182 RecycleBinGenericVtbl_RecycleBin_EmptyRecycleBin
,
183 RecycleBinGenericVtbl_RecycleBin_EnumObjects
,
186 HRESULT
RecycleBinGeneric_Constructor(OUT IUnknown
**ppUnknown
)
188 /* This RecycleBin implementation was introduced to be able to manage all
189 * drives at once, and instanciate the 'real' implementations when needed */
190 struct RecycleBinGeneric
*s
;
192 s
= CoTaskMemAlloc(sizeof(struct RecycleBinGeneric
));
194 return E_OUTOFMEMORY
;
196 s
->recycleBinImpl
.lpVtbl
= &RecycleBinGenericVtbl
;
198 *ppUnknown
= (IUnknown
*)&s
->recycleBinImpl
;