Implemented IFilterMapper2.
This commit is contained in:
parent
09242a8ea6
commit
c71301a308
|
@ -3,14 +3,16 @@ TOPOBJDIR = ../..
|
|||
SRCDIR = @srcdir@
|
||||
VPATH = @srcdir@
|
||||
MODULE = quartz.dll
|
||||
IMPORTS = kernel32
|
||||
IMPORTS = ole32 oleaut32 advapi32 kernel32
|
||||
EXTRALIBS = $(LIBUUID)
|
||||
|
||||
LDDLLFLAGS = @LDDLLFLAGS@
|
||||
SYMBOLFILE = $(MODULE).tmp.o
|
||||
|
||||
C_SRCS = \
|
||||
enummoniker.c \
|
||||
filtergraph.c \
|
||||
filtermapper.c \
|
||||
main.c
|
||||
|
||||
@MAKE_DLL_RULES@
|
||||
|
|
|
@ -0,0 +1,195 @@
|
|||
/*
|
||||
* IEnumMoniker implementation
|
||||
*
|
||||
* Copyright 2003 Robert Shearman
|
||||
*
|
||||
* This file contains the (internal) driver registration functions,
|
||||
* driver enumeration APIs and DirectDraw creation functions.
|
||||
*
|
||||
* 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
#define COM_NO_WINDOWS_H
|
||||
#include "ole2.h"
|
||||
#include "strmif.h"
|
||||
|
||||
#include "wine/debug.h"
|
||||
|
||||
WINE_DEFAULT_DEBUG_CHANNEL(quartz);
|
||||
|
||||
typedef struct EnumMonikerImpl
|
||||
{
|
||||
ICOM_VFIELD(IEnumMoniker);
|
||||
ULONG ref;
|
||||
IMoniker ** ppMoniker;
|
||||
ULONG nMonikerCount;
|
||||
ULONG index;
|
||||
} EnumMonikerImpl;
|
||||
|
||||
static struct ICOM_VTABLE(IEnumMoniker) EnumMonikerImpl_Vtbl;
|
||||
|
||||
static ULONG WINAPI EnumMonikerImpl_AddRef(LPENUMMONIKER iface);
|
||||
|
||||
HRESULT EnumMonikerImpl_Create(IMoniker ** ppMoniker, ULONG nMonikerCount, IEnumMoniker ** ppEnum)
|
||||
{
|
||||
/* NOTE: assumes that array of IMonikers has already been AddRef'd
|
||||
* I.e. this function does not AddRef the array of incoming
|
||||
* IMonikers */
|
||||
EnumMonikerImpl * pemi = CoTaskMemAlloc(sizeof(EnumMonikerImpl));
|
||||
|
||||
TRACE("(%p, %ld, %p)\n", ppMoniker, nMonikerCount, ppEnum);
|
||||
|
||||
*ppEnum = NULL;
|
||||
|
||||
if (!pemi)
|
||||
return E_OUTOFMEMORY;
|
||||
|
||||
pemi->lpVtbl = &EnumMonikerImpl_Vtbl;
|
||||
pemi->ref = 1;
|
||||
pemi->ppMoniker = CoTaskMemAlloc(nMonikerCount * sizeof(IMoniker*));
|
||||
memcpy(pemi->ppMoniker, ppMoniker, nMonikerCount*sizeof(IMoniker*));
|
||||
pemi->nMonikerCount = nMonikerCount;
|
||||
pemi->index = 0;
|
||||
|
||||
*ppEnum = (IEnumMoniker *)pemi;
|
||||
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
/**********************************************************************
|
||||
* IEnumMoniker_QueryInterface (also IUnknown)
|
||||
*/
|
||||
static HRESULT WINAPI EnumMonikerImpl_QueryInterface(
|
||||
LPENUMMONIKER iface,
|
||||
REFIID riid,
|
||||
LPVOID *ppvObj)
|
||||
{
|
||||
ICOM_THIS(EnumMonikerImpl, iface);
|
||||
TRACE("\n\tIID:\t%s\n",debugstr_guid(riid));
|
||||
|
||||
if (This == NULL || ppvObj == NULL) return E_POINTER;
|
||||
|
||||
if (IsEqualGUID(riid, &IID_IUnknown) ||
|
||||
IsEqualGUID(riid, &IID_IEnumMoniker))
|
||||
{
|
||||
*ppvObj = (LPVOID)iface;
|
||||
EnumMonikerImpl_AddRef(iface);
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
FIXME("- no interface\n\tIID:\t%s\n", debugstr_guid(riid));
|
||||
return E_NOINTERFACE;
|
||||
}
|
||||
|
||||
/**********************************************************************
|
||||
* IEnumMoniker_AddRef (also IUnknown)
|
||||
*/
|
||||
static ULONG WINAPI EnumMonikerImpl_AddRef(LPENUMMONIKER iface)
|
||||
{
|
||||
ICOM_THIS(EnumMonikerImpl, iface);
|
||||
|
||||
TRACE("\n");
|
||||
|
||||
if (This == NULL) return E_POINTER;
|
||||
|
||||
return InterlockedIncrement(&This->ref);
|
||||
}
|
||||
|
||||
/**********************************************************************
|
||||
* IEnumMoniker_Release (also IUnknown)
|
||||
*/
|
||||
static ULONG WINAPI EnumMonikerImpl_Release(LPENUMMONIKER iface)
|
||||
{
|
||||
ICOM_THIS(EnumMonikerImpl, iface);
|
||||
|
||||
TRACE("\n");
|
||||
|
||||
if (!InterlockedDecrement(&This->ref))
|
||||
{
|
||||
CoTaskMemFree(This->ppMoniker);
|
||||
This->ppMoniker = NULL;
|
||||
CoTaskMemFree(This);
|
||||
return 0;
|
||||
}
|
||||
return This->ref;
|
||||
}
|
||||
|
||||
static HRESULT WINAPI EnumMonikerImpl_Next(LPENUMMONIKER iface, ULONG celt, IMoniker ** rgelt, ULONG * pceltFetched)
|
||||
{
|
||||
ULONG fetched;
|
||||
ICOM_THIS(EnumMonikerImpl, iface);
|
||||
|
||||
TRACE("(%ld, %p, %p)\n", celt, rgelt, pceltFetched);
|
||||
|
||||
for (fetched = 0; (This->index + fetched < This->nMonikerCount) && (fetched < celt); fetched++)
|
||||
{
|
||||
rgelt[fetched] = This->ppMoniker[This->index + fetched];
|
||||
IMoniker_AddRef(rgelt[fetched]);
|
||||
}
|
||||
|
||||
This->index += fetched;
|
||||
|
||||
if (pceltFetched)
|
||||
*pceltFetched = fetched;
|
||||
|
||||
if (fetched != celt)
|
||||
return S_FALSE;
|
||||
else
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
static HRESULT WINAPI EnumMonikerImpl_Skip(LPENUMMONIKER iface, ULONG celt)
|
||||
{
|
||||
ICOM_THIS(EnumMonikerImpl, iface);
|
||||
|
||||
TRACE("(%ld)\n", celt);
|
||||
|
||||
This->index += celt;
|
||||
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
static HRESULT WINAPI EnumMonikerImpl_Reset(LPENUMMONIKER iface)
|
||||
{
|
||||
ICOM_THIS(EnumMonikerImpl, iface);
|
||||
|
||||
TRACE("()\n");
|
||||
|
||||
This->index = 0;
|
||||
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
static HRESULT WINAPI EnumMonikerImpl_Clone(LPENUMMONIKER iface, IEnumMoniker ** ppenum)
|
||||
{
|
||||
FIXME("(%p): stub\n", ppenum);
|
||||
|
||||
return E_NOTIMPL;
|
||||
}
|
||||
|
||||
/**********************************************************************
|
||||
* IEnumMoniker_Vtbl
|
||||
*/
|
||||
static ICOM_VTABLE(IEnumMoniker) EnumMonikerImpl_Vtbl =
|
||||
{
|
||||
ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
|
||||
EnumMonikerImpl_QueryInterface,
|
||||
EnumMonikerImpl_AddRef,
|
||||
EnumMonikerImpl_Release,
|
||||
EnumMonikerImpl_Next,
|
||||
EnumMonikerImpl_Skip,
|
||||
EnumMonikerImpl_Reset,
|
||||
EnumMonikerImpl_Clone
|
||||
};
|
|
@ -28,6 +28,18 @@
|
|||
|
||||
WINE_DEFAULT_DEBUG_CHANNEL(quartz);
|
||||
|
||||
typedef struct _IFilterGraphImpl {
|
||||
ICOM_VTABLE(IGraphBuilder) *IGraphBuilder_vtbl;
|
||||
ICOM_VTABLE(IMediaControl) *IMediaControl_vtbl;
|
||||
ICOM_VTABLE(IMediaSeeking) *IMediaSeeking_vtbl;
|
||||
ICOM_VTABLE(IBasicAudio) *IBasicAudio_vtbl;
|
||||
ICOM_VTABLE(IBasicVideo) *IBasicVideo_vtbl;
|
||||
ICOM_VTABLE(IVideoWindow) *IVideoWindow_vtbl;
|
||||
ICOM_VTABLE(IMediaEventEx) *IMediaEventEx_vtbl;
|
||||
ULONG ref;
|
||||
} IFilterGraphImpl;
|
||||
|
||||
|
||||
static HRESULT Filtergraph_QueryInterface(IFilterGraphImpl *This,
|
||||
REFIID riid,
|
||||
LPVOID *ppvObj) {
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -61,6 +61,8 @@ struct object_creation_info
|
|||
static const struct object_creation_info object_creation[] =
|
||||
{
|
||||
{ &CLSID_FilterGraph, FILTERGRAPH_create },
|
||||
{ &CLSID_FilterMapper, FilterMapper2_create },
|
||||
{ &CLSID_FilterMapper2, FilterMapper2_create },
|
||||
};
|
||||
|
||||
static HRESULT WINAPI
|
||||
|
|
|
@ -29,17 +29,9 @@
|
|||
#include "winuser.h"
|
||||
#include "dshow.h"
|
||||
|
||||
typedef struct _IFilterGraphImpl {
|
||||
ICOM_VTABLE(IGraphBuilder) *IGraphBuilder_vtbl;
|
||||
ICOM_VTABLE(IMediaControl) *IMediaControl_vtbl;
|
||||
ICOM_VTABLE(IMediaSeeking) *IMediaSeeking_vtbl;
|
||||
ICOM_VTABLE(IBasicAudio) *IBasicAudio_vtbl;
|
||||
ICOM_VTABLE(IBasicVideo) *IBasicVideo_vtbl;
|
||||
ICOM_VTABLE(IVideoWindow) *IVideoWindow_vtbl;
|
||||
ICOM_VTABLE(IMediaEventEx) *IMediaEventEx_vtbl;
|
||||
ULONG ref;
|
||||
} IFilterGraphImpl;
|
||||
|
||||
HRESULT FILTERGRAPH_create(IUnknown *pUnkOuter, LPVOID *ppObj) ;
|
||||
HRESULT FilterMapper2_create(IUnknown *pUnkOuter, LPVOID *ppObj);
|
||||
|
||||
HRESULT EnumMonikerImpl_Create(IMoniker ** ppMoniker, ULONG nMonikerCount, IEnumMoniker ** ppEnum);
|
||||
|
||||
#endif /* __QUARTZ_PRIVATE_INCLUDED__ */
|
||||
|
|
Loading…
Reference in New Issue