riched20: Implement ITextDocument_fnOpen. (try 2)
Jactry Zeng
jactry92 at gmail.com
Mon Nov 18 06:02:11 CST 2013
update:
1. Use 0 in HeapAlloc instead of HEAP_ZERO_MEMORY;
2. Return an E_OUTOFMEMORY instead of HRESULT_FROM_WIN32(GetLastError())
when HeapAlloc fail.
-------------- next part --------------
From 1b27e40999dbc47687436c461685a888fc0afeec Mon Sep 17 00:00:00 2001
From: Jactry Zeng <jactry92 at gmail.com>
Date: Mon, 18 Nov 2013 19:38:39 +0800
Subject: riched20: Implement ITextDocument_fnOpen.
To: wine-patches <wine-patches at winehq.org>
Reply-To: wine-devel <wine-devel at winehq.org>
---
dlls/riched20/richole.c | 50 +++++++++++++++++++++++++++++++++++++++++--
dlls/riched20/tests/richole.c | 8 +++----
2 files changed, 52 insertions(+), 6 deletions(-)
diff --git a/dlls/riched20/richole.c b/dlls/riched20/richole.c
index 6805873..dfca8a6 100644
--- a/dlls/riched20/richole.c
+++ b/dlls/riched20/richole.c
@@ -582,8 +582,54 @@ ITextDocument_fnOpen(ITextDocument* me, VARIANT* pVar, LONG Flags,
LONG CodePage)
{
IRichEditOleImpl *This = impl_from_ITextDocument(me);
- FIXME("stub %p\n",This);
- return E_NOTIMPL;
+
+ HANDLE hFile;
+ DWORD dwReadSize, size;
+ SETTEXTEX settextex;
+ LPSTR chBuffer;
+
+ TRACE("(%p %p 0x%x %d)\n", me, pVar, Flags, CodePage);
+
+ if(V_VT(pVar) != VT_BSTR) return E_INVALIDARG;
+
+ FIXME("Don't support UTF-16.\n");
+ FIXME("Partial stub! Don't support flag: 0x%x\n", Flags);
+ hFile = CreateFileW(V_BSTR(pVar), GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ|
+ FILE_SHARE_WRITE|FILE_SHARE_DELETE,
+ NULL, OPEN_EXISTING, 0, NULL);
+
+ if(hFile == INVALID_HANDLE_VALUE)
+ return HRESULT_FROM_WIN32(GetLastError());
+
+ settextex.codepage = CodePage;
+ settextex.flags = ST_DEFAULT;
+
+ size = GetFileSize(hFile, NULL);
+ if(size == INVALID_FILE_SIZE)
+ {
+ CloseHandle(hFile);
+ return HRESULT_FROM_WIN32(GetLastError());
+ }
+
+ chBuffer = HeapAlloc(GetProcessHeap(), 0, size+1);
+ if(!chBuffer)
+ {
+ CloseHandle(hFile);
+ return E_OUTOFMEMORY;
+ }
+
+ if(!ReadFile(hFile, chBuffer, size, &dwReadSize, NULL))
+ {
+ CloseHandle(hFile);
+ HeapFree(GetProcessHeap(), 0, chBuffer);
+ return HRESULT_FROM_WIN32(GetLastError());
+ }
+ chBuffer[size] = 0;
+
+ SendMessageW(This->editor->hWnd, EM_SETTEXTEX, (int)&settextex, (LPARAM)chBuffer);
+ CloseHandle(hFile);
+
+ return S_OK;
}
static HRESULT WINAPI
diff --git a/dlls/riched20/tests/richole.c b/dlls/riched20/tests/richole.c
index 63208ee..e935c66 100644
--- a/dlls/riched20/tests/richole.c
+++ b/dlls/riched20/tests/richole.c
@@ -189,7 +189,7 @@ static void test_ITextDocument_Open(void)
touch_file(filename);
create_interfaces(&w, &reOle, &txtDoc, &txtSel);
hres = ITextDocument_Open(txtDoc, &testfile, tomConstantsSingle[i], CP_ACP);
- todo_wine ok(hres == S_OK, "ITextDocument_Open: Filename:test.txt Flags:0x%x Codepage:CP_ACP hres:0x%x\n",
+ ok(hres == S_OK, "ITextDocument_Open: Filename:test.txt Flags:0x%x Codepage:CP_ACP hres:0x%x\n",
tomConstantsSingle[i], hres);
release_interfaces(&w, &reOle, &txtDoc, &txtSel);
DeleteFileW(filename);
@@ -197,7 +197,7 @@ static void test_ITextDocument_Open(void)
touch_file(filename);
create_interfaces(&w, &reOle, &txtDoc, &txtSel);
hres = ITextDocument_Open(txtDoc, &testfile, tomConstantsSingle[i], CP_UTF8);
- todo_wine ok(hres == S_OK, "ITextDocument_Open: Filename:test.txt Flags:0x%x Codepage:CP_UTF8 hres:0x%x\n",
+ ok(hres == S_OK, "ITextDocument_Open: Filename:test.txt Flags:0x%x Codepage:CP_UTF8 hres:0x%x\n",
tomConstantsSingle[i], hres);
release_interfaces(&w, &reOle, &txtDoc, &txtSel);
DeleteFileW(filename);
@@ -208,7 +208,7 @@ static void test_ITextDocument_Open(void)
touch_file(filename);
create_interfaces(&w, &reOle, &txtDoc, &txtSel);
hres = ITextDocument_Open(txtDoc, &testfile, tomConstantsMulti[i], CP_ACP);
- todo_wine ok(hres == S_OK, "ITextDocument_Open: Filename:test.txt Flags:0x%x Codepage:CP_ACP hres:0x%x\n",
+ ok(hres == S_OK, "ITextDocument_Open: Filename:test.txt Flags:0x%x Codepage:CP_ACP hres:0x%x\n",
tomConstantsMulti[i], hres);
release_interfaces(&w, &reOle, &txtDoc, &txtSel);
DeleteFileW(filename);
@@ -216,7 +216,7 @@ static void test_ITextDocument_Open(void)
touch_file(filename);
create_interfaces(&w, &reOle, &txtDoc, &txtSel);
hres = ITextDocument_Open(txtDoc, &testfile, tomConstantsMulti[i], CP_UTF8);
- todo_wine ok(hres == S_OK, "ITextDocument_Open: Filename:test.txt Flags:0x%x Codepage:CP_UTF8 hres:0x%x\n",
+ ok(hres == S_OK, "ITextDocument_Open: Filename:test.txt Flags:0x%x Codepage:CP_UTF8 hres:0x%x\n",
tomConstantsMulti[i], hres);
release_interfaces(&w, &reOle, &txtDoc, &txtSel);
DeleteFileW(filename);
--
1.8.3.2
More information about the wine-patches
mailing list