Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygenenumfilters.c
Go to the documentation of this file.
00001 /* 00002 * Implementation of IEnumFilters Interface 00003 * 00004 * Copyright 2004 Christian Costa 00005 * 00006 * This library is free software; you can redistribute it and/or 00007 * modify it under the terms of the GNU Lesser General Public 00008 * License as published by the Free Software Foundation; either 00009 * version 2.1 of the License, or (at your option) any later version. 00010 * 00011 * This library is distributed in the hope that it will be useful, 00012 * but WITHOUT ANY WARRANTY; without even the implied warranty of 00013 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00014 * Lesser General Public License for more details. 00015 * 00016 * You should have received a copy of the GNU Lesser General Public 00017 * License along with this library; if not, write to the Free Software 00018 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA 00019 */ 00020 00021 #include "quartz_private.h" 00022 00023 #include "wine/debug.h" 00024 00025 WINE_DEFAULT_DEBUG_CHANNEL(quartz); 00026 00027 typedef struct IEnumFiltersImpl 00028 { 00029 const IEnumFiltersVtbl * lpVtbl; 00030 LONG refCount; 00031 IBaseFilter ** ppFilters; 00032 int nFilters; 00033 ULONG uIndex; 00034 } IEnumFiltersImpl; 00035 00036 static const struct IEnumFiltersVtbl IEnumFiltersImpl_Vtbl; 00037 00038 HRESULT IEnumFiltersImpl_Construct(IBaseFilter ** ppFilters, ULONG nFilters, IEnumFilters ** ppEnum) 00039 { 00040 /* Note: The incoming IBaseFilter interfaces are not AddRef'd here as in Windows, 00041 * they should have been previously AddRef'd. */ 00042 IEnumFiltersImpl * pEnumFilters = CoTaskMemAlloc(sizeof(IEnumFiltersImpl)); 00043 00044 TRACE("(%p, %d, %p)\n", ppFilters, nFilters, ppEnum); 00045 00046 *ppEnum = NULL; 00047 00048 if (!pEnumFilters) 00049 { 00050 return E_OUTOFMEMORY; 00051 } 00052 00053 pEnumFilters->lpVtbl = &IEnumFiltersImpl_Vtbl; 00054 pEnumFilters->refCount = 1; 00055 pEnumFilters->uIndex = 0; 00056 pEnumFilters->nFilters = nFilters; 00057 pEnumFilters->ppFilters = CoTaskMemAlloc(sizeof(IBaseFilter*) * nFilters); 00058 if (!pEnumFilters->ppFilters) 00059 { 00060 CoTaskMemFree(pEnumFilters); 00061 return E_OUTOFMEMORY; 00062 } 00063 00064 memcpy(pEnumFilters->ppFilters, ppFilters, nFilters * sizeof(IBaseFilter*)); 00065 00066 *ppEnum = (IEnumFilters *)(&pEnumFilters->lpVtbl); 00067 return S_OK; 00068 } 00069 00070 static HRESULT WINAPI IEnumFiltersImpl_QueryInterface(IEnumFilters * iface, REFIID riid, LPVOID * ppv) 00071 { 00072 TRACE("(%p)->(%s, %p)\n", iface, qzdebugstr_guid(riid), ppv); 00073 00074 *ppv = NULL; 00075 00076 if (IsEqualIID(riid, &IID_IUnknown)) 00077 *ppv = iface; 00078 else if (IsEqualIID(riid, &IID_IEnumFilters)) 00079 *ppv = iface; 00080 00081 if (*ppv) 00082 { 00083 IUnknown_AddRef((IUnknown *)(*ppv)); 00084 return S_OK; 00085 } 00086 00087 FIXME("No interface for %s!\n", qzdebugstr_guid(riid)); 00088 00089 return E_NOINTERFACE; 00090 } 00091 00092 static ULONG WINAPI IEnumFiltersImpl_AddRef(IEnumFilters * iface) 00093 { 00094 IEnumFiltersImpl *This = (IEnumFiltersImpl *)iface; 00095 ULONG refCount = InterlockedIncrement(&This->refCount); 00096 00097 TRACE("(%p)->()\n", iface); 00098 00099 return refCount; 00100 } 00101 00102 static ULONG WINAPI IEnumFiltersImpl_Release(IEnumFilters * iface) 00103 { 00104 IEnumFiltersImpl *This = (IEnumFiltersImpl *)iface; 00105 ULONG refCount = InterlockedDecrement(&This->refCount); 00106 00107 TRACE("(%p)->()\n", iface); 00108 00109 if (!refCount) 00110 { 00111 CoTaskMemFree(This->ppFilters); 00112 CoTaskMemFree(This); 00113 return 0; 00114 } 00115 else 00116 return refCount; 00117 } 00118 00119 static HRESULT WINAPI IEnumFiltersImpl_Next(IEnumFilters * iface, ULONG cFilters, IBaseFilter ** ppFilters, ULONG * pcFetched) 00120 { 00121 ULONG cFetched; 00122 ULONG i; 00123 IEnumFiltersImpl *This = (IEnumFiltersImpl *)iface; 00124 00125 cFetched = min(This->nFilters, This->uIndex + cFilters) - This->uIndex; 00126 00127 TRACE("(%p)->(%u, %p, %p)\n", iface, cFilters, ppFilters, pcFetched); 00128 00129 if (!ppFilters) 00130 return E_POINTER; 00131 00132 for (i = 0; i < cFetched; i++) 00133 { 00134 ppFilters[i] = This->ppFilters[This->uIndex + i]; 00135 IBaseFilter_AddRef(ppFilters[i]); 00136 } 00137 00138 This->uIndex += cFetched; 00139 00140 if (pcFetched) 00141 *pcFetched = cFetched; 00142 00143 if (cFetched != cFilters) 00144 return S_FALSE; 00145 return S_OK; 00146 } 00147 00148 static HRESULT WINAPI IEnumFiltersImpl_Skip(IEnumFilters * iface, ULONG cFilters) 00149 { 00150 IEnumFiltersImpl *This = (IEnumFiltersImpl *)iface; 00151 00152 TRACE("(%p)->(%u)\n", iface, cFilters); 00153 00154 if (This->uIndex + cFilters < This->nFilters) 00155 { 00156 This->uIndex += cFilters; 00157 return S_OK; 00158 } 00159 return S_FALSE; 00160 } 00161 00162 static HRESULT WINAPI IEnumFiltersImpl_Reset(IEnumFilters * iface) 00163 { 00164 IEnumFiltersImpl *This = (IEnumFiltersImpl *)iface; 00165 00166 TRACE("(%p)->()\n", iface); 00167 00168 This->uIndex = 0; 00169 return S_OK; 00170 } 00171 00172 static HRESULT WINAPI IEnumFiltersImpl_Clone(IEnumFilters * iface, IEnumFilters ** ppEnum) 00173 { 00174 HRESULT hr; 00175 IEnumFiltersImpl *This = (IEnumFiltersImpl *)iface; 00176 00177 TRACE("(%p)->(%p)\n", iface, ppEnum); 00178 00179 hr = IEnumFiltersImpl_Construct(This->ppFilters, This->nFilters, ppEnum); 00180 if (FAILED(hr)) 00181 return hr; 00182 return IEnumFilters_Skip(*ppEnum, This->uIndex); 00183 } 00184 00185 static const IEnumFiltersVtbl IEnumFiltersImpl_Vtbl = 00186 { 00187 IEnumFiltersImpl_QueryInterface, 00188 IEnumFiltersImpl_AddRef, 00189 IEnumFiltersImpl_Release, 00190 IEnumFiltersImpl_Next, 00191 IEnumFiltersImpl_Skip, 00192 IEnumFiltersImpl_Reset, 00193 IEnumFiltersImpl_Clone 00194 }; Generated on Sat May 26 2012 04:20:27 for ReactOS by
1.7.6.1
|