Maarten Lankhorst : quartz: Add a stub for SeekingPassThru.
Alexandre Julliard
julliard at winehq.org
Thu Apr 10 04:39:30 CDT 2008
Module: wine
Branch: master
Commit: 65e6bbd1861d403c364800c8aea29456c55680d5
URL: http://source.winehq.org/git/wine.git/?a=commit;h=65e6bbd1861d403c364800c8aea29456c55680d5
Author: Maarten Lankhorst <m.b.lankhorst at gmail.com>
Date: Wed Apr 9 13:12:55 2008 -0700
quartz: Add a stub for SeekingPassThru.
---
dlls/quartz/control.c | 170 ++++++++++++++++++++++++++++++++++++++++++
dlls/quartz/main.c | 1 +
dlls/quartz/quartz_private.h | 1 +
3 files changed, 172 insertions(+), 0 deletions(-)
diff --git a/dlls/quartz/control.c b/dlls/quartz/control.c
index f6851bb..4d30716 100644
--- a/dlls/quartz/control.c
+++ b/dlls/quartz/control.c
@@ -29,6 +29,176 @@
WINE_DEFAULT_DEBUG_CHANNEL(quartz);
+typedef struct PassThruImpl {
+ const ISeekingPassThruVtbl *IPassThru_vtbl;
+ const IUnknownVtbl * IInner_vtbl;
+
+ LONG ref;
+ IUnknown * pUnkOuter;
+ BOOL bUnkOuterValid;
+ BOOL bAggregatable;
+} PassThruImpl;
+
+static HRESULT WINAPI SeekInner_QueryInterface(IUnknown * iface,
+ REFIID riid,
+ LPVOID *ppvObj) {
+ ICOM_THIS_MULTI(PassThruImpl, IInner_vtbl, iface);
+ TRACE("(%p)->(%s (%p), %p)\n", This, debugstr_guid(riid), riid, ppvObj);
+
+ if (This->bAggregatable)
+ This->bUnkOuterValid = TRUE;
+
+ if (IsEqualGUID(&IID_IUnknown, riid))
+ {
+ *ppvObj = &(This->IInner_vtbl);
+ TRACE(" returning IUnknown interface (%p)\n", *ppvObj);
+ } else if (IsEqualGUID(&IID_ISeekingPassThru, riid)) {
+ *ppvObj = &(This->IPassThru_vtbl);
+ TRACE(" returning IMediaSeeking interface (%p)\n", *ppvObj);
+ } else {
+ *ppvObj = NULL;
+ FIXME("unknown interface %s\n", debugstr_guid(riid));
+ return E_NOINTERFACE;
+ }
+
+ IUnknown_AddRef((IUnknown *)(*ppvObj));
+ return S_OK;
+}
+
+static ULONG WINAPI SeekInner_AddRef(IUnknown * iface) {
+ ICOM_THIS_MULTI(PassThruImpl, IInner_vtbl, iface);
+ ULONG ref = InterlockedIncrement(&This->ref);
+
+ TRACE("(%p)->(): new ref = %d\n", This, ref);
+
+ return ref;
+}
+
+static ULONG WINAPI SeekInner_Release(IUnknown * iface) {
+ ICOM_THIS_MULTI(PassThruImpl, IInner_vtbl, iface);
+ ULONG ref = InterlockedDecrement(&This->ref);
+
+ TRACE("(%p)->(): new ref = %d\n", This, ref);
+
+ if (ref == 0)
+ {
+ CoTaskMemFree(This);
+ }
+ return ref;
+}
+
+static const IUnknownVtbl IInner_VTable =
+{
+ SeekInner_QueryInterface,
+ SeekInner_AddRef,
+ SeekInner_Release
+};
+
+/* Generic functions for aggegration */
+static HRESULT WINAPI SeekOuter_QueryInterface(PassThruImpl *This, REFIID riid, LPVOID *ppv)
+{
+ 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);
+}
+
+static ULONG WINAPI SeekOuter_AddRef(PassThruImpl *This)
+{
+ if (This->pUnkOuter && This->bUnkOuterValid)
+ return IUnknown_AddRef(This->pUnkOuter);
+ return IUnknown_AddRef((IUnknown *)&(This->IInner_vtbl));
+}
+
+static ULONG WINAPI SeekOuter_Release(PassThruImpl *This)
+{
+ if (This->pUnkOuter && This->bUnkOuterValid)
+ return IUnknown_Release(This->pUnkOuter);
+ return IUnknown_Release((IUnknown *)&(This->IInner_vtbl));
+}
+
+static HRESULT WINAPI SeekingPassThru_QueryInterface(ISeekingPassThru *iface, REFIID riid, LPVOID *ppvObj)
+{
+ ICOM_THIS_MULTI(PassThruImpl, IPassThru_vtbl, iface);
+
+ TRACE("(%p/%p)->(%s (%p), %p)\n", This, iface, debugstr_guid(riid), riid, ppvObj);
+
+ return SeekOuter_QueryInterface(This, riid, ppvObj);
+}
+
+static ULONG WINAPI SeekingPassThru_AddRef(ISeekingPassThru *iface)
+{
+ ICOM_THIS_MULTI(PassThruImpl, IPassThru_vtbl, iface);
+
+ TRACE("(%p/%p)->()\n", This, iface);
+
+ return SeekOuter_AddRef(This);
+}
+
+static ULONG WINAPI SeekingPassThru_Release(ISeekingPassThru *iface)
+{
+ ICOM_THIS_MULTI(PassThruImpl, IPassThru_vtbl, iface);
+
+ TRACE("(%p/%p)->()\n", This, iface);
+
+ return SeekOuter_Release(This);
+}
+
+static HRESULT WINAPI SeekingPassThru_Init(ISeekingPassThru *iface, BOOL renderer, IPin *pin)
+{
+ ICOM_THIS_MULTI(PassThruImpl, IPassThru_vtbl, iface);
+
+ FIXME("(%p/%p)->(%d, %p) stub\n", This, iface, renderer, pin);
+
+ return S_OK;
+}
+
+static const ISeekingPassThruVtbl ISeekingPassThru_Vtbl =
+{
+ SeekingPassThru_QueryInterface,
+ SeekingPassThru_AddRef,
+ SeekingPassThru_Release,
+ SeekingPassThru_Init
+};
+
+HRESULT SeekingPassThru_create(IUnknown *pUnkOuter, LPVOID *ppObj)
+{
+ PassThruImpl *fimpl;
+
+ TRACE("(%p,%p)\n", pUnkOuter, ppObj);
+
+ *ppObj = fimpl = CoTaskMemAlloc(sizeof(*fimpl));
+ if (!fimpl)
+ return E_OUTOFMEMORY;
+
+ fimpl->pUnkOuter = pUnkOuter;
+ fimpl->bUnkOuterValid = FALSE;
+ fimpl->bAggregatable = FALSE;
+ fimpl->IInner_vtbl = &IInner_VTable;
+ fimpl->IPassThru_vtbl = &ISeekingPassThru_Vtbl;
+ fimpl->ref = 1;
+ return S_OK;
+}
typedef HRESULT (*SeekFunc)( IMediaSeeking *to, LPVOID arg );
diff --git a/dlls/quartz/main.c b/dlls/quartz/main.c
index fa08d73..24fb1bf 100644
--- a/dlls/quartz/main.c
+++ b/dlls/quartz/main.c
@@ -60,6 +60,7 @@ struct object_creation_info
static const struct object_creation_info object_creation[] =
{
+ { &CLSID_SeekingPassThru, SeekingPassThru_create },
{ &CLSID_FilterGraph, FilterGraph_create },
{ &CLSID_FilterGraphNoThread, FilterGraphNoThread_create },
{ &CLSID_FilterMapper, FilterMapper_create },
diff --git a/dlls/quartz/quartz_private.h b/dlls/quartz/quartz_private.h
index 528b59b..9f92ad6 100644
--- a/dlls/quartz/quartz_private.h
+++ b/dlls/quartz/quartz_private.h
@@ -57,6 +57,7 @@ HRESULT VideoRendererDefault_create(IUnknown * pUnkOuter, LPVOID * ppv);
HRESULT QUARTZ_CreateSystemClock(IUnknown * pUnkOuter, LPVOID * ppv);
HRESULT ACMWrapper_create(IUnknown * pUnkOuter, LPVOID * ppv);
HRESULT WAVEParser_create(IUnknown * pUnkOuter, LPVOID * ppv);
+HRESULT SeekingPassThru_create(IUnknown *pUnkOuter, LPVOID *ppObj);
HRESULT EnumMonikerImpl_Create(IMoniker ** ppMoniker, ULONG nMonikerCount, IEnumMoniker ** ppEnum);
More information about the wine-cvs
mailing list