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(std::vector<IPin*> Pins) : m_Ref(0), m_Pins(Pins), m_Index(0){}; 00039 virtual ~CEnumPins(){}; 00040 00041 protected: 00042 LONG m_Ref; 00043 std::vector<IPin*> m_Pins; 00044 ULONG m_Index; 00045 }; 00046 00047 HRESULT 00048 STDMETHODCALLTYPE 00049 CEnumPins::QueryInterface( 00050 IN REFIID refiid, 00051 OUT PVOID* Output) 00052 { 00053 *Output = NULL; 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[100]; 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_Pins.size()) 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 if (i < cPins) 00110 return S_FALSE; 00111 else 00112 return S_OK; 00113 } 00114 00115 HRESULT 00116 STDMETHODCALLTYPE 00117 CEnumPins::Skip( 00118 ULONG cPins) 00119 { 00120 if (cPins + m_Index >= m_Pins.size()) 00121 { 00122 return S_FALSE; 00123 } 00124 00125 m_Index += cPins; 00126 return S_OK; 00127 } 00128 00129 HRESULT 00130 STDMETHODCALLTYPE 00131 CEnumPins::Reset() 00132 { 00133 m_Index = 0; 00134 return S_OK; 00135 } 00136 00137 HRESULT 00138 STDMETHODCALLTYPE 00139 CEnumPins::Clone( 00140 IEnumPins **ppEnum) 00141 { 00142 #ifdef KSPROXY_TRACE 00143 OutputDebugStringW(L"CEnumPins::Clone : NotImplemented\n"); 00144 #endif 00145 00146 return E_NOTIMPL; 00147 } 00148 00149 HRESULT 00150 WINAPI 00151 CEnumPins_fnConstructor( 00152 std::vector<IPin*> Pins, 00153 REFIID riid, 00154 LPVOID * ppv) 00155 { 00156 CEnumPins * handler = new CEnumPins(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 Sat May 26 2012 04:20:22 for ReactOS by
1.7.6.1
|