Implementation of ITextDocument_fnOpen needs some advice

Jactry Zeng jactry92 at gmail.com
Sun Sep 8 01:28:51 CDT 2013


Hi folks,

  I need your advice or comment!

  Implement ITextDocument_fnOpen[0] (riched20) is a part of work to my
GSoC. The 'pencils down' date is
coming. And I think it is time to clear the code up.

  This series of patches is the implementation of ITextDocument_fnOpen. I
would like to improve it to be
enough good for sending to wine-patches and being accepted.

I split the implementation into six patches:
  - patch 0001 is just a simple implementation;
  - patch 0002 added the creation mode to let it support these
parameters: tomCreateNew, tomCreateAlways,
tomOpenExisting, tomOpenAlways, tomTruncateExisting;
  - patch 0003 added the access mode to let support tomReadOnly and any
combination of tomReadOnly and
tomShareDenyRead, tomShareDenyWrite, tomPasteFile;
  - patch 0004 added the support of RTF
  - patch 0005 added tomPasteFile support
  - patch 0006 added a UTF-16 support, with this patch you can open a UTF-6
text file without dependence of
the long CodePage parameter.

If you want to open a utf-8 text file with it, you may need these patch to
fix a bug of EM_SETTEXTEX:
http://source.winehq.org/patches/data/98574
http://source.winehq.org/patches/data/98575
http://source.winehq.org/patches/data/98576
http://source.winehq.org/patches/data/98577

  I appreciate for any comment! :)
  Thank you.


** Thanks my mentor Huw and Qian Hong for giving me a lot good advice.
Thanks other people for help! **



[0]
http://msdn.microsoft.com/en-us/library/windows/desktop/bb774093(v=vs.85).aspx
-- 
Regards,
Jactry Zeng
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.winehq.org/pipermail/wine-devel/attachments/20130908/ecdce7a6/attachment-0001.html>
-------------- next part --------------
From 1d1cd63088503c171b4979d624ea03a3120a00e7 Mon Sep 17 00:00:00 2001
From: Jactry Zeng <jactry92 at gmail.com>
Date: Sat, 7 Sep 2013 16:29:46 +0800
Subject: [PATCH 1/6] riched20: Implement ITextDocument_fnOpen.

---
 dlls/riched20/richole.c       |   47 +++++++++++++++++++++++++++++++++++++++--
 dlls/riched20/tests/richole.c |    8 +++----
 2 files changed, 49 insertions(+), 6 deletions(-)

diff --git a/dlls/riched20/richole.c b/dlls/riched20/richole.c
index 6805873..e7da55f 100644
--- a/dlls/riched20/richole.c
+++ b/dlls/riched20/richole.c
@@ -582,8 +582,51 @@ 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;
+
+    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(), HEAP_ZERO_MEMORY, size+2);
+    if(!chBuffer)
+    {
+        CloseHandle(hFile);
+        return HRESULT_FROM_WIN32(GetLastError());
+    }
+
+    if(!ReadFile(hFile, chBuffer, size, &dwReadSize, NULL))
+    {
+        CloseHandle(hFile);
+        HeapFree(GetProcessHeap(), 0, chBuffer);
+        return HRESULT_FROM_WIN32(GetLastError());
+    }
+
+    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 1bd0be9..6f2ed17 100644
--- a/dlls/riched20/tests/richole.c
+++ b/dlls/riched20/tests/richole.c
@@ -190,7 +190,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);
@@ -198,7 +198,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);
@@ -209,7 +209,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);
@@ -217,7 +217,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.7.10.4
-------------- next part --------------
From 8e4c922e6885cf81decfa63c030382a7e5311395 Mon Sep 17 00:00:00 2001
From: Jactry Zeng <jactry92 at gmail.com>
Date: Sat, 7 Sep 2013 16:45:07 +0800
Subject: [PATCH 2/6] riched20: Add creation mode support for
 ITextDocument_fnOpen.

---
 dlls/riched20/richole.c       |   25 +++++++++++++++++++++++--
 dlls/riched20/tests/richole.c |   34 +++++++++++++++++-----------------
 2 files changed, 40 insertions(+), 19 deletions(-)

