mirror of
git://source.winehq.org/git/wine.git
synced 2024-09-06 04:00:56 +00:00
scrrun: Block stream reading calls if it's not in ForReading mode.
This commit is contained in:
parent
49a8d4ecb0
commit
7a4225c68f
|
@ -41,6 +41,13 @@ struct folder {
|
|||
struct textstream {
|
||||
ITextStream ITextStream_iface;
|
||||
LONG ref;
|
||||
|
||||
IOMode mode;
|
||||
};
|
||||
|
||||
enum iotype {
|
||||
IORead,
|
||||
IOWrite
|
||||
};
|
||||
|
||||
static inline struct folder *impl_from_IFolder(IFolder *iface)
|
||||
|
@ -53,6 +60,14 @@ static inline struct textstream *impl_from_ITextStream(ITextStream *iface)
|
|||
return CONTAINING_RECORD(iface, struct textstream, ITextStream_iface);
|
||||
}
|
||||
|
||||
static int textstream_check_iomode(struct textstream *This, enum iotype type)
|
||||
{
|
||||
if (type == IORead)
|
||||
return This->mode == ForWriting || This->mode == ForAppending;
|
||||
else
|
||||
return 1;
|
||||
}
|
||||
|
||||
static HRESULT WINAPI textstream_QueryInterface(ITextStream *iface, REFIID riid, void **obj)
|
||||
{
|
||||
struct textstream *This = impl_from_ITextStream(iface);
|
||||
|
@ -183,6 +198,10 @@ static HRESULT WINAPI textstream_Read(ITextStream *iface, LONG len, BSTR *text)
|
|||
{
|
||||
struct textstream *This = impl_from_ITextStream(iface);
|
||||
FIXME("(%p)->(%p): stub\n", This, text);
|
||||
|
||||
if (textstream_check_iomode(This, IORead))
|
||||
return CTL_E_BADFILEMODE;
|
||||
|
||||
return E_NOTIMPL;
|
||||
}
|
||||
|
||||
|
@ -190,6 +209,10 @@ static HRESULT WINAPI textstream_ReadLine(ITextStream *iface, BSTR *text)
|
|||
{
|
||||
struct textstream *This = impl_from_ITextStream(iface);
|
||||
FIXME("(%p)->(%p): stub\n", This, text);
|
||||
|
||||
if (textstream_check_iomode(This, IORead))
|
||||
return CTL_E_BADFILEMODE;
|
||||
|
||||
return E_NOTIMPL;
|
||||
}
|
||||
|
||||
|
@ -197,6 +220,10 @@ static HRESULT WINAPI textstream_ReadAll(ITextStream *iface, BSTR *text)
|
|||
{
|
||||
struct textstream *This = impl_from_ITextStream(iface);
|
||||
FIXME("(%p)->(%p): stub\n", This, text);
|
||||
|
||||
if (textstream_check_iomode(This, IORead))
|
||||
return CTL_E_BADFILEMODE;
|
||||
|
||||
return E_NOTIMPL;
|
||||
}
|
||||
|
||||
|
@ -265,7 +292,7 @@ static const ITextStreamVtbl textstreamvtbl = {
|
|||
textstream_Close
|
||||
};
|
||||
|
||||
static HRESULT create_textstream(ITextStream **ret)
|
||||
static HRESULT create_textstream(IOMode mode, ITextStream **ret)
|
||||
{
|
||||
struct textstream *stream;
|
||||
|
||||
|
@ -274,6 +301,7 @@ static HRESULT create_textstream(ITextStream **ret)
|
|||
|
||||
stream->ITextStream_iface.lpVtbl = &textstreamvtbl;
|
||||
stream->ref = 1;
|
||||
stream->mode = mode;
|
||||
|
||||
*ret = &stream->ITextStream_iface;
|
||||
return S_OK;
|
||||
|
@ -892,7 +920,7 @@ static HRESULT WINAPI filesys_OpenTextFile(IFileSystem3 *iface, BSTR filename,
|
|||
Tristate format, ITextStream **stream)
|
||||
{
|
||||
FIXME("(%p)->(%s %d %d %d %p)\n", iface, debugstr_w(filename), mode, create, format, stream);
|
||||
return create_textstream(stream);
|
||||
return create_textstream(mode, stream);
|
||||
}
|
||||
|
||||
static HRESULT WINAPI filesys_GetStandardStream(IFileSystem3 *iface,
|
||||
|
|
|
@ -31,6 +31,8 @@
|
|||
#include "initguid.h"
|
||||
#include "scrrun.h"
|
||||
|
||||
static IFileSystem3 *fs3;
|
||||
|
||||
static void test_interfaces(void)
|
||||
{
|
||||
static const WCHAR nonexistent_dirW[] = {
|
||||
|
@ -41,27 +43,18 @@ static void test_interfaces(void)
|
|||
HRESULT hr;
|
||||
IDispatch *disp;
|
||||
IDispatchEx *dispex;
|
||||
IFileSystem3 *fs3;
|
||||
IObjectWithSite *site;
|
||||
VARIANT_BOOL b;
|
||||
BSTR path;
|
||||
WCHAR windows_path[MAX_PATH];
|
||||
WCHAR file_path[MAX_PATH];
|
||||
|
||||
hr = CoCreateInstance(&CLSID_FileSystemObject, NULL, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER,
|
||||
&IID_IDispatch, (void**)&disp);
|
||||
if(FAILED(hr)) {
|
||||
win_skip("Could not create FileSystem object: %08x\n", hr);
|
||||
return;
|
||||
}
|
||||
IFileSystem3_QueryInterface(fs3, &IID_IDispatch, (void**)&disp);
|
||||
|
||||
GetSystemDirectoryW(windows_path, MAX_PATH);
|
||||
lstrcpyW(file_path, windows_path);
|
||||
lstrcatW(file_path, file_kernel32W);
|
||||
|
||||
hr = IDispatch_QueryInterface(disp, &IID_IFileSystem3, (void**)&fs3);
|
||||
ok(hr == S_OK, "got 0x%08x, expected 0x%08x\n", hr, S_OK);
|
||||
|
||||
hr = IDispatch_QueryInterface(disp, &IID_IObjectWithSite, (void**)&site);
|
||||
ok(hr == E_NOINTERFACE, "got 0x%08x, expected 0x%08x\n", hr, E_NOINTERFACE);
|
||||
|
||||
|
@ -119,25 +112,16 @@ static void test_interfaces(void)
|
|||
ok(b == VARIANT_FALSE, "Folder exists\n");
|
||||
SysFreeString(path);
|
||||
|
||||
IFileSystem3_Release(fs3);
|
||||
IDispatch_Release(disp);
|
||||
}
|
||||
|
||||
static void test_createfolder(void)
|
||||
{
|
||||
IFileSystem3 *fs3;
|
||||
HRESULT hr;
|
||||
WCHAR pathW[MAX_PATH];
|
||||
BSTR path;
|
||||
IFolder *folder;
|
||||
|
||||
hr = CoCreateInstance(&CLSID_FileSystemObject, NULL, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER,
|
||||
&IID_IFileSystem3, (void**)&fs3);
|
||||
if(FAILED(hr)) {
|
||||
win_skip("Could not create FileSystem object: %08x\n", hr);
|
||||
return;
|
||||
}
|
||||
|
||||
/* create existing directory */
|
||||
GetCurrentDirectoryW(sizeof(pathW)/sizeof(WCHAR), pathW);
|
||||
path = SysAllocString(pathW);
|
||||
|
@ -146,16 +130,111 @@ static void test_createfolder(void)
|
|||
ok(hr == CTL_E_FILEALREADYEXISTS, "got 0x%08x\n", hr);
|
||||
ok(folder == NULL, "got %p\n", folder);
|
||||
SysFreeString(path);
|
||||
}
|
||||
|
||||
IFileSystem3_Release(fs3);
|
||||
static void test_textstream(void)
|
||||
{
|
||||
static WCHAR testfileW[] = {'t','e','s','t','f','i','l','e','.','t','x','t',0};
|
||||
ITextStream *stream;
|
||||
VARIANT_BOOL b;
|
||||
HANDLE file;
|
||||
HRESULT hr;
|
||||
BSTR name, data;
|
||||
|
||||
file = CreateFileW(testfileW, GENERIC_READ, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
|
||||
CloseHandle(file);
|
||||
|
||||
name = SysAllocString(testfileW);
|
||||
b = VARIANT_FALSE;
|
||||
hr = IFileSystem3_FileExists(fs3, name, &b);
|
||||
ok(hr == S_OK, "got 0x%08x, expected 0x%08x\n", hr, S_OK);
|
||||
ok(b == VARIANT_TRUE, "got %x\n", b);
|
||||
|
||||
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);
|
||||
todo_wine {
|
||||
ok(hr == S_FALSE || broken(hr == S_OK), "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);
|
||||
ok(hr == S_OK, "got 0x%08x\n", hr);
|
||||
|
||||
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 {
|
||||
ok(hr == CTL_E_BADFILEMODE, "got 0x%08x\n", hr);
|
||||
ok(b == VARIANT_FALSE || broken(b == 10), "got 0x%x\n", b);
|
||||
}
|
||||
hr = ITextStream_Read(stream, 1, &data);
|
||||
ok(hr == CTL_E_BADFILEMODE, "got 0x%08x\n", hr);
|
||||
|
||||
hr = ITextStream_ReadLine(stream, &data);
|
||||
ok(hr == CTL_E_BADFILEMODE, "got 0x%08x\n", hr);
|
||||
|
||||
hr = ITextStream_ReadAll(stream, &data);
|
||||
ok(hr == CTL_E_BADFILEMODE, "got 0x%08x\n", hr);
|
||||
|
||||
ITextStream_Release(stream);
|
||||
|
||||
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 {
|
||||
ok(hr == CTL_E_BADFILEMODE, "got 0x%08x\n", hr);
|
||||
ok(b == VARIANT_FALSE || broken(b == 10), "got 0x%x\n", b);
|
||||
}
|
||||
hr = ITextStream_Read(stream, 1, &data);
|
||||
ok(hr == CTL_E_BADFILEMODE, "got 0x%08x\n", hr);
|
||||
|
||||
hr = ITextStream_ReadLine(stream, &data);
|
||||
ok(hr == CTL_E_BADFILEMODE, "got 0x%08x\n", hr);
|
||||
|
||||
hr = ITextStream_ReadAll(stream, &data);
|
||||
ok(hr == CTL_E_BADFILEMODE, "got 0x%08x\n", hr);
|
||||
|
||||
ITextStream_Release(stream);
|
||||
|
||||
DeleteFileW(testfileW);
|
||||
}
|
||||
|
||||
START_TEST(filesystem)
|
||||
{
|
||||
HRESULT hr;
|
||||
|
||||
CoInitialize(NULL);
|
||||
|
||||
hr = CoCreateInstance(&CLSID_FileSystemObject, NULL, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER,
|
||||
&IID_IFileSystem3, (void**)&fs3);
|
||||
if(FAILED(hr)) {
|
||||
win_skip("Could not create FileSystem object: %08x\n", hr);
|
||||
return;
|
||||
}
|
||||
|
||||
test_interfaces();
|
||||
test_createfolder();
|
||||
test_textstream();
|
||||
|
||||
IFileSystem3_Release(fs3);
|
||||
|
||||
CoUninitialize();
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue