Module: wine Branch: master Commit: 038438ad696fc936a6bae5669bc0f35d7dbb7fa0 URL: http://source.winehq.org/git/wine.git/?a=commit;h=038438ad696fc936a6bae5669b...
Author: Nikolay Sivov nsivov@codeweavers.com Date: Wed Mar 19 10:21:27 2014 +0400
scrrun: Implemented AtEndOfStream() property.
---
dlls/scrrun/filesystem.c | 26 ++++++++++++++++++++++++-- dlls/scrrun/tests/filesystem.c | 32 ++++++++++++++++++++++++-------- 2 files changed, 48 insertions(+), 10 deletions(-)
diff --git a/dlls/scrrun/filesystem.c b/dlls/scrrun/filesystem.c index f1fea06..c6dbb76 100644 --- a/dlls/scrrun/filesystem.c +++ b/dlls/scrrun/filesystem.c @@ -111,6 +111,7 @@ struct textstream { IOMode mode; BOOL unicode; BOOL first_write; + LARGE_INTEGER size; HANDLE file; };
@@ -332,8 +333,24 @@ static HRESULT WINAPI textstream_get_Column(ITextStream *iface, LONG *column) static HRESULT WINAPI textstream_get_AtEndOfStream(ITextStream *iface, VARIANT_BOOL *eos) { struct textstream *This = impl_from_ITextStream(iface); - FIXME("(%p)->(%p): stub\n", This, eos); - return E_NOTIMPL; + LARGE_INTEGER pos, dist; + + TRACE("(%p)->(%p)\n", This, eos); + + if (!eos) + return E_POINTER; + + if (textstream_check_iomode(This, IORead)) { + *eos = VARIANT_TRUE; + return CTL_E_BADFILEMODE; + } + + dist.QuadPart = 0; + if (!SetFilePointerEx(This->file, dist, &pos, FILE_CURRENT)) + return E_FAIL; + + *eos = This->size.QuadPart == pos.QuadPart ? VARIANT_TRUE : VARIANT_FALSE; + return S_OK; }
static HRESULT WINAPI textstream_get_AtEndOfLine(ITextStream *iface, VARIANT_BOOL *eol) @@ -548,6 +565,11 @@ static HRESULT create_textstream(const WCHAR *filename, DWORD disposition, IOMod return hr; }
+ if (mode == ForReading) + GetFileSizeEx(stream->file, &stream->size); + else + stream->size.QuadPart = 0; + *ret = &stream->ITextStream_iface; return S_OK; } diff --git a/dlls/scrrun/tests/filesystem.c b/dlls/scrrun/tests/filesystem.c index 4897652..63b79fa 100644 --- a/dlls/scrrun/tests/filesystem.c +++ b/dlls/scrrun/tests/filesystem.c @@ -154,9 +154,11 @@ static void test_textstream(void) static const WCHAR testfileW[] = {'t','e','s','t','f','i','l','e','.','t','x','t',0}; ITextStream *stream; VARIANT_BOOL b; + DWORD written; HANDLE file; HRESULT hr; BSTR name, data; + BOOL ret;
file = CreateFileW(testfileW, GENERIC_READ, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); CloseHandle(file); @@ -199,12 +201,14 @@ static void test_textstream(void) hr = ITextStream_Write(stream, name); ok(hr == CTL_E_BADFILEMODE, "got 0x%08x\n", hr);
+ hr = ITextStream_get_AtEndOfStream(stream, NULL); + ok(hr == E_POINTER, "got 0x%08x\n", hr); + b = 10; hr = ITextStream_get_AtEndOfStream(stream, &b); -todo_wine { - ok(hr == S_FALSE || broken(hr == S_OK), "got 0x%08x\n", hr); + ok(hr == S_OK || broken(hr == S_FALSE), "got 0x%08x\n", hr); ok(b == VARIANT_TRUE, "got 0x%x\n", b); -} + ITextStream_Release(stream);
hr = IFileSystem3_OpenTextFile(fs3, name, ForWriting, VARIANT_FALSE, TristateFalse, &stream); @@ -212,10 +216,9 @@ todo_wine {
b = 10; hr = ITextStream_get_AtEndOfStream(stream, &b); -todo_wine { ok(hr == CTL_E_BADFILEMODE, "got 0x%08x\n", hr); ok(b == VARIANT_TRUE || broken(b == 10), "got 0x%x\n", b); -} + b = 10; hr = ITextStream_get_AtEndOfLine(stream, &b); todo_wine { @@ -235,14 +238,12 @@ todo_wine {
hr = IFileSystem3_OpenTextFile(fs3, name, ForAppending, VARIANT_FALSE, TristateFalse, &stream); ok(hr == S_OK, "got 0x%08x\n", hr); - SysFreeString(name);
b = 10; hr = ITextStream_get_AtEndOfStream(stream, &b); -todo_wine { ok(hr == CTL_E_BADFILEMODE, "got 0x%08x\n", hr); ok(b == VARIANT_TRUE || broken(b == 10), "got 0x%x\n", b); -} + b = 10; hr = ITextStream_get_AtEndOfLine(stream, &b); todo_wine { @@ -260,6 +261,21 @@ todo_wine {
ITextStream_Release(stream);
+ /* now with non-empty file */ + file = CreateFileW(testfileW, GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); + ret = WriteFile(file, testfileW, sizeof(testfileW), &written, NULL); + ok(ret && written == sizeof(testfileW), "got %d\n", ret); + CloseHandle(file); + + hr = IFileSystem3_OpenTextFile(fs3, name, ForReading, VARIANT_FALSE, TristateFalse, &stream); + ok(hr == S_OK, "got 0x%08x\n", hr); + b = 10; + hr = ITextStream_get_AtEndOfStream(stream, &b); + ok(hr == S_OK, "got 0x%08x\n", hr); + ok(b == VARIANT_FALSE, "got 0x%x\n", b); + ITextStream_Release(stream); + + SysFreeString(name); DeleteFileW(testfileW); }