Piotr Caban : scrrun: Add IFileSystem3::DeleteFile implementation.
Alexandre Julliard
julliard at winehq.org
Tue Jul 30 14:14:21 CDT 2013
Module: wine
Branch: master
Commit: 23e38d4dd80dfad92712e87c41ba6993e5ceb54f
URL: http://source.winehq.org/git/wine.git/?a=commit;h=23e38d4dd80dfad92712e87c41ba6993e5ceb54f
Author: Piotr Caban <piotr at codeweavers.com>
Date: Tue Jul 30 11:31:32 2013 +0200
scrrun: Add IFileSystem3::DeleteFile implementation.
---
dlls/scrrun/filesystem.c | 52 ++++++++++++++++++++++++++++++++++++++-
dlls/scrrun/tests/filesystem.c | 13 ++++++++-
2 files changed, 61 insertions(+), 4 deletions(-)
diff --git a/dlls/scrrun/filesystem.c b/dlls/scrrun/filesystem.c
index c4aa4b8..2b84d96 100644
--- a/dlls/scrrun/filesystem.c
+++ b/dlls/scrrun/filesystem.c
@@ -1360,12 +1360,60 @@ static HRESULT WINAPI filesys_GetSpecialFolder(IFileSystem3 *iface,
return E_NOTIMPL;
}
+static inline HRESULT delete_file(const WCHAR *file, DWORD file_len, VARIANT_BOOL force)
+{
+ WCHAR path[MAX_PATH];
+ DWORD len, name_len;
+ WIN32_FIND_DATAW ffd;
+ HANDLE f;
+
+ f = FindFirstFileW(file, &ffd);
+ if(f == INVALID_HANDLE_VALUE)
+ return create_error(GetLastError());
+
+ len = get_parent_folder_name(file, file_len);
+ if(len+1 >= MAX_PATH)
+ return E_FAIL;
+ if(len) {
+ memcpy(path, file, len*sizeof(WCHAR));
+ path[len++] = '\\';
+ }
+
+ do {
+ if(ffd.dwFileAttributes & (FILE_ATTRIBUTE_DIRECTORY|FILE_ATTRIBUTE_DEVICE))
+ continue;
+
+ name_len = strlenW(ffd.cFileName);
+ if(len+name_len+1 >= MAX_PATH) {
+ FindClose(f);
+ return E_FAIL;
+ }
+ memcpy(path+len, ffd.cFileName, (name_len+1)*sizeof(WCHAR));
+
+ TRACE("deleting %s\n", debugstr_w(path));
+
+ if(!DeleteFileW(path)) {
+ if(!force || !SetFileAttributesW(path, FILE_ATTRIBUTE_NORMAL)
+ || !DeleteFileW(path)) {
+ FindClose(f);
+ return create_error(GetLastError());
+ }
+ }
+ } while(FindNextFileW(f, &ffd));
+ FindClose(f);
+
+ return S_OK;
+}
+
static HRESULT WINAPI filesys_DeleteFile(IFileSystem3 *iface, BSTR FileSpec,
VARIANT_BOOL Force)
{
- FIXME("%p %s %d\n", iface, debugstr_w(FileSpec), Force);
+ TRACE("%p %s %d\n", iface, debugstr_w(FileSpec), Force);
- return E_NOTIMPL;
+ if(!FileSpec)
+ return E_POINTER;
+
+ return delete_file(FileSpec, SysStringLen(FileSpec), Force);
}
static HRESULT WINAPI filesys_DeleteFolder(IFileSystem3 *iface, BSTR FolderSpec,
diff --git a/dlls/scrrun/tests/filesystem.c b/dlls/scrrun/tests/filesystem.c
index 0a55736..237c107 100644
--- a/dlls/scrrun/tests/filesystem.c
+++ b/dlls/scrrun/tests/filesystem.c
@@ -491,7 +491,7 @@ static void test_GetFile(void)
ok(!file, "file != NULL\n");
ok(hr == CTL_E_FILENOTFOUND, "GetFile returned %x, expected CTL_E_FILENOTFOUND\n", hr);
- hf = CreateFileW(path, GENERIC_WRITE, 0, NULL, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, NULL);
+ hf = CreateFileW(path, GENERIC_WRITE, 0, NULL, CREATE_NEW, FILE_ATTRIBUTE_READONLY, NULL);
if(hf == INVALID_HANDLE_VALUE) {
skip("Can't create temporary file\n");
SysFreeString(path);
@@ -513,7 +513,16 @@ static void test_GetFile(void)
ok(V_I4(&size) == 0, "V_I4(&size) = %d, expected 0\n", V_I4(&size));
IFile_Release(file);
- DeleteFileW(path);
+ hr = IFileSystem3_DeleteFile(fs3, path, FALSE);
+ ok(hr==CTL_E_PERMISSIONDENIED || broken(hr==S_OK),
+ "DeleteFile returned %x, expected CTL_E_PERMISSIONDENIED\n", hr);
+ if(hr != S_OK) {
+ hr = IFileSystem3_DeleteFile(fs3, path, TRUE);
+ ok(hr == S_OK, "DeleteFile returned %x, expected S_OK\n", hr);
+ }
+ hr = IFileSystem3_DeleteFile(fs3, path, TRUE);
+ ok(hr == CTL_E_FILENOTFOUND, "DeleteFile returned %x, expected CTL_E_FILENOTFOUND\n", hr);
+
SysFreeString(path);
}
More information about the wine-cvs
mailing list