riched20: Don't resend a partial chunk to the edit stream callbackif it sets *pcb to something less than cb.

Huw Davies huw at codeweavers.com
Tue Mar 17 04:39:38 CDT 2015


It's basically used as a boolean to terminate the writing process
if it's set to zero.
---
 dlls/riched20/tests/editor.c | 31 +++++++++++++++++++++++++++++++
 dlls/riched20/writer.c       | 23 ++++++-----------------
 2 files changed, 37 insertions(+), 17 deletions(-)

diff --git a/dlls/riched20/tests/editor.c b/dlls/riched20/tests/editor.c
index 101aec0..b15f16f 100644
--- a/dlls/riched20/tests/editor.c
+++ b/dlls/riched20/tests/editor.c
@@ -3404,6 +3404,24 @@ static void test_WM_SETTEXT(void)
 #undef TEST_SETTEXTW
 }
 
+/* Set *pcb to one to show that the remaining cb-1 bytes are not
+   resent to the callkack. */
+static DWORD CALLBACK test_esCallback_written_1(DWORD_PTR dwCookie,
+                                                LPBYTE pbBuff,
+                                                LONG cb,
+                                                LONG *pcb)
+{
+  char** str = (char**)dwCookie;
+  ok(cb == *pcb, "cb %d, *pcb %d\n", cb, *pcb);
+  *pcb = 0;
+  if (cb > 0) {
+    memcpy(*str, pbBuff, cb);
+    *str += cb;
+    *pcb = 1;
+  }
+  return 0;
+}
+
 static void test_EM_STREAMOUT(void)
 {
   HWND hwndRichEdit = new_richedit(NULL);
@@ -3452,6 +3470,19 @@ static void test_EM_STREAMOUT(void)
   ok(strcmp(buf, TestItem3) == 0,
         "streamed text different, got %s\n", buf);
 
+  /* Use a callback that sets *pcb to one */
+  p = buf;
+  es.dwCookie = (DWORD_PTR)&p;
+  es.dwError = 0;
+  es.pfnCallback = test_esCallback_written_1;
+  memset(buf, 0, sizeof(buf));
+  SendMessageA(hwndRichEdit, EM_STREAMOUT, SF_TEXT, (LPARAM)&es);
+  r = strlen(buf);
+  ok(r == 14, "streamed text length is %d, expecting 14\n", r);
+  ok(strcmp(buf, TestItem3) == 0,
+        "streamed text different, got %s\n", buf);
+
+
   DestroyWindow(hwndRichEdit);
 }
 
diff --git a/dlls/riched20/writer.c b/dlls/riched20/writer.c
index ea797fd..26a64a7 100644
--- a/dlls/riched20/writer.c
+++ b/dlls/riched20/writer.c
@@ -49,29 +49,18 @@ ME_StreamOutInit(ME_TextEditor *editor, EDITSTREAM *stream)
 static BOOL
 ME_StreamOutFlush(ME_OutStream *pStream)
 {
-  LONG nStart = 0;
   LONG nWritten = 0;
-  LONG nRemaining = 0;
   EDITSTREAM *stream = pStream->stream;
 
-  while (nStart < pStream->pos) {
-    TRACE("sending %u bytes\n", pStream->pos - nStart);
-    /* Some apps seem not to set *pcb unless a problem arises, relying
-      on initial random nWritten value, which is usually >STREAMOUT_BUFFER_SIZE */
-    nRemaining = pStream->pos - nStart;
-    nWritten = 0xDEADBEEF;
-    stream->dwError = stream->pfnCallback(stream->dwCookie, (LPBYTE)pStream->buffer + nStart,
-                                          pStream->pos - nStart, &nWritten);
+  if (pStream->pos) {
+    TRACE("sending %u bytes\n", pStream->pos);
+    nWritten = pStream->pos;
+    stream->dwError = stream->pfnCallback(stream->dwCookie, (LPBYTE)pStream->buffer,
+                                          pStream->pos, &nWritten);
     TRACE("error=%u written=%u\n", stream->dwError, nWritten);
-    if (nWritten > (pStream->pos - nStart) || nWritten<0) {
-      FIXME("Invalid returned written size *pcb: 0x%x (%d) instead of %d\n", 
-            (unsigned)nWritten, nWritten, nRemaining);
-      nWritten = nRemaining;
-    }
     if (nWritten == 0 || stream->dwError)
       return FALSE;
-    pStream->written += nWritten;
-    nStart += nWritten;
+    /* Don't resend partial chunks if nWritten < pStream->pos */
   }
   pStream->pos = 0;
   return TRUE;
-- 
1.8.0




More information about the wine-patches mailing list