[PATCH 2/6] riched20: Implement ITextDocument_fnOpen.

Jactry Zeng jactry92 at gmail.com
Tue Feb 11 12:05:43 CST 2014


-------------- next part --------------
From 58171a91474bd40ce64330981cf47d715027e00e Mon Sep 17 00:00:00 2001
From: Jactry Zeng <jactry92 at gmail.com>
Date: Tue, 11 Feb 2014 23:42:30 +0800
Subject: [PATCH 2/6] riched20: Implement ITextDocument_fnOpen.

---
 dlls/riched20/richole.c       | 65 +++++++++++++++++++++++++++++++++++++++++--
 dlls/riched20/tests/richole.c | 24 ++++++++--------
 2 files changed, 75 insertions(+), 14 deletions(-)

diff --git a/dlls/riched20/richole.c b/dlls/riched20/richole.c
index 6805873..1998851 100644
--- a/dlls/riched20/richole.c
+++ b/dlls/riched20/richole.c
@@ -582,8 +582,69 @@ 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 buf;
+    static const char RTFheader[] = "{\\rtf";
+
+    TRACE("(%p %p 0x%x %d)\n", me, pVar, Flags, CodePage);
+
+    if(V_VT(pVar) != VT_BSTR) return E_INVALIDARG;
+
+    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());
+      }
+
+    buf = HeapAlloc(GetProcessHeap(), 0, size+2);
+    if(!buf)
+      {
+        CloseHandle(hFile);
+        return E_OUTOFMEMORY;
+      }
+
+    if(!ReadFile(hFile, buf, size, &dwReadsize, NULL))
+      {
+        CloseHandle(hFile);
+        HeapFree(GetProcessHeap(), 0, buf);
+        return HRESULT_FROM_WIN32(GetLastError());
+      }
+
+    CloseHandle(hFile);
+    size = dwReadsize;
+
+    if(dwReadsize >= 2)
+      {
+        if((BYTE)buf[0] == 0xff && (BYTE)buf[1] == 0xfe)
+          settextex.codepage = 1200;
+        else if(dwReadsize >= 5 && !memcmp(RTFheader, buf, 5) && ((Flags & 0xf) == tomText))
+          FIXME("Partial stub! Don't support RTF file with tomRTF\n");
+      }
+
+    buf[size] = 0;
+    buf[size+1] = 0;
+
+    if(settextex.codepage == 1200)
+      SendMessageW(This->editor->hWnd, EM_SETTEXTEX, (int)&settextex, (LPARAM)(buf+sizeof(WCHAR)));
+    else SendMessageW(This->editor->hWnd, EM_SETTEXTEX, (int)&settextex, (LPARAM)buf);
+
+    HeapFree(GetProcessHeap(), 0, buf);
+    return S_OK;
 }
 
 static HRESULT WINAPI
diff --git a/dlls/riched20/tests/richole.c b/dlls/riched20/tests/richole.c
index 3781e68..e347eed 100644
--- a/dlls/riched20/tests/richole.c
+++ b/dlls/riched20/tests/richole.c
@@ -199,7 +199,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);
@@ -207,7 +207,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);
@@ -218,7 +218,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);
@@ -226,7 +226,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);
@@ -290,12 +290,12 @@ static void test_ITextDocument_Open(void)
 
   create_interfaces(&w, &reOle, &txtDoc, &txtSel);
   hres = ITextDocument_Open(txtDoc, &testfile, tomOpenExisting, CP_ACP);
-  todo_wine ok(hres == HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND), "ITextDocument_Open should fail Codepage:CP_ACP\n");
+  ok(hres == HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND), "ITextDocument_Open should fail Codepage:CP_ACP\n");
   release_interfaces(&w, &reOle, &txtDoc, &txtSel);
 
   create_interfaces(&w, &reOle, &txtDoc, &txtSel);
   hres = ITextDocument_Open(txtDoc, &testfile, tomOpenExisting, CP_UTF8);
-  todo_wine ok(hres == HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND), "ITextDocument_Open should fail Codepage:CP_UTF8\n");
+  ok(hres == HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND), "ITextDocument_Open should fail Codepage:CP_UTF8\n");
   release_interfaces(&w, &reOle, &txtDoc, &txtSel);
 
   create_interfaces(&w, &reOle, &txtDoc, &txtSel);
@@ -347,9 +347,9 @@ static void test_ITextDocument_Open(void)
   create_interfaces(&w, &reOle, &txtDoc, &txtSel);
   ITextDocument_Open(txtDoc, &testfile, tomReadOnly, CP_ACP);
   result = SendMessageA(w, WM_GETTEXT, 1024, (LPARAM)bufACP);
-  todo_wine ok(result == 12, "ITextDocument_Open: Test ASCII returned %d, expected 12\n", result);
+  ok(result == 12, "ITextDocument_Open: Test ASCII returned %d, expected 12\n", result);
   result = strcmp(bufACP, chACP);
-  todo_wine ok(result == 0, "ITextDocument_Open: Test ASCII set wrong text: Result: %s\n", bufACP);
+  ok(result == 0, "ITextDocument_Open: Test ASCII set wrong text: Result: %s\n", bufACP);
   release_interfaces(&w, &reOle, &txtDoc, &txtSel);
   DeleteFileW(filename);
 
@@ -360,9 +360,9 @@ static void test_ITextDocument_Open(void)
   create_interfaces(&w, &reOle, &txtDoc, &txtSel);
   ITextDocument_Open(txtDoc, &testfile, tomReadOnly, CP_UTF8);
   result = SendMessageA(w, WM_GETTEXT, 1024, (LPARAM)bufACP);
-  todo_wine ok(result == 15, "ITextDocument_Open: Test UTF-8 returned %d, expected 15\n", result);
+  ok(result == 15, "ITextDocument_Open: Test UTF-8 returned %d, expected 15\n", result);
   result = strcmp(bufACP, &chUTF8[3]);
-  todo_wine ok(result == 0, "ITextDocument_Open: Test UTF-8 set wrong text: Result: %s\n", bufACP);
+  ok(result == 0, "ITextDocument_Open: Test UTF-8 set wrong text: Result: %s\n", bufACP);
   release_interfaces(&w, &reOle, &txtDoc, &txtSel);
   DeleteFileW(filename);
 
@@ -373,9 +373,9 @@ static void test_ITextDocument_Open(void)
   create_interfaces(&w, &reOle, &txtDoc, &txtSel);
   ITextDocument_Open(txtDoc, &testfile, tomReadOnly, 1200);
   result = SendMessageW(w, WM_GETTEXT, 1024, (LPARAM)bufUnicode);
-  todo_wine ok(result == 12, "ITextDocument_Open: Test UTF-16 returned %d, expected 12\n", result);
+  ok(result == 12, "ITextDocument_Open: Test UTF-16 returned %d, expected 12\n", result);
   result = lstrcmpW(bufUnicode, &chUTF16[1]);
-  todo_wine ok(result == 0, "ITextDocument_Open: Test UTF-16 set wrong text: Result: %s\n", wine_dbgstr_w(bufUnicode));
+  ok(result == 0, "ITextDocument_Open: Test UTF-16 set wrong text: Result: %s\n", wine_dbgstr_w(bufUnicode));
   release_interfaces(&w, &reOle, &txtDoc, &txtSel);
   DeleteFileW(filename);
 }
-- 
1.8.3.2



More information about the wine-patches mailing list