Huw Davies : ole32: In simple create mode the size returned by IStream_Stat is actually the current stream position .

Alexandre Julliard julliard at winehq.org
Tue Jun 2 08:44:30 CDT 2009


Module: wine
Branch: master
Commit: 02fc79b2c920412579e55e4c3d390ca487ee1e49
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=02fc79b2c920412579e55e4c3d390ca487ee1e49

Author: Huw Davies <huw at codeweavers.com>
Date:   Mon Jun  1 11:26:12 2009 +0100

ole32: In simple create mode the size returned by IStream_Stat is actually the current stream position.

---

 dlls/ole32/stg_stream.c      |    6 +++++
 dlls/ole32/tests/storage32.c |   44 ++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 50 insertions(+), 0 deletions(-)

diff --git a/dlls/ole32/stg_stream.c b/dlls/ole32/stg_stream.c
index d0e0613..3fde160 100644
--- a/dlls/ole32/stg_stream.c
+++ b/dlls/ole32/stg_stream.c
@@ -841,12 +841,18 @@ static HRESULT WINAPI StgStreamImpl_Stat(
 
   if (readSuccessful)
   {
+    StorageImpl *root = This->parentStorage->ancestorStorage;
+
     StorageUtl_CopyPropertyToSTATSTG(pstatstg,
 				     &curProperty,
 				     grfStatFlag);
 
     pstatstg->grfMode = This->grfMode;
 
+    /* In simple create mode cbSize is the current pos */
+    if((root->base.openFlags & STGM_SIMPLE) && root->create)
+      pstatstg->cbSize = This->currentPosition;
+
     return S_OK;
   }
 
diff --git a/dlls/ole32/tests/storage32.c b/dlls/ole32/tests/storage32.c
index b426d94..fa5d46c 100644
--- a/dlls/ole32/tests/storage32.c
+++ b/dlls/ole32/tests/storage32.c
@@ -1354,6 +1354,10 @@ static void test_simple(void)
     HRESULT r;
     IStream *stm;
     static const WCHAR stmname[] = { 'C','O','N','T','E','N','T','S',0 };
+    LARGE_INTEGER pos;
+    ULARGE_INTEGER upos;
+    DWORD count;
+    STATSTG stat;
 
     if(!GetTempFileNameW(szDot, szPrefix, 0, filename))
         return;
@@ -1368,11 +1372,51 @@ static void test_simple(void)
     r = IStorage_CreateStream(stg, stmname, STGM_SHARE_EXCLUSIVE | STGM_READWRITE, 0, 0, &stm);
     ok(r == S_OK, "got %08x\n", r);
 
+    upos.QuadPart = 6000;
+    r = IStream_SetSize(stm, upos);
+    ok(r == S_OK, "got %08x\n", r);
+
+    r = IStream_Write(stm, "foo", 3, &count);
+    ok(r == S_OK, "got %08x\n", r);
+    ok(count == 3, "got %d\n", count);
+
+    pos.QuadPart = 0;
+    r = IStream_Seek(stm, pos, STREAM_SEEK_CUR, &upos);
+    ok(r == S_OK, "got %08x\n", r);
+    ok(upos.QuadPart == 3, "got %d\n", upos.u.LowPart);
+
+    r = IStream_Stat(stm, &stat, STATFLAG_NONAME);
+    ok(r == S_OK, "got %08x\n", r);
+    ok(stat.cbSize.QuadPart == 3, "got %d\n", stat.cbSize.u.LowPart);
+
+    pos.QuadPart = 1;
+    r = IStream_Seek(stm, pos, STREAM_SEEK_SET, &upos);
+    ok(r == S_OK, "got %08x\n", r);
+    ok(upos.QuadPart == 1, "got %d\n", upos.u.LowPart);
+
+    r = IStream_Stat(stm, &stat, STATFLAG_NONAME);
+    ok(r == S_OK, "got %08x\n", r);
+    ok(stat.cbSize.QuadPart == 1, "got %d\n", stat.cbSize.u.LowPart);
+
     IStream_Release(stm);
 
     IStorage_Commit(stg, STGC_DEFAULT);
     IStorage_Release(stg);
 
+    r = StgOpenStorage( filename, NULL, STGM_SIMPLE | STGM_SHARE_EXCLUSIVE | STGM_READWRITE, NULL, 0, &stg);
+    ok(r == S_OK, "got %08x\n", r);
+
+    r = IStorage_OpenStream(stg, stmname, NULL, STGM_SHARE_EXCLUSIVE | STGM_READWRITE, 0, &stm);
+    ok(r == S_OK, "got %08x\n", r);
+
+    r = IStream_Stat(stm, &stat, STATFLAG_NONAME);
+    ok(r == S_OK, "got %08x\n", r);
+    ok(stat.cbSize.QuadPart == 6000, "got %d\n", stat.cbSize.u.LowPart);
+
+    IStream_Release(stm);
+
+    IStorage_Release(stg);
+
     DeleteFileW(filename);
 }
 




More information about the wine-cvs mailing list