[PATCH 2/2] scrrun: Add MoveFolder implementation.
Robert Wilhelm
robert.wilhelm at gmx.net
Wed May 25 08:02:06 CDT 2022
This implements folder rename which is sufficient for installer used in the bug report.
No wildcard handling yet.
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=52128
Signed-off-by: Robert Wilhelm <robert.wilhelm at gmx.net>
---
dlls/scrrun/filesystem.c | 16 ++++++++---
dlls/scrrun/tests/filesystem.c | 51 ++++++++++++++++++++++++++++++++++
2 files changed, 63 insertions(+), 4 deletions(-)
diff --git a/dlls/scrrun/filesystem.c b/dlls/scrrun/filesystem.c
index 35b43e2f124..6d534bc4413 100644
--- a/dlls/scrrun/filesystem.c
+++ b/dlls/scrrun/filesystem.c
@@ -3764,12 +3764,20 @@ static HRESULT WINAPI filesys_MoveFile(IFileSystem3 *iface, BSTR source, BSTR de
return MoveFileW(source, destination) ? S_OK : create_error(GetLastError());
}
-static HRESULT WINAPI filesys_MoveFolder(IFileSystem3 *iface,BSTR Source,
- BSTR Destination)
+static HRESULT WINAPI filesys_MoveFolder(IFileSystem3 *iface, BSTR source, BSTR destination)
{
- FIXME("%p %s %s\n", iface, debugstr_w(Source), debugstr_w(Destination));
+ DWORD attrs;
- return E_NOTIMPL;
+ TRACE("%p %s %s\n", iface, debugstr_w(source), debugstr_w(destination));
+
+ if(!source || !destination)
+ return E_INVALIDARG;
+
+ attrs = GetFileAttributesW(source);
+ if((attrs == INVALID_FILE_ATTRIBUTES) || !(attrs & FILE_ATTRIBUTE_DIRECTORY))
+ return CTL_E_PATHNOTFOUND;
+
+ return MoveFileW(source, destination) ? S_OK : create_error(GetLastError());
}
static inline HRESULT copy_file(const WCHAR *source, DWORD source_len,
diff --git a/dlls/scrrun/tests/filesystem.c b/dlls/scrrun/tests/filesystem.c
index 1ba0e81a2d1..aa0927ff4b7 100644
--- a/dlls/scrrun/tests/filesystem.c
+++ b/dlls/scrrun/tests/filesystem.c
@@ -2600,6 +2600,56 @@ static void test_MoveFile(void)
SysFreeString(str);
}
+static void test_MoveFolder(void)
+{
+ BSTR src, dst;
+ WCHAR buffW1[MAX_PATH],buffW2[MAX_PATH];
+ HANDLE file;
+ HRESULT hr;
+
+ get_temp_path(L"foo", buffW1);
+ get_temp_path(L"bar", buffW2);
+
+ ok(CreateDirectoryW(buffW1, NULL), "CreateDirectory(%s) failed\n", wine_dbgstr_w(buffW1));
+ src = SysAllocString(buffW1);
+ dst = SysAllocString(buffW2);
+ hr = IFileSystem3_MoveFolder(fs3, src, dst);
+ ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
+ SysFreeString(src);
+ SysFreeString(dst);
+
+ ok(CreateDirectoryW(buffW1, NULL), "CreateDirectory(%s) failed\n", wine_dbgstr_w(buffW1));
+ src = SysAllocString(buffW1);
+ dst = SysAllocString(buffW2);
+ hr = IFileSystem3_MoveFolder(fs3, src, dst); /* dst already exists */
+ ok(hr == CTL_E_FILEALREADYEXISTS, "Unexpected hr %#lx.\n", hr);
+ SysFreeString(src);
+ SysFreeString(dst);
+
+ ok(RemoveDirectoryW(buffW1), "can't remove %s directory\n", wine_dbgstr_w(buffW1));
+ ok(RemoveDirectoryW(buffW2), "can't remove %s directory\n", wine_dbgstr_w(buffW2));
+
+ src = SysAllocString(buffW1);
+ dst = SysAllocString(buffW2);
+ hr = IFileSystem3_MoveFolder(fs3, src, dst); /* src nonexistant */
+ ok(hr == CTL_E_PATHNOTFOUND, "Unexpected hr %#lx.\n", hr);
+ SysFreeString(src);
+ SysFreeString(dst);
+
+ file = CreateFileW(buffW1, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS,
+ FILE_ATTRIBUTE_NORMAL, NULL);
+ ok(file != INVALID_HANDLE_VALUE, "CreateFile failed\n");
+ CloseHandle(file);
+
+ src = SysAllocString(buffW1);
+ dst = SysAllocString(buffW2);
+ hr = IFileSystem3_MoveFolder(fs3, src, dst);
+ ok(hr == CTL_E_PATHNOTFOUND, "Unexpected hr %#lx.\n", hr);
+ SysFreeString(src);
+ SysFreeString(dst);
+ DeleteFileW(buffW1);
+}
+
static void test_DoOpenPipeStream(void)
{
static const char testdata[] = "test";
@@ -2733,6 +2783,7 @@ START_TEST(filesystem)
test_GetExtensionName();
test_GetSpecialFolder();
test_MoveFile();
+ test_MoveFolder();
test_DoOpenPipeStream();
IFileSystem3_Release(fs3);
--
2.36.1
More information about the wine-devel
mailing list