From: Marcin Banasiak Date: Fri, 28 Mar 2008 19:11:41 +0000 (+0000) Subject: - applied upstream X-Git-Tag: auto/th/PackageKit-0_1_11-1~1 X-Git-Url: http://git.pld-linux.org/?a=commitdiff_plain;h=8e396814c278445917320cd36fa35378cd3490da;p=packages%2FPackageKit.git - applied upstream Changed files: PackageKit-poldek.patch -> 1.3 --- diff --git a/PackageKit-poldek.patch b/PackageKit-poldek.patch deleted file mode 100644 index 1c56ee3..0000000 --- a/PackageKit-poldek.patch +++ /dev/null @@ -1,1933 +0,0 @@ -diff -urN PackageKit-0.1.8/backends/Makefile.am PackageKit-0.1.8.new/backends/Makefile.am ---- PackageKit-0.1.8/backends/Makefile.am 2008-02-17 23:47:49.000000000 +0100 -+++ PackageKit-0.1.8.new/backends/Makefile.am 2008-02-29 14:33:49.000000000 +0100 -@@ -44,6 +44,10 @@ - SUBDIRS += pisi - endif - -+if BACKEND_TYPE_POLDEK -+SUBDIRS += poldek -+endif -+ - if BACKEND_TYPE_ZYPP - SUBDIRS += zypp - endif -diff -urN PackageKit-0.1.8/backends/poldek/Makefile.am PackageKit-0.1.8.new/backends/poldek/Makefile.am ---- PackageKit-0.1.8/backends/poldek/Makefile.am 1970-01-01 01:00:00.000000000 +0100 -+++ PackageKit-0.1.8.new/backends/poldek/Makefile.am 2008-02-29 14:33:49.000000000 +0100 -@@ -0,0 +1,6 @@ -+plugindir = $(PK_PLUGIN_DIR) -+plugin_LTLIBRARIES = libpk_backend_poldek.la -+libpk_backend_poldek_la_SOURCES = pk-backend-poldek.c -+libpk_backend_poldek_la_LIBADD = $(PK_PLUGIN_LIBS) $(POLDEK_LIBS) -+libpk_backend_poldek_la_LDFLAGS = -module -avoid-version -+libpk_backend_poldek_la_CFLAGS = $(PK_PLUGIN_CFLAGS) $(POLDEK_CFLAGS) -\ Brak znaku nowej linii na końcu pliku -diff -urN PackageKit-0.1.8/backends/poldek/pk-backend-poldek.c PackageKit-0.1.8.new/backends/poldek/pk-backend-poldek.c ---- PackageKit-0.1.8/backends/poldek/pk-backend-poldek.c 1970-01-01 01:00:00.000000000 +0100 -+++ PackageKit-0.1.8.new/backends/poldek/pk-backend-poldek.c 2008-02-29 14:24:32.000000000 +0100 -@@ -0,0 +1,1846 @@ -+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- -+ * -+ * Copyright (C) 2008 Marcin Banasiak -+ * -+ * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -+ */ -+ -+#include -+#include -+#include -+ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+static gchar* poldek_pkg_evr (const struct pkg *pkg); -+static void poldek_backend_package (const struct pkg *pkg, gint status); -+static long do_get_bytes_to_download (const struct poldek_ts *ts, const gchar *mark); -+ -+enum { -+ PROGRESS_ENUM_INSTALL, -+ PROGRESS_ENUM_REFRESH_CACHE -+}; -+ -+enum { -+ SEARCH_ENUM_NAME, -+ SEARCH_ENUM_GROUP, -+ SEARCH_ENUM_DETAILS, -+ SEARCH_ENUM_FILE -+}; -+ -+typedef struct { -+ gboolean installed; -+ gboolean notinstalled; -+ gboolean devel; -+ gboolean notdevel; -+ gboolean gui; -+ gboolean notgui; -+} FilterData; -+ -+typedef struct { -+ gint mode; -+ FilterData *fd; -+ gchar *search; -+} SearchData; -+ -+/* used by get_depends and get_requires */ -+typedef struct { -+ gchar *package_id; -+ gboolean recursive; -+} DepsData; -+ -+typedef struct { -+ gchar *package_id; -+ gboolean allow_deps; -+} RemoveData; -+ -+typedef struct { -+ gint mode; -+ gint step; // current step -+ -+ /* Numer of sources to update. It's used only by refresh cache, -+ * as each source can have multiple files to download. I don't -+ * know how to get numer of files which will be downloaded. */ -+ gint nsources; -+ -+ long bytesget; -+ long bytesdownload; -+ -+ gint percentage; -+ gint subpercentage; -+} PercentageData; -+ -+/* used by install / update */ -+typedef struct { -+ PercentageData *pd; -+ gchar *package_id; -+} InstallData; -+ -+typedef struct { -+ InstallData *idata; -+ RemoveData *rdata; -+} TsConfirmData; -+ -+/* global variables */ -+static PkBackendThread *thread; -+static PkNetwork *network; -+ -+static gint verbose = 1; -+static gint ref = 0; -+ -+static struct poldek_ctx *ctx = NULL; -+static struct poclidek_ctx *cctx = NULL; -+ -+/** -+ * poldek_get_bytes_to_download: -+ * -+ * Returns: bytes to download -+ */ -+static long -+poldek_get_bytes_to_download (const struct poldek_ts *ts) -+{ -+ long bytes = 0; -+ -+ bytes += do_get_bytes_to_download (ts, "I"); -+ bytes += do_get_bytes_to_download (ts, "D"); -+ -+ return bytes; -+} -+ -+static long -+do_get_bytes_to_download (const struct poldek_ts *ts, const gchar *mark) -+{ -+ tn_array *pkgs = NULL; -+ gint i; -+ long bytes = 0; -+ -+ pkgs = poldek_ts_get_summary (ts, mark); -+ -+ if (pkgs) { -+ for (i = 0; i < n_array_size (pkgs); i++) { -+ struct pkg *pkg = n_array_nth (pkgs, i); -+ gchar path[1024]; -+ -+ if (pkg->pkgdir && (vf_url_type (pkg->pkgdir->path) & VFURL_REMOTE)) { -+ if (pkg_localpath (pkg, path, sizeof(path), ts->cachedir)) { -+ if (access(path, R_OK) != 0) { -+ bytes += pkg->fsize; -+ } else { -+ if (!pm_verify_signature(ts->pmctx, path, PKGVERIFY_MD)) { -+ bytes += pkg->fsize; -+ } -+ } -+ } -+ } -+ } -+ n_array_free (pkgs); -+ } -+ -+ return bytes; -+} -+ -+ -+ -+/** -+ * FIXME: better refresh_cache progress -+ * VF_PROGRESS -+ */ -+static void* -+poldek_vf_progress_new (void *data, const gchar *label) -+{ -+ PercentageData *bar = (PercentageData*) data; -+ if (bar->mode == PROGRESS_ENUM_INSTALL) { -+ gchar *filename = g_path_get_basename (label), *pkgname, *command; -+ struct poclidek_rcmd *rcmd; -+ tn_array *pkgs = NULL; -+ struct pkg *pkg = NULL; -+ -+ pkgname = g_strndup (filename, (sizeof(gchar)*strlen(filename)-4)); -+ -+ command = g_strdup_printf ("cd /all-avail; ls -q %s", pkgname); -+ -+ rcmd = poclidek_rcmd_new (cctx, NULL); -+ poclidek_rcmd_execline (rcmd, command); -+ pkgs = poclidek_rcmd_get_packages (rcmd); -+ -+ if (pkgs) { -+ pkg = n_array_nth (pkgs, 0); -+ -+ poldek_backend_package (pkg, PK_INFO_ENUM_DOWNLOADING); -+ } -+ -+ poclidek_rcmd_free (rcmd); -+ -+ g_free (pkgname); -+ g_free (filename); -+ } -+ return bar; -+} -+ -+static void -+poldek_vf_progress (void *bar, long total, long amount) -+{ -+ PercentageData *pd = (PercentageData*) bar; -+ gint tmp_subpercentage; -+ PkBackend *backend; -+ -+ backend = pk_backend_thread_get_backend (thread); -+ -+ tmp_subpercentage = (gint)(((float)amount / (float)total) * 100); -+ -+ if (pd->mode == PROGRESS_ENUM_REFRESH_CACHE) { -+ if (tmp_subpercentage >= pd->subpercentage) { -+ if (pd->step - 1 == 0) -+ pd->percentage = 1; -+ else -+ pd->percentage = (gint)(((pd->step - 1) / pd->nsources) * 100); -+ -+ pd->subpercentage = tmp_subpercentage; -+ } else { -+ if (pd->step == pd->nsources) { -+ pd->percentage = 100; -+ } else { -+ pd->percentage = (gint)(((float)pd->step / (float)pd->nsources) * 100); -+ } -+ -+ pd->subpercentage = 100; -+ } -+ } else { -+ if (tmp_subpercentage >= pd->subpercentage) { -+ pd->percentage = (gint)(((float)(pd->bytesget + amount) / (float)pd->bytesdownload) * 100); -+ pd->subpercentage = tmp_subpercentage; -+ } else { -+ pd->bytesget += total; -+ pd->subpercentage = 100; -+ } -+ } -+ pk_backend_set_percentage (backend, pd->percentage); -+ pk_backend_set_sub_percentage (backend, pd->subpercentage); -+} -+ -+static void -+poldek_vf_progress_reset (void *bar) -+{ -+ PercentageData *pd = (PercentageData*) bar; -+ -+ pd->subpercentage = 0; -+} -+ -+/** -+ * ts_confirm: -+ * Returns Yes - 1 -+ * No - 0 -+ */ -+static int -+ts_confirm (void *data, struct poldek_ts *ts) -+{ -+ tn_array *ipkgs = NULL, *dpkgs = NULL, *rpkgs = NULL, *upkgs = NULL; -+ TsConfirmData *tsd = (TsConfirmData *)data; -+ gint i = 0, j = 0, result = 1; -+ -+ ipkgs = poldek_ts_get_summary (ts, "I"); -+ dpkgs = poldek_ts_get_summary (ts, "D"); -+ rpkgs = poldek_ts_get_summary (ts, "R"); -+ -+ switch (poldek_ts_get_type (ts)) { -+ case POLDEK_TS_TYPE_INSTALL: -+ upkgs = n_array_new (2, NULL, NULL); -+ -+ tsd->idata->pd->step = 0; -+ tsd->idata->pd->bytesdownload = poldek_get_bytes_to_download (ts); -+ -+ if (rpkgs) { -+ for (i = 0; i < n_array_size (ipkgs); i++) { -+ struct pkg *ipkg = n_array_nth (ipkgs, i); -+ -+ for (j = 0; j < n_array_size (rpkgs); j++) { -+ struct pkg *rpkg = n_array_nth (rpkgs, j); -+ -+ if (pkg_cmp_name (ipkg, rpkg) == 0) { -+ n_array_push (upkgs, pkg_link (rpkg)); -+ break; -+ } -+ } -+ -+ } -+ -+ if (dpkgs) { -+ for (i = 0; i < n_array_size (dpkgs); i++) { -+ struct pkg *dpkg = n_array_nth (dpkgs, i); -+ -+ for (j = 0; j < n_array_size (rpkgs); j++) { -+ struct pkg *rpkg = n_array_nth (rpkgs, j); -+ -+ if (pkg_cmp_name (dpkg, rpkg) == 0) { -+ n_array_push (upkgs, pkg_link (rpkg)); -+ break; -+ } -+ } -+ } -+ } -+ } -+ -+ if (rpkgs) { -+ for (i = 0; i < n_array_size (rpkgs); i++) { -+ struct pkg *rpkg = n_array_nth (rpkgs, i); -+ gboolean canprint = TRUE; -+ -+ for (j = 0; j < n_array_size (upkgs); j++) { -+ struct pkg *upkg = n_array_nth (upkgs, j); -+ -+ if (pkg_cmp_name (upkg, rpkg) == 0) { -+ canprint = FALSE; -+ break; -+ } -+ } -+ if (canprint) -+ poldek_backend_package (rpkg, PK_INFO_ENUM_REMOVING); -+ } -+ } -+ -+ if (dpkgs) { -+ for (i = 0; i < n_array_size (dpkgs); i++) { -+ struct pkg *dpkg = n_array_nth (dpkgs, i); -+ gboolean canprint = TRUE; -+ -+ for (j = 0; j < n_array_size (upkgs); j++) { -+ struct pkg *upkg = n_array_nth (upkgs, j); -+ -+ if (pkg_cmp_name (upkg, dpkg) == 0) { -+ canprint = FALSE; -+ break; -+ } -+ } -+ if (canprint) -+ poldek_backend_package (dpkg, PK_INFO_ENUM_INSTALLING); -+ } -+ } -+ -+ if (ipkgs) { -+ for (i = 0; i < n_array_size (ipkgs); i++) { -+ struct pkg *ipkg = n_array_nth (ipkgs, i); -+ gboolean canprint = TRUE; -+ -+ for (j = 0; j < n_array_size (upkgs); j++) { -+ struct pkg *upkg = n_array_nth (upkgs, j); -+ -+ if (pkg_cmp_name (upkg, ipkg) == 0) { -+ canprint = FALSE; -+ break; -+ } -+ } -+ if (canprint) -+ poldek_backend_package (ipkg, PK_INFO_ENUM_INSTALLING); -+ } -+ } -+ -+ for (i = 0; i < n_array_size (upkgs); i++) { -+ struct pkg *upkg = n_array_nth (upkgs, i); -+ -+ poldek_backend_package (upkg, PK_INFO_ENUM_UPDATING); -+ } -+ -+ n_array_free (upkgs); -+ -+ break; -+ case POLDEK_TS_TYPE_UNINSTALL: -+ if (dpkgs) { -+ if ((tsd->rdata->allow_deps == FALSE) && (n_array_size (dpkgs) > 0)) { -+ result = 0; -+ break; -+ } -+ -+ for (i = 0; i < n_array_size (dpkgs); i++) { -+ struct pkg *pkg = n_array_nth (dpkgs, i); -+ -+ poldek_backend_package (pkg, PK_INFO_ENUM_REMOVING); -+ } -+ } -+ -+ if (rpkgs) { -+ for (i = 0; i < n_array_size (rpkgs); i++) { -+ struct pkg *pkg = n_array_nth (rpkgs, i); -+ -+ poldek_backend_package (pkg, PK_INFO_ENUM_REMOVING); -+ } -+ } -+ -+ break; -+ } -+ -+ if (ipkgs) -+ n_array_free (ipkgs); -+ -+ if (dpkgs) -+ n_array_free (dpkgs); -+ -+ if (rpkgs) -+ n_array_free (rpkgs); -+ -+ return result; -+} -+ -+/** -+ * setup_vf_progress: -+ */ -+static void -+setup_vf_progress (struct vf_progress *vf_progress, PercentageData *pd) -+{ -+ vf_progress->data = pd; -+ vf_progress->new = poldek_vf_progress_new; -+ vf_progress->progress = poldek_vf_progress; -+ vf_progress->reset = poldek_vf_progress_reset; -+ vf_progress->free = NULL; -+ -+ vfile_configure (VFILE_CONF_VERBOSE, &verbose); -+ poldek_configure (ctx, POLDEK_CONF_VFILEPROGRESS, vf_progress); -+} -+ -+static gint -+pkg_cmp_name_evr_rev_recno (const struct pkg *p1, const struct pkg *p2) { -+ register gint rc; -+ -+ if ((rc = pkg_cmp_name_evr_rev (p1, p2)) == 0) -+ rc = -(p1->recno - p2->recno); -+ -+ return rc; -+} -+ -+/** -+ * poldek_pkg_evr: -+ */ -+static gchar* -+poldek_pkg_evr (const struct pkg *pkg) -+{ -+ if (pkg->epoch == 0) -+ return g_strdup_printf ("%s-%s", pkg->ver, pkg->rel); -+ else -+ return g_strdup_printf ("%d:%s-%s", pkg->epoch, pkg->ver, pkg->rel); -+} -+ -+static gchar* -+poldek_get_vr_from_package_id_evr (const gchar *evr) -+{ -+ gchar **sections, *result; -+ -+ sections = g_strsplit (evr, ":", 2); -+ -+ if (sections[1]) -+ result = g_strdup (sections[1]); -+ else -+ result = g_strdup (evr); -+ -+ g_strfreev (sections); -+ -+ return result; -+} -+ -+/** -+ * poldek_get_nvra_from_package_id: -+ */ -+static gchar* -+poldek_get_nvra_from_package_id (const gchar* package_id) -+{ -+ PkPackageId *pi; -+ gchar *vr, *result; -+ -+ pi = pk_package_id_new_from_string (package_id); -+ vr = poldek_get_vr_from_package_id_evr (pi->version); -+ -+ result = g_strdup_printf ("%s-%s.%s", pi->name, vr, pi->arch); -+ -+ g_free (vr); -+ pk_package_id_free (pi); -+ -+ return result; -+} -+ -+/** -+ * poldek_get_installed_packages: -+ */ -+static tn_array* -+poldek_get_installed_packages (void) -+{ -+ struct poclidek_rcmd *rcmd = NULL; -+ tn_array *arr = NULL; -+ -+ rcmd = poclidek_rcmd_new (cctx, NULL); -+ poclidek_rcmd_execline (rcmd, "cd /installed; ls -q *"); -+ -+ arr = poclidek_rcmd_get_packages (rcmd); -+ -+ poclidek_rcmd_free (rcmd); -+ -+ return arr; -+} -+ -+/** -+ * do_requires: -+ */ -+static void -+do_requires (tn_array *installed, tn_array *available, tn_array *requires, struct pkg *pkg, gboolean recursive) -+{ -+ gint i; -+ -+ for (i = 0; i < n_array_size (installed); i++) { -+ struct pkg *ipkg = n_array_nth (installed, i); -+ int j; -+ -+ /* skip when there is no reqs */ -+ if (!ipkg->reqs) -+ continue; -+ -+ for (j = 0; j < n_array_size (ipkg->reqs); j++) { -+ struct capreq *req = n_array_nth (ipkg->reqs, j); -+ -+ if (capreq_is_rpmlib (req)) -+ continue; -+ else if (capreq_is_file (req)) -+ continue; -+ -+ if (pkg_satisfies_req (pkg, req, 1)) { -+ n_array_push (requires, pkg_link (ipkg)); -+ break; -+ } -+ } -+ } -+ for (i = 0; i < n_array_size (available); i++) { -+ struct pkg *apkg = n_array_nth (available, i); -+ int j; -+ -+ if (!apkg->reqs) -+ continue; -+ -+ for (j = 0; j < n_array_size (apkg->reqs); j++) { -+ struct capreq *req = n_array_nth (apkg->reqs, j); -+ -+ if (capreq_is_rpmlib (req)) -+ continue; -+ else if (capreq_is_file (req)) -+ continue; -+ -+ if (pkg_satisfies_req (pkg, req, 1)) { -+ int k, res = -1; -+ for (k = 0; k < n_array_size (requires); k++) { -+ struct pkg *p = n_array_nth (requires, k); -+ -+ if (pkg_cmp_name_evr_rev (apkg, p) == 0) { -+ res = k; -+ break; -+ } -+ } -+ -+ if (res == -1) { -+ n_array_push (requires, pkg_link (apkg)); -+ } -+ break; -+ } -+ } -+ } -+} -+ -+/** -+ * do_depends: -+ */ -+static void -+do_depends (tn_array *installed, tn_array *available, tn_array *depends, struct pkg *pkg, gboolean recursive) -+{ -+ tn_array *reqs = pkg->reqs; -+ tn_array *tmp = NULL; -+ gint i; -+ -+ tmp = n_array_new (2, NULL, NULL); -+ -+ /* nothing to do */ -+ if (!reqs || (reqs && n_array_size (reqs) < 1)) -+ return; -+ -+ for (i = 0; i < n_array_size (reqs); i++) { -+ struct capreq *req = n_array_nth (reqs, i); -+ gboolean found = FALSE; -+ gint j; -+ -+ /* skip it */ -+ if (capreq_is_rpmlib (req)) -+ continue; -+ -+ /* FIXME: pkg_satisfies_req() doesn't find file capreq's -+ * in installed packages, so skip them */ -+ if (capreq_is_file (req)) -+ continue; -+ -+ /* self match */ -+ if (pkg_satisfies_req (pkg, req, 1)) -+ continue; -+ -+ /* Maybe this capreq is satisfied by package already added to -+ * depends array. */ -+ for (j = 0; j < n_array_size (depends); j++) { -+ struct pkg *p = n_array_nth (depends, j); -+ -+ if (pkg_satisfies_req (p, req, 1)) { -+ /* Satisfied! */ -+ found = TRUE; -+ break; -+ } -+ } -+ -+ if (found) -+ continue; -+ -+ /* first check in installed packages */ -+ for (j = 0; j < n_array_size (installed); j++) { -+ struct pkg *p = n_array_nth (installed, j); -+ -+ if (pkg_satisfies_req (p, req, 1)) { -+ found = TRUE; -+ n_array_push (depends, pkg_link (p)); -+ n_array_push (tmp, pkg_link (p)); -+ break; -+ } -+ } -+ -+ if (found) -+ continue; -+ -+ /* ... now available */ -+ for (j = 0; j < n_array_size (available); j++) { -+ struct pkg *p = n_array_nth (available, j); -+ -+ if (pkg_satisfies_req (p, req, 1)) { -+ n_array_push (depends, pkg_link (p)); -+ n_array_push (tmp, pkg_link (p)); -+ break; -+ } -+ } -+ } -+ -+ if (recursive && tmp && n_array_size (tmp) > 0) { -+ for (i = 0; i < n_array_size (tmp); i++) { -+ struct pkg *p = n_array_nth (tmp, i); -+ -+ do_depends (installed, available, depends, p, recursive); -+ } -+ } -+ -+ n_array_free (tmp); -+} -+ -+/** -+ * poldek_backend_package: -+ */ -+static void -+poldek_backend_package (const struct pkg *pkg, gint status) -+{ -+ PkBackend *backend; -+ struct pkguinf *pkgu; -+ gchar *evr, *package_id, *poldek_dir; -+ -+ /* get current backend */ -+ backend = pk_backend_thread_get_backend (thread); -+ g_return_if_fail (backend != NULL); -+ -+ evr = poldek_pkg_evr (pkg); -+ -+ if (pkg->recno == 0) -+ { -+ if (status == PK_INFO_ENUM_UNKNOWN) -+ status = PK_INFO_ENUM_AVAILABLE; -+ -+ poldek_dir = g_strdup ("all-avail"); -+ } else { -+ if (status == PK_INFO_ENUM_UNKNOWN) -+ status = PK_INFO_ENUM_INSTALLED; -+ -+ poldek_dir = g_strdup ("installed"); -+ } -+ -+ package_id = pk_package_id_build (pkg->name, -+ evr, -+ pkg_arch (pkg), -+ poldek_dir); -+ -+ pkgu = pkg_uinf (pkg); -+ -+ if (pkgu) { -+ pk_backend_package (backend, status, package_id, pkguinf_get (pkgu, PKGUINF_SUMMARY)); -+ pkguinf_free (pkgu); -+ } else { -+ pk_backend_package (backend, status, package_id, ""); -+ } -+ -+ g_free (evr); -+ g_free (package_id); -+ g_free (poldek_dir); -+} -+ -+/** -+ * poldek_get_pkg_from_package_id: -+ */ -+static struct pkg* -+poldek_get_pkg_from_package_id (const gchar *package_id) -+{ -+ PkPackageId *pi; -+ struct poclidek_rcmd *rcmd; -+ struct pkg *result = NULL; -+ gchar *vr, *command; -+ -+ pi = pk_package_id_new_from_string (package_id); -+ -+ rcmd = poclidek_rcmd_new (cctx, NULL); -+ -+ vr = poldek_get_vr_from_package_id_evr (pi->version); -+ command = g_strdup_printf ("cd /%s; ls -q %s-%s.%s", pi->data, pi->name, vr, pi->arch); -+ -+ if (poclidek_rcmd_execline (rcmd, command)) -+ { -+ tn_array *pkgs = NULL; -+ -+ pkgs = poclidek_rcmd_get_packages (rcmd); -+ -+ if (n_array_size (pkgs) > 0) -+ { -+ /* only one package is needed */ -+ result = pkg_link (n_array_nth (pkgs, 0)); -+ } -+ n_array_free (pkgs); -+ } -+ -+ poclidek_rcmd_free (rcmd); -+ -+ pk_package_id_free (pi); -+ -+ g_free (vr); -+ g_free (command); -+ -+ return result; -+} -+ -+/** -+ * poldek_pkg_is_devel: -+ */ -+static gboolean -+poldek_pkg_is_devel (struct pkg *pkg) -+{ -+ if (g_str_has_suffix (pkg->name, "-devel")) -+ return TRUE; -+ if (g_str_has_suffix (pkg->name, "-debuginfo")) -+ return TRUE; -+ -+ return FALSE; -+} -+ -+/** -+ * poldek_pkg_is_gui: -+ */ -+static gboolean -+poldek_pkg_is_gui (struct pkg *pkg) -+{ -+ if (g_str_has_prefix (pkg_group (pkg), "X11")) -+ return TRUE; -+ -+ return FALSE; -+} -+ -+/** -+ * process_filter: -+ */ -+static FilterData* -+process_filter (const gchar* filter) -+{ -+ FilterData *fd = g_new0 (FilterData, 1); -+ gchar** sections = NULL; -+ gint i = 0; -+ -+ /* by default query all packages */ -+ fd->installed = TRUE; -+ fd->notinstalled = TRUE; -+ fd->devel = TRUE; -+ fd->notdevel = TRUE; -+ fd->gui = TRUE; -+ fd->notgui = TRUE; -+ -+ sections = g_strsplit (filter, ";", 0); -+ while (sections[i]) -+ { -+ if (strcmp (sections[i], "installed") == 0) -+ fd->notinstalled = FALSE; -+ else if (strcmp (sections[i], "~installed") == 0) -+ fd->installed = FALSE; -+ else if (strcmp (sections[i], "devel") == 0) -+ fd->notdevel = FALSE; -+ else if (strcmp (sections[i], "~devel") == 0) -+ fd->devel = FALSE; -+ else if (strcmp (sections[i], "gui") == 0) -+ fd->notgui = FALSE; -+ else if (strcmp (sections[i], "~gui") == 0) -+ fd->gui = FALSE; -+ i++; -+ } -+ g_strfreev (sections); -+ -+ return fd; -+} -+ -+/** -+ * search_package: -+ */ -+static gboolean -+search_package (PkBackendThread *thread, gpointer data) -+{ -+ SearchData *d = (SearchData*) data; -+ gchar *search_inst = NULL; -+ struct poclidek_rcmd *cmd = NULL; -+ PkBackend *backend; -+ -+ /* get current backend */ -+ backend = pk_backend_thread_get_backend (thread); -+ g_return_val_if_fail (backend != NULL, FALSE); -+ -+ cmd = poclidek_rcmd_new (cctx, NULL); -+ -+ switch (d->mode) -+ { -+ case SEARCH_ENUM_NAME: -+ search_inst = g_strdup ("ls -q"); -+ break; -+ case SEARCH_ENUM_GROUP: -+ search_inst = g_strdup ("search -qg"); -+ break; -+ case SEARCH_ENUM_DETAILS: -+ search_inst = g_strdup ("search -dsq"); -+ break; -+ case SEARCH_ENUM_FILE: -+ search_inst = g_strdup ("search -qlf"); -+ break; -+ default: -+ /* Error */ -+ break; -+ } -+ -+ if (cmd != NULL && search_inst) -+ { -+ gchar *command = NULL; -+ tn_array *pkgs = NULL, *installed = NULL, *available = NULL; -+ -+ if (d->fd->installed) -+ { -+ command = g_strdup_printf ("cd /installed; %s *%s*", search_inst, d->search); -+ if (poclidek_rcmd_execline (cmd, command)) -+ installed = poclidek_rcmd_get_packages (cmd); -+ -+ g_free (command); -+ } -+ if (d->fd->notinstalled) -+ { -+ command = g_strdup_printf ("cd /all-avail; %s *%s*", search_inst, d->search); -+ if (poclidek_rcmd_execline (cmd, command)) -+ available = poclidek_rcmd_get_packages (cmd); -+ -+ g_free (command); -+ } -+ -+ if (d->fd->installed && d->fd->notinstalled && installed && available) -+ { -+ pkgs = n_array_concat_ex (installed, available, (tn_fn_dup)pkg_link); -+ -+ n_array_sort_ex(pkgs, (tn_fn_cmp)pkg_cmp_name_evr_rev_recno); -+ -+ n_array_free (installed); -+ n_array_free (available); -+ } -+ else if (!d->fd->installed || available) -+ pkgs = available; -+ else if (!d->fd->notinstalled || installed) -+ pkgs = installed; -+ -+ if (pkgs) -+ { -+ gint i; -+ -+ for (i = 0; i < n_array_size (pkgs); i++) -+ { -+ struct pkg *pkg = n_array_nth (pkgs, i); -+ -+ /* development filter */ -+ if (!d->fd->devel || !d->fd->notdevel) -+ { -+ /* devel in filter */ -+ if (d->fd->devel && !poldek_pkg_is_devel (pkg)) -+ continue; -+ -+ /* ~devel in filter */ -+ if (d->fd->notdevel && poldek_pkg_is_devel (pkg)) -+ continue; -+ } -+ -+ /* gui filter */ -+ if (!d->fd->gui || !d->fd->notgui) -+ { -+ /* gui in filter */ -+ if (d->fd->gui && !poldek_pkg_is_gui (pkg)) -+ continue; -+ -+ /* ~gui in filter */ -+ if (d->fd->notgui && poldek_pkg_is_gui (pkg)) -+ continue; -+ } -+ -+ poldek_backend_package (pkg, PK_INFO_ENUM_UNKNOWN); -+ } -+ n_array_free (pkgs); -+ } else { -+ pk_backend_error_code (backend, PK_ERROR_ENUM_PACKAGE_NOT_FOUND, "Package not found"); -+ } -+ -+ g_free (search_inst); -+ -+ poclidek_rcmd_free (cmd); -+ } -+ -+ g_free (d->fd); -+ g_free (d->search); -+ g_free (d); -+ -+ pk_backend_finished (backend); -+ -+ return TRUE; -+} -+ -+static void -+poldek_backend_log (void *data, int pri, char *message) -+{ -+ const gchar *msg = strchr (message, ':'); -+ PkBackend *backend; -+ -+ backend = pk_backend_thread_get_backend (thread); -+ if (msg) { -+ -+ if (strcmp (msg+(2*sizeof(char)), "equal version installed, skipped\n") == 0) -+ pk_backend_error_code (backend, PK_ERROR_ENUM_PACKAGE_ALREADY_INSTALLED, "Package already installed"); -+ else if (strcmp (msg+(2*sizeof(char)), "refusing to upgrade held package\n") == 0) -+ pk_backend_error_code (backend, PK_ERROR_ENUM_TRANSACTION_ERROR, "Refusing to upgrade held package"); -+ } -+} -+ -+/** -+ * backend_initalize: -+ */ -+static void -+backend_initalize (PkBackend *backend) -+{ -+ g_return_if_fail (backend != NULL); -+ -+ thread = pk_backend_thread_new (); -+ -+ /* reference count for the global variables */ -+ if (ref++ > 1) -+ return; -+ -+ network = pk_network_new (); -+ -+ poldeklib_init (); -+ -+ ctx = poldek_new (0); -+ poldek_load_config (ctx, "/etc/poldek/poldek.conf", NULL, 0); -+ -+ poldek_setup (ctx); -+ -+ cctx = poclidek_new (ctx); -+ -+ poldek_set_verbose (1); -+ /* disable LOGFILE and LOGTTY logging */ -+ poldek_configure (ctx, POLDEK_CONF_LOGFILE, NULL); -+ poldek_configure (ctx, POLDEK_CONF_LOGTTY, NULL); -+ -+ poldek_log_set_appender ("PackageKit", NULL, NULL, 0, (poldek_vlog_fn)poldek_backend_log); -+ -+ /* poldek has to ask. Otherwise callbacks won't be used */ -+ poldek_configure (ctx, POLDEK_CONF_OPT, POLDEK_OP_CONFIRM_INST, 1); -+ poldek_configure (ctx, POLDEK_CONF_OPT, POLDEK_OP_CONFIRM_UNINST, 1); -+ /* (...), but we don't need choose_equiv callback */ -+ poldek_configure (ctx, POLDEK_CONF_OPT, POLDEK_OP_EQPKG_ASKUSER, 0); -+} -+/** -+ * backend_destroy: -+ */ -+static void -+backend_destroy (PkBackend *backend) -+{ -+ g_return_if_fail (backend != NULL); -+ -+ g_object_unref (thread); -+ -+ if (ref-- > 0) -+ return; -+ -+ poclidek_free (cctx); -+ poldek_free (ctx); -+ -+ poldeklib_destroy (); -+} -+ -+/** -+ * backend_get_filters: -+ */ -+static void -+backend_get_filters (PkBackend *backend, PkEnumList *elist) -+{ -+ g_return_if_fail (backend != NULL); -+ -+ pk_enum_list_append_multiple (elist, -+ PK_FILTER_ENUM_GUI, -+ PK_FILTER_ENUM_INSTALLED, -+ PK_FILTER_ENUM_DEVELOPMENT, -+ /* PK_FILTER_ENUM_FREE,*/ -+ -1); -+} -+ -+/** -+ * backend_get_depends: -+ */ -+static gboolean -+backend_get_depends_thread (PkBackendThread *thread, gpointer data) -+{ -+ DepsData *d = (DepsData*) data; -+ PkBackend *backend; -+ struct pkg *pkg; -+ tn_array *deppkgs, *available, *installed; -+ gint i; -+ -+ /* get current backend */ -+ backend = pk_backend_thread_get_backend (thread); -+ g_return_val_if_fail (backend != NULL, FALSE); -+ -+ deppkgs = n_array_new (2, NULL, NULL); -+ -+ installed = poldek_get_installed_packages (); -+ available = poldek_get_avail_packages (ctx); -+ -+ pkg = poldek_get_pkg_from_package_id (d->package_id); -+ -+ do_depends (installed, available, deppkgs, pkg, d->recursive); -+ -+ n_array_sort_ex(deppkgs, (tn_fn_cmp)pkg_cmp_name_evr_rev); -+ -+ for (i = 0; i < n_array_size (deppkgs); i++) { -+ struct pkg *p = n_array_nth (deppkgs, i); -+ -+ poldek_backend_package (p, PK_INFO_ENUM_UNKNOWN); -+ } -+ -+ pkg_free (pkg); -+ -+ n_array_free (deppkgs); -+ n_array_free (available); -+ n_array_free (installed); -+ -+ g_free (d->package_id); -+ g_free (d); -+ -+ pk_backend_finished (backend); -+ -+ return TRUE; -+} -+ -+static void -+backend_get_depends (PkBackend *backend, const gchar *package_id, gboolean recursive) -+{ -+ DepsData *data = g_new0 (DepsData, 1); -+ -+ g_return_if_fail (backend != NULL); -+ -+ pk_backend_set_status (backend, PK_STATUS_ENUM_QUERY); -+ -+ if (data == NULL) { -+ pk_backend_error_code (backend, PK_ERROR_ENUM_OOM, -+ "Failed to allocate memory"); -+ pk_backend_finished (backend); -+ } else { -+ data->package_id = g_strdup (package_id); -+ data->recursive = recursive; -+ pk_backend_thread_create (thread, backend_get_depends_thread, data); -+ } -+} -+ -+/** -+ * backend_get_description: -+ */ -+static gboolean -+backend_get_description_thread (PkBackendThread *thread, gchar *package_id) -+{ -+ PkBackend *backend; -+ struct pkg *pkg = NULL; -+ -+ /* get current backend */ -+ backend = pk_backend_thread_get_backend (thread); -+ g_return_val_if_fail (backend != NULL, FALSE); -+ -+ pkg = poldek_get_pkg_from_package_id (package_id); -+ -+ if (pkg) -+ { -+ struct pkguinf *pkgu = NULL; -+ -+ pkgu = pkg_uinf (pkg); -+ -+ if (pkgu) { -+ pk_backend_description (backend, -+ package_id, -+ pkguinf_get (pkgu, PKGUINF_LICENSE), -+ PK_GROUP_ENUM_OTHER, -+ pkguinf_get (pkgu, PKGUINF_DESCRIPTION), -+ pkguinf_get (pkgu, PKGUINF_URL), -+ pkg->size); -+ pkguinf_free (pkgu); -+ } else { -+ pk_backend_description (backend, -+ package_id, -+ "", -+ PK_GROUP_ENUM_OTHER, -+ "", -+ "", -+ pkg->size); -+ } -+ -+ pkg_free (pkg); -+ } -+ -+ g_free (package_id); -+ -+ pk_backend_finished (backend); -+ -+ return TRUE; -+} -+ -+static void -+backend_get_description (PkBackend *backend, const gchar *package_id) -+{ -+ g_return_if_fail (backend != NULL); -+ -+ pk_backend_set_status (backend, PK_STATUS_ENUM_QUERY); -+ -+ pk_backend_thread_create (thread, -+ (PkBackendThreadFunc)backend_get_description_thread, -+ g_strdup (package_id)); -+} -+ -+/** -+ * backend_get_files: -+ */ -+static gboolean -+backend_get_files_thread (PkBackendThread *thread, gchar *package_id) -+{ -+ PkBackend *backend; -+ struct pkg *pkg; -+ -+ /* get current backend */ -+ backend = pk_backend_thread_get_backend (thread); -+ g_return_val_if_fail (backend != NULL, FALSE); -+ -+ pkg = poldek_get_pkg_from_package_id (package_id); -+ -+ if (pkg) -+ { -+ struct pkgflist *flist = pkg_get_flist (pkg); -+ GString *filelist; -+ gchar *result, *sep; -+ gint i, j; -+ -+ sep = ""; -+ -+ if (!flist) -+ { -+ pkg_free (pkg); -+ pk_backend_finished (backend); -+ return TRUE; -+ } -+ -+ filelist = g_string_new (""); -+ -+ for (i = 0; i < n_tuple_size (flist->fl); i++) -+ { -+ struct pkgfl_ent *flent = n_tuple_nth (flist->fl, i); -+ gchar *dirname; -+ -+ dirname = g_strdup_printf ("%s%s", *flent->dirname == '/' ? "" : "/", flent->dirname); -+ -+ for (j = 0; j < flent->items; j++) -+ { -+ struct flfile *f = flent->files[j]; -+ -+ if (strcmp (dirname, "/") == 0) -+ g_string_append_printf (filelist, "%s/%s", sep, f->basename); -+ else -+ g_string_append_printf (filelist, "%s%s/%s", sep, dirname, f->basename); -+ -+ sep = ";"; -+ } -+ g_free (dirname); -+ } -+ -+ result = g_string_free (filelist, FALSE); -+ -+ pk_backend_files (backend, package_id, result); -+ -+ if (result) -+ g_free (result); -+ -+ pkg_free (pkg); -+ } -+ -+ g_free (package_id); -+ -+ pk_backend_finished (backend); -+ -+ return TRUE; -+} -+ -+static void -+backend_get_files (PkBackend *backend, const gchar *package_id) -+{ -+ g_return_if_fail (backend != NULL); -+ -+ pk_backend_set_status (backend, PK_STATUS_ENUM_QUERY); -+ -+ pk_backend_thread_create (thread, -+ (PkBackendThreadFunc)backend_get_files_thread, -+ g_strdup (package_id)); -+} -+ -+/** -+ * FIXME: recursive currently omited -+ * backend_get_requires: -+ */ -+static gboolean -+backend_get_requires_thread (PkBackendThread *thread, gpointer data) -+{ -+ DepsData *d = (DepsData*) data; -+ PkBackend *backend; -+ struct pkg *pkg; -+ tn_array *reqpkgs, *available, *installed; -+ gint i; -+ -+ /* get current backend */ -+ backend = pk_backend_thread_get_backend (thread); -+ g_return_val_if_fail (backend != NULL, FALSE); -+ -+ reqpkgs = n_array_new (2, NULL, NULL); -+ -+ pkg = poldek_get_pkg_from_package_id (d->package_id); -+ installed = poldek_get_installed_packages (); -+ available = poldek_get_avail_packages (ctx); -+ -+ do_requires (installed, available, reqpkgs, pkg, d->recursive); -+ -+ /* sort output */ -+ n_array_sort_ex(reqpkgs, (tn_fn_cmp)pkg_cmp_name_evr_rev); -+ -+ for (i = 0; i < n_array_size (reqpkgs); i++) { -+ struct pkg *p = n_array_nth (reqpkgs, i); -+ -+ poldek_backend_package (p, PK_INFO_ENUM_UNKNOWN); -+ } -+ -+ n_array_free (reqpkgs); -+ n_array_free (installed); -+ n_array_free (available); -+ -+ g_free (d->package_id); -+ g_free (d); -+ -+ pk_backend_finished (backend); -+ -+ return TRUE; -+} -+ -+static void -+backend_get_requires (PkBackend *backend, const gchar *package_id, gboolean recursive) -+{ -+ DepsData *data = g_new0 (DepsData, 1); -+ -+ g_return_if_fail (backend != NULL); -+ -+ pk_backend_set_status (backend, PK_STATUS_ENUM_QUERY); -+ -+ if (data == NULL) { -+ pk_backend_error_code (backend, PK_ERROR_ENUM_OOM, -+ "Failed to allocate memory"); -+ pk_backend_finished (backend); -+ } else { -+ data->package_id = g_strdup (package_id); -+ data->recursive = recursive; -+ pk_backend_thread_create (thread, backend_get_requires_thread, data); -+ } -+} -+ -+/** -+ * backend_get_updates: -+ */ -+static gboolean -+backend_get_updates_thread (PkBackendThread *thread, gpointer data) -+{ -+ PkBackend *backend; -+ struct poclidek_rcmd *rcmd = NULL; -+ -+ /* get current backend */ -+ backend = pk_backend_thread_get_backend (thread); -+ g_return_val_if_fail (backend != NULL, FALSE); -+ -+ rcmd = poclidek_rcmd_new (cctx, NULL); -+ -+ if (rcmd) { -+ if (poclidek_rcmd_execline (rcmd, "cd /all-avail; ls -q -u")) { -+ tn_array *pkgs = NULL; -+ gint i; -+ -+ pkgs = poclidek_rcmd_get_packages (rcmd); -+ -+ for (i = 0; i < n_array_size (pkgs); i++) { -+ struct pkg *pkg = n_array_nth (pkgs, i); -+ -+ poldek_backend_package (pkg, PK_INFO_ENUM_NORMAL); -+ } -+ n_array_free (pkgs); -+ } -+ } -+ -+ poclidek_rcmd_free (rcmd); -+ -+ pk_backend_finished (backend); -+ -+ return TRUE; -+} -+ -+static void -+backend_get_updates (PkBackend *backend, const gchar *filter) -+{ -+ g_return_if_fail (backend != NULL); -+ -+ pk_backend_set_status (backend, PK_STATUS_ENUM_QUERY); -+ -+ pk_backend_thread_create (thread, backend_get_updates_thread, NULL); -+} -+ -+/** -+ * backend_install_package: -+ */ -+static gboolean -+backend_install_package_thread (PkBackendThread *thread, gpointer data) -+{ -+ InstallData *id = (InstallData *)data; -+ PkBackend *backend; -+ struct poldek_ts *ts; -+ struct poclidek_rcmd *rcmd; -+ gchar *command, *nvra; -+ struct vf_progress vf_progress; -+ TsConfirmData *tcd = g_new0 (TsConfirmData, 1); -+ -+ tcd->idata = id; -+ id->pd->mode = PROGRESS_ENUM_INSTALL; -+ -+ setup_vf_progress (&vf_progress, id->pd); -+ -+ /* get current backend */ -+ backend = pk_backend_thread_get_backend (thread); -+ g_return_val_if_fail (backend != NULL, FALSE); -+ -+ /* setup callbacks */ -+ poldek_configure (ctx, POLDEK_CONF_TSCONFIRM_CB, ts_confirm, tcd); -+ -+ ts = poldek_ts_new (ctx, 0); -+ rcmd = poclidek_rcmd_new (cctx, ts); -+ -+ nvra = poldek_get_nvra_from_package_id (id->package_id); -+ command = g_strdup_printf ("install %s", nvra); -+ -+ if (!poclidek_rcmd_execline (rcmd, command)) -+ { -+ pk_backend_error_code (backend, PK_ERROR_ENUM_TRANSACTION_ERROR, "Package can't be installed!"); -+ } -+ -+ g_free (nvra); -+ g_free (command); -+ -+ poldek_ts_free (ts); -+ poclidek_rcmd_free (rcmd); -+ -+ g_free (id->pd); -+ g_free (id->package_id); -+ g_free (id); -+ -+ pk_backend_finished (backend); -+ -+ return TRUE; -+} -+ -+static void -+backend_install_package (PkBackend *backend, const gchar *package_id) -+{ -+ InstallData *data = g_new0 (InstallData, 1); -+ -+ g_return_if_fail (backend != NULL); -+ -+ pk_backend_set_status (backend, PK_STATUS_ENUM_INSTALL); -+ -+ if (pk_network_is_online (network) == FALSE) { -+ /* free allocated memory */ -+ if (data) -+ g_free (data); -+ -+ pk_backend_error_code (backend, PK_ERROR_ENUM_NO_NETWORK, "Cannot install package when offline!"); -+ pk_backend_finished (backend); -+ return; -+ } -+ -+ if (data == NULL) { -+ pk_backend_error_code (backend, PK_ERROR_ENUM_OOM, -+ "Failed to allocate memory!"); -+ pk_backend_finished (backend); -+ } else { -+ data->package_id = g_strdup (package_id); -+ data->pd = g_new0 (PercentageData, 1); -+ pk_backend_thread_create (thread, backend_install_package_thread, data); -+ } -+} -+ -+/** -+ * FIXME: force currently omited -+ * backend_refresh_cache: -+ */ -+static gboolean -+backend_refresh_cache_thread (PkBackendThread *thread, gpointer data) -+{ -+ PkBackend *backend; -+ tn_array *sources = NULL; -+ PercentageData *pp = g_new0 (PercentageData, 1); -+ struct vf_progress vfpro; -+ -+ setup_vf_progress (&vfpro, pp); -+ -+ /* get current backend */ -+ backend = pk_backend_thread_get_backend (thread); -+ g_return_val_if_fail (backend != NULL, FALSE); -+ -+ pk_backend_set_percentage (backend, 0); -+ -+ sources = poldek_get_sources (ctx); -+ -+ if (sources) { -+ gint i; -+ -+ pp->mode = PROGRESS_ENUM_REFRESH_CACHE; -+ pp->step = 0; -+ -+ for (i = 0; i < n_array_size (sources); i++) { -+ struct source *src = n_array_nth (sources, i); -+ -+ if (src->flags & PKGSOURCE_NOAUTOUP) -+ continue; -+ else -+ pp->nsources++; -+ } -+ -+ for (i = 0; i < n_array_size (sources); i++) { -+ struct source *src = n_array_nth (sources, i); -+ -+ if (src->flags & PKGSOURCE_NOAUTOUP) -+ continue; -+ -+ pp->step++; -+ source_update (src, 0); -+ } -+ } -+ -+ poclidek_free (cctx); -+ poldek_free (ctx); -+ -+ ctx = poldek_new (0); -+ poldek_load_config (ctx, "/etc/poldek/poldek.conf", NULL, 0); -+ -+ poldek_setup (ctx); -+ -+ cctx = poclidek_new (ctx); -+ -+ pk_backend_finished (backend); -+ -+ return TRUE; -+} -+ -+static void -+backend_refresh_cache (PkBackend *backend, gboolean force) -+{ -+ g_return_if_fail (backend != NULL); -+ -+ pk_backend_set_status (backend, PK_STATUS_ENUM_REFRESH_CACHE); -+ -+ if (pk_network_is_online (network) == FALSE) -+ { -+ pk_backend_error_code (backend, PK_ERROR_ENUM_NO_NETWORK, "Cannot refresh cache when offline!"); -+ pk_backend_finished (backend); -+ return; -+ } -+ -+ pk_backend_thread_create (thread, backend_refresh_cache_thread, NULL); -+} -+ -+/** -+ * backend_remove_package: -+ */ -+static gboolean -+backend_remove_package_thread (PkBackendThread *thread, gpointer data) -+{ -+ RemoveData *d = (RemoveData*) data; -+ TsConfirmData *tcd = g_new0 (TsConfirmData, 1); -+ PkBackend *backend; -+ struct poclidek_rcmd *rcmd; -+ struct poldek_ts *ts; -+ gchar *nvra, *command; -+ -+ /* get current backend */ -+ backend = pk_backend_thread_get_backend (thread); -+ g_return_val_if_fail (backend != NULL, FALSE); -+ -+ tcd->rdata = d; -+ -+ /* setup callbacks */ -+ poldek_configure (ctx, POLDEK_CONF_TSCONFIRM_CB, ts_confirm, tcd); -+ -+ ts = poldek_ts_new (ctx, 0); -+ rcmd = poclidek_rcmd_new (cctx, ts); -+ -+ nvra = poldek_get_nvra_from_package_id (d->package_id); -+ command = g_strdup_printf ("uninstall %s", nvra); -+ -+ if (!poclidek_rcmd_execline (rcmd, command)) -+ { -+ pk_backend_error_code (backend, PK_ERROR_ENUM_CANNOT_REMOVE_SYSTEM_PACKAGE, "Package can't be removed!"); -+ } -+ -+ poclidek_load_packages (cctx, POCLIDEK_LOAD_RELOAD); -+ -+ g_free (nvra); -+ g_free (command); -+ -+ poldek_ts_free (ts); -+ poclidek_rcmd_free (rcmd); -+ -+ g_free (d->package_id); -+ g_free (d); -+ g_free (tcd); -+ -+ pk_backend_finished (backend); -+ -+ return TRUE; -+} -+ -+static void -+backend_remove_package (PkBackend *backend, const gchar *package_id, gboolean allow_deps, gboolean autoremove) -+{ -+ RemoveData *data = g_new0 (RemoveData, 1); -+ -+ g_return_if_fail (backend != NULL); -+ -+ pk_backend_set_status (backend, PK_STATUS_ENUM_REMOVE); -+ -+ if (data == NULL) { -+ pk_backend_error_code (backend, PK_ERROR_ENUM_OOM, -+ "Failed to allocate memory"); -+ pk_backend_finished (backend); -+ } else { -+ data->package_id = g_strdup (package_id); -+ data->allow_deps = allow_deps; -+ pk_backend_thread_create (thread, backend_remove_package_thread, data); -+ } -+} -+ -+/** -+ * backend_resolve: -+ */ -+static void -+backend_resolve (PkBackend *backend, const gchar *filter, const gchar *package) -+{ -+ SearchData *data = g_new0 (SearchData, 1); -+ -+ g_return_if_fail (backend != NULL); -+ -+ pk_backend_set_status (backend, PK_STATUS_ENUM_QUERY); -+ -+ if (data == NULL) { -+ pk_backend_error_code (backend, PK_ERROR_ENUM_OOM, -+ "Failed to allocate memory"); -+ pk_backend_finished (backend); -+ } else { -+ data->mode = SEARCH_ENUM_NAME; -+ data->fd = process_filter (filter); -+ data->search = g_strdup (package); -+ pk_backend_thread_create (thread, search_package, data); -+ } -+} -+ -+/** -+ * backend_search_details: -+ */ -+static void -+backend_search_details (PkBackend *backend, const gchar *filter, const gchar *search) -+{ -+ SearchData *data = g_new0 (SearchData, 1); -+ -+ g_return_if_fail (backend != NULL); -+ -+ pk_backend_set_status (backend, PK_STATUS_ENUM_QUERY); -+ -+ if (data == NULL) { -+ pk_backend_error_code (backend, PK_ERROR_ENUM_OOM, -+ "Failed to allocate memory"); -+ pk_backend_finished (backend); -+ } else { -+ data->mode = SEARCH_ENUM_DETAILS; -+ data->fd = process_filter (filter); -+ data->search = g_strdup (search); -+ pk_backend_thread_create (thread, search_package, data); -+ } -+} -+ -+/** -+ * backend_search_file: -+ */ -+static void -+backend_search_file (PkBackend *backend, const gchar *filter, const gchar *search) -+{ -+ SearchData *data = g_new0 (SearchData, 1); -+ -+ g_return_if_fail (backend != NULL); -+ -+ pk_backend_set_status (backend, PK_STATUS_ENUM_QUERY); -+ -+ if (data == NULL) { -+ pk_backend_error_code (backend, PK_ERROR_ENUM_OOM, -+ "Failed to allocate memory"); -+ pk_backend_finished (backend); -+ } else { -+ data->mode = SEARCH_ENUM_FILE; -+ data->fd = process_filter (filter); -+ data->search = g_strdup (search); -+ pk_backend_thread_create (thread, search_package, data); -+ } -+} -+ -+/** -+ * backend_search_group: -+ */ -+static void -+backend_search_group (PkBackend *backend, const gchar *filter, const gchar *search) -+{ -+ SearchData *data = g_new0 (SearchData, 1); -+ -+ g_return_if_fail (backend != NULL); -+ -+ pk_backend_set_status (backend, PK_STATUS_ENUM_QUERY); -+ -+ if (data == NULL) { -+ pk_backend_error_code (backend, PK_ERROR_ENUM_OOM, -+ "Failed to allocate memory"); -+ pk_backend_finished (backend); -+ } else { -+ data->mode = SEARCH_ENUM_GROUP; -+ data->fd = process_filter (filter); -+ data->search = g_strdup (search); -+ pk_backend_thread_create (thread, search_package, data); -+ } -+} -+ -+/** -+ * backend_search_name: -+ */ -+static void -+backend_search_name (PkBackend *backend, const gchar *filter, const gchar *search) -+{ -+ SearchData *data = g_new0 (SearchData, 1); -+ -+ g_return_if_fail (backend != NULL); -+ -+ pk_backend_set_status (backend, PK_STATUS_ENUM_QUERY); -+ -+ if (data == NULL) { -+ pk_backend_error_code (backend, PK_ERROR_ENUM_OOM, -+ "Failed to allocate memory"); -+ pk_backend_finished (backend); -+ } else { -+ data->mode = SEARCH_ENUM_NAME; -+ data->fd = process_filter (filter); -+ data->search = g_strdup (search); -+ pk_backend_thread_create (thread, search_package, data); -+ } -+} -+ -+/** -+ * backend_update_package: -+ */ -+static gboolean -+backend_update_package_thread (PkBackendThread *thread, gpointer data) -+{ -+ InstallData *id = (InstallData *)data; -+ PkBackend *backend; -+ struct poldek_ts *ts; -+ struct poclidek_rcmd *rcmd; -+ gchar *command, *nvra; -+ struct vf_progress vf_progress; -+ TsConfirmData *tcd = g_new0 (TsConfirmData, 1); -+ -+ tcd->idata = id; -+ -+ setup_vf_progress (&vf_progress, id->pd); -+ -+ /* get current backend */ -+ backend = pk_backend_thread_get_backend (thread); -+ g_return_val_if_fail (backend != NULL, FALSE); -+ -+ /* setup callbacks */ -+ poldek_configure (ctx, POLDEK_CONF_TSCONFIRM_CB, ts_confirm, tcd); -+ -+ ts = poldek_ts_new (ctx, 0); -+ rcmd = poclidek_rcmd_new (cctx, ts); -+ -+ nvra = poldek_get_nvra_from_package_id (id->package_id); -+ command = g_strdup_printf ("upgrade %s", nvra); -+ -+ if (!poclidek_rcmd_execline (rcmd, command)) -+ { -+ pk_backend_error_code (backend, PK_ERROR_ENUM_TRANSACTION_ERROR, "Cannot update package!"); -+ } -+ -+ g_free (nvra); -+ g_free (command); -+ -+ poldek_ts_free (ts); -+ poclidek_rcmd_free (rcmd); -+ -+ g_free (id->pd); -+ g_free (id->package_id); -+ g_free (id); -+ -+ pk_backend_finished (backend); -+ -+ return TRUE; -+} -+ -+static void -+backend_update_package (PkBackend *backend, const gchar *package_id) -+{ -+ InstallData *data = g_new0 (InstallData, 1); -+ -+ g_return_if_fail (backend != NULL); -+ -+ pk_backend_set_status (backend, PK_STATUS_ENUM_UPDATE); -+ -+ if (pk_network_is_online (network) == FALSE) { -+ /* free allocated memory */ -+ if (data) -+ g_free (data); -+ -+ pk_backend_error_code (backend, PK_ERROR_ENUM_NO_NETWORK, "Cannot update package when offline!"); -+ pk_backend_finished (backend); -+ return; -+ } -+ -+ if (data == NULL) { -+ pk_backend_error_code (backend, PK_ERROR_ENUM_OOM, -+ "Failed to allocate memory!"); -+ pk_backend_finished (backend); -+ } else { -+ data->package_id = g_strdup (package_id); -+ data->pd = g_new0 (PercentageData, 1); -+ data->pd->mode = PROGRESS_ENUM_INSTALL; -+ pk_backend_thread_create (thread, backend_update_package_thread, data); -+ } -+} -+ -+/** -+ * backend_get_repo_list: -+ */ -+static void -+backend_get_repo_list (PkBackend *backend) -+{ -+ tn_array *sources = NULL; -+ -+ g_return_if_fail (backend != NULL); -+ -+ pk_backend_set_status (backend, PK_STATUS_ENUM_QUERY); -+ -+ sources = poldek_get_sources (ctx); -+ -+ if (sources) { -+ gint i; -+ -+ for (i = 0; i < n_array_size (sources); i++) { -+ struct source *src = n_array_nth (sources, i); -+ gboolean enabled = TRUE; -+ -+ if (src->flags & PKGSOURCE_NOAUTO) -+ enabled = FALSE; -+ -+ pk_backend_repo_detail (backend, src->name, src->path, enabled); -+ } -+ -+ n_array_free (sources); -+ } -+ -+ pk_backend_finished (backend); -+} -+ -+PK_BACKEND_OPTIONS ( -+ "poldek", /* description */ -+ "Marcin Banasiak ", /* author */ -+ backend_initalize, /* initalize */ -+ backend_destroy, /* destroy */ -+ NULL, /* get_groups */ -+ backend_get_filters, /* get_filters */ -+ NULL, /* cancel */ -+ backend_get_depends, /* get_depends */ -+ backend_get_description, /* get_description */ -+ backend_get_files, /* get_files */ -+ backend_get_requires, /* get_requires */ -+ NULL, /* get_update_detail */ -+ backend_get_updates, /* get_updates */ -+ backend_install_package, /* install_package */ -+ NULL, /* install_file */ -+ backend_refresh_cache, /* refresh_cache */ -+ backend_remove_package, /* remove_package */ -+ backend_resolve, /* resolve */ -+ NULL, /* rollback */ -+ backend_search_details, /* search_details */ -+ backend_search_file, /* search_file */ -+ backend_search_group, /* search_group */ -+ backend_search_name, /* search_name */ -+ backend_update_package, /* update_package */ -+ NULL, /* update_system */ -+ backend_get_repo_list, /* get_repo_list */ -+ NULL, /* repo_enable */ -+ NULL, /* repo_set_data */ -+ NULL /* service pack */ -+); -+ -diff -urN PackageKit-0.1.8/configure.ac PackageKit-0.1.8.new/configure.ac ---- PackageKit-0.1.8/configure.ac 2008-02-20 02:22:25.000000000 +0100 -+++ PackageKit-0.1.8.new/configure.ac 2008-02-29 14:33:49.000000000 +0100 -@@ -156,6 +156,7 @@ - AC_ARG_ENABLE(dummy, AS_HELP_STRING([--enable-dummy],[use the dummy backend]),enable_dummy=$enableval,enable_dummy=yes) - AC_ARG_ENABLE(opkg, AS_HELP_STRING([--enable-opkg],[use the OPKG backend]),enable_opkg=$enableval,enable_opkg=no) - AC_ARG_ENABLE(pisi, AS_HELP_STRING([--enable-pisi],[use the PiSi backend]),enable_pisi=$enableval,enable_pisi=no) -+AC_ARG_ENABLE(poldek, AS_HELP_STRING([--enable-poldek],[use the poldek backend]),enable_poldek=$enableval,enable_poldek=no) - AC_ARG_ENABLE(smart, AS_HELP_STRING([--enable-smart],[use the SMART backend]),enable_smart=$enableval,enable_smart=no) - AC_ARG_ENABLE(yum, AS_HELP_STRING([--enable-yum],[use the YUM backend]),enable_yum=$enableval,enable_yum=no) - AC_ARG_ENABLE(yum2, AS_HELP_STRING([--enable-yum2],[use the YUM DBUS backend]),enable_yum2=$enableval,enable_yum2=no) -@@ -170,6 +171,7 @@ - AM_CONDITIONAL(BACKEND_TYPE_DUMMY, [test x$enable_dummy = xyes], [using dummy backend]) - AM_CONDITIONAL(BACKEND_TYPE_OPKG, [test x$enable_opkg = xyes], [using OPKG backend]) - AM_CONDITIONAL(BACKEND_TYPE_PISI, [test x$enable_pisi = xyes], [using PiSi backend]) -+AM_CONDITIONAL(BACKEND_TYPE_POLDEK, [test x$enable_poldek = xyes], [using poldek backend]) - AM_CONDITIONAL(BACKEND_TYPE_SMART, [test x$enable_smart = xyes], [using SMART backend]) - AM_CONDITIONAL(BACKEND_TYPE_YUM, [test x$enable_yum = xyes], [using YUM backend]) - AM_CONDITIONAL(BACKEND_TYPE_YUM2, [test x$enable_yum2 = xyes], [using YUM DBUS backend]) -@@ -321,6 +323,8 @@ - with_default_backend=smart - elif test -f /usr/bin/pisi ; then - with_default_backend=pisi -+ elif test -f /usr/bin/poldek ; then -+ with_default_backend=poldek - elif test -f /usr/bin/zypper ; then - with_default_backend=zypp - else -@@ -467,6 +471,13 @@ - AC_SUBST(BOX_LIBS) - fi - -+if test x$enable_poldek = xyes; then -+ POLDEK_CFLAGS="-I/usr/include/poldek" -+ POLDEK_LIBS="-lpoclidek -lpoldek" -+ AC_SUBST(POLDEK_CFLAGS) -+ AC_SUBST(POLDEK_LIBS) -+fi -+ - if test x$enable_opkg = xyes; then - PKG_CHECK_MODULES(OPKG, libopkg) - AC_SUBST(OPKG_CFLAGS) -@@ -533,6 +544,7 @@ - backends/yum2/helpers/Makefile - backends/pisi/Makefile - backends/pisi/helpers/Makefile -+backends/poldek/Makefile - backends/zypp/Makefile - data/Makefile - data/packagekit.pc -@@ -576,6 +588,7 @@ - dummy backend: ${enable_dummy} - OPKG backend: ${enable_opkg} - PiSi backend: ${enable_pisi} -+ poldek backend: ${enable_poldek} - SMART backend: ${enable_smart} - YUM backend: ${enable_yum} - YUM2 backend: ${enable_yum2}