Mike McCormack : ole32: Add a test showing what STGM_TRANSACTED does for streams.

Alexandre Julliard julliard at wine.codeweavers.com
Mon Jul 31 04:32:09 CDT 2006


Module: wine
Branch: refs/heads/master
Commit: 24e69d544bb5858e2eda6ccaed112b7eaf30f0ff
URL:    http://source.winehq.org/git/?p=wine.git;a=commit;h=24e69d544bb5858e2eda6ccaed112b7eaf30f0ff

Author: Mike McCormack <mike at codeweavers.com>
Date:   Tue Aug  1 01:00:25 2006 +0900

ole32: Add a test showing what STGM_TRANSACTED does for streams.

---

 dlls/ole32/storage32.c       |    7 ++---
 dlls/ole32/tests/storage32.c |   59 ++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 62 insertions(+), 4 deletions(-)

diff --git a/dlls/ole32/storage32.c b/dlls/ole32/storage32.c
index 520689b..5119571 100644
--- a/dlls/ole32/storage32.c
+++ b/dlls/ole32/storage32.c
@@ -323,7 +323,8 @@ static HRESULT WINAPI StorageBaseImpl_Op
   /*
    * Validate the STGM flags
    */
-  if ( FAILED( validateSTGM(grfMode) ))
+  if ( FAILED( validateSTGM(grfMode) ) ||
+       STGM_SHARE_MODE(grfMode) != STGM_SHARE_EXCLUSIVE)
   {
     res = STG_E_INVALIDFLAG;
     goto end;
@@ -332,9 +333,7 @@ static HRESULT WINAPI StorageBaseImpl_Op
   /*
    * As documented.
    */
-  if ( STGM_SHARE_MODE(grfMode) != STGM_SHARE_EXCLUSIVE ||
-        (grfMode & STGM_DELETEONRELEASE) ||
-        (grfMode & STGM_TRANSACTED) )
+  if ( (grfMode & STGM_DELETEONRELEASE) || (grfMode & STGM_TRANSACTED) )
   {
     res = STG_E_INVALIDFUNCTION;
     goto end;
diff --git a/dlls/ole32/tests/storage32.c b/dlls/ole32/tests/storage32.c
index 0ba82f2..f3b9b27 100644
--- a/dlls/ole32/tests/storage32.c
+++ b/dlls/ole32/tests/storage32.c
@@ -835,6 +835,64 @@ static void test_streamenum(void)
     DeleteFileW(filename);
 }
 
+static void test_transact(void)
+{
+    static const WCHAR szPrefix[] = { 's','t','g',0 };
+    static const WCHAR szDot[] = { '.',0 };
+    WCHAR filename[MAX_PATH];
+    IStorage *stg = NULL;
+    HRESULT r;
+    IStream *stm = NULL;
+    static const WCHAR stmname[] = { 'C','O','N','T','E','N','T','S',0 };
+
+    if(!GetTempFileNameW(szDot, szPrefix, 0, filename))
+        return;
+
+    DeleteFileW(filename);
+
+    /* create the file */
+    r = StgCreateDocfile( filename, STGM_CREATE | STGM_SHARE_EXCLUSIVE | 
+                            STGM_READWRITE |STGM_TRANSACTED, 0, &stg);
+    ok(r==S_OK, "StgCreateDocfile failed\n");
+
+    /* now create a stream, but don't commit it */
+    r = IStorage_CreateStream(stg, stmname, STGM_SHARE_EXCLUSIVE | STGM_READWRITE, 0, 0, &stm );
+    ok(r==S_OK, "IStorage->CreateStream failed\n");
+
+    r = IStream_Release(stm);
+
+    IStorage_Release(stg);
+
+    stm = NULL;
+    stg = NULL;
+    r = StgOpenStorage( filename, NULL, STGM_SHARE_DENY_NONE | STGM_READ | STGM_TRANSACTED, NULL, 0, &stg);
+    ok(r==S_OK, "StgOpenStorage failed\n");
+
+    if (!stg)
+        return;
+
+    r = IStorage_OpenStream(stg, stmname, NULL, STGM_SHARE_DENY_NONE|STGM_READ, 0, &stm );
+    ok(r==STG_E_INVALIDFLAG, "IStorage->OpenStream failed %08lx\n", r);
+
+    r = IStorage_OpenStream(stg, stmname, NULL, STGM_DELETEONRELEASE|STGM_SHARE_EXCLUSIVE|STGM_READWRITE, 0, &stm );
+    ok(r==STG_E_INVALIDFUNCTION, "IStorage->OpenStream failed %08lx\n", r);
+
+    r = IStorage_OpenStream(stg, stmname, NULL, STGM_TRANSACTED|STGM_SHARE_EXCLUSIVE|STGM_READWRITE, 0, &stm );
+    ok(r==STG_E_INVALIDFUNCTION, "IStorage->OpenStream failed %08lx\n", r);
+
+    todo_wine {
+    r = IStorage_OpenStream(stg, stmname, NULL, STGM_SHARE_EXCLUSIVE|STGM_READWRITE, 0, &stm );
+    ok(r==STG_E_FILENOTFOUND, "IStorage->OpenStream should fail %08lx\n", r);
+    }
+
+    if (stm)
+        r = IStream_Release(stm);
+    IStorage_Release(stg);
+
+    r = DeleteFileW(filename);
+    ok( r == TRUE, "deleted file\n");
+}
+
 START_TEST(storage32)
 {
     test_hglobal_storage_stat();
@@ -844,4 +902,5 @@ START_TEST(storage32)
     test_storage_suminfo();
     test_storage_refcount();
     test_streamenum();
+    test_transact();
 }




More information about the wine-cvs mailing list