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;