Nikolay Sivov : ole32: Stub for IDirectWriterLock.

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


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

Author: Nikolay Sivov <nsivov at 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();
 }




More information about the wine-cvs mailing list