File indexing completed on 2024-05-12 16:23:45

0001 // SPDX-FileCopyrightText: 2020-2021 Jonah BrĂ¼chert <jbb.prv@gmx.de>
0002 //
0003 // SPDX-License-Identifier: LGPL-2.0-or-later
0004 
0005 #include "webappcreator.h"
0006 
0007 #include <QDebug>
0008 #include <QDir>
0009 #include <QFile>
0010 #include <QProcess>
0011 #include <QQmlEngine>
0012 #include <QQuickImageProvider>
0013 #include <QStandardPaths>
0014 
0015 #include <KConfigGroup>
0016 #include <KDesktopFile>
0017 
0018 #include "webappmanager.h"
0019 
0020 WebAppCreator::WebAppCreator(QObject *parent)
0021     : QObject(parent)
0022     , m_webAppMngr(WebAppManager::instance())
0023 {
0024     connect(this, &WebAppCreator::websiteNameChanged, this, &WebAppCreator::existsChanged);
0025     connect(&m_webAppMngr, &WebAppManager::applicationsChanged, this, &WebAppCreator::existsChanged);
0026 }
0027 
0028 bool WebAppCreator::exists() const
0029 {
0030     return m_webAppMngr.exists(m_websiteName);
0031 }
0032 
0033 const QString &WebAppCreator::websiteName() const
0034 {
0035     return m_websiteName;
0036 }
0037 
0038 void WebAppCreator::setWebsiteName(const QString &websiteName)
0039 {
0040     m_websiteName = websiteName;
0041     Q_EMIT websiteNameChanged();
0042 }
0043 
0044 void WebAppCreator::createDesktopFile(const QString &name, const QString &url, const QString &iconUrl)
0045 {
0046     m_webAppMngr.addApp(name, url, fetchIcon(iconUrl));
0047 
0048     // Refresh homescreen entries on Plasma Mobile
0049     QProcess buildsycoca;
0050     buildsycoca.setProgram(QStringLiteral("kbuildsycoca5"));
0051     buildsycoca.startDetached();
0052 }
0053 
0054 QImage WebAppCreator::fetchIcon(const QString &url)
0055 {
0056     auto *provider = static_cast<QQuickImageProvider *>(qmlEngine(this)->imageProvider(QStringLiteral("favicon")));
0057 
0058     const QStringView prefixFavicon = QStringView(u"image://favicon/");
0059     const QString providerIconName = url.mid(prefixFavicon.size());
0060 
0061     const QSize szRequested;
0062 
0063     switch (provider->imageType()) {
0064     case QQmlImageProviderBase::Image: {
0065         return provider->requestImage(providerIconName, nullptr, szRequested);
0066     }
0067     case QQmlImageProviderBase::Pixmap: {
0068         return provider->requestPixmap(providerIconName, nullptr, szRequested).toImage();
0069     }
0070     default:
0071         qDebug() << "Failed to save unhandled image type";
0072     }
0073 
0074     return QImage();
0075 }
0076 
0077 #include "moc_webappcreator.cpp"