[KSPROXY]
[reactos.git] / reactos / dll / directx / ksproxy / enumpins.cpp
1 /*
2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS Network Provider for MPEG2 based networks
4 * FILE: dll/directx/msdvbnp/enumpins.cpp
5 * PURPOSE: IEnumPins interface
6 *
7 * PROGRAMMERS: Johannes Anderwald (janderwald@reactos.org)
8 */
9 #include "precomp.h"
10
11 class CEnumPins : public IEnumPins
12 {
13 public:
14 STDMETHODIMP QueryInterface( REFIID InterfaceId, PVOID* Interface);
15
16 STDMETHODIMP_(ULONG) AddRef()
17 {
18 InterlockedIncrement(&m_Ref);
19 return m_Ref;
20 }
21 STDMETHODIMP_(ULONG) Release()
22 {
23 InterlockedDecrement(&m_Ref);
24 if (!m_Ref)
25 {
26 delete this;
27 return 0;
28 }
29 return m_Ref;
30 }
31
32
33 HRESULT STDMETHODCALLTYPE Next(ULONG cPins, IPin **ppPins, ULONG *pcFetched);
34 HRESULT STDMETHODCALLTYPE Skip(ULONG cPins);
35 HRESULT STDMETHODCALLTYPE Reset();
36 HRESULT STDMETHODCALLTYPE Clone(IEnumPins **ppEnum);
37
38 CEnumPins(std::vector<IPin*> Pins) : m_Ref(0), m_Pins(Pins), m_Index(0){};
39 virtual ~CEnumPins(){};
40
41 protected:
42 LONG m_Ref;
43 std::vector<IPin*> m_Pins;
44 ULONG m_Index;
45 };
46
47 HRESULT
48 STDMETHODCALLTYPE
49 CEnumPins::QueryInterface(
50 IN REFIID refiid,
51 OUT PVOID* Output)
52 {
53 *Output = NULL;
54 if (IsEqualGUID(refiid, IID_IUnknown))
55 {
56 *Output = PVOID(this);
57 reinterpret_cast<IUnknown*>(*Output)->AddRef();
58 return NOERROR;
59 }
60 if (IsEqualGUID(refiid, IID_IEnumPins))
61 {
62 *Output = (IEnumPins*)(this);
63 reinterpret_cast<IEnumPins*>(*Output)->AddRef();
64 return NOERROR;
65 }
66
67 return E_NOINTERFACE;
68 }
69
70 HRESULT
71 STDMETHODCALLTYPE
72 CEnumPins::Next(
73 ULONG cPins,
74 IPin **ppPins,
75 ULONG *pcFetched)
76 {
77 ULONG i = 0;
78
79 if (!ppPins)
80 return E_POINTER;
81
82 if (cPins > 1 && !pcFetched)
83 return E_INVALIDARG;
84
85 while(i < cPins)
86 {
87 if (m_Index + i >= m_Pins.size())
88 break;
89
90 ppPins[i] = m_Pins[m_Index + i];
91 m_Pins[m_Index + i]->AddRef();
92
93 i++;
94 }
95
96 if (pcFetched)
97 {
98 *pcFetched = i;
99 }
100
101 m_Index += i;
102 if (i < cPins)
103 return S_FALSE;
104 else
105 return S_OK;
106 }
107
108 HRESULT
109 STDMETHODCALLTYPE
110 CEnumPins::Skip(
111 ULONG cPins)
112 {
113 if (cPins + m_Index >= m_Pins.size())
114 {
115 return S_FALSE;
116 }
117
118 m_Index += cPins;
119 return S_OK;
120 }
121
122 HRESULT
123 STDMETHODCALLTYPE
124 CEnumPins::Reset()
125 {
126 m_Index = 0;
127 return S_OK;
128 }
129
130 HRESULT
131 STDMETHODCALLTYPE
132 CEnumPins::Clone(
133 IEnumPins **ppEnum)
134 {
135 #ifdef KSPROXY_TRACE
136 OutputDebugStringW(L"CEnumPins::Clone : NotImplemented\n");
137 #endif
138
139 return E_NOTIMPL;
140 }
141
142 HRESULT
143 WINAPI
144 CEnumPins_fnConstructor(
145 std::vector<IPin*> Pins,
146 REFIID riid,
147 LPVOID * ppv)
148 {
149 CEnumPins * handler = new CEnumPins(Pins);
150
151 if (!handler)
152 return E_OUTOFMEMORY;
153
154 if (FAILED(handler->QueryInterface(riid, ppv)))
155 {
156 /* not supported */
157 delete handler;
158 return E_NOINTERFACE;
159 }
160
161 return NOERROR;
162 }