ReactOS  0.4.14-dev-552-g2fad488
enumpins.c
Go to the documentation of this file.
1 /*
2  * Implementation of IEnumPins Interface
3  *
4  * Copyright 2003 Robert Shearman
5  * Copyright 2010 Aric Stewart, CodeWeavers
6  *
7  * This library is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU Lesser General Public
9  * License as published by the Free Software Foundation; either
10  * version 2.1 of the License, or (at your option) any later version.
11  *
12  * This library is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15  * Lesser General Public License for more details.
16  *
17  * You should have received a copy of the GNU Lesser General Public
18  * License along with this library; if not, write to the Free Software
19  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
20  */
21 
22 #define COBJMACROS
23 
24 #include "dshow.h"
25 #include "wine/strmbase.h"
26 #include "wine/debug.h"
27 
29 
30 typedef struct IEnumPinsImpl
31 {
33  LONG refCount;
34  ULONG uIndex;
41 
43 {
44  return CONTAINING_RECORD(iface, IEnumPinsImpl, IEnumPins_iface);
45 }
46 
47 static const struct IEnumPinsVtbl IEnumPinsImpl_Vtbl;
48 
50 {
51  IEnumPinsImpl * pEnumPins;
52 
53  if (!ppEnum)
54  return E_POINTER;
55 
56  pEnumPins = CoTaskMemAlloc(sizeof(IEnumPinsImpl));
57  if (!pEnumPins)
58  {
59  *ppEnum = NULL;
60  return E_OUTOFMEMORY;
61  }
62  pEnumPins->IEnumPins_iface.lpVtbl = &IEnumPinsImpl_Vtbl;
63  pEnumPins->refCount = 1;
64  pEnumPins->uIndex = 0;
65  pEnumPins->receive_pin = receive_pin;
66  pEnumPins->receive_pincount = receive_pincount;
67  pEnumPins->receive_version = receive_version;
68  pEnumPins->base = base;
69  IBaseFilter_AddRef(&base->IBaseFilter_iface);
70  *ppEnum = &pEnumPins->IEnumPins_iface;
71  pEnumPins->Version = receive_version(base);
72 
73  TRACE("Created new enumerator (%p)\n", *ppEnum);
74  return S_OK;
75 }
76 
78 {
79  TRACE("(%p)->(%s, %p)\n", iface, debugstr_guid(riid), ppv);
80 
81  *ppv = NULL;
82 
84  *ppv = iface;
85  else if (IsEqualIID(riid, &IID_IEnumPins))
86  *ppv = iface;
87 
88  if (*ppv)
89  {
90  IUnknown_AddRef((IUnknown *)(*ppv));
91  return S_OK;
92  }
93 
94  FIXME("No interface for %s!\n", debugstr_guid(riid));
95 
96  return E_NOINTERFACE;
97 }
98 
100 {
102  ULONG ref = InterlockedIncrement(&This->refCount);
103 
104  TRACE("(%p)->(): new ref = %u\n", iface, ref);
105 
106  return ref;
107 }
108 
110 {
112  ULONG ref = InterlockedDecrement(&This->refCount);
113 
114  TRACE("(%p)->(): new ref = %u\n", iface, ref);
115 
116  if (!ref)
117  {
118  IBaseFilter_Release(&This->base->IBaseFilter_iface);
120  }
121 
122  return ref;
123 }
124 
125 static HRESULT WINAPI IEnumPinsImpl_Next(IEnumPins * iface, ULONG cPins, IPin ** ppPins, ULONG * pcFetched)
126 {
128  ULONG i = 0;
129 
130  TRACE("(%p)->(%u, %p, %p)\n", iface, cPins, ppPins, pcFetched);
131 
132  if (!ppPins)
133  return E_POINTER;
134 
135  if (cPins > 1 && !pcFetched)
136  return E_INVALIDARG;
137 
138  if (pcFetched)
139  *pcFetched = 0;
140 
141  if (This->Version != This->receive_version(This->base))
142  return VFW_E_ENUM_OUT_OF_SYNC;
143 
144  while (i < cPins)
145  {
146  IPin *pin;
147  pin = This->receive_pin(This->base, This->uIndex + i);
148 
149  if (!pin)
150  break;
151  else
152  ppPins[i] = pin;
153  ++i;
154  }
155 
156  if (pcFetched)
157  *pcFetched = i;
158  This->uIndex += i;
159 
160  if (i < cPins)
161  return S_FALSE;
162  return S_OK;
163 }
164 
166 {
168 
169  TRACE("(%p)->(%u)\n", iface, cPins);
170 
171  if (This->Version != This->receive_version(This->base))
172  return VFW_E_ENUM_OUT_OF_SYNC;
173 
174  if (This->receive_pincount(This->base) >= This->uIndex + cPins)
175  return S_FALSE;
176 
177  This->uIndex += cPins;
178  return S_OK;
179 }
180 
182 {
184 
185  TRACE("(%p)->()\n", iface);
186 
187  This->Version = This->receive_version(This->base);
188 
189  This->uIndex = 0;
190  return S_OK;
191 }
192 
194 {
195  HRESULT hr;
197 
198  TRACE("(%p)->(%p)\n", iface, ppEnum);
199 
200  hr = EnumPins_Construct(This->base, This->receive_pin, This->receive_pincount, This->receive_version, ppEnum);
201  if (FAILED(hr))
202  return hr;
203  return IEnumPins_Skip(*ppEnum, This->uIndex);
204 }
205 
206 static const IEnumPinsVtbl IEnumPinsImpl_Vtbl =
207 {
215 };
static HRESULT WINAPI IEnumPinsImpl_Next(IEnumPins *iface, ULONG cPins, IPin **ppPins, ULONG *pcFetched)
Definition: enumpins.c:125
#define REFIID
Definition: guiddef.h:118
#define E_NOINTERFACE
Definition: winerror.h:2364
VOID WINAPI CoTaskMemFree(LPVOID ptr)
Definition: ifs.c:420
HRESULT hr
Definition: shlfolder.c:183
LONG(WINAPI * BaseFilter_GetPinCount)(BaseFilter *iface)
Definition: strmbase.h:178
REFIID riid
Definition: precomp.h:44
static HRESULT WINAPI IEnumPinsImpl_Clone(IEnumPins *iface, IEnumPins **ppEnum)
Definition: enumpins.c:193
IPin *(WINAPI * BaseFilter_GetPin)(BaseFilter *iface, int iPosition)
Definition: strmbase.h:177
REFIID LPVOID * ppv
Definition: atlbase.h:39
static ULONG WINAPI IEnumPinsImpl_AddRef(IEnumPins *iface)
Definition: enumpins.c:99
static IEnumPinsImpl * impl_from_IEnumPins(IEnumPins *iface)
Definition: enumpins.c:42
struct IEnumPinsImpl IEnumPinsImpl
Definition: send.c:47
WINE_DEFAULT_DEBUG_CHANNEL(strmbase)
LONG(WINAPI * BaseFilter_GetPinVersion)(BaseFilter *iface)
Definition: strmbase.h:179
Definition: regsvr.c:103
BaseFilter_GetPinCount receive_pincount
Definition: enumpins.c:37
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
GLuint base
Definition: 3dtext.c:35
long LONG
Definition: pedump.c:60
GLenum GLint ref
Definition: glext.h:6028
#define FIXME(fmt,...)
Definition: debug.h:110
BaseFilter_GetPinVersion receive_version
Definition: enumpins.c:38
#define S_FALSE
Definition: winerror.h:2357
#define E_INVALIDARG
Definition: ddrawi.h:101
static ULONG WINAPI IEnumPinsImpl_Release(IEnumPins *iface)
Definition: enumpins.c:109
TestFilterImpl * base
Definition: filtergraph.c:1273
smooth NULL
Definition: ftsmooth.c:416
static HRESULT WINAPI IEnumPinsImpl_QueryInterface(IEnumPins *iface, REFIID riid, LPVOID *ppv)
Definition: enumpins.c:77
#define debugstr_guid
Definition: kernel32.h:35
PFLT_MESSAGE_WAITER_QUEUE CONTAINING_RECORD(Csq, DEVICE_EXTENSION, IrpQueue)) -> WaiterQ.mLock) _IRQL_raises_(DISPATCH_LEVEL) VOID NTAPI FltpAcquireMessageWaiterLock(_In_ PIO_CSQ Csq, _Out_ PKIRQL Irql)
Definition: Messaging.c:560
BaseFilter * base
Definition: enumpins.c:35
DWORD Version
Definition: enumpins.c:39
static const struct IEnumPinsVtbl IEnumPinsImpl_Vtbl
Definition: enumpins.c:47
FNOBTAINPIN receive_pin
Definition: filtergraph.c:1274
#define TRACE(s)
Definition: solgame.cpp:4
IEnumPins IEnumPins_iface
Definition: filtergraph.c:1270
LONG HRESULT
Definition: typedefs.h:77
BaseFilter_GetPin receive_pin
Definition: enumpins.c:36
static HRESULT WINAPI IEnumPinsImpl_Skip(IEnumPins *iface, ULONG cPins)
Definition: enumpins.c:165
const GUID IID_IUnknown
#define WINAPI
Definition: msvc.h:8
unsigned long DWORD
Definition: ntddk_ex.h:95
HRESULT WINAPI EnumPins_Construct(BaseFilter *base, BaseFilter_GetPin receive_pin, BaseFilter_GetPinCount receive_pincount, BaseFilter_GetPinVersion receive_version, IEnumPins **ppEnum)
Definition: enumpins.c:49
#define InterlockedDecrement
Definition: armddk.h:52
static HRESULT WINAPI IEnumPinsImpl_Reset(IEnumPins *iface)
Definition: enumpins.c:181
#define S_OK
Definition: intsafe.h:59
#define InterlockedIncrement
Definition: armddk.h:53
#define VFW_E_ENUM_OUT_OF_SYNC
Definition: vfwmsgs.h:42
Definition: axcore.idl:91
unsigned int ULONG
Definition: retypes.h:1
#define E_POINTER
Definition: winerror.h:2365
LPVOID WINAPI CoTaskMemAlloc(SIZE_T size)
Definition: ifs.c:404
#define IsEqualIID(riid1, riid2)
Definition: guiddef.h:95