Module: wine Branch: refs/heads/master Commit: 24e69d544bb5858e2eda6ccaed112b7eaf30f0ff URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=24e69d544bb5858e2eda6cca...
Author: Mike McCormack mike@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(); }