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 if (GlobalSize(pMedium->hGlobal) >=
sizeof(DWORD)) {
123 if (
const auto *val =
static_cast<
const DWORD *>(GlobalLock(pMedium->hGlobal))) {
124 performedEffect = *val;
125 GlobalUnlock(pMedium->hGlobal);
129 ReleaseStgMedium(pMedium);
130 hr = ResultFromScode(S_OK);
132 if (QWindowsContext::verbose > 1)
133 qCDebug(lcQpaMime) <<
__FUNCTION__ <<
" returns 0x" << Qt::hex <<
int(hr);
142 qCDebug(lcQpaMime) <<
__FUNCTION__ <<
"dwDirection=" << dwDirection;
145 return ResultFromScode(DATA_E_FORMATETC);
149 QList<FORMATETC> fmtetcs;
150 if (dwDirection == DATADIR_GET) {
152 fmtetcs = mc.allFormatsForMime(data);
155 formatetc.cfFormat = CLIPFORMAT(CF_PERFORMEDDROPEFFECT);
156 formatetc.dwAspect = DVASPECT_CONTENT;
157 formatetc.lindex = -1;
158 formatetc.ptd =
nullptr;
159 formatetc.tymed = TYMED_HGLOBAL;
160 fmtetcs.append(formatetc);
164 *ppenumFormatEtc = enumFmtEtc;
165 if (enumFmtEtc->isNull()) {
167 *ppenumFormatEtc =
nullptr;
171 return ResultFromScode(sc);
178 return ResultFromScode(OLE_E_ADVISENOTSUPPORTED);
185 return ResultFromScode(OLE_E_ADVISENOTSUPPORTED);
191 return ResultFromScode(OLE_E_ADVISENOTSUPPORTED);
195
196
197
198
203 qCDebug(lcQpaMime) <<
__FUNCTION__ << fmtetcs;
204 m_lpfmtetcs.reserve(fmtetcs.count());
205 for (
int idx = 0; idx < fmtetcs.count(); ++idx) {
206 auto destetc =
new FORMATETC();
207 if (copyFormatEtc(destetc, &(fmtetcs.at(idx)))) {
208 m_lpfmtetcs.append(destetc);
220 qCDebug(lcQpaMime) <<
__FUNCTION__;
221 m_lpfmtetcs.reserve(lpfmtetcs.count());
222 for (
int idx = 0; idx < lpfmtetcs.count(); ++idx) {
223 LPFORMATETC srcetc = lpfmtetcs.at(idx);
224 auto destetc =
new FORMATETC();
225 if (copyFormatEtc(destetc, srcetc)) {
226 m_lpfmtetcs.append(destetc);
239 if (CoGetMalloc(MEMCTX_TASK, &pmalloc) == NOERROR) {
240 for (
int idx = 0; idx < m_lpfmtetcs.count(); ++idx) {
241 LPFORMATETC tmpetc = m_lpfmtetcs.at(idx);
243 pmalloc->Free(tmpetc->ptd);
264 if (rgelt ==
nullptr)
265 return ResultFromScode(E_INVALIDARG);
268 nOffset = m_nIndex + i;
270 if (nOffset < ULONG(m_lpfmtetcs.count())) {
271 if (!copyFormatEtc(rgelt + i, m_lpfmtetcs.at(
int(nOffset)))) {
273 if (pceltFetched !=
nullptr)
275 return ResultFromScode(E_OUTOFMEMORY);
285 if (pceltFetched !=
nullptr)
289 return ResultFromScode(S_FALSE);
301 nOffset = m_nIndex + i;
303 if (nOffset < ULONG(m_lpfmtetcs.count())) {
313 return ResultFromScode(S_FALSE);
328 if (newEnum ==
nullptr)
329 return ResultFromScode(E_INVALIDARG);
331 auto *result =
new QWindowsOleEnumFmtEtc(m_lpfmtetcs);
332 result->m_nIndex = m_nIndex;
334 if (result->isNull()) {
336 return ResultFromScode(E_OUTOFMEMORY);
345 if (dest ==
nullptr || src ==
nullptr)
351 if (src->ptd->tdSize <
sizeof(DVTARGETDEVICE)) {
357 if (CoGetMalloc(MEMCTX_TASK, &pmalloc) != NOERROR) {
362 dest->ptd =
static_cast<DVTARGETDEVICE *>(pmalloc->Alloc(src->ptd->tdSize));
367 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.