🔒 Repository is read-only – file editing is disabled.

recipes/gui/packagekit/packagekit-v1.3.5-cards-consolidate-6.patch main

780 linii Raw ← Powrót
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780
diff -Naur PackageKit_upstream/backends/cards/job.cxx PackageKit/backends/cards/job.cxx
--- PackageKit_upstream/backends/cards/job.cxx	1970-01-01 01:00:00.000000000 +0100
+++ PackageKit/backends/cards/job.cxx	2026-06-03 12:35:10.398875583 +0200
@@ -0,0 +1,261 @@
+#include "job.h"
+
+#include <iostream>
+#include <sstream>
+#include <memory>
+#include <fstream>
+#include <dirent.h>
+
+Job::Job(PkBackendJob *job) :
+	m_cache(nullptr),
+	m_job(job),
+	m_cancel(false)
+{
+}
+Job::~Job()
+{
+	delete m_cache;
+	for (auto pkg : m_packagesSet) {
+		if (pkg)
+			delete pkg;
+	}
+}
+bool Job::init()
+{
+	m_cache = new cards::pkgrepo("/etc/cards.conf");
+	m_mapPackages = m_cache->getListOfPackages();
+
+	if (m_mapPackages.size() > 0)
+		return true;
+	return false;
+}
+void Job::cancel()
+{
+	if (!m_cancel) {
+		m_cancel = true;
+		pk_backend_job_set_status(m_job, PK_STATUS_ENUM_CANCEL);
+	}
+
+	if (m_child_pid > 0) {
+		kill(m_child_pid, SIGTERM);
+	}
+}
+
+bool Job::cancelled() const
+{
+	return m_cancel;
+}
+
+PkBackendJob *Job::pkJob() const
+{
+	return m_job;
+}
+PkGroupEnum
+Job::group_to_enum (const std::string& p)
+{
+	if (p.compare("doc"))
+		return PK_GROUP_ENUM_DOCUMENTATION;
+	else if ( p.compare("fr") ||
+			p.compare("de") ||
+			p.compare("es") ||
+			p.compare("it") ||
+			p.compare("pt") ||
+			p.compare("nl") ) // TODO find another solution not completed ATM
+		return PK_GROUP_ENUM_LOCALIZATION;
+	else if (p.compare("devel"))
+		return PK_GROUP_ENUM_PROGRAMMING;
+	else if (p.compare("kde6"))
+		return PK_GROUP_ENUM_DESKTOP_KDE;
+	else if (p.compare("xfce4") ||
+		p.compare("xfce4-extra"))
+		return PK_GROUP_ENUM_DESKTOP_XFCE;
+	else if (p.compare("gnome-base") ||
+		p.compare("gnome") ||
+		p.compare("gnome-extra"))
+		return PK_GROUP_ENUM_DESKTOP_GNOME;
+	else if (p.compare("service"))
+		return PK_GROUP_ENUM_SERVERS;
+	else if (p.compare("base"))
+		return PK_GROUP_ENUM_SYSTEM;
+	else
+		return PK_GROUP_ENUM_DESKTOP_OTHER;
+}
+
+void Job::resolvePackages()
+{
+	g_debug("resolvePackges Started");
+
+	pk_backend_job_set_status (m_job, PK_STATUS_ENUM_QUERY);
+
+	for (auto p : m_mapPackages) {
+		cards::cache* pkg = new cards::cache;
+		pkg->name(p.first);
+		pkg->description(p.second.description());
+		pkg->arch(p.second.arch());
+		pkg->version(p.second.version());
+		pkg->collection(p.second.collection());
+		if (p.second.group().empty()) {
+			if ( ! p.second.sets().empty()) {
+				for (auto s : p.second.sets()) {
+					pkg->group(s);
+					break;
+				}
+			} else
+				pkg->group(p.second.collection());
+		} else
+			pkg->group(p.second.group());
+		pkg->license("GPL2");
+		if ( ! p.second.license().empty())
+			pkg->license(p.second.license());
+		pkg->url(p.second.url());
+		pkg->space(p.second.space());
+		m_packagesSet.insert(pkg);
+
+	}
+}
+void Job::resolvePackageIds(gchar **package_ids)
+{
+	g_debug("resolvePackgesIds started");
+
+	pk_backend_job_set_status (m_job, PK_STATUS_ENUM_QUERY);
+
+	if (package_ids == NULL)
+		return;
+
+
+	for (uint i = 0; i < g_strv_length(package_ids); ++i) {
+		if (m_cancel)
+			break;
+		std::string pi;
+		if (pk_package_id_check(package_ids[i])) {
+			g_auto(GStrv) parts = pk_package_id_split(package_ids[i]);
+			pi = parts[PK_PACKAGE_ID_NAME];
+		} else {
+			pi = package_ids[i];
+		}
+		g_debug(package_ids[i]);
+		for (auto p : m_mapPackages) {
+
+			cards::cache* pkg = new cards::cache;
+
+			std::string::size_type pos;
+			pos = convertToLowerCase(p.second.collection()).find(convertToLowerCase(pi));
+			if (pos == std::string::npos)
+				pos = convertToLowerCase(p.first).find(convertToLowerCase(pi));
+			if (pos == std::string::npos)
+				pos = convertToLowerCase(p.second.description()).find(convertToLowerCase(pi));
+			if (pos == std::string::npos)
+				pos = convertToLowerCase(p.second.version()).find(convertToLowerCase(pi));
+			if (pos != std::string::npos){
+				pkg->name(p.first);
+				pkg->description(p.second.description());
+				pkg->arch(p.second.arch());
+				pkg->version(p.second.version());
+				pkg->collection(p.second.collection());
+				if (p.second.group().empty()) {
+					if ( ! p.second.sets().empty()) {
+						for (auto s : p.second.sets()) {
+							pkg->group(s);
+							break;
+						}
+					} else
+						pkg->group(p.second.collection());
+				} else
+					pkg->group(p.second.group());
+				pkg->license("GPL2");
+				if (!p.second.license().empty())
+					pkg->license(p.second.license());
+				pkg->url(p.second.url());
+				pkg->space(p.second.space());
+				pkg->size(p.second.size());
+				m_packagesSet.insert(pkg);
+			}
+		}
+	}
+}
+void Job::refreshCache()
+{
+	pk_backend_job_set_status(m_job, PK_STATUS_ENUM_REFRESH_CACHE);
+}
+void Job::emitPackageFiles(const gchar *pi)
+{
+	using namespace std;
+	GPtrArray *files;
+	string line;
+
+	g_auto(GStrv) parts = pk_package_id_split(pi);
+	string fName;
+	fName = "/var/lib/pkg/DB/" + string(parts[PK_PACKAGE_ID_NAME]) + "/files";
+
+	if (checkFileExist(fName)) {
+		ifstream in(fName.c_str());
+		if (!in != 0) {
+			return;
+		}
+
+		files = g_ptr_array_new_with_free_func(g_free);
+		while (in.eof() == false) {
+			getline(in, line);
+			if (!line.empty()) {
+				g_ptr_array_add(files, g_strdup(line.c_str()));
+			}
+		}
+
+		if (files->len) {
+			g_ptr_array_add(files, NULL);
+			pk_backend_job_files(m_job, pi, (gchar **) files->pdata);
+		}
+		g_ptr_array_unref(files);
+	}
+}
+void Job::emitPackages(PkBitfield filters, PkInfoEnum state)
+{
+	g_debug("emitPackages started");
+	pkgdbh dbh;
+	dbh.buildDatabase(false);
+
+	for (auto p : m_packagesSet) {
+		if(m_cancel)
+			break;
+
+		std::string c = p->collection();
+
+		if (state == PK_INFO_ENUM_UNKNOWN) {
+			state = PK_INFO_ENUM_AVAILABLE;
+			if (dbh.checkPackageNameExist(p->name())) {
+				state = PK_INFO_ENUM_INSTALLED;
+			}
+		}
+		if (dbh.checkPackageNameExist(p->name()))
+			c = "installed";
+
+		std::string pi = p->name() + ";" + p->version()
+			+ ";" + p->arch() + ";"
+			+ p->description().c_str();
+		pk_backend_job_package(m_job, state, pi.c_str(), p->description().c_str());
+	}
+}
+void Job::emitDetails()
+{
+
+	g_debug("emitDetails started");
+
+	for (auto p : m_packagesSet) {
+		if(m_cancel)
+			break;
+
+		std::string pi = p->name() + ";"
+			+ p->version() + ";" + p->arch()
+			+ ";" + p->collection();
+
+		pk_backend_job_details (m_job, pi.c_str(),
+			p->description().c_str(),
+			p->license().c_str(),
+			group_to_enum(p->group()),
+			"",
+			p->url().c_str(),
+			p->space(),
+			p->size());
+	}
+}
+// vim:set ts=2 :
diff -Naur PackageKit_upstream/backends/cards/job.h PackageKit/backends/cards/job.h
--- PackageKit_upstream/backends/cards/job.h	1970-01-01 01:00:00.000000000 +0100
+++ PackageKit/backends/cards/job.h	2026-06-03 12:35:42.097972783 +0200
@@ -0,0 +1,106 @@
+/* job.h
+ *
+ * Copyright (c) 2023 Thierry Nuttens <tnut@nutyx.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#pragma once
+
+#include <libcards.h>
+
+#include <pk-backend.h>
+
+class Job
+{
+	cards::pkgrepo         *m_cache;
+	cards::repo_t           m_mapPackages;
+	std::set<cards::cache*> m_packagesSet;
+	PkBackendJob           *m_job;
+	bool	                m_cancel;
+	pid_t                   m_child_pid;
+
+public:
+	Job(PkBackendJob *job);
+	~Job();
+
+	bool init();
+	void cancel();
+	bool cancelled() const;
+
+	/**
+	  * Returns the PkBitfield for the specified Package.
+	*/
+	PkGroupEnum
+	group_to_enum (const std::string& p);
+	/**
+	  * Returns the PackageKit backend job associated with this CARDS job.
+	*/
+	PkBackendJob *pkJob() const;
+
+	/**
+	  * Get the list of packages
+	  *  generate m_packageSet, if the list is empty no package was found
+	  */
+	void resolvePackages();
+
+	/**
+	  * Tries to find a list of packages mathing the package ids
+	  *  generate m_packagesSet, if the list is empty no package was found
+	  */
+	void resolvePackageIds(gchar **package_ids);
+
+	/**
+	  * Return a package_id
+	  *
+	  */
+	gchar* matchPackage(const std::string &package);
+
+	/**
+	  * Check if a given package matches the filters
+	  *  @return true if it passed the filters
+	  */
+	bool matchPackage(const std::string &PackageName, PkBitfield filters);
+
+	/**
+	  * Refreshes the sources of packages
+	  */
+	void refreshCache();
+
+	/**
+	  *  Emits the files of a package
+	  */
+	void emitPackageFiles(const gchar *pi);
+
+	/**
+	  *  Emits the files of a package
+	  */
+	void emitPackageFilesLocal(const gchar *pi);
+
+
+	/**
+		* Emit m_packageSet that matches the given filters
+	  */
+	void emitPackages(PkBitfield filters = PK_FILTER_ENUM_NONE,
+		PkInfoEnum state = PK_INFO_ENUM_UNKNOWN);
+
+
+	/**
+	* Emit details
+	*/
+	void emitDetails();
+};
+// vim:set ts=2 :
diff -Naur PackageKit_upstream/backends/cards/meson.build PackageKit/backends/cards/meson.build
--- PackageKit_upstream/backends/cards/meson.build	1970-01-01 01:00:00.000000000 +0100
+++ PackageKit/backends/cards/meson.build	2026-05-22 15:39:46.648240952 +0200
@@ -0,0 +1,29 @@
+add_languages('cpp')
+
+cpp_compiler = meson.get_compiler('cpp')
+
+archive_dep = meson.get_compiler('c').find_library('archive')
+curl_dep = meson.get_compiler('c').find_library('curl')
+cards_dep = meson.get_compiler('c').find_library('cards')
+
+shared_module(
+  'pk_backend_cards',
+  'pk-backend-cards.cxx',
+  'job.cxx',
+  'job.h',
+  include_directories: packagekit_src_include,
+  dependencies: [
+    packagekit_glib2_dep,
+    archive_dep,
+    curl_dep,
+    cards_dep,
+    gmodule_dep,
+  ],
+  cpp_args: [
+    '-DPK_COMPILATION',
+    '-DG_LOG_DOMAIN="PackageKit-Cards"',
+  ],
+  override_options: ['c_std=c11','cpp_std=c++17'],
+  install: true,
+  install_dir: pk_plugin_dir,
+)
diff -Naur PackageKit_upstream/backends/cards/pk-backend-cards.cxx PackageKit/backends/cards/pk-backend-cards.cxx
--- PackageKit_upstream/backends/cards/pk-backend-cards.cxx	1970-01-01 01:00:00.000000000 +0100
+++ PackageKit/backends/cards/pk-backend-cards.cxx	2026-06-03 12:36:05.289972695 +0200
@@ -0,0 +1,368 @@
+/* pk-backend-cards.cpp
+ *
+ * Copyright (C) 2007-2014 Richard Hughes <richard@hughsie.com>
+ * Copyright (C) 2023 Thierry Nuttens <tnut@nutyx.org>
+ *
+ * Licensed under the GNU General Public License Version 2
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+
+#include <stdlib.h>
+
+#include <pk-backend.h>
+#include <packagekit-glib2/pk-debug.h>
+
+#include <libcards.h>
+
+#include "job.h"
+
+const gchar * pk_backend_get_description (PkBackend *backend)
+{
+	return "Cards backend";
+}
+
+const gchar * pk_backend_get_author (PkBackend *backend)
+{
+	return "Thierry Nuttens <tnut@nutyx.org>";
+}
+
+gboolean
+pk_backend_supports_parallelization (PkBackend *backend)
+{
+	return FALSE;
+}
+
+void
+pk_backend_initialize (GKeyFile *conf, PkBackend *backend)
+{
+	pk_debug_add_log_domain (G_LOG_DOMAIN);
+	pk_debug_add_log_domain ("CARDS");
+}
+
+void
+pk_backend_destroy (PkBackend *backend)
+{
+	g_debug("Cards backend being destroyed");
+}
+
+PkBitfield
+pk_backend_get_groups (PkBackend *backend)
+{
+	return pk_bitfield_from_enums (PK_GROUP_ENUM_DOCUMENTATION,
+		PK_GROUP_ENUM_LOCALIZATION,
+		PK_GROUP_ENUM_SERVERS,
+		PK_GROUP_ENUM_PROGRAMMING,
+		PK_GROUP_ENUM_SYSTEM,
+		PK_GROUP_ENUM_DESKTOP_KDE,
+		PK_GROUP_ENUM_DESKTOP_XFCE,
+		PK_GROUP_ENUM_DESKTOP_GNOME,
+		PK_GROUP_ENUM_DESKTOP_OTHER,
+		-1);
+}
+
+PkBitfield
+pk_backend_get_filters (PkBackend *backend)
+{
+	return pk_bitfield_from_enums (PK_FILTER_ENUM_BASENAME,
+		PK_FILTER_ENUM_GUI,
+		PK_FILTER_ENUM_APPLICATION,
+		PK_FILTER_ENUM_INSTALLED,
+		PK_FILTER_ENUM_NOT_INSTALLED,
+		PK_FILTER_ENUM_DEVELOPMENT,
+		-1);
+}
+
+gchar ** pk_backend_get_mime_types (PkBackend *backend)
+{
+	const gchar *mime_types[] = {
+				"application/x-xz-compressed-tar",
+				NULL };
+	return g_strdupv ((gchar **) mime_types);
+}
+
+void
+pk_backend_start_job (PkBackend *backend, PkBackendJob *job)
+{
+
+	/* create private state for this job */
+	auto cards = new Job(job);
+
+	/* you can use pk_backend_job_error_code() here too */
+	pk_backend_job_set_user_data (job, cards);
+}
+
+void
+pk_backend_stop_job (PkBackend *backend, PkBackendJob *job)
+{
+	auto cards = static_cast<Job*>(pk_backend_job_get_user_data (job));
+
+	if (cards)
+		delete cards;
+
+	pk_backend_job_set_user_data (job, NULL);
+}
+
+void
+pk_backend_cancel (PkBackend *backend, PkBackendJob *job)
+{
+	auto cards = static_cast<Job*>(pk_backend_job_get_user_data(job));
+	if (cards) {
+		/* try to cancel the thread */
+		g_debug ("cancelling transaction");
+		cards->cancel();
+	}
+}
+static void
+backend_refresh_cache_thread (PkBackendJob *job, GVariant *params, gpointer user_data)
+{
+	g_debug("backend_refresh_cache_tread started");
+	pk_backend_job_set_status(job, PK_STATUS_ENUM_REFRESH_CACHE);
+	pk_backend_job_set_percentage (job, 0);
+	cards::sync sync("/etc/cards.conf",false);
+	sync.run();
+	pk_backend_job_set_percentage (job, 100);
+	pk_backend_job_finished (job);
+}
+void
+pk_backend_refresh_cache (PkBackend *backend, PkBackendJob *job, gboolean force)
+{
+	pk_backend_job_thread_create (job, backend_refresh_cache_thread, NULL, NULL);
+}
+static void
+backend_get_updates_thread (PkBackendJob *job, GVariant *params, gpointer user_data)
+{
+	g_debug("backend_get_updates_tread started");
+	pk_backend_job_set_status (job, PK_STATUS_ENUM_QUERY);
+	pk_backend_job_set_percentage (job, 0);
+	cards::sync sync("/etc/cards.conf",false);
+	sync.run();
+	pk_backend_job_set_percentage (job, 100);
+	pk_backend_job_finished (job);
+}
+void
+pk_backend_get_updates (PkBackend *backend, PkBackendJob *job, PkBitfield filters)
+{
+	pk_backend_job_thread_create (job, backend_get_updates_thread, NULL, NULL);
+}
+
+static void
+backend_get_files_thread (PkBackendJob *job, GVariant *params, gpointer user_data)
+{
+	gchar **package_ids;	// List of packages
+	gchar *pi;	// Package installed
+
+	g_variant_get(params, "(^a&s)",
+		&package_ids);
+
+	auto cards = static_cast<Job*>(pk_backend_job_get_user_data(job));
+	if (!cards->init()) {
+		g_debug("Failed to create cards cache");
+		return;
+	}
+	pk_backend_job_set_status(job, PK_STATUS_ENUM_QUERY);
+	for (uint i = 0; i < g_strv_length(package_ids); ++i) {
+		pi = package_ids[i];
+		cards->emitPackageFiles(pi);
+	}
+	pk_backend_job_finished (job);
+}
+
+void
+pk_backend_get_files (PkBackend *backend, PkBackendJob *job, gchar **package_ids)
+{
+	pk_backend_job_thread_create(job, backend_get_files_thread, NULL, NULL);
+}
+void
+pk_backend_resolve_thread (PkBackendJob *job, GVariant *params, gpointer user_data)
+{
+	g_debug("pk_backend_resolve_tread started");
+
+	gchar **search;
+	PkBitfield filters;
+
+	g_variant_get(params, "(t^a&s)",
+		&filters,
+		&search);
+	pk_backend_job_set_allow_cancel(job, true);
+
+	auto cards = static_cast<Job*>(pk_backend_job_get_user_data(job));
+	if (!cards->init()) {
+		g_debug("Failed to initialize CARDS job");
+		pk_backend_job_finished (job);
+		return;
+	}
+	cards->resolvePackageIds(search);
+
+	cards->emitPackages(filters,PK_INFO_ENUM_UNKNOWN);
+	pk_backend_job_finished (job);
+}
+void
+pk_backend_resolve (PkBackend *backend, PkBackendJob *job, PkBitfield filters, gchar **package_ids)
+{
+	pk_backend_job_thread_create(job, pk_backend_resolve_thread, NULL, NULL);
+}
+
+static void
+backend_get_packages_thread (PkBackendJob *job, GVariant *params, gpointer user_data)
+{
+	PkBitfield filters;
+	g_variant_get(params, "(t)", &filters);
+
+	auto cards = static_cast<Job*>(pk_backend_job_get_user_data(job));
+	if (!cards->init()) {
+		g_debug("Failed to create cards cache");
+		pk_backend_job_finished (job);
+		return;
+	}
+	cards->resolvePackages();
+	cards->emitPackages(filters,PK_INFO_ENUM_UNKNOWN);
+	pk_backend_job_finished (job);
+}
+
+void pk_backend_get_packages(PkBackend *backend, PkBackendJob *job, PkBitfield filters)
+{
+	pk_backend_job_thread_create(job, backend_get_packages_thread, NULL, NULL);
+}
+
+void
+pk_backend_install_packages (PkBackend *backend, PkBackendJob *job,
+	PkBitfield transaction_flags, gchar **package_ids)
+{
+	pk_backend_job_finished (job);
+}
+
+void
+pk_backend_remove_packages (PkBackend *backend, PkBackendJob *job,
+	PkBitfield transaction_flags, gchar **package_ids,
+	gboolean allow_deps, gboolean autoremove)
+{
+	pk_backend_job_finished(job);
+}
+PkBitfield
+pk_backend_get_roles (PkBackend *backend)
+{
+	PkBitfield roles;
+	roles = pk_bitfield_from_enums(
+		PK_ROLE_ENUM_CANCEL,
+		PK_ROLE_ENUM_GET_FILES,
+		PK_ROLE_ENUM_GET_PACKAGES,
+		PK_ROLE_ENUM_GET_REPO_LIST,
+		PK_ROLE_ENUM_GET_DETAILS,
+		PK_ROLE_ENUM_GET_DETAILS_LOCAL,
+		PK_ROLE_ENUM_RESOLVE,
+		PK_ROLE_ENUM_REFRESH_CACHE,
+		PK_ROLE_ENUM_GET_UPDATES,
+		PK_ROLE_ENUM_SEARCH_NAME,
+		PK_ROLE_ENUM_SEARCH_DETAILS,
+		PK_ROLE_ENUM_INSTALL_PACKAGES,
+		PK_ROLE_ENUM_REMOVE_PACKAGES,
+		-1);
+
+	return roles;
+}
+void
+pk_backend_get_details_thread (PkBackendJob *job, GVariant *params, gpointer user_data)
+{
+	g_debug("pk_backend_get_details_thread started");
+
+	gchar **search = nullptr;
+
+	g_variant_get(params, "(^a&s)", &search);
+
+	auto cards = static_cast<Job*>(pk_backend_job_get_user_data(job));
+	if (!cards->init()) {
+		g_debug("Failed to create cards cache");
+		pk_backend_job_finished (job);
+		return;
+	}
+
+	cards->resolvePackageIds(search);
+	cards->emitDetails();
+	pk_backend_job_finished (job);
+}
+void
+pk_backend_get_details (PkBackend *backend, PkBackendJob *job, gchar **package_ids)
+{
+	pk_backend_job_thread_create(job, pk_backend_get_details_thread, NULL, NULL);
+}
+void
+pk_backend_get_repo_list (PkBackend *backend, PkBackendJob *job, PkBitfield filters)
+{
+	pk_backend_job_set_status (job, PK_STATUS_ENUM_QUERY);
+
+	cards::conf conf("/etc/cards.conf");
+	std::string url = "https://downloads.nutyx.org";
+	std::string depot;
+	std::string collection;
+	for (auto i : conf.dirUrl()) {
+		if ( i.url != "" )
+			url = i.url;
+
+		depot = url + "/" + conf.arch() + "/" + conf.version() + "/" + i.collection;
+		collection = i.collection;
+		pk_backend_job_repo_detail (job, depot.c_str(),
+									collection.c_str(),
+									true);
+	}
+	pk_backend_job_finished (job);
+}
+
+static void
+backend_search_names_thread (PkBackendJob *job, GVariant *params, gpointer user_data)
+{
+	PkBitfield filters;
+	gchar **values;
+	g_variant_get(params, "(t^a&s)", &filters, &values);
+
+	pk_backend_job_set_status(job, PK_STATUS_ENUM_QUERY);
+
+	auto cards = static_cast<Job*>(pk_backend_job_get_user_data(job));
+	if (!cards->init()) {
+		g_debug("Failed to initialize CARDS job");
+		pk_backend_job_finished(job);
+		return;
+	}
+
+	cards->resolvePackageIds(values);
+	cards->emitPackages(filters, PK_INFO_ENUM_UNKNOWN);
+
+	pk_backend_job_finished(job);
+}
+void pk_backend_search_details (PkBackend *backend, PkBackendJob *job, PkBitfield filters, gchar **values)
+{
+	pk_backend_job_thread_create(job, backend_search_names_thread, NULL, NULL);
+}
+
+void pk_backend_search_names (PkBackend *backend, PkBackendJob *job, PkBitfield filters, gchar **values)
+{
+	pk_backend_job_thread_create(job, backend_search_names_thread, NULL, NULL);
+}
+
+void pk_backend_search_files (PkBackend *backend, PkBackendJob *job, PkBitfield filters, gchar **values)
+{
+	pk_backend_job_finished (job);
+}
+
+void pk_backend_search_groups (PkBackend *backend, PkBackendJob *job, PkBitfield filters, gchar **values)
+{
+	pk_backend_job_finished (job);
+}
+
+void pk_backend_download_packages (PkBackend *backend, PkBackendJob *job, gchar **package_ids, const gchar *directory)
+{
+	pk_backend_job_finished (job);
+}
+// vim:set ts=2 :