Clean up QUtiMimeConverter API

Based on header review comments, make the internal constructor private
and declare classes that need it as friends.

QFlag-ify the HandlerScope enum, as it is a list of flags, and adjust
code accordingly.

Change-Id: I1d8843265e49e696d463e9eea8306f4dbae75c78
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
Reviewed-by: Tor Arne Vestbø <tor.arne.vestbo@qt.io>
(cherry picked from commit 1dc5e20c16353476ee4b449343a8fbe78a9ac7d8)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
This commit is contained in:
Volker Hilsheimer 2023-02-03 13:19:34 +01:00 committed by Qt Cherry-pick Bot
parent 0134e56859
commit ce89ab80da
8 changed files with 33 additions and 27 deletions

View File

@ -82,15 +82,15 @@ void destroyMimeTypes()
*/
QString flavorToMime(QUtiMimeConverter::HandlerScope scope, const QString &uti)
{
MimeList *mimes = globalMimeList();
for (MimeList::const_iterator it = mimes->constBegin(); it != mimes->constEnd(); ++it) {
const bool relevantScope = uchar((*it)->scope()) & uchar(scope);
const MimeList &mimes = *globalMimeList();
for (const auto &mime : mimes) {
const bool relevantScope = mime->scope() & scope;
#ifdef DEBUG_MIME_MAPS
qDebug("QMacMimeRegistry::flavorToMime: attempting (%d) for uti %s [%s]",
relevantScope, qPrintable(uti), qPrintable((*it)->mimeForUti(uti)));
#endif
if (relevantScope) {
QString mimeType = (*it)->mimeForUti(uti);
const QString mimeType = mime->mimeForUti(uti);
if (!mimeType.isNull())
return mimeType;
}
@ -119,11 +119,10 @@ void unregisterMimeConverter(QUtiMimeConverter *macMime)
QList<QUtiMimeConverter *> all(QUtiMimeConverter::HandlerScope scope)
{
MimeList ret;
MimeList *mimes = globalMimeList();
for (MimeList::const_iterator it = mimes->constBegin(); it != mimes->constEnd(); ++it) {
const bool relevantScope = uchar((*it)->scope()) & uchar(scope);
if (relevantScope)
ret.append((*it));
const MimeList &mimes = *globalMimeList();
for (const auto &mime : mimes) {
if (mime->scope() & scope)
ret.append(mime);
}
return ret;
}

View File

@ -19,7 +19,7 @@ class Q_GUI_EXPORT QUtiMimeConverter
{
Q_DISABLE_COPY(QUtiMimeConverter)
public:
enum class HandlerScope : uchar
enum class HandlerScopeFlag : uint8_t
{
DnD = 0x01,
Clipboard = 0x02,
@ -28,9 +28,9 @@ public:
All = DnD|Clipboard,
AllCompatible = All|Qt_compatible
};
Q_DECLARE_FLAGS(HandlerScope, HandlerScopeFlag)
QUtiMimeConverter();
explicit QUtiMimeConverter(HandlerScope scope); // internal
virtual ~QUtiMimeConverter();
HandlerScope scope() const { return m_scope; }
@ -46,8 +46,15 @@ public:
virtual int count(const QMimeData *mimeData) const;
private:
friend class QMacMimeTypeName;
friend class QMacMimeAny;
explicit QUtiMimeConverter(HandlerScope scope);
const HandlerScope m_scope;
};
Q_DECLARE_OPERATORS_FOR_FLAGS(QUtiMimeConverter::HandlerScope)
QT_END_NAMESPACE

View File

@ -96,7 +96,7 @@ QUtiMimeConverter::QUtiMimeConverter(HandlerScope scope)
globally accessed list of available converters.
*/
QUtiMimeConverter::QUtiMimeConverter()
: QUtiMimeConverter(HandlerScope::All)
: QUtiMimeConverter(HandlerScopeFlag::All)
{
}
@ -170,7 +170,7 @@ int QUtiMimeConverter::count(const QMimeData *mimeData) const
class QMacMimeAny : public QUtiMimeConverter {
public:
QMacMimeAny() : QUtiMimeConverter(HandlerScope::AllCompatible) {}
QMacMimeAny() : QUtiMimeConverter(HandlerScopeFlag::AllCompatible) {}
QString utiForMime(const QString &mime) const override;
QString mimeForUti(const QString &uti) const override;
@ -225,7 +225,7 @@ class QMacMimeTypeName : public QUtiMimeConverter {
private:
public:
QMacMimeTypeName(): QUtiMimeConverter(HandlerScope::AllCompatible) {}
QMacMimeTypeName(): QUtiMimeConverter(HandlerScopeFlag::AllCompatible) {}
QString utiForMime(const QString &mime) const override;
QString mimeForUti(const QString &uti) const override;

View File

@ -10,8 +10,8 @@
QT_BEGIN_NAMESPACE
QCocoaClipboard::QCocoaClipboard()
:m_clipboard(new QMacPasteboard(kPasteboardClipboard, QUtiMimeConverter::HandlerScope::Clipboard))
,m_find(new QMacPasteboard(kPasteboardFind, QUtiMimeConverter::HandlerScope::Clipboard))
:m_clipboard(new QMacPasteboard(kPasteboardClipboard, QUtiMimeConverter::HandlerScopeFlag::Clipboard))
,m_find(new QMacPasteboard(kPasteboardFind, QUtiMimeConverter::HandlerScopeFlag::Clipboard))
{
connect(qGuiApp, &QGuiApplication::applicationStateChanged, this, &QCocoaClipboard::handleApplicationStateChanged);
}

View File

@ -98,7 +98,7 @@ Qt::DropAction QCocoaDrag::drag(QDrag *o)
m_drag = o;
m_executed_drop_action = Qt::IgnoreAction;
QMacPasteboard dragBoard(CFStringRef(NSPasteboardNameDrag), QUtiMimeConverter::HandlerScope::DnD);
QMacPasteboard dragBoard(CFStringRef(NSPasteboardNameDrag), QUtiMimeConverter::HandlerScopeFlag::DnD);
m_drag->mimeData()->setData("application/x-qt-mime-type-name"_L1, QByteArray("dummy"));
dragBoard.setMimeData(m_drag->mimeData(), QMacPasteboard::LazyRequest);
@ -305,7 +305,7 @@ QStringList QCocoaDropData::formats_sys() const
qDebug("DnD: Cannot get PasteBoard!");
return formats;
}
formats = QMacPasteboard(board, QUtiMimeConverter::HandlerScope::DnD).formats();
formats = QMacPasteboard(board, QUtiMimeConverter::HandlerScopeFlag::DnD).formats();
return formats;
}
@ -317,7 +317,7 @@ QVariant QCocoaDropData::retrieveData_sys(const QString &mimeType, QMetaType) co
qDebug("DnD: Cannot get PasteBoard!");
return data;
}
data = QMacPasteboard(board, QUtiMimeConverter::HandlerScope::DnD).retrieveData(mimeType);
data = QMacPasteboard(board, QUtiMimeConverter::HandlerScopeFlag::DnD).retrieveData(mimeType);
CFRelease(board);
return data;
}
@ -330,7 +330,7 @@ bool QCocoaDropData::hasFormat_sys(const QString &mimeType) const
qDebug("DnD: Cannot get PasteBoard!");
return has;
}
has = QMacPasteboard(board, QUtiMimeConverter::HandlerScope::DnD).hasFormat(mimeType);
has = QMacPasteboard(board, QUtiMimeConverter::HandlerScopeFlag::DnD).hasFormat(mimeType);
CFRelease(board);
return has;
}

View File

@ -48,9 +48,9 @@ private:
static OSStatus promiseKeeper(PasteboardRef, PasteboardItemID, CFStringRef, void *);
void clear_helper();
public:
QMacPasteboard(PasteboardRef p, QUtiMimeConverter::HandlerScope scope = QUtiMimeConverter::HandlerScope::All);
QMacPasteboard(PasteboardRef p, QUtiMimeConverter::HandlerScope scope = QUtiMimeConverter::HandlerScopeFlag::All);
QMacPasteboard(QUtiMimeConverter::HandlerScope scope);
QMacPasteboard(CFStringRef name=nullptr, QUtiMimeConverter::HandlerScope scope = QUtiMimeConverter::HandlerScope::All);
QMacPasteboard(CFStringRef name=nullptr, QUtiMimeConverter::HandlerScope scope = QUtiMimeConverter::HandlerScopeFlag::All);
~QMacPasteboard();
bool hasUti(const QString &uti) const;

View File

@ -111,7 +111,7 @@ QMacPasteboard::~QMacPasteboard()
Commit all promises for paste when shutting down,
unless we are the stack-allocated clipboard used by QCocoaDrag.
*/
if (scope == QUtiMimeConverter::HandlerScope::DnD)
if (scope == QUtiMimeConverter::HandlerScopeFlag::DnD)
resolvingBeforeDestruction = true;
PasteboardResolvePromises(paste);
if (paste)
@ -130,7 +130,7 @@ OSStatus QMacPasteboard::promiseKeeper(PasteboardRef paste, PasteboardItemID id,
const long promise_id = (long)id;
// Find the kept promise
const QList<QUtiMimeConverter*> availableConverters = QMacMimeRegistry::all(QUtiMimeConverter::HandlerScope::All);
const QList<QUtiMimeConverter*> availableConverters = QMacMimeRegistry::all(QUtiMimeConverter::HandlerScopeFlag::All);
const QString utiAsQString = QString::fromCFString(uti);
QMacPasteboard::Promise promise;
for (int i = 0; i < qpaste->promises.size(); i++){

View File

@ -117,7 +117,7 @@ QStringList QIOSMimeData::formats() const
for (NSUInteger i = 0; i < [pasteboardTypes count]; ++i) {
const QString uti = QString::fromNSString([pasteboardTypes objectAtIndex:i]);
const QString mimeType = QMacMimeRegistry::flavorToMime(QUtiMimeConverter::HandlerScope::All, uti);
const QString mimeType = QMacMimeRegistry::flavorToMime(QUtiMimeConverter::HandlerScopeFlag::All, uti);
if (!mimeType.isEmpty() && !foundMimeTypes.contains(mimeType))
foundMimeTypes << mimeType;
}
@ -130,7 +130,7 @@ QVariant QIOSMimeData::retrieveData(const QString &mimeType, QMetaType) const
UIPasteboard *pb = [UIPasteboard pasteboardWithQClipboardMode:m_mode];
NSArray<NSString *> *pasteboardTypes = [pb pasteboardTypes];
const auto converters = QMacMimeRegistry::all(QUtiMimeConverter::HandlerScope::All);
const auto converters = QMacMimeRegistry::all(QUtiMimeConverter::HandlerScopeFlag::All);
for (QUtiMimeConverter *converter : converters) {
for (NSUInteger i = 0; i < [pasteboardTypes count]; ++i) {
NSString *availableUtiNSString = [pasteboardTypes objectAtIndex:i];
@ -183,7 +183,7 @@ void QIOSClipboard::setMimeData(QMimeData *mimeData, QClipboard::Mode mode)
const auto formats = mimeData->formats();
for (const QString &mimeType : formats) {
const auto converters = QMacMimeRegistry::all(QUtiMimeConverter::HandlerScope::All);
const auto converters = QMacMimeRegistry::all(QUtiMimeConverter::HandlerScopeFlag::All);
for (const QUtiMimeConverter *converter : converters) {
const QString uti = converter->utiForMime(mimeType);
if (uti.isEmpty())