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>
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
41 CF_PERFORMEDDROPEFFECT(RegisterClipboardFormat(CFSTR_PERFORMEDDROPEFFECT))
43 qCDebug(lcQpaMime) <<
__FUNCTION__ << mimeData->formats();
60 return performedEffect;
66 HRESULT hr = ResultFromScode(DATA_E_FORMATETC);
70 if (
auto converter = mc.converterFromMime(*pformatetc, data))
71 if (converter->convertFromMime(*pformatetc, data, pmedium))
72 hr = ResultFromScode(S_OK);
75 if (QWindowsContext::verbose > 1 && lcQpaMime().isDebugEnabled())
76 qCDebug(lcQpaMime) <<
__FUNCTION__ << *pformatetc <<
"returns" << Qt::hex << Qt::showbase << quint64(hr);
84 return ResultFromScode(DATA_E_FORMATETC);
90 HRESULT hr = ResultFromScode(DATA_E_FORMATETC);
92 if (QWindowsContext::verbose > 1)
93 qCDebug(lcQpaMime) <<
__FUNCTION__;
97 hr = mc.converterFromMime(*pformatetc, data) ?
98 ResultFromScode(S_OK) : ResultFromScode(S_FALSE);
100 if (QWindowsContext::verbose > 1)
101 qCDebug(lcQpaMime) <<
__FUNCTION__ <<
" returns 0x" << Qt::hex <<
int(hr);
108 pformatetcOut->ptd =
nullptr;
109 return ResultFromScode(E_NOTIMPL);
115 if (QWindowsContext::verbose > 1)
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);
128 if (QWindowsContext::verbose > 1)
129 qCDebug(lcQpaMime) <<
__FUNCTION__ <<
" returns 0x" << Qt::hex <<
int(hr);
137 if (QWindowsContext::verbose > 1)
138 qCDebug(lcQpaMime) <<
__FUNCTION__ <<
"dwDirection=" << dwDirection;
141 return ResultFromScode(DATA_E_FORMATETC);
145 QList<FORMATETC> fmtetcs;
146 if (dwDirection == DATADIR_GET) {
148 fmtetcs = mc.allFormatsForMime(data);
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);
174 return ResultFromScode(OLE_E_ADVISENOTSUPPORTED);
181 return ResultFromScode(OLE_E_ADVISENOTSUPPORTED);
187 return ResultFromScode(OLE_E_ADVISENOTSUPPORTED);
191
192
193
194
198 if (QWindowsContext::verbose > 1)
199 qCDebug(lcQpaMime) <<
__FUNCTION__ << fmtetcs;
200 m_lpfmtetcs.reserve(fmtetcs.count());
201 for (
int idx = 0; idx < fmtetcs.count(); ++idx) {
202 auto destetc =
new FORMATETC();
203 if (copyFormatEtc(destetc, &(fmtetcs.at(idx)))) {
204 m_lpfmtetcs.append(destetc);
215 if (QWindowsContext::verbose > 1)
216 qCDebug(lcQpaMime) <<
__FUNCTION__;
217 m_lpfmtetcs.reserve(lpfmtetcs.count());
218 for (
int idx = 0; idx < lpfmtetcs.count(); ++idx) {
219 LPFORMATETC srcetc = lpfmtetcs.at(idx);
220 auto destetc =
new FORMATETC();
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);
322 auto *result =
new QWindowsOleEnumFmtEtc(m_lpfmtetcs);
323 result->m_nIndex = m_nIndex;
325 if (result->isNull()) {
327 return ResultFromScode(E_OUTOFMEMORY);
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));
Singleton container for all relevant information.
QWindowsMimeRegistry & mimeConverter() const
static QWindowsContext * instance()
Manages the list of QWindowsMimeConverter instances.
STDMETHOD GetDataHere(LPFORMATETC pformatetc, LPSTGMEDIUM pmedium) noexcept override
~QWindowsOleDataObject() override
FORMATETC FAR * pFormatetc
STDMETHOD QueryGetData(LPFORMATETC pformatetc) noexcept override
STDMETHOD DUnadvise(DWORD dwConnection) noexcept override
QMimeData * mimeData() const
STDMETHOD EnumDAdvise(LPENUMSTATDATA FAR *ppenumAdvise) noexcept override
STDMETHOD EnumFormatEtc(DWORD dwDirection, LPENUMFORMATETC FAR *ppenumFormatEtc) noexcept override
DWORD reportedPerformedEffect() const
STDMETHOD GetCanonicalFormatEtc(LPFORMATETC pformatetc, LPFORMATETC pformatetcOut) noexcept override
STDMETHOD GetData(LPFORMATETC pformatetcIn, LPSTGMEDIUM pmedium) noexcept override
Enumerates the FORMATETC structures supported by QWindowsOleDataObject.
~QWindowsOleEnumFmtEtc() override
STDMETHOD Skip(ULONG celt) noexcept override
STDMETHOD Reset(void) noexcept override
STDMETHOD Next(ULONG celt, LPFORMATETC rgelt, ULONG FAR *pceltFetched) noexcept override
STDMETHOD Clone(LPENUMFORMATETC FAR *newEnum) noexcept override
QWindowsOleEnumFmtEtc(const QList< FORMATETC > &fmtetcs)