diff --git a/dlls/riched20/richole.c b/dlls/riched20/richole.c
index e7da55f..bd8aa60 100644
--- a/dlls/riched20/richole.c
+++ b/dlls/riched20/richole.c
@@ -577,6 +577,25 @@ ITextDocument_fnNew(ITextDocument* me)
     return E_NOTIMPL;
 }
 
+static DWORD get_open_creation_mode(LONG Flags)
+{
+    switch(Flags & 0xf0)
+    {
+    case tomCreateNew:
+        return CREATE_NEW;
+    case tomCreateAlways:
+        return CREATE_ALWAYS;
+    case tomOpenExisting:
+        return OPEN_EXISTING;
+    case tomOpenAlways:
+        return OPEN_ALWAYS;
+    case tomTruncateExisting:
+        return TRUNCATE_EXISTING;
+    default:
+        return OPEN_ALWAYS;
+    }
+}
+
 static HRESULT WINAPI
 ITextDocument_fnOpen(ITextDocument* me, VARIANT* pVar, LONG Flags,
     LONG CodePage)
@@ -584,7 +603,7 @@ ITextDocument_fnOpen(ITextDocument* me, VARIANT* pVar, LONG Flags,
     IRichEditOleImpl *This = impl_from_ITextDocument(me);
 
     HANDLE hFile;
-    DWORD dwReadSize, size;
+    DWORD dwReadSize, size, creationMode;
     SETTEXTEX settextex;
     LPSTR chBuffer;
 
@@ -592,9 +611,11 @@ ITextDocument_fnOpen(ITextDocument* me, VARIANT* pVar, LONG Flags,
 
     if(V_VT(pVar) != VT_BSTR) return E_INVALIDARG;
 
+    creationMode = get_open_creation_mode(Flags);
+
     hFile = CreateFileW(V_BSTR(pVar), GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ|
                         FILE_SHARE_WRITE|FILE_SHARE_DELETE,
-                        NULL, OPEN_EXISTING, 0, NULL);
+                        NULL, creationMode, 0, NULL);
 
     if(hFile == INVALID_HANDLE_VALUE)
         return HRESULT_FROM_WIN32(GetLastError());
diff --git a/dlls/riched20/tests/richole.c b/dlls/riched20/tests/richole.c
index 6f2ed17..72dd06e 100644
--- a/dlls/riched20/tests/richole.c
+++ b/dlls/riched20/tests/richole.c
@@ -225,74 +225,74 @@ static void test_ITextDocument_Open(void)
 
   create_interfaces(&w, &reOle, &txtDoc, &txtSel);
   hres = ITextDocument_Open(txtDoc, &testfile, tomCreateAlways, CP_ACP);
-  todo_wine ok(hres == S_OK, "ITextDocument_Open should success Codepage:CP_ACP\n");
-  todo_wine ok(is_existing_file(filename), "ITextDocument_Open should create a file\n");
+  ok(hres == S_OK, "ITextDocument_Open should success Codepage:CP_ACP\n");
+  ok(is_existing_file(filename), "ITextDocument_Open should create a file\n");
   release_interfaces(&w, &reOle, &txtDoc, &txtSel);
   DeleteFileW(filename);
 
   create_interfaces(&w, &reOle, &txtDoc, &txtSel);
   hres = ITextDocument_Open(txtDoc, &testfile, tomCreateAlways, CP_UTF8);
-  todo_wine ok(hres == S_OK, "ITextDocument_Open should success Codepage:CP_UTF8\n");
-  todo_wine ok(is_existing_file(filename), "ITextDocument_Open should create a file\n");
+  ok(hres == S_OK, "ITextDocument_Open should success Codepage:CP_UTF8\n");
+  ok(is_existing_file(filename), "ITextDocument_Open should create a file\n");
   release_interfaces(&w, &reOle, &txtDoc, &txtSel);
   DeleteFileW(filename);
 
   create_interfaces(&w, &reOle, &txtDoc, &txtSel);
   hres = ITextDocument_Open(txtDoc, &testfile, tomOpenAlways, CP_ACP);
-  todo_wine ok(hres == S_OK, "ITextDocument_Open should success Codepage:CP_ACP\n");
-  todo_wine ok(is_existing_file(filename), "ITextDocument_Open should create a file\n");
+  ok(hres == S_OK, "ITextDocument_Open should success Codepage:CP_ACP\n");
+  ok(is_existing_file(filename), "ITextDocument_Open should create a file\n");
   release_interfaces(&w, &reOle, &txtDoc, &txtSel);
   DeleteFileW(filename);
 
   create_interfaces(&w, &reOle, &txtDoc, &txtSel);
   hres = ITextDocument_Open(txtDoc, &testfile, tomOpenAlways, CP_UTF8);
-  todo_wine ok(hres == S_OK, "ITextDocument_Open should success Codepage:CP_UTF8\n");
-  todo_wine ok(is_existing_file(filename), "ITextDocument_Open should create a file\n");
+  ok(hres == S_OK, "ITextDocument_Open should success Codepage:CP_UTF8\n");
+  ok(is_existing_file(filename), "ITextDocument_Open should create a file\n");
   release_interfaces(&w, &reOle, &txtDoc, &txtSel);
   DeleteFileW(filename);
 
   create_interfaces(&w, &reOle, &txtDoc, &txtSel);
   hres = ITextDocument_Open(txtDoc, &testfile, tomCreateNew, CP_ACP);
-  todo_wine ok(hres == S_OK, "ITextDocument_Open should success Codepage:CP_ACP\n");
-  todo_wine ok(is_existing_file(filename), "ITextDocument_Open should create a file\n");
+  ok(hres == S_OK, "ITextDocument_Open should success Codepage:CP_ACP\n");
+  ok(is_existing_file(filename), "ITextDocument_Open should create a file\n");
   release_interfaces(&w, &reOle, &txtDoc, &txtSel);
   DeleteFileW(filename);
 
   create_interfaces(&w, &reOle, &txtDoc, &txtSel);
   hres = ITextDocument_Open(txtDoc, &testfile, tomCreateNew, CP_UTF8);
-  todo_wine ok(hres == S_OK, "ITextDocument_Open should success Codepage:CP_UTF8\n");
-  todo_wine ok(is_existing_file(filename), "ITextDocument_Open should create a file\n");
+  ok(hres == S_OK, "ITextDocument_Open should success Codepage:CP_UTF8\n");
+  ok(is_existing_file(filename), "ITextDocument_Open should create a file\n");
   release_interfaces(&w, &reOle, &txtDoc, &txtSel);
   DeleteFileW(filename);
 
   create_interfaces(&w, &reOle, &txtDoc, &txtSel);
   touch_file(filename);
   hres = ITextDocument_Open(txtDoc, &testfile, tomCreateNew, CP_ACP);
-  todo_wine ok(hres == HRESULT_FROM_WIN32(ERROR_FILE_EXISTS), "ITextDocument_Open should fail Codepage:CP_ACP\n");
+  ok(hres == HRESULT_FROM_WIN32(ERROR_FILE_EXISTS), "ITextDocument_Open should fail Codepage:CP_ACP\n");
   release_interfaces(&w, &reOle, &txtDoc, &txtSel);
   DeleteFileW(filename);
 
   create_interfaces(&w, &reOle, &txtDoc, &txtSel);
   touch_file(filename);
   hres = ITextDocument_Open(txtDoc, &testfile, tomCreateNew, CP_UTF8);
-  todo_wine ok(hres == HRESULT_FROM_WIN32(ERROR_FILE_EXISTS), "ITextDocument_Open should fail Codepage:CP_UTF8\n");
+  ok(hres == HRESULT_FROM_WIN32(ERROR_FILE_EXISTS), "ITextDocument_Open should fail Codepage:CP_UTF8\n");
   release_interfaces(&w, &reOle, &txtDoc, &txtSel);
   DeleteFileW(filename);
 
   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);
   DeleteFileW(filename);
   ITextDocument_Open(txtDoc, &testfile, tomText, CP_ACP);
