/* * IEnumFORMATETC, IDataObject * * selecting and droping objects within the shell and/or common dialogs * * Copyright 1998 */ #include "debug.h" #include "shlobj.h" #include "winerror.h" #include "shell32_main.h" /*********************************************************************** * IEnumFORMATETC implementation */ static HRESULT WINAPI IEnumFORMATETC_QueryInterface (LPENUMFORMATETC this, REFIID riid, LPVOID * ppvObj); static ULONG WINAPI IEnumFORMATETC_AddRef (LPENUMFORMATETC this); static ULONG WINAPI IEnumFORMATETC_Release (LPENUMFORMATETC this); static HRESULT WINAPI IEnumFORMATETC_Next(LPENUMFORMATETC this, ULONG celt, FORMATETC32 *rgelt, ULONG *pceltFethed); static HRESULT WINAPI IEnumFORMATETC_Skip(LPENUMFORMATETC this, ULONG celt); static HRESULT WINAPI IEnumFORMATETC_Reset(LPENUMFORMATETC this); static HRESULT WINAPI IEnumFORMATETC_Clone(LPENUMFORMATETC this, LPENUMFORMATETC* ppenum); static struct IEnumFORMATETC_VTable efvt = { IEnumFORMATETC_QueryInterface, IEnumFORMATETC_AddRef, IEnumFORMATETC_Release, IEnumFORMATETC_Next, IEnumFORMATETC_Skip, IEnumFORMATETC_Reset, IEnumFORMATETC_Clone }; extern LPENUMFORMATETC IEnumFORMATETC_Constructor(UINT32 cfmt, const FORMATETC32 afmt[]) { LPENUMFORMATETC ef; DWORD size=cfmt * sizeof(FORMATETC32); ef=(LPENUMFORMATETC)HeapAlloc(GetProcessHeap(),0,sizeof(IEnumFORMATETC)); ef->ref=1; ef->lpvtbl=&efvt; ef->posFmt = 0; ef->countFmt = cfmt; ef->pFmt = SHAlloc (size); if (ef->pFmt) { memcpy(ef->pFmt, afmt, size); } TRACE(shell,"(%p)->()\n",ef); return ef; } static HRESULT WINAPI IEnumFORMATETC_QueryInterface (LPENUMFORMATETC this, REFIID riid, LPVOID * ppvObj) { char xriid[50]; WINE_StringFromCLSID((LPCLSID)riid,xriid); TRACE(shell,"(%p)->(\n\tIID:\t%s,%p)\n",this,xriid,ppvObj); *ppvObj = NULL; if(IsEqualIID(riid, &IID_IUnknown)) { *ppvObj = this; } else if(IsEqualIID(riid, &IID_IEnumFORMATETC)) { *ppvObj = (IDataObject*)this; } if(*ppvObj) { (*(LPENUMFORMATETC*)ppvObj)->lpvtbl->fnAddRef(this); TRACE(shell,"-- Interface: (%p)->(%p)\n",ppvObj,*ppvObj); return S_OK; } TRACE(shell,"-- Interface: E_NOINTERFACE\n"); return E_NOINTERFACE; } static ULONG WINAPI IEnumFORMATETC_AddRef (LPENUMFORMATETC this) { TRACE(shell,"(%p)->(count=%lu)\n",this,(this->ref)+1); return ++(this->ref); } static ULONG WINAPI IEnumFORMATETC_Release (LPENUMFORMATETC this) { TRACE(shell,"(%p)->()\n",this); if (!--(this->ref)) { TRACE(shell," destroying IEnumFORMATETC(%p)\n",this); if (this->pFmt) { SHFree (this->pFmt); } HeapFree(GetProcessHeap(),0,this); return 0; } return this->ref; } static HRESULT WINAPI IEnumFORMATETC_Next(LPENUMFORMATETC this, ULONG celt, FORMATETC32 *rgelt, ULONG *pceltFethed) { UINT32 cfetch; HRESULT hres = S_FALSE; TRACE (shell, "(%p)->()\n", this); if (this->posFmt < this->countFmt) { cfetch = this->countFmt - this->posFmt; if (cfetch >= celt) { cfetch = celt; hres = S_OK; } memcpy(rgelt, &this->pFmt[this->posFmt], cfetch * sizeof(FORMATETC32)); this->posFmt += cfetch; } else { cfetch = 0; } if (pceltFethed) { *pceltFethed = cfetch; } return hres; } static HRESULT WINAPI IEnumFORMATETC_Skip(LPENUMFORMATETC this, ULONG celt) { FIXME (shell, "(%p)->(num=%lu)\n", this, celt); this->posFmt += celt; if (this->posFmt > this->countFmt) { this->posFmt = this->countFmt; return S_FALSE; } return S_OK; } static HRESULT WINAPI IEnumFORMATETC_Reset(LPENUMFORMATETC this) { FIXME (shell, "(%p)->()\n", this); this->posFmt = 0; return S_OK; } static HRESULT WINAPI IEnumFORMATETC_Clone(LPENUMFORMATETC this, LPENUMFORMATETC* ppenum) { FIXME (shell, "(%p)->(ppenum=%p)\n", this, ppenum); return E_NOTIMPL; } /*********************************************************************** * IDataObject implementation */ static HRESULT WINAPI IDataObject_QueryInterface (LPDATAOBJECT, REFIID riid, LPVOID * ppvObj); static ULONG WINAPI IDataObject_AddRef (LPDATAOBJECT); static ULONG WINAPI IDataObject_Release (LPDATAOBJECT); static HRESULT WINAPI IDataObject_GetData (LPDATAOBJECT, LPFORMATETC32 pformatetcIn, STGMEDIUM32 *pmedium); static HRESULT WINAPI IDataObject_GetDataHere(LPDATAOBJECT, LPFORMATETC32 pformatetc, STGMEDIUM32 *pmedium); static HRESULT WINAPI IDataObject_QueryGetData(LPDATAOBJECT, LPFORMATETC32 pformatetc); static HRESULT WINAPI IDataObject_GetCanonicalFormatEtc(LPDATAOBJECT, LPFORMATETC32 pformatectIn, LPFORMATETC32 pformatetcOut); static HRESULT WINAPI IDataObject_SetData(LPDATAOBJECT, LPFORMATETC32 pformatetc, STGMEDIUM32 *pmedium, BOOL32 fRelease); static HRESULT WINAPI IDataObject_EnumFormatEtc(LPDATAOBJECT, DWORD dwDirection, IEnumFORMATETC **ppenumFormatEtc); static HRESULT WINAPI IDataObject_DAdvise (LPDATAOBJECT, LPFORMATETC32 *pformatetc, DWORD advf, IAdviseSink *pAdvSink, DWORD *pdwConnection); static HRESULT WINAPI IDataObject_DUnadvise(LPDATAOBJECT, DWORD dwConnection); static HRESULT WINAPI IDataObject_EnumDAdvise(LPDATAOBJECT, IEnumSTATDATA **ppenumAdvise); static struct IDataObject_VTable dtovt = { IDataObject_QueryInterface, IDataObject_AddRef, IDataObject_Release, IDataObject_GetData, IDataObject_GetDataHere, IDataObject_QueryGetData, IDataObject_GetCanonicalFormatEtc, IDataObject_SetData, IDataObject_EnumFormatEtc, IDataObject_DAdvise, IDataObject_DUnadvise, IDataObject_EnumDAdvise }; /************************************************************************** * IDataObject_Constructor */ LPDATAOBJECT IDataObject_Constructor(HWND32 hwndOwner, LPSHELLFOLDER pcf, LPITEMIDLIST * apit, UINT32 cpit) { LPDATAOBJECT dto; dto=(LPDATAOBJECT)HeapAlloc(GetProcessHeap(),0,sizeof(IDataObject)); dto->ref=1; dto->lpvtbl=&dtovt; TRACE(shell,"(%p)->()\n",dto); return dto; } /*************************************************************************** * IDataObject_QueryInterface */ static HRESULT WINAPI IDataObject_QueryInterface (LPDATAOBJECT this, REFIID riid, LPVOID * ppvObj) { char xriid[50]; WINE_StringFromCLSID((LPCLSID)riid,xriid); TRACE(shell,"(%p)->(\n\tIID:\t%s,%p)\n",this,xriid,ppvObj); *ppvObj = NULL; if(IsEqualIID(riid, &IID_IUnknown)) /*IUnknown*/ { *ppvObj = this; } else if(IsEqualIID(riid, &IID_IDataObject)) /*IDataObject*/ { *ppvObj = (IDataObject*)this; } if(*ppvObj) { (*(LPDATAOBJECT*)ppvObj)->lpvtbl->fnAddRef(this); TRACE(shell,"-- Interface: (%p)->(%p)\n",ppvObj,*ppvObj); return S_OK; } TRACE(shell,"-- Interface: E_NOINTERFACE\n"); return E_NOINTERFACE; } /************************************************************************** * IDataObject_AddRef */ static ULONG WINAPI IDataObject_AddRef(LPDATAOBJECT this) { TRACE(shell,"(%p)->(count=%lu)\n",this,(this->ref)+1); return ++(this->ref); } /************************************************************************** * IDataObject_Release */ static ULONG WINAPI IDataObject_Release(LPDATAOBJECT this) { TRACE(shell,"(%p)->()\n",this); if (!--(this->ref)) { TRACE(shell," destroying IDataObject(%p)\n",this); HeapFree(GetProcessHeap(),0,this); return 0; } return this->ref; } static HRESULT WINAPI IDataObject_GetData (LPDATAOBJECT this, LPFORMATETC32 pformatetcIn, STGMEDIUM32 *pmedium) { FIXME (shell, "(%p)->()\n", this); return E_NOTIMPL; } static HRESULT WINAPI IDataObject_GetDataHere(LPDATAOBJECT this, LPFORMATETC32 pformatetc, STGMEDIUM32 *pmedium) { FIXME (shell, "(%p)->()\n", this); return E_NOTIMPL; } static HRESULT WINAPI IDataObject_QueryGetData(LPDATAOBJECT this, LPFORMATETC32 pformatetc) { FIXME (shell, "(%p)->()\n", this); return E_NOTIMPL; } static HRESULT WINAPI IDataObject_GetCanonicalFormatEtc(LPDATAOBJECT this, LPFORMATETC32 pformatectIn, LPFORMATETC32 pformatetcOut) { FIXME (shell, "(%p)->()\n", this); return E_NOTIMPL; } static HRESULT WINAPI IDataObject_SetData(LPDATAOBJECT this, LPFORMATETC32 pformatetc, STGMEDIUM32 *pmedium, BOOL32 fRelease) { FIXME (shell, "(%p)->()\n", this); return E_NOTIMPL; } static HRESULT WINAPI IDataObject_EnumFormatEtc(LPDATAOBJECT this, DWORD dwDirection, IEnumFORMATETC **ppenumFormatEtc) { FIXME (shell, "(%p)->()\n", this); return E_NOTIMPL; } static HRESULT WINAPI IDataObject_DAdvise (LPDATAOBJECT this, LPFORMATETC32 *pformatetc, DWORD advf, IAdviseSink *pAdvSink, DWORD *pdwConnection) { FIXME (shell, "(%p)->()\n", this); return E_NOTIMPL; } static HRESULT WINAPI IDataObject_DUnadvise(LPDATAOBJECT this, DWORD dwConnection) { FIXME (shell, "(%p)->()\n", this); return E_NOTIMPL; } static HRESULT WINAPI IDataObject_EnumDAdvise(LPDATAOBJECT this, IEnumSTATDATA **ppenumAdvise) { FIXME (shell, "(%p)->()\n", this); return E_NOTIMPL; }