Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

309 lines
9.2 KiB

//+-------------------------------------------------------------------------
//
// 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