scrrun: Implemented AtEndOfStream() property.

This commit is contained in:
Nikolay Sivov 2014-03-19 10:21:27 +04:00 committed by Alexandre Julliard
parent 18c350ae22
commit 038438ad69
2 changed files with 48 additions and 10 deletions

View File

@ -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;
}

View File

@ -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);
}