Robert Wilhelm : scrrun: Implement folder_CreateTextFile.
Alexandre Julliard
julliard at winehq.org
Wed Dec 1 15:23:50 CST 2021
Module: wine
Branch: master
Commit: 4c04fb00f03a40d122bb4d8ae73a1d8be3b3b677
URL: https://source.winehq.org/git/wine.git/?a=commit;h=4c04fb00f03a40d122bb4d8ae73a1d8be3b3b677
Author: Robert Wilhelm <robert.wilhelm at gmx.net>
Date: Sun Nov 28 22:58:10 2021 +0100
scrrun: Implement folder_CreateTextFile.
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=51971
Signed-off-by: Robert Wilhelm <robert.wilhelm at gmx.net>
Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/scrrun/filesystem.c | 16 +++++++--
dlls/scrrun/tests/filesystem.c | 81 ++++++++++++++++++++++++++++++++++++++++++
2 files changed, 95 insertions(+), 2 deletions(-)
diff --git a/dlls/scrrun/filesystem.c b/dlls/scrrun/filesystem.c
index 359d86bb8fd..7b0b2e110a6 100644
--- a/dlls/scrrun/filesystem.c
+++ b/dlls/scrrun/filesystem.c
@@ -2518,9 +2518,21 @@ static HRESULT WINAPI folder_get_Files(IFolder *iface, IFileCollection **files)
static HRESULT WINAPI folder_CreateTextFile(IFolder *iface, BSTR filename, VARIANT_BOOL overwrite,
VARIANT_BOOL unicode, ITextStream **stream)
{
+ DWORD disposition;
+ BSTR path;
+ HRESULT hres;
+
struct folder *This = impl_from_IFolder(iface);
- FIXME("(%p)->(%s %x %x %p): stub\n", This, debugstr_w(filename), overwrite, unicode, stream);
- return E_NOTIMPL;
+
+ TRACE("%p %s %d %d %p\n", iface, debugstr_w(filename), overwrite, unicode, stream);
+
+ hres = build_path(This->path, filename, &path);
+ if (FAILED(hres)) return hres;
+
+ disposition = overwrite == VARIANT_TRUE ? CREATE_ALWAYS : CREATE_NEW;
+ hres = create_textstream(path, disposition, ForWriting, unicode ? TristateTrue : TristateFalse, stream);
+ SysFreeString(path);
+ return hres;
}
static const IFolderVtbl foldervtbl = {
diff --git a/dlls/scrrun/tests/filesystem.c b/dlls/scrrun/tests/filesystem.c
index 5c55965ce88..91729bb047f 100644
--- a/dlls/scrrun/tests/filesystem.c
+++ b/dlls/scrrun/tests/filesystem.c
@@ -1535,6 +1535,86 @@ static void test_CreateTextFile(void)
SysFreeString(nameW);
}
+static void test_FolderCreateTextFile(void)
+{
+ WCHAR pathW[MAX_PATH], dirW[MAX_PATH], buffW[10], buff2W[10];
+ ITextStream *stream;
+ BSTR nameW, str;
+ HANDLE file;
+ IFolder *folder;
+ HRESULT hr;
+ BOOL ret;
+ DWORD r;
+
+ get_temp_filepath(testfileW, pathW, dirW);
+ nameW = SysAllocString(L"foo.txt");
+ lstrcpyW(pathW, dirW);
+ lstrcatW(pathW, nameW);
+
+ ret = CreateDirectoryW(dirW, NULL);
+ ok(ret, "got %d, %d\n", ret, GetLastError());
+
+ str = SysAllocString(dirW);
+ hr = IFileSystem3_GetFolder(fs3, str, &folder);
+ ok(ret, "got %d, %d\n", ret, GetLastError());
+ SysFreeString(str);
+
+ hr = IFolder_CreateTextFile(folder, nameW, VARIANT_FALSE, VARIANT_FALSE, &stream);
+ ok(hr == S_OK, "got 0x%08x\n", hr);
+
+ test_provideclassinfo(stream, &CLSID_TextStream);
+
+ hr = ITextStream_Read(stream, 1, &str);
+ ok(hr == CTL_E_BADFILEMODE, "got 0x%08x\n", hr);
+
+ hr = ITextStream_Close(stream);
+ ok(hr == S_OK, "got 0x%08x\n", hr);
+
+ hr = ITextStream_Read(stream, 1, &str);
+ ok(hr == CTL_E_BADFILEMODE || hr == E_VAR_NOT_SET, "got 0x%08x\n", hr);
+
+ hr = ITextStream_Close(stream);
+ ok(hr == S_FALSE || hr == E_VAR_NOT_SET, "got 0x%08x\n", hr);
+
+ ITextStream_Release(stream);
+
+ /* check it's created */
+ file = CreateFileW(pathW, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
+ ok(file != INVALID_HANDLE_VALUE, "got %p\n", file);
+ CloseHandle(file);
+
+ /* try to create again with no-overwrite mode */
+ hr = IFolder_CreateTextFile(folder, nameW, VARIANT_FALSE, VARIANT_FALSE, &stream);
+ ok(hr == CTL_E_FILEALREADYEXISTS, "got 0x%08x\n", hr);
+
+ /* now overwrite */
+ hr = IFolder_CreateTextFile(folder, nameW, VARIANT_TRUE, VARIANT_FALSE, &stream);
+ ok(hr == S_OK, "got 0x%08x\n", hr);
+ ITextStream_Release(stream);
+
+ /* overwrite in Unicode mode, check for BOM */
+ hr = IFolder_CreateTextFile(folder, nameW, VARIANT_TRUE, VARIANT_TRUE, &stream);
+ ok(hr == S_OK, "got 0x%08x\n", hr);
+ ITextStream_Release(stream);
+
+ /* check contents */
+ file = CreateFileW(pathW, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
+ ok(file != INVALID_HANDLE_VALUE, "got %p\n", file);
+ r = 0;
+ ret = ReadFile(file, buffW, sizeof(buffW), &r, NULL);
+ ok(ret && r==2, "read %d, got %d, %d\n", r, ret, GetLastError());
+ buffW[r/sizeof(WCHAR)] = 0;
+
+ buff2W[0] = 0xfeff;
+ buff2W[1] = 0;
+ ok(!lstrcmpW(buff2W, buffW), "got %s, expected %s\n", wine_dbgstr_w(buffW), wine_dbgstr_w(buff2W));
+ CloseHandle(file);
+
+ DeleteFileW(pathW);
+ RemoveDirectoryW(dirW);
+ SysFreeString(nameW);
+}
+
static void test_WriteLine(void)
{
WCHAR pathW[MAX_PATH], dirW[MAX_PATH];
@@ -2516,6 +2596,7 @@ START_TEST(filesystem)
test_FileCollection();
test_DriveCollection();
test_CreateTextFile();
+ test_FolderCreateTextFile();
test_WriteLine();
test_ReadAll();
test_Read();
More information about the wine-cvs
mailing list