Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygenenumpins.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
1.7.6.1
|