ReactOS  0.4.15-dev-1397-g19779b3
enum_mediatypes.cpp
Go to the documentation of this file.
1 /*
2  * COPYRIGHT: See COPYING in the top level directory
3  * PROJECT: ReactOS Network Provider for MPEG2 based networks
4  * FILE: dll/directx/msdvbnp/enum_mediatypes.cpp
5  * PURPOSE: IEnumMediaTypes interface
6  *
7  * PROGRAMMERS: Johannes Anderwald (johannes.anderwald@reactos.org)
8  */
9 #include "precomp.h"
10 
11 class CEnumMediaTypes : public IEnumMediaTypes
12 {
13 public:
15 
17  {
19  return m_Ref;
20  }
22  {
24  if (!m_Ref)
25  {
26  delete this;
27  return 0;
28  }
29  return m_Ref;
30  }
31 
32  HRESULT STDMETHODCALLTYPE Next(ULONG cMediaTypes, AM_MEDIA_TYPE **ppMediaTypes, ULONG *pcFetched);
33  HRESULT STDMETHODCALLTYPE Skip(ULONG cMediaTypes);
36 
37 
38  CEnumMediaTypes(ULONG MediaTypeCount, AM_MEDIA_TYPE * MediaTypes) : m_Ref(0), m_MediaTypeCount(MediaTypeCount), m_MediaTypes(MediaTypes), m_Index(0){};
39  virtual ~CEnumMediaTypes(){};
40 
41 protected:
42  LONG m_Ref;
45  ULONG m_Index;
46 };
47 
48 HRESULT
51  IN REFIID refiid,
52  OUT PVOID* Output)
53 {
54  if (IsEqualGUID(refiid, IID_IUnknown))
55  {
56  *Output = PVOID(this);
57  reinterpret_cast<IUnknown*>(*Output)->AddRef();
58  return NOERROR;
59  }
60  if (IsEqualGUID(refiid, IID_IEnumMediaTypes))
61  {
62  *Output = (IEnumMediaTypes*)(this);
63  reinterpret_cast<IEnumMediaTypes*>(*Output)->AddRef();
64  return NOERROR;
65  }
66 
69  StringFromCLSID(refiid, &lpstr);
70  swprintf(Buffer, L"CEnumMediaTypes::QueryInterface: NoInterface for %s\n", lpstr);
73 
74  return E_NOINTERFACE;
75 }
76 
77 //-------------------------------------------------------------------
78 // IEnumMediaTypes
79 //
80 
81 HRESULT
84  ULONG cMediaTypes,
85  AM_MEDIA_TYPE **ppMediaTypes,
86  ULONG *pcFetched)
87 {
88  ULONG i = 0;
89  AM_MEDIA_TYPE * MediaType;
90 
91  if (!ppMediaTypes)
92  return E_POINTER;
93 
94  if (cMediaTypes > 1 && !pcFetched)
95  return E_INVALIDARG;
96 
97  while(i < cMediaTypes)
98  {
99  if (m_Index + i >= m_MediaTypeCount)
100  break;
101 
102  MediaType = (AM_MEDIA_TYPE*)CoTaskMemAlloc(sizeof(AM_MEDIA_TYPE));
103  if (!MediaType)
104  break;
105 
106  CopyMemory(MediaType, &m_MediaTypes[m_Index + i], sizeof(AM_MEDIA_TYPE));
107  ppMediaTypes[i] = MediaType;
108  i++;
109  }
110 
111  if (pcFetched)
112  {
113  *pcFetched = i;
114  }
115 
116  m_Index += i;
117 
118  if (i < cMediaTypes)
119  return S_FALSE;
120  else
121  return S_OK;
122 }
123 
124 HRESULT
127  ULONG cMediaTypes)
128 {
129  if (cMediaTypes + m_Index >= m_MediaTypeCount)
130  {
131  return S_FALSE;
132  }
133 
134  m_Index += cMediaTypes;
135  return S_OK;
136 }
137 
138 HRESULT
141 {
142  m_Index = 0;
143  return S_OK;
144 }
145 
146 HRESULT
149  IEnumMediaTypes **ppEnum)
150 {
151  OutputDebugStringW(L"CEnumMediaTypes::Clone : NotImplemented\n");
152  return E_NOTIMPL;
153 }
154 
155 HRESULT
156 WINAPI
159  ULONG MediaTypeCount,
160  AM_MEDIA_TYPE * MediaTypes,
161  REFIID riid,
162  LPVOID * ppv)
163 {
164  CEnumMediaTypes * handler = new CEnumMediaTypes(MediaTypeCount, MediaTypes);
165 
166 #ifdef MSDVBNP_TRACE
168  LPOLESTR lpstr;
170  swprintf(Buffer, L"CEnumMediaTypes_fnConstructor riid %s pUnknown %p\n", lpstr, pUnknown);
172 #endif
173 
174  if (!handler)
175  {
176  CoTaskMemFree(MediaTypes);
177  return E_OUTOFMEMORY;
178  }
179 
180  if (FAILED(handler->QueryInterface(riid, ppv)))
181  {
182  /* not supported */
183  delete handler;
184  return E_NOINTERFACE;
185  }
186 
187  return NOERROR;
188 }
189 
#define IN
Definition: typedefs.h:39
#define REFIID
Definition: guiddef.h:118
#define E_NOINTERFACE
Definition: winerror.h:2364
VOID WINAPI CoTaskMemFree(LPVOID ptr)
Definition: ifs.c:442
#define NOERROR
Definition: winerror.h:2354
REFIID riid
Definition: precomp.h:44
HRESULT WINAPI CEnumMediaTypes_fnConstructor(ULONG MediaTypeCount, AM_MEDIA_TYPE *MediaTypes, REFIID riid, LPVOID *ppv)
REFIID LPVOID * ppv
Definition: atlbase.h:39
static LPOLESTR
Definition: stg_prop.c:27
virtual ~CEnumMediaTypes()
void WINAPI SHIM_OBJ_NAME() OutputDebugStringW(LPCWSTR lpOutputString)
Definition: ignoredbgout.c:23
STDMETHODIMP_(ULONG) Release()
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
long LONG
Definition: pedump.c:60
AM_MEDIA_TYPE * m_MediaTypes
#define STDMETHODIMP
Definition: basetyps.h:43
ULONG Release()
#define S_FALSE
Definition: winerror.h:2357
#define E_INVALIDARG
Definition: ddrawi.h:101
Definition: bufpool.h:45
void * PVOID
Definition: retypes.h:9
_In_ PUNKNOWN pUnknown
Definition: drmk.h:76
__wchar_t WCHAR
Definition: xmlstorage.h:180
LONG HRESULT
Definition: typedefs.h:79
const GUID IID_IUnknown
HRESULT STDMETHODCALLTYPE Reset()
#define MAX_PATH
Definition: compat.h:34
#define swprintf(buf, format,...)
Definition: sprintf.c:56
#define WINAPI
Definition: msvc.h:6
#define CopyMemory
Definition: winbase.h:1646
#define STDMETHODCALLTYPE
Definition: bdasup.h:9
ULONG AddRef()
HRESULT STDMETHODCALLTYPE Skip(ULONG cMediaTypes)
static const WCHAR L[]
Definition: oid.c:1250
#define InterlockedDecrement
Definition: armddk.h:52
Definition: arc.h:85
CEnumMediaTypes(ULONG MediaTypeCount, AM_MEDIA_TYPE *MediaTypes)
STDMETHODIMP_(ULONG) AddRef()
#define S_OK
Definition: intsafe.h:51
#define InterlockedIncrement
Definition: armddk.h:53
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
IN PVOID IN PVOID IN USHORT IN USHORT IN PINTERFACE Interface
Definition: pci.h:361
#define E_NOTIMPL
Definition: ddrawi.h:99
BOOL WINAPI IsEqualGUID(REFGUID rguid1, REFGUID rguid2)
Definition: compobj.c:4112
HRESULT STDMETHODCALLTYPE Next(ULONG cMediaTypes, AM_MEDIA_TYPE **ppMediaTypes, ULONG *pcFetched)
STDMETHODIMP QueryInterface(REFIID InterfaceId, PVOID *Interface)
#define OUT
Definition: typedefs.h:40
unsigned int ULONG
Definition: retypes.h:1
static LPCSTR lpstr
Definition: font.c:51
UINT(* handler)(MSIPACKAGE *)
Definition: action.c:7786
#define E_POINTER
Definition: winerror.h:2365
HRESULT STDMETHODCALLTYPE Clone(IEnumMediaTypes **ppEnum)
LPVOID WINAPI CoTaskMemAlloc(SIZE_T size)
Definition: ifs.c:426
HRESULT WINAPI StringFromCLSID(REFCLSID id, LPOLESTR *idstr)
Definition: compobj.c:2412