#ifndef WCDataObject_h
#define WCDataObject_h
#include "DragData.h"
#include <ShlObj.h>
#include <objidl.h>
#include <wtf/Forward.h>
#include <wtf/Vector.h>
namespace WebCore {
struct StgMediumDeleter {
void operator()(STGMEDIUM* medium)
{
::ReleaseStgMedium(medium);
}
};
class WCDataObject : public IDataObject {
public:
void CopyMedium(STGMEDIUM* pMedDest, STGMEDIUM* pMedSrc, FORMATETC* pFmtSrc);
virtual HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, void** ppvObject);
virtual ULONG STDMETHODCALLTYPE AddRef(void);
virtual ULONG STDMETHODCALLTYPE Release(void);
virtual HRESULT STDMETHODCALLTYPE GetData(FORMATETC* pformatIn, STGMEDIUM* pmedium);
virtual HRESULT STDMETHODCALLTYPE GetDataHere(FORMATETC* pformat, STGMEDIUM* pmedium);
virtual HRESULT STDMETHODCALLTYPE QueryGetData(FORMATETC* pformat);
virtual HRESULT STDMETHODCALLTYPE GetCanonicalFormatEtc(FORMATETC* pformatectIn,FORMATETC* pformatOut);
virtual HRESULT STDMETHODCALLTYPE SetData(FORMATETC* pformat, STGMEDIUM*pmedium, BOOL release);
virtual HRESULT STDMETHODCALLTYPE EnumFormatEtc(DWORD dwDirection, IEnumFORMATETC** ppenumFormatEtc);
virtual HRESULT STDMETHODCALLTYPE DAdvise(FORMATETC*, DWORD, IAdviseSink*, DWORD*);
virtual HRESULT STDMETHODCALLTYPE DUnadvise(DWORD);
virtual HRESULT STDMETHODCALLTYPE EnumDAdvise(IEnumSTATDATA**);
void clearData(CLIPFORMAT);
static HRESULT createInstance(WCDataObject**);
static HRESULT createInstance(WCDataObject**, const DragDataMap&);
private:
WCDataObject();
long m_ref;
Vector<std::unique_ptr<FORMATETC>> m_formats;
Vector<std::unique_ptr<STGMEDIUM, StgMediumDeleter>> m_medium;
};
}
#endif //!WCDataObject_h