-  todo_wine ok(is_existing_file(filename) == TRUE, "a file should be created default\n");
+  ok(is_existing_file(filename) == TRUE, "a file should be created default\n");
   release_interfaces(&w, &reOle, &txtDoc, &txtSel);
   DeleteFileW(filename);
 
-- 
1.7.10.4
-------------- next part --------------
From a570cb25f4907ce6d04cd19fd39bf088b6ff73ac Mon Sep 17 00:00:00 2001
From: Jactry Zeng <jactry92 at gmail.com>
Date: Sat, 7 Sep 2013 16:53:49 +0800
Subject: [PATCH 3/6] riched20: Add access mode support for
 ITextDocument_fnOpen.

---
 dlls/riched20/richole.c |   22 ++++++++++++++++++++--
 1 file changed, 20 insertions(+), 2 deletions(-)

diff --git a/dlls/riched20/richole.c b/dlls/riched20/richole.c
index bd8aa60..c75aefb 100644
--- a/dlls/riched20/richole.c
+++ b/dlls/riched20/richole.c
@@ -596,6 +596,23 @@ static DWORD get_open_creation_mode(LONG Flags)
     }
 }
 
+static DWORD get_open_access_mode(LONG Flags)
+{
+    switch(Flags & 0xf00)
+    {
+    case tomReadOnly:
+        return GENERIC_READ;
+    case tomReadOnly|tomShareDenyRead:
+        return GENERIC_READ;
+    case tomReadOnly|tomShareDenyWrite:
+        return GENERIC_READ;
+    case tomReadOnly|tomShareDenyRead|tomShareDenyWrite:
+        return GENERIC_READ;
+    default:
+        return GENERIC_READ|GENERIC_WRITE;
+    }
+}
+
 static HRESULT WINAPI
 ITextDocument_fnOpen(ITextDocument* me, VARIANT* pVar, LONG Flags,
     LONG CodePage)
