From 71580f6f56fe0575d4d8a7b1011cf8fb6055e3c8 Mon Sep 17 00:00:00 2001 From: Pierre Pronchery Date: Mon, 23 Feb 2009 14:47:03 +0000 Subject: [PATCH] Updating the status bar --- src/ghtml-gtkhtml.c | 70 +++++++++++++++++++++++++++++++++++++++++---- src/surfer.c | 14 +++++++++ src/surfer.h | 1 + 3 files changed, 80 insertions(+), 5 deletions(-) diff --git a/src/ghtml-gtkhtml.c b/src/ghtml-gtkhtml.c index 6cd5f34..3d871cb 100644 --- a/src/ghtml-gtkhtml.c +++ b/src/ghtml-gtkhtml.c @@ -13,12 +13,11 @@ * Surfer; if not, write to the Free Software Foundation, Inc., 59 Temple Place, * Suite 330, Boston, MA 02111-1307 USA */ /* TODO: - * - implement http protocol again * - fix URL generation for relative path * - fix links from directory listing - * - progressive file load - * - update the URL and title of the main window + * - update the URL of the main window * - implement selection + * - more meaningful status updates * - need to take care of CSRF? eg remotely load local files */ @@ -365,7 +364,8 @@ static void _ghtmlconn_delete(GHtmlConn * ghtmlconn) static void _ghtmlconn_delete_file(GHtmlConn * ghtmlconn) { - /* FIXME implement */ + if(ghtmlconn->file != NULL) + g_io_channel_unref(ghtmlconn->file); } static void _ghtmlconn_delete_http(GHtmlConn * ghtmlconn) @@ -429,8 +429,12 @@ static gboolean _stream_load_watch_file(GIOChannel * source, static gboolean _stream_load_idle_http(GHtmlConn * conn); static void _stream_load_watch_http(GConnHttp * connhttp, GConnHttpEvent * event, gpointer data); +static void _http_connected(GHtmlConn * conn); static void _http_data_complete(GConnHttpEventData * event, GHtmlConn * conn); static void _http_data_partial(GConnHttpEventData * event, GHtmlConn * conn); +static void _http_error(GConnHttpEventError * event, GHtmlConn * conn); +static void _http_resolved(GConnHttpEventResolved * event, GHtmlConn * conn); +static void _http_timeout(GHtmlConn * conn); static int _ghtml_stream_load(GHtml * ghtml, HtmlStream * stream, gchar const * url) @@ -499,6 +503,7 @@ static gboolean _stream_load_idle_directory(GHtmlConn * conn) html_stream_write(conn->stream, tail, sizeof(tail) - 1); closedir(dir); surfer_set_progress(conn->ghtml->surfer, 1.0); + surfer_set_status(conn->ghtml->surfer, "Ready"); } _ghtmlconn_delete(conn); return FALSE; @@ -511,6 +516,7 @@ static gboolean _stream_load_idle_file(GHtmlConn * conn) GIOChannel * channel; surfer_set_progress(conn->ghtml->surfer, 0.0); + surfer_set_status(conn->ghtml->surfer, "Reading file..."); if((fd = open(conn->url, O_RDONLY)) < 0) { surfer_error(conn->ghtml->surfer, "Not implemented yet", 0); @@ -572,6 +578,7 @@ static gboolean _stream_load_watch_file(GIOChannel * source, static gboolean _stream_load_idle_http(GHtmlConn * conn) { surfer_set_progress(conn->ghtml->surfer, 0.0); + surfer_set_status(conn->ghtml->surfer, "Downloading..."); conn->http = gnet_conn_http_new(); gnet_conn_http_set_uri(conn->http, conn->url); gnet_conn_http_set_user_agent(conn->http, "DeforaOS " PACKAGE); @@ -591,16 +598,32 @@ static void _stream_load_watch_http(GConnHttp * connhttp, return; /* FIXME report error */ switch(event->type) { - /* FIXME implement the other cases */ + /* FIXME implement GNET_CONN_HTTP_REDIRECT */ + case GNET_CONN_HTTP_CONNECTED: + return _http_connected(conn); case GNET_CONN_HTTP_DATA_COMPLETE: return _http_data_complete((GConnHttpEventData*)event, conn); case GNET_CONN_HTTP_DATA_PARTIAL: return _http_data_partial((GConnHttpEventData*)event, conn); + case GNET_CONN_HTTP_ERROR: + return _http_error((GConnHttpEventError*)event, conn); + case GNET_CONN_HTTP_RESOLVED: + return _http_resolved((GConnHttpEventResolved*)event, + conn); + case GNET_CONN_HTTP_RESPONSE: + return; /* we ignore it */ + case GNET_CONN_HTTP_TIMEOUT: + return _http_timeout(conn); } } +static void _http_connected(GHtmlConn * conn) +{ + surfer_set_status(conn->ghtml->surfer, "Connected"); +} + static void _http_data_complete(GConnHttpEventData * event, GHtmlConn * conn) { gchar * buf; @@ -617,6 +640,7 @@ static void _http_data_complete(GConnHttpEventData * event, GHtmlConn * conn) html_stream_write(conn->stream, buf, size); surfer_set_progress(conn->ghtml->surfer, 1.0); } + surfer_set_status(conn->ghtml->surfer, "Ready"); _ghtmlconn_delete(conn); } @@ -626,6 +650,7 @@ static void _http_data_partial(GConnHttpEventData * event, GHtmlConn * conn) gsize size; gdouble fraction; + surfer_set_status(conn->ghtml->surfer, "Downloading..."); if(gnet_conn_http_steal_buffer(conn->http, &buf, &size) != TRUE) { /* FIXME report error */ @@ -641,6 +666,40 @@ static void _http_data_partial(GConnHttpEventData * event, GHtmlConn * conn) } } +static void _http_error(GConnHttpEventError * event, GHtmlConn * conn) +{ + char buf[10]; + + snprintf(buf, sizeof(buf), "%s %u", "Error", event->code); + surfer_error(conn->ghtml->surfer, buf, 0); + surfer_set_progress(conn->ghtml->surfer, 0.0); + surfer_set_status(conn->ghtml->surfer, "Ready"); + _ghtmlconn_delete(conn); +} + +static void _http_resolved(GConnHttpEventResolved * event, GHtmlConn * conn) +{ + char buf[256]; + char * name; + + if((name = gnet_inetaddr_get_name_nonblock(event->ia)) == NULL) + surfer_set_status(conn->ghtml->surfer, "Connecting..."); + else + { + snprintf(buf, sizeof(buf), "%s%s%s%d", "Connecting to ", name, + ":", gnet_inetaddr_get_port(event->ia)); + surfer_set_status(conn->ghtml->surfer, buf); + } +} + +static void _http_timeout(GHtmlConn * conn) +{ + surfer_error(conn->ghtml->surfer, "Timed out", 0); + surfer_set_progress(conn->ghtml->surfer, 0.0); + surfer_set_status(conn->ghtml->surfer, "Ready"); + _ghtmlconn_delete(conn); +} + /* callbacks */ static void _on_link_clicked(HtmlDocument * document, const gchar * url) @@ -704,6 +763,7 @@ static void _on_submit(HtmlDocument * document, const gchar * url, if(strcmp(method, "GET") == 0) _ghtml_document_load(ghtml, url); else if(strcmp(method, "POST") == 0) + /* FIXME really use POST */ _ghtml_document_load(ghtml, url); else { diff --git a/src/surfer.c b/src/surfer.c index 6b3dec9..aaed159 100644 --- a/src/surfer.c +++ b/src/surfer.c @@ -312,6 +312,20 @@ void surfer_set_progress(Surfer * surfer, gdouble fraction) } +/* surfer_set_status */ +void surfer_set_status(Surfer * surfer, char const * status) +{ + GtkStatusbar * sb; + + sb = GTK_STATUSBAR(surfer->statusbar); + if(surfer->statusbar_id != 0) + gtk_statusbar_remove(sb, gtk_statusbar_get_context_id(sb, ""), + surfer->statusbar_id); + surfer->statusbar_id = gtk_statusbar_push(sb, + gtk_statusbar_get_context_id(sb, ""), status); +} + + /* surfer_set_title */ void surfer_set_title(Surfer * surfer, char const * title) { diff --git a/src/surfer.h b/src/surfer.h index b98389a..693b89c 100644 --- a/src/surfer.h +++ b/src/surfer.h @@ -68,6 +68,7 @@ void surfer_delete(Surfer * surfer); /* accessors */ void surfer_set_progress(Surfer * surfer, gdouble fraction); +void surfer_set_status(Surfer * surfer, char const * status); void surfer_set_title(Surfer * surfer, char const * title);