Index: PackageKit-0.6.0/backends/opkg/pk-backend-opkg.c
===================================================================
--- PackageKit-0.6.0.orig/backends/opkg/pk-backend-opkg.c	2010-01-29 09:39:33.000000000 +0000
+++ PackageKit-0.6.0/backends/opkg/pk-backend-opkg.c	2010-01-29 11:30:51.000000000 +0000
@@ -29,8 +29,7 @@
 
+#include <stdio.h>
 #include <libopkg/opkg.h>
 
-static opkg_t *opkg;
-
 enum {
 	SEARCH_NAME,
 	SEARCH_DESCRIPTION,
@@ -62,7 +60,7 @@
  * check an opkg package for known GUI dependancies
  */
 static gboolean
-opkg_is_gui_pkg (opkg_package_t *pkg)
+opkg_is_gui_pkg (pkg_t *pkg)
 {
 
   /* TODO: check appropriate tag */
@@ -84,7 +82,7 @@
  * check an opkg package to determine if it is a development package
  */
 static gboolean
-opkg_is_devel_pkg (opkg_package_t *pkg)
+opkg_is_devel_pkg (pkg_t *pkg)
 {
   if (g_strrstr (pkg->name, "-dev"))
       return TRUE;
@@ -105,7 +103,7 @@
  * returns true if the tag is present
  */
 static gboolean 
-opkg_check_tag (opkg_package_t *pkg, const gchar *tag)
+opkg_check_tag (pkg_t *pkg, const gchar *tag)
 {
 	if (pkg->tags && tag)
 		return (g_strrstr (pkg->tags, tag) != NULL);
@@ -118,7 +116,7 @@
 {
 	switch (err)
 	{
-	case OPKG_NO_ERROR:
+/*	case OPKG_NO_ERROR:
 		break;
 	case OPKG_PACKAGE_NOT_INSTALLED:
 		pk_backend_error_code (backend, PK_ERROR_ENUM_PACKAGE_NOT_INSTALLED, NULL);
@@ -140,7 +138,7 @@
 		break;
 	case OPKG_PACKAGE_NOT_AVAILABLE:
 		pk_backend_error_code (backend, PK_ERROR_ENUM_PACKAGE_NOT_FOUND, NULL);
-		break;
+		break;*/
 	default:
 		opkg_unknown_error (backend, err, "Update package");
 	}
@@ -152,7 +150,7 @@
 static void
 backend_initialize (PkBackend *backend)
 {
-	opkg = opkg_new ();
+	int opkg = opkg_new ();
 
 	if (!opkg) {
 		pk_backend_error_code (backend,
@@ -162,8 +160,8 @@
 	}
 
 #ifdef OPKG_OFFLINE_ROOT
-	opkg_set_option (opkg, (char *) "offline_root", OPKG_OFFLINE_ROOT);
-	opkg_re_read_config_files (opkg);
+	opkg_set_option ((char *) "offline_root", OPKG_OFFLINE_ROOT);
+	opkg_re_read_config_files ();
 #endif
 
 }
@@ -174,22 +172,22 @@
 static void
 backend_destroy (PkBackend *backend)
 {
-	opkg_free (opkg);
+	opkg_free ();
 }
 
 
 static void
-pk_opkg_progress_cb (opkg_t *_opkg, const opkg_progress_data_t *pdata, void *data)
+pk_opkg_progress_cb (const opkg_progress_data_t *pdata, void *data)
 {
-	PkBackend *backend = PK_BACKEND (data);
+	PkBackend *backend = (PkBackend*) data;
 	if (!backend)
 		return;
 
 	pk_backend_set_percentage (backend, pdata->percentage);
-	if (pdata->package)
+	if (pdata->pkg)
 	{
 		gchar *uid;
-		opkg_package_t *pkg = pdata->package;
+		pkg_t *pkg = pdata->pkg;
 		gint status = PK_INFO_ENUM_UNKNOWN;
 
 		uid = g_strdup_printf ("%s;%s;%s;",
@@ -225,12 +223,12 @@
 {
 	int ret;
 
-	ret = opkg_update_package_lists (opkg, pk_opkg_progress_cb, backend);
+	ret = opkg_update_package_lists (pk_opkg_progress_cb, backend);
 
 	if (ret) {
-		if (ret == OPKG_DOWNLOAD_FAILED)
-			pk_backend_error_code (backend, PK_ERROR_ENUM_REPO_NOT_AVAILABLE, NULL);
-		else
+//		if (ret == OPKG_DOWNLOAD_FAILED)
+//			pk_backend_error_code (backend, PK_ERROR_ENUM_REPO_NOT_AVAILABLE, NULL);
+//		else
 			opkg_unknown_error (backend, ret, "Refreshing cache");
 	}
 	pk_backend_finished (backend);
@@ -256,7 +254,7 @@
  */
 
 static void
-pk_opkg_package_list_cb (opkg_t *_opkg, opkg_package_t *pkg, void *data)
+pk_opkg_package_list_cb (pkg_t *pkg, void *data)
 {
 	SearchParams *params = (SearchParams*) data;
 	gchar *uid;
@@ -298,7 +296,7 @@
 	uid = g_strdup_printf ("%s;%s;%s;",
 		pkg->name, pkg->version, pkg->architecture);
 
-	if (pkg->installed)
+	if (pkg->state_status == SS_INSTALLED)
 		status = PK_INFO_ENUM_INSTALLED;
 	else
 		status = PK_INFO_ENUM_AVAILABLE;
@@ -318,10 +316,10 @@
                 opkg_is_gui_pkg (pkg))
 		goto end_handle;
 	if (pk_bitfield_contain(filters, PK_FILTER_ENUM_INSTALLED) && 
-                (!pkg->installed))
+                (pkg->state_status != SS_INSTALLED))
 		goto end_handle;
 	if (pk_bitfield_contain(filters, PK_FILTER_ENUM_NOT_INSTALLED) && 
-                (pkg->installed))
+                (pkg->state_status == SS_INSTALLED))
 		goto end_handle;
 
 	pk_backend_package (params->backend, status, uid, pkg->description);
@@ -338,7 +336,7 @@
 
 	params = pk_backend_get_pointer (backend, "search-params");
 
-	opkg_list_packages (opkg, pk_opkg_package_list_cb, params);
+	opkg_list_packages (pk_opkg_package_list_cb, params);
 
 	pk_backend_finished (params->backend);
 
@@ -349,7 +347,7 @@
 }
 
 static void
-backend_search_name (PkBackend *backend, PkBitfield filters, const gchar *search)
+backend_search_name (PkBackend *backend, PkBitfield filters, gchar **search)
 {
 	SearchParams *params;
 
@@ -360,7 +358,7 @@
 	params = g_new0 (SearchParams, 1);
 	params->filters = filters;
 	params->search_type = SEARCH_NAME;
-	params->needle = g_utf8_strdown (search, -1);
+	params->needle = g_utf8_strdown (search[0], -1);
 	params->backend = backend;
 
 	pk_backend_set_pointer (backend, "search-params", params);
@@ -371,7 +369,7 @@
  * backend_search_description:
  */
 static void
-backend_search_description (PkBackend *backend, PkBitfield filters, const gchar *search)
+backend_search_description (PkBackend *backend, PkBitfield filters, gchar **search)
 {
 	SearchParams *params;
 
@@ -382,7 +380,7 @@
 	params = g_new0 (SearchParams, 1);
 	params->filters = filters;
 	params->search_type = SEARCH_DESCRIPTION;
-	params->needle = g_utf8_strdown (search, -1);
+	params->needle = g_utf8_strdown (search[0], -1);
 	params->backend = backend;
 
 	pk_backend_set_pointer (backend, "search-params", params);
@@ -390,7 +388,7 @@
 }
 
 static void
-backend_search_group (PkBackend *backend, PkBitfield filters, const gchar *search)
+backend_search_group (PkBackend *backend, PkBitfield filters, gchar **search)
 {
 	SearchParams *params;
 
@@ -401,7 +399,7 @@
 	params = g_new0 (SearchParams, 1);
 	params->filters = filters;
 	params->search_type = SEARCH_TAG;
-	params->needle = g_strdup_printf ("group::%s", search);
+	params->needle = g_strdup_printf ("group::%s", search[0]);
 	params->backend = backend;
 
 	pk_backend_set_pointer (backend, "search-params", params);
@@ -412,9 +410,9 @@
 static gboolean
 backend_install_packages_thread (PkBackend *backend)
 {
-	PkPackageId *pi;
 	gint err, i;
 	gchar **package_ids;
+	gchar **parts;
 
 	package_ids = pk_backend_get_strv (backend, "pkids");
 
@@ -424,13 +422,13 @@
 	{
 		pk_backend_package (backend, PK_INFO_ENUM_INSTALLING, package_ids[i], NULL);
 
-		pi = pk_package_id_new_from_string (package_ids[i]);
+		parts = pk_package_id_split (package_ids[i]);
 
-		err = opkg_install_package (opkg, pi->name, pk_opkg_progress_cb, backend);
+		err = opkg_install_package (parts[PK_PACKAGE_ID_NAME], pk_opkg_progress_cb, backend);
 		if (err)
 			handle_install_error (backend, err);
 
-		pk_package_id_free (pi);
+		g_strfreev (parts);
 		if (err != 0)
 			break;
 	}
@@ -453,9 +451,9 @@
 static gboolean
 backend_remove_packages_thread (PkBackend *backend)
 {
-	PkPackageId *pi;
 	gint err, i;
 	gchar **package_ids;
+	gchar **parts;
 	gboolean allow_deps;
 	gboolean autoremove;
 	gpointer *data;
@@ -467,29 +465,30 @@
 	autoremove = GPOINTER_TO_INT (data[2]);
 	g_free (data);
 
-	opkg_set_option (opkg, (char *)"autoremove", &autoremove);
-	opkg_set_option (opkg, (char *)"force_removal_of_dependent_packages", &allow_deps);
+	opkg_set_option ((char *)"autoremove", &autoremove);
+	opkg_set_option ((char *)"force_removal_of_dependent_packages", &allow_deps);
 
 	err = 0;
 
 	for (i = 0; package_ids[i]; i++)
 	{
-		pi = pk_package_id_new_from_string (package_ids[i]);
 		pk_backend_package (backend, PK_INFO_ENUM_REMOVING, package_ids[i], NULL);
 
-		err = opkg_remove_package (opkg, pi->name, pk_opkg_progress_cb, backend);
+		parts = pk_package_id_split (package_ids[i]);
+
+		err = opkg_remove_package (parts[PK_PACKAGE_ID_NAME], pk_opkg_progress_cb, backend);
 
 		switch (err)
 		{
-		case OPKG_NO_ERROR:
-			break;
-		case OPKG_PACKAGE_NOT_INSTALLED:
-			pk_backend_error_code (backend, PK_ERROR_ENUM_PACKAGE_NOT_INSTALLED, NULL);
-			break;
+		//case OPKG_NO_ERROR:
+		//	break;
+		//case OPKG_PACKAGE_NOT_INSTALLED:
+		//	pk_backend_error_code (backend, PK_ERROR_ENUM_PACKAGE_NOT_INSTALLED, NULL);
+		//	break;
 		default:
 			opkg_unknown_error (backend, err, "Remove");
 		}
-		pk_package_id_free (pi);
+		g_strfreev (parts);
 
 		if (err != 0)
 			break;
@@ -540,7 +539,7 @@
 	gint err;
 
 	/* FIXME: support only_trusted */
-	err = opkg_upgrade_all (opkg, pk_opkg_progress_cb, backend);
+	err = opkg_upgrade_all (pk_opkg_progress_cb, backend);
 
 	if (err)
 		opkg_unknown_error (backend, err, "Upgrading system");
@@ -564,29 +563,28 @@
 static gboolean
 backend_update_package_thread (PkBackend *backend)
 {
-	PkPackageId *pi;
+        gchar **parts;
 	gint err = 0;
 	const gchar *package_id;
 
 	/* FIXME: support only_trusted */
 	package_id = pk_backend_get_string (backend, "pkgid");
-	pi = pk_package_id_new_from_string (package_id);
+	parts = pk_package_id_split (package_id);
 
-	if (!pi->name || !pi->version)
+	if (!parts)
 	{
 		pk_backend_error_code (backend, PK_ERROR_ENUM_PACKAGE_NOT_FOUND,
 				"Package not found");
-		pk_package_id_free (pi);
 		pk_backend_finished (backend);
 		return FALSE;
 	}
 
-	err = opkg_upgrade_package (opkg, pi->name, pk_opkg_progress_cb, backend);
+	err = opkg_upgrade_package (parts[PK_PACKAGE_ID_NAME], pk_opkg_progress_cb, backend);
 	if (err)
 		handle_install_error (backend, err);
 
 
-	pk_package_id_free (pi);
+	g_strfreev (parts);
 	pk_backend_finished (backend);
 	return (err != 0);
 }
@@ -610,13 +608,13 @@
  */
 
 static void
-pk_opkg_list_upgradable_cb (opkg_t *_opkg, opkg_package_t *pkg, void *data)
+pk_opkg_list_upgradable_cb (pkg_t *pkg, void *data)
 {
-	PkBackend *backend = PK_BACKEND (data);
+	PkBackend *backend = (PkBackend*) data;
 	gchar *uid;
 	gint status;
 
-	if (pkg->installed)
+	if (pkg->state_status == SS_INSTALLED)
 		status = PK_INFO_ENUM_INSTALLED;
 	else
 		status = PK_INFO_ENUM_AVAILABLE;
@@ -631,7 +629,7 @@
 static gboolean
 backend_get_updates_thread (PkBackend *backend)
 {
-	opkg_list_upgradable_packages (opkg, pk_opkg_list_upgradable_cb, backend);
+	opkg_list_upgradable_packages (pk_opkg_list_upgradable_cb, backend);
 	pk_backend_finished (backend);
 	return TRUE;
 }
@@ -668,16 +666,18 @@
 static gboolean
 backend_get_details_thread (PkBackend *backend)
 {
-	PkPackageId *pi;
 	gchar **package_ids;
+        gchar **parts;
 	int group_index;
 	PkGroupEnum group = 0;
-	opkg_package_t *pkg;
+	pkg_t *pkg;
 	gchar *newid;
 
         package_ids = pk_backend_get_strv(backend, "package_ids");
-	pi = pk_package_id_new_from_string (package_ids[0]);
-	if (pi == NULL)
+	parts = pk_package_id_split (package_ids[0]);
+
+
+	if (!parts)
 	{
 		pk_backend_error_code (backend, PK_ERROR_ENUM_PACKAGE_ID_INVALID, "invalid package id");
 		pk_backend_finished (backend);
@@ -685,8 +685,8 @@
 	}
 
 
-	pkg = opkg_find_package (opkg, pi->name, pi->version, pi->arch, pi->data);
-	pk_package_id_free (pi);
+	pkg = opkg_find_package (parts[PK_PACKAGE_ID_NAME], parts[PK_PACKAGE_ID_VERSION], parts[PK_PACKAGE_ID_ARCH], parts[PK_PACKAGE_ID_DATA]);
+	g_strfreev (parts);
 
 	if (!pkg)
 	{
@@ -695,7 +695,7 @@
 		return FALSE;
 	}
 
-	newid = g_strdup_printf ("%s;%s;%s;%s", pkg->name, pkg->version, pkg->architecture, pkg->repository);
+	newid = g_strdup_printf ("%s;%s;%s;%s", pkg->name, pkg->version, pkg->architecture, pkg->src->name);
 
 	if (pkg->tags) {
 		for (group_index = 0; group < PK_GROUP_ENUM_LAST; group_index++) {
@@ -706,9 +706,8 @@
 		}
 	}
 
-	pk_backend_details (backend, newid, NULL, group, pkg->description, pkg->url, pkg->size);
+	pk_backend_details (backend, newid, NULL, group, pkg->description, NULL, pkg->size);
 	g_free (newid);
-	opkg_package_free(pkg);
 	pk_backend_finished (backend);
 	return TRUE;
 }
