]> git.pld-linux.org Git - packages/PackageKit.git/commitdiff
- poldek backend
authorMarcin Banasiak <marcin.banasiak@gmail.com>
Fri, 29 Feb 2008 13:47:16 +0000 (13:47 +0000)
committercvs2git <feedback@pld-linux.org>
Sun, 24 Jun 2012 12:13:13 +0000 (12:13 +0000)
Changed files:
    PackageKit-poldek.patch -> 1.1

PackageKit-poldek.patch [new file with mode: 0644]

diff --git a/PackageKit-poldek.patch b/PackageKit-poldek.patch
new file mode 100644 (file)
index 0000000..cc239f1
--- /dev/null
@@ -0,0 +1,1933 @@
+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)
++{
++      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)
++{
++      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}
This page took 0.310169 seconds and 4 git commands to generate.