1 /****************************************************************************
2 **
3 ** Copyright (C) 2016 The Qt Company Ltd.
4 ** Contact: https://www.qt.io/licensing/
5 **
6 ** This file is part of the plugins of the Qt Toolkit.
7 **
8 ** $QT_BEGIN_LICENSE:LGPL$
9 ** Commercial License Usage
10 ** Licensees holding valid commercial Qt licenses may use this file in
11 ** accordance with the commercial license agreement provided with the
12 ** Software or, alternatively, in accordance with the terms contained in
13 ** a written agreement between you and The Qt Company. For licensing terms
14 ** and conditions see https://www.qt.io/terms-conditions. For further
15 ** information use the contact form at https://www.qt.io/contact-us.
16 **
17 ** GNU Lesser General Public License Usage
18 ** Alternatively, this file may be used under the terms of the GNU Lesser
19 ** General Public License version 3 as published by the Free Software
20 ** Foundation and appearing in the file LICENSE.LGPL3 included in the
21 ** packaging of this file. Please review the following information to
22 ** ensure the GNU Lesser General Public License version 3 requirements
23 ** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
24 **
25 ** GNU General Public License Usage
26 ** Alternatively, this file may be used under the terms of the GNU
27 ** General Public License version 2.0 or (at your option) the GNU General
28 ** Public license version 3 or any later version approved by the KDE Free
29 ** Qt Foundation. The licenses are as published by the Free Software
30 ** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
31 ** included in the packaging of this file. Please review the following
32 ** information to ensure the GNU General Public License requirements will
33 ** be met: https://www.gnu.org/licenses/gpl-2.0.html and
34 ** https://www.gnu.org/licenses/gpl-3.0.html.
35 **
36 ** $QT_END_LICENSE$
37 **
38 ****************************************************************************/
39 
40 #ifndef QWINDOWSOLE_H
41 #define QWINDOWSOLE_H
42 
43 #include "qwindowscombase.h"
44 #include <QtCore/qt_windows.h>
45 
46 #include <QtCore/qmap.h>
47 #include <QtCore/qpointer.h>
48 #include <QtCore/qvector.h>
49 
50 #include <objidl.h>
51 
52 QT_BEGIN_NAMESPACE
53 
54 class QMimeData;
55 class QWindow;
56 
57 class QWindowsOleDataObject : public QWindowsComBase<IDataObject>
58 {
59 public:
60     explicit QWindowsOleDataObject(QMimeData *mimeData);
61     ~QWindowsOleDataObject() override;
62 
63     void releaseQt();
64     QMimeData *mimeData() const;
65     DWORD reportedPerformedEffect() const;
66 
67     // IDataObject methods
68     STDMETHOD(GetData)(LPFORMATETC pformatetcIn, LPSTGMEDIUM pmedium);
69     STDMETHOD(GetDataHere)(LPFORMATETC pformatetc, LPSTGMEDIUM pmedium);
70     STDMETHOD(QueryGetData)(LPFORMATETC pformatetc);
71     STDMETHOD(GetCanonicalFormatEtc)(LPFORMATETC pformatetc, LPFORMATETC pformatetcOut);
72     STDMETHOD(SetData)(LPFORMATETC pformatetc, STGMEDIUM FAR * pmedium,
73                        BOOL fRelease);
74     STDMETHOD(EnumFormatEtc)(DWORD dwDirection, LPENUMFORMATETC FAR* ppenumFormatEtc);
75     STDMETHOD(DAdvise)(FORMATETC FAR* pFormatetc, DWORD advf,
76                       LPADVISESINK pAdvSink, DWORD FAR* pdwConnection);
77     STDMETHOD(DUnadvise)(DWORD dwConnection);
78     STDMETHOD(EnumDAdvise)(LPENUMSTATDATA FAR* ppenumAdvise);
79 
80 private:
81     QPointer<QMimeData> data;
82     const int CF_PERFORMEDDROPEFFECT;
83     DWORD performedEffect = DROPEFFECT_NONE;
84 };
85 
86 class QWindowsOleEnumFmtEtc : public QWindowsComBase<IEnumFORMATETC>
87 {
88 public:
89     explicit QWindowsOleEnumFmtEtc(const QVector<FORMATETC> &fmtetcs);
90     explicit QWindowsOleEnumFmtEtc(const QVector<LPFORMATETC> &lpfmtetcs);
91     ~QWindowsOleEnumFmtEtc() override;
92 
93     bool isNull() const;
94 
95     // IEnumFORMATETC methods
96     STDMETHOD(Next)(ULONG celt, LPFORMATETC rgelt, ULONG FAR* pceltFetched);
97     STDMETHOD(Skip)(ULONG celt);
98     STDMETHOD(Reset)(void);
99     STDMETHOD(Clone)(LPENUMFORMATETC FAR* newEnum);
100 
101 private:
102     bool copyFormatEtc(LPFORMATETC dest, const FORMATETC *src) const;
103 
104     ULONG m_nIndex = 0;
105     QVector<LPFORMATETC> m_lpfmtetcs;
106     bool m_isNull = false;
107 };
108 
109 QT_END_NAMESPACE
110 
111 #endif // QWINDOWSOLE_H
112