[PATCH] qdvd: Add IDvdGraphBuilder stub.
Zebediah Figura
z.figura12 at gmail.com
Mon Jul 6 14:29:21 CDT 2020
On 7/6/20 1:50 PM, Gijs Vermeulen wrote:
> Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=18072
> Signed-off-by: Gijs Vermeulen <gijsvrm at gmail.com>
> ---
> dlls/qdvd/Makefile.in | 2 +
> dlls/qdvd/graph.c | 112 +++++++++++++++++++++++++++++++++++++++
> dlls/qdvd/qdvd_main.c | 90 ++++++++++++++++++++++++++++---
> dlls/qdvd/qdvd_private.h | 31 +++++++++++
> 4 files changed, 228 insertions(+), 7 deletions(-)
> create mode 100644 dlls/qdvd/graph.c
> create mode 100644 dlls/qdvd/qdvd_private.h
>
> diff --git a/dlls/qdvd/Makefile.in b/dlls/qdvd/Makefile.in
> index b3b13486ed..8f5089b3ac 100644
> --- a/dlls/qdvd/Makefile.in
> +++ b/dlls/qdvd/Makefile.in
> @@ -1,8 +1,10 @@
> MODULE = qdvd.dll
> +IMPORTS = strmiids uuid ole32
>
> EXTRADLLFLAGS = -mno-cygwin
>
> C_SRCS = \
> + graph.c \
> qdvd_main.c
>
> IDL_SRCS = \
> diff --git a/dlls/qdvd/graph.c b/dlls/qdvd/graph.c
> new file mode 100644
> index 0000000000..da12dcff0a
> --- /dev/null
> +++ b/dlls/qdvd/graph.c
> @@ -0,0 +1,112 @@
> +/*
> + * Graph builder
> + *
> + * Copyright 2020 Gijs Vermeulen
> + *
> + * This library is free software; you can redistribute it and/or
> + * modify it under the terms of the GNU Lesser General Public
> + * License as published by the Free Software Foundation; either
> + * version 2.1 of the License, or (at your option) any later version.
> + *
> + * This library is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
> + * Lesser General Public License for more details.
> + *
> + * You should have received a copy of the GNU Lesser General Public
> + * License along with this library; if not, write to the Free Software
> + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
> + */
> +
> +#include "qdvd_private.h"
> +#include "wine/heap.h"
> +
> +WINE_DEFAULT_DEBUG_CHANNEL(qdvd);
> +
> +struct graph_builder
> +{
> + IDvdGraphBuilder IDvdGraphBuilder_iface;
> + LONG refs;
> +};
> +
> +static struct graph_builder *impl_from_IDvdGraphBuilder(IDvdGraphBuilder *iface)
> +{
> + return CONTAINING_RECORD(iface, struct graph_builder, IDvdGraphBuilder_iface);
> +}
> +
> +static ULONG WINAPI graph_builder_AddRef(IDvdGraphBuilder *iface)
> +{
> + struct graph_builder *builder = impl_from_IDvdGraphBuilder(iface);
> + ULONG refcount = InterlockedIncrement(&builder->refs);
> + TRACE("%p increasing refcount to %u.\n", builder, refcount);
> + return refcount;
> +}
> +
> +static ULONG WINAPI graph_builder_Release(IDvdGraphBuilder *iface)
> +{
> + struct graph_builder *builder = impl_from_IDvdGraphBuilder(iface);
> + ULONG refcount = InterlockedDecrement(&builder->refs);
> + TRACE("%p decreasing refcount to %u.\n", builder, refcount);
> + if (!refcount)
> + heap_free(builder);
> + return refcount;
> +}
> +
> +static HRESULT WINAPI graph_builder_QueryInterface(IDvdGraphBuilder *iface, REFIID iid, void **out)
> +{
> + TRACE("iface %p, iid %s, out %p.\n", iface, debugstr_guid(iid), out);
> +
> + if (IsEqualGUID(iid, &IID_IDvdGraphBuilder) || IsEqualGUID(iid, &IID_IUnknown))
> + {
> + IDvdGraphBuilder_AddRef(iface);
> + *out = iface;
> + return S_OK;
> + }
> +
> + *out = NULL;
> + WARN("%s not implemented, returning E_NOINTERFACE\n", debugstr_guid(iid));
> + return E_NOINTERFACE;
> +}
> +
> +static HRESULT WINAPI graph_builder_GetFiltergraph(IDvdGraphBuilder *iface, IGraphBuilder **graph)
> +{
> + FIXME("iface %p, graph %p, stub!\n", iface, graph);
> + return E_NOTIMPL;
> +}
> +
> +static HRESULT WINAPI graph_builder_GetDvdInterface(IDvdGraphBuilder *iface, REFIID iid, void **out)
> +{
> + FIXME("iface %p, iid %s, out %p, stub!\n", iface, debugstr_guid(iid), out);
> + return E_NOTIMPL;
> +}
> +
> +static HRESULT WINAPI graph_builder_RenderDvdVideoVolume(IDvdGraphBuilder *iface, const WCHAR *path, DWORD flags, AM_DVD_RENDERSTATUS *status)
> +{
> + FIXME("iface %p, path %s, flags %#x, status %p, stub!\n", iface, debugstr_w(path), flags, status);
> + return E_NOTIMPL;
> +}
> +
> +static const struct IDvdGraphBuilderVtbl graph_builder_vtbl =
> +{
> + graph_builder_QueryInterface,
> + graph_builder_AddRef,
> + graph_builder_Release,
> + graph_builder_GetFiltergraph,
> + graph_builder_GetDvdInterface,
> + graph_builder_RenderDvdVideoVolume
> +};
> +
> +HRESULT graph_builder_create(IUnknown **out)
> +{
> + struct graph_builder *builder;
> +
> + builder = heap_alloc(sizeof(*builder));
This should really be calloc() [even if we're not initializing anything
to zero, we probably will in the near future...]
> + if (!builder) return E_OUTOFMEMORY;
> +
> + builder->IDvdGraphBuilder_iface.lpVtbl = &graph_builder_vtbl;
> + builder->refs = 1;
> +
> + *out = (IUnknown *)&builder->IDvdGraphBuilder_iface;
Can you please add a trace here along the lines of "Created DVD graph
builder %p.\n"?
> +
> + return S_OK;
> +}
> diff --git a/dlls/qdvd/qdvd_main.c b/dlls/qdvd/qdvd_main.c
> index 72dcda7c91..57a6b32ff7 100644
> --- a/dlls/qdvd/qdvd_main.c
> +++ b/dlls/qdvd/qdvd_main.c
> @@ -18,17 +18,88 @@
> * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
> */
>
> -#include <stdarg.h>
> -#include "windef.h"
> -#include "winbase.h"
> -#include "oleidl.h"
> -#include "rpcproxy.h"
> -#include "wine/debug.h"
> +#include "qdvd_private.h"
>
> WINE_DEFAULT_DEBUG_CHANNEL(qdvd);
>
> static HINSTANCE qdvd_instance;
>
> +struct class_factory
> +{
> + IClassFactory IClassFactory_iface;
> + HRESULT (*create_instance)(IUnknown **out);
> +};
> +
> +static struct class_factory *impl_from_IClassFactory(IClassFactory *iface)
> +{
> + return CONTAINING_RECORD(iface, struct class_factory, IClassFactory_iface);
> +}
> +
> +static HRESULT WINAPI class_factory_QueryInterface(IClassFactory *iface, REFIID iid, void **out)
> +{
> + TRACE("iface %p, iid %s, out %p.\n", iface, debugstr_guid(iid), out);
> +
> + if (IsEqualGUID(iid, &IID_IUnknown) || IsEqualGUID(iid, &IID_IClassFactory))
> + {
> + IClassFactory_AddRef(iface);
> + *out = iface;
> + return S_OK;
> + }
> +
> + *out = NULL;
> + WARN("%s not implemented, returning E_NOINTERFACE\n", debugstr_guid(iid));
> + return E_NOINTERFACE;
> +}
> +
> +static ULONG WINAPI class_factory_AddRef(IClassFactory *iface)
> +{
> + return 2;
> +}
> +
> +static ULONG WINAPI class_factory_Release(IClassFactory *iface)
> +{
> + return 1;
> +}
> +
> +static HRESULT WINAPI class_factory_CreateInstance(IClassFactory *iface,
> + IUnknown *outer, REFIID iid, void **out)
> +{
> + struct class_factory *factory = impl_from_IClassFactory(iface);
> + IUnknown *unk;
> + HRESULT hr;
> +
> + TRACE("iface %p, outer %p, iid %s, out %p.\n", iface, outer, debugstr_guid(iid), out);
> +
> + *out = NULL;
> +
> + if (outer)
> + return CLASS_E_NOAGGREGATION;
> +
> + if (SUCCEEDED(hr = factory->create_instance(&unk)))
> + {
> + hr = IUnknown_QueryInterface(unk, iid, out);
> + IUnknown_Release(unk);
> + }
> + return hr;
> +}
> +
> +static HRESULT WINAPI class_factory_LockServer(IClassFactory *iface, BOOL lock)
> +{
> + FIXME("lock %d, stub!\n", lock);
> + return S_OK;
> +}
> +
> +static const IClassFactoryVtbl class_factory_vtbl =
> +{
> + class_factory_QueryInterface,
> + class_factory_AddRef,
> + class_factory_Release,
> + class_factory_CreateInstance,
> + class_factory_LockServer,
> +};
> +
> +static struct class_factory graph_builder_cf = {{&class_factory_vtbl}, graph_builder_create};
> +
> BOOL WINAPI DllMain(HINSTANCE instance, DWORD reason, void *reserved)
> {
> if (reason == DLL_WINE_PREATTACH)
> @@ -44,7 +115,12 @@ BOOL WINAPI DllMain(HINSTANCE instance, DWORD reason, void *reserved)
>
> HRESULT WINAPI DllGetClassObject(REFCLSID clsid, REFIID iid, void **out)
> {
> - FIXME("clsid %s, iid %s, out %p, stub!\n", debugstr_guid(clsid), debugstr_guid(iid), out);
> + TRACE("clsid %s, iid %s, out %p.\n", debugstr_guid(clsid), debugstr_guid(iid), out);
> +
> + if (IsEqualGUID(clsid, &CLSID_DvdGraphBuilder))
> + return IClassFactory_QueryInterface(&graph_builder_cf.IClassFactory_iface, iid, out);
> +
> + FIXME("%s not available, returning CLASS_E_CLASSNOTAVAILABLE.\n", debugstr_guid(clsid));
> return CLASS_E_CLASSNOTAVAILABLE;
> }
>
> diff --git a/dlls/qdvd/qdvd_private.h b/dlls/qdvd/qdvd_private.h
> new file mode 100644
> index 0000000000..a09174e5e1
> --- /dev/null
> +++ b/dlls/qdvd/qdvd_private.h
> @@ -0,0 +1,31 @@
> +/*
> + * DirectShow DVD filters
> + *
> + * Copyright 2020 Gijs Vermeulen
> + *
> + * This library is free software; you can redistribute it and/or
> + * modify it under the terms of the GNU Lesser General Public
> + * License as published by the Free Software Foundation; either
> + * version 2.1 of the License, or (at your option) any later version.
> + *
> + * This library is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
> + * Lesser General Public License for more details.
> + *
> + * You should have received a copy of the GNU Lesser General Public
> + * License along with this library; if not, write to the Free Software
> + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
> + */
> +
> +#ifndef QDVD_PRIVATE_H
> +#define QDVD_PRIVATE_H
> +
> +#define COBJMACROS
> +#include "dshow.h"
> +#include "rpcproxy.h"
> +#include "wine/debug.h"
> +
> +HRESULT graph_builder_create(IUnknown **out) DECLSPEC_HIDDEN;
> +
> +#endif /* QDVD_PRIVATE_H */
>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 488 bytes
Desc: OpenPGP digital signature
URL: <http://www.winehq.org/pipermail/wine-devel/attachments/20200706/be90b244/attachment-0001.sig>
More information about the wine-devel
mailing list