Nikolay Sivov : ole32: Accept STGM_DIRECT_SWMR mode.

Alexandre Julliard julliard at winehq.org
Thu Apr 18 13:57:25 CDT 2013


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

Author: Nikolay Sivov <nsivov at codeweavers.com>
Date:   Thu Apr 18 01:25:23 2013 +0400

ole32: Accept STGM_DIRECT_SWMR mode.

---

 dlls/ole32/storage32.c       |   11 ++++++++++-
 dlls/ole32/tests/storage32.c |   17 ++++++++++++++++-
 2 files changed, 26 insertions(+), 2 deletions(-)

diff --git a/dlls/ole32/storage32.c b/dlls/ole32/storage32.c
index 1d64ab0..249d4d2 100644
--- a/dlls/ole32/storage32.c
+++ b/dlls/ole32/storage32.c
@@ -7604,7 +7604,16 @@ HRESULT WINAPI StgOpenStorage(
   /*
    * Validate the sharing mode
    */
-  if (!(grfMode & (STGM_TRANSACTED|STGM_PRIORITY)))
+  if (grfMode & STGM_DIRECT_SWMR)
+  {
+    if ((STGM_SHARE_MODE(grfMode) != STGM_SHARE_DENY_WRITE) &&
+        (STGM_SHARE_MODE(grfMode) != STGM_SHARE_DENY_NONE))
+    {
+      hr = STG_E_INVALIDFLAG;
+      goto end;
+    }
+  }
+  else if (!(grfMode & (STGM_TRANSACTED|STGM_PRIORITY)))
     switch(STGM_SHARE_MODE(grfMode))
     {
       case STGM_SHARE_EXCLUSIVE:
diff --git a/dlls/ole32/tests/storage32.c b/dlls/ole32/tests/storage32.c
index b9d41cd..d6640c2 100644
--- a/dlls/ole32/tests/storage32.c
+++ b/dlls/ole32/tests/storage32.c
@@ -1889,7 +1889,7 @@ static void test_access(void)
                           STGM_SHARE_EXCLUSIVE | STGM_DIRECT, 0, &stg);
     ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
 
-    test_file_access("winetest", create);
+    test_file_access(fileA, create);
 
     hr = IStorage_Commit(stg, STGC_DEFAULT);
     ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
@@ -1955,6 +1955,21 @@ static void test_access(void)
     test_file_access(fileA, create_close);
 
     DeleteFileA(fileA);
+
+    /* STGM_DIRECT_SWMR | STGM_READ | STGM_SHARE_DENY_NONE - reader mode for direct SWMR mode */
+    hr = StgCreateDocfile(fileW, STGM_CREATE | STGM_READWRITE | STGM_SHARE_DENY_WRITE | STGM_TRANSACTED, 0, &stg);
+    ok(hr == S_OK, "got %08x\n", hr);
+    IStorage_Release(stg);
+
+    hr = StgOpenStorage(fileW, NULL, STGM_DIRECT_SWMR | STGM_READ | STGM_SHARE_DENY_NONE, NULL, 0, &stg);
+    ok(hr == S_OK, "got %08x\n", hr);
+
+    test_file_access(fileA, create);
+
+    IStorage_Release(stg);
+    test_file_access(fileA, create_close);
+
+    DeleteFileA(fileA);
 }
 
 static void test_readonly(void)




More information about the wine-cvs mailing list