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 (janderwald@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();
70 //-------------------------------------------------------------------
76 CEnumMediaTypes::Next(
78 AM_MEDIA_TYPE
**ppMediaTypes
,
82 AM_MEDIA_TYPE
* MediaType
;
87 if (cMediaTypes
> 1 && !pcFetched
)
90 while(i
< cMediaTypes
)
92 if (m_Index
+ i
>= m_MediaTypeCount
)
95 MediaType
= (AM_MEDIA_TYPE
*)CoTaskMemAlloc(sizeof(AM_MEDIA_TYPE
));
99 if (m_MediaTypes
[m_Index
+ i
].cbFormat
)
101 LPBYTE pFormat
= (LPBYTE
)CoTaskMemAlloc(m_MediaTypes
[m_Index
+ i
].cbFormat
);
104 CoTaskMemFree(MediaType
);
108 CopyMemory(MediaType
, &m_MediaTypes
[m_Index
+ i
], sizeof(AM_MEDIA_TYPE
));
109 MediaType
->pbFormat
= pFormat
;
110 CopyMemory(MediaType
->pbFormat
, m_MediaTypes
[m_Index
+ i
].pbFormat
, m_MediaTypes
[m_Index
+ i
].cbFormat
);
111 MediaType
->pUnk
= (IUnknown
*)this;
112 MediaType
->pUnk
->AddRef();
116 CopyMemory(MediaType
, &m_MediaTypes
[m_Index
+ i
], sizeof(AM_MEDIA_TYPE
));
121 MediaType
->pUnk
->AddRef();
124 ppMediaTypes
[i
] = MediaType
;
142 CEnumMediaTypes::Skip(
145 if (cMediaTypes
+ m_Index
>= m_MediaTypeCount
)
150 m_Index
+= cMediaTypes
;
156 CEnumMediaTypes::Reset()
164 CEnumMediaTypes::Clone(
165 IEnumMediaTypes
**ppEnum
)
168 OutputDebugStringW(L
"CEnumMediaTypes::Clone : NotImplemented\n");
175 CEnumMediaTypes_fnConstructor(
176 ULONG MediaTypeCount
,
177 AM_MEDIA_TYPE
* MediaTypes
,
181 CEnumMediaTypes
* handler
= new CEnumMediaTypes(MediaTypeCount
, MediaTypes
);
184 WCHAR Buffer
[MAX_PATH
];
186 StringFromCLSID(riid
, &lpstr
);
187 swprintf(Buffer
, L
"CEnumMediaTypes_fnConstructor riid %s\n", lpstr
);
188 OutputDebugStringW(Buffer
);
193 CoTaskMemFree(MediaTypes
);
194 return E_OUTOFMEMORY
;
197 if (FAILED(handler
->QueryInterface(riid
, ppv
)))
201 return E_NOINTERFACE
;