+++ /dev/null
-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 <megabajt@pld-linux.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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-+ */
-+
-+#include <pk-backend.h>
-+#include <pk-backend-thread.h>
-+#include <pk-network.h>
-+
-+#include <log.h>
-+#include <capreq.h>
-+#include <poldek.h>
-+#include <poclidek/poclidek.h>
-+#include <pkgdir/pkgdir.h>
-+#include <pkgdir/source.h>
-+#include <pkgu.h>
-+#include <pkgfl.h>
-+#include <pkgmisc.h>
-+#include <pm/pm.h>
-+#include <vfile/vfile.h>
-+
-+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 <megabajt@pld-linux.org>", /* 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}