8#include <QtGui/qevent.h>
9#include <QtGui/qwindow.h>
10#include <QtGui/qpainter.h>
11#include <QtGui/qcursor.h>
12#include <QtGui/qguiapplication.h>
14#include <QtCore/qmimedata.h>
15#include <QtCore/qdebug.h>
41 CF_PERFORMEDDROPEFFECT(RegisterClipboardFormat(CFSTR_PERFORMEDDROPEFFECT))
60 return performedEffect;
66 HRESULT hr = ResultFromScode(DATA_E_FORMATETC);
71 if (converter->convertFromMime(*pformatetc,
data, pmedium))
72 hr = ResultFromScode(S_OK);
84 return ResultFromScode(DATA_E_FORMATETC);
90 HRESULT hr = ResultFromScode(DATA_E_FORMATETC);
93 qCDebug(lcQpaMime) << __FUNCTION__;
98 ResultFromScode(S_OK) : ResultFromScode(S_FALSE);
101 qCDebug(lcQpaMime) << __FUNCTION__ <<
" returns 0x" <<
Qt::hex << int(hr);
108 pformatetcOut->ptd =
nullptr;
109 return ResultFromScode(E_NOTIMPL);
116 qCDebug(lcQpaMime) << __FUNCTION__;
118 HRESULT hr = ResultFromScode(E_NOTIMPL);
120 if (
pFormatetc->cfFormat == CF_PERFORMEDDROPEFFECT && pMedium->tymed == TYMED_HGLOBAL) {
121 auto *
val = (DWORD*)GlobalLock(pMedium->hGlobal);
122 performedEffect = *
val;
123 GlobalUnlock(pMedium->hGlobal);
125 ReleaseStgMedium(pMedium);
126 hr = ResultFromScode(S_OK);
129 qCDebug(lcQpaMime) << __FUNCTION__ <<
" returns 0x" <<
Qt::hex << int(hr);
138 qCDebug(lcQpaMime) << __FUNCTION__ <<
"dwDirection=" << dwDirection;
141 return ResultFromScode(DATA_E_FORMATETC);
146 if (dwDirection == DATADIR_GET) {
151 formatetc.cfFormat = CLIPFORMAT(CF_PERFORMEDDROPEFFECT);
152 formatetc.dwAspect = DVASPECT_CONTENT;
153 formatetc.lindex = -1;
154 formatetc.ptd =
nullptr;
155 formatetc.tymed = TYMED_HGLOBAL;
156 fmtetcs.
append(formatetc);
160 *ppenumFormatEtc = enumFmtEtc;
161 if (enumFmtEtc->isNull()) {
163 *ppenumFormatEtc =
nullptr;
167 return ResultFromScode(sc);
171QWindowsOleDataObject::DAdvise(
FORMATETC FAR*, DWORD,
172 LPADVISESINK, DWORD FAR*)
174 return ResultFromScode(OLE_E_ADVISENOTSUPPORTED);
181 return ResultFromScode(OLE_E_ADVISENOTSUPPORTED);
187 return ResultFromScode(OLE_E_ADVISENOTSUPPORTED);
199 qCDebug(lcQpaMime) << __FUNCTION__ << fmtetcs;
201 for (
int idx = 0; idx < fmtetcs.
count(); ++idx) {
203 if (copyFormatEtc(destetc, &(fmtetcs.
at(idx)))) {
204 m_lpfmtetcs.
append(destetc);
216 qCDebug(lcQpaMime) << __FUNCTION__;
218 for (
int idx = 0; idx < lpfmtetcs.
count(); ++idx) {
219 LPFORMATETC srcetc = lpfmtetcs.
at(idx);
221 if (copyFormatEtc(destetc, srcetc)) {
222 m_lpfmtetcs.
append(destetc);
235 if (CoGetMalloc(MEMCTX_TASK, &pmalloc) == NOERROR) {
236 for (
int idx = 0; idx < m_lpfmtetcs.
count(); ++idx) {
237 LPFORMATETC tmpetc = m_lpfmtetcs.
at(idx);
239 pmalloc->Free(tmpetc->ptd);
260 if (rgelt ==
nullptr)
261 return ResultFromScode(E_INVALIDARG);
264 nOffset = m_nIndex +
i;
266 if (nOffset < ULONG(m_lpfmtetcs.
count())) {
267 copyFormatEtc(rgelt +
i, m_lpfmtetcs.
at(
int(nOffset)));
276 if (pceltFetched !=
nullptr)
280 return ResultFromScode(S_FALSE);
292 nOffset = m_nIndex +
i;
294 if (nOffset < ULONG(m_lpfmtetcs.
count())) {
304 return ResultFromScode(S_FALSE);
319 if (newEnum ==
nullptr)
320 return ResultFromScode(E_INVALIDARG);
323 result->m_nIndex = m_nIndex;
327 return ResultFromScode(E_OUTOFMEMORY);
334bool QWindowsOleEnumFmtEtc::copyFormatEtc(LPFORMATETC dest,
const FORMATETC *
src)
const
336 if (dest ==
nullptr ||
src ==
nullptr)
344 if (CoGetMalloc(MEMCTX_TASK, &pmalloc) != NOERROR)
347 pmalloc->Alloc(
src->ptd->tdSize);
348 memcpy(dest->ptd,
src->ptd,
size_t(
src->ptd->tdSize));
const_reference at(qsizetype i) const noexcept
qsizetype count() const noexcept
void reserve(qsizetype size)
void append(parameter_type t)
QByteArray data(const QString &mimetype) const
Returns the data stored in the object in the format described by the MIME type specified by mimeType.
virtual QStringList formats() const
Returns a list of formats supported by the object.
QWindowsMimeRegistry & mimeConverter() const
static QWindowsContext * instance()
Manages the list of QWindowsMimeConverter instances.
QWindowsMimeConverter * converterFromMime(const FORMATETC &formatetc, const QMimeData *mimeData) const
QList< FORMATETC > allFormatsForMime(const QMimeData *mimeData) const
~QWindowsOleDataObject() override
FORMATETC FAR * pFormatetc
STDMETHOD() SetData(LPFORMATETC pformatetc, STGMEDIUM FAR *pmedium, BOOL fRelease) override
QWindowsOleDataObject(QMimeData *mimeData)
STDMETHOD() GetCanonicalFormatEtc(LPFORMATETC pformatetc, LPFORMATETC pformatetcOut) override
STDMETHOD() EnumDAdvise(LPENUMSTATDATA FAR *ppenumAdvise) override
QMimeData * mimeData() const
STDMETHOD() QueryGetData(LPFORMATETC pformatetc) override
DWORD reportedPerformedEffect() const
STDMETHOD() GetData(LPFORMATETC pformatetcIn, LPSTGMEDIUM pmedium) override
STDMETHOD() GetDataHere(LPFORMATETC pformatetc, LPSTGMEDIUM pmedium) override
STDMETHOD() EnumFormatEtc(DWORD dwDirection, LPENUMFORMATETC FAR *ppenumFormatEtc) override
STDMETHOD() DUnadvise(DWORD dwConnection) override
Enumerates the FORMATETC structures supported by QWindowsOleDataObject.
~QWindowsOleEnumFmtEtc() override
STDMETHOD() Reset(void) override
QWindowsOleEnumFmtEtc(const QList< FORMATETC > &fmtetcs)
STDMETHOD() Next(ULONG celt, LPFORMATETC rgelt, ULONG FAR *pceltFetched) override
STDMETHOD() Clone(LPENUMFORMATETC FAR *newEnum) override
STDMETHOD() Skip(ULONG celt) override
Combined button and popup list for selecting options.
QTextStream & hex(QTextStream &stream)
Calls QTextStream::setIntegerBase(16) on stream and returns stream.
QTextStream & showbase(QTextStream &stream)
Calls QTextStream::setNumberFlags(QTextStream::numberFlags() | QTextStream::ShowBase) on stream and r...
#define qCDebug(category,...)
GLint GLsizei GLsizei GLenum GLenum GLsizei void * data
unsigned long long quint64