Module: wine Branch: master Commit: 23e38d4dd80dfad92712e87c41ba6993e5ceb54f URL: http://source.winehq.org/git/wine.git/?a=commit;h=23e38d4dd80dfad92712e87c41...
Author: Piotr Caban piotr@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); }