Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygenformat.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
1.7.6.1
|