diff --git a/src/ghtml-gtkhtml.c b/src/ghtml-gtkhtml.c index bbf82c1..73a8474 100644 --- a/src/ghtml-gtkhtml.c +++ b/src/ghtml-gtkhtml.c @@ -40,6 +40,8 @@ #include "ghtml.h" #include "../config.h" +#define max(a, b) ((a) > (b) ? (a) : (b)) + /* GHtml */ /* private */ @@ -415,6 +417,13 @@ static void _ghtmlconn_delete(GHtmlConn * ghtmlconn) if(ghtmlconn->stream != NULL) html_stream_close(ghtmlconn->stream); free(ghtmlconn); + /* free the connections array if possible */ + for(i = 0; i < ghtml->conns_cnt; i++) + if(ghtml->conns[i] != NULL) + return; + free(ghtml->conns); + ghtml->conns = NULL; + ghtml->conns_cnt = 0; } static void _ghtmlconn_delete_file(GHtmlConn * ghtmlconn) @@ -471,9 +480,13 @@ static gchar * _ghtml_make_url(gchar const * base, gchar const * url) if(url == NULL) return NULL; /* XXX use a more generic protocol finder (strchr(':')) */ + if(strncmp("ftp://", url, 6) == 0) + return g_strdup(url); if(strncmp("http://", url, 7) == 0) return g_strdup(url); - if(strncmp("ftp://", url, 6) == 0) + if(strncmp("https://", url, 8) == 0) + return g_strdup(url); + if(strncmp("mailto:", url, 7) == 0) return g_strdup(url); if(base != NULL) { @@ -739,6 +752,7 @@ static void _http_data_complete(GConnHttpEventData * event, GHtmlConn * conn) { gchar * buf; gsize size; + GHtml * ghtml; if(gnet_conn_http_steal_buffer(conn->http, &buf, &size) != TRUE) { @@ -751,8 +765,10 @@ static void _http_data_complete(GConnHttpEventData * event, GHtmlConn * conn) html_stream_write(conn->stream, buf, size); _http_data_progress(event, conn); } - surfer_set_status(conn->ghtml->surfer, NULL); + ghtml = conn->ghtml; _ghtmlconn_delete(conn); + if(ghtml->conns_cnt == 0) + surfer_set_status(ghtml->surfer, NULL); } static void _http_data_partial(GConnHttpEventData * event, GHtmlConn * conn) @@ -775,8 +791,8 @@ static void _http_data_progress(GConnHttpEventData * event, GHtmlConn * conn) { size_t i; GHtmlConn * p; - guint64 len = 0; - guint64 rec = 0; + guint64 len = 1; /* don't divide by zero */ + guint64 rec = 1; gdouble fraction; conn->data_received = event->data_received; @@ -786,14 +802,12 @@ static void _http_data_progress(GConnHttpEventData * event, GHtmlConn * conn) if((p = conn->ghtml->conns[i]) == NULL || p->content_length == 0) continue; - len += p->content_length; + len += (p->content_length != 0) ? p->content_length + : p->data_received + 1; rec += p->data_received; } - if(len > 0) - { - fraction = rec; - surfer_set_progress(conn->ghtml->surfer, fraction / len); - } + fraction = rec; + surfer_set_progress(conn->ghtml->surfer, fraction / len); } static void _http_error(GConnHttpEventError * event, GHtmlConn * conn) diff --git a/src/surfer.c b/src/surfer.c index ae42204..d36d333 100644 --- a/src/surfer.c +++ b/src/surfer.c @@ -128,7 +128,6 @@ Surfer * surfer_new(char const * url) GtkWidget * toolbar; GtkToolItem * toolitem; GtkWidget * widget; - GtkWidget * hbox; if((surfer = malloc(sizeof(*surfer))) == NULL) return NULL; @@ -217,19 +216,21 @@ Surfer * surfer_new(char const * url) ghtml_load_url(surfer->view, url); gtk_box_pack_start(GTK_BOX(vbox), surfer->view, TRUE, TRUE, 0); /* statusbar */ - hbox = gtk_hbox_new(FALSE, 0); + surfer->statusbox = gtk_hbox_new(FALSE, 0); surfer->progress = gtk_progress_bar_new(); - gtk_box_pack_start(GTK_BOX(hbox), surfer->progress, FALSE, FALSE, 0); + gtk_box_pack_start(GTK_BOX(surfer->statusbox), surfer->progress, FALSE, + FALSE, 0); surfer->statusbar = gtk_statusbar_new(); - surfer->statusbar_id = gtk_statusbar_push(GTK_STATUSBAR( - surfer->statusbar), - gtk_statusbar_get_context_id(GTK_STATUSBAR( - surfer->statusbar), ""), "Ready"); - gtk_box_pack_start(GTK_BOX(hbox), surfer->statusbar, TRUE, TRUE, 0); - gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); + surfer->statusbar_id = 0; + gtk_box_pack_start(GTK_BOX(surfer->statusbox), surfer->statusbar, TRUE, + TRUE, 0); + gtk_widget_show_all(surfer->statusbox); gtk_container_add(GTK_CONTAINER(surfer->window), vbox); gtk_widget_grab_focus(GTK_WIDGET(surfer->tb_path)); gtk_widget_show_all(surfer->window); + /* hack to display the statusbar only if necessary */ + gtk_box_pack_start(GTK_BOX(vbox), surfer->statusbox, FALSE, FALSE, 0); + surfer_set_status(surfer, NULL); surfer_cnt++; return surfer; } @@ -354,6 +355,20 @@ void surfer_set_status(Surfer * surfer, char const * status) surfer->statusbar_id = gtk_statusbar_push(sb, gtk_statusbar_get_context_id(sb, ""), (status != NULL) ? status : "Ready"); + if(status == NULL) + { + gtk_progress_bar_set_text(GTK_PROGRESS_BAR(surfer->progress), + ""); + gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR( + surfer->progress), 0.0); +#ifdef FOR_EMBEDDED + gtk_widget_hide(surfer->statusbox); + } + else + { + gtk_widget_show(surfer->statusbox); +#endif + } } diff --git a/src/surfer.h b/src/surfer.h index 1547a0e..870b647 100644 --- a/src/surfer.h +++ b/src/surfer.h @@ -54,6 +54,7 @@ typedef struct _Surfer GtkWidget * tb_path; GtkWidget * view; GtkWidget * progress; + GtkWidget * statusbox; GtkWidget * statusbar; guint statusbar_id; } Surfer;