@@ -603,7 +620,7 @@ ITextDocument_fnOpen(ITextDocument* me, VARIANT* pVar, LONG Flags,
     IRichEditOleImpl *This = impl_from_ITextDocument(me);
 
     HANDLE hFile;
-    DWORD dwReadSize, size, creationMode;
+    DWORD dwReadSize, size, creationMode, accessMode;
     SETTEXTEX settextex;
     LPSTR chBuffer;
 
@@ -612,8 +629,9 @@ ITextDocument_fnOpen(ITextDocument* me, VARIANT* pVar, LONG Flags,
     if(V_VT(pVar) != VT_BSTR) return E_INVALIDARG;
 
     creationMode = get_open_creation_mode(Flags);
+    accessMode = get_open_access_mode(Flags);
 
-    hFile = CreateFileW(V_BSTR(pVar), GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ|
+    hFile = CreateFileW(V_BSTR(pVar), accessMode, FILE_SHARE_READ|
                         FILE_SHARE_WRITE|FILE_SHARE_DELETE,
                         NULL, creationMode, 0, NULL);
 
-- 
1.7.10.4
-------------- next part --------------
From 0a07e329c816b9be02666f2a775e1eec748a7624 Mon Sep 17 00:00:00 2001
From: Jactry Zeng <jactry92 at gmail.com>
Date: Sun, 8 Sep 2013 12:45:22 +0800
Subject: [PATCH 4/6] riched20: Add RTF support for ITextDocument_fnOpen.

---
 dlls/riched20/richole.c |   34 ++++++++++++++++++++++++++++++++++
 1 file changed, 34 insertions(+)

diff --git a/dlls/riched20/richole.c b/dlls/riched20/richole.c
index c75aefb..3da8653 100644
--- a/dlls/riched20/richole.c
+++ b/dlls/riched20/richole.c
@@ -613,6 +613,17 @@ static DWORD get_open_access_mode(LONG Flags)
     }
 }
 
+static DWORD CALLBACK stream_in(DWORD_PTR hFile, LPBYTE buffer, LONG cb, LONG *pcb)
+{
+    DWORD read;
+
+    if(!ReadFile((HANDLE)hFile, buffer, cb, &read, 0))
+        return 1;
+
+    *pcb = read;
+    return 0;
+}
+
 static HRESULT WINAPI
 ITextDocument_fnOpen(ITextDocument* me, VARIANT* pVar, LONG Flags,
     LONG CodePage)
@@ -621,6 +632,9 @@ ITextDocument_fnOpen(ITextDocument* me, VARIANT* pVar, LONG Flags,
 
     HANDLE hFile;
     DWORD dwReadSize, size, creationMode, accessMode;
+    static const char header[] = "{\\rtf";
+    char beginHex[5];
+    DWORD readOut;
     SETTEXTEX settextex;
     LPSTR chBuffer;
 
@@ -638,6 +652,26 @@ ITextDocument_fnOpen(ITextDocument* me, VARIANT* pVar, LONG Flags,
     if(hFile == INVALID_HANDLE_VALUE)
         return HRESULT_FROM_WIN32(GetLastError());
 
+    ReadFile(hFile, beginHex, 5, &readOut, NULL);
+    SetFilePointer(hFile, 0, NULL, FILE_BEGIN);
+
+    /* Open a rtf with tomText. */
+    if(readOut >= 5 && !memcmp(header, beginHex, 5) && ((Flags & 0xf) == tomText))
+    {
+        EDITSTREAM editstream;
+
+        editstream.dwCookie = (DWORD_PTR)hFile;
+        editstream.pfnCallback = stream_in;
+
+        if((Flags & 0xf000) == tomPasteFile)
+            SendMessageW(This->editor->hWnd, EM_STREAMIN, SF_TEXT|SFF_SELECTION, (LPARAM)&editstream);
+        else
+            SendMessageW(This->editor->hWnd, EM_STREAMIN, SF_TEXT, (LPARAM)&editstream);
+
+        CloseHandle(hFile);
+        return S_OK;
+    }
+
     settextex.codepage = CodePage;
     settextex.flags = ST_DEFAULT;
 
-- 
1.7.10.4
-------------- next part --------------
From 8b6c9c44258271ea521c254aaab657f2a36b455c Mon Sep 17 00:00:00 2001
From: Jactry Zeng <jactry92 at gmail.com>
Date: Sun, 8 Sep 2013 12:57:01 +0800
Subject: [PATCH 5/6] riched20: Add tomPasteFile support for
 ITextDocument_fnOpen.

---
 dlls/riched20/richole.c |    6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/dlls/riched20/richole.c b/dlls/riched20/richole.c
index 3da8653..55dbda1 100644
--- a/dlls/riched20/richole.c
+++ b/dlls/riched20/richole.c
@@ -634,6 +634,7 @@ ITextDocument_fnOpen(ITextDocument* me, VARIANT* pVar, LONG Flags,
     DWORD dwReadSize, size, creationMode, accessMode;
     static const char header[] = "{\\rtf";
     char beginHex[5];
+    LONG flags;
     DWORD readOut;
     SETTEXTEX settextex;
     LPSTR chBuffer;
@@ -672,8 +673,11 @@ ITextDocument_fnOpen(ITextDocument* me, VARIANT* pVar, LONG Flags,
         return S_OK;
     }
 
+    if((Flags & 0xf000) == tomPasteFile) flags = ST_SELECTION|ST_DEFAULT;
+    else flags = ST_DEFAULT;
+
     settextex.codepage = CodePage;
-    settextex.flags = ST_DEFAULT;
+    settextex.flags = flags;
 
     size = GetFileSize(hFile, NULL);
     if(size == INVALID_FILE_SIZE)
-- 
1.7.10.4
-------------- next part --------------
From 02e8f59926c80469f1b42285a74db4bcb7b6df67 Mon Sep 17 00:00:00 2001
From: Jactry Zeng <jactry92 at gmail.com>
Date: Sun, 8 Sep 2013 13:03:10 +0800
Subject: [PATCH 6/6] riched20: Add UTF-16 support for ITextDocument_fnOpen.

---
 dlls/riched20/richole.c |    9 +++++++++
 1 file changed, 9 insertions(+)

diff --git a/dlls/riched20/richole.c b/dlls/riched20/richole.c
index 55dbda1..86f7617 100644
--- a/dlls/riched20/richole.c
+++ b/dlls/riched20/richole.c
@@ -676,9 +676,18 @@ ITextDocument_fnOpen(ITextDocument* me, VARIANT* pVar, LONG Flags,
     if((Flags & 0xf000) == tomPasteFile) flags = ST_SELECTION|ST_DEFAULT;
     else flags = ST_DEFAULT;
 
+    if(readOut >= 2 && (BYTE)beginHex[0] == 0xff && (BYTE)beginHex[1] == 0xfe)
+    {
+        settextex.codepage = 1200;
+        settextex.flags = flags;
+        goto end;
+    }
+
     settextex.codepage = CodePage;
     settextex.flags = flags;
+    goto end;
 
+end:
     size = GetFileSize(hFile, NULL);
     if(size == INVALID_FILE_SIZE)
     {
-- 
1.7.10.4


More information about the wine-devel mailing list