From c50ef5af8121ad9b1fb7646ad160f19ef80f3a55 Mon Sep 17 00:00:00 2001 From: Juergen Schmied Date: Sun, 15 Aug 1999 14:25:27 +0000 Subject: [PATCH] QueryGetData, EnumFormatEtc implemented. --- dlls/shell32/dataobject.c | 191 ++++++++++++++++++-------------------- 1 file changed, 88 insertions(+), 103 deletions(-) diff --git a/dlls/shell32/dataobject.c b/dlls/shell32/dataobject.c index 92b33940650..8342a48fde5 100644 --- a/dlls/shell32/dataobject.c +++ b/dlls/shell32/dataobject.c @@ -3,7 +3,7 @@ * * selecting and droping objects within the shell and/or common dialogs * - * Copyright 1998 + * Copyright 1998, 1999 */ #include @@ -13,16 +13,14 @@ #include "shell32_main.h" #include "debugtools.h" #include "wine/undocshell.h" +#include "wine/obj_dataobject.h" DEFAULT_DEBUG_CHANNEL(shell) -UINT cfShellIDList=0; -UINT cfFileGroupDesc=0; -UINT cfFileContents=0; - /*********************************************************************** * IEnumFORMATETC implementation */ + typedef struct { /* IUnknown fields */ @@ -137,22 +135,26 @@ static HRESULT WINAPI IEnumFORMATETC_fnNext(LPENUMFORMATETC iface, ULONG celt, F TRACE("(%p)->()\n", This); - if (This->posFmt < This->countFmt) - { cfetch = This->countFmt - This->posFmt; + if (This->posFmt < This->countFmt) + { + cfetch = This->countFmt - This->posFmt; if (cfetch >= celt) - { cfetch = celt; + { + cfetch = celt; hres = S_OK; } memcpy(rgelt, &This->pFmt[This->posFmt], cfetch * sizeof(FORMATETC)); This->posFmt += cfetch; } else - { cfetch = 0; - } + { + cfetch = 0; + } - if (pceltFethed) - { *pceltFethed = cfetch; - } + if (pceltFethed) + { + *pceltFethed = cfetch; + } return hres; } @@ -163,7 +165,8 @@ static HRESULT WINAPI IEnumFORMATETC_fnSkip(LPENUMFORMATETC iface, ULONG celt) This->posFmt += celt; if (This->posFmt > This->countFmt) - { This->posFmt = This->countFmt; + { + This->posFmt = This->countFmt; return S_FALSE; } return S_OK; @@ -347,46 +350,27 @@ static void WINAPI IDLList_CleanList(LPIDLLIST this) /*********************************************************************** * IDataObject implementation */ +/* number of supported formats */ +#define MAX_FORMATS 1 typedef struct { - /* IUnknown fields */ - ICOM_VTABLE(IDataObject)* lpvtbl; - DWORD ref; - /* IDataObject fields */ - LPIDLLIST lpill; /* the data of the dataobject */ - LPITEMIDLIST pidl; + /* IUnknown fields */ + ICOM_VTABLE(IDataObject)* lpvtbl; + DWORD ref; + + /* IDataObject fields */ + LPIDLLIST lpill; /* the data of the dataobject */ + LPITEMIDLIST pidl; + + FORMATETC pFormatEtc[MAX_FORMATS]; + UINT cfShellIDList; + UINT cfFileGroupDesc; + UINT cfFileContents; + } IDataObjectImpl; -static HRESULT WINAPI IDataObject_fnQueryInterface(LPDATAOBJECT iface, REFIID riid, LPVOID* ppvObj); -static ULONG WINAPI IDataObject_fnAddRef(LPDATAOBJECT iface); -static ULONG WINAPI IDataObject_fnRelease(LPDATAOBJECT iface); -static HRESULT WINAPI IDataObject_fnGetData(LPDATAOBJECT iface, LPFORMATETC pformatetcIn, STGMEDIUM* pmedium); -static HRESULT WINAPI IDataObject_fnGetDataHere(LPDATAOBJECT iface, LPFORMATETC pformatetc, STGMEDIUM* pmedium); -static HRESULT WINAPI IDataObject_fnQueryGetData(LPDATAOBJECT iface, LPFORMATETC pformatetc); -static HRESULT WINAPI IDataObject_fnGetCanonicalFormatEtc(LPDATAOBJECT iface, LPFORMATETC pformatectIn, LPFORMATETC pformatetcOut); -static HRESULT WINAPI IDataObject_fnSetData(LPDATAOBJECT iface, LPFORMATETC pformatetc, STGMEDIUM* pmedium, BOOL fRelease); -static HRESULT WINAPI IDataObject_fnEnumFormatEtc(LPDATAOBJECT iface, DWORD dwDirection, IEnumFORMATETC** ppenumFormatEtc); -static HRESULT WINAPI IDataObject_fnDAdvise(LPDATAOBJECT iface, FORMATETC* pformatetc, DWORD advf, IAdviseSink* pAdvSink, DWORD* pdwConnection); -static HRESULT WINAPI IDataObject_fnDUnadvise(LPDATAOBJECT iface, DWORD dwConnection); -static HRESULT WINAPI IDataObject_fnEnumDAdvise(LPDATAOBJECT iface, IEnumSTATDATA **ppenumAdvise); - -static struct ICOM_VTABLE(IDataObject) dtovt = -{ - ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE - IDataObject_fnQueryInterface, - IDataObject_fnAddRef, - IDataObject_fnRelease, - IDataObject_fnGetData, - IDataObject_fnGetDataHere, - IDataObject_fnQueryGetData, - IDataObject_fnGetCanonicalFormatEtc, - IDataObject_fnSetData, - IDataObject_fnEnumFormatEtc, - IDataObject_fnDAdvise, - IDataObject_fnDUnadvise, - IDataObject_fnEnumDAdvise -}; +static struct ICOM_VTABLE(IDataObject) dtovt; /************************************************************************** * IDataObject_Constructor @@ -410,6 +394,13 @@ LPDATAOBJECT IDataObject_Constructor(HWND hwndOwner, LPITEMIDLIST pMyPidl, LPITE dto->lpill->lpvtbl->fnAddItems(dto->lpill, apidl, cidl); + /* */ + dto->cfShellIDList = RegisterClipboardFormatA(CFSTR_SHELLIDLIST); +/* dto->cfFileGroupDesc = RegisterClipboardFormatA(CFSTR_FILEDESCRIPTORA); + dto->cfFileContents = RegisterClipboardFormatA(CFSTR_FILECONTENTS); +*/ + InitFormatEtc(dto->pFormatEtc[0], dto->cfShellIDList, TYMED_HGLOBAL); + shell32_ObjCount++; } @@ -473,53 +464,6 @@ static ULONG WINAPI IDataObject_fnRelease(LPDATAOBJECT iface) } return This->ref; } -/************************************************************************** -* DATAOBJECT_InitShellIDList (internal) -* -* NOTES -* get or register the "Shell IDList Array" clipformat -*/ -static BOOL DATAOBJECT_InitShellIDList(void) -{ if (cfShellIDList) - { return(TRUE); - } - - cfShellIDList = RegisterClipboardFormatA(CFSTR_SHELLIDLIST); - return(cfShellIDList != 0); -} - -/************************************************************************** -* DATAOBJECT_InitFileGroupDesc (internal) -* -* NOTES -* get or register the "FileGroupDescriptor" clipformat -*/ -/* FIXME: DATAOBJECT_InitFileGroupDesc is not used (19981226) -static BOOL32 DATAOBJECT_InitFileGroupDesc(void) -{ if (cfFileGroupDesc) - { return(TRUE); - } - - cfFileGroupDesc = RegisterClipboardFormatA(CFSTR_FILEDESCRIPTORA); - return(cfFileGroupDesc != 0); -} -*/ -/************************************************************************** -* DATAOBJECT_InitFileContents (internal) -* -* NOTES - * get or register the "FileContents" clipformat -*/ -/* FIXME: DATAOBJECT_InitFileContents is not used (19981226) -static BOOL32 DATAOBJECT_InitFileContents(void) -{ if (cfFileContents) - { return(TRUE); - } - - cfFileContents = RegisterClipboardFormatA(CFSTR_FILECONTENTS); - return(cfFileContents != 0); -} -*/ /************************************************************************** * IDataObject_fnGetData @@ -539,11 +483,8 @@ static HRESULT WINAPI IDataObject_fnGetData(LPDATAOBJECT iface, LPFORMATETC pfor GetClipboardFormatNameA (pformatetcIn->cfFormat, szTemp, 256); TRACE("(%p)->(%p %p format=%s)\n", This, pformatetcIn, pmedium, szTemp); - /* is the clipformat registred? */ - if (!DATAOBJECT_InitShellIDList()) return(E_UNEXPECTED); - /* test expected format */ - if (!(pformatetcIn->cfFormat == cfShellIDList)) + if (!(pformatetcIn->cfFormat == This->cfShellIDList)) { FIXME("-- clipformat not implemented\n"); return (E_INVALIDARG); @@ -612,8 +553,24 @@ static HRESULT WINAPI IDataObject_fnGetDataHere(LPDATAOBJECT iface, LPFORMATETC static HRESULT WINAPI IDataObject_fnQueryGetData(LPDATAOBJECT iface, LPFORMATETC pformatetc) { ICOM_THIS(IDataObjectImpl,iface); - FIXME("(%p)->()\n", This); - return E_NOTIMPL; + UINT i; + + TRACE("(%p)->(fmt=0x%08x tym=0x%08lx)\n", This, pformatetc->cfFormat, pformatetc->tymed); + + if(!(DVASPECT_CONTENT & pformatetc->dwAspect)) + return DV_E_DVASPECT; + + /* check our formats table what we have */ + for (i=0; ipFormatEtc[i].cfFormat == pformatetc->cfFormat) + && (This->pFormatEtc[i].tymed == pformatetc->tymed)) + { + return S_OK; + } + } + + return DV_E_TYMED; } static HRESULT WINAPI IDataObject_fnGetCanonicalFormatEtc(LPDATAOBJECT iface, LPFORMATETC pformatectIn, LPFORMATETC pformatetcOut) { @@ -630,7 +587,17 @@ static HRESULT WINAPI IDataObject_fnSetData(LPDATAOBJECT iface, LPFORMATETC pfor static HRESULT WINAPI IDataObject_fnEnumFormatEtc(LPDATAOBJECT iface, DWORD dwDirection, IEnumFORMATETC **ppenumFormatEtc) { ICOM_THIS(IDataObjectImpl,iface); - FIXME("(%p)->()\n", This); + + TRACE("(%p)->()\n", This); + *ppenumFormatEtc=NULL; + + /* only get data */ + if (DATADIR_GET == dwDirection) + { + *ppenumFormatEtc = IEnumFORMATETC_Constructor(MAX_FORMATS, This->pFormatEtc); + return (*ppenumFormatEtc) ? S_OK : E_FAIL; + } + return E_NOTIMPL; } static HRESULT WINAPI IDataObject_fnDAdvise(LPDATAOBJECT iface, FORMATETC *pformatetc, DWORD advf, IAdviseSink *pAdvSink, DWORD *pdwConnection) @@ -651,3 +618,21 @@ static HRESULT WINAPI IDataObject_fnEnumDAdvise(LPDATAOBJECT iface, IEnumSTATDAT FIXME("(%p)->()\n", This); return E_NOTIMPL; } + +static struct ICOM_VTABLE(IDataObject) dtovt = +{ + ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE + IDataObject_fnQueryInterface, + IDataObject_fnAddRef, + IDataObject_fnRelease, + IDataObject_fnGetData, + IDataObject_fnGetDataHere, + IDataObject_fnQueryGetData, + IDataObject_fnGetCanonicalFormatEtc, + IDataObject_fnSetData, + IDataObject_fnEnumFormatEtc, + IDataObject_fnDAdvise, + IDataObject_fnDUnadvise, + IDataObject_fnEnumDAdvise +}; +