summaryrefslogtreecommitdiff
path: root/components/services/install/lib/eazel-install-object.c
diff options
context:
space:
mode:
Diffstat (limited to 'components/services/install/lib/eazel-install-object.c')
-rw-r--r--components/services/install/lib/eazel-install-object.c226
1 files changed, 200 insertions, 26 deletions
diff --git a/components/services/install/lib/eazel-install-object.c b/components/services/install/lib/eazel-install-object.c
index c914de236..f5d874bd4 100644
--- a/components/services/install/lib/eazel-install-object.c
+++ b/components/services/install/lib/eazel-install-object.c
@@ -64,6 +64,7 @@ enum {
DOWNLOAD_PROGRESS,
PREFLIGHT_CHECK,
INSTALL_PROGRESS,
+ UNINSTALL_PROGRESS,
DOWNLOAD_FAILED,
MD5_CHECK_FAILED,
INSTALL_FAILED,
@@ -123,6 +124,9 @@ void eazel_install_emit_feature_consistency_check_default (EazelInstall *service
void eazel_install_emit_install_progress_default (EazelInstall *service,
const PackageData *pack,
int, int, int, int, int, int);
+void eazel_install_emit_uninstall_progress_default (EazelInstall *service,
+ const PackageData *pack,
+ int, int, int, int, int, int);
void eazel_install_emit_download_progress_default (EazelInstall *service,
const PackageData *package,
int amount,
@@ -200,6 +204,7 @@ eazel_install_finalize (GtkObject *object)
g_list_free (service->private->root_dirs);
g_list_free (service->private->transaction);
+ g_list_free (service->private->failed_packages);
g_free (service->private->transaction_dir);
g_free (service->private->cur_root);
@@ -235,13 +240,19 @@ eazel_install_start_signal (EazelPackageSystem *system,
service->private->infoblock[2]++;
switch (op) {
case EAZEL_PACKAGE_SYSTEM_OPERATION_INSTALL:
- case EAZEL_PACKAGE_SYSTEM_OPERATION_UNINSTALL:
eazel_install_emit_install_progress (service,
pack,
service->private->infoblock[2], service->private->infoblock[3],
0, pack->bytesize,
service->private->infoblock[4], service->private->infoblock[5]);
break;
+ case EAZEL_PACKAGE_SYSTEM_OPERATION_UNINSTALL:
+ eazel_install_emit_uninstall_progress (service,
+ pack,
+ service->private->infoblock[2], service->private->infoblock[3],
+ 0, pack->bytesize,
+ service->private->infoblock[4], service->private->infoblock[5]);
+ break;
default:
break;
}
@@ -256,16 +267,29 @@ eazel_install_end_signal (EazelPackageSystem *system,
{
switch (op) {
case EAZEL_PACKAGE_SYSTEM_OPERATION_INSTALL:
- case EAZEL_PACKAGE_SYSTEM_OPERATION_UNINSTALL:
eazel_install_emit_install_progress (service,
pack,
service->private->infoblock[2], service->private->infoblock[3],
pack->bytesize, pack->bytesize,
service->private->infoblock[4], service->private->infoblock[5]);
break;
+ case EAZEL_PACKAGE_SYSTEM_OPERATION_UNINSTALL:
+ eazel_install_emit_uninstall_progress (service,
+ pack,
+ service->private->infoblock[2], service->private->infoblock[3],
+ pack->bytesize, pack->bytesize,
+ service->private->infoblock[4], service->private->infoblock[5]);
+ break;
default:
break;
}
+ if (pack->toplevel) {
+ if (g_list_find (service->private->failed_packages, (PackageData*)pack) == NULL) {
+ g_message ("Adding %s to transaction", pack->name);
+ service->private->transaction = g_list_prepend (service->private->transaction,
+ (PackageData*)pack);
+ }
+ }
return TRUE;
}
@@ -280,13 +304,19 @@ eazel_install_progress_signal (EazelPackageSystem *system,
if ((info[0] != 0) && (info[0] != info[1])) {
switch (op) {
case EAZEL_PACKAGE_SYSTEM_OPERATION_INSTALL:
- case EAZEL_PACKAGE_SYSTEM_OPERATION_UNINSTALL:
eazel_install_emit_install_progress (service,
pack,
service->private->infoblock[2], service->private->infoblock[3],
info[0], pack->bytesize,
info[4], info[5]);
break;
+ case EAZEL_PACKAGE_SYSTEM_OPERATION_UNINSTALL:
+ eazel_install_emit_uninstall_progress (service,
+ pack,
+ service->private->infoblock[2], service->private->infoblock[3],
+ info[0], pack->bytesize,
+ info[4], info[5]);
+ break;
default:
break;
}
@@ -301,6 +331,10 @@ eazel_install_failed_signal (EazelPackageSystem *system,
EazelInstall *service)
{
trilobite_debug ("*** %s failed", pack->name);
+
+ service->private->failed_packages = g_list_prepend (service->private->failed_packages,
+ (PackageData*)pack);
+
if (pack->toplevel) {
trilobite_debug ("emiting failed for %s", pack->name);
if (op==EAZEL_PACKAGE_SYSTEM_OPERATION_INSTALL) {
@@ -461,6 +495,15 @@ eazel_install_class_initialize (EazelInstallClass *klass)
GTK_TYPE_NONE, 7, GTK_TYPE_POINTER,
GTK_TYPE_INT, GTK_TYPE_INT, GTK_TYPE_INT,
GTK_TYPE_INT, GTK_TYPE_INT, GTK_TYPE_INT);
+ signals[UNINSTALL_PROGRESS] =
+ gtk_signal_new ("uninstall_progress",
+ GTK_RUN_LAST,
+ object_class->type,
+ GTK_SIGNAL_OFFSET (EazelInstallClass, uninstall_progress),
+ eazel_install_gtk_marshal_NONE__POINTER_INT_INT_INT_INT_INT_INT,
+ GTK_TYPE_NONE, 7, GTK_TYPE_POINTER,
+ GTK_TYPE_INT, GTK_TYPE_INT, GTK_TYPE_INT,
+ GTK_TYPE_INT, GTK_TYPE_INT, GTK_TYPE_INT);
signals[DOWNLOAD_FAILED] =
gtk_signal_new ("download_failed",
GTK_RUN_LAST,
@@ -510,6 +553,7 @@ eazel_install_class_initialize (EazelInstallClass *klass)
klass->file_uniqueness_check = NULL;
klass->feature_consistency_check = NULL;
klass->install_progress = NULL;
+ klass->uninstall_progress = NULL;
klass->download_progress = NULL;
klass->download_failed = NULL;
klass->md5_check_failed = NULL;
@@ -522,6 +566,7 @@ eazel_install_class_initialize (EazelInstallClass *klass)
klass->file_uniqueness_check = eazel_install_emit_file_uniqueness_check_default;
klass->feature_consistency_check = eazel_install_emit_feature_consistency_check_default;
klass->install_progress = eazel_install_emit_install_progress_default;
+ klass->uninstall_progress = eazel_install_emit_uninstall_progress_default;
klass->download_progress = eazel_install_emit_download_progress_default;
klass->download_failed = eazel_install_emit_download_failed_default;
klass->md5_check_failed = eazel_install_emit_md5_check_failed_default;
@@ -666,6 +711,7 @@ eazel_install_initialize (EazelInstall *service) {
(GCompareFunc)g_str_equal);
service->private->downloaded_files = NULL;
service->private->transaction = NULL;
+ service->private->failed_packages = NULL;
service->private->revert = FALSE;
service->private->ssl_rename = FALSE;
service->private->ignore_file_conflicts = FALSE;
@@ -687,7 +733,7 @@ eazel_install_initialize (EazelInstall *service) {
char *tmp = NULL;
#ifndef EAZEL_INSTALL_SLIM
- tmp = g_strdup_printf ("%s/.nautilus/rpmdb/", g_get_home_dir ());
+ tmp = g_strdup_printf ("%s/.nautilus/packagedb/", g_get_home_dir ());
list = g_list_prepend (list, g_strdup (g_get_home_dir ()));
list = g_list_prepend (list, tmp);
#else
@@ -1158,7 +1204,6 @@ eazel_install_install_packages (EazelInstall *service,
g_warning (_("Install failed"));
}
- eazel_install_unlock_tmp_dir (service);
trilobite_debug ("service->private->downloaded_files = 0x%p",
(unsigned int)service->private->downloaded_files);
@@ -1199,15 +1244,7 @@ eazel_install_uninstall_packages (EazelInstall *service, GList *categories, cons
eazel_install_fetch_remote_package_list (service);
}
-/*
- FIXME: bugzilla.eazel.com 5752
- if (eazel_install_get_ei2 (service)) {
- result = uninstall_packages (service, categories);
- } else {
- result = ei_uninstall_packages (service, categories);
- }
-*/
- result = ei_uninstall_packages (service, categories);
+ result = uninstall_packages (service, categories);
if (result == EAZEL_INSTALL_NOTHING) {
g_warning (_("Uninstall failed"));
@@ -1232,17 +1269,7 @@ eazel_install_revert_transaction_from_xmlstring (EazelInstall *service,
service->private->revert = TRUE;
if (create_temporary_directory (service)) {
-
-/*
- FIXME: bugzilla.eazel.com 5753
- if (eazel_install_get_ei2 (service)) {
- result = revert_transaction (service, packages);
- } else {
- result = ei_revert_transaction (service, packages);
- }
-*/
- result = ei_revert_transaction (service, packages);
- eazel_install_unlock_tmp_dir (service);
+ result = revert_transaction (service, packages);
} else {
result = EAZEL_INSTALL_NOTHING;
}
@@ -1293,6 +1320,110 @@ eazel_install_add_repository (EazelInstall *service, const char *dir)
service->private->local_repositories = g_list_prepend (service->private->local_repositories, g_strdup (dir));
}
+static void
+eazel_install_do_transaction_save_report_helper (xmlNodePtr node,
+ GList *packages)
+{
+ GList *iterator;
+
+ for (iterator = packages; iterator; iterator = g_list_next (iterator)) {
+ PackageData *pack;
+ char *tmp;
+ pack = (PackageData*)iterator->data;
+ switch (pack->modify_status) {
+ case PACKAGE_MOD_INSTALLED:
+ tmp = g_strdup_printf ("Installed %s", pack->name);
+ xmlNewChild (node, NULL, "DESCRIPTION", tmp);
+ g_free (tmp);
+ break;
+ case PACKAGE_MOD_UNINSTALLED:
+ tmp = g_strdup_printf ("Uninstalled %s", pack->name);
+ xmlNewChild (node, NULL, "DESCRIPTION", tmp);
+ g_free (tmp);
+ break;
+ default:
+ break;
+ }
+ if (pack->modifies) {
+ eazel_install_do_transaction_save_report_helper (node, pack->modifies);
+ }
+ }
+}
+
+void
+eazel_install_save_transaction_report (EazelInstall *service)
+{
+ FILE *outfile;
+ xmlDocPtr doc;
+ xmlNodePtr node, root;
+ char *name = NULL;
+
+ if (eazel_install_get_transaction_dir (service) == NULL) {
+ g_warning ("Transaction directory not set, not storing transaction report");
+ }
+
+ /* Ensure the transaction dir is present */
+ if (! g_file_test (eazel_install_get_transaction_dir (service), G_FILE_TEST_ISDIR)) {
+ int retval;
+ retval = mkdir (eazel_install_get_transaction_dir (service), 0755);
+ if (retval < 0) {
+ if (errno != EEXIST) {
+ g_warning (_("Could not create transaction directory (%s)! ***\n"),
+ eazel_install_get_transaction_dir (service));
+ return;
+ }
+ }
+ }
+
+ /* Create xml */
+ doc = xmlNewDoc ("1.0");
+ root = node = xmlNewNode (NULL, "TRANSACTION");
+ xmlDocSetRootElement (doc, node);
+
+ /* Make a unique name */
+ name = g_strdup_printf ("%s/transaction.%lu", eazel_install_get_transaction_dir (service),
+ (unsigned long) time (NULL));
+ while (g_file_test (name, G_FILE_TEST_ISFILE)) {
+ g_free (name);
+ sleep (1);
+ name = g_strdup_printf ("%s/transaction.%lu",
+ eazel_install_get_transaction_dir (service),
+ (unsigned long) time (NULL));
+ }
+
+ trilobite_debug (_("Writing transaction to %s"), name);
+
+ /* Open and save */
+ outfile = fopen (name, "w");
+ xmlAddChild (root, eazel_install_packagelist_to_xml (service->private->transaction, FALSE));
+ node = xmlAddChild (node, xmlNewNode (NULL, "DESCRIPTIONS"));
+
+ {
+ char *tmp;
+ tmp = g_strdup_printf ("%lu", (unsigned long) time (NULL));
+ xmlNewChild (node, NULL, "DATE", tmp);
+ g_free (tmp);
+ }
+
+ eazel_install_do_transaction_save_report_helper (node, service->private->transaction);
+
+ xmlDocDump (outfile, doc);
+
+ fclose (outfile);
+ g_free (name);
+}
+
+void
+eazel_install_init_transaction (EazelInstall *service)
+{
+ /* Null the list of files met in the transaction */
+ g_list_free (service->private->transaction);
+ service->private->transaction = NULL;
+
+ /* Null the list of files met in the transaction */
+ g_list_free (service->private->transaction);
+ service->private->transaction = NULL;
+}
/************************************************
Signal emitters and default handlers.
@@ -1428,13 +1559,56 @@ eazel_install_emit_install_progress_default (EazelInstall *service,
}
void
+eazel_install_emit_uninstall_progress (EazelInstall *service,
+ const PackageData *pack,
+ int package_num, int num_packages,
+ int package_size_completed, int package_size_total,
+ int total_size_completed, int total_size)
+{
+ EAZEL_INSTALL_SANITY(service);
+ gtk_signal_emit (GTK_OBJECT (service), signals[UNINSTALL_PROGRESS],
+ pack,
+ package_num, num_packages,
+ package_size_completed, package_size_total,
+ total_size_completed, total_size);
+
+}
+
+void
+eazel_install_emit_uninstall_progress_default (EazelInstall *service,
+ const PackageData *pack,
+ int package_num, int num_packages,
+ int package_size_completed, int package_size_total,
+ int total_size_completed, int total_size)
+{
+#ifndef EAZEL_INSTALL_NO_CORBA
+ CORBA_Environment ev;
+ CORBA_exception_init (&ev);
+ EAZEL_INSTALL_SANITY(service);
+
+ if (service->callback != CORBA_OBJECT_NIL) {
+ GNOME_Trilobite_Eazel_PackageDataStruct *package;
+ package = corba_packagedatastruct_from_packagedata (pack);
+ GNOME_Trilobite_Eazel_InstallCallback_uninstall_progress (service->callback,
+ package,
+ package_num, num_packages,
+ package_size_completed, package_size_total,
+ total_size_completed, total_size,
+ &ev);
+ CORBA_free (package);
+ }
+ CORBA_exception_free (&ev);
+#endif /* EAZEL_INSTALL_NO_CORBA */
+}
+
+void
eazel_install_emit_download_progress (EazelInstall *service,
const PackageData *pack,
int amount,
int total)
{
EAZEL_INSTALL_SANITY(service);
- gtk_signal_emit (GTK_OBJECT (service), signals[DOWNLOAD_PROGRESS], pack, amount, total);
+ //gtk_signal_emit (GTK_OBJECT (service), signals[DOWNLOAD_PROGRESS], pack, amount, total);
}
void