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