[packagekit] packagekit: Branch 'master' - 5 commits

Richard Hughes hughsient at kemper.freedesktop.org
Tue Oct 2 16:02:13 PDT 2007


 TODO                            |   13 +-
 libpackagekit/Makefile.am       |    7 -
 libpackagekit/pk-client.c       |   37 +-----
 libpackagekit/pk-client.h       |    8 -
 libpackagekit/pk-package-list.c |  244 ++++++++++++++++++++++++++++++++++++++++
 libpackagekit/pk-package-list.h |   69 +++++++++++
 libpackagekit/pk-self-test.c    |    2 
 src/pk-engine.c                 |   17 +-
 src/pk-transaction-list.c       |    4 
 src/pk-transaction-list.h       |    3 
 10 files changed, 347 insertions(+), 57 deletions(-)

New commits:
diff-tree 74032405a96c4763c8f9cc93524f4a23896589dc (from a0d7378b1e8b02f6da5646fe814e26c8f550df8f)
Author: Richard Hughes <richard at hughsie.com>
Date:   Wed Oct 3 00:02:03 2007 +0100

    update TODO

diff --git a/TODO b/TODO
index 6073558..517cb00 100644
--- a/TODO
+++ b/TODO
@@ -8,18 +8,22 @@ NOTE: RELEASE BLOCKER
 *** don't output the same package in different repos ***
 Need to store Package() in the server properly, and compare the first chunk
 (not the data) to avoid reporting the same package more than once.
-We can also use this in the client library (perhaps?)
 Also: pk_package_id_compare (gboolean use_data)
-Need to unit test...
+Need to properly unit test...
 NOTE: RELEASE BLOCKER
 
 *** Add new callback for status ***
 TimeRemaining()
  
-*** Get the deps in the UI when removing ***
+*** get the depends and requires in the tabbed UI ***
 We really don't want to remove glibc...
 NOTE: RELEASE BLOCKER
 
+*** the backends will have repo controls ***
+a(s=rid,s=description)=GetRepoList()
+RepoEnable(s=rid,s=value)
+RepoSetData(s=rid,s=data,s=value)
+
 *** pk-application (client) ***
 Use an icons for installed and not-installed rather than tickboxes
 Refresh the query list after an install or remove (means saving the query and re-issuing)
diff-tree a0d7378b1e8b02f6da5646fe814e26c8f550df8f (from d800936b1b3b5acfa2d3e9b2a6b1b0d4c72b0f39)
Author: Richard Hughes <richard at hughsie.com>
Date:   Tue Oct 2 23:40:46 2007 +0100

    use PkPackageList in PkClient to reduce code duplication

diff --git a/libpackagekit/pk-client.c b/libpackagekit/pk-client.c
index 5a81872..cfe5863 100644
--- a/libpackagekit/pk-client.c
+++ b/libpackagekit/pk-client.c
@@ -35,6 +35,7 @@
 
 #include "pk-client.h"
 #include "pk-connection.h"
+#include "pk-package-list.h"
 #include "pk-debug.h"
 #include "pk-marshal.h"
 #include "pk-polkit-client.h"
@@ -53,7 +54,7 @@ struct PkClientPrivate
 	gboolean	 is_finished;
 	gboolean	 use_buffer;
 	gchar		*tid;
-	GPtrArray	*cache_package;
+	PkPackageList	*package_list;
 	PkConnection	*pconnection;
 	PkPolkitClient	*polkit;
 	PkRestartEnum	 require_restart;
