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