StgOpenStorage(..., STGM_READ | STGM_TRANSACTED, ...) should succeed Used e.g with CueCards2000

Uwe Bonnes bon at elektron.ikp.physik.tu-darmstadt.de
Mon Nov 15 10:38:11 CST 2010


---
 dlls/ole32/storage32.c       |    9 +++++++++
 dlls/ole32/tests/storage32.c |   10 +++++++++-
 2 files changed, 18 insertions(+), 1 deletions(-)

diff --git a/dlls/ole32/storage32.c b/dlls/ole32/storage32.c
index 311f2ae..0ea02f6 100644
--- a/dlls/ole32/storage32.c
+++ b/dlls/ole32/storage32.c
@@ -7546,6 +7546,7 @@ HRESULT WINAPI StgOpenStorage(
       case STGM_SHARE_DENY_WRITE:
         break;
       default:
+        TRACE("Invalid Share mode\n");  
         hr = STG_E_INVALIDFLAG;
         goto end;
     }
@@ -7553,6 +7554,7 @@ HRESULT WINAPI StgOpenStorage(
   if ( FAILED( validateSTGM(grfMode) ) ||
        (grfMode&STGM_CREATE))
   {
+    TRACE("Invalid Create mode\n");  
     hr = STG_E_INVALIDFLAG;
     goto end;
   }
@@ -7562,6 +7564,7 @@ HRESULT WINAPI StgOpenStorage(
       STGM_ACCESS_MODE(grfMode) == STGM_READWRITE &&
      !(grfMode&STGM_TRANSACTED) )
   {
+    TRACE("Invalid Transaction mode\n");  
     hr = STG_E_INVALIDFLAG;
     goto end;
   }
@@ -7962,6 +7965,9 @@ static HRESULT validateSTGM(DWORD stgm)
     return E_FAIL;
   }
 
+  if (stgm == STGM_TRANSACTED)
+    return S_OK;
+
   switch (share)
   {
   case STGM_SHARE_DENY_NONE:
@@ -8022,6 +8028,9 @@ static HRESULT validateSTGM(DWORD stgm)
  */
 static DWORD GetShareModeFromSTGM(DWORD stgm)
 {
+  if (stgm == STGM_TRANSACTED)
+    return FILE_SHARE_READ | FILE_SHARE_WRITE;
+
   switch (STGM_SHARE_MODE(stgm))
   {
   case STGM_SHARE_DENY_NONE:
diff --git a/dlls/ole32/tests/storage32.c b/dlls/ole32/tests/storage32.c
index 9bd8f33..1fa427e 100644
--- a/dlls/ole32/tests/storage32.c
+++ b/dlls/ole32/tests/storage32.c
@@ -522,7 +522,15 @@ static void test_open_storage(void)
     r = StgOpenStorage( filename, NULL, STGM_SHARE_DENY_WRITE | STGM_READWRITE, NULL, 0, &stg);
     ok(r==STG_E_INVALIDFLAG, "StgOpenStorage failed\n");
 
-    /* open it for real */
+     /* open it for real */
+    r = StgOpenStorage( filename, NULL,  STGM_READ | STGM_TRANSACTED, NULL, 0, &stg); /* CueCards2000 */
+    ok(r==S_OK, "STGM_READ | STGM_TRANSACTED should succeed\n");
+    if(stg)
+    {
+        r = IStorage_Release(stg);
+        ok(r == 0, "wrong ref count\n");
+    }
+
     r = StgOpenStorage( filename, NULL, STGM_SHARE_DENY_NONE | STGM_READ | STGM_TRANSACTED, NULL, 0, &stg); /* XLViewer 97/2000 */
     ok(r==S_OK, "StgOpenStorage failed\n");
     if(stg)
-- 
1.7.1




More information about the wine-patches mailing list