Nikolay Sivov : ole32: COM cleanup of storage IStream implementation.

Alexandre Julliard julliard at winehq.org
Fri Jul 13 14:11:18 CDT 2012


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

Author: Nikolay Sivov <nsivov at codeweavers.com>
Date:   Fri Jul 13 09:45:37 2012 +0400

ole32: COM cleanup of storage IStream implementation.

---

 dlls/ole32/stg_stream.c |   58 +++++++++++++++-------------------------------
 dlls/ole32/storage32.c  |   23 ++++++++++++------
 dlls/ole32/storage32.h  |   17 ++++++-------
 3 files changed, 42 insertions(+), 56 deletions(-)

diff --git a/dlls/ole32/stg_stream.c b/dlls/ole32/stg_stream.c
index b09ba5b..019a789 100644
--- a/dlls/ole32/stg_stream.c
+++ b/dlls/ole32/stg_stream.c
@@ -74,9 +74,6 @@ static void StgStreamImpl_Destroy(StgStreamImpl* This)
 
   This->parentStorage = 0;
 
-  /*
-   * Finally, free the memory used-up by the class.
-   */
   HeapFree(GetProcessHeap(), 0, This);
 }
 
@@ -89,41 +86,24 @@ static HRESULT WINAPI StgStreamImpl_QueryInterface(
 		  REFIID         riid,	      /* [in] */
 		  void**         ppvObject)   /* [iid_is][out] */
 {
-  StgStreamImpl* const This=(StgStreamImpl*)iface;
+  StgStreamImpl* This = impl_from_IStream(iface);
 
-  /*
-   * Perform a sanity check on the parameters.
-   */
   if (ppvObject==0)
     return E_INVALIDARG;
 
-  /*
-   * Initialize the return parameter.
-   */
   *ppvObject = 0;
 
-  /*
-   * Compare the riid with the interface IDs implemented by this object.
-   */
   if (IsEqualIID(&IID_IUnknown, riid) ||
       IsEqualIID(&IID_IPersist, riid) ||
       IsEqualIID(&IID_IPersistStream, riid) ||
       IsEqualIID(&IID_ISequentialStream, riid) ||
       IsEqualIID(&IID_IStream, riid))
   {
-    *ppvObject = This;
+    *ppvObject = &This->IStream_iface;
   }
-
-  /*
-   * Check that we obtained an interface.
-   */
-  if ((*ppvObject)==0)
+  else
     return E_NOINTERFACE;
 
-  /*
-   * Query Interface always increases the reference count by one when it is
-   * successful
-   */
   IStream_AddRef(iface);
 
   return S_OK;
@@ -136,7 +116,7 @@ static HRESULT WINAPI StgStreamImpl_QueryInterface(
 static ULONG WINAPI StgStreamImpl_AddRef(
 		IStream* iface)
 {
-  StgStreamImpl* const This=(StgStreamImpl*)iface;
+  StgStreamImpl* This = impl_from_IStream(iface);
   return InterlockedIncrement(&This->ref);
 }
 
@@ -147,7 +127,7 @@ static ULONG WINAPI StgStreamImpl_AddRef(
 static ULONG WINAPI StgStreamImpl_Release(
 		IStream* iface)
 {
-  StgStreamImpl* const This=(StgStreamImpl*)iface;
+  StgStreamImpl* This = impl_from_IStream(iface);
 
   ULONG ref;
 
@@ -179,7 +159,7 @@ static HRESULT WINAPI StgStreamImpl_Read(
 		  ULONG          cb,        /* [in] */
 		  ULONG*         pcbRead)   /* [out] */
 {
-  StgStreamImpl* const This=(StgStreamImpl*)iface;
+  StgStreamImpl* This = impl_from_IStream(iface);
 
   ULONG bytesReadBuffer;
   HRESULT res;
@@ -235,7 +215,7 @@ static HRESULT WINAPI StgStreamImpl_Write(
 		  ULONG          cb,          /* [in] */
 		  ULONG*         pcbWritten)  /* [out] */
 {
-  StgStreamImpl* const This=(StgStreamImpl*)iface;
+  StgStreamImpl* This = impl_from_IStream(iface);
 
   ULONG bytesWritten = 0;
   HRESULT res;
@@ -316,7 +296,7 @@ static HRESULT WINAPI StgStreamImpl_Seek(
 		  DWORD           dwOrigin,         /* [in] */
 		  ULARGE_INTEGER* plibNewPosition) /* [out] */
 {
-  StgStreamImpl* const This=(StgStreamImpl*)iface;
+  StgStreamImpl* This = impl_from_IStream(iface);
 
   ULARGE_INTEGER newPosition;
   DirEntry currentEntry;
@@ -389,7 +369,7 @@ static HRESULT WINAPI StgStreamImpl_SetSize(
 				     IStream*      iface,
 				     ULARGE_INTEGER  libNewSize)   /* [in] */
 {
-  StgStreamImpl* const This=(StgStreamImpl*)iface;
+  StgStreamImpl* This = impl_from_IStream(iface);
 
   HRESULT      hr;
 
@@ -441,7 +421,7 @@ static HRESULT WINAPI StgStreamImpl_CopyTo(
 				    ULARGE_INTEGER* pcbRead,      /* [out] */
 				    ULARGE_INTEGER* pcbWritten)   /* [out] */
 {
-  StgStreamImpl* const This=(StgStreamImpl*)iface;
+  StgStreamImpl* This = impl_from_IStream(iface);
   HRESULT        hr = S_OK;
   BYTE           tmpBuffer[128];
   ULONG          bytesRead, bytesWritten, copySize;
@@ -516,7 +496,7 @@ static HRESULT WINAPI StgStreamImpl_Commit(
 		  IStream*      iface,
 		  DWORD           grfCommitFlags)  /* [in] */
 {
-  StgStreamImpl* const This=(StgStreamImpl*)iface;
+  StgStreamImpl* This = impl_from_IStream(iface);
 
   if (!This->parentStorage)
   {
@@ -547,7 +527,7 @@ static HRESULT WINAPI StgStreamImpl_LockRegion(
 					ULARGE_INTEGER cb,          /* [in] */
 					DWORD          dwLockType)  /* [in] */
 {
-  StgStreamImpl* const This=(StgStreamImpl*)iface;
+  StgStreamImpl* This = impl_from_IStream(iface);
 
   if (!This->parentStorage)
   {
@@ -565,7 +545,7 @@ static HRESULT WINAPI StgStreamImpl_UnlockRegion(
 					  ULARGE_INTEGER cb,          /* [in] */
 					  DWORD          dwLockType)  /* [in] */
 {
-  StgStreamImpl* const This=(StgStreamImpl*)iface;
+  StgStreamImpl* This = impl_from_IStream(iface);
 
   if (!This->parentStorage)
   {
@@ -590,7 +570,7 @@ static HRESULT WINAPI StgStreamImpl_Stat(
 		  STATSTG*       pstatstg,     /* [out] */
 		  DWORD          grfStatFlag)  /* [in] */
 {
-  StgStreamImpl* const This=(StgStreamImpl*)iface;
+  StgStreamImpl* This = impl_from_IStream(iface);
 
   DirEntry     currentEntry;
   HRESULT      hr;
@@ -650,7 +630,7 @@ static HRESULT WINAPI StgStreamImpl_Clone(
 				   IStream*     iface,
 				   IStream**    ppstm) /* [out] */
 {
-  StgStreamImpl* const This=(StgStreamImpl*)iface;
+  StgStreamImpl* This = impl_from_IStream(iface);
   HRESULT hres;
   StgStreamImpl* new_stream;
   LARGE_INTEGER seek_pos;
@@ -672,7 +652,7 @@ static HRESULT WINAPI StgStreamImpl_Clone(
   if (!new_stream)
     return STG_E_INSUFFICIENTMEMORY; /* Currently the only reason for new_stream=0 */
 
-  *ppstm = (IStream*) new_stream;
+  *ppstm = &new_stream->IStream_iface;
   IStream_AddRef(*ppstm);
 
   seek_pos.QuadPart = This->currentPosition.QuadPart;
@@ -687,7 +667,7 @@ static HRESULT WINAPI StgStreamImpl_Clone(
 /*
  * Virtual function table for the StgStreamImpl class.
  */
-static const IStreamVtbl StgStreamImpl_Vtbl =
+static const IStreamVtbl StgStreamVtbl =
 {
     StgStreamImpl_QueryInterface,
     StgStreamImpl_AddRef,
@@ -725,12 +705,12 @@ StgStreamImpl* StgStreamImpl_Construct(
 
   newStream = HeapAlloc(GetProcessHeap(), 0, sizeof(StgStreamImpl));
 
-  if (newStream!=0)
+  if (newStream)
   {
     /*
      * Set-up the virtual function table and reference count.
      */
-    newStream->lpVtbl    = &StgStreamImpl_Vtbl;
+    newStream->IStream_iface.lpVtbl = &StgStreamVtbl;
     newStream->ref       = 0;
 
     newStream->parentStorage = parentStorage;
diff --git a/dlls/ole32/storage32.c b/dlls/ole32/storage32.c
index f233b61..95850d1 100644
--- a/dlls/ole32/storage32.c
+++ b/dlls/ole32/storage32.c
@@ -524,10 +524,10 @@ static HRESULT WINAPI StorageBaseImpl_OpenStream(
 
     newStream = StgStreamImpl_Construct(This, grfMode, streamEntryRef);
 
-    if (newStream!=0)
+    if (newStream)
     {
       newStream->grfMode = grfMode;
-      *ppstm = (IStream*)newStream;
+      *ppstm = &newStream->IStream_iface;
 
       IStream_AddRef(*ppstm);
 
@@ -1007,10 +1007,9 @@ static HRESULT WINAPI StorageBaseImpl_CreateStream(
    */
   newStream = StgStreamImpl_Construct(This, grfMode, newStreamEntryRef);
 
-  if (newStream != 0)
+  if (newStream)
   {
-    *ppstm = (IStream*)newStream;
-
+    *ppstm = &newStream->IStream_iface;
     IStream_AddRef(*ppstm);
   }
   else
@@ -1684,11 +1683,19 @@ static HRESULT StorageBaseImpl_CopyChildEntryTo(StorageBaseImpl *This,
        */
       if (hr == S_OK)
       {
-        pstrChild = (IStream*)StgStreamImpl_Construct(This, STGM_READ|STGM_SHARE_EXCLUSIVE, srcEntry);
-        if (pstrChild)
-          IStream_AddRef(pstrChild);
+        StgStreamImpl *streamimpl = StgStreamImpl_Construct(This, STGM_READ|STGM_SHARE_EXCLUSIVE, srcEntry);
+
+        if (streamimpl)
+        {
+          pstrChild = &streamimpl->IStream_iface;
+          if (pstrChild)
+            IStream_AddRef(pstrChild);
+        }
         else
+        {
+          pstrChild = NULL;
           hr = E_OUTOFMEMORY;
+        }
       }
 
       if (hr == S_OK)
diff --git a/dlls/ole32/storage32.h b/dlls/ole32/storage32.h
index 938bf7b..1e512ef 100644
--- a/dlls/ole32/storage32.h
+++ b/dlls/ole32/storage32.h
@@ -418,26 +418,20 @@ SmallBlockChainStream* Storage32Impl_BigBlocksToSmallBlocks(
 /****************************************************************************
  * StgStreamImpl definitions.
  *
- * This class implements the IStream32 interface and represents a stream
+ * This class implements the IStream interface and represents a stream
  * located inside a storage object.
  */
 struct StgStreamImpl
 {
-  const IStreamVtbl *lpVtbl;  /* Needs to be the first item in the struct
-			 * since we want to cast this to an IStream pointer */
+  IStream IStream_iface;
+  LONG ref;
 
   /*
    * We are an entry in the storage object's stream handler list
    */
-
   struct list StrmListEntry;
 
   /*
-   * Reference count
-   */
-  LONG		     ref;
-
-  /*
    * Storage that is the parent(owner) of the stream
    */
   StorageBaseImpl* parentStorage;
@@ -458,6 +452,11 @@ struct StgStreamImpl
   ULARGE_INTEGER     currentPosition;
 };
 
+static inline StgStreamImpl *impl_from_IStream( IStream *iface )
+{
+    return CONTAINING_RECORD(iface, StgStreamImpl, IStream_iface);
+}
+
 /*
  * Method definition for the StgStreamImpl class.
  */




More information about the wine-cvs mailing list