[PATCH 2/2] ole32: Fix the HGLOBAL stream Seek implementation. [try 2]

Reece Dunn msclrhd at googlemail.com
Wed Feb 24 18:24:16 CST 2010


Hi,

This fixes the todo_wine blocks in the ole32:hglobalstream tests.

- Reece
-------------- next part --------------
From 68e53c4606d4dbccd817697534ab0cd0af220285 Mon Sep 17 00:00:00 2001
From: Reece Dunn <msclrhd at gmail.com>
Date: Thu, 25 Feb 2010 00:18:55 +0000
Subject: [PATCH 2/2] ole32: Fix the HGLOBAL stream Seek implementation.

---
 dlls/ole32/hglobalstream.c       |   20 +++++++++++++-------
 dlls/ole32/tests/hglobalstream.c |   14 --------------
 2 files changed, 13 insertions(+), 21 deletions(-)

diff --git a/dlls/ole32/hglobalstream.c b/dlls/ole32/hglobalstream.c
index c43d499..7a08393 100644
--- a/dlls/ole32/hglobalstream.c
+++ b/dlls/ole32/hglobalstream.c
@@ -365,11 +365,18 @@ static HRESULT WINAPI HGLOBALStreamImpl_Seek(
 {
   HGLOBALStreamImpl* const This=(HGLOBALStreamImpl*)iface;
 
-  ULARGE_INTEGER newPosition;
+  ULARGE_INTEGER newPosition = This->currentPosition;
+  HRESULT hr = S_OK;
 
   TRACE("(%p, %x%08x, %d, %p)\n", iface, dlibMove.u.HighPart,
 	dlibMove.u.LowPart, dwOrigin, plibNewPosition);
 
+  if (dlibMove.u.LowPart >= 0x80000000)
+  {
+    hr = STG_E_SEEKERROR;
+    goto end;
+  }
+
   /*
    * The file pointer is moved depending on the given "function"
    * parameter.
@@ -381,13 +388,12 @@ static HRESULT WINAPI HGLOBALStreamImpl_Seek(
       newPosition.u.LowPart = 0;
       break;
     case STREAM_SEEK_CUR:
-      newPosition = This->currentPosition;
       break;
     case STREAM_SEEK_END:
       newPosition = This->streamSize;
       break;
     default:
-      return STG_E_INVALIDFUNCTION;
+      hr = STG_E_SEEKERROR;
   }
 
   /*
@@ -395,14 +401,14 @@ static HRESULT WINAPI HGLOBALStreamImpl_Seek(
    * If the file pointer ends-up after the end of the stream, the next Write operation will
    * make the file larger. This is how it is documented.
    */
-  if (dlibMove.QuadPart < 0 && newPosition.QuadPart < -dlibMove.QuadPart) return STG_E_INVALIDFUNCTION;
-
-  newPosition.QuadPart += dlibMove.QuadPart;
+  newPosition.u.HighPart = 0;
+  newPosition.u.LowPart += dlibMove.u.LowPart;
 
+end:
   if (plibNewPosition) *plibNewPosition = newPosition;
   This->currentPosition = newPosition;
 
-  return S_OK;
+  return hr;
 }
 
 /***
diff --git a/dlls/ole32/tests/hglobalstream.c b/dlls/ole32/tests/hglobalstream.c
index 585ba31..1a164d6 100644
--- a/dlls/ole32/tests/hglobalstream.c
+++ b/dlls/ole32/tests/hglobalstream.c
@@ -97,11 +97,8 @@ static void test_streamonhglobal(IStream *pStream)
     ll.u.HighPart = 0;
     ll.u.LowPart = 0;
     hr = IStream_Seek(pStream, ll, STREAM_SEEK_END+1, &ull);
-    todo_wine
     ok(hr == STG_E_SEEKERROR, "IStream_Seek should have returned STG_E_SEEKERROR instead of 0x%08x\n", hr);
-    todo_wine
     ok(ull.u.LowPart == sizeof(data), "should have set LowPart to %d instead of %d\n", sizeof(data), ull.u.LowPart);
-    todo_wine
     ok(ull.u.HighPart == 0, "should not have changed HighPart, got %d\n", ull.u.HighPart);
 
     /* IStream_Seek -- valid position argument (seek to beginning) */
@@ -140,11 +137,8 @@ static void test_streamonhglobal(IStream *pStream)
     ll.u.HighPart = -1;
     ll.u.LowPart = 0;
     hr = IStream_Seek(pStream, ll, STREAM_SEEK_CUR, &ull);
-    todo_wine
     ok_ole_success(hr, "IStream_Seek");
-    todo_wine
     ok(ull.u.LowPart == sizeof(data), "should have set LowPart to %d instead of %d\n", sizeof(data), ull.u.LowPart);
-    todo_wine
     ok(ull.u.HighPart == 0, "should have set HighPart to 0 instead of %d\n", ull.u.HighPart);
 
     /* IStream_Seek -- ignore HighPart in the move value (seek to beginning) */
@@ -158,11 +152,8 @@ static void test_streamonhglobal(IStream *pStream)
     ll.u.HighPart = -1;
     ll.u.LowPart = 0;
     hr = IStream_Seek(pStream, ll, STREAM_SEEK_SET, &ull);
-    todo_wine
     ok_ole_success(hr, "IStream_Seek");
-    todo_wine
     ok(ull.u.LowPart == 0, "should have set LowPart to 0 instead of %d\n", ull.u.LowPart);
-    todo_wine
     ok(ull.u.HighPart == 0, "should have set HighPart to 0 instead of %d\n", ull.u.HighPart);
 
     /* IStream_Seek -- invalid LowPart value (seek from current position) */
@@ -176,9 +167,7 @@ static void test_streamonhglobal(IStream *pStream)
     ll.u.HighPart = 0;
     ll.u.LowPart = 0x80000000;
     hr = IStream_Seek(pStream, ll, STREAM_SEEK_CUR, &ull);
-    todo_wine
     ok(hr == STG_E_SEEKERROR, "IStream_Seek should have returned STG_E_SEEKERROR instead of 0x%08x\n", hr);
-    todo_wine
     ok(ull.u.LowPart == sizeof(data), "should have set LowPart to %d instead of %d\n", sizeof(data), ull.u.LowPart);
     ok(ull.u.HighPart == 0, "should have set HighPart to 0 instead of %d\n", ull.u.HighPart);
 
@@ -193,9 +182,7 @@ static void test_streamonhglobal(IStream *pStream)
     ll.u.HighPart = 0;
     ll.u.LowPart = 0x80000000;
     hr = IStream_Seek(pStream, ll, STREAM_SEEK_SET, &ull);
-    todo_wine
     ok(hr == STG_E_SEEKERROR, "IStream_Seek should have returned STG_E_SEEKERROR instead of 0x%08x\n", hr);
-    todo_wine
     ok(ull.u.LowPart == sizeof(data), "should have set LowPart to %d instead of %d\n", sizeof(data), ull.u.LowPart);
     ok(ull.u.HighPart == 0, "should have set HighPart to 0 instead of %d\n", ull.u.HighPart);
 
@@ -242,7 +229,6 @@ static void test_streamonhglobal(IStream *pStream)
     hr = IStream_Seek(pStream, ll, STREAM_SEEK_CUR, &ull);
     ok_ole_success(hr, "IStream_Seek");
     ok(ull.u.LowPart == 0x00000007, "should have set LowPart to 0x00000007 instead of %08x\n", ull.u.LowPart);
-    todo_wine
     ok(ull.u.HighPart == 0, "should have set HighPart to 0 instead of %d\n", ull.u.HighPart);
 
     hr = IStream_Commit(pStream, STGC_DEFAULT);
-- 
1.6.3.3


More information about the wine-patches mailing list