mirror of
git://source.winehq.org/git/wine.git
synced 2024-09-02 12:23:37 +00:00
scrrun: Fix FileSystemObject.OpenTextFile when writing to existing files.
OpenTextFile(...,ForWriting,True) should either create a new file, or open and truncate an existing one OpenTextFile(...,ForAppending,?,True) should write a BOM if appending to an existing-but-empty file
This commit is contained in:
parent
7b44c6895f
commit
3265d7b542
|
@ -897,7 +897,7 @@ static HRESULT create_textstream(const WCHAR *filename, DWORD disposition, IOMod
|
||||||
{
|
{
|
||||||
stream->unicode = format == TristateTrue;
|
stream->unicode = format == TristateTrue;
|
||||||
/* Write Unicode BOM */
|
/* Write Unicode BOM */
|
||||||
if (stream->unicode && (disposition == CREATE_ALWAYS || disposition == CREATE_NEW)) {
|
if (stream->unicode && (disposition == CREATE_ALWAYS || disposition == CREATE_NEW || disposition == TRUNCATE_EXISTING)) {
|
||||||
DWORD written = 0;
|
DWORD written = 0;
|
||||||
BOOL ret = WriteFile(stream->file, &utf16bom, sizeof(utf16bom), &written, NULL);
|
BOOL ret = WriteFile(stream->file, &utf16bom, sizeof(utf16bom), &written, NULL);
|
||||||
if (!ret || written != sizeof(utf16bom)) {
|
if (!ret || written != sizeof(utf16bom)) {
|
||||||
|
@ -939,7 +939,20 @@ static HRESULT create_textstream(const WCHAR *filename, DWORD disposition, IOMod
|
||||||
|
|
||||||
stream->eof = read != sizeof(buf);
|
stream->eof = read != sizeof(buf);
|
||||||
}
|
}
|
||||||
else SetFilePointer(stream->file, 0, 0, FILE_END);
|
else
|
||||||
|
{
|
||||||
|
LONG filePosHigh = 0;
|
||||||
|
DWORD filePosLow = SetFilePointer(stream->file, 0, &filePosHigh, FILE_END);
|
||||||
|
if(stream->unicode && filePosHigh == 0 && filePosLow == 0) {
|
||||||
|
/* unicode ForAppending to an empty file, write BOM */
|
||||||
|
DWORD written = 0;
|
||||||
|
BOOL ret = WriteFile(stream->file, &utf16bom, sizeof(utf16bom), &written, NULL);
|
||||||
|
if (!ret || written != sizeof(utf16bom)) {
|
||||||
|
ITextStream_Release(&stream->ITextStream_iface);
|
||||||
|
return create_error(GetLastError());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
init_classinfo(&CLSID_TextStream, (IUnknown *)&stream->ITextStream_iface, &stream->classinfo);
|
init_classinfo(&CLSID_TextStream, (IUnknown *)&stream->ITextStream_iface, &stream->classinfo);
|
||||||
|
@ -4049,7 +4062,11 @@ static HRESULT WINAPI filesys_OpenTextFile(IFileSystem3 *iface, BSTR filename,
|
||||||
|
|
||||||
TRACE("(%p)->(%s %d %d %d %p)\n", iface, debugstr_w(filename), mode, create, format, stream);
|
TRACE("(%p)->(%s %d %d %d %p)\n", iface, debugstr_w(filename), mode, create, format, stream);
|
||||||
|
|
||||||
disposition = create == VARIANT_TRUE ? OPEN_ALWAYS : OPEN_EXISTING;
|
if(mode == ForWriting) {
|
||||||
|
disposition = create == VARIANT_TRUE ? CREATE_ALWAYS : TRUNCATE_EXISTING;
|
||||||
|
} else {
|
||||||
|
disposition = create == VARIANT_TRUE ? OPEN_ALWAYS : OPEN_EXISTING;
|
||||||
|
}
|
||||||
return create_textstream(filename, disposition, mode, format, stream);
|
return create_textstream(filename, disposition, mode, format, stream);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -263,6 +263,7 @@ static void test_createfolder(void)
|
||||||
|
|
||||||
static void test_textstream(void)
|
static void test_textstream(void)
|
||||||
{
|
{
|
||||||
|
WCHAR ExpectedW[10];
|
||||||
ITextStream *stream;
|
ITextStream *stream;
|
||||||
VARIANT_BOOL b;
|
VARIANT_BOOL b;
|
||||||
DWORD written;
|
DWORD written;
|
||||||
|
@ -378,6 +379,31 @@ todo_wine {
|
||||||
ok(ret && written == sizeof(testfileW), "got %d\n", ret);
|
ok(ret && written == sizeof(testfileW), "got %d\n", ret);
|
||||||
CloseHandle(file);
|
CloseHandle(file);
|
||||||
|
|
||||||
|
/* opening a non-empty file (from above) for writing should truncate it */
|
||||||
|
hr = IFileSystem3_OpenTextFile(fs3, name, ForWriting, VARIANT_FALSE, TristateFalse, &stream);
|
||||||
|
ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
|
||||||
|
ITextStream_Release(stream);
|
||||||
|
|
||||||
|
test_file_contents(testfileW,0,"");
|
||||||
|
|
||||||
|
/* appending to an empty file file and specifying unicode should immediately write a BOM */
|
||||||
|
hr = IFileSystem3_OpenTextFile(fs3, name, ForAppending, VARIANT_FALSE, TristateTrue, &stream);
|
||||||
|
ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
|
||||||
|
ITextStream_Release(stream);
|
||||||
|
|
||||||
|
test_file_contents(testfileW,2,L"\ufeff");
|
||||||
|
|
||||||
|
/* appending to a file that contains a BOM should detect unicode mode, but not write a second BOM */
|
||||||
|
hr = IFileSystem3_OpenTextFile(fs3, name, ForAppending, VARIANT_FALSE, TristateUseDefault, &stream);
|
||||||
|
ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
|
||||||
|
hr = ITextStream_Write(stream, name);
|
||||||
|
ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
|
||||||
|
ITextStream_Release(stream);
|
||||||
|
|
||||||
|
lstrcpyW(ExpectedW, L"\ufeff");
|
||||||
|
lstrcatW(ExpectedW, name);
|
||||||
|
test_file_contents(testfileW,lstrlenW(ExpectedW)*sizeof(WCHAR),ExpectedW);
|
||||||
|
|
||||||
hr = IFileSystem3_OpenTextFile(fs3, name, ForReading, VARIANT_FALSE, TristateFalse, &stream);
|
hr = IFileSystem3_OpenTextFile(fs3, name, ForReading, VARIANT_FALSE, TristateFalse, &stream);
|
||||||
ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
|
ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
|
||||||
b = 10;
|
b = 10;
|
||||||
|
|
Loading…
Reference in a new issue