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

format.c
Go to the documentation of this file.
00001 /*
00002  * Copyright 2005 Jacek Caban
00003  *
00004  * This library is free software; you can redistribute it and/or
00005  * modify it under the terms of the GNU Lesser General Public
00006  * License as published by the Free Software Foundation; either
00007  * version 2.1 of the License, or (at your option) any later version.
00008  *
00009  * This library is distributed in the hope that it will be useful,
00010  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00011  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00012  * Lesser General Public License for more details.
00013  *
00014  * You should have received a copy of the GNU Lesser General Public
00015  * License along with this library; if not, write to the Free Software
00016  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
00017  */
00018 
00019 #include "urlmon_main.h"
00020 #include "wine/debug.h"
00021 
00022 WINE_DEFAULT_DEBUG_CHANNEL(urlmon);
00023 
00024 static WCHAR wszEnumFORMATETC[] = {'_','E','n','u','m','F','O','R','M','A','T','E','T','C','_',0};
00025 
00026 typedef struct {
00027     IEnumFORMATETC IEnumFORMATETC_iface;
00028 
00029     FORMATETC *fetc;
00030     UINT fetc_cnt;
00031     UINT it;
00032 
00033     LONG ref;
00034 } EnumFORMATETC;
00035 
00036 static inline EnumFORMATETC *impl_from_IEnumFORMATETC(IEnumFORMATETC *iface)
00037 {
00038     return CONTAINING_RECORD(iface, EnumFORMATETC, IEnumFORMATETC_iface);
00039 }
00040 
00041 static IEnumFORMATETC *EnumFORMATETC_Create(UINT cfmtetc, const FORMATETC *rgfmtetc, UINT it);
00042 
00043 static HRESULT WINAPI EnumFORMATETC_QueryInterface(IEnumFORMATETC *iface, REFIID riid, void **ppv)
00044 {
00045     EnumFORMATETC *This = impl_from_IEnumFORMATETC(iface);
00046 
00047     TRACE("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppv);
00048 
00049     *ppv = NULL;
00050 
00051     if(IsEqualGUID(&IID_IUnknown, riid) || IsEqualGUID(&IID_IEnumFORMATETC, riid)) {
00052         IEnumFORMATETC_AddRef(iface);
00053         *ppv = iface;
00054         return S_OK;
00055     }
00056 
00057     WARN("not supported interface %s\n", debugstr_guid(riid));
00058     return E_NOINTERFACE;
00059 }
00060 
00061 static ULONG WINAPI EnumFORMATETC_AddRef(IEnumFORMATETC *iface)
00062 {
00063     EnumFORMATETC *This = impl_from_IEnumFORMATETC(iface);
00064     LONG ref = InterlockedIncrement(&This->ref);
00065     TRACE("(%p) ref=%d\n", This, ref);
00066     return ref;
00067 }
00068 
00069 static ULONG WINAPI EnumFORMATETC_Release(IEnumFORMATETC *iface)
00070 {
00071     EnumFORMATETC *This = impl_from_IEnumFORMATETC(iface);
00072     LONG ref = InterlockedDecrement(&This->ref);
00073 
00074     TRACE("(%p) ref=%d\n", This, ref);
00075 
00076     if(!ref) {
00077         heap_free(This->fetc);
00078         heap_free(This);
00079 
00080         URLMON_UnlockModule();
00081     }
00082 
00083     return ref;
00084 }
00085 
00086 static HRESULT WINAPI EnumFORMATETC_Next(IEnumFORMATETC *iface, ULONG celt,
00087         FORMATETC *rgelt, ULONG *pceltFetched)
00088 {
00089     EnumFORMATETC *This = impl_from_IEnumFORMATETC(iface);
00090     ULONG cnt;
00091 
00092     TRACE("(%p)->(%d %p %p)\n", This, celt, rgelt, pceltFetched);
00093 
00094     if(!rgelt)
00095         return E_INVALIDARG;
00096 
00097     if(This->it >= This->fetc_cnt || !celt) {
00098         if(pceltFetched)
00099             *pceltFetched = 0;
00100         return celt ? S_FALSE : S_OK;
00101     }
00102 
00103     cnt = This->fetc_cnt-This->it > celt ? celt : This->fetc_cnt-This->it;
00104 
00105     memcpy(rgelt, This->fetc+This->it, cnt*sizeof(FORMATETC));
00106     This->it += cnt;
00107 
00108     if(pceltFetched)
00109         *pceltFetched = cnt;
00110 
00111     return cnt == celt ? S_OK : S_FALSE;
00112 }
00113 
00114 static HRESULT WINAPI EnumFORMATETC_Skip(IEnumFORMATETC *iface, ULONG celt)
00115 {
00116     EnumFORMATETC *This = impl_from_IEnumFORMATETC(iface);
00117 
00118     TRACE("(%p)->(%d)\n", This, celt);
00119 
00120     This->it += celt;
00121     return This->it > This->fetc_cnt ? S_FALSE : S_OK;
00122 }
00123 
00124 static HRESULT WINAPI EnumFORMATETC_Reset(IEnumFORMATETC *iface)
00125 {
00126     EnumFORMATETC *This = impl_from_IEnumFORMATETC(iface);
00127 
00128     TRACE("(%p)\n", This);
00129 
00130     This->it = 0;
00131     return S_OK;
00132 }
00133 
00134 static HRESULT WINAPI EnumFORMATETC_Clone(IEnumFORMATETC *iface, IEnumFORMATETC **ppenum)
00135 {
00136     EnumFORMATETC *This = impl_from_IEnumFORMATETC(iface);
00137 
00138     TRACE("(%p)->(%p)\n", This, ppenum);
00139 
00140     if(!ppenum)
00141         return E_INVALIDARG;
00142 
00143     *ppenum = EnumFORMATETC_Create(This->fetc_cnt, This->fetc, This->it);
00144     return S_OK;
00145 }
00146 
00147 static const IEnumFORMATETCVtbl EnumFORMATETCVtbl = {
00148     EnumFORMATETC_QueryInterface,
00149     EnumFORMATETC_AddRef,
00150     EnumFORMATETC_Release,
00151     EnumFORMATETC_Next,
00152     EnumFORMATETC_Skip,
00153     EnumFORMATETC_Reset,
00154     EnumFORMATETC_Clone
00155 };
00156 
00157 static IEnumFORMATETC *EnumFORMATETC_Create(UINT cfmtetc, const FORMATETC *rgfmtetc, UINT it)
00158 {
00159     EnumFORMATETC *ret = heap_alloc(sizeof(EnumFORMATETC));
00160 
00161     URLMON_LockModule();
00162 
00163     ret->IEnumFORMATETC_iface.lpVtbl = &EnumFORMATETCVtbl;
00164     ret->ref = 1;
00165     ret->it = it;
00166     ret->fetc_cnt = cfmtetc;
00167 
00168     ret->fetc = heap_alloc(cfmtetc*sizeof(FORMATETC));
00169     memcpy(ret->fetc, rgfmtetc, cfmtetc*sizeof(FORMATETC));
00170 
00171     return &ret->IEnumFORMATETC_iface;
00172 }
00173 
00174 /**********************************************************
00175  *      CreateFormatEnumerator (urlmon.@)
00176  */
00177 HRESULT WINAPI CreateFormatEnumerator(UINT cfmtetc, FORMATETC *rgfmtetc,
00178         IEnumFORMATETC** ppenumfmtetc)
00179 {
00180     TRACE("(%d %p %p)\n", cfmtetc, rgfmtetc, ppenumfmtetc);
00181 
00182     if(!ppenumfmtetc)
00183         return E_INVALIDARG;
00184     if(!cfmtetc)
00185         return E_FAIL;
00186 
00187     *ppenumfmtetc = EnumFORMATETC_Create(cfmtetc, rgfmtetc, 0);
00188     return S_OK;
00189 }
00190 
00191 /**********************************************************
00192  *      RegisterFormatEnumerator (urlmon.@)
00193  */
00194 HRESULT WINAPI RegisterFormatEnumerator(LPBC pBC, IEnumFORMATETC *pEFetc, DWORD reserved)
00195 {
00196     TRACE("(%p %p %d)\n", pBC, pEFetc, reserved);
00197 
00198     if(reserved)
00199         WARN("reserved != 0\n");
00200 
00201     if(!pBC || !pEFetc)
00202         return E_INVALIDARG;
00203 
00204     return IBindCtx_RegisterObjectParam(pBC, wszEnumFORMATETC, (IUnknown*)pEFetc);
00205 }
00206 
00207 /**********************************************************
00208  *      RevokeFormatEnumerator (urlmon.@)
00209  */
00210 HRESULT WINAPI RevokeFormatEnumerator(LPBC pbc, IEnumFORMATETC *pEFetc)
00211 {
00212     TRACE("(%p %p)\n", pbc, pEFetc);
00213 
00214     if(!pbc)
00215         return E_INVALIDARG;
00216 
00217     return IBindCtx_RevokeObjectParam(pbc, wszEnumFORMATETC);
00218 }

Generated on Fri May 25 2012 04:16:08 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.