Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygenenum_mediatypes.cpp
Go to the documentation of this file.
00001 /* 00002 * COPYRIGHT: See COPYING in the top level directory 00003 * PROJECT: ReactOS Network Provider for MPEG2 based networks 00004 * FILE: dll/directx/msdvbnp/enum_mediatypes.cpp 00005 * PURPOSE: IEnumMediaTypes interface 00006 * 00007 * PROGRAMMERS: Johannes Anderwald (janderwald@reactos.org) 00008 */ 00009 #include "precomp.h" 00010 00011 class CEnumMediaTypes : public IEnumMediaTypes 00012 { 00013 public: 00014 STDMETHODIMP QueryInterface( REFIID InterfaceId, PVOID* Interface); 00015 00016 STDMETHODIMP_(ULONG) AddRef() 00017 { 00018 InterlockedIncrement(&m_Ref); 00019 return m_Ref; 00020 } 00021 STDMETHODIMP_(ULONG) Release() 00022 { 00023 InterlockedDecrement(&m_Ref); 00024 if (!m_Ref) 00025 { 00026 delete this; 00027 return 0; 00028 } 00029 return m_Ref; 00030 } 00031 00032 HRESULT STDMETHODCALLTYPE Next(ULONG cMediaTypes, AM_MEDIA_TYPE **ppMediaTypes, ULONG *pcFetched); 00033 HRESULT STDMETHODCALLTYPE Skip(ULONG cMediaTypes); 00034 HRESULT STDMETHODCALLTYPE Reset(); 00035 HRESULT STDMETHODCALLTYPE Clone(IEnumMediaTypes **ppEnum); 00036 00037 00038 CEnumMediaTypes(ULONG MediaTypeCount, AM_MEDIA_TYPE * MediaTypes) : m_Ref(0), m_MediaTypeCount(MediaTypeCount), m_MediaTypes(MediaTypes), m_Index(0){}; 00039 virtual ~CEnumMediaTypes(){}; 00040 00041 protected: 00042 LONG m_Ref; 00043 ULONG m_MediaTypeCount; 00044 AM_MEDIA_TYPE * m_MediaTypes; 00045 ULONG m_Index; 00046 }; 00047 00048 HRESULT 00049 STDMETHODCALLTYPE 00050 CEnumMediaTypes::QueryInterface( 00051 IN REFIID refiid, 00052 OUT PVOID* Output) 00053 { 00054 if (IsEqualGUID(refiid, IID_IUnknown)) 00055 { 00056 *Output = PVOID(this); 00057 reinterpret_cast<IUnknown*>(*Output)->AddRef(); 00058 return NOERROR; 00059 } 00060 if (IsEqualGUID(refiid, IID_IEnumMediaTypes)) 00061 { 00062 *Output = (IEnumMediaTypes*)(this); 00063 reinterpret_cast<IEnumMediaTypes*>(*Output)->AddRef(); 00064 return NOERROR; 00065 } 00066 00067 WCHAR Buffer[MAX_PATH]; 00068 LPOLESTR lpstr; 00069 StringFromCLSID(refiid, &lpstr); 00070 swprintf(Buffer, L"CEnumMediaTypes::QueryInterface: NoInterface for %s\n", lpstr); 00071 OutputDebugStringW(Buffer); 00072 CoTaskMemFree(lpstr); 00073 00074 return E_NOINTERFACE; 00075 } 00076 00077 //------------------------------------------------------------------- 00078 // IEnumMediaTypes 00079 // 00080 00081 HRESULT 00082 STDMETHODCALLTYPE 00083 CEnumMediaTypes::Next( 00084 ULONG cMediaTypes, 00085 AM_MEDIA_TYPE **ppMediaTypes, 00086 ULONG *pcFetched) 00087 { 00088 ULONG i = 0; 00089 AM_MEDIA_TYPE * MediaType; 00090 00091 if (!ppMediaTypes) 00092 return E_POINTER; 00093 00094 if (cMediaTypes > 1 && !pcFetched) 00095 return E_INVALIDARG; 00096 00097 while(i < cMediaTypes) 00098 { 00099 if (m_Index + i >= m_MediaTypeCount) 00100 break; 00101 00102 MediaType = (AM_MEDIA_TYPE*)CoTaskMemAlloc(sizeof(AM_MEDIA_TYPE)); 00103 if (!MediaType) 00104 break; 00105 00106 CopyMemory(MediaType, &m_MediaTypes[m_Index + i], sizeof(AM_MEDIA_TYPE)); 00107 ppMediaTypes[i] = MediaType; 00108 i++; 00109 } 00110 00111 if (pcFetched) 00112 { 00113 *pcFetched = i; 00114 } 00115 00116 m_Index += i; 00117 00118 if (i < cMediaTypes) 00119 return S_FALSE; 00120 else 00121 return S_OK; 00122 } 00123 00124 HRESULT 00125 STDMETHODCALLTYPE 00126 CEnumMediaTypes::Skip( 00127 ULONG cMediaTypes) 00128 { 00129 if (cMediaTypes + m_Index >= m_MediaTypeCount) 00130 { 00131 return S_FALSE; 00132 } 00133 00134 m_Index += cMediaTypes; 00135 return S_OK; 00136 } 00137 00138 HRESULT 00139 STDMETHODCALLTYPE 00140 CEnumMediaTypes::Reset() 00141 { 00142 m_Index = 0; 00143 return S_OK; 00144 } 00145 00146 HRESULT 00147 STDMETHODCALLTYPE 00148 CEnumMediaTypes::Clone( 00149 IEnumMediaTypes **ppEnum) 00150 { 00151 OutputDebugStringW(L"CEnumMediaTypes::Clone : NotImplemented\n"); 00152 return E_NOTIMPL; 00153 } 00154 00155 HRESULT 00156 WINAPI 00157 CEnumMediaTypes_fnConstructor( 00158 IUnknown *pUnknown, 00159 ULONG MediaTypeCount, 00160 AM_MEDIA_TYPE * MediaTypes, 00161 REFIID riid, 00162 LPVOID * ppv) 00163 { 00164 CEnumMediaTypes * handler = new CEnumMediaTypes(MediaTypeCount, MediaTypes); 00165 00166 #ifdef MSDVBNP_TRACE 00167 WCHAR Buffer[MAX_PATH]; 00168 LPOLESTR lpstr; 00169 StringFromCLSID(riid, &lpstr); 00170 swprintf(Buffer, L"CEnumMediaTypes_fnConstructor riid %s pUnknown %p\n", lpstr, pUnknown); 00171 OutputDebugStringW(Buffer); 00172 #endif 00173 00174 if (!handler) 00175 { 00176 CoTaskMemFree(MediaTypes); 00177 return E_OUTOFMEMORY; 00178 } 00179 00180 if (FAILED(handler->QueryInterface(riid, ppv))) 00181 { 00182 /* not supported */ 00183 delete handler; 00184 return E_NOINTERFACE; 00185 } 00186 00187 return NOERROR; 00188 } 00189 Generated on Mon May 28 2012 04:21:20 for ReactOS by
1.7.6.1
|