Michael Stefaniuc : quartz: Standardize COM aggregation for FilterMapper.
Alexandre Julliard
julliard at winehq.org
Mon Jul 2 13:22:00 CDT 2012
Module: wine
Branch: master
Commit: d2d3a9c462fa389fecc6950922dadfdc53abbf46
URL: http://source.winehq.org/git/wine.git/?a=commit;h=d2d3a9c462fa389fecc6950922dadfdc53abbf46
Author: Michael Stefaniuc <mstefani at redhat.de>
Date: Mon Jul 2 00:57:23 2012 +0200
quartz: Standardize COM aggregation for FilterMapper.
---
dlls/quartz/filtermapper.c | 111 +++++++++++++++----------------------------
1 files changed, 39 insertions(+), 72 deletions(-)
diff --git a/dlls/quartz/filtermapper.c b/dlls/quartz/filtermapper.c
index 11a0bd3..464caee 100644
--- a/dlls/quartz/filtermapper.c
+++ b/dlls/quartz/filtermapper.c
@@ -47,14 +47,12 @@ WINE_DEFAULT_DEBUG_CHANNEL(quartz);
typedef struct FilterMapper3Impl
{
+ IUnknown IUnknown_inner;
IFilterMapper3 IFilterMapper3_iface;
IFilterMapper IFilterMapper_iface;
IAMFilterData IAMFilterData_iface;
- const IUnknownVtbl *IInner_vtbl;
- LONG refCount;
- IUnknown * pUnkOuter;
- BOOL bUnkOuterValid;
- BOOL bAggregatable;
+ IUnknown *outer_unk;
+ LONG ref;
} FilterMapper3Impl;
static const IUnknownVtbl IInner_VTable;
@@ -77,9 +75,9 @@ static inline FilterMapper3Impl *impl_from_IAMFilterData( IAMFilterData *iface )
return CONTAINING_RECORD(iface, FilterMapper3Impl, IAMFilterData_iface);
}
-static inline FilterMapper3Impl *impl_from_inner_IUnknown( IUnknown *iface )
+static inline FilterMapper3Impl *impl_from_IUnknown( IUnknown *iface )
{
- return (FilterMapper3Impl *)((char*)iface - FIELD_OFFSET(FilterMapper3Impl, IInner_vtbl));
+ return CONTAINING_RECORD(iface, FilterMapper3Impl, IUnknown_inner);
}
static const WCHAR wszClsidSlash[] = {'C','L','S','I','D','\\',0};
@@ -192,16 +190,18 @@ HRESULT FilterMapper2_create(IUnknown *pUnkOuter, LPVOID *ppObj)
if (!pFM2impl)
return E_OUTOFMEMORY;
- pFM2impl->pUnkOuter = pUnkOuter;
- pFM2impl->bUnkOuterValid = FALSE;
- pFM2impl->bAggregatable = FALSE;
- pFM2impl->IInner_vtbl = &IInner_VTable;
+ pFM2impl->IUnknown_inner.lpVtbl = &IInner_VTable;
pFM2impl->IFilterMapper3_iface.lpVtbl = &fm3vtbl;
pFM2impl->IFilterMapper_iface.lpVtbl = &fmvtbl;
pFM2impl->IAMFilterData_iface.lpVtbl = &AMFilterDataVtbl;
- pFM2impl->refCount = 1;
+ pFM2impl->ref = 1;
- *ppObj = pFM2impl;
+ if (pUnkOuter)
+ pFM2impl->outer_unk = pUnkOuter;
+ else
+ pFM2impl->outer_unk = &pFM2impl->IUnknown_inner;
+
+ *ppObj = &pFM2impl->IUnknown_inner;
TRACE("-- created at %p\n", pFM2impl);
@@ -226,21 +226,17 @@ HRESULT FilterMapper_create(IUnknown *pUnkOuter, LPVOID *ppObj)
/*** IUnknown (inner) methods ***/
-static HRESULT WINAPI Inner_QueryInterface(IUnknown * iface, REFIID riid, LPVOID * ppv)
+static HRESULT WINAPI Inner_QueryInterface(IUnknown *iface, REFIID riid, void **ppv)
{
- FilterMapper3Impl *This = impl_from_inner_IUnknown(iface);
- TRACE("(%p)->(%s, %p)\n", This, debugstr_guid(riid), ppv);
+ FilterMapper3Impl *This = impl_from_IUnknown(iface);
- if (This->bAggregatable)
- This->bUnkOuterValid = TRUE;
+ TRACE("(%p)->(%s, %p)\n", This, debugstr_guid(riid), ppv);
*ppv = NULL;
-
if (IsEqualIID(riid, &IID_IUnknown))
- *ppv = &This->IInner_vtbl;
- else if (IsEqualIID(riid, &IID_IFilterMapper2) ||
- IsEqualIID(riid, &IID_IFilterMapper3))
- *ppv = This;
+ *ppv = &This->IUnknown_inner;
+ else if (IsEqualIID(riid, &IID_IFilterMapper2) || IsEqualIID(riid, &IID_IFilterMapper3))
+ *ppv = &This->IFilterMapper3_iface;
else if (IsEqualIID(riid, &IID_IFilterMapper))
*ppv = &This->IFilterMapper_iface;
else if (IsEqualIID(riid, &IID_IAMFilterData))
@@ -256,29 +252,27 @@ static HRESULT WINAPI Inner_QueryInterface(IUnknown * iface, REFIID riid, LPVOID
return E_NOINTERFACE;
}
-static ULONG WINAPI Inner_AddRef(IUnknown * iface)
+static ULONG WINAPI Inner_AddRef(IUnknown *iface)
{
- FilterMapper3Impl *This = impl_from_inner_IUnknown(iface);
- ULONG refCount = InterlockedIncrement(&This->refCount);
+ FilterMapper3Impl *This = impl_from_IUnknown(iface);
+ ULONG ref = InterlockedIncrement(&This->ref);
- TRACE("(%p)->() AddRef from %d\n", This, refCount - 1);
+ TRACE("(%p)->(): new ref = %d\n", This, ref);
- return refCount;
+ return ref;
}
-static ULONG WINAPI Inner_Release(IUnknown * iface)
+static ULONG WINAPI Inner_Release(IUnknown *iface)
{
- FilterMapper3Impl *This = impl_from_inner_IUnknown(iface);
- ULONG refCount = InterlockedDecrement(&This->refCount);
+ FilterMapper3Impl *This = impl_from_IUnknown(iface);
+ ULONG ref = InterlockedDecrement(&This->ref);
- TRACE("(%p)->() Release from %d\n", This, refCount + 1);
+ TRACE("(%p)->(): new ref = %d\n", This, ref);
- if (refCount == 0)
- {
+ if (ref == 0)
CoTaskMemFree(This);
- return 0;
- }
- return refCount;
+
+ return ref;
}
static const IUnknownVtbl IInner_VTable =
@@ -292,48 +286,21 @@ static HRESULT WINAPI FilterMapper3_QueryInterface(IFilterMapper3 * iface, REFII
{
FilterMapper3Impl *This = impl_from_IFilterMapper3(iface);
- if (This->bAggregatable)
- This->bUnkOuterValid = TRUE;
-
- if (This->pUnkOuter)
- {
- if (This->bAggregatable)
- return IUnknown_QueryInterface(This->pUnkOuter, riid, ppv);
-
- if (IsEqualIID(riid, &IID_IUnknown))
- {
- HRESULT hr;
-
- IUnknown_AddRef((IUnknown *)&(This->IInner_vtbl));
- hr = IUnknown_QueryInterface((IUnknown *)&(This->IInner_vtbl), riid, ppv);
- IUnknown_Release((IUnknown *)&(This->IInner_vtbl));
- This->bAggregatable = TRUE;
- return hr;
- }
-
- *ppv = NULL;
- return E_NOINTERFACE;
- }
-
- return IUnknown_QueryInterface((IUnknown *)&(This->IInner_vtbl), riid, ppv);
+ return IUnknown_QueryInterface(This->outer_unk, riid, ppv);
}
static ULONG WINAPI FilterMapper3_AddRef(IFilterMapper3 * iface)
{
FilterMapper3Impl *This = impl_from_IFilterMapper3(iface);
- if (This->pUnkOuter && This->bUnkOuterValid)
- return IUnknown_AddRef(This->pUnkOuter);
- return IUnknown_AddRef((IUnknown *)&(This->IInner_vtbl));
+ return IUnknown_AddRef(This->outer_unk);
}
static ULONG WINAPI FilterMapper3_Release(IFilterMapper3 * iface)
{
FilterMapper3Impl *This = impl_from_IFilterMapper3(iface);
- if (This->pUnkOuter && This->bUnkOuterValid)
- return IUnknown_Release(This->pUnkOuter);
- return IUnknown_Release((IUnknown *)&(This->IInner_vtbl));
+ return IUnknown_Release(This->outer_unk);
}
/*** IFilterMapper3 methods ***/
@@ -1206,14 +1173,14 @@ static ULONG WINAPI FilterMapper_AddRef(IFilterMapper * iface)
{
FilterMapper3Impl *This = impl_from_IFilterMapper(iface);
- return FilterMapper3_AddRef(&This->IFilterMapper3_iface);
+ return IUnknown_AddRef(This->outer_unk);
}
static ULONG WINAPI FilterMapper_Release(IFilterMapper * iface)
{
FilterMapper3Impl *This = impl_from_IFilterMapper(iface);
- return FilterMapper3_Release(&This->IFilterMapper3_iface);
+ return IUnknown_Release(This->outer_unk);
}
/*** IFilterMapper methods ***/
@@ -1708,21 +1675,21 @@ static HRESULT WINAPI AMFilterData_QueryInterface(IAMFilterData * iface, REFIID
{
FilterMapper3Impl *This = impl_from_IAMFilterData(iface);
- return FilterMapper3_QueryInterface(&This->IFilterMapper3_iface, riid, ppv);
+ return IUnknown_QueryInterface(This->outer_unk, riid, ppv);
}
static ULONG WINAPI AMFilterData_AddRef(IAMFilterData * iface)
{
FilterMapper3Impl *This = impl_from_IAMFilterData(iface);
- return FilterMapper3_AddRef(&This->IFilterMapper3_iface);
+ return IUnknown_AddRef(This->outer_unk);
}
static ULONG WINAPI AMFilterData_Release(IAMFilterData * iface)
{
FilterMapper3Impl *This = impl_from_IAMFilterData(iface);
- return FilterMapper3_Release(&This->IFilterMapper3_iface);
+ return IUnknown_Release(This->outer_unk);
}
/*** IAMFilterData methods ***/
More information about the wine-cvs
mailing list