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