310 lines
9.2 KiB
C
310 lines
9.2 KiB
C
|
//+-------------------------------------------------------------------------
|
||
|
//
|
||
|
// Microsoft Windows
|
||
|
// Copyright (C) Microsoft Corporation, 1992 - 1993.
|
||
|
//
|
||
|
// File: clipdata.h
|
||
|
//
|
||
|
// Contents: Declaration of the clipboard data object.
|
||
|
//
|
||
|
// Classes: CClipDataObject
|
||
|
//
|
||
|
// Functions:
|
||
|
//
|
||
|
// History: dd-mmm-yy Author Comment
|
||
|
// 01-Feb-95 t-ScottH added Dump methods to CClipDataObject
|
||
|
// and CClipEnumFormatEtc
|
||
|
// 31-Mar-94 alexgo author
|
||
|
//
|
||
|
//--------------------------------------------------------------------------
|
||
|
|
||
|
#ifdef _DEBUG
|
||
|
#include <dbgexts.h>
|
||
|
#endif // _DEBUG
|
||
|
|
||
|
#ifndef _CLIPDATA_H
|
||
|
#define _CLIPDATA_H
|
||
|
|
||
|
typedef enum
|
||
|
{
|
||
|
RESET_AND_FREE = 1,
|
||
|
JUST_RESET = 2
|
||
|
} FreeResourcesFlags;
|
||
|
|
||
|
typedef enum
|
||
|
{
|
||
|
FORMAT_NOTFOUND = 1,
|
||
|
FORMAT_BADMATCH = 2,
|
||
|
FORMAT_GOODMATCH = 4
|
||
|
} FormatMatchFlag;
|
||
|
|
||
|
|
||
|
// format for an array for FormatEtcs in memory.
|
||
|
|
||
|
struct FORMATETCDATA
|
||
|
{
|
||
|
FORMATETC _FormatEtc;
|
||
|
BOOL fSaveOnFlush; // set to true in Clipboard case if format is valid after OleFlushClipboard.
|
||
|
DWORD dwReserved1;
|
||
|
DWORD dwReserved2;
|
||
|
};
|
||
|
|
||
|
#define FETC_OFFER_OLE1 1
|
||
|
#define FETC_OFFER_OBJLINK 2
|
||
|
#define FETC_PERSIST_DATAOBJ_ON_FLUSH 4
|
||
|
|
||
|
struct FORMATETCDATAARRAY
|
||
|
{
|
||
|
DWORD _dwSig; // must be zero.
|
||
|
DWORD _dwSize; // total size of structure.
|
||
|
ULONG _cRefs; // Number of references held on Data.
|
||
|
DWORD _cFormats; // number of formats in the enumerator.
|
||
|
DWORD _dwMiscArrayFlags;
|
||
|
BOOL _fIs64BitArray;
|
||
|
FORMATETCDATA _FormatEtcData[1];
|
||
|
};
|
||
|
|
||
|
|
||
|
//
|
||
|
// Methods and types used for 32/64 bit FORMATETC interop
|
||
|
//
|
||
|
|
||
|
#ifdef _WIN64
|
||
|
#define IS_WIN64 TRUE
|
||
|
#else
|
||
|
#define IS_WIN64 FALSE
|
||
|
#endif
|
||
|
|
||
|
void GetCopiedFormatEtcDataArraySize (
|
||
|
FORMATETCDATAARRAY* pClipFormatEtcDataArray,
|
||
|
size_t* pstSize
|
||
|
);
|
||
|
|
||
|
void CopyFormatEtcDataArray (
|
||
|
FORMATETCDATAARRAY* pClipFormatEtcDataArray,
|
||
|
FORMATETCDATAARRAY* pFormatEtcDataArray,
|
||
|
size_t stSize,
|
||
|
BOOL bCheckAvailable
|
||
|
);
|
||
|
|
||
|
typedef struct FARSTRUCT tagFORMATETC32
|
||
|
{
|
||
|
CLIPFORMAT cfFormat;
|
||
|
ULONG ptd;
|
||
|
DWORD dwAspect;
|
||
|
LONG lindex;
|
||
|
DWORD tymed;
|
||
|
} FORMATETC32, FAR* LPFORMATETC32;
|
||
|
|
||
|
typedef struct FARSTRUCT tagFORMATETC64
|
||
|
{
|
||
|
CLIPFORMAT cfFormat;
|
||
|
ULONG64 ptd;
|
||
|
DWORD dwAspect;
|
||
|
LONG lindex;
|
||
|
DWORD tymed;
|
||
|
} FORMATETC64, FAR* LPFORMATETC64;
|
||
|
|
||
|
struct FORMATETCDATA32
|
||
|
{
|
||
|
FORMATETC32 _FormatEtc;
|
||
|
BOOL fSaveOnFlush; // set to true in Clipboard case if format is valid after OleFlushClipboard.
|
||
|
DWORD dwReserved1;
|
||
|
DWORD dwReserved2;
|
||
|
};
|
||
|
|
||
|
struct FORMATETCDATA64
|
||
|
{
|
||
|
FORMATETC64 _FormatEtc;
|
||
|
BOOL fSaveOnFlush; // set to true in Clipboard case if format is valid after OleFlushClipboard.
|
||
|
DWORD dwReserved1;
|
||
|
DWORD dwReserved2;
|
||
|
};
|
||
|
|
||
|
struct FORMATETCDATAARRAY32
|
||
|
{
|
||
|
DWORD _dwSig; // must be zero.
|
||
|
DWORD _dwSize; // total size of structure.
|
||
|
ULONG _cRefs; // Number of references held on Data.
|
||
|
DWORD _cFormats; // number of formats in the enumerator.
|
||
|
DWORD _dwMiscArrayFlags;
|
||
|
BOOL _fIs64BitArray;
|
||
|
FORMATETCDATA32 _FormatEtcData[1];
|
||
|
};
|
||
|
|
||
|
struct FORMATETCDATAARRAY64
|
||
|
{
|
||
|
DWORD _dwSig; // must be zero.
|
||
|
DWORD _dwSize; // total size of structure.
|
||
|
ULONG _cRefs; // Number of references held on Data.
|
||
|
DWORD _cFormats; // number of formats in the enumerator.
|
||
|
DWORD _dwMiscArrayFlags;
|
||
|
BOOL _fIs64BitArray;
|
||
|
FORMATETCDATA64 _FormatEtcData[1];
|
||
|
};
|
||
|
|
||
|
|
||
|
//+-------------------------------------------------------------------------
|
||
|
//
|
||
|
// Class: CClipDataObject
|
||
|
//
|
||
|
// Purpose: clipboard data object
|
||
|
//
|
||
|
// Interface: IDataObject
|
||
|
//
|
||
|
// History: dd-mmm-yy Author Comment
|
||
|
// 01-Feb-95 t-ScottH added Dump method (_DEBUG only)
|
||
|
// 04-Jun-94 alexgo added OLE1 support
|
||
|
// 31-Mar-94 alexgo author
|
||
|
//
|
||
|
// Notes: See clipdata.cpp for a description of OLE1 support
|
||
|
//
|
||
|
//--------------------------------------------------------------------------
|
||
|
|
||
|
class CClipDataObject : public IDataObject, public CPrivAlloc,
|
||
|
public CThreadCheck
|
||
|
{
|
||
|
friend void ClipboardUninitialize(void);
|
||
|
friend void SetClipDataObjectInTLS(IDataObject *pDataObj,
|
||
|
DWORD dwClipSeqNum, BOOL fIsClipWrapper);
|
||
|
friend void GetClipDataObjectFromTLS(IDataObject **ppDataObj);
|
||
|
|
||
|
|
||
|
// HACK ALERT!!!
|
||
|
// MFC was being slimy, so we have to special case testing against clipboard data
|
||
|
// objects in OleQueryCreateFromData. See create.cpp,
|
||
|
// wQueryEmbedFormats for more details.
|
||
|
|
||
|
friend WORD wQueryEmbedFormats( LPDATAOBJECT lpSrcDataObj,CLIPFORMAT FAR* lpcfFormat);
|
||
|
|
||
|
public:
|
||
|
// IUnknown methods
|
||
|
STDMETHOD(QueryInterface) (REFIID riid, LPVOID FAR* ppvObj);
|
||
|
STDMETHOD_(ULONG,AddRef) (void);
|
||
|
STDMETHOD_(ULONG,Release) (void);
|
||
|
|
||
|
// IDataObject methods
|
||
|
STDMETHOD(GetData) (LPFORMATETC pformatetcIn, LPSTGMEDIUM pmedium);
|
||
|
STDMETHOD(GetDataHere) (LPFORMATETC pformatetc,
|
||
|
LPSTGMEDIUM pmedium);
|
||
|
STDMETHOD(QueryGetData) (LPFORMATETC pformatetc);
|
||
|
STDMETHOD(GetCanonicalFormatEtc) (LPFORMATETC pformatetc,
|
||
|
LPFORMATETC pformatetcOut);
|
||
|
STDMETHOD(SetData) (LPFORMATETC pformatetc,
|
||
|
STGMEDIUM FAR* pmedium, BOOL fRelease);
|
||
|
STDMETHOD(EnumFormatEtc) (DWORD dwDirection,
|
||
|
LPENUMFORMATETC FAR* ppenumFormatEtc);
|
||
|
STDMETHOD(DAdvise) (FORMATETC FAR* pFormatetc, DWORD advf,
|
||
|
IAdviseSink FAR* pAdvSink, DWORD FAR* pdwConnection);
|
||
|
STDMETHOD(DUnadvise) (DWORD dwConnection);
|
||
|
STDMETHOD(EnumDAdvise) (LPENUMSTATDATA FAR* ppenumAdvise);
|
||
|
|
||
|
static HRESULT CClipDataObject::Create(IDataObject **ppDataObj,
|
||
|
FORMATETCDATAARRAY *pClipFormatEtcDataArray);
|
||
|
|
||
|
#ifdef _DEBUG
|
||
|
|
||
|
HRESULT Dump(char **ppszDump, ULONG ulFlag, int nIndentLevel);
|
||
|
|
||
|
// need to be able to access CClipDataObject private data members in the
|
||
|
// following debugger extension APIs
|
||
|
// this allows the debugger extension APIs to copy memory from the
|
||
|
// debuggee process memory to the debugger's process memory
|
||
|
// this is required since the Dump method follows pointers to other
|
||
|
// structures and classes
|
||
|
friend DEBUG_EXTENSION_API(dump_clipdataobject);
|
||
|
|
||
|
#endif // _DEBUG
|
||
|
|
||
|
|
||
|
private:
|
||
|
|
||
|
CClipDataObject(); // constructor
|
||
|
~CClipDataObject(); // destructor
|
||
|
|
||
|
ULONG InternalAddRef(); // ensure object stays around as long as OLE thinks it should.
|
||
|
ULONG InternalRelease();
|
||
|
|
||
|
IDataObject * GetRealDataObjPtr(); // Get real data object for clipboard
|
||
|
HRESULT GetFormatEtcDataArray(); //checks is have a FormatEtcDataArray, if not creates one from the Native Clipboard.
|
||
|
FormatMatchFlag MatchFormatetc( FORMATETC *pformatetc,BOOL fNativeOnly, TYMED *ptymed );
|
||
|
// checks the given formatetc against
|
||
|
// the formatetc we know about.
|
||
|
|
||
|
// the following methods and data items are used for OLE1
|
||
|
// support
|
||
|
void FreeResources( FreeResourcesFlags fFlags );
|
||
|
HRESULT GetAndTranslateOle1( UINT cf, LPOLESTR *ppszClass,
|
||
|
LPOLESTR *ppszFile, LPOLESTR *ppszItem,
|
||
|
LPSTR *ppszItemA );
|
||
|
HRESULT GetEmbeddedObjectFromOle1( STGMEDIUM *pmedium );
|
||
|
HRESULT GetEmbedSourceFromOle1( STGMEDIUM *pmedium );
|
||
|
HRESULT GetLinkSourceFromOle1( STGMEDIUM *pmedium );
|
||
|
HRESULT GetObjectDescriptorFromOle1( UINT cf,
|
||
|
STGMEDIUM *pmedium );
|
||
|
HRESULT GetOle2FromOle1( UINT cf, STGMEDIUM *pmedium );
|
||
|
HRESULT OleGetClipboardData( UINT cf, HANDLE *pHandle );
|
||
|
BOOL OleIsClipboardFormatAvailable( UINT cf );
|
||
|
|
||
|
HGLOBAL m_hOle1; // hGlobal to OLE2 data constructed
|
||
|
// from OLE1 data
|
||
|
IUnknown * m_pUnkOle1; // IUnknown to either a storage or
|
||
|
// a stream of OLE1 data
|
||
|
|
||
|
// end of OLE1 support
|
||
|
|
||
|
ULONG m_refs; // reference count
|
||
|
ULONG m_Internalrefs; // Internal Reference Count
|
||
|
|
||
|
FORMATETCDATAARRAY *m_pFormatEtcDataArray; // Enumerator Data.
|
||
|
IDataObject * m_pDataObject; // Actual data object for data.
|
||
|
BOOL m_fTriedToGetDataObject;
|
||
|
// indicates whether or not we've
|
||
|
// tried to get the real IDataObject
|
||
|
// from the clipboard source
|
||
|
// (see GetDataObjectForClip)
|
||
|
};
|
||
|
|
||
|
|
||
|
//+-------------------------------------------------------------------------
|
||
|
//
|
||
|
// Class: CEnumFormatEtcDataArray
|
||
|
//
|
||
|
// Purpose: Enumerator for the formats available on the clipboard
|
||
|
// and in DragDrop.
|
||
|
//
|
||
|
// Interface: IEnumFORMATETC
|
||
|
//
|
||
|
// History: dd-mmm-yy Author Comment
|
||
|
// 30-Sep-96 rogerg created base on CClipEnumFormatEtc
|
||
|
//
|
||
|
// Notes:
|
||
|
//
|
||
|
//--------------------------------------------------------------------------
|
||
|
|
||
|
class CEnumFormatEtcDataArray :public IEnumFORMATETC, public CPrivAlloc,
|
||
|
public CThreadCheck
|
||
|
{
|
||
|
public:
|
||
|
STDMETHOD(QueryInterface)(REFIID riid, LPLPVOID ppvObj);
|
||
|
STDMETHOD_(ULONG,AddRef)(void);
|
||
|
STDMETHOD_(ULONG,Release)(void);
|
||
|
|
||
|
STDMETHOD(Next) (ULONG celt, FORMATETC *rgelt,
|
||
|
ULONG *pceltFetched);
|
||
|
STDMETHOD(Skip) (ULONG celt);
|
||
|
STDMETHOD(Reset) (void);
|
||
|
STDMETHOD(Clone) (IEnumFORMATETC **ppenum);
|
||
|
|
||
|
CEnumFormatEtcDataArray(FORMATETCDATAARRAY *pFormatEtcDataArray,DWORD cOffset);
|
||
|
|
||
|
private:
|
||
|
~CEnumFormatEtcDataArray(); // destructor
|
||
|
|
||
|
ULONG m_refs; // reference count
|
||
|
ULONG m_cOffset; // current clipboard format
|
||
|
FORMATETCDATAARRAY * m_pFormatEtcDataArray;
|
||
|
};
|
||
|
|
||
|
#endif // !_CLIPDATA_H
|