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

enumpins.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/enumpins.cpp
00005  * PURPOSE:         IEnumPins interface
00006  *
00007  * PROGRAMMERS:     Johannes Anderwald (janderwald@reactos.org)
00008  */
00009 #include "precomp.h"
00010 
00011 class CEnumPins : public IEnumPins
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 
00033     HRESULT STDMETHODCALLTYPE Next(ULONG cPins, IPin **ppPins, ULONG *pcFetched);
00034     HRESULT STDMETHODCALLTYPE Skip(ULONG cPins);
00035     HRESULT STDMETHODCALLTYPE Reset();
00036     HRESULT STDMETHODCALLTYPE Clone(IEnumPins **ppEnum);
00037 
00038     CEnumPins(ULONG NumPins, IPin ** pins) : m_Ref(0), m_NumPins(NumPins), m_Pins(pins), m_Index(0){};
00039     virtual ~CEnumPins(){};
00040 
00041 protected:
00042     LONG m_Ref;
00043     ULONG m_NumPins;
00044     IPin ** m_Pins;
00045     ULONG m_Index;
00046 };
00047 
00048 HRESULT
00049 STDMETHODCALLTYPE
00050 CEnumPins::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_IEnumPins))
00061     {
00062         *Output = (IEnumPins*)(this);
00063         reinterpret_cast<IEnumPins*>(*Output)->AddRef();
00064         return NOERROR;
00065     }
00066 
00067     WCHAR Buffer[MAX_PATH];
00068     LPOLESTR lpstr;
00069     StringFromCLSID(refiid, &lpstr);
00070     swprintf(Buffer, L"CEnumPins::QueryInterface: NoInterface for %s\n", lpstr);
00071     OutputDebugStringW(Buffer);
00072     CoTaskMemFree(lpstr);
00073 
00074     return E_NOINTERFACE;
00075 }
00076 
00077 HRESULT
00078 STDMETHODCALLTYPE
00079 CEnumPins::Next(
00080     ULONG cPins,
00081     IPin **ppPins,
00082     ULONG *pcFetched)
00083 {
00084     ULONG i = 0;
00085 
00086     if (!ppPins)
00087         return E_POINTER;
00088 
00089     if (cPins > 1 && !pcFetched)
00090         return E_INVALIDARG;
00091 
00092     while(i < cPins)
00093     {
00094         if (m_Index + i >= m_NumPins)
00095             break;
00096 
00097         ppPins[i] = m_Pins[m_Index + i];
00098         m_Pins[m_Index + i]->AddRef();
00099 
00100         i++;
00101     }
00102 
00103     if (pcFetched)
00104     {
00105         *pcFetched = i;
00106     }
00107 
00108     m_Index += i;
00109 
00110     if (i < cPins)
00111         return S_FALSE;
00112     else
00113         return S_OK;
00114 }
00115 
00116 HRESULT
00117 STDMETHODCALLTYPE
00118 CEnumPins::Skip(
00119     ULONG cPins)
00120 {
00121     if (cPins + m_Index >= m_NumPins)
00122     {
00123         return S_FALSE;
00124     }
00125 
00126     m_Index += cPins;
00127     return S_OK;
00128 }
00129 
00130 HRESULT
00131 STDMETHODCALLTYPE
00132 CEnumPins::Reset()
00133 {
00134     m_Index = 0;
00135     return S_OK;
00136 }
00137 
00138 HRESULT
00139 STDMETHODCALLTYPE
00140 CEnumPins::Clone(
00141     IEnumPins **ppEnum)
00142 {
00143     OutputDebugStringW(L"CEnumPins::Clone : NotImplemented\n");
00144     return E_NOTIMPL;
00145 }
00146 
00147 HRESULT
00148 WINAPI
00149 CEnumPins_fnConstructor(
00150     IUnknown *pUnknown,
00151     ULONG NumPins,
00152     IPin ** pins,
00153     REFIID riid,
00154     LPVOID * ppv)
00155 {
00156     CEnumPins * handler = new CEnumPins(NumPins, pins);
00157 
00158     if (!handler)
00159         return E_OUTOFMEMORY;
00160 
00161     if (FAILED(handler->QueryInterface(riid, ppv)))
00162     {
00163         /* not supported */
00164         delete handler;
00165         return E_NOINTERFACE;
00166     }
00167 
00168     return NOERROR;
00169 }

Generated on Thu May 24 2012 04:21:58 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.