summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitea/workflows/test.yaml2
-rw-r--r--backend/job.cc50
-rw-r--r--backend/pk-backend-slack.cc300
-rw-r--r--backend/pkgtools.h1
-rw-r--r--backend/utils.cc20
-rw-r--r--backend/utils.h16
6 files changed, 134 insertions, 255 deletions
diff --git a/.gitea/workflows/test.yaml b/.gitea/workflows/test.yaml
index f4cc879..3641e84 100644
--- a/.gitea/workflows/test.yaml
+++ b/.gitea/workflows/test.yaml
@@ -15,7 +15,7 @@ jobs:
shell: ash {0}
run: |
apk -U upgrade
- apk add --no-cache git bash cmake build-base ninja-is-really-ninja boost-dev
+ apk add --no-cache git bash cmake build-base ninja-is-really-ninja boost-dev toml11
- uses: actions/checkout@v4
- name: Build
run: |
diff --git a/backend/job.cc b/backend/job.cc
index 4dcb232..d1c6c81 100644
--- a/backend/job.cc
+++ b/backend/job.cc
@@ -7,6 +7,8 @@
#include <string>
#include "utils.h"
+#include <pk-backend.h>
+#include <pk-backend-job.h>
namespace slack {
@@ -25,34 +27,6 @@ filter_package (PkBitfield filters, bool is_installed)
return false;
}
-static std::string
-generate_query(PkBitfield filters)
-{
- std::string query(
- "SELECT (p1.name || ';' || p1.ver || ';' || p1.arch || ';' || r.repo), p1.summary, "
- "p1.full_name FROM pkglist AS p1 NATURAL JOIN repos AS r "
- "WHERE p1.%s LIKE '%%%q%%' AND p1.ext NOT LIKE 'obsolete' AND p1.repo_order = "
- "(SELECT MIN(p2.repo_order) FROM pkglist AS p2 WHERE p2.name = p1.name GROUP BY p2.name)");
-
- if (pk_bitfield_contain (filters, PK_FILTER_ENUM_APPLICATION))
- {
- query.append(
- " AND EXISTS (SELECT filelist.full_name "
- "FROM filelist "
- "WHERE filelist.full_name = p1.full_name "
- "AND filelist.filename LIKE 'usr/share/applications/%%.desktop')");
- }
- else if (pk_bitfield_contain (filters, PK_FILTER_ENUM_NOT_APPLICATION))
- {
- query.append(
- " AND NOT EXISTS (SELECT filelist.full_name "
- "FROM filelist "
- "WHERE filelist.full_name = p1.full_name "
- "AND filelist.filename LIKE 'usr/share/applications/%%.desktop')");
- }
- return query;
-}
-
}
void
@@ -60,16 +34,16 @@ pk_backend_search_thread (PkBackendJob *job, GVariant *params, void *user_data)
{
auto job_data = reinterpret_cast<slack::JobData *> (pk_backend_job_get_user_data (job));
- pk_backend_job_set_status (job, PK_STATUS_ENUM_QUERY);
- pk_backend_job_set_percentage (job, 0);
-
char **vals;
PkBitfield filters;
g_variant_get (params, "(t^a&s)", &filters, &vals);
char *search = g_strjoinv ("%", vals);
- char *query = sqlite3_mprintf (slack::generate_query(filters).c_str(),
- user_data, search);
+ const char *generate_query = "SELECT (p1.name || ';' || p1.ver || ';' || p1.arch || ';' || r.repo), p1.summary, "
+ "p1.full_name FROM pkglist AS p1 NATURAL JOIN repos AS r "
+ "WHERE p1.%s LIKE '%%%q%%' AND p1.ext NOT LIKE 'obsolete' AND p1.repo_order = "
+ "(SELECT MIN(p2.repo_order) FROM pkglist AS p2 WHERE p2.name = p1.name GROUP BY p2.name)";
+ char *query = sqlite3_mprintf (generate_query, user_data, search);
sqlite3_stmt *stmt;
if ((sqlite3_prepare_v2 (job_data->db, query, -1, &stmt, nullptr) == SQLITE_OK))
@@ -77,17 +51,17 @@ pk_backend_search_thread (PkBackendJob *job, GVariant *params, void *user_data)
/* Now we're ready to output all packages */
while (sqlite3_step (stmt) == SQLITE_ROW)
{
- PkInfoEnum info = slack::is_installed (
+ slack::Info info = slack::is_installed (
reinterpret_cast<const char *> (sqlite3_column_text (stmt, 2)));
- if ((info == PK_INFO_ENUM_INSTALLED || info == PK_INFO_ENUM_UPDATING)
+ if ((info == slack::Info::installed || info == slack::Info::updating)
&& slack::filter_package (filters, true))
{
- pk_backend_job_package (job, PK_INFO_ENUM_INSTALLED,
+ pk_backend_job_package (job, slack::Info::installed,
reinterpret_cast<const char *> (sqlite3_column_text (stmt, 0)),
reinterpret_cast<const char *> (sqlite3_column_text (stmt, 1)));
}
- else if (info == PK_INFO_ENUM_INSTALLING && slack::filter_package (filters, false))
+ else if (info == slack::Info::installing && slack::filter_package (filters, false))
{
pk_backend_job_package(job, PK_INFO_ENUM_AVAILABLE,
reinterpret_cast<const char *> (sqlite3_column_text (stmt, 0)),
@@ -104,6 +78,4 @@ pk_backend_search_thread (PkBackendJob *job, GVariant *params, void *user_data)
sqlite3_free (query);
g_free (search);
-
- pk_backend_job_set_percentage (job, 100);
}
diff --git a/backend/pk-backend-slack.cc b/backend/pk-backend-slack.cc
index 322ee1d..7f618a4 100644
--- a/backend/pk-backend-slack.cc
+++ b/backend/pk-backend-slack.cc
@@ -5,7 +5,6 @@
*/
#include <dirent.h>
#include <glib/gstdio.h>
-#include <packagekit-glib2/pk-debug.h>
#include <cstdint>
#include <stdlib.h>
#include <stdio.h>
@@ -23,7 +22,7 @@ using namespace slack;
static GSList *repos = nullptr;
-void pk_backend_initialize(GKeyFile *conf, PkBackend *backend)
+void pk_backend_initialize(GKeyFile *conf)
{
char *path, **groups;
int ret;
@@ -130,7 +129,7 @@ void pk_backend_initialize(GKeyFile *conf, PkBackend *backend)
}
void
-pk_backend_destroy(PkBackend *backend)
+pk_backend_destroy()
{
g_debug("backend: destroy");
@@ -144,14 +143,11 @@ pk_backend_destroy(PkBackend *backend)
}
void
-pk_backend_start_job(PkBackend *backend, PkBackendJob *job)
+pk_backend_start_job(PkBackendJob *job)
{
char *db_filename = nullptr;
JobData *job_data = g_new0(JobData, 1);
- pk_backend_job_set_allow_cancel(job, true);
- pk_backend_job_set_allow_cancel(job, false);
-
db_filename = g_build_filename(LOCALSTATEDIR, "cache", "PackageKit", "metadata", "metadata.db", nullptr);
if (sqlite3_open(db_filename, &job_data->db) == SQLITE_OK) { /* Some SQLite settings */
sqlite3_exec(job_data->db, "PRAGMA foreign_keys = ON", nullptr, nullptr, nullptr);
@@ -166,14 +162,13 @@ pk_backend_start_job(PkBackend *backend, PkBackendJob *job)
}
pk_backend_job_set_user_data(job, job_data);
- pk_backend_job_set_status(job, PK_STATUS_ENUM_RUNNING);
out:
g_free(db_filename);
}
void
-pk_backend_stop_job(PkBackend *backend, PkBackendJob *job)
+pk_backend_stop_job(PkBackendJob *job)
{
auto job_data = static_cast<JobData *> (pk_backend_job_get_user_data(job));
@@ -188,19 +183,19 @@ pk_backend_stop_job(PkBackend *backend, PkBackendJob *job)
}
void
-pk_backend_search_names(PkBackend *backend, PkBackendJob *job, PkBitfield filters, char **values)
+pk_backend_search_names(PkBackendJob *job, char **values)
{
pk_backend_job_thread_create(job, pk_backend_search_thread, (void *) "name", nullptr);
}
void
-pk_backend_search_details(PkBackend *backend, PkBackendJob *job, PkBitfield filters, char **values)
+pk_backend_search_details(PkBackendJob *job, char **values)
{
pk_backend_job_thread_create(job, pk_backend_search_thread, (void *) "desc", nullptr);
}
void
-pk_backend_search_groups(PkBackend *backend, PkBackendJob *job, PkBitfield filters, char **values)
+pk_backend_search_groups(PkBackendJob *job, char **values)
{
pk_backend_job_thread_create(job, pk_backend_search_thread, (void *) "cat", nullptr);
}
@@ -211,10 +206,9 @@ pk_backend_search_files_thread(PkBackendJob *job, GVariant *params, void *user_d
char **vals, *search;
char *query;
sqlite3_stmt *stmt;
- PkInfoEnum ret;
+ Info ret;
auto job_data = static_cast<JobData *> (pk_backend_job_get_user_data(job));
- pk_backend_job_set_status(job, PK_STATUS_ENUM_QUERY);
pk_backend_job_set_percentage(job, 0);
g_variant_get(params, "(t^a&s)", nullptr, &vals);
@@ -230,7 +224,7 @@ pk_backend_search_files_thread(PkBackendJob *job, GVariant *params, void *user_d
while (sqlite3_step(stmt) == SQLITE_ROW)
{
ret = is_installed((char*) sqlite3_column_text(stmt, 2));
- if ((ret == PK_INFO_ENUM_INSTALLED) || (ret == PK_INFO_ENUM_UPDATING))
+ if ((ret == Info::installed) || (ret == Info::updating))
{
pk_backend_job_package(job, PK_INFO_ENUM_INSTALLED,
(char*) sqlite3_column_text(stmt, 0),
@@ -256,15 +250,15 @@ pk_backend_search_files_thread(PkBackendJob *job, GVariant *params, void *user_d
}
void
-pk_backend_search_files(PkBackend *backend, PkBackendJob *job, PkBitfield filters, char **values)
+pk_backend_search_files(PkBackendJob *job, char **values)
{
pk_backend_job_thread_create(job, pk_backend_search_files_thread, nullptr, nullptr);
}
static void
-pk_backend_get_details_thread(PkBackendJob *job, GVariant *params, void *user_data)
+pk_backend_get_details_thread(PkBackendJob *job, char **pkg_ids, void *user_data)
{
- char **pkg_ids, *homepage = nullptr;
+ char *homepage = nullptr;
char** tokens;
gsize i;
GString *desc;
@@ -274,10 +268,6 @@ pk_backend_get_details_thread(PkBackendJob *job, GVariant *params, void *user_da
sqlite3_stmt *stmt;
auto job_data = static_cast<JobData *> (pk_backend_job_get_user_data(job));
- pk_backend_job_set_status(job, PK_STATUS_ENUM_QUERY);
-
- g_variant_get(params, "(^a&s)", &pkg_ids);
-
if ((sqlite3_prepare_v2(job_data->db,
"SELECT p.desc, p.cat, p.uncompressed FROM pkglist AS p NATURAL JOIN repos AS r "
"WHERE name LIKE @name AND r.repo LIKE @repo AND ext NOT LIKE 'obsolete'",
@@ -347,7 +337,7 @@ out:
}
void
-pk_backend_get_details(PkBackend *backend, PkBackendJob *job, char **package_ids)
+pk_backend_get_details(PkBackendJob *job, char **package_ids)
{
pk_backend_job_thread_create(job, pk_backend_get_details_thread, nullptr, nullptr);
}
@@ -360,7 +350,6 @@ pk_backend_resolve_thread(PkBackendJob *job, GVariant *params, void *user_data)
PkInfoEnum ret;
auto job_data = static_cast<JobData *> (pk_backend_job_get_user_data(job));
- pk_backend_job_set_status(job, PK_STATUS_ENUM_QUERY);
pk_backend_job_set_percentage(job, 0);
g_variant_get(params, "(t^a&s)", nullptr, &vals);
@@ -380,8 +369,7 @@ pk_backend_resolve_thread(PkBackendJob *job, GVariant *params, void *user_data)
while (sqlite3_step(stmt) == SQLITE_ROW)
{
- ret = is_installed((char*) sqlite3_column_text(stmt, 2));
- if ((ret == PK_INFO_ENUM_INSTALLED) || (ret == PK_INFO_ENUM_UPDATING))
+ if ((ret == Info::installed) || (ret == Info::updating))
{
pk_backend_job_package(job, PK_INFO_ENUM_INSTALLED,
(char*) sqlite3_column_text(stmt, 0),
@@ -407,7 +395,7 @@ pk_backend_resolve_thread(PkBackendJob *job, GVariant *params, void *user_data)
}
void
-pk_backend_resolve(PkBackend *backend, PkBackendJob *job, PkBitfield filters, char **packages)
+pk_backend_resolve(PkBackendJob *job, char **packages)
{
pk_backend_job_thread_create(job, pk_backend_resolve_thread, nullptr, nullptr);
}
@@ -421,7 +409,6 @@ pk_backend_download_packages_thread(PkBackendJob *job, GVariant *params, void *u
auto job_data = static_cast<JobData *> (pk_backend_job_get_user_data(job));
g_variant_get(params, "(^a&ss)", &pkg_ids, &dir_path);
- pk_backend_job_set_status (job, PK_STATUS_ENUM_DOWNLOAD);
if ((sqlite3_prepare_v2(job_data->db,
"SELECT summary, (full_name || '.' || ext) FROM pkglist NATURAL JOIN repos "
@@ -468,27 +455,22 @@ out:
}
void
-pk_backend_download_packages(PkBackend *backend, PkBackendJob *job, char **package_ids, const char *directory)
+pk_backend_download_packages(PkBackendJob *job, char **package_ids, const char *directory)
{
pk_backend_job_thread_create(job, pk_backend_download_packages_thread, nullptr, nullptr);
}
static void
-pk_backend_install_packages_thread(PkBackendJob *job, GVariant *params, void *user_data)
+pk_backend_install_packages_thread(PkBackendJob *job, char **pkg_ids, void *user_data)
{
char *dest_dir_name;
- char **pkg_ids;
unsigned i;
gdouble percent_step;
GSList *install_list = nullptr, *l;
sqlite3_stmt *pkglist_stmt = nullptr, *collection_stmt = nullptr;
- PkBitfield transaction_flags = 0;
PkInfoEnum ret;
auto job_data = static_cast<JobData *> (pk_backend_job_get_user_data(job));
- g_variant_get(params, "(t^a&s)", &transaction_flags, &pkg_ids);
- pk_backend_job_set_status(job, PK_STATUS_ENUM_DEP_RESOLVE);
-
if ((sqlite3_prepare_v2(job_data->db,
"SELECT summary, cat FROM pkglist NATURAL JOIN repos "
"WHERE name LIKE @name AND ver LIKE @ver AND arch LIKE @arch AND repo LIKE @repo",
@@ -522,16 +504,7 @@ pk_backend_install_packages_thread(PkBackendJob *job, GVariant *params, void *us
/* If it isn't a collection */
if (g_strcmp0((char *) sqlite3_column_text(pkglist_stmt, 1), "collections"))
{
- if (pk_bitfield_contain(transaction_flags, PK_TRANSACTION_FLAG_ENUM_SIMULATE))
- {
- pk_backend_job_package(job, PK_INFO_ENUM_INSTALLING,
- pkg_ids[i],
- (char *) sqlite3_column_text(pkglist_stmt, 0));
- }
- else
- {
- install_list = g_slist_append(install_list, g_strdup(pkg_ids[i]));
- }
+ install_list = g_slist_append(install_list, g_strdup(pkg_ids[i]));
}
else
{
@@ -541,24 +514,10 @@ pk_backend_install_packages_thread(PkBackendJob *job, GVariant *params, void *us
while (sqlite3_step(collection_stmt) == SQLITE_ROW)
{
ret = is_installed((char*) sqlite3_column_text(collection_stmt, 2));
- if ((ret == PK_INFO_ENUM_INSTALLING) || (ret == PK_INFO_ENUM_UPDATING))
+ if ((ret == Info::installing) || (ret == Info::updating))
{
- if ((pk_bitfield_contain(transaction_flags, PK_TRANSACTION_FLAG_ENUM_SIMULATE)) &&
- !g_strcmp0((char *) sqlite3_column_text(collection_stmt, 3), "obsolete"))
- {
- /* TODO: Don't just skip obsolete packages but remove them */
- }
- else if (pk_bitfield_contain(transaction_flags, PK_TRANSACTION_FLAG_ENUM_SIMULATE))
- {
- pk_backend_job_package(job, ret,
- (char *) sqlite3_column_text(collection_stmt, 0),
- (char *) sqlite3_column_text(collection_stmt, 1));
- }
- else
- {
- install_list = g_slist_append(install_list,
- g_strdup((char *) sqlite3_column_text(collection_stmt, 0)));
- }
+ install_list = g_slist_append(install_list,
+ g_strdup((char *) sqlite3_column_text(collection_stmt, 0)));
}
}
sqlite3_clear_bindings(collection_stmt);
@@ -571,13 +530,12 @@ pk_backend_install_packages_thread(PkBackendJob *job, GVariant *params, void *us
g_strfreev(tokens);
}
- if (install_list && !pk_bitfield_contain(transaction_flags, PK_TRANSACTION_FLAG_ENUM_SIMULATE))
+ if (install_list)
{
/* / 2 means total percentage for installing and for downloading */
percent_step = 100.0 / g_slist_length(install_list) / 2;
/* Download the packages */
- pk_backend_job_set_status(job, PK_STATUS_ENUM_DOWNLOAD);
dest_dir_name = g_build_filename(LOCALSTATEDIR, "cache", "PackageKit", "downloads", nullptr);
for (l = install_list, i = 0; l; l = g_slist_next(l), i++)
{
@@ -598,7 +556,6 @@ pk_backend_install_packages_thread(PkBackendJob *job, GVariant *params, void *us
g_free(dest_dir_name);
/* Install the packages */
- pk_backend_job_set_status(job, PK_STATUS_ENUM_INSTALL);
for (l = install_list; l; l = g_slist_next(l), i++)
{
char **tokens;
@@ -623,76 +580,55 @@ out:
}
void
-pk_backend_install_packages(PkBackend *backend,
- PkBackendJob *job,
- PkBitfield transaction_flags,
- char **package_ids)
+pk_backend_install_packages(PkBackendJob *job, char **package_ids)
{
pk_backend_job_thread_create(job, pk_backend_install_packages_thread, nullptr, nullptr);
}
static void
-pk_backend_remove_packages_thread(PkBackendJob* job, GVariant* params, void *user_data)
+pk_backend_remove_packages_thread(PkBackendJob* job, char **pkg_ids)
{
- char **pkg_ids, *cmd_line;
+ char *cmd_line;
unsigned i;
gdouble percent_step;
- bool allow_deps, autoremove;
GError *err = nullptr;
- PkBitfield transaction_flags = 0;
-
- g_variant_get(params, "(t^a&sbb)", &transaction_flags, &pkg_ids, &allow_deps, &autoremove);
- if (pk_bitfield_contain(transaction_flags, PK_TRANSACTION_FLAG_ENUM_SIMULATE))
- {
- pk_backend_job_set_status(job, PK_STATUS_ENUM_DEP_RESOLVE);
- }
- else
- {
- pk_backend_job_set_status(job, PK_STATUS_ENUM_REMOVE);
+ /* Add percent_step percents per removed package */
+ percent_step = 100.0 / g_strv_length(pkg_ids);
+ for (i = 0; pkg_ids[i]; i++)
+ {
+ char **tokens;
- /* Add percent_step percents per removed package */
- percent_step = 100.0 / g_strv_length(pkg_ids);
- for (i = 0; pkg_ids[i]; i++)
- {
- char **tokens;
+ pk_backend_job_set_percentage(job, percent_step * i);
+ tokens = pk_package_id_split(pkg_ids[i]);
+ cmd_line = g_strconcat("/sbin/removepkg ", tokens[PK_PACKAGE_ID_NAME], nullptr);
- pk_backend_job_set_percentage(job, percent_step * i);
- tokens = pk_package_id_split(pkg_ids[i]);
- cmd_line = g_strconcat("/sbin/removepkg ", tokens[PK_PACKAGE_ID_NAME], nullptr);
-
- /* Pkgtools return always 0 */
- g_spawn_command_line_sync(cmd_line, nullptr, nullptr, nullptr, &err);
+ /* Pkgtools return always 0 */
+ g_spawn_command_line_sync(cmd_line, nullptr, nullptr, nullptr, &err);
- g_free(cmd_line);
- g_strfreev(tokens);
+ g_free(cmd_line);
+ g_strfreev(tokens);
- if (err)
- {
- pk_backend_job_error_code(job, PK_ERROR_ENUM_PACKAGE_FAILED_TO_REMOVE, "%s", err->message);
- g_error_free(err);
+ if (err)
+ {
+ pk_backend_job_error_code(job, PK_ERROR_ENUM_PACKAGE_FAILED_TO_REMOVE, "%s", err->message);
+ g_error_free(err);
- return;
- }
+ return;
+ }
- pk_backend_job_set_percentage(job, 100);
- }
- }
+ pk_backend_job_set_percentage(job, 100);
+ }
}
void
-pk_backend_remove_packages(PkBackend *backend,
- PkBackendJob *job,
- PkBitfield transaction_flags,
- char **package_ids,
- bool allow_deps,
- bool autoremove)
+pk_backend_remove_packages(PkBackendJob *job, char **package_ids)
{
pk_backend_job_thread_create(job, pk_backend_remove_packages_thread, nullptr, nullptr);
}
static void
-pk_backend_get_updates_thread(PkBackendJob *job, GVariant *params, void *user_data)
+pk_backend_get_updates_thread(PkBackendJob *job, void *user_data)
{
char *pkg_id, *full_name, *desc;
const char *pkg_metadata_filename;
@@ -703,8 +639,6 @@ pk_backend_get_updates_thread(PkBackendJob *job, GVariant *params, void *user_da
sqlite3_stmt *stmt;
auto job_data = static_cast<JobData *> (pk_backend_job_get_user_data(job));
- pk_backend_job_set_status(job, PK_STATUS_ENUM_QUERY);
-
if ((sqlite3_prepare_v2(job_data->db,
"SELECT p1.full_name, p1.name, p1.ver, p1.arch, r.repo, p1.summary, p1.ext "
"FROM pkglist AS p1 NATURAL JOIN repos AS r "
@@ -796,88 +730,76 @@ out:
}
void
-pk_backend_get_updates(PkBackend *backend, PkBackendJob *job, PkBitfield filters)
+pk_backend_get_updates(PkBackendJob *job)
{
pk_backend_job_thread_create(job, pk_backend_get_updates_thread, nullptr, nullptr);
}
static void
-pk_backend_update_packages_thread(PkBackendJob *job, GVariant *params, void *user_data)
+pk_backend_update_packages_thread(PkBackendJob *job, char **pkg_ids, void *user_data)
{
- char *dest_dir_name, *cmd_line, **pkg_ids;
+ char *dest_dir_name, *cmd_line;
unsigned i;
- PkBitfield transaction_flags = 0;
-
- g_variant_get(params, "(t^a&s)", &transaction_flags, &pkg_ids);
-
- if (!pk_bitfield_contain(transaction_flags, PK_TRANSACTION_FLAG_ENUM_SIMULATE)) {
- pk_backend_job_set_status(job, PK_STATUS_ENUM_DOWNLOAD);
-
- /* Download the packages */
- dest_dir_name = g_build_filename(LOCALSTATEDIR, "cache", "PackageKit", "downloads", nullptr);
- for (i = 0; pkg_ids[i]; i++)
- {
- char **tokens = pk_package_id_split(pkg_ids[i]);
-
- if (g_strcmp0(tokens[PK_PACKAGE_ID_DATA], "obsolete"))
- {
- GSList *repo = g_slist_find_custom(repos, tokens[PK_PACKAGE_ID_DATA], cmp_repo);
-
- if (repo)
- {
- static_cast<Pkgtools *> (repo->data)->download (job,
- dest_dir_name, tokens[PK_PACKAGE_ID_NAME]);
- }
- }
-
- g_strfreev(tokens);
- }
- g_free(dest_dir_name);
-
- /* Install the packages */
- pk_backend_job_set_status(job, PK_STATUS_ENUM_UPDATE);
- for (i = 0; pkg_ids[i]; i++)
- {
- char **tokens = pk_package_id_split(pkg_ids[i]);
- if (g_strcmp0(tokens[PK_PACKAGE_ID_DATA], "obsolete"))
- {
- GSList *repo = g_slist_find_custom(repos, tokens[PK_PACKAGE_ID_DATA], cmp_repo);
-
- if (repo)
- {
- static_cast<Pkgtools *> (repo->data)->install (job,
- tokens[PK_PACKAGE_ID_NAME]);
- }
- }
- else
- {
- /* Remove obsolete package
- * TODO: Removing should be an independent operation (not during installing updates) */
- cmd_line = g_strconcat("/sbin/removepkg ", tokens[PK_PACKAGE_ID_NAME], nullptr);
- g_spawn_command_line_sync(cmd_line, nullptr, nullptr, nullptr, nullptr);
- g_free(cmd_line);
- }
- g_strfreev(tokens);
- }
+ /* Download the packages */
+ dest_dir_name = g_build_filename(LOCALSTATEDIR, "cache", "PackageKit", "downloads", nullptr);
+ for (i = 0; pkg_ids[i]; i++)
+ {
+ char **tokens = pk_package_id_split(pkg_ids[i]);
+
+ if (g_strcmp0(tokens[PK_PACKAGE_ID_DATA], "obsolete"))
+ {
+ GSList *repo = g_slist_find_custom(repos, tokens[PK_PACKAGE_ID_DATA], cmp_repo);
+
+ if (repo)
+ {
+ static_cast<Pkgtools *> (repo->data)->download (job,
+ dest_dir_name, tokens[PK_PACKAGE_ID_NAME]);
+ }
+ }
+
+ g_strfreev(tokens);
+ }
+ g_free(dest_dir_name);
+
+ /* Install the packages */
+ for (i = 0; pkg_ids[i]; i++)
+ {
+ char **tokens = pk_package_id_split(pkg_ids[i]);
+
+ if (g_strcmp0(tokens[PK_PACKAGE_ID_DATA], "obsolete"))
+ {
+ GSList *repo = g_slist_find_custom(repos, tokens[PK_PACKAGE_ID_DATA], cmp_repo);
+
+ if (repo)
+ {
+ static_cast<Pkgtools *> (repo->data)->install (job,
+ tokens[PK_PACKAGE_ID_NAME]);
+ }
+ }
+ else
+ {
+ /* Remove obsolete package
+ * TODO: Removing should be an independent operation (not during installing updates) */
+ cmd_line = g_strconcat("/sbin/removepkg ", tokens[PK_PACKAGE_ID_NAME], nullptr);
+ g_spawn_command_line_sync(cmd_line, nullptr, nullptr, nullptr, nullptr);
+ g_free(cmd_line);
+ }
+ g_strfreev(tokens);
}
}
void
-pk_backend_update_packages(PkBackend *backend,
- PkBackendJob *job,
- PkBitfield transaction_flags,
- char **package_ids)
+pk_backend_update_packages(PkBackendJob *job, char **package_ids)
{
pk_backend_job_thread_create(job, pk_backend_update_packages_thread, nullptr, nullptr);
}
static void
-pk_backend_refresh_cache_thread(PkBackendJob *job, GVariant *params, void *user_data)
+pk_backend_refresh_cache_thread(PkBackendJob *job, bool force, void *user_data)
{
char *tmp_dir_name, *db_err, *path = nullptr;
int ret;
- bool force;
GSList *file_list = nullptr;
GFile *db_file = nullptr;
GFileInfo *file_info = nullptr;
@@ -885,8 +807,6 @@ pk_backend_refresh_cache_thread(PkBackendJob *job, GVariant *params, void *user_
sqlite3_stmt *stmt = nullptr;
auto job_data = static_cast<JobData *> (pk_backend_job_get_user_data(job));
- pk_backend_job_set_status(job, PK_STATUS_ENUM_DOWNLOAD_CHANGELOG);
-
/* Create temporary directory */
tmp_dir_name = g_dir_make_tmp("PackageKit.XXXXXX", &err);
if (!tmp_dir_name)
@@ -896,8 +816,6 @@ pk_backend_refresh_cache_thread(PkBackendJob *job, GVariant *params, void *user_
return;
}
- g_variant_get(params, "(b)", &force);
-
/* Force the complete cache refresh if the read configuration file is newer than the metadata cache */
if (!force)
{
@@ -947,8 +865,6 @@ pk_backend_refresh_cache_thread(PkBackendJob *job, GVariant *params, void *user_
}
/* Download repository */
- pk_backend_job_set_status(job, PK_STATUS_ENUM_DOWNLOAD_REPOSITORY);
-
for (GSList *l = file_list; l; l = g_slist_next(l))
{
get_file(&job_data->curl, static_cast<char **> (l->data)[0],
@@ -957,8 +873,6 @@ pk_backend_refresh_cache_thread(PkBackendJob *job, GVariant *params, void *user_
g_slist_free_full(file_list, (GDestroyNotify)g_strfreev);
/* Refresh cache */
- pk_backend_job_set_status(job, PK_STATUS_ENUM_REFRESH_CACHE);
-
for (GSList *l = repos; l; l = g_slist_next(l))
{
static_cast<Pkgtools *> (l->data)->generate_cache (job, tmp_dir_name);
@@ -982,20 +896,15 @@ out:
}
void
-pk_backend_refresh_cache(PkBackend *backend, PkBackendJob *job, bool force)
+pk_backend_refresh_cache(PkBackendJob *job, bool force)
{
pk_backend_job_thread_create(job, pk_backend_refresh_cache_thread, nullptr, nullptr);
}
static void
-pk_backend_get_update_detail_thread(PkBackendJob *job, GVariant *params, void *user_data)
+pk_backend_get_update_detail_thread(PkBackendJob *job, char **pkg_ids, void *user_data)
{
unsigned i;
- char **pkg_ids;
-
- pk_backend_job_set_status(job, PK_STATUS_ENUM_QUERY);
-
- g_variant_get(params, "(^a&s)", &pkg_ids);
for (i = 0; pkg_ids[i] != nullptr; i++)
{
@@ -1016,16 +925,7 @@ pk_backend_get_update_detail_thread(PkBackendJob *job, GVariant *params, void *u
}
void
-pk_backend_get_update_detail(PkBackend *backend, PkBackendJob *job, char **package_ids)
+pk_backend_get_update_detail(PkBackendJob *job, char **package_ids)
{
pk_backend_job_thread_create(job, pk_backend_get_update_detail_thread, nullptr, nullptr);
}
-
-PkBitfield
-pk_backend_get_filters (PkBackend *backend)
-{
- return pk_bitfield_from_enums (
- PK_FILTER_ENUM_INSTALLED, PK_FILTER_ENUM_NOT_INSTALLED,
- PK_FILTER_ENUM_APPLICATION, PK_FILTER_ENUM_NOT_APPLICATION,
- -1);
-}
diff --git a/backend/pkgtools.h b/backend/pkgtools.h
index b590232..e32e2c1 100644
--- a/backend/pkgtools.h
+++ b/backend/pkgtools.h
@@ -7,7 +7,6 @@
#include <cstdint>
#include <glib-object.h>
-#include <pk-backend.h>
#include "utils.h"
namespace slack {
diff --git a/backend/utils.cc b/backend/utils.cc
index 30e257a..ccecef0 100644
--- a/backend/utils.cc
+++ b/backend/utils.cc
@@ -131,22 +131,20 @@ split_package_name (const char *pkg_filename)
* Params:
* pkg_fullname = Package name should be looked for.
*
- * Returns: PK_INFO_ENUM_INSTALLING if pkg_fullname is already installed,
- * PK_INFO_ENUM_UPDATING if an elder version of pkg_fullname is
- * installed, PK_INFO_ENUM_UNKNOWN if pkg_fullname is malformed.
+ * Returns: Package installation information.
**/
-PkInfoEnum
+Info
is_installed (const char *pkg_fullname)
{
GFileEnumerator *pkg_metadata_enumerator;
GFileInfo *pkg_metadata_file_info;
GFile *pkg_metadata_dir;
- PkInfoEnum ret = PK_INFO_ENUM_INSTALLING;
+ Info ret = Info::installing;
const char *it;
std::uint8_t dashes = 0;
ptrdiff_t pkg_name;
- g_return_val_if_fail(pkg_fullname != nullptr, PK_INFO_ENUM_UNKNOWN);
+ g_return_val_if_fail(pkg_fullname != nullptr, Info::unknown);
// We want to find the package name without version for the package we're
// looking for.
@@ -165,7 +163,7 @@ is_installed (const char *pkg_fullname)
}
if (dashes < 2)
{
- return PK_INFO_ENUM_UNKNOWN;
+ return Info::unknown;
}
pkg_name = it - pkg_fullname;
@@ -179,7 +177,7 @@ is_installed (const char *pkg_fullname)
nullptr)))
{
g_object_unref(pkg_metadata_dir);
- return PK_INFO_ENUM_UNKNOWN;
+ return Info::unknown;
}
while ((pkg_metadata_file_info = g_file_enumerator_next_file(pkg_metadata_enumerator, nullptr, nullptr)))
@@ -189,7 +187,7 @@ is_installed (const char *pkg_fullname)
if (strcmp(dir, pkg_fullname) == 0)
{
- ret = PK_INFO_ENUM_INSTALLED;
+ ret = Info::installed;
}
else
{
@@ -206,13 +204,13 @@ is_installed (const char *pkg_fullname)
}
if (pkg_name == (it - dir) && strncmp(pkg_fullname, dir, pkg_name) == 0)
{
- ret = PK_INFO_ENUM_UPDATING;
+ ret = Info::updating;
}
}
g_object_unref(pkg_metadata_file_info);
- if (ret != PK_INFO_ENUM_INSTALLING) /* If installed */
+ if (ret != Info::installing) /* If installed */
{
break;
}
diff --git a/backend/utils.h b/backend/utils.h
index 88e9073..ea3635b 100644
--- a/backend/utils.h
+++ b/backend/utils.h
@@ -6,8 +6,6 @@
#pragma once
#include <curl/curl.h>
-#include <pk-backend.h>
-#include <pk-backend-job.h>
namespace slack {
@@ -17,11 +15,23 @@ struct JobData
CURL *curl;
};
+enum class Info
+{
+ // Error.
+ unknown,
+ // Installed in the same version.
+ installed,
+ // A different version is installed.
+ updating
+ // Available, but not installed.
+ installing,
+};
+
CURLcode get_file (CURL **curl, char *source_url, char *dest);
char **split_package_name (const char *pkg_filename);
-PkInfoEnum is_installed (const char *pkg_fullname);
+Info is_installed (const char *pkg_fullname);
extern "C" {