Module: wine Branch: master Commit: a06db6cce5f75339082ef6cd8156e65154ee3817 URL: http://source.winehq.org/git/wine.git/?a=commit;h=a06db6cce5f75339082ef6cd81...
Author: Nikolay Sivov nsivov@codeweavers.com Date: Thu Apr 18 10:04:40 2013 +0400
ole32: Stub for IDirectWriterLock.
---
dlls/ole32/storage32.c | 65 ++++++++++++++++++++++++++++++++++++++++- dlls/ole32/storage32.h | 1 + dlls/ole32/tests/storage32.c | 50 ++++++++++++++++++++++++++++++++ 3 files changed, 114 insertions(+), 2 deletions(-)
diff --git a/dlls/ole32/storage32.c b/dlls/ole32/storage32.c index 249d4d2..aa82b66 100644 --- a/dlls/ole32/storage32.c +++ b/dlls/ole32/storage32.c @@ -71,6 +71,11 @@ static inline StorageBaseImpl *impl_from_IStorage( IStorage *iface ) return CONTAINING_RECORD(iface, StorageBaseImpl, IStorage_iface); }
+static inline StorageBaseImpl *impl_from_IDirectWriterLock( IDirectWriterLock *iface ) +{ + return CONTAINING_RECORD(iface, StorageBaseImpl, IDirectWriterLock_iface); +} + /**************************************************************************** * Storage32InternalImpl definitions. * @@ -380,6 +385,12 @@ static HRESULT WINAPI StorageBaseImpl_QueryInterface( { *ppvObject = &This->IPropertySetStorage_iface; } + /* locking interface is report for writer only */ + else if (IsEqualGUID(&IID_IDirectWriterLock, riid) && + (This->openFlags == (STGM_DIRECT_SWMR|STGM_READWRITE|STGM_SHARE_DENY_WRITE))) + { + *ppvObject = &This->IDirectWriterLock_iface; + } else return E_NOINTERFACE;
@@ -2648,6 +2659,55 @@ static HRESULT StorageImpl_GetFilename(StorageBaseImpl* iface, LPWSTR *result) return hr; }
+static HRESULT WINAPI directwriterlock_QueryInterface(IDirectWriterLock *iface, REFIID riid, void **obj) +{ + StorageBaseImpl *This = impl_from_IDirectWriterLock(iface); + return IStorage_QueryInterface(&This->IStorage_iface, riid, obj); +} + +static ULONG WINAPI directwriterlock_AddRef(IDirectWriterLock *iface) +{ + StorageBaseImpl *This = impl_from_IDirectWriterLock(iface); + return IStorage_AddRef(&This->IStorage_iface); +} + +static ULONG WINAPI directwriterlock_Release(IDirectWriterLock *iface) +{ + StorageBaseImpl *This = impl_from_IDirectWriterLock(iface); + return IStorage_Release(&This->IStorage_iface); +} + +static HRESULT WINAPI directwriterlock_WaitForWriteAccess(IDirectWriterLock *iface, DWORD timeout) +{ + StorageBaseImpl *This = impl_from_IDirectWriterLock(iface); + FIXME("(%p)->(%d): stub\n", This, timeout); + return E_NOTIMPL; +} + +static HRESULT WINAPI directwriterlock_ReleaseWriteAccess(IDirectWriterLock *iface) +{ + StorageBaseImpl *This = impl_from_IDirectWriterLock(iface); + FIXME("(%p): stub\n", This); + return E_NOTIMPL; +} + +static HRESULT WINAPI directwriterlock_HaveWriteAccess(IDirectWriterLock *iface) +{ + StorageBaseImpl *This = impl_from_IDirectWriterLock(iface); + FIXME("(%p): stub\n", This); + return E_NOTIMPL; +} + +static const IDirectWriterLockVtbl DirectWriterLockVtbl = +{ + directwriterlock_QueryInterface, + directwriterlock_AddRef, + directwriterlock_Release, + directwriterlock_WaitForWriteAccess, + directwriterlock_ReleaseWriteAccess, + directwriterlock_HaveWriteAccess +}; + /* * Virtual function table for the IStorage32Impl class. */ @@ -2719,6 +2779,7 @@ static HRESULT StorageImpl_Construct(
This->base.IStorage_iface.lpVtbl = &Storage32Impl_Vtbl; This->base.IPropertySetStorage_iface.lpVtbl = &IPropertySetStorage_Vtbl; + This->base.IDirectWriterLock_iface.lpVtbl = &DirectWriterLockVtbl; This->base.baseVtbl = &StorageImpl_BaseVtbl; This->base.openFlags = (openFlags & ~STGM_CREATE); This->base.ref = 1; @@ -7631,10 +7692,10 @@ HRESULT WINAPI StgOpenStorage( goto end; }
- /* shared reading requires transacted mode */ + /* shared reading requires transacted or single writer mode */ if( STGM_SHARE_MODE(grfMode) == STGM_SHARE_DENY_WRITE && STGM_ACCESS_MODE(grfMode) == STGM_READWRITE && - !(grfMode&STGM_TRANSACTED) ) + !(grfMode & STGM_TRANSACTED) && !(grfMode & STGM_DIRECT_SWMR)) { hr = STG_E_INVALIDFLAG; goto end; diff --git a/dlls/ole32/storage32.h b/dlls/ole32/storage32.h index f2061f3..b037847 100644 --- a/dlls/ole32/storage32.h +++ b/dlls/ole32/storage32.h @@ -177,6 +177,7 @@ struct StorageBaseImpl { IStorage IStorage_iface; IPropertySetStorage IPropertySetStorage_iface; /* interface for adding a properties stream */ + IDirectWriterLock IDirectWriterLock_iface; LONG ref;
/* diff --git a/dlls/ole32/tests/storage32.c b/dlls/ole32/tests/storage32.c index d6640c2..4f12d8b 100644 --- a/dlls/ole32/tests/storage32.c +++ b/dlls/ole32/tests/storage32.c @@ -3046,6 +3046,55 @@ static void test_convert(void) DeleteFileW(filename); }
+static void test_direct_swmr(void) +{ + static const WCHAR fileW[] = {'w','i','n','e','t','e','s','t',0}; + IDirectWriterLock *dwlock; + ULONG ref, ref2; + IStorage *stg; + HRESULT hr; + + /* it's possible to create in writer mode */ + hr = StgCreateDocfile(fileW, STGM_CREATE | STGM_READWRITE | STGM_SHARE_DENY_WRITE | STGM_DIRECT_SWMR, 0, &stg); +todo_wine + ok(hr == S_OK, "got %08x\n", hr); +if (hr == S_OK) { + IStorage_Release(stg); + DeleteFileW(fileW); +} + + 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); + + /* reader mode */ + hr = StgOpenStorage(fileW, NULL, STGM_DIRECT_SWMR | STGM_READ | STGM_SHARE_DENY_NONE, NULL, 0, &stg); + ok(hr == S_OK, "got %08x\n", hr); + + hr = IStorage_QueryInterface(stg, &IID_IDirectWriterLock, (void**)&dwlock); + ok(hr == E_NOINTERFACE, "got %08x\n", hr); + IStorage_Release(stg); + + /* writer mode */ + hr = StgOpenStorage(fileW, NULL, STGM_DIRECT_SWMR | STGM_READWRITE | STGM_SHARE_DENY_WRITE, NULL, 0, &stg); + ok(hr == S_OK, "got %08x\n", hr); + + ref = IStorage_AddRef(stg); + IStorage_Release(stg); + + hr = IStorage_QueryInterface(stg, &IID_IDirectWriterLock, (void**)&dwlock); + ok(hr == S_OK, "got %08x\n", hr); + + ref2 = IStorage_AddRef(stg); + IStorage_Release(stg); + ok(ref2 == ref + 1, "got %u\n", ref2); + + IDirectWriterLock_Release(dwlock); + IStorage_Release(stg); + + DeleteFileW(fileW); +} + START_TEST(storage32) { CHAR temp[MAX_PATH]; @@ -3090,4 +3139,5 @@ START_TEST(storage32) test_copyto_recursive(); test_hglobal_storage_creation(); test_convert(); + test_direct_swmr(); }