QueryGetData, EnumFormatEtc implemented.
This commit is contained in:
parent
d72ace49d9
commit
c50ef5af81
|
@ -3,7 +3,7 @@
|
||||||
*
|
*
|
||||||
* selecting and droping objects within the shell and/or common dialogs
|
* selecting and droping objects within the shell and/or common dialogs
|
||||||
*
|
*
|
||||||
* Copyright 1998 <juergen.schmied@metronet.de>
|
* Copyright 1998, 1999 <juergen.schmied@metronet.de>
|
||||||
*/
|
*/
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
|
@ -13,16 +13,14 @@
|
||||||
#include "shell32_main.h"
|
#include "shell32_main.h"
|
||||||
#include "debugtools.h"
|
#include "debugtools.h"
|
||||||
#include "wine/undocshell.h"
|
#include "wine/undocshell.h"
|
||||||
|
#include "wine/obj_dataobject.h"
|
||||||
|
|
||||||
DEFAULT_DEBUG_CHANNEL(shell)
|
DEFAULT_DEBUG_CHANNEL(shell)
|
||||||
|
|
||||||
UINT cfShellIDList=0;
|
|
||||||
UINT cfFileGroupDesc=0;
|
|
||||||
UINT cfFileContents=0;
|
|
||||||
|
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
* IEnumFORMATETC implementation
|
* IEnumFORMATETC implementation
|
||||||
*/
|
*/
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
/* IUnknown fields */
|
/* IUnknown fields */
|
||||||
|
@ -137,22 +135,26 @@ static HRESULT WINAPI IEnumFORMATETC_fnNext(LPENUMFORMATETC iface, ULONG celt, F
|
||||||
|
|
||||||
TRACE("(%p)->()\n", This);
|
TRACE("(%p)->()\n", This);
|
||||||
|
|
||||||
if (This->posFmt < This->countFmt)
|
if (This->posFmt < This->countFmt)
|
||||||
{ cfetch = This->countFmt - This->posFmt;
|
{
|
||||||
|
cfetch = This->countFmt - This->posFmt;
|
||||||
if (cfetch >= celt)
|
if (cfetch >= celt)
|
||||||
{ cfetch = celt;
|
{
|
||||||
|
cfetch = celt;
|
||||||
hres = S_OK;
|
hres = S_OK;
|
||||||
}
|
}
|
||||||
memcpy(rgelt, &This->pFmt[This->posFmt], cfetch * sizeof(FORMATETC));
|
memcpy(rgelt, &This->pFmt[This->posFmt], cfetch * sizeof(FORMATETC));
|
||||||
This->posFmt += cfetch;
|
This->posFmt += cfetch;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{ cfetch = 0;
|
{
|
||||||
}
|
cfetch = 0;
|
||||||
|
}
|
||||||
|
|
||||||
if (pceltFethed)
|
if (pceltFethed)
|
||||||
{ *pceltFethed = cfetch;
|
{
|
||||||
}
|
*pceltFethed = cfetch;
|
||||||
|
}
|
||||||
|
|
||||||
return hres;
|
return hres;
|
||||||
}
|
}
|
||||||
|
@ -163,7 +165,8 @@ static HRESULT WINAPI IEnumFORMATETC_fnSkip(LPENUMFORMATETC iface, ULONG celt)
|
||||||
|
|
||||||
This->posFmt += celt;
|
This->posFmt += celt;
|
||||||
if (This->posFmt > This->countFmt)
|
if (This->posFmt > This->countFmt)
|
||||||
{ This->posFmt = This->countFmt;
|
{
|
||||||
|
This->posFmt = This->countFmt;
|
||||||
return S_FALSE;
|
return S_FALSE;
|
||||||
}
|
}
|
||||||
return S_OK;
|
return S_OK;
|
||||||
|
@ -347,46 +350,27 @@ static void WINAPI IDLList_CleanList(LPIDLLIST this)
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
* IDataObject implementation
|
* IDataObject implementation
|
||||||
*/
|
*/
|
||||||
|
/* number of supported formats */
|
||||||
|
#define MAX_FORMATS 1
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
/* IUnknown fields */
|
/* IUnknown fields */
|
||||||
ICOM_VTABLE(IDataObject)* lpvtbl;
|
ICOM_VTABLE(IDataObject)* lpvtbl;
|
||||||
DWORD ref;
|
DWORD ref;
|
||||||
/* IDataObject fields */
|
|
||||||
LPIDLLIST lpill; /* the data of the dataobject */
|
/* IDataObject fields */
|
||||||
LPITEMIDLIST pidl;
|
LPIDLLIST lpill; /* the data of the dataobject */
|
||||||
|
LPITEMIDLIST pidl;
|
||||||
|
|
||||||
|
FORMATETC pFormatEtc[MAX_FORMATS];
|
||||||
|
UINT cfShellIDList;
|
||||||
|
UINT cfFileGroupDesc;
|
||||||
|
UINT cfFileContents;
|
||||||
|
|
||||||
} IDataObjectImpl;
|
} IDataObjectImpl;
|
||||||
|
|
||||||
static HRESULT WINAPI IDataObject_fnQueryInterface(LPDATAOBJECT iface, REFIID riid, LPVOID* ppvObj);
|
static struct ICOM_VTABLE(IDataObject) dtovt;
|
||||||
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
|
|
||||||
};
|
|
||||||
|
|
||||||
/**************************************************************************
|
/**************************************************************************
|
||||||
* IDataObject_Constructor
|
* IDataObject_Constructor
|
||||||
|
@ -410,6 +394,13 @@ LPDATAOBJECT IDataObject_Constructor(HWND hwndOwner, LPITEMIDLIST pMyPidl, LPITE
|
||||||
|
|
||||||
dto->lpill->lpvtbl->fnAddItems(dto->lpill, apidl, cidl);
|
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++;
|
shell32_ObjCount++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -473,53 +464,6 @@ static ULONG WINAPI IDataObject_fnRelease(LPDATAOBJECT iface)
|
||||||
}
|
}
|
||||||
return This->ref;
|
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
|
* IDataObject_fnGetData
|
||||||
|
@ -539,11 +483,8 @@ static HRESULT WINAPI IDataObject_fnGetData(LPDATAOBJECT iface, LPFORMATETC pfor
|
||||||
GetClipboardFormatNameA (pformatetcIn->cfFormat, szTemp, 256);
|
GetClipboardFormatNameA (pformatetcIn->cfFormat, szTemp, 256);
|
||||||
TRACE("(%p)->(%p %p format=%s)\n", This, pformatetcIn, pmedium, szTemp);
|
TRACE("(%p)->(%p %p format=%s)\n", This, pformatetcIn, pmedium, szTemp);
|
||||||
|
|
||||||
/* is the clipformat registred? */
|
|
||||||
if (!DATAOBJECT_InitShellIDList()) return(E_UNEXPECTED);
|
|
||||||
|
|
||||||
/* test expected format */
|
/* test expected format */
|
||||||
if (!(pformatetcIn->cfFormat == cfShellIDList))
|
if (!(pformatetcIn->cfFormat == This->cfShellIDList))
|
||||||
{
|
{
|
||||||
FIXME("-- clipformat not implemented\n");
|
FIXME("-- clipformat not implemented\n");
|
||||||
return (E_INVALIDARG);
|
return (E_INVALIDARG);
|
||||||
|
@ -612,8 +553,24 @@ static HRESULT WINAPI IDataObject_fnGetDataHere(LPDATAOBJECT iface, LPFORMATETC
|
||||||
static HRESULT WINAPI IDataObject_fnQueryGetData(LPDATAOBJECT iface, LPFORMATETC pformatetc)
|
static HRESULT WINAPI IDataObject_fnQueryGetData(LPDATAOBJECT iface, LPFORMATETC pformatetc)
|
||||||
{
|
{
|
||||||
ICOM_THIS(IDataObjectImpl,iface);
|
ICOM_THIS(IDataObjectImpl,iface);
|
||||||
FIXME("(%p)->()\n", This);
|
UINT i;
|
||||||
return E_NOTIMPL;
|
|
||||||
|
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; i<MAX_FORMATS; i++)
|
||||||
|
{
|
||||||
|
if ((This->pFormatEtc[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)
|
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)
|
static HRESULT WINAPI IDataObject_fnEnumFormatEtc(LPDATAOBJECT iface, DWORD dwDirection, IEnumFORMATETC **ppenumFormatEtc)
|
||||||
{
|
{
|
||||||
ICOM_THIS(IDataObjectImpl,iface);
|
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;
|
return E_NOTIMPL;
|
||||||
}
|
}
|
||||||
static HRESULT WINAPI IDataObject_fnDAdvise(LPDATAOBJECT iface, FORMATETC *pformatetc, DWORD advf, IAdviseSink *pAdvSink, DWORD *pdwConnection)
|
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);
|
FIXME("(%p)->()\n", This);
|
||||||
return E_NOTIMPL;
|
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
|
||||||
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue