7#include <QtGui/private/qmacmimeregistry_p.h>
8#include <QtGui/qutimimeconverter.h>
9#include <QtGui/qclipboard.h>
10#include <QtGui/qguiapplication.h>
11#include <QtGui/qbitmap.h>
12#include <QtCore/qdatetime.h>
13#include <QtCore/qmetatype.h>
14#include <QtCore/qdebug.h>
15#include <QtCore/private/qcore_mac_p.h>
16#include <QtGui/qguiapplication.h>
17#include <QtGui/qevent.h>
18#include <QtCore/qurl.h>
34OSStatus PasteboardGetItemCountSafe(PasteboardRef
paste, ItemCount *cnt)
40 if (std::make_signed<ItemCount>::type(*cnt) < 0)
47#define PasteboardGetItemCount
58 : itemId(itemId),
offset(
o), converter(
c),
mime(
m), dataRequestType(drt)
75 mac_mime_source =
false;
78 resolvingBeforeDestruction =
false;
84 mac_mime_source =
false;
86 OSStatus err = PasteboardCreate(
nullptr, &paste);
88 PasteboardSetPromiseKeeper(paste, promiseKeeper,
this);
90 qDebug(
"PasteBoard: Error creating pasteboard: [%d]", (
int)err);
91 resolvingBeforeDestruction =
false;
97 mac_mime_source =
false;
99 OSStatus err = PasteboardCreate(
name, &paste);
101 PasteboardSetPromiseKeeper(paste, promiseKeeper,
this);
103 qDebug(
"PasteBoard: Error creating pasteboard: %s [%d]", QString::fromCFString(
name).toLatin1().constData(), (
int)err);
105 resolvingBeforeDestruction =
false;
115 resolvingBeforeDestruction =
true;
116 PasteboardResolvePromises(paste);
126OSStatus QMacPasteboard::promiseKeeper(PasteboardRef
paste, PasteboardItemID
id,
127 CFStringRef uti,
void *_qpaste)
130 const long promise_id = (long)
id;
134 const QString utiAsQString = QString::fromCFString(uti);
135 QMacPasteboard::Promise promise;
136 for (
int i = 0;
i < qpaste->promises.
size();
i++){
137 const QMacPasteboard::Promise tmp = qpaste->promises[
i];
138 if (!availableConverters.
contains(tmp.converter)) {
148 if (tmp.itemId == promise_id && tmp.converter->canConvert(tmp.mime, utiAsQString)) {
154 if (!promise.itemId && utiAsQString ==
"com.trolltech.qt.MimeTypeName"_L1) {
159 PasteboardPutItemFlavor(paste,
id, uti,
data, kPasteboardFlavorNoFlags);
163 if (!promise.itemId) {
166 qDebug(
"Pasteboard: %d: Request for %ld, %s, but no promise found!", __LINE__, promise_id,
qPrintable(utiAsQString));
167 return cantGetFlavorErr;
170 qCDebug(lcQpaClipboard,
"PasteBoard: Calling in promise for %s[%ld] [%s] [%d]",
qPrintable(promise.mime), promise_id,
177 if (!qpaste->resolvingBeforeDestruction && !promise.mimeData.isNull()) {
180 "Cannot keep promise, data contains QPixmap and requires livining QGuiApplication");
181 return cantGetFlavorErr;
183 promiseData =
static_cast<QMacMimeData *
>(promise.mimeData.data())->variantData(promise.mime);
186 promiseData = promise.variantData;
189 const QList<QByteArray> md = promise.converter->convertFromMime(promise.mime, promiseData, utiAsQString);
190 if (md.
size() <= promise.offset)
191 return cantGetFlavorErr;
194 PasteboardPutItemFlavor(paste,
id, uti,
data, kPasteboardFlavorNoFlags);
206 if (PasteboardGetItemCountSafe(paste, &cnt) || !cnt)
214 if (PasteboardGetItemIdentifier(paste,
index, &
id) != noErr)
217 PasteboardFlavorFlags
flags;
218 if (PasteboardGetItemFlavorFlags(paste,
id, c_uti, &
flags) == noErr) {
219 qCDebug(lcQpaClipboard,
" - Found!");
223 qCDebug(lcQpaClipboard,
" - NotFound!");
243 mac_mime_source =
true;
255 if (mime == mime_src || (!mime_src && mime && mac_mime_source))
257 mac_mime_source =
false;
262 if (mime !=
nullptr) {
269 QString dummyMimeType(
"application/x-qt-mime-type-name"_L1);
270 if (!
formats.contains(dummyMimeType)) {
276 for (
const auto *
c : availableConverters) {
280 if (
c->utiForMime(
"text/html"_L1) ==
"public.rtf"_L1)
285 const int numItems =
c->count(mime_src);
292 const QMacPasteboard::Promise promise(itemID,
c,
mimeType, mime_src,
item, dataRequestType);
294 PasteboardPutItemFlavor(paste,
reinterpret_cast<PasteboardItemID
>(itemID),
QCFString(uti), 0, kPasteboardFlavorNoFlags);
295 qCDebug(lcQpaClipboard,
" - adding %ld %s [%s] [%d]",
313 if (PasteboardGetItemCountSafe(paste, &cnt) || !cnt)
316 qCDebug(lcQpaClipboard,
"PasteBoard: Formats [%d]", (
int)cnt);
320 if (PasteboardGetItemIdentifier(paste,
index, &
id) != noErr)
324 if (PasteboardCopyItemFlavors(paste,
id, &
types ) != noErr)
327 const int type_count = CFArrayGetCount(
types);
328 for (
int i = 0;
i < type_count; ++
i) {
329 const QString uti = QString::fromCFString((CFStringRef)CFArrayGetValueAtIndex(
types,
i));
349 if (PasteboardGetItemCountSafe(paste, &cnt) || !cnt)
356 if (PasteboardGetItemIdentifier(paste,
index, &
id) != noErr)
360 if (PasteboardCopyItemFlavors(paste,
id, &
types ) != noErr)
363 const int type_count = CFArrayGetCount(
types);
364 for (
int i = 0;
i < type_count; ++
i) {
365 const QString uti = QString::fromCFString((CFStringRef)CFArrayGetValueAtIndex(
types,
i));
385 if (PasteboardGetItemCountSafe(paste, &cnt) || !cnt)
390 for (
const auto *
c : availableConverters) {
396 if (c_uti ==
"com.apple.traditional-mac-plain-text"_L1
397 || c_uti ==
"public.utf8-plain-text"_L1
398 || c_uti ==
"public.utf16-plain-text"_L1) {
408 if (PasteboardGetItemIdentifier(paste,
index, &
id) != noErr)
412 if (PasteboardCopyItemFlavors(paste,
id, &
types ) != noErr)
415 const int type_count = CFArrayGetCount(
types);
416 for (
int i = 0;
i < type_count; ++
i) {
417 const CFStringRef uti =
static_cast<CFStringRef
>(CFArrayGetValueAtIndex(
types,
i));
418 if (c_uti == QString::fromCFString(uti)) {
420 if (PasteboardCopyItemFlavorData(paste,
id, uti, &macBuffer) == noErr) {
422 CFDataGetLength(macBuffer));
439 ret =
c->convertToMime(
format, retList, c_uti);
447void QMacPasteboard::clear_helper()
450 PasteboardClear(paste);
456 qCDebug(lcQpaClipboard,
"PasteBoard: clear!");
464 const bool fromGlobal = PasteboardSynchronize(paste) & kPasteboardModified;
470 qCDebug(lcQpaClipboard,
"Pasteboard: Synchronize!");
478 NSPasteboard *pb = nil;
480 if (PasteboardCopyName(
paste, &pbname) == noErr) {
481 pb = [NSPasteboard pasteboardWithName:
const_cast<NSString *
>(
reinterpret_cast<const NSString *
>(pbname))];
484 pb = [NSPasteboard generalPasteboard];
487 NSString *
text = [pb stringForType:NSPasteboardTypeString];
489 return QString::fromNSString(
text);
qsizetype size() const noexcept
Returns the number of bytes in this byte array.
const char * constData() const noexcept
Returns a pointer to the const data stored in the byte array.
bool isEmpty() const noexcept
Returns true if the byte array has size 0; otherwise returns false.
QByteArray & append(char c)
This is an overloaded member function, provided for convenience. It differs from the above function o...
static QCoreApplication * instance() noexcept
Returns a pointer to the application's QCoreApplication (or QGuiApplication/QApplication) instance.
qsizetype size() const noexcept
bool isEmpty() const noexcept
void append(parameter_type t)
QVariant variantData(const QString &mime)
QVariant retrieveData(const QString &format, QMetaType) const override
Returns a variant with the given type containing data for the MIME type specified by mimeType.
QMacPasteboardMimeSource(const QMacPasteboard *p)
~QMacPasteboardMimeSource()
QStringList formats() const override
Returns a list of formats supported by the object.
QStringList formats() const
PasteboardRef pasteBoard() const
void setMimeData(QMimeData *mime, DataRequestType dataRequestType=EagerRequest)
QMimeData * mimeData() const
QMacPasteboard(PasteboardRef p, QUtiMimeConverter::HandlerScope scope=QUtiMimeConverter::HandlerScopeFlag::All)
bool hasUti(const QString &uti) const
QVariant retrieveData(const QString &format) const
bool hasFormat(const QString &format) const
QVariant imageData() const
Returns a QVariant storing a QImage if the object can return an image; otherwise returns a null varia...
bool hasImage() const
Returns true if the object can return an image; otherwise returns false.
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.
QByteArray data(const QString &mimetype) const
Returns the data stored in the object in the format described by the MIME type specified by mimeType.
virtual QStringList formats() const
Returns a list of formats supported by the object.
\macro QT_RESTRICTED_CAST_FROM_ASCII
bool isEmpty() const
Returns true if the string has no characters; otherwise returns false.
The QUtiMimeConverter class converts between a MIME type and a \l{https://developer....
QMetaType metaType() const
QList< QUtiMimeConverter * > all(QUtiMimeConverter::HandlerScope scope)
QString flavorToMime(QUtiMimeConverter::HandlerScope scope, const QString &uti)
Combined button and popup list for selecting options.
static jboolean paste(JNIEnv *, jobject)
#define qCWarning(category,...)
#define qCDebug(category,...)
QString qt_mac_get_pasteboardString(PasteboardRef paste)
QString qt_mac_get_pasteboardString(PasteboardRef paste)
#define PasteboardGetItemCount
GLsizei GLenum GLenum * types
GLint GLsizei GLsizei GLenum GLenum GLsizei void * data
GLenum GLuint GLintptr offset
GLint GLsizei GLsizei GLenum format
#define qPrintable(string)
application x qt windows mime
[2]
bool contains(const AT &t) const noexcept