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
7 * PROGRAMMERS: Johannes Anderwald (johannes.anderwald@reactos.org)
11 class CEnumMediaTypes
: public IEnumMediaTypes
14 STDMETHODIMP
QueryInterface( REFIID InterfaceId
, PVOID
* Interface
);
16 STDMETHODIMP_(ULONG
) AddRef()
18 InterlockedIncrement(&m_Ref
);
21 STDMETHODIMP_(ULONG
) Release()
23 InterlockedDecrement(&m_Ref
);
32 HRESULT STDMETHODCALLTYPE
Next(ULONG cMediaTypes
, AM_MEDIA_TYPE
**ppMediaTypes
, ULONG
*pcFetched
);
33 HRESULT STDMETHODCALLTYPE
Skip(ULONG cMediaTypes
);
34 HRESULT STDMETHODCALLTYPE
Reset();
35 HRESULT STDMETHODCALLTYPE
Clone(IEnumMediaTypes
**ppEnum
);
38 CEnumMediaTypes(ULONG MediaTypeCount
, AM_MEDIA_TYPE
* MediaTypes
) : m_Ref(0), m_MediaTypeCount(MediaTypeCount
), m_MediaTypes(MediaTypes
), m_Index(0){};
39 virtual ~CEnumMediaTypes(){};
43 ULONG m_MediaTypeCount
;
44 AM_MEDIA_TYPE
* m_MediaTypes
;
50 CEnumMediaTypes::QueryInterface(
54 if (IsEqualGUID(refiid
, IID_IUnknown
))
56 *Output
= PVOID(this);
57 reinterpret_cast<IUnknown
*>(*Output
)->AddRef();
60 if (IsEqualGUID(refiid
, IID_IEnumMediaTypes
))
62 *Output
= (IEnumMediaTypes
*)(this);
63 reinterpret_cast<IEnumMediaTypes
*>(*Output
)->AddRef();
67 WCHAR Buffer
[MAX_PATH
];
69 StringFromCLSID(refiid
, &lpstr
);
70 swprintf(Buffer
, L
"CEnumMediaTypes::QueryInterface: NoInterface for %s\n", lpstr
);
71 OutputDebugStringW(Buffer
);
77 //-------------------------------------------------------------------
83 CEnumMediaTypes::Next(
85 AM_MEDIA_TYPE
**ppMediaTypes
,
89 AM_MEDIA_TYPE
* MediaType
;
94 if (cMediaTypes
> 1 && !pcFetched
)
97 while(i
< cMediaTypes
)
99 if (m_Index
+ i
>= m_MediaTypeCount
)
102 MediaType
= (AM_MEDIA_TYPE
*)CoTaskMemAlloc(sizeof(AM_MEDIA_TYPE
));
106 CopyMemory(MediaType
, &m_MediaTypes
[m_Index
+ i
], sizeof(AM_MEDIA_TYPE
));
107 ppMediaTypes
[i
] = MediaType
;
126 CEnumMediaTypes::Skip(
129 if (cMediaTypes
+ m_Index
>= m_MediaTypeCount
)
134 m_Index
+= cMediaTypes
;
140 CEnumMediaTypes::Reset()
148 CEnumMediaTypes::Clone(
149 IEnumMediaTypes
**ppEnum
)
151 OutputDebugStringW(L
"CEnumMediaTypes::Clone : NotImplemented\n");
157 CEnumMediaTypes_fnConstructor(
159 ULONG MediaTypeCount
,
160 AM_MEDIA_TYPE
* MediaTypes
,
164 CEnumMediaTypes
* handler
= new CEnumMediaTypes(MediaTypeCount
, MediaTypes
);
167 WCHAR Buffer
[MAX_PATH
];
169 StringFromCLSID(riid
, &lpstr
);
170 swprintf(Buffer
, L
"CEnumMediaTypes_fnConstructor riid %s pUnknown %p\n", lpstr
, pUnknown
);
171 OutputDebugStringW(Buffer
);
176 CoTaskMemFree(MediaTypes
);
177 return E_OUTOFMEMORY
;
180 if (FAILED(handler
->QueryInterface(riid
, ppv
)))
184 return E_NOINTERFACE
;