@@ -163,23 +164,7 @@ pk_client_get_package_buffer (PkClient *
 	if (client->priv->use_buffer == FALSE) {
 		return NULL;
 	}
-	return client->priv->cache_package;
-}
-
-/**
- * pk_client_remove_cache_package:
- **/
-static void
-pk_client_remove_cache_package (PkClient *client)
-{
-	PkClientPackageItem *item;
-	while (client->priv->cache_package->len > 0) {
-		item = g_ptr_array_index (client->priv->cache_package, 0);
-		g_free (item->package_id);
-		g_free (item->summary);
-		g_free (item);
-		g_ptr_array_remove_index_fast (client->priv->cache_package, 0);
-	}
+	return pk_package_list_get_buffer (client->priv->package_list);
 }
 
 /**
@@ -200,7 +185,7 @@ pk_client_reset (PkClient *client)
 	client->priv->tid = NULL;
 	client->priv->last_status = PK_STATUS_ENUM_UNKNOWN;
 	client->priv->is_finished = FALSE;
-	pk_client_remove_cache_package (client);
+	pk_package_list_remove_buffer (client->priv->package_list);
 	return TRUE;
 }
 
@@ -333,7 +318,6 @@ pk_client_package_cb (DBusGProxy   *prox
 		      const gchar  *summary,
 		      PkClient     *client)
 {
-	PkClientPackageItem *item;
 	PkInfoEnum info;
 	g_return_if_fail (client != NULL);
 	g_return_if_fail (PK_IS_CLIENT (client));
@@ -346,11 +330,7 @@ pk_client_package_cb (DBusGProxy   *prox
 		/* cache */
 		if (client->priv->use_buffer == TRUE) {
 			pk_debug ("adding to cache array package %i, %s, %s", info, package_id, summary);
-			item = g_new0 (PkClientPackageItem, 1);
-			item->info = info;
-			item->package_id = g_strdup (package_id);
-			item->summary = g_strdup (summary);
-			g_ptr_array_add (client->priv->cache_package, item);
+			pk_package_list_add (client->priv->package_list, info, package_id, summary);
 		}
 	}
 }
@@ -1775,7 +1755,7 @@ pk_client_init (PkClient *client)
 	client->priv->last_status = PK_STATUS_ENUM_UNKNOWN;
 	client->priv->require_restart = PK_RESTART_ENUM_NONE;
 	client->priv->is_finished = FALSE;
-	client->priv->cache_package = g_ptr_array_new ();
+	client->priv->package_list = pk_package_list_new ();
 
 	/* check dbus connections, exit if not valid */
 	client->priv->connection = dbus_g_bus_get (DBUS_BUS_SYSTEM, &error);
@@ -1943,10 +1923,7 @@ pk_client_finalize (GObject *object)
 	g_object_unref (G_OBJECT (client->priv->proxy));
 	g_object_unref (client->priv->pconnection);
 	g_object_unref (client->priv->polkit);
-
-	/* removed any cached packages */
-	pk_client_remove_cache_package (client);
-	g_ptr_array_free (client->priv->cache_package, TRUE);
+	g_object_unref (client->priv->package_list);
 
 	G_OBJECT_CLASS (pk_client_parent_class)->finalize (object);
 }
diff --git a/libpackagekit/pk-client.h b/libpackagekit/pk-client.h
index 6b6d7fb..838baa0 100644
--- a/libpackagekit/pk-client.h
+++ b/libpackagekit/pk-client.h
@@ -48,14 +48,6 @@ typedef struct
 	GObjectClass	parent_class;
 } PkClientClass;
 
-/* used if we are collecting packages sync */
-typedef struct
-{
-	PkInfoEnum		 info;
-	gchar			*package_id;
-	gchar			*summary;
-} PkClientPackageItem;
-
 GType		 pk_client_get_type			(void);
 PkClient	*pk_client_new				(void);
 
diff --git a/libpackagekit/pk-package-list.c b/libpackagekit/pk-package-list.c
index 01114fb..73475dc 100644
--- a/libpackagekit/pk-package-list.c
+++ b/libpackagekit/pk-package-list.c
@@ -107,7 +107,7 @@ pk_package_list_get_string (PkPackageLis
  * pk_plist_get_package_buffer:
  **/
 GPtrArray *
-pk_package_list_get_package_buffer (PkPackageList *plist)
+pk_package_list_get_buffer (PkPackageList *plist)
 {
 	g_return_val_if_fail (plist != NULL, NULL);
 	g_return_val_if_fail (PK_IS_PACKAGE_LIST (plist), NULL);
@@ -115,15 +115,15 @@ pk_package_list_get_package_buffer (PkPa
 }
 
 /**
- * pk_plist_remove_array:
+ * pk_package_list_remove_buffer:
  **/
-static void
-pk_plist_remove_array (PkPackageList *plist)
+gboolean
+pk_package_list_remove_buffer (PkPackageList *plist)
 {
 	PkPackageListItem *item;
 
-	g_return_if_fail (plist != NULL);
-	g_return_if_fail (PK_IS_PACKAGE_LIST (plist));
+	g_return_val_if_fail (plist != NULL, FALSE);
+	g_return_val_if_fail (PK_IS_PACKAGE_LIST (plist), FALSE);
 
 	while (plist->priv->array->len > 0) {
 		item = g_ptr_array_index (plist->priv->array, 0);
@@ -132,6 +132,7 @@ pk_plist_remove_array (PkPackageList *pl
 		g_free (item);
 		g_ptr_array_remove_index_fast (plist->priv->array, 0);
 	}
+	return TRUE;
 }
 
 /**
@@ -173,7 +174,7 @@ pk_package_list_finalize (GObject *objec
 	g_return_if_fail (plist->priv != NULL);
 
 	/* removed any cached packages */
-	pk_plist_remove_array (plist);
+	pk_package_list_remove_buffer (plist);
 	g_ptr_array_free (plist->priv->array, TRUE);
 
 	G_OBJECT_CLASS (pk_package_list_parent_class)->finalize (object);
diff --git a/libpackagekit/pk-package-list.h b/libpackagekit/pk-package-list.h
index 76fbc28..5685827 100644
--- a/libpackagekit/pk-package-list.h
+++ b/libpackagekit/pk-package-list.h
@@ -61,7 +61,8 @@ gboolean	 pk_package_list_add			(PkPacka
 							 const gchar		*package_id,
 							 const gchar		*summary);
 gchar		*pk_package_list_get_string		(PkPackageList		*plist);
-GPtrArray	*pk_package_list_get_package_buffer	(PkPackageList		*plist);
+GPtrArray	*pk_package_list_get_buffer		(PkPackageList		*plist);
+gboolean	 pk_package_list_remove_buffer		(PkPackageList		*plist);
 
 G_END_DECLS
 
diff-tree d800936b1b3b5acfa2d3e9b2a6b1b0d4c72b0f39 (from 2509a191fa55a76c430945e2b9d21a39f970dde8)
Author: Richard Hughes <richard at hughsie.com>
Date:   Tue Oct 2 23:26:30 2007 +0100

    use pk-package-list in the daemon

diff --git a/TODO b/TODO
index 4528da3..6073558 100644
--- a/TODO
+++ b/TODO
@@ -8,7 +8,6 @@ NOTE: RELEASE BLOCKER
 *** don't output the same package in different repos ***
 Need to store Package() in the server properly, and compare the first chunk
 (not the data) to avoid reporting the same package more than once.
-Instead of Gstring have PkPackageCache instance.
 We can also use this in the client library (perhaps?)
 Also: pk_package_id_compare (gboolean use_data)
 Need to unit test...
diff --git a/src/pk-engine.c b/src/pk-engine.c
index 8f2bde3..fa5b91c 100644
--- a/src/pk-engine.c
+++ b/src/pk-engine.c
@@ -39,6 +39,7 @@
 #include <polkit/polkit.h>
 #include <polkit-dbus/polkit-dbus.h>
 #include <pk-package-id.h>
+#include <pk-package-list.h>
 
 #include <pk-debug.h>
 #include <pk-task-common.h>
@@ -267,7 +268,6 @@ pk_engine_package_cb (PkBackend *backend
 {
 	PkTransactionItem *item;
 	const gchar *info_text;
-	gchar *cache;
 
 	g_return_if_fail (engine != NULL);
 	g_return_if_fail (PK_IS_ENGINE (engine));
@@ -277,14 +277,11 @@ pk_engine_package_cb (PkBackend *backend
 		pk_warning ("could not find backend");
 		return;
 	}
-	info_text = pk_info_enum_to_text (info);
 
 	/* add to package cache */
-	cache = g_strdup_printf ("%s\t%s\t%s\n", info_text, package_id, summary);
-	pk_debug ("cache='%s'", cache);
-	g_string_append (item->package_cache, cache);
-	g_free (cache);
+	pk_package_list_add (item->package_list, info, package_id, summary);
 
+	info_text = pk_info_enum_to_text (info);
 	pk_debug ("emitting package tid:%s info=%s %s, %s", item->tid, info_text, package_id, summary);
 	g_signal_emit (engine, signals [PK_ENGINE_PACKAGE], 0, item->tid, info_text, package_id, summary);
 	pk_engine_reset_timer (engine);
@@ -419,6 +416,7 @@ pk_engine_finished_cb (PkBackend *backen
 	PkRoleEnum role;
 	const gchar *exit_text;
 	gdouble time;
+	gchar *packages;
 
 	g_return_if_fail (engine != NULL);
 	g_return_if_fail (PK_IS_ENGINE (engine));
@@ -434,10 +432,11 @@ pk_engine_finished_cb (PkBackend *backen
 	time = pk_backend_get_runtime (backend);
 
 	/* add to the database */
-	if (item->package_cache->len != 0) {
-		g_string_set_size (item->package_cache, item->package_cache->len-1);
-		pk_transaction_db_set_data (engine->priv->transaction_db, item->tid, item->package_cache->str);
+	packages = pk_package_list_get_string (item->package_list);
+	if (strlen (packages) > 0) {
+		pk_transaction_db_set_data (engine->priv->transaction_db, item->tid, packages);
 	}
+	g_free (packages);
 
 	pk_debug ("backend was running for %f seconds", time);
 	pk_transaction_db_set_finished (engine->priv->transaction_db, item->tid, TRUE, time);
diff --git a/src/pk-transaction-list.c b/src/pk-transaction-list.c
index 44b86e8..0d18bb1 100644
--- a/src/pk-transaction-list.c
+++ b/src/pk-transaction-list.c
@@ -104,7 +104,7 @@ pk_transaction_list_create (PkTransactio
 	item->committed = FALSE;
 	item->running = FALSE;
 	item->backend = NULL;
-	item->package_cache = g_string_new ("");
+	item->package_list = pk_package_list_new ();
 	item->tid = pk_transaction_id_generate ();
 	g_ptr_array_add (tlist->priv->array, item);
 	return item;
@@ -121,8 +121,8 @@ pk_transaction_list_remove (PkTransactio
 
 	/* valid item */
 	g_ptr_array_remove (tlist->priv->array, item);
+	g_object_unref (item->package_list);
 	g_free (item->tid);
-	g_string_free (item->package_cache, TRUE);
 	g_free (item);
 
 	/* we have changed what is running */
diff --git a/src/pk-transaction-list.h b/src/pk-transaction-list.h
index 818f815..2add6d6 100644
--- a/src/pk-transaction-list.h
+++ b/src/pk-transaction-list.h
@@ -24,6 +24,7 @@
 
 #include <glib-object.h>
 #include "pk-backend-internal.h"
+#include "pk-package-list.h"
 
 G_BEGIN_DECLS
 
@@ -54,7 +55,7 @@ typedef struct {
 	gboolean		 running;
 	PkBackend		*backend;
 	gchar			*tid;
-	GString			*package_cache;
+	PkPackageList		*package_list;
 } PkTransactionItem;
 
 GType		 pk_transaction_list_get_type	  	(void);
diff-tree 2509a191fa55a76c430945e2b9d21a39f970dde8 (from d62660cdb4d39b7a92f7392c5dd3b59d59ebcc31)
Author: Richard Hughes <richard at hughsie.com>
Date:   Tue Oct 2 23:14:43 2007 +0100

    add get_string to package_list

diff --git a/libpackagekit/pk-package-list.c b/libpackagekit/pk-package-list.c
index 9a88db5..01114fb 100644
--- a/libpackagekit/pk-package-list.c
+++ b/libpackagekit/pk-package-list.c
@@ -78,10 +78,29 @@ pk_package_list_add (PkPackageList *plis
 gchar *
 pk_package_list_get_string (PkPackageList *plist)
 {
+	PkPackageListItem *item;
+	guint i;
+	guint length;
+	const gchar *info_text;
+	GString *package_cache;
+
 	g_return_val_if_fail (plist != NULL, NULL);
 	g_return_val_if_fail (PK_IS_PACKAGE_LIST (plist), NULL);
 
-	return NULL;
+	package_cache = g_string_new ("");
+	length = plist->priv->array->len;
+	for (i=0; i<length; i++) {
+		item = g_ptr_array_index (plist->priv->array, i);
+		info_text = pk_info_enum_to_text (item->info);
+		g_string_append_printf (package_cache, "%s\t%s\t%s\n", info_text, item->package_id, item->summary);
+	}
+
+	/* remove trailing newline */
+	if (package_cache->len != 0) {
+		g_string_set_size (package_cache, package_cache->len-1);
+	}
+
+	return g_string_free (package_cache, FALSE);
 }
 
 /**
@@ -183,6 +202,7 @@ void
 libst_package_list (LibSelfTest *test)
 {
 	PkPackageList *plist;
+	gchar *text;
 	gboolean ret;
 
 	if (libst_start (test, "PkPackageList", CLASS_AUTO) == FALSE) {
@@ -207,6 +227,16 @@ libst_package_list (LibSelfTest *test)
 		libst_failed (test, NULL);
 	}
 
+	/************************************************************/
+	libst_title (test, "add entry");
+	text = pk_package_list_get_string (plist);
+	if (text != NULL && strcmp (text, "installed\tgnome;1.23;i386;data\tGNOME!") == 0) {
+		libst_success (test, NULL);
+	} else {
+		libst_failed (test, "get string incorrect '%s'", text);
+	}
+	g_free (text);
+
 	libst_end (test);
 }
 #endif
diff-tree d62660cdb4d39b7a92f7392c5dd3b59d59ebcc31 (from f28a3317b1115b21088eba68e20e01cef8cf956a)
Author: Richard Hughes <richard at hughsie.com>
Date:   Tue Oct 2 22:59:53 2007 +0100

    add the package list code to be used in the daemon and client

diff --git a/TODO b/TODO
index d6eec31..4528da3 100644
--- a/TODO
+++ b/TODO
@@ -8,9 +8,7 @@ NOTE: RELEASE BLOCKER
 *** don't output the same package in different repos ***
 Need to store Package() in the server properly, and compare the first chunk
 (not the data) to avoid reporting the same package more than once.
-Have pk-package-cache.c object which is created in pk-backend for each instance
 Instead of Gstring have PkPackageCache instance.
-pk_package_cache_add (i=role, s=package_id, s=summary) s=pk_package_cache_get_string()
 We can also use this in the client library (perhaps?)
 Also: pk_package_id_compare (gboolean use_data)
 Need to unit test...
diff --git a/libpackagekit/Makefile.am b/libpackagekit/Makefile.am
index 4d60534..77bcfee 100644
--- a/libpackagekit/Makefile.am
+++ b/libpackagekit/Makefile.am
@@ -28,6 +28,7 @@ libpackagekit_include_HEADERS =					\
 	pk-debug.h						\
 	pk-connection.h						\
 	pk-package-id.h						\
+	pk-package-list.h					\
 	pk-enum-list.h						\
 	pk-enum.h						\
 	pk-task-common.h					\
@@ -44,8 +45,10 @@ libpackagekit_la_SOURCES =					\
 	pk-marshal.h						\
 	pk-connection.c						\
 	pk-connection.h						\
-	pk-package-id.h						\
 	pk-package-id.c						\
+	pk-package-id.h						\
+	pk-package-list.c					\
+	pk-package-list.h					\
 	pk-enum-list.c						\
 	pk-enum-list.h						\
 	pk-enum.h						\
@@ -84,6 +87,8 @@ pk_self_test_SOURCES =						\
 	pk-enum-list.c						\
 	pk-package-id.h						\
 	pk-package-id.c						\
+	pk-package-list.h					\
+	pk-package-list.c					\
 	pk-self-test.c						\
 	$(NULL)
 
diff --git a/libpackagekit/pk-package-list.c b/libpackagekit/pk-package-list.c
new file mode 100644
index 0000000..9a88db5
--- /dev/null
+++ b/libpackagekit/pk-package-list.c
@@ -0,0 +1,213 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
+ *
+ * Copyright (C) 2007 Richard Hughes <richard at hughsie.com>
+ *
+ * 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 "config.h"
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <time.h>
+#include <errno.h>
+
+#include <string.h>
+#include <sys/time.h>
+#include <sys/types.h>
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif /* HAVE_UNISTD_H */
+
+#include <glib/gi18n.h>
+
+#include "pk-debug.h"
+#include "pk-package-list.h"
+
+static void     pk_package_list_class_init	(PkPackageListClass *klass);
+static void     pk_package_list_init		(PkPackageList      *plist);
+static void     pk_package_list_finalize	(GObject            *object);
+
+#define PK_PACKAGE_LIST_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), PK_TYPE_PACKAGE_LIST, PkPackageListPrivate))
+
+struct PkPackageListPrivate
+{
+	GPtrArray	*array;
+};
+
+G_DEFINE_TYPE (PkPackageList, pk_package_list, G_TYPE_OBJECT)
+
+/**
+ * pk_package_list_add:
+ **/
+gboolean
+pk_package_list_add (PkPackageList *plist, PkInfoEnum info, const gchar *package_id, const gchar *summary)
+{
+	PkPackageListItem *item;
+
+	g_return_val_if_fail (plist != NULL, FALSE);
+	g_return_val_if_fail (PK_IS_PACKAGE_LIST (plist), FALSE);
+
+	pk_debug ("adding to cache array package %i, %s, %s", info, package_id, summary);
+	item = g_new0 (PkPackageListItem, 1);
+	item->info = info;
+	item->package_id = g_strdup (package_id);
+	item->summary = g_strdup (summary);
+	g_ptr_array_add (plist->priv->array, item);
+
+	return TRUE;
+}
+
+/**
+ * pk_package_list_get_string:
+ **/
+gchar *
+pk_package_list_get_string (PkPackageList *plist)
+{
+	g_return_val_if_fail (plist != NULL, NULL);
+	g_return_val_if_fail (PK_IS_PACKAGE_LIST (plist), NULL);
+
+	return NULL;
+}
+
+/**
+ * pk_plist_get_package_buffer:
+ **/
+GPtrArray *
+pk_package_list_get_package_buffer (PkPackageList *plist)
+{
+	g_return_val_if_fail (plist != NULL, NULL);
+	g_return_val_if_fail (PK_IS_PACKAGE_LIST (plist), NULL);
+	return plist->priv->array;
+}
+
+/**
+ * pk_plist_remove_array:
+ **/
+static void
+pk_plist_remove_array (PkPackageList *plist)
+{
+	PkPackageListItem *item;
+
+	g_return_if_fail (plist != NULL);
+	g_return_if_fail (PK_IS_PACKAGE_LIST (plist));
+
+	while (plist->priv->array->len > 0) {
+		item = g_ptr_array_index (plist->priv->array, 0);
+		g_free (item->package_id);
+		g_free (item->summary);
+		g_free (item);
+		g_ptr_array_remove_index_fast (plist->priv->array, 0);
+	}
+}
+
+/**
+ * pk_package_list_class_init:
+ * @klass: The PkPackageListClass
+ **/
+static void
+pk_package_list_class_init (PkPackageListClass *klass)
+{
+	GObjectClass *object_class = G_OBJECT_CLASS (klass);
+	object_class->finalize = pk_package_list_finalize;
+	g_type_class_add_private (klass, sizeof (PkPackageListPrivate));
+}
+
+/**
+ * pk_package_list_init:
+ **/
+static void
+pk_package_list_init (PkPackageList *plist)
+{
+	g_return_if_fail (plist != NULL);
+	g_return_if_fail (PK_IS_PACKAGE_LIST (plist));
+
+	plist->priv = PK_PACKAGE_LIST_GET_PRIVATE (plist);
+	plist->priv->array = g_ptr_array_new ();
+}
+
+/**
+ * pk_package_list_finalize:
+ * @object: The object to finalize
+ **/
+static void
+pk_package_list_finalize (GObject *object)
+{
+	PkPackageList *plist;
+	g_return_if_fail (object != NULL);
+	g_return_if_fail (PK_IS_PACKAGE_LIST (object));
+	plist = PK_PACKAGE_LIST (object);
+	g_return_if_fail (plist->priv != NULL);
+
+	/* removed any cached packages */
+	pk_plist_remove_array (plist);
+	g_ptr_array_free (plist->priv->array, TRUE);
+
+	G_OBJECT_CLASS (pk_package_list_parent_class)->finalize (object);
+}
+
+/**
+ * pk_package_list_new:
+ *
+ * Return value: a new PkPackageList object.
+ **/
+PkPackageList *
+pk_package_list_new (void)
+{
+	PkPackageList *plist;
+	plist = g_object_new (PK_TYPE_PACKAGE_LIST, NULL);
+	return PK_PACKAGE_LIST (plist);
+}
+
+/***************************************************************************
+ ***                          MAKE CHECK TESTS                           ***
+ ***************************************************************************/
+#ifdef PK_BUILD_TESTS
+#include <libselftest.h>
+
+void
+libst_package_list (LibSelfTest *test)
+{
+	PkPackageList *plist;
+	gboolean ret;
+
+	if (libst_start (test, "PkPackageList", CLASS_AUTO) == FALSE) {
+		return;
+	}
+
+	/************************************************************/
+	libst_title (test, "create");
+	plist = pk_package_list_new ();
+	if (plist != NULL) {
+		libst_success (test, NULL);
+	} else {
+		libst_failed (test, NULL);
+	}
+
+	/************************************************************/
+	libst_title (test, "add entry");
+	ret = pk_package_list_add (plist, PK_INFO_ENUM_INSTALLED, "gnome;1.23;i386;data", "GNOME!");
+	if (ret == TRUE) {
+		libst_success (test, NULL);
+	} else {
+		libst_failed (test, NULL);
+	}
+
+	libst_end (test);
+}
+#endif
+
diff --git a/libpackagekit/pk-package-list.h b/libpackagekit/pk-package-list.h
new file mode 100644
index 0000000..76fbc28
--- /dev/null
+++ b/libpackagekit/pk-package-list.h
@@ -0,0 +1,68 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
+ *
+ * Copyright (C) 2007 Richard Hughes <richard at hughsie.com>
+ *
+ * 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.
+ */
+
+#ifndef __PK_PACKAGE_LIST_H
+#define __PK_PACKAGE_LIST_H
+
+#include <glib-object.h>
+#include <pk-enum.h>
+
+G_BEGIN_DECLS
+
+#define PK_TYPE_PACKAGE_LIST		(pk_package_list_get_type ())
+#define PK_PACKAGE_LIST(o)		(G_TYPE_CHECK_INSTANCE_CAST ((o), PK_TYPE_PACKAGE_LIST, PkPackageList))
+#define PK_PACKAGE_LIST_CLASS(k)	(G_TYPE_CHECK_CLASS_CAST((k), PK_TYPE_PACKAGE_LIST, PkPackageListClass))
+#define PK_IS_PACKAGE_LIST(o)		(G_TYPE_CHECK_INSTANCE_TYPE ((o), PK_TYPE_PACKAGE_LIST))
+#define PK_IS_PACKAGE_LIST_CLASS(k)	(G_TYPE_CHECK_CLASS_TYPE ((k), PK_TYPE_PACKAGE_LIST))
+#define PK_PACKAGE_LIST_GET_CLASS(o)	(G_TYPE_INSTANCE_GET_CLASS ((o), PK_TYPE_PACKAGE_LIST, PkPackageListClass))
+
+typedef struct PkPackageListPrivate PkPackageListPrivate;
+
+typedef struct
+{
+	 GObject		 parent;
+	 PkPackageListPrivate	*priv;
+} PkPackageList;
+
+typedef struct
+{
+	GObjectClass	parent_class;
+} PkPackageListClass;
+
+typedef struct
+{
+	PkInfoEnum		 info;
+	gchar			*package_id;
+	gchar			*summary;
+} PkPackageListItem;
+
+GType		 pk_package_list_get_type		(void);
+PkPackageList	*pk_package_list_new			(void);
+gboolean	 pk_package_list_add			(PkPackageList		*plist,
+							 PkInfoEnum		 info,
+							 const gchar		*package_id,
+							 const gchar		*summary);
+gchar		*pk_package_list_get_string		(PkPackageList		*plist);
+GPtrArray	*pk_package_list_get_package_buffer	(PkPackageList		*plist);
+
+G_END_DECLS
+
+#endif /* __PK_PACKAGE_LIST_H */
diff --git a/libpackagekit/pk-self-test.c b/libpackagekit/pk-self-test.c
index ae490b1..d53bcf9 100644
--- a/libpackagekit/pk-self-test.c
+++ b/libpackagekit/pk-self-test.c
@@ -25,6 +25,7 @@
 
 /* prototypes */
 void libst_package_id (LibSelfTest *test);
+void libst_package_list (LibSelfTest *test);
 void libst_enum (LibSelfTest *test);
 void libst_enum_list (LibSelfTest *test);
 
@@ -38,6 +39,7 @@ main (int argc, char **argv)
 
 	/* tests go here */
 	libst_package_id (&test);
+	libst_package_list (&test);
 	libst_enum (&test);
 	libst_enum_list (&test);
 


More information about the PackageKit mailing list