static ULONG WINAPI EnumFORMATETC_AddRef(IEnumFORMATETC *iface) { ENUMF_THIS(iface); LONG ref = InterlockedIncrement(&This->ref); TRACE("(%p) ref=%d\n", This, ref); return ref; }
static HRESULT WINAPI EnumFORMATETC_Next(IEnumFORMATETC *iface, ULONG celt, FORMATETC *rgelt, ULONG *pceltFetched) { ENUMF_THIS(iface); ULONG cnt; TRACE("(%p)->(%d %p %p)\n", This, celt, rgelt, pceltFetched); if(!rgelt) return E_INVALIDARG; if(This->it >= This->fetc_cnt || !celt) { if(pceltFetched) *pceltFetched = 0; return celt ? S_FALSE : S_OK; } cnt = This->fetc_cnt-This->it > celt ? celt : This->fetc_cnt-This->it; memcpy(rgelt, This->fetc+This->it, cnt*sizeof(FORMATETC)); This->it += cnt; if(pceltFetched) *pceltFetched = cnt; return cnt == celt ? S_OK : S_FALSE; }
static HRESULT WINAPI EnumFORMATETC_Reset(IEnumFORMATETC *iface) { ENUMF_THIS(iface); TRACE("(%p)\n", This); This->it = 0; return S_OK; }
static HRESULT WINAPI EnumFORMATETC_Skip(IEnumFORMATETC *iface, ULONG celt) { ENUMF_THIS(iface); TRACE("(%p)->(%d)\n", This, celt); This->it += celt; return This->it > This->fetc_cnt ? S_FALSE : S_OK; }
static HRESULT WINAPI EnumFORMATETC_Clone(IEnumFORMATETC *iface, IEnumFORMATETC **ppenum) { ENUMF_THIS(iface); TRACE("(%p)->(%p)\n", This, ppenum); if(!ppenum) return E_INVALIDARG; *ppenum = EnumFORMATETC_Create(This->fetc_cnt, This->fetc, This->it); return S_OK; }
static ULONG WINAPI EnumFORMATETC_Release(IEnumFORMATETC *iface) { ENUMF_THIS(iface); LONG ref = InterlockedDecrement(&This->ref); TRACE("(%p) ref=%d\n", This, ref); if(!ref) { heap_free(This->fetc); heap_free(This); URLMON_UnlockModule(); } return ref; }
static HRESULT WINAPI EnumFORMATETC_QueryInterface(IEnumFORMATETC *iface, REFIID riid, void **ppv) { EnumFORMATETC *This = ENUMF_THIS(iface); TRACE("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppv); *ppv = NULL; if(IsEqualGUID(&IID_IUnknown, riid) || IsEqualGUID(&IID_IEnumFORMATETC, riid)) { IEnumFORMATETC_AddRef(iface); *ppv = iface; return S_OK; } WARN("not supported interface %s\n", debugstr_guid(riid)); return E_NOINTERFACE; }