Improved error handling

This commit is contained in:
Pierre Pronchery 2009-01-09 07:32:37 +00:00
parent b51fbc3868
commit c5f82e1631

View File

@ -56,7 +56,7 @@ typedef struct _Download
/* prototypes */ /* prototypes */
static int _download(Prefs * prefs, char const * url); static int _download(Prefs * prefs, char const * url);
static int _download_error(char const * message, int ret); static int _download_error(Download * download, char const * message, int ret);
static void _download_refresh(Download * download); static void _download_refresh(Download * download);
/* callbacks */ /* callbacks */
@ -82,7 +82,7 @@ static int _download(Prefs * prefs, char const * url)
if(prefs->output == NULL) if(prefs->output == NULL)
prefs->output = basename(url); prefs->output = basename(url);
if(gettimeofday(&download.tv, NULL) != 0) if(gettimeofday(&download.tv, NULL) != 0)
return _download_error("gettimeofday", 1); return _download_error(NULL, "gettimeofday", 1);
download.data_received = 0; download.data_received = 0;
download.window = gtk_window_new(GTK_WINDOW_TOPLEVEL); download.window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_title(GTK_WINDOW(download.window), "Download file"); gtk_window_set_title(GTK_WINDOW(download.window), "Download file");
@ -113,7 +113,7 @@ static int _download(Prefs * prefs, char const * url)
/* download_error */ /* download_error */
static int _download_error(char const * message, int ret) static int _download_error(Download * download, char const * message, int ret)
{ {
GtkWidget * dialog; GtkWidget * dialog;
@ -123,11 +123,13 @@ static int _download_error(char const * message, int ret)
perror(message); perror(message);
return -ret; return -ret;
} }
dialog = gtk_message_dialog_new(NULL, GTK_DIALOG_DESTROY_WITH_PARENT, dialog = gtk_message_dialog_new(download != NULL
GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE, "%s: %s", ? GTK_WINDOW(download->window) : NULL,
message, strerror(errno)); GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_ERROR,
GTK_BUTTONS_CLOSE, "%s: %s", message, strerror(errno));
gtk_window_set_title(GTK_WINDOW(dialog), "Error"); gtk_window_set_title(GTK_WINDOW(dialog), "Error");
gtk_dialog_run(GTK_DIALOG(dialog)); gtk_dialog_run(GTK_DIALOG(dialog));
gtk_widget_destroy(dialog);
return ret; return ret;
} }
@ -312,9 +314,9 @@ static gboolean _download_on_idle(gpointer data)
if((download->fp = fopen(download->prefs->output, "w")) == NULL) if((download->fp = fopen(download->prefs->output, "w")) == NULL)
{ {
/* FIXME really report the error as such */ _download_error(download, download->prefs->output, 0);
gtk_label_set_text(GTK_LABEL(download->status), strerror( /* FIXME cleanup */
errno)); gtk_main_quit();
return FALSE; return FALSE;
} }
download->conn = gnet_conn_http_new(); download->conn = gnet_conn_http_new();