aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorIain Holmes <iain@src.gnome.org>2001-01-16 02:30:18 +0800
committerIain Holmes <iain@src.gnome.org>2001-01-16 02:30:18 +0800
commita1d117a6d05945d18aa698d2ee8978dba43ae9e8 (patch)
tree40a07e4f61339f8318ad1e762ac41e2ed2a77f97
parent378833943737a1cf465fcd1eb369b0c73f38741a (diff)
downloadgsoc2013-evolution-a1d117a6d05945d18aa698d2ee8978dba43ae9e8.tar.gz
gsoc2013-evolution-a1d117a6d05945d18aa698d2ee8978dba43ae9e8.tar.zst
gsoc2013-evolution-a1d117a6d05945d18aa698d2ee8978dba43ae9e8.zip
Fix "Cancel" crash. Cancel on import dialog cancels Automatic now works as
Fix "Cancel" crash. Cancel on import dialog cancels Automatic now works as well svn path=/trunk/; revision=7506
-rw-r--r--shell/importer/importer.c298
1 files changed, 203 insertions, 95 deletions
diff --git a/shell/importer/importer.c b/shell/importer/importer.c
index 2201912fcd..eb911f4672 100644
--- a/shell/importer/importer.c
+++ b/shell/importer/importer.c
@@ -131,6 +131,9 @@ typedef struct _ImporterComponentData {
GtkWidget *contents;
int item;
+
+ gboolean stop;
+ gboolean destroyed;
} ImporterComponentData;
static gboolean importer_timeout_fn (gpointer data);
@@ -145,35 +148,40 @@ import_cb (EvolutionImporterClient *client,
g_warning ("Recieved callback. Result: %d\tmore_items: %s", result,
more_items ? "TRUE" : "FALSE");
- if (result == EVOLUTION_IMPORTER_NOT_READY) {
- /* Importer isn't ready yet. Wait 5 seconds and try again. */
- label = g_strdup_printf (_("Importing %s\nImporter not ready."
- "\nWaiting 5 seconds to retry."),
- icd->filename);
- gtk_label_set_text (GTK_LABEL (icd->contents), label);
- g_free (label);
- while (gtk_events_pending ())
- gtk_main_iteration ();
+ if (icd->stop != TRUE) {
+ if (result == EVOLUTION_IMPORTER_NOT_READY) {
+ /* Importer isn't ready yet.
+ Wait 5 seconds and try again. */
+
+ label = g_strdup_printf (_("Importing %s\nImporter not ready."
+ "\nWaiting 5 seconds to retry."),
+ icd->filename);
+ gtk_label_set_text (GTK_LABEL (icd->contents), label);
+ g_free (label);
+ while (gtk_events_pending ())
+ gtk_main_iteration ();
+
+ gtk_timeout_add (5000, importer_timeout_fn, data);
+ return;
+ }
- gtk_timeout_add (5000, importer_timeout_fn, data);
- return;
- }
-
- if (more_items) {
- label = g_strdup_printf (_("Importing %s\nImporting item %d."),
- icd->filename, ++(icd->item));
- gtk_label_set_text (GTK_LABEL (icd->contents), label);
- g_free (label);
- while (gtk_events_pending ())
- gtk_main_iteration ();
-
- evolution_importer_client_process_item (client, import_cb, data);
- return;
+ if (more_items) {
+ label = g_strdup_printf (_("Importing %s\nImporting item %d."),
+ icd->filename, ++(icd->item));
+ gtk_label_set_text (GTK_LABEL (icd->contents), label);
+ g_free (label);
+ while (gtk_events_pending ())
+ gtk_main_iteration ();
+
+ evolution_importer_client_process_item (client, import_cb, data);
+ return;
+ }
}
g_free (icd->filename);
- gtk_object_unref (GTK_OBJECT (icd->dialog));
+ if (!icd->destroyed)
+ gtk_object_unref (GTK_OBJECT (icd->dialog));
bonobo_object_unref (BONOBO_OBJECT (icd->client));
g_free (icd);
}
@@ -196,87 +204,179 @@ importer_timeout_fn (gpointer data)
}
static void
+dialog_clicked_cb (GnomeDialog *dialog,
+ int button_number,
+ ImporterComponentData *icd)
+{
+ if (button_number != 0)
+ return; /* Interesting... */
+
+ icd->stop = TRUE;
+}
+
+static void
+dialog_destroy_cb (GtkObject *object,
+ ImporterComponentData *icd)
+{
+ icd->stop = TRUE;
+ icd->destroyed = TRUE;
+}
+
+static char *
+get_iid_for_filetype (const char *filename)
+{
+ OAF_ServerInfoList *info_list;
+ CORBA_Environment ev;
+ GList *can_handle = NULL;
+ char *ret_iid;
+ int i, len = 0;
+
+ CORBA_exception_init (&ev);
+ info_list = oaf_query ("repo_ids.has ('IDL:GNOME/Evolution/ImporterFactory:1.0')", NULL, &ev);
+
+ for (i = 0; i < info_list->_length; i++) {
+ CORBA_Environment ev2;
+ CORBA_Object factory;
+ const OAF_ServerInfo *info;
+ char *name = NULL;
+
+ info = info_list->_buffer + i;
+
+ CORBA_exception_init (&ev2);
+ factory = oaf_activate_from_id ((char *) info->iid, 0, NULL, &ev2);
+ if (ev2._major != CORBA_NO_EXCEPTION) {
+ g_warning ("Error activating %s", info->iid);
+ CORBA_exception_free (&ev2);
+ continue;
+ }
+
+ if (GNOME_Evolution_ImporterFactory_supportFormat (factory,
+ filename,
+ &ev2)) {
+ can_handle = g_list_prepend (can_handle,
+ g_strdup (info->iid));
+ len++;
+ }
+
+ bonobo_object_release_unref (factory, &ev2);
+ CORBA_exception_free (&ev2);
+ }
+
+ if (len == 1) {
+ ret_iid = can_handle->data;
+ g_list_free (can_handle);
+ return ret_iid;
+ } else if (len > 1) {
+ /* FIXME: Some way to choose between multiple iids */
+ /* FIXME: Free stuff */
+ ret_iid = can_handle->data;
+ g_list_free (can_handle);
+ return ret_iid;
+ } else {
+ return NULL;
+ }
+}
+
+static void
start_import (const char *filename,
const char *iid)
{
+ CORBA_Object factory, importer;
+ EvolutionImporterClient *client;
+ ImporterComponentData *icd;
+ CORBA_Environment ev;
+ char *label;
+ char *real_iid;
+
if (iid == NULL || strcmp (iid, "Automatic") == 0) {
/* Work out the component to use */
+ real_iid = get_iid_for_filetype (filename);
} else {
- CORBA_Object factory, importer;
- EvolutionImporterClient *client;
- ImporterComponentData *icd;
- CORBA_Environment ev;
- char *label;
-
- icd = g_new (ImporterComponentData, 1);
- icd->dialog = gnome_dialog_new (_("Importing"),
- GNOME_STOCK_BUTTON_CANCEL,
- NULL);
-
- label = g_strdup_printf (_("Importing %s.\nStarting %s"),
- filename, iid);
- icd->contents = gtk_label_new (label);
- g_free (label);
-
- gtk_box_pack_start (GTK_BOX (icd->dialog->vbox), icd->contents,
- TRUE, TRUE, 0);
- gtk_widget_show_all (GTK_WIDGET (icd->dialog));
- while (gtk_events_pending ())
- gtk_main_iteration ();
+ real_iid = g_strdup (iid);
+ }
- CORBA_exception_init (&ev);
- factory = oaf_activate_from_id ((char *) iid, 0, NULL, &ev);
- if (ev._major != CORBA_NO_EXCEPTION) {
- label = g_strdup_printf (_("Importing %s\n"
- "Cannot activate %s."),
- filename, iid);
- gtk_label_set_text (GTK_LABEL (icd->contents), label);
- g_free (label);
- while (gtk_events_pending ())
- gtk_main_iteration ();
+ g_print ("Importing with: %s\n", real_iid);
- g_free (icd);
- return;
- }
-
- importer = GNOME_Evolution_ImporterFactory_loadFile (factory,
- filename,
- &ev);
- if (ev._major != CORBA_NO_EXCEPTION) {
- CORBA_Environment ev2;
-
- label = g_strdup_printf (_("Unable to load %s.\n%s"),
- filename, CORBA_exception_id (&ev));
-
- gtk_label_set_text (GTK_LABEL (icd->contents), label);
- g_free (label);
- while (gtk_events_pending ())
- gtk_main_iteration ();
+ if (real_iid == NULL)
+ return;
- g_free (icd);
- CORBA_exception_init (&ev2);
- CORBA_Object_release (factory, &ev2);
- CORBA_exception_free (&ev2);
- return;
- }
+ icd = g_new (ImporterComponentData, 1);
+ icd->stop = FALSE;
+ icd->destroyed = FALSE;
+ icd->dialog = gnome_dialog_new (_("Importing"),
+ GNOME_STOCK_BUTTON_CANCEL,
+ NULL);
+ gtk_signal_connect (GTK_OBJECT (icd->dialog), "clicked",
+ GTK_SIGNAL_FUNC (dialog_clicked_cb), icd);
+ gtk_signal_connect (GTK_OBJECT (icd->dialog), "destroy",
+ GTK_SIGNAL_FUNC (dialog_destroy_cb), icd);
+
+ label = g_strdup_printf (_("Importing %s.\nStarting %s"),
+ filename, real_iid);
+ icd->contents = gtk_label_new (label);
+ g_free (label);
+
+ gtk_box_pack_start (GTK_BOX (icd->dialog->vbox), icd->contents,
+ TRUE, TRUE, 0);
+ gtk_widget_show_all (GTK_WIDGET (icd->dialog));
+ while (gtk_events_pending ())
+ gtk_main_iteration ();
+
+ CORBA_exception_init (&ev);
+ factory = oaf_activate_from_id ((char *) real_iid, 0, NULL, &ev);
+ if (ev._major != CORBA_NO_EXCEPTION) {
+ label = g_strdup_printf (_("Importing %s\n"
+ "Cannot activate %s."),
+ filename, real_iid);
+ gtk_label_set_text (GTK_LABEL (icd->contents), label);
+ g_free (label);
+ while (gtk_events_pending ())
+ gtk_main_iteration ();
+
+ g_free (icd);
+ g_free (real_iid);
+ return;
+ }
+
+ importer = GNOME_Evolution_ImporterFactory_loadFile (factory,
+ filename,
+ &ev);
+ if (ev._major != CORBA_NO_EXCEPTION) {
+ CORBA_Environment ev2;
+
+ label = g_strdup_printf (_("Unable to load %s.\n%s"),
+ filename, CORBA_exception_id (&ev));
- CORBA_Object_release (factory, &ev);
- CORBA_exception_free (&ev);
-
- client = evolution_importer_client_new (importer);
- icd->client = client;
- icd->filename = g_strdup (filename);
- icd->item = 1;
-
- label = g_strdup_printf (_("Importing %s\nImporting item 1."),
- filename);
gtk_label_set_text (GTK_LABEL (icd->contents), label);
g_free (label);
while (gtk_events_pending ())
gtk_main_iteration ();
-
- evolution_importer_client_process_item (client, import_cb, icd);
+
+ g_free (icd);
+ g_free (real_iid);
+ CORBA_exception_init (&ev2);
+ CORBA_Object_release (factory, &ev2);
+ CORBA_exception_free (&ev2);
+ return;
}
+
+ CORBA_Object_release (factory, &ev);
+ CORBA_exception_free (&ev);
+
+ client = evolution_importer_client_new (importer);
+ icd->client = client;
+ icd->filename = g_strdup (filename);
+ icd->item = 1;
+
+ label = g_strdup_printf (_("Importing %s\nImporting item 1."),
+ filename);
+ gtk_label_set_text (GTK_LABEL (icd->contents), label);
+ g_free (label);
+ while (gtk_events_pending ())
+ gtk_main_iteration ();
+
+ evolution_importer_client_process_item (client, import_cb, icd);
+ g_free (real_iid);
}
static void
@@ -424,8 +524,14 @@ static void
import_druid_cancel (GnomeDruid *druid,
ImportData *data)
{
+ gtk_widget_destroy (GTK_WIDGET (data->dialog));
+}
+
+static void
+import_druid_destroy (GtkObject *object,
+ ImportData *data)
+{
gtk_object_unref (GTK_OBJECT (data->wizard));
- gtk_widget_destroy (GTK_WIDGET (data->dialog));
g_free (data->choosen_iid);
g_free (data);
}
@@ -436,14 +542,16 @@ import_druid_finish (GnomeDruidPage *page,
ImportData *data)
{
char *filename;
+ char *iid;
filename = g_strdup (gtk_entry_get_text (GTK_ENTRY (gnome_file_entry_gtk_entry (GNOME_FILE_ENTRY (data->filepage->filename)))));
- g_print ("You have selected %s to be imported with %s\n", filename,
- data->choosen_iid);
- start_import (filename, data->choosen_iid);
+ iid = g_strdup (data->choosen_iid);
gtk_widget_destroy (data->dialog);
+ start_import (filename, iid);
+
g_free (filename);
+ g_free (iid);
}
static gboolean
@@ -501,7 +609,7 @@ show_import_wizard (void)
gtk_signal_connect (GTK_OBJECT (finish), "finish",
GTK_SIGNAL_FUNC (import_druid_finish), data);
gtk_signal_connect (GTK_OBJECT (data->dialog), "destroy",
- GTK_SIGNAL_FUNC (import_druid_cancel), data);
+ GTK_SIGNAL_FUNC (import_druid_destroy), data);
gtk_widget_show_all (data->dialog);
}