ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

enum_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 doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.