Fix the Pine and Netscape importers. Give them a nice progress reporting GUI.

Revert Jason's changes so that creating a folder works again.

svn path=/trunk/; revision=12536
This commit is contained in:
Iain Holmes
2001-08-30 23:21:56 +00:00
parent d158799106
commit 553de94865
9 changed files with 249 additions and 53 deletions

View File

@ -1,3 +1,9 @@
2001-08-30 Iain Holmes <iain@ximian.com>
* pine-importer.c (create_importer_gui): Add a messagebox.
(importer_cb): Update GUI
(pine_import_file): Upidate gui.
2001-08-29 Iain Holmes <iain@ximian.com>
* netscape-importer.c (importer_cb): Handle the case if the importer

View File

@ -76,16 +76,40 @@ typedef struct {
EBook *book;
Bonobo_ConfigDatabase db;
/* GUI */
GtkWidget *dialog;
GtkWidget *label;
GtkWidget *progressbar;
} PineImporter;
typedef struct {
char *parent;
char *foldername;
char *path;
gboolean folder;
} PineFolder;
static void import_next (PineImporter *importer);
static GtkWidget *
create_importer_gui (PineImporter *importer)
{
GtkWidget *dialog;
dialog = gnome_message_box_new (_("Evolution is importer your old Pine data"), GNOME_MESSAGE_BOX_INFO, NULL);
gtk_window_set_title (GTK_WINDOW (dialog), _("Importing..."));
importer->label = gtk_label_new (_("Please wait"));
importer->progressbar = gtk_progress_bar_new ();
gtk_progress_set_activity_mode (GTK_PROGRESS (importer->progressbar), TRUE);
gtk_box_pack_start (GTK_BOX (GNOME_DIALOG (dialog)->vbox),
importer->label, FALSE, FALSE, 0);
gtk_box_pack_start (GTK_BOX (GNOME_DIALOG (dialog)->vbox),
importer->progressbar, FALSE, FALSE, 0);
return dialog;
}
static void
pine_store_settings (PineImporter *importer)
{
@ -364,6 +388,16 @@ importer_cb (EvolutionImporterListener *listener,
}
if (more_items) {
GtkAdjustment *adj;
float newval;
adj = GTK_PROGRESS (importer->progressbar)->adjustment;
newval = adj->value + 1;
if (newval > adj->upper) {
newval = adj->lower;
}
gtk_progress_set_value (GTK_PROGRESS (importer->progressbar), newval);
CORBA_exception_init (&ev);
objref = bonobo_object_corba_objref (BONOBO_OBJECT (importer->listener));
GNOME_Evolution_Importer_processItem (importer->importer,
@ -391,13 +425,22 @@ importer_cb (EvolutionImporterListener *listener,
static gboolean
pine_import_file (PineImporter *importer,
const char *path,
const char *folderpath)
const char *folderpath,
gboolean folder)
{
CORBA_boolean result;
CORBA_Environment ev;
CORBA_Object objref;
char *str;
CORBA_exception_init (&ev);
str = g_strdup_printf (_("Importing %s as %s"), path, folderpath);
gtk_label_set_text (GTK_LABEL (importer->label), str);
g_free (str);
while (gtk_events_pending ()) {
gtk_main_iteration ();
}
result = GNOME_Evolution_Importer_loadFile (importer->importer, path,
folderpath, &ev);
if (ev._major != CORBA_NO_EXCEPTION || result == FALSE) {
@ -467,7 +510,24 @@ import_next (PineImporter *importer)
data = importer->dir_list->data;
folder = g_concat_dir_and_file (data->parent, data->foldername);
pine_import_file (importer, data->path, folder);
#if 0
while (pine_import_file (importer, data->path, folder, data->folder) == FALSE) {
g_free (folder);
g_free (data->parent);
g_free (data->path);
g_free (data->foldername);
g_free (data);
importer->dir_list = importer->dir_list->next;
if (importer->dir_list == NULL) {
break;
}
data = importer->dir_list->data;
folder = g_concat_dir_and_file (data->parent, data->foldername);
}
#endif
pine_import_file (importer, data->path, folder, data->folder);
g_free (folder);
g_free (data->parent);
g_free (data->path);
@ -499,6 +559,7 @@ scan_dir (PineImporter *importer,
DIR *maildir;
struct stat buf;
struct dirent *current;
char *str;
maildir = opendir (dirname);
if (maildir == NULL) {
@ -507,6 +568,14 @@ scan_dir (PineImporter *importer,
return;
}
str = g_strdup_printf (_("Scanning %s"), dirname);
gtk_label_set_text (GTK_LABEL (importer->label), str);
g_free (str);
while (gtk_events_pending ()) {
gtk_main_iteration ();
}
current = readdir (maildir);
while (current) {
PineFolder *pf;
@ -541,15 +610,17 @@ scan_dir (PineImporter *importer,
pf->path = g_strdup (fullname);
pf->parent = g_strdup (orig_parent);
pf->foldername = g_strdup (foldername);
pf->folder = FALSE;
importer->dir_list = g_list_append (importer->dir_list, pf);
} else if (S_ISDIR (buf.st_mode)) {
char *subdir;
pf = g_new (PineFolder, 1);
pf->path = NULL;
pf->path = g_strdup (fullname);
pf->parent = g_strdup (orig_parent);
pf->foldername = g_strdup (foldername);
/* importer->dir_list = g_list_append (importer->dir_list, pf); */
pf->folder = TRUE;
importer->dir_list = g_list_append (importer->dir_list, pf);
subdir = g_concat_dir_and_file (orig_parent, foldername);
scan_dir (importer, fullname, subdir);
@ -573,6 +644,13 @@ pine_create_structure (EvolutionIntelligentImporter *ii,
bonobo_object_ref (BONOBO_OBJECT (ii));
pine_store_settings (importer);
/* Create a dialog */
importer->dialog = create_importer_gui (importer);
gtk_widget_show_all (importer->dialog);
while (gtk_events_pending ()) {
gtk_main_iteration ();
}
if (importer->do_address == TRUE) {
bonobo_config_set_boolean (importer->db,
"/Importer/Pine/address-imported", TRUE, NULL);
@ -585,6 +663,12 @@ pine_create_structure (EvolutionIntelligentImporter *ii,
"/Importer/Pine/mail-imported", TRUE, NULL);
maildir = gnome_util_prepend_user_home ("mail");
gtk_label_set_text (GTK_LABEL (importer->label),
_("Scanning directory"));
while (gtk_events_pending ()) {
gtk_main_iteration ();
}
scan_dir (importer, maildir, "/");
g_free (maildir);

View File

@ -1,3 +1,18 @@
2001-08-30 Iain Holmes <iain@ximian.com>
* importer/evolution-mbox-importer.c: (load_file_fn): Check if it's a
folder, if so, create a folder.
(process_item_fn): If it was a folder created, just finish up importing
2001-08-29 Iain Holmes <iain@ximian.com>
* importers/evolution-mbox-importer.c: Turn off debugging, remove
spewage.
(process_item_fn): Notify the importer if the folder isn't opened or
created yet.
(load_file_fn): Allow the function to continue if the folder is being
created.
2001-08-30 Peter Williams <peterw@ximian.com>
Due to the introduction of mail_folder_cache_remove(), we can no

View File

@ -183,11 +183,12 @@ create_folder_done (char *uri, CamelFolder *folder, void *data)
GNOME_Evolution_ShellComponentListener_Result result;
CORBA_Environment ev;
if (folder)
if (folder) {
result = GNOME_Evolution_ShellComponentListener_OK;
else
} else {
result = GNOME_Evolution_ShellComponentListener_INVALID_URI;
}
CORBA_exception_init (&ev);
GNOME_Evolution_ShellComponentListener_notifyResult (listener, result, &ev);
CORBA_Object_release (listener, &ev);

View File

@ -43,7 +43,7 @@
#include "e-util/e-path.h"
#define IMPORTER_DEBUG
/* #define IMPORTER_DEBUG */
#ifdef IMPORTER_DEBUG
#define IN g_print ("=====> %s (%d)\n", __FUNCTION__, __LINE__)
#define OUT g_print ("<==== %s (%d)\n", __FUNCTION__, __LINE__)
@ -60,6 +60,7 @@ typedef struct {
char *filename;
int num;
CamelMimeParser *mp;
gboolean is_folder;
} MboxImporter;
void mail_importer_module_init (void);
@ -77,6 +78,20 @@ process_item_fn (EvolutionImporter *eimporter,
gboolean done = FALSE;
CamelException *ex;
if (importer->folder == NULL) {
GNOME_Evolution_ImporterListener_notifyResult (listener,
GNOME_Evolution_ImporterListener_NOT_READY,
TRUE, ev);
return;
}
if (mbi->is_folder == TRUE) {
GNOME_Evolution_ImporterListener_notifyResult (listener,
GNOME_Evolution_ImporterListener_OK,
FALSE, ev);
return;
}
ex = camel_exception_new ();
if (camel_mime_parser_step (mbi->mp, 0, 0) == HSCAN_FROM) {
/* Import the next message */
@ -117,7 +132,6 @@ process_item_fn (EvolutionImporter *eimporter,
}
camel_exception_free (ex);
g_print ("Notifying...\n");
GNOME_Evolution_ImporterListener_notifyResult (listener,
GNOME_Evolution_ImporterListener_OK,
!done, ev);
@ -200,7 +214,6 @@ folder_created_cb (BonoboListener *listener,
return;
}
g_warning ("%s created", fullpath);
g_free (fullpath);
bonobo_object_unref (BONOBO_OBJECT (listener));
}
@ -213,9 +226,10 @@ load_file_fn (EvolutionImporter *eimporter,
{
MboxImporter *mbi;
MailImporter *importer;
gboolean delayed = FALSE;
struct stat buf;
int fd;
g_warning ("%s", __FUNCTION__);
mbi = (MboxImporter *) closure;
importer = (MailImporter *) mbi;
@ -227,11 +241,17 @@ load_file_fn (EvolutionImporter *eimporter,
return FALSE;
}
mbi->mp = camel_mime_parser_new ();
camel_mime_parser_scan_from (mbi->mp, TRUE);
if (camel_mime_parser_init_with_fd (mbi->mp, fd) == -1) {
g_warning ("Unable to process spool folder");
goto fail;
fstat (fd, &buf);
if (S_ISREG (buf.st_mode)) {
mbi->mp = camel_mime_parser_new ();
camel_mime_parser_scan_from (mbi->mp, TRUE);
if (camel_mime_parser_init_with_fd (mbi->mp, fd) == -1) {
g_warning ("Unable to process spool folder");
goto fail;
}
mbi->is_folder = FALSE;
} else {
mbi->is_folder = TRUE;
}
importer->mstream = NULL;
@ -268,21 +288,26 @@ load_file_fn (EvolutionImporter *eimporter,
importer);
mail_importer_create_folder (parent, name, NULL, listener);
camel_exception_free (ex);
ex = camel_exception_new ();
importer->folder = mail_tool_uri_to_folder (fullpath, ex);
delayed = TRUE;
g_free (parent);
}
camel_exception_free (ex);
g_free (fullpath);
}
if (importer->folder == NULL){
if (importer->folder == NULL && delayed == FALSE){
g_print ("Bad folder\n");
goto fail;
}
camel_folder_freeze (importer->folder);
importer->frozen = TRUE;
if (importer->folder != NULL) {
camel_folder_freeze (importer->folder);
importer->frozen = TRUE;
}
g_warning ("Okay, so everything is now ready to import that mbox file!");
return TRUE;
fail:

View File

@ -84,8 +84,10 @@ mail_importer_create_folder (const char *parent_path,
parent_path);
corba_listener = bonobo_object_corba_objref (BONOBO_OBJECT (listener));
/* Darn CORBA wanting non-NULL values for strings */
real_description = CORBA_string_dup (description ? description : "");
CORBA_exception_init (&ev);
GNOME_Evolution_Storage_asyncCreateFolder (local_storage,

View File

@ -1,3 +1,21 @@
2001-08-29 Iain Holmes <iain@ximian.com>
* e-local-storage.c (notify_listener): Function to create CORBAany
and notify listeners.
(component_async_create_folder_callback): Notify the listener again.
(create_folder): Handle the Bonobo_Listener again and make it async.
(impl_async_create_folder): Pass CORBA_OBJECT_NIL as the listener.
(bonobo_interface_create_folder_cb): Make async.
* evolution-storage.c (notify_bonobo_listener): Removed this broken
broken function.
(impl_Storage_async_create_folder): Make async, duplicate the listener
instead of notifying it.
(impl_Storage_async_remove_folder): Notify listener by hand.
(e_marshal_NONE__POINTER_POINTER_POINTER_POINTER_POINTER): Return of the
worst signal marshaller in Scotland.
(class_init): Use the above marshaller for the create_folder signal.
2001-08-30 Jeffrey Stedfast <fejj@ximian.com>
* e-shell-folder-creation-dialog.c (entry_name_is_valid): Check

View File

@ -55,6 +55,7 @@
#include "e-local-storage.h"
#include <bonobo/bonobo-exception.h>
#define PARENT_TYPE E_TYPE_STORAGE
static EStorageClass *parent_class = NULL;
@ -215,8 +216,33 @@ load_all_folders (ELocalStorage *local_storage)
/* Callbacks for the async methods invoked on the `Evolution::ShellComponent's. */
static void
notify_listener (const Bonobo_Listener listener,
EStorageResult result,
const char *physical_path)
{
CORBA_any any;
GNOME_Evolution_Storage_FolderResult folder_result;
CORBA_Environment ev;
folder_result.result = result;
folder_result.path = CORBA_string_dup (physical_path ? physical_path : "");
any._type = TC_GNOME_Evolution_Storage_FolderResult;
any._value = &folder_result;
CORBA_exception_init (&ev);
Bonobo_Listener_event (listener, "evolution-shell:folder_created",
&any, &ev);
if (BONOBO_EX (&ev)) {
g_warning ("Exception notifing listener: %s\n",
CORBA_exception_id (&ev));
}
CORBA_exception_free (&ev);
}
struct _AsyncCreateFolderCallbackData {
EStorage *storage;
Bonobo_Listener listener;
char *path;
char *display_name;
@ -266,6 +292,10 @@ component_async_create_folder_callback (EvolutionShellComponentClient *shell_com
bonobo_object_unref (BONOBO_OBJECT (shell_component_client));
if (callback_data->listener != CORBA_OBJECT_NIL)
notify_listener (callback_data->listener, storage_result,
callback_data->physical_path);
if (callback_data->callback != NULL)
(* callback_data->callback) (callback_data->storage,
storage_result,
@ -334,8 +364,9 @@ create_folder_directory (ELocalStorage *local_storage,
return E_STORAGE_OK;
}
static EStorageResult
static void
create_folder (ELocalStorage *local_storage,
const Bonobo_Listener listener,
const char *path,
const char *type,
const char *description,
@ -356,20 +387,24 @@ create_folder (ELocalStorage *local_storage,
component_client = e_folder_type_registry_get_handler_for_type (priv->folder_type_registry,
type);
if (component_client == NULL) {
if (listener != CORBA_OBJECT_NIL)
notify_listener (listener, E_STORAGE_INVALIDTYPE, NULL);
if (callback != NULL)
(* callback) (storage, E_STORAGE_INVALIDTYPE, data);
return E_STORAGE_INVALIDTYPE;
return;
}
g_assert (g_path_is_absolute (path));
result = create_folder_directory (local_storage, path, type, description, &physical_path);
if (result != E_STORAGE_OK) {
g_warning ("physical_path: %s", physical_path);
if (callback != NULL)
(* callback) (storage, result, data);
if (listener != CORBA_OBJECT_NIL)
notify_listener (listener, result, NULL);
g_free (physical_path);
return result;
return;
}
folder_name = g_basename (path);
@ -389,6 +424,7 @@ create_folder (ELocalStorage *local_storage,
callback_data->description = g_strdup (description);
callback_data->physical_uri = physical_uri;
callback_data->physical_path = physical_path;
callback_data->listener = listener;
callback_data->callback = callback;
callback_data->callback_data = data;
@ -399,8 +435,6 @@ create_folder (ELocalStorage *local_storage,
type,
component_async_create_folder_callback,
callback_data);
return result;
}
struct _AsyncRemoveFolderCallbackData {
@ -607,7 +641,7 @@ impl_async_create_folder (EStorage *storage,
local_storage = E_LOCAL_STORAGE (storage);
create_folder (local_storage, path, type, description, callback, data);
create_folder (local_storage, CORBA_OBJECT_NIL, path, type, description, callback, data);
}
@ -887,8 +921,9 @@ impl_async_xfer_folder (EStorage *storage,
/* Callbacks for the `Evolution::Storage' interface we are exposing to the outside world. */
static int
static void
bonobo_interface_create_folder_cb (EvolutionStorage *storage,
const Bonobo_Listener listener,
const char *path,
const char *type,
const char *description,
@ -899,7 +934,7 @@ bonobo_interface_create_folder_cb (EvolutionStorage *storage,
local_storage = E_LOCAL_STORAGE (data);
return create_folder (local_storage, path, type, description, NULL, NULL);
create_folder (local_storage, listener, path, type, description, NULL, NULL);
}
static int

View File

@ -290,23 +290,6 @@ storage_gtk_to_corba_result (EvolutionStorageResult result)
}
}
static void
notify_bonobo_listener (const Bonobo_Listener listener,
EvolutionStorageResult result,
const char *physical_path,
CORBA_Environment *ev)
{
CORBA_any any;
GNOME_Evolution_Storage_FolderResult folder_result;
folder_result.result = storage_gtk_to_corba_result (result);
folder_result.path = CORBA_string_dup (physical_path ? physical_path : "");
any._type = TC_GNOME_Evolution_Storage_FolderResult;
any._value = &folder_result;
Bonobo_Listener_event (listener, "result", &any, ev);
}
static void
impl_Storage_async_create_folder (PortableServer_Servant servant,
const CORBA_char *path,
@ -317,17 +300,15 @@ impl_Storage_async_create_folder (PortableServer_Servant servant,
CORBA_Environment *ev)
{
BonoboObject *bonobo_object;
CORBA_Object obj_dup;
EvolutionStorage *storage;
int int_result;
bonobo_object = bonobo_object_from_servant (servant);
storage = EVOLUTION_STORAGE (bonobo_object);
int_result = GNOME_Evolution_Storage_UNSUPPORTED_OPERATION;
obj_dup = CORBA_Object_duplicate (listener, ev);
gtk_signal_emit (GTK_OBJECT (storage), signals[CREATE_FOLDER],
path, type, description, parent_physical_uri, &int_result);
notify_bonobo_listener (listener, int_result, path, ev);
obj_dup, path, type, description, parent_physical_uri);
}
@ -341,6 +322,8 @@ impl_Storage_async_remove_folder (PortableServer_Servant servant,
BonoboObject *bonobo_object;
EvolutionStorage *storage;
int int_result;
CORBA_any any;
GNOME_Evolution_Storage_Result corba_result;
bonobo_object = bonobo_object_from_servant (servant);
storage = EVOLUTION_STORAGE (bonobo_object);
@ -349,7 +332,11 @@ impl_Storage_async_remove_folder (PortableServer_Servant servant,
gtk_signal_emit (GTK_OBJECT (storage), signals[REMOVE_FOLDER],
path, physical_uri, &int_result);
notify_bonobo_listener (listener, int_result, path, ev);
corba_result = storage_gtk_to_corba_result (int_result);
any._type = TC_GNOME_Evolution_Storage_Result;
any._value = &corba_result;
Bonobo_Listener_event (listener, "result", &any, ev);
}
static void
@ -511,6 +498,29 @@ corba_class_init (void)
vepv->GNOME_Evolution_Storage_epv = evolution_storage_get_epv ();
}
/* The worst signal marshaller in Scotland */
typedef void (*GtkSignal_NONE__POINTER_POINTER_POINTER_POINTER_POINTER) (GtkObject *,
gpointer, gpointer, gpointer, gpointer, gpointer,
gpointer user_data);
static void
e_marshal_NONE__POINTER_POINTER_POINTER_POINTER_POINTER (GtkObject *object,
GtkSignalFunc func,
gpointer func_data,
GtkArg *args)
{
GtkSignal_NONE__POINTER_POINTER_POINTER_POINTER_POINTER rfunc;
rfunc = (GtkSignal_NONE__POINTER_POINTER_POINTER_POINTER_POINTER) func;
(*rfunc) (object,
GTK_VALUE_POINTER (args[0]),
GTK_VALUE_POINTER (args[1]),
GTK_VALUE_POINTER (args[2]),
GTK_VALUE_POINTER (args[3]),
GTK_VALUE_POINTER (args[4]),
func_data);
}
static void
class_init (EvolutionStorageClass *klass)
{
@ -526,7 +536,7 @@ class_init (EvolutionStorageClass *klass)
object_class->type,
GTK_SIGNAL_OFFSET (EvolutionStorageClass,
create_folder),
e_marshal_INT__POINTER_POINTER_POINTER_POINTER,
e_marshal_INT__POINTER_POINTER_POINTER_POINTER_POINTER,
GTK_TYPE_INT, 4,
GTK_TYPE_STRING,
GTK_TYPE_STRING,