Qt 6.x
The Qt SDK
Loading...
Searching...
No Matches
qqnxclipboard.cpp
Go to the documentation of this file.
1// Copyright (C) 2011 - 2012 Research In Motion
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3
4#if !defined(QT_NO_CLIPBOARD)
5
6#include "qqnxclipboard.h"
7
8#include <QtGui/QColor>
9
10#include <QtCore/QDebug>
11#include <QtCore/QMimeData>
12#include <QtCore/QStringList>
13#include <QtCore/QUrl>
14
15#include <clipboard/clipboard.h>
16#include <errno.h>
17
18#if defined(QQNXCLIPBOARD_DEBUG)
19#define qClipboardDebug qDebug
20#else
21#define qClipboardDebug QT_NO_QDEBUG_MACRO
22#endif
23
25
26// null terminated array
27static const char *typeList[] = {"text/html", "text/plain", "image/png", "image/jpeg", "application/x-color", 0};
28
30{
31 char *pbuffer;
32 if (is_clipboard_format_present(type) == 0) {
33 int size = get_clipboard_data(type, &pbuffer);
34 if (size != -1 && pbuffer) {
35 const QByteArray result = QByteArray(pbuffer, size);
36 free(pbuffer);
37 return result;
38 }
39 }
40
41 return QByteArray();
42}
43
45{
47public:
49 : QMimeData(),
50 m_clipboard(clipboard),
51 m_userMimeData(0)
52 {
53 Q_ASSERT(clipboard);
54
55 for (int i = 0; typeList[i] != 0; ++i) {
56 m_formatsToCheck << QString::fromUtf8(typeList[i]);
57 }
58 }
59
61 {
62 delete m_userMimeData;
63 }
64
66 m_formatsToCheck << format;
67 qClipboardDebug() << "formats=" << m_formatsToCheck;
68 }
69
70 bool hasFormat(const QString &mimetype) const override
71 {
72 const bool result = is_clipboard_format_present(mimetype.toUtf8().constData()) == 0;
73 qClipboardDebug() << "mimetype=" << mimetype << "result=" << result;
74 return result;
75 }
76
77 QStringList formats() const override
78 {
80
81 Q_FOREACH (const QString &format, m_formatsToCheck) {
82 if (is_clipboard_format_present(format.toUtf8().constData()) == 0)
83 result << format;
84 }
85
86 qClipboardDebug() << "result=" << result;
87 return result;
88 }
89
91 {
92 delete m_userMimeData;
93 m_userMimeData = userMimeData;
94
95 // system clipboard API doesn't allow detection of changes by other applications
96 // simulate an owner change through delayed invocation
97 // basically transfer ownership of data to the system clipboard once event processing resumes
98 if (m_userMimeData)
99 QMetaObject::invokeMethod(this, "releaseOwnership", Qt::QueuedConnection);
100 }
101
103 {
104 return m_userMimeData;
105 }
106
107protected:
108 QVariant retrieveData(const QString &mimetype, QMetaType preferredType) const override
109 {
110 qClipboardDebug() << "mimetype=" << mimetype << "preferredType=" << preferredType.name();
111 if (is_clipboard_format_present(mimetype.toUtf8().constData()) != 0)
112 return QMimeData::retrieveData(mimetype, preferredType);
113
114 const QByteArray data = readClipboardBuff(mimetype.toUtf8().constData());
116 }
117
118private Q_SLOTS:
119 void releaseOwnership()
120 {
121 if (m_userMimeData) {
122 qClipboardDebug() << "user data formats=" << m_userMimeData->formats() << "system formats=" << formats();
123 delete m_userMimeData;
124 m_userMimeData = 0;
126 }
127 }
128
129private:
130 QQnxClipboard * const m_clipboard;
131
132 QSet<QString> m_formatsToCheck;
133 QMimeData *m_userMimeData;
134};
135
137 : m_mimeData(new MimeData(this))
138{
139}
140
142{
143 delete m_mimeData;
144}
145
147{
149 return;
150
151 if (m_mimeData == data)
152 return;
153
154 if (m_mimeData->userMimeData() && m_mimeData->userMimeData() == data)
155 return;
156
157 empty_clipboard();
158
159 m_mimeData->clear();
160 m_mimeData->setUserMimeData(data);
161
162 if (data == 0) {
164 return;
165 }
166
167 const QStringList formats = data->formats();
168 qClipboardDebug() << "formats=" << formats;
169
170 Q_FOREACH (const QString &format, formats) {
171 const QByteArray buf = data->data(format);
172
173 if (buf.isEmpty())
174 continue;
175
176 int ret = set_clipboard_data(format.toUtf8().data(), buf.size(), buf.data());
177 qClipboardDebug() << "set " << format << "to clipboard, size=" << buf.size() << ";ret=" << ret;
178 if (ret)
179 m_mimeData->addFormatToCheck(format);
180 }
181
183}
184
186{
188 return 0;
189
190 if (m_mimeData->userMimeData())
191 return m_mimeData->userMimeData();
192
193 m_mimeData->clear();
194
195 return m_mimeData;
196}
197
199
200#include "qqnxclipboard.moc"
201
202#endif //QT_NO_CLIPBOARD
\inmodule QtCore
Definition qbytearray.h:57
char * data()
\macro QT_NO_CAST_FROM_BYTEARRAY
Definition qbytearray.h:534
const char * constData() const noexcept
Returns a pointer to the const data stored in the byte array.
Definition qbytearray.h:122
Mode
\keyword clipboard mode
Definition qclipboard.h:27
\inmodule QtCore
Definition qmetatype.h:320
constexpr const char * name() const
Definition qmetatype.h:2650
\inmodule QtCore
Definition qmimedata.h:16
virtual QVariant retrieveData(const QString &mimetype, QMetaType preferredType) const
Returns a variant with the given type containing data for the MIME type specified by mimeType.
void clear()
Removes all the MIME type and data entries in the object.
virtual QStringList formats() const
Returns a list of formats supported by the object.
void emitChanged(QClipboard::Mode mode)
void setUserMimeData(QMimeData *userMimeData)
QVariant retrieveData(const QString &mimetype, QMetaType preferredType) const override
Returns a variant with the given type containing data for the MIME type specified by mimeType.
bool hasFormat(const QString &mimetype) const override
Returns true if the object can return data for the MIME type specified by mimeType; otherwise returns...
void addFormatToCheck(const QString &format)
QStringList formats() const override
Returns a list of formats supported by the object.
MimeData(QQnxClipboard *clipboard)
QMimeData * mimeData(QClipboard::Mode mode=QClipboard::Clipboard) override
void setMimeData(QMimeData *data, QClipboard::Mode mode=QClipboard::Clipboard) override
Definition qset.h:18
\inmodule QtCore
\macro QT_RESTRICTED_CAST_FROM_ASCII
Definition qstring.h:127
static QString fromUtf8(QByteArrayView utf8)
This is an overloaded member function, provided for convenience. It differs from the above function o...
Definition qstring.cpp:5857
QByteArray toUtf8() const &
Definition qstring.h:563
\inmodule QtCore
Definition qvariant.h:64
static auto fromValue(T &&value) noexcept(std::is_nothrow_copy_constructible_v< T > &&Private::CanUseInternalSpace< T >) -> std::enable_if_t< std::conjunction_v< std::is_copy_constructible< T >, std::is_destructible< T > >, QVariant >
Definition qvariant.h:531
#define this
Definition dialogs.cpp:9
EGLint EGLint * formats
Combined button and popup list for selecting options.
@ QueuedConnection
#define Q_FOREACH(variable, container)
Definition qforeach.h:66
return ret
GLenum mode
GLenum GLuint GLintptr GLsizeiptr size
[1]
GLenum type
GLenum GLuint GLenum GLsizei const GLchar * buf
GLint GLsizei GLsizei GLenum GLenum GLsizei void * data
GLint GLsizei GLsizei GLenum format
GLuint64EXT * result
[6]
static QByteArray readClipboardBuff(const char *type)
static QT_BEGIN_NAMESPACE const char * typeList[]
#define qClipboardDebug
#define Q_ASSERT(cond)
Definition qrandom.cpp:47
#define Q_OBJECT
#define Q_SLOTS
static bool invokeMethod(QObject *obj, const char *member, Qt::ConnectionType, QGenericReturnArgument ret, QGenericArgument val0=QGenericArgument(nullptr), QGenericArgument val1=QGenericArgument(), QGenericArgument val2=QGenericArgument(), QGenericArgument val3=QGenericArgument(), QGenericArgument val4=QGenericArgument(), QGenericArgument val5=QGenericArgument(), QGenericArgument val6=QGenericArgument(), QGenericArgument val7=QGenericArgument(), QGenericArgument val8=QGenericArgument(), QGenericArgument val9=QGenericArgument())
\threadsafe This is an overloaded member function, provided for convenience. It differs from the abov...