gnome-packagekit r331 - trunk/src
- From: rhughes svn gnome org
- To: svn-commits-list gnome org
- Subject: gnome-packagekit r331 - trunk/src
- Date: Fri, 10 Oct 2008 10:29:27 +0000 (UTC)
Author: rhughes
Date: Fri Oct 10 10:29:27 2008
New Revision: 331
URL: http://svn.gnome.org/viewvc/gnome-packagekit?rev=331&view=rev
Log:
from git
Modified:
trunk/src/gpk-service-pack.c
Modified: trunk/src/gpk-service-pack.c
==============================================================================
--- trunk/src/gpk-service-pack.c (original)
+++ trunk/src/gpk-service-pack.c Fri Oct 10 10:29:27 2008
@@ -29,6 +29,7 @@
#include <gtk/gtk.h>
#include <math.h>
#include <string.h>
+#include <sys/utsname.h>
#include <dbus/dbus-glib.h>
#include <gconf/gconf-client.h>
@@ -39,35 +40,66 @@
#include "egg-debug.h"
#include "egg-unique.h"
+#include "egg-string.h"
#include "gpk-common.h"
#include "gpk-error.h"
#include "gpk-gnome.h"
#include "gpk-enum.h"
+typedef enum {
+ GPK_ACTION_ENUM_COPY,
+ GPK_ACTION_ENUM_PACKAGE,
+ GPK_ACTION_ENUM_UPDATES
+} GpkActionEnum;
+
static GladeXML *glade_xml = NULL;
-static gboolean updates = TRUE;
-guint pulse_id = 0;
+static GpkActionEnum action;
+static guint pulse_id = 0;
+
+/**
+ * pk_get_node_name:
+ **/
+static gchar *
+pk_get_node_name (void)
+{
+ gint retval;
+ struct utsname buf;
+
+ retval = uname (&buf);
+ if (retval != 0)
+ return g_strdup ("localhost");
+ return g_strdup (buf.nodename);
+}
/**
* gpk_pack_get_default_filename:
**/
static gchar *
-gpk_pack_get_default_filename (const gchar *name, const gchar *directory)
+gpk_pack_get_default_filename (const gchar *directory)
{
+ GtkWidget *widget;
gchar *filename = NULL;
gchar *distro_id;
gchar *iso_time = NULL;
+ gchar *nodename = NULL;
+ const gchar *package;
distro_id = pk_get_distro_id ();
- if (name != NULL) {
- filename = g_strdup_printf ("%s/%s-%s.servicepack", directory, name, distro_id);
- } else {
+ if (action == GPK_ACTION_ENUM_PACKAGE) {
+ widget = glade_xml_get_widget (glade_xml, "entry_package");
+ package = gtk_entry_get_text (GTK_ENTRY(widget));
+ filename = g_strdup_printf ("%s/%s-%s.servicepack", directory, package, distro_id);
+ } else if (action == GPK_ACTION_ENUM_COPY) {
+ nodename = pk_get_node_name ();
+ filename = g_strdup_printf ("%s/%s.package-list", directory, nodename);
+ } else if (action == GPK_ACTION_ENUM_UPDATES) {
iso_time = pk_iso8601_present ();
/* don't include the time, just use the date prefix */
iso_time[10] = '\0';
filename = g_strdup_printf ("%s/updates-%s-%s.servicepack", directory, iso_time, distro_id);
}
+ g_free (nodename);
g_free (distro_id);
g_free (iso_time);
return filename;
@@ -88,18 +120,18 @@
gpk_pack_widgets_activate (gboolean enable)
{
GtkWidget *widget;
- if (!updates) {
- widget = glade_xml_get_widget (glade_xml, "entry_package");
- gtk_widget_set_sensitive (widget, enable);
- }
+ widget = glade_xml_get_widget (glade_xml, "entry_package");
+ gtk_widget_set_sensitive (widget, enable && action == GPK_ACTION_ENUM_PACKAGE);
widget = glade_xml_get_widget (glade_xml, "radiobutton_updates");
gtk_widget_set_sensitive (widget, enable);
widget = glade_xml_get_widget (glade_xml, "radiobutton_package");
gtk_widget_set_sensitive (widget, enable);
+ widget = glade_xml_get_widget (glade_xml, "radiobutton_copy");
+ gtk_widget_set_sensitive (widget, enable);
widget = glade_xml_get_widget (glade_xml, "filechooserbutton_directory");
gtk_widget_set_sensitive (widget, enable);
widget = glade_xml_get_widget (glade_xml, "filechooserbutton_exclude");
- gtk_widget_set_sensitive (widget, enable);
+ gtk_widget_set_sensitive (widget, enable && action != GPK_ACTION_ENUM_COPY);
widget = glade_xml_get_widget (glade_xml, "button_create");
gtk_widget_set_sensitive (widget, enable);
widget = glade_xml_get_widget (glade_xml, "button_close");
@@ -240,6 +272,61 @@
}
/**
+ * gpk_pack_copy_package_lists:
+ **/
+static gboolean
+gpk_pack_copy_package_lists (const gchar *filename, GError **error)
+{
+ gboolean ret = FALSE;
+ PkPackageList *system = NULL;
+ PkPackageList *installed = NULL;
+ guint i;
+ guint length;
+ const PkPackageObj *obj;
+
+ /* no feedback */
+ gpk_pack_set_percentage (101);
+
+ if (!g_file_test (PK_SYSTEM_PACKAGE_LIST_FILENAME, G_FILE_TEST_EXISTS)) {
+ *error = g_error_new (0, 0, _("The file does not exists"));
+ goto out;
+ }
+
+ /* open the list */
+ system = pk_package_list_new ();
+ ret = pk_package_list_add_file (system, PK_SYSTEM_PACKAGE_LIST_FILENAME);
+ if (!ret) {
+ *error = g_error_new (0, 0, _("Could not read package list"));
+ goto out;
+ }
+
+ /* get all the installed entries */
+ installed = pk_package_list_new ();
+ length = pk_package_list_get_size (system);
+ for (i=0; i<length; i++) {
+ obj = pk_package_list_get_obj (system, i);
+ if (obj->info == PK_INFO_ENUM_INSTALLED)
+ pk_package_list_add_obj (installed, obj);
+ /* don't hang the GUI */
+ while (gtk_events_pending ())
+ gtk_main_iteration ();
+ }
+
+ /* write new file */
+ ret = pk_package_list_to_file (installed, filename);
+ if (!ret) {
+ *error = g_error_new (0, 0, _("Could not write package list"));
+ goto out;
+ }
+out:
+ if (system != NULL)
+ g_object_unref (system);
+ if (installed != NULL)
+ g_object_unref (installed);
+ return ret;
+}
+
+/**
* gpk_pack_button_create_cb:
**/
static void
@@ -249,8 +336,8 @@
const gchar *package = NULL;
gchar *directory;
gchar *filename;
- gchar *exclude;
- gchar *package_id;
+ gchar *exclude = NULL;
+ gchar *package_id = NULL;
PkServicePack *pack;
PkPackageList *list = NULL;
GError *error = NULL;
@@ -258,28 +345,47 @@
widget = glade_xml_get_widget (glade_xml, "filechooserbutton_directory");
directory = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER(widget));
+
+ /* use a default filename */
+ filename = gpk_pack_get_default_filename (directory);
+
+ /* start the action */
+ gpk_pack_widgets_activate (FALSE);
+ widget = glade_xml_get_widget (glade_xml, "frame_progress");
+ gtk_widget_show (widget);
+
+ /* copy the system package list */
+ if (action == GPK_ACTION_ENUM_COPY) {
+ ret = gpk_pack_copy_package_lists (filename, &error);
+ if (!ret) {
+ widget = glade_xml_get_widget (glade_xml, "window_pack");
+ gpk_error_dialog_modal (GTK_WINDOW (widget), _("Create error"), _("Cannot copy system package list"), error->message);
+ g_error_free (error);
+ }
+ goto out;
+ }
+
+ /* get the exclude list, and fall back to the system copy */
widget = glade_xml_get_widget (glade_xml, "filechooserbutton_exclude");
exclude = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER(widget));
-
- /* fall back to the system copy */
if (exclude == NULL)
exclude = g_strdup (PK_SYSTEM_PACKAGE_LIST_FILENAME);
- if (!updates) {
+ /* get the package to download */
+ if (action == GPK_ACTION_ENUM_PACKAGE) {
widget = glade_xml_get_widget (glade_xml, "entry_package");
package = gtk_entry_get_text (GTK_ENTRY(widget));
+ if (egg_strzero (package)) {
+ widget = glade_xml_get_widget (glade_xml, "window_pack");
+ gpk_error_dialog_modal (GTK_WINDOW (widget), _("Create error"), _("No package name selected"), NULL);
+ goto out;
+ }
+ package_id = gpk_pack_resolve (package);
+ if (package_id == NULL)
+ goto out;
}
- gpk_pack_widgets_activate (FALSE);
- widget = glade_xml_get_widget (glade_xml, "frame_progress");
- gtk_widget_show (widget);
-
- /* resolve name to ID */
- package_id = gpk_pack_resolve (package);
- if (package_id == NULL)
- goto back;
-
- /* get the exclude list */
+ /* add the exclude list */
list = pk_package_list_new ();
ret = pk_package_list_add_file (list, exclude);
if (!ret) {
@@ -288,9 +394,6 @@
goto out;
}
- /* use a default filename */
- filename = gpk_pack_get_default_filename (package, directory);
-
/* create pack and set initial values */
pack = pk_service_pack_new ();
g_signal_connect (pack, "package", G_CALLBACK (gpk_pack_package_cb), pack);
@@ -299,10 +402,10 @@
pk_service_pack_set_temp_directory (pack, NULL);
pk_service_pack_set_exclude_list (pack, list);
- if (updates)
+ if (action == GPK_ACTION_ENUM_UPDATES)
ret = pk_service_pack_create_for_updates (pack, &error);
- else
- ret = pk_service_pack_create_for_package_id (pack, package_id, &error);
+ else if (action == GPK_ACTION_ENUM_PACKAGE)
+ ret = pk_service_pack_create_for_package_id (pack, directory, &error);
if (!ret) {
widget = glade_xml_get_widget (glade_xml, "window_pack");
gpk_error_dialog_modal (GTK_WINDOW (widget), _("Create error"), _("Cannot create service pack"), error->message);
@@ -310,12 +413,13 @@
}
g_object_unref (pack);
-back:
+out:
+ /* stop the action */
gpk_pack_widgets_activate (TRUE);
widget = glade_xml_get_widget (glade_xml, "frame_progress");
gtk_widget_hide (widget);
+ gpk_pack_set_percentage (100);
-out:
if (list != NULL)
g_object_unref (list);
g_free (package_id);
@@ -344,7 +448,9 @@
egg_debug ("got updates");
widget = glade_xml_get_widget (glade_xml, "entry_package");
gtk_widget_set_sensitive (widget, FALSE);
- updates = TRUE;
+ widget = glade_xml_get_widget (glade_xml, "filechooserbutton_exclude");
+ gtk_widget_set_sensitive (widget, TRUE);
+ action = GPK_ACTION_ENUM_UPDATES;
}
/**
@@ -357,7 +463,24 @@
egg_debug ("got package");
widget = glade_xml_get_widget (glade_xml, "entry_package");
gtk_widget_set_sensitive (widget, TRUE);
- updates = FALSE;
+ widget = glade_xml_get_widget (glade_xml, "filechooserbutton_exclude");
+ gtk_widget_set_sensitive (widget, TRUE);
+ action = GPK_ACTION_ENUM_PACKAGE;
+}
+
+/**
+ * ggpk_pack_radio_copy_cb:
+ **/
+static void
+ggpk_pack_radio_copy_cb (GtkWidget *widget2, gpointer data)
+{
+ GtkWidget *widget;
+ egg_debug ("got copy");
+ widget = glade_xml_get_widget (glade_xml, "entry_package");
+ gtk_widget_set_sensitive (widget, FALSE);
+ widget = glade_xml_get_widget (glade_xml, "filechooserbutton_exclude");
+ gtk_widget_set_sensitive (widget, FALSE);
+ action = GPK_ACTION_ENUM_COPY;
}
/**
@@ -451,6 +574,8 @@
g_signal_connect (widget, "clicked", G_CALLBACK (ggpk_pack_radio_updates_cb), NULL);
widget = glade_xml_get_widget (glade_xml, "radiobutton_package");
g_signal_connect (widget, "clicked", G_CALLBACK (ggpk_pack_radio_package_cb), NULL);
+ widget = glade_xml_get_widget (glade_xml, "radiobutton_copy");
+ g_signal_connect (widget, "clicked", G_CALLBACK (ggpk_pack_radio_copy_cb), NULL);
widget = glade_xml_get_widget (glade_xml, "button_close");
g_signal_connect_swapped (widget, "clicked", G_CALLBACK (gtk_main_quit), NULL);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]