File indexing completed on 2024-04-28 16:51:32

0001 /*
0002     SPDX-FileCopyrightText: 2020 Kai Uwe Broulik <kde@broulik.de>
0003 
0004     SPDX-License-Identifier: GPL-3.0-or-later
0005 */
0006 
0007 #include "abstractkrunnerplugin.h"
0008 
0009 #include <QDBusConnection>
0010 #include <QImage>
0011 
0012 #include "krunner1adaptor.h"
0013 
0014 AbstractKRunnerPlugin::AbstractKRunnerPlugin(const QString &objectPath, const QString &subsystemId, int protocolVersion, QObject *parent)
0015     : AbstractBrowserPlugin(subsystemId, protocolVersion, parent)
0016     , m_objectPath(objectPath)
0017 {
0018     new Krunner1Adaptor(this);
0019     qDBusRegisterMetaType<RemoteMatch>();
0020     qDBusRegisterMetaType<RemoteMatches>();
0021     qDBusRegisterMetaType<RemoteAction>();
0022     qDBusRegisterMetaType<RemoteActions>();
0023     qDBusRegisterMetaType<RemoteImage>();
0024 }
0025 
0026 bool AbstractKRunnerPlugin::onLoad()
0027 {
0028     return QDBusConnection::sessionBus().registerObject(m_objectPath, this);
0029 }
0030 
0031 bool AbstractKRunnerPlugin::onUnload()
0032 {
0033     QDBusConnection::sessionBus().unregisterObject(m_objectPath);
0034     return true;
0035 }
0036 
0037 QImage AbstractKRunnerPlugin::imageFromDataUrl(const QString &dataUrl)
0038 {
0039     QImage image;
0040 
0041     if (!dataUrl.startsWith(QLatin1String("data:"))) {
0042         return image;
0043     }
0044 
0045     const int b64start = dataUrl.indexOf(QLatin1Char(','));
0046     if (b64start == -1) {
0047         qWarning() << "Invalid data URL format for" << dataUrl.left(30);
0048         return image;
0049     }
0050 
0051     const QByteArray b64 = QStringView(dataUrl).right(dataUrl.count() - b64start - 1).toLatin1();
0052     const QByteArray data = QByteArray::fromBase64(b64);
0053 
0054     if (!image.loadFromData(data)) {
0055         qWarning() << "Failed to load favicon image from" << dataUrl.left(30);
0056     }
0057     return image;
0058 }
0059 
0060 RemoteImage AbstractKRunnerPlugin::serializeImage(const QImage &image)
0061 {
0062     QImage convertedImage = image.convertToFormat(QImage::Format_RGBA8888);
0063     RemoteImage remoteImage{
0064         convertedImage.width(),
0065         convertedImage.height(),
0066         convertedImage.bytesPerLine(),
0067         true, // hasAlpha
0068         8, // bitsPerSample
0069         4, // channels
0070         QByteArray(reinterpret_cast<const char *>(convertedImage.constBits()), convertedImage.sizeInBytes()),
0071     };
0072     return remoteImage;
0073 }