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

enumfilters.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 doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.