9#include<QtGui/qevent.h>
10#include <QtGui/qwindow.h>
11#include <QtGui/qpainter.h>
12#include <QtGui/qcursor.h>
13#include <QtGui/qguiapplication.h>
15#include <QtCore/qmimedata.h>
16#include <QtCore/qdebug.h>
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
42 CF_PERFORMEDDROPEFFECT(RegisterClipboardFormat(CFSTR_PERFORMEDDROPEFFECT))
44 qCDebug(lcQpaMime) <<
__FUNCTION__ << mimeData->formats();
61 return performedEffect;
67 HRESULT hr = ResultFromScode(DATA_E_FORMATETC);
71 if (
auto converter = mc.converterFromMime(*pformatetc, data))
72 if (converter->convertFromMime(*pformatetc, data, pmedium))
73 hr = ResultFromScode(S_OK);
76 if (QWindowsContext::verbose > 1 && lcQpaMime().isDebugEnabled())
77 qCDebug(lcQpaMime) <<
__FUNCTION__ << *pformatetc <<
"returns" << Qt::hex << Qt::showbase << quint64(hr);
85 return ResultFromScode(DATA_E_FORMATETC);
91 HRESULT hr = ResultFromScode(DATA_E_FORMATETC);
94 qCDebug(lcQpaMime) <<
__FUNCTION__;
98 hr = mc.converterFromMime(*pformatetc, data) ?
99 ResultFromScode(S_OK) : ResultFromScode(S_FALSE);
101 if (QWindowsContext::verbose > 1)
102 qCDebug(lcQpaMime) <<
__FUNCTION__ <<
" returns 0x" << Qt::hex <<
int(hr);
109 pformatetcOut->ptd =
nullptr;
110 return ResultFromScode(E_NOTIMPL);
117 qCDebug(lcQpaMime) <<
__FUNCTION__;
119 HRESULT hr = ResultFromScode(E_NOTIMPL);
121 if (pFormatetc->cfFormat == CF_PERFORMEDDROPEFFECT && pMedium->tymed == TYMED_HGLOBAL) {
122 auto * val = (DWORD*)GlobalLock(pMedium->hGlobal);
123 performedEffect = *val;
124 GlobalUnlock(pMedium->hGlobal);
126 ReleaseStgMedium(pMedium);
127 hr = ResultFromScode(S_OK);
129 if (QWindowsContext::verbose > 1)
130 qCDebug(lcQpaMime) <<
__FUNCTION__ <<
" returns 0x" << Qt::hex <<
int(hr);
139 qCDebug(lcQpaMime) <<
__FUNCTION__ <<
"dwDirection=" << dwDirection;
142 return ResultFromScode(DATA_E_FORMATETC);
146 QList<FORMATETC> fmtetcs;
147 if (dwDirection == DATADIR_GET) {
149 fmtetcs = mc.allFormatsForMime(data);
152 formatetc.cfFormat = CLIPFORMAT(CF_PERFORMEDDROPEFFECT);
153 formatetc.dwAspect = DVASPECT_CONTENT;
154 formatetc.lindex = -1;
155 formatetc.ptd =
nullptr;
156 formatetc.tymed = TYMED_HGLOBAL;
157 fmtetcs.append(formatetc);
161 *ppenumFormatEtc = enumFmtEtc;
162 if (enumFmtEtc->isNull()) {
164 *ppenumFormatEtc =
nullptr;
168 return ResultFromScode(sc);
175 return ResultFromScode(OLE_E_ADVISENOTSUPPORTED);
182 return ResultFromScode(OLE_E_ADVISENOTSUPPORTED);
188 return ResultFromScode(OLE_E_ADVISENOTSUPPORTED);
192
193
194
195
200 qCDebug(lcQpaMime) <<
__FUNCTION__ << fmtetcs;
201 m_lpfmtetcs.reserve(fmtetcs.count());
202 for (
int idx = 0; idx < fmtetcs.count(); ++idx) {
203 auto destetc =
new FORMATETC();
204 if (copyFormatEtc(destetc, &(fmtetcs.at(idx)))) {
205 m_lpfmtetcs.append(destetc);
217 qCDebug(lcQpaMime) <<
__FUNCTION__;
218 m_lpfmtetcs.reserve(lpfmtetcs.count());
219 for (
int idx = 0; idx < lpfmtetcs.count(); ++idx) {
220 LPFORMATETC srcetc = lpfmtetcs.at(idx);
221 auto destetc =
new FORMATETC();
222 if (copyFormatEtc(destetc, srcetc)) {
223 m_lpfmtetcs.append(destetc);
236 if (CoGetMalloc(MEMCTX_TASK, &pmalloc) == NOERROR) {
237 for (
int idx = 0; idx < m_lpfmtetcs.count(); ++idx) {
238 LPFORMATETC tmpetc = m_lpfmtetcs.at(idx);
240 pmalloc->Free(tmpetc->ptd);
261 if (rgelt ==
nullptr)
262 return ResultFromScode(E_INVALIDARG);
265 nOffset = m_nIndex + i;
267 if (nOffset < ULONG(m_lpfmtetcs.count())) {
268 copyFormatEtc(rgelt + i, m_lpfmtetcs.at(
int(nOffset)));
277 if (pceltFetched !=
nullptr)
281 return ResultFromScode(S_FALSE);
293 nOffset = m_nIndex + i;
295 if (nOffset < ULONG(m_lpfmtetcs.count())) {
305 return ResultFromScode(S_FALSE);
320 if (newEnum ==
nullptr)
321 return ResultFromScode(E_INVALIDARG);
323 auto *result =
new QWindowsOleEnumFmtEtc(m_lpfmtetcs);
324 result->m_nIndex = m_nIndex;
326 if (result->isNull()) {
328 return ResultFromScode(E_OUTOFMEMORY);
337 if (dest ==
nullptr || src ==
nullptr)
345 if (CoGetMalloc(MEMCTX_TASK, &pmalloc) != NOERROR)
348 pmalloc->Alloc(src->ptd->tdSize);
349 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)
Combined button and popup list for selecting options.