[PATCH 2/3] quartz: Merge enumregfilters.c into filtermapper.c.
Zebediah Figura
z.figura12 at gmail.com
Wed May 20 00:10:39 CDT 2020
Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
---
dlls/quartz/Makefile.in | 1 -
dlls/quartz/enumregfilters.c | 224 -----------------------------------
dlls/quartz/filtermapper.c | 162 ++++++++++++++++++++++++-
dlls/quartz/quartz_private.h | 2 -
4 files changed, 160 insertions(+), 229 deletions(-)
delete mode 100644 dlls/quartz/enumregfilters.c
diff --git a/dlls/quartz/Makefile.in b/dlls/quartz/Makefile.in
index 14ba932a312..2d1f637aca7 100644
--- a/dlls/quartz/Makefile.in
+++ b/dlls/quartz/Makefile.in
@@ -9,7 +9,6 @@ C_SRCS = \
avidec.c \
dsoundrender.c \
enummoniker.c \
- enumregfilters.c \
filesource.c \
filtergraph.c \
filtermapper.c \
diff --git a/dlls/quartz/enumregfilters.c b/dlls/quartz/enumregfilters.c
deleted file mode 100644
index 42dccf3b625..00000000000
--- a/dlls/quartz/enumregfilters.c
+++ /dev/null
@@ -1,224 +0,0 @@
-/*
- * Implementation of IEnumRegFilters Interface
- *
- * Copyright 2004 Christian Costa
- *
- * 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 "quartz_private.h"
-
-
-#include "wine/debug.h"
-
-WINE_DEFAULT_DEBUG_CHANNEL(quartz);
-
-typedef struct IEnumRegFiltersImpl
-{
- IEnumRegFilters IEnumRegFilters_iface;
- LONG refCount;
- ULONG size;
- REGFILTER* RegFilters;
- ULONG uIndex;
-} IEnumRegFiltersImpl;
-
-static inline IEnumRegFiltersImpl *impl_from_IEnumRegFilters(IEnumRegFilters *iface)
-{
- return CONTAINING_RECORD(iface, IEnumRegFiltersImpl, IEnumRegFilters_iface);
-}
-
-static const struct IEnumRegFiltersVtbl IEnumRegFiltersImpl_Vtbl;
-
-HRESULT IEnumRegFiltersImpl_Construct(REGFILTER* pInRegFilters, const ULONG size, IEnumRegFilters ** ppEnum)
-{
- IEnumRegFiltersImpl* pEnumRegFilters;
- REGFILTER* pRegFilters = NULL;
- unsigned int i;
-
- TRACE("(%p, %d, %p)\n", pInRegFilters, size, ppEnum);
-
- pEnumRegFilters = CoTaskMemAlloc(sizeof(IEnumRegFiltersImpl));
- if (!pEnumRegFilters)
- {
- *ppEnum = NULL;
- return E_OUTOFMEMORY;
- }
-
- /* Accept size of 0 */
- if (size)
- {
- pRegFilters = CoTaskMemAlloc(sizeof(REGFILTER)*size);
- if (!pRegFilters)
- {
- CoTaskMemFree(pEnumRegFilters);
- *ppEnum = NULL;
- return E_OUTOFMEMORY;
- }
- }
-
- for(i = 0; i < size; i++)
- {
- pRegFilters[i].Clsid = pInRegFilters[i].Clsid;
- pRegFilters[i].Name = CoTaskMemAlloc((lstrlenW(pInRegFilters[i].Name)+1)*sizeof(WCHAR));
- if (!pRegFilters[i].Name)
- {
- while(i)
- CoTaskMemFree(pRegFilters[--i].Name);
- CoTaskMemFree(pRegFilters);
- CoTaskMemFree(pEnumRegFilters);
- return E_OUTOFMEMORY;
- }
- CopyMemory(pRegFilters[i].Name, pInRegFilters[i].Name, (lstrlenW(pInRegFilters[i].Name)+1)*sizeof(WCHAR));
- }
-
- pEnumRegFilters->IEnumRegFilters_iface.lpVtbl = &IEnumRegFiltersImpl_Vtbl;
- pEnumRegFilters->refCount = 1;
- pEnumRegFilters->uIndex = 0;
- pEnumRegFilters->RegFilters = pRegFilters;
- pEnumRegFilters->size = size;
-
- *ppEnum = &pEnumRegFilters->IEnumRegFilters_iface;
-
- return S_OK;
-}
-
-static HRESULT WINAPI IEnumRegFiltersImpl_QueryInterface(IEnumRegFilters * iface, REFIID riid, LPVOID * ppv)
-{
- TRACE("(%p)->(%s, %p)\n", iface, qzdebugstr_guid(riid), ppv);
-
- *ppv = NULL;
-
- if (IsEqualIID(riid, &IID_IUnknown))
- *ppv = iface;
- else if (IsEqualIID(riid, &IID_IEnumRegFilters))
- *ppv = iface;
-
- if (*ppv)
- {
- IUnknown_AddRef((IUnknown *)(*ppv));
- return S_OK;
- }
-
- FIXME("No interface for %s!\n", qzdebugstr_guid(riid));
-
- return E_NOINTERFACE;
-}
-
-static ULONG WINAPI IEnumRegFiltersImpl_AddRef(IEnumRegFilters * iface)
-{
- IEnumRegFiltersImpl *This = impl_from_IEnumRegFilters(iface);
- ULONG refCount = InterlockedIncrement(&This->refCount);
-
- TRACE("(%p)\n", iface);
-
- return refCount;
-}
-
-static ULONG WINAPI IEnumRegFiltersImpl_Release(IEnumRegFilters * iface)
-{
- IEnumRegFiltersImpl *This = impl_from_IEnumRegFilters(iface);
- ULONG refCount = InterlockedDecrement(&This->refCount);
-
- TRACE("(%p)\n", iface);
-
- if (!refCount)
- {
- ULONG i;
-
- for(i = 0; i < This->size; i++)
- {
- CoTaskMemFree(This->RegFilters[i].Name);
- }
- CoTaskMemFree(This->RegFilters);
- CoTaskMemFree(This);
- return 0;
- } else
- return refCount;
-}
-
-static HRESULT WINAPI IEnumRegFiltersImpl_Next(IEnumRegFilters * iface, ULONG cFilters, REGFILTER ** ppRegFilter, ULONG * pcFetched)
-{
- ULONG cFetched;
- IEnumRegFiltersImpl *This = impl_from_IEnumRegFilters(iface);
- unsigned int i;
-
- cFetched = min(This->size, This->uIndex + cFilters) - This->uIndex;
-
- TRACE("(%p)->(%u, %p, %p)\n", iface, cFilters, ppRegFilter, pcFetched);
-
- if (cFetched > 0)
- {
- for(i = 0; i < cFetched; i++)
- {
- /* The string in the REGFILTER structure must be allocated in the same block as the REGFILTER structure itself */
- ppRegFilter[i] = CoTaskMemAlloc(sizeof(REGFILTER)+(lstrlenW(This->RegFilters[This->uIndex + i].Name)+1)*sizeof(WCHAR));
- if (!ppRegFilter[i])
- {
- while(i)
- {
- CoTaskMemFree(ppRegFilter[--i]);
- ppRegFilter[i] = NULL;
- }
- return E_OUTOFMEMORY;
- }
- ppRegFilter[i]->Clsid = This->RegFilters[This->uIndex + i].Clsid;
- ppRegFilter[i]->Name = (WCHAR*)((char*)ppRegFilter[i]+sizeof(REGFILTER));
- CopyMemory(ppRegFilter[i]->Name, This->RegFilters[This->uIndex + i].Name,
- (lstrlenW(This->RegFilters[This->uIndex + i].Name)+1)*sizeof(WCHAR));
- }
-
- This->uIndex += cFetched;
- if (pcFetched)
- *pcFetched = cFetched;
- return S_OK;
- }
-
- return S_FALSE;
-}
-
-static HRESULT WINAPI IEnumRegFiltersImpl_Skip(IEnumRegFilters * iface, ULONG n)
-{
- TRACE("(%p)->(%u)\n", iface, n);
-
- return E_NOTIMPL;
-}
-
-static HRESULT WINAPI IEnumRegFiltersImpl_Reset(IEnumRegFilters * iface)
-{
- IEnumRegFiltersImpl *This = impl_from_IEnumRegFilters(iface);
-
- TRACE("(%p)\n", iface);
-
- This->uIndex = 0;
- return S_OK;
-}
-
-static HRESULT WINAPI IEnumRegFiltersImpl_Clone(IEnumRegFilters * iface, IEnumRegFilters ** ppEnum)
-{
- TRACE("(%p)->(%p)\n", iface, ppEnum);
-
- return E_NOTIMPL;
-}
-
-static const IEnumRegFiltersVtbl IEnumRegFiltersImpl_Vtbl =
-{
- IEnumRegFiltersImpl_QueryInterface,
- IEnumRegFiltersImpl_AddRef,
- IEnumRegFiltersImpl_Release,
- IEnumRegFiltersImpl_Next,
- IEnumRegFiltersImpl_Skip,
- IEnumRegFiltersImpl_Reset,
- IEnumRegFiltersImpl_Clone
-};
diff --git a/dlls/quartz/filtermapper.c b/dlls/quartz/filtermapper.c
index 2068131b9eb..69e9ef90e27 100644
--- a/dlls/quartz/filtermapper.c
+++ b/dlls/quartz/filtermapper.c
@@ -42,6 +42,164 @@
WINE_DEFAULT_DEBUG_CHANNEL(quartz);
+struct enum_reg_filters
+{
+ IEnumRegFilters IEnumRegFilters_iface;
+ LONG refcount;
+
+ unsigned int index, count;
+ REGFILTER *filters;
+};
+
+static struct enum_reg_filters *impl_from_IEnumRegFilters(IEnumRegFilters *iface)
+{
+ return CONTAINING_RECORD(iface, struct enum_reg_filters, IEnumRegFilters_iface);
+}
+
+static HRESULT WINAPI enum_reg_filters_QueryInterface(IEnumRegFilters *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_IEnumRegFilters))
+ {
+ IEnumRegFilters_AddRef(iface);
+ *out = iface;
+ return S_OK;
+ }
+
+ WARN("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(iid));
+ *out = NULL;
+ return E_NOINTERFACE;
+}
+
+static ULONG WINAPI enum_reg_filters_AddRef(IEnumRegFilters *iface)
+{
+ struct enum_reg_filters *enumerator = impl_from_IEnumRegFilters(iface);
+ ULONG refcount = InterlockedIncrement(&enumerator->refcount);
+ TRACE("%p increasing refcount to %u.\n", enumerator, refcount);
+ return refcount;
+}
+
+static ULONG WINAPI enum_reg_filters_Release(IEnumRegFilters *iface)
+{
+ struct enum_reg_filters *enumerator = impl_from_IEnumRegFilters(iface);
+ ULONG refcount = InterlockedDecrement(&enumerator->refcount);
+ unsigned int i;
+
+ TRACE("%p decreasing refcount to %u.\n", enumerator, refcount);
+ if (!refcount)
+ {
+ for (i = 0; i < enumerator->count; ++i)
+ free(enumerator->filters[i].Name);
+ free(enumerator->filters);
+ free(enumerator);
+ }
+ return refcount;
+}
+
+static HRESULT WINAPI enum_reg_filters_Next(IEnumRegFilters *iface, ULONG count,
+ REGFILTER **filters, ULONG *ret_count)
+{
+ struct enum_reg_filters *enumerator = impl_from_IEnumRegFilters(iface);
+ unsigned int i;
+
+ TRACE("iface %p, count %u, filters %p, ret_count %p.\n", iface, count, filters, ret_count);
+
+ for (i = 0; i < count && enumerator->index + i < enumerator->count; ++i)
+ {
+ REGFILTER *filter = &enumerator->filters[enumerator->index + i];
+
+ if (!(filters[i] = CoTaskMemAlloc(sizeof(REGFILTER) + (wcslen(filter->Name) + 1) * sizeof(WCHAR))))
+ {
+ while (i--)
+ CoTaskMemFree(filters[i]);
+ memset(filters, 0, count * sizeof(*filters));
+ *ret_count = 0;
+ return E_OUTOFMEMORY;
+ }
+
+ filters[i]->Clsid = filter->Clsid;
+ filters[i]->Name = (WCHAR *)(filters[i] + 1);
+ wcscpy(filters[i]->Name, filter->Name);
+ }
+
+ enumerator->index += i;
+ if (ret_count)
+ *ret_count = i;
+ return i ? S_OK : S_FALSE;
+}
+
+static HRESULT WINAPI enum_reg_filters_Skip(IEnumRegFilters *iface, ULONG count)
+{
+ TRACE("iface %p, count %u, unimplemented.\n", iface, count);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI enum_reg_filters_Reset(IEnumRegFilters *iface)
+{
+ struct enum_reg_filters *enumerator = impl_from_IEnumRegFilters(iface);
+
+ TRACE("iface %p.\n", iface);
+
+ enumerator->index = 0;
+ return S_OK;
+}
+
+static HRESULT WINAPI enum_reg_filters_Clone(IEnumRegFilters *iface, IEnumRegFilters **out)
+{
+ TRACE("iface %p, out %p, unimplemented.\n", iface, out);
+ return E_NOTIMPL;
+}
+
+static const IEnumRegFiltersVtbl enum_reg_filters_vtbl =
+{
+ enum_reg_filters_QueryInterface,
+ enum_reg_filters_AddRef,
+ enum_reg_filters_Release,
+ enum_reg_filters_Next,
+ enum_reg_filters_Skip,
+ enum_reg_filters_Reset,
+ enum_reg_filters_Clone,
+};
+
+static HRESULT enum_reg_filters_create(REGFILTER *filters, unsigned int count, IEnumRegFilters **out)
+{
+ struct enum_reg_filters *object;
+ unsigned int i;
+
+ *out = NULL;
+
+ if (!(object = calloc(1, sizeof(*object))))
+ return E_OUTOFMEMORY;
+
+ if (!(object->filters = malloc(count * sizeof(*object->filters))))
+ {
+ free(object);
+ return E_OUTOFMEMORY;
+ }
+
+ for (i = 0; i < count; ++i)
+ {
+ object->filters[i].Clsid = filters[i].Clsid;
+ if (!(object->filters[i].Name = wcsdup(filters[i].Name)))
+ {
+ while (i--)
+ free(object->filters[i].Name);
+ free(object->filters);
+ free(object);
+ return E_OUTOFMEMORY;
+ }
+ }
+
+ object->IEnumRegFilters_iface.lpVtbl = &enum_reg_filters_vtbl;
+ object->refcount = 1;
+ object->count = count;
+
+ TRACE("Created enumerator %p.\n", object);
+ *out = &object->IEnumRegFilters_iface;
+ return S_OK;
+}
+
typedef struct FilterMapper3Impl
{
IUnknown IUnknown_inner;
@@ -1030,7 +1188,7 @@ static HRESULT WINAPI FilterMapper_EnumMatchingFilters(
if (!nb_mon)
{
IEnumMoniker_Release(ppEnumMoniker);
- return IEnumRegFiltersImpl_Construct(NULL, 0, ppEnum);
+ return enum_reg_filters_create(NULL, 0, ppEnum);
}
regfilters = CoTaskMemAlloc(nb_mon * sizeof(REGFILTER));
@@ -1087,7 +1245,7 @@ static HRESULT WINAPI FilterMapper_EnumMatchingFilters(
if (SUCCEEDED(hr))
{
- hr = IEnumRegFiltersImpl_Construct(regfilters, idx, ppEnum);
+ hr = enum_reg_filters_create(regfilters, idx, ppEnum);
}
for (idx = 0; idx < nb_mon; idx++)
diff --git a/dlls/quartz/quartz_private.h b/dlls/quartz/quartz_private.h
index 5c391481f25..0f38563e365 100644
--- a/dlls/quartz/quartz_private.h
+++ b/dlls/quartz/quartz_private.h
@@ -81,8 +81,6 @@ HRESULT vmr9_create(IUnknown *outer, IUnknown **out) DECLSPEC_HIDDEN;
HRESULT EnumMonikerImpl_Create(IMoniker ** ppMoniker, ULONG nMonikerCount, IEnumMoniker ** ppEnum) DECLSPEC_HIDDEN;
-HRESULT IEnumRegFiltersImpl_Construct(REGFILTER * pInRegFilters, const ULONG size, IEnumRegFilters ** ppEnum) DECLSPEC_HIDDEN;
-
extern const char * qzdebugstr_guid(const GUID * id) DECLSPEC_HIDDEN;
extern void video_unregister_windowclass(void) DECLSPEC_HIDDEN;
--
2.26.2
More information about the wine-devel
mailing list