diff --git a/CMakeLists.txt b/CMakeLists.txt --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -28,7 +28,6 @@ find_package(KF5NewStuff 5.23) pkg_check_modules(FLATPAK flatpak>=0.6.12) -pkg_check_modules(APPSTREAM appstream) configure_file(DiscoverVersion.h.in DiscoverVersion.h) diff --git a/libdiscover/backends/CMakeLists.txt b/libdiscover/backends/CMakeLists.txt --- a/libdiscover/backends/CMakeLists.txt +++ b/libdiscover/backends/CMakeLists.txt @@ -9,7 +9,7 @@ endfunction() if(KF5Attica_FOUND AND KF5NewStuff_FOUND) - add_subdirectory(KNSBackend) + add_subdirectory(KNSBackend) endif() if(packagekitqt5_FOUND AND AppStreamQt_FOUND) @@ -22,7 +22,7 @@ endif() option(BUILD_FlatpakBackend "Build Flatpak support" "ON") -if(FLATPAK_FOUND AND AppStreamQt_FOUND AND APPSTREAM_FOUND AND BUILD_FlatpakBackend) +if(FLATPAK_FOUND AND AppStreamQt_FOUND AND BUILD_FlatpakBackend) add_subdirectory(FlatpakBackend) endif() diff --git a/libdiscover/backends/FlatpakBackend/FlatpakBackend.cpp b/libdiscover/backends/FlatpakBackend/FlatpakBackend.cpp --- a/libdiscover/backends/FlatpakBackend/FlatpakBackend.cpp +++ b/libdiscover/backends/FlatpakBackend/FlatpakBackend.cpp @@ -35,7 +35,7 @@ #include #include #include -#include +#include #include #include @@ -129,8 +129,8 @@ FlatpakInstalledRef * FlatpakBackend::getInstalledRefForApp(FlatpakInstallation *flatpakInstallation, FlatpakResource *resource) { - AppStream::Component *component = resource->appstreamComponent(); - AppStream::Component::Kind appKind = component->kind(); + AppStream::Component component = resource->appstreamComponent(); + AppStream::Component::Kind appKind = component.kind(); FlatpakInstalledRef *ref = nullptr; GPtrArray *installedApps = nullptr; g_autoptr(GError) localError = nullptr; @@ -212,7 +212,7 @@ g_autoptr(GError) localError = nullptr; g_autoptr(GFile) file = nullptr; g_autoptr(FlatpakBundleRef) bundleRef = nullptr; - AppStream::Component *asComponent = nullptr; + AppStream::Component asComponent; file = g_file_new_for_path(url.toLocalFile().toStdString().c_str()); bundleRef = flatpak_bundle_ref_new(file, &localError); @@ -248,24 +248,23 @@ gconstpointer data = g_bytes_get_data(appstream, &len); g_autofree gchar *appstreamContent = g_strndup((char*)data, len); - g_autoptr(AsMetadata) metadata = as_metadata_new(); - as_metadata_set_format_style(metadata, AS_FORMAT_STYLE_COLLECTION); - as_metadata_parse(metadata, appstreamContent, AS_FORMAT_KIND_XML, &localError); - if (localError) { - qWarning() << "Failed to parse appstream metadata:" << localError->message; + AppStream::Metadata metadata; + metadata.setFormatStyle(AppStream::Metadata::FormatStyleCollection); + AppStream::Metadata::MetadataError error = metadata.parse(QString::fromUtf8(appstreamContent), AppStream::Metadata::FormatKindXml); + if (error != AppStream::Metadata::MetadataErrorNoError) { + qWarning() << "Failed to parse appstream metadata: " << error; return nullptr; } - g_autoptr(GPtrArray) components = as_metadata_get_components(metadata); - if (g_ptr_array_index(components, 0)) { - asComponent = new AppStream::Component(AS_COMPONENT(g_ptr_array_index(components, 0))); + QList components = metadata.components(); + if (components.size()) { + asComponent = AppStream::Component(components.first()); } else { qWarning() << "Failed to parse appstream metadata"; return nullptr; } } else { - AsComponent *component = as_component_new(); - asComponent = new AppStream::Component(component); + asComponent = AppStream::Component(); qWarning() << "No appstream metadata in bundle"; } @@ -339,21 +338,21 @@ auto ref = FLATPAK_REF(remoteRef); - AsComponent *component = as_component_new(); - as_component_add_url(component, AS_URL_KIND_HOMEPAGE, settings.value(QStringLiteral("Flatpak Ref/Homepage")).toString().toStdString().c_str()); - as_component_set_description(component, settings.value(QStringLiteral("Flatpak Ref/Description")).toString().toStdString().c_str(), nullptr); - as_component_set_name(component, settings.value(QStringLiteral("Flatpak Ref/Title")).toString().toStdString().c_str(), nullptr); - as_component_set_summary(component, settings.value(QStringLiteral("Flatpak Ref/Comment")).toString().toStdString().c_str(), nullptr); - as_component_set_id(component, settings.value(QStringLiteral("Flatpak Ref/Name")).toString().toStdString().c_str()); + AppStream::Component asComponent; + asComponent.addUrl(AppStream::Component::UrlKindHomepage, settings.value(QStringLiteral("Flatpak Ref/Homepage")).toString()); + asComponent.setDescription(settings.value(QStringLiteral("Flatpak Ref/Description")).toString()); + asComponent.setName(settings.value(QStringLiteral("Flatpak Ref/Title")).toString()); + asComponent.setSummary(settings.value(QStringLiteral("Flatpak Ref/Comment")).toString()); + asComponent.setId(settings.value(QStringLiteral("Flatpak Ref/Name")).toString()); + const QString iconUrl = settings.value(QStringLiteral("Flatpak Ref/Icon")).toString(); if (!iconUrl.isEmpty()) { - AsIcon *icon = as_icon_new(); - as_icon_set_kind(icon, AS_ICON_KIND_REMOTE); - as_icon_set_url(icon, iconUrl.toStdString().c_str()); - as_component_add_icon(component, icon); + AppStream::Icon icon; + icon.setKind(AppStream::Icon::KindRemote); + icon.setUrl(QUrl(iconUrl)); + asComponent.addIcon(icon); } - AppStream::Component *asComponent = new AppStream::Component(component); auto resource = new FlatpakResource(asComponent, preferredInstallation(), this); resource->setFlatpakFileType(QStringLiteral("flatpakref")); resource->setOrigin(QString::fromUtf8(remoteName)); @@ -378,21 +377,21 @@ return nullptr; } - AsComponent *component = as_component_new(); - as_component_add_url(component, AS_URL_KIND_HOMEPAGE, settings.value(QStringLiteral("Flatpak Repo/Homepage")).toString().toStdString().c_str()); - as_component_set_summary(component, settings.value(QStringLiteral("Flatpak Repo/Comment")).toString().toStdString().c_str(), nullptr); - as_component_set_description(component, settings.value(QStringLiteral("Flatpak Repo/Description")).toString().toStdString().c_str(), nullptr); - as_component_set_name(component, title.toStdString().c_str(), nullptr); - as_component_set_id(component, settings.value(QStringLiteral("Flatpak Ref/Name")).toString().toStdString().c_str()); + AppStream::Component asComponent; + asComponent.addUrl(AppStream::Component::UrlKindHomepage, settings.value(QStringLiteral("Flatpak Repo/Homepage")).toString()); + asComponent.setSummary(settings.value(QStringLiteral("Flatpak Repo/Comment")).toString()); + asComponent.setDescription(settings.value(QStringLiteral("Flatpak Repo/Description")).toString()); + asComponent.setName(title); + asComponent.setId(settings.value(QStringLiteral("Flatpak Ref/Name")).toString()); + const QString iconUrl = settings.value(QStringLiteral("Flatpak Repo/Icon")).toString(); if (!iconUrl.isEmpty()) { - AsIcon *icon = as_icon_new(); - as_icon_set_kind(icon, AS_ICON_KIND_REMOTE); - as_icon_set_url(icon, iconUrl.toStdString().c_str()); - as_component_add_icon(component, icon); + AppStream::Icon icon; + icon.setKind(AppStream::Icon::KindRemote); + icon.setUrl(QUrl(iconUrl)); + asComponent.addIcon(icon); } - AppStream::Component *asComponent = new AppStream::Component(component); auto resource = new FlatpakResource(asComponent, preferredInstallation(), this); // Use metadata only for stuff which are not common for all resources resource->addMetadata(QStringLiteral("gpg-key"), gpgKey); @@ -510,8 +509,6 @@ void FlatpakBackend::integrateRemote(FlatpakInstallation *flatpakInstallation, FlatpakRemote *remote) { - g_autoptr(GError) localError = nullptr; - FlatpakSource source(remote); if (!source.isEnabled() || flatpak_remote_get_noenumerate(remote)) { return; @@ -524,19 +521,17 @@ return; } - g_autoptr(AsMetadata) metadata = as_metadata_new(); - g_autoptr(GFile) file = g_file_new_for_path(appDirFileName.toStdString().c_str()); - as_metadata_set_format_style (metadata, AS_FORMAT_STYLE_COLLECTION); - as_metadata_parse_file(metadata, file, AS_FORMAT_KIND_XML, &localError); - if (localError) { - qWarning() << "Failed to parse appstream metadata" << localError->message; + AppStream::Metadata metadata; + metadata.setFormatStyle(AppStream::Metadata::FormatStyleCollection); + AppStream::Metadata::MetadataError error = metadata.parseFile(appDirFileName, AppStream::Metadata::FormatKindXml); + if (error != AppStream::Metadata::MetadataErrorNoError) { + qWarning() << "Failed to parse appstream metadata: " << error; return; } - g_autoptr(GPtrArray) components = as_metadata_get_components(metadata); - for (uint i = 0; i < components->len; i++) { - AsComponent *component = AS_COMPONENT(g_ptr_array_index(components, i)); - AppStream::Component *appstreamComponent = new AppStream::Component(component); + QList components = metadata.components(); + foreach (const AppStream::Component& component, components) { + AppStream::Component appstreamComponent(component); FlatpakResource *resource = new FlatpakResource(appstreamComponent, flatpakInstallation, this); resource->setIconPath(appstreamDirPath); resource->setOrigin(source.name()); @@ -556,30 +551,21 @@ if (dir.exists()) { foreach (const QString &file, dir.entryList(QDir::NoDotAndDotDot | QDir::Files)) { QString fnDesktop; - AsComponent *component; - g_autoptr(GError) localError = nullptr; - g_autoptr(GFile) desktopFile = nullptr; - g_autoptr(AsMetadata) metadata = as_metadata_new(); if (file == QLatin1String("mimeinfo.cache")) { continue; } fnDesktop = pathApps + file; - desktopFile = g_file_new_for_path(fnDesktop.toStdString().c_str()); - if (!desktopFile) { - qWarning() << "Couldn't open" << fnDesktop << " :" << localError->message; - continue; - } - as_metadata_parse_file(metadata, desktopFile, AS_FORMAT_KIND_DESKTOP_ENTRY, &localError); - if (localError) { - qWarning() << "Failed to parse appstream metadata" << localError->message; + AppStream::Metadata metadata; + AppStream::Metadata::MetadataError error = metadata.parseFile(fnDesktop, AppStream::Metadata::FormatKindDesktopEntry); + if (error != AppStream::Metadata::MetadataErrorNoError) { + qWarning() << "Failed to parse appstream metadata: " << error; continue; } - component = as_metadata_get_component(metadata); - AppStream::Component *appstreamComponent = new AppStream::Component(component); + AppStream::Component appstreamComponent(metadata.component()); FlatpakResource *resource = new FlatpakResource(appstreamComponent, flatpakInstallation, this); resource->setIconPath(pathExports); @@ -666,7 +652,7 @@ { g_autoptr(FlatpakRef) ref = nullptr; g_autoptr(GError) localError = nullptr; - AppStream::Bundle bundle = resource->appstreamComponent()->bundle(AppStream::Bundle::KindFlatpak); + AppStream::Bundle bundle = resource->appstreamComponent().bundle(AppStream::Bundle::KindFlatpak); // Get arch/branch/commit/name from FlatpakRef if (!bundle.isEmpty()) { diff --git a/libdiscover/backends/FlatpakBackend/FlatpakResource.h b/libdiscover/backends/FlatpakBackend/FlatpakResource.h --- a/libdiscover/backends/FlatpakBackend/FlatpakResource.h +++ b/libdiscover/backends/FlatpakBackend/FlatpakResource.h @@ -38,7 +38,7 @@ { Q_OBJECT public: - explicit FlatpakResource(AppStream::Component *component, FlatpakInstallation* installation, FlatpakBackend *parent); + explicit FlatpakResource(const AppStream::Component &component, FlatpakInstallation* installation, FlatpakBackend *parent); enum PropertyKind { DownloadSize = 0, @@ -68,7 +68,7 @@ QString installationPath() const; static QString installationPath(FlatpakInstallation* installation); - AppStream::Component *appstreamComponent() const; + AppStream::Component appstreamComponent() const; QList addonsInformation() override; QString availableVersion() const override; QString appstreamId() const override; @@ -136,7 +136,7 @@ public: QList m_addons; - AppStream::Component *m_appdata; + AppStream::Component m_appdata; FlatpakRefKind m_flatpakRefKind; QString m_arch; QString m_branch; diff --git a/libdiscover/backends/FlatpakBackend/FlatpakResource.cpp b/libdiscover/backends/FlatpakBackend/FlatpakResource.cpp --- a/libdiscover/backends/FlatpakBackend/FlatpakResource.cpp +++ b/libdiscover/backends/FlatpakBackend/FlatpakResource.cpp @@ -42,7 +42,7 @@ #include #include -FlatpakResource::FlatpakResource(AppStream::Component *component, FlatpakInstallation* installation, FlatpakBackend *parent) +FlatpakResource::FlatpakResource(const AppStream::Component &component, FlatpakInstallation* installation, FlatpakBackend *parent) : AbstractResource(parent) , m_appdata(component) , m_downloadSize(0) @@ -53,7 +53,7 @@ , m_type(FlatpakResource::DesktopApp) { // Start fetching remote icons during initialization - const auto icons = m_appdata->icons(); + const auto icons = m_appdata.icons(); if (!icons.isEmpty()) { foreach (const AppStream::Icon &icon, icons) { if (icon.kind() == AppStream::Icon::KindRemote) { @@ -83,7 +83,7 @@ } } -AppStream::Component *FlatpakResource::appstreamComponent() const +AppStream::Component FlatpakResource::appstreamComponent() const { return m_appdata; } @@ -106,7 +106,7 @@ QString FlatpakResource::appstreamId() const { - return m_appdata->id(); + return m_appdata.id(); } QString FlatpakResource::arch() const @@ -135,15 +135,15 @@ QStringList FlatpakResource::categories() { - auto cats = m_appdata->categories(); - if (m_appdata->kind() != AppStream::Component::KindAddon) + auto cats = m_appdata.categories(); + if (m_appdata.kind() != AppStream::Component::KindAddon) cats.append(QStringLiteral("Application")); return cats; } QString FlatpakResource::comment() { - const auto summary = m_appdata->summary(); + const auto summary = m_appdata.summary(); if (!summary.isEmpty()) { return summary; } @@ -163,14 +163,14 @@ QStringList FlatpakResource::executables() const { -// return m_appdata->provided(AppStream::Provided::KindBinary).items(); +// return m_appdata.provided(AppStream::Provided::KindBinary).items(); return QStringList(); } QVariant FlatpakResource::icon() const { QIcon ret; - const auto icons = m_appdata->icons(); + const auto icons = m_appdata.icons(); if (!m_bundledIcon.isNull()) { ret = QIcon(m_bundledIcon); @@ -237,7 +237,7 @@ QUrl FlatpakResource::homepage() { - return m_appdata->url(AppStream::Component::UrlKindHomepage); + return m_appdata.url(AppStream::Component::UrlKindHomepage); } QString FlatpakResource::flatpakFileType() const @@ -250,27 +250,27 @@ // If the flatpak name is not known (known only for installed apps), then use // appstream id instead; if (m_flatpakName.isEmpty()) { - return m_appdata->id(); + return m_appdata.id(); } return m_flatpakName; } QString FlatpakResource::license() { - return m_appdata->projectLicense(); + return m_appdata.projectLicense(); } QString FlatpakResource::longDescription() { - return m_appdata->description(); + return m_appdata.description(); } QString FlatpakResource::name() { - QString name = m_appdata->name(); + QString name = m_appdata.name(); if (name.isEmpty()) { - name = m_appdata->id(); + name = m_appdata.id(); } if (name.startsWith(QLatin1String("(Nightly) "))) { @@ -317,10 +317,10 @@ return ret; } -static QUrl screenshot(AppStream::Component *comp, AppStream::Image::Kind kind) +static QUrl screenshot(AppStream::Component comp, AppStream::Image::Kind kind) { QUrl ret; - Q_FOREACH (const AppStream::Screenshot &s, comp->screenshots()) { + Q_FOREACH (const AppStream::Screenshot &s, comp.screenshots()) { ret = imageOfKind(s.images(), kind); if (s.isDefault() && !ret.isEmpty()) break; @@ -404,7 +404,7 @@ .arg(QLatin1String("flatpak")) .arg(origin()) .arg(typeAsString()) - .arg(m_appdata->id()) + .arg(m_appdata.id()) .arg(branch()); } @@ -420,7 +420,7 @@ nullptr, cancellable, &localError)) { - qWarning() << "Failed to launch " << m_appdata->name() << ": " << localError->message; + qWarning() << "Failed to launch " << m_appdata.name() << ": " << localError->message; } } @@ -436,7 +436,7 @@ { QList thumbnails, screenshots; - Q_FOREACH (const AppStream::Screenshot &s, m_appdata->screenshots()) { + Q_FOREACH (const AppStream::Screenshot &s, m_appdata.screenshots()) { const QUrl thumbnail = imageOfKind(s.images(), AppStream::Image::KindThumbnail); const QUrl plain = imageOfKind(s.images(), AppStream::Image::KindSource); if (plain.isEmpty())