diff --git a/src/dialogs/progress.c b/src/dialogs/progress.c index f54aa8f3a..9f6e2ef27 100644 --- a/src/dialogs/progress.c +++ b/src/dialogs/progress.c @@ -15,10 +15,9 @@ #include "util/memory.h" #include "util/string.h" - -unsigned char * -get_progress_msg(struct progress *progress, struct terminal *term, - int wide, int full, unsigned char *separator) +static unsigned char * +get_progress_msg_2(struct progress *progress, struct terminal *term, + int wide, int full, unsigned char *separator, unsigned char *type) { struct string msg; int newlines = separator[strlen(separator) - 1] == '\n'; @@ -29,7 +28,7 @@ get_progress_msg(struct progress *progress, struct terminal *term, * one, _("of")-like pearls are a nightmare. Format strings need to * be introduced to this fuggy corner of code as well. --pasky */ - add_to_string(&msg, _("Received", term)); + add_to_string(&msg, type); add_char_to_string(&msg, ' '); add_xnum_to_string(&msg, progress->pos); if (progress->size >= 0) { @@ -90,6 +89,20 @@ get_progress_msg(struct progress *progress, struct terminal *term, return msg.source; } +unsigned char * +get_upload_progress_msg(struct progress *progress, struct terminal *term, + int wide, int full, unsigned char *separator) +{ + return get_progress_msg_2(progress, term, wide, full, separator, _("Sent", term)); +} + +unsigned char * +get_progress_msg(struct progress *progress, struct terminal *term, + int wide, int full, unsigned char *separator) +{ + return get_progress_msg_2(progress, term, wide, full, separator, _("Received", term)); +} + void draw_progress_bar(struct progress *progress, struct terminal *term, int x, int y, int width, diff --git a/src/dialogs/progress.h b/src/dialogs/progress.h index 7c8f8a931..f97503dd0 100644 --- a/src/dialogs/progress.h +++ b/src/dialogs/progress.h @@ -8,6 +8,11 @@ unsigned char * get_progress_msg(struct progress *progress, struct terminal *term, int wide, int full, unsigned char *separator); + +unsigned char * +get_upload_progress_msg(struct progress *progress, struct terminal *term, + int wide, int full, unsigned char *separator); + /* Draws a progress bar meter or progress coloured text depending on whether * @text is NULL. If @meter_color is NULL dialog.meter color is used. */ void diff --git a/src/dialogs/status.c b/src/dialogs/status.c index cd0814e8e..cabb17276 100644 --- a/src/dialogs/status.c +++ b/src/dialogs/status.c @@ -55,6 +55,9 @@ get_download_msg(struct download *download, struct terminal *term, && download->conn->uri->protocol == PROTOCOL_BITTORRENT) return get_bittorrent_message(download, term, wide, full, separator); #endif + if (download->conn && download->conn->upload_progress) + return get_upload_progress_msg(download->conn->upload_progress, + term, wide, full, separator); return get_progress_msg(download->progress, term, wide, full, separator); } @@ -229,6 +232,7 @@ display_status_bar(struct session *ses, struct terminal *term, int tabs_count) } } + if (!msg) { int full = term->width > 130; int wide = term->width > 80; diff --git a/src/network/connection.c b/src/network/connection.c index f011d2a7e..95fc5187d 100644 --- a/src/network/connection.c +++ b/src/network/connection.c @@ -26,6 +26,7 @@ #include "network/progress.h" #include "network/socket.h" #include "network/ssl/ssl.h" +#include "protocol/http/http.h" #include "protocol/protocol.h" #include "protocol/proxy.h" #include "protocol/uri.h" @@ -64,9 +65,8 @@ static INIT_LIST_OF(struct host_connection, host_connections); static INIT_LIST_OF(struct keepalive_connection, keepalive_connections); /* Prototypes */ -static void notify_connection_callbacks(struct connection *conn); static void check_keepalive_connections(void); - +static void notify_connection_callbacks(struct connection *conn); static /* inline */ enum connection_priority get_priority(struct connection *conn) @@ -338,17 +338,38 @@ stat_timer(struct connection *conn) notify_connection_callbacks(conn); } +static void +upload_stat_timer(struct connection *conn) +{ + struct http_connection_info *http = conn->info; + + assert(conn->upload_progress && http); + if_assert_failed return; + + update_progress(conn->upload_progress, http->uploaded, + http->total_upload_length, http->uploaded); + notify_connection_callbacks(conn); +} + void set_connection_state(struct connection *conn, enum connection_state state) { struct download *download; struct progress *progress = conn->progress; + struct progress *upload_progress = conn->upload_progress; if (is_in_result_state(conn->state) && is_in_progress_state(state)) conn->prev_error = conn->state; conn->state = state; if (conn->state == S_TRANS) { + if (upload_progress && upload_progress->timer == TIMER_ID_UNDEF) { + start_update_progress(upload_progress, + (void (*)(void *)) upload_stat_timer, conn); + upload_stat_timer(conn); + if (connection_disappeared(conn)) + return; + } if (progress->timer == TIMER_ID_UNDEF) { start_update_progress(progress, (void (*)(void *)) stat_timer, conn); update_connection_progress(conn); @@ -358,6 +379,7 @@ set_connection_state(struct connection *conn, enum connection_state state) } else { kill_timer(&progress->timer); + if (upload_progress) kill_timer(&upload_progress->timer); } foreach (download, conn->downloads) { @@ -437,7 +459,7 @@ free_connection_data(struct connection *conn) done_host_connection(conn); } -void +static void notify_connection_callbacks(struct connection *conn) { enum connection_state state = conn->state; diff --git a/src/protocol/http/http.c b/src/protocol/http/http.c index 2a65e76ac..8799fd1f3 100644 --- a/src/protocol/http/http.c +++ b/src/protocol/http/http.c @@ -611,18 +611,6 @@ post_length(unsigned char *post_data, unsigned int *count) return size; } -static void -update_upload_progress(struct connection *conn) -{ - struct http_connection_info *http = conn->info; - - assert(conn->upload_progress && http); - if_assert_failed return; - - update_progress(conn->upload_progress, http->uploaded, - http->total_upload_length, http->uploaded); -} - #define POST_BUFFER_SIZE 4096 #define BIG_READ 655360 @@ -1097,8 +1085,6 @@ http_send_header(struct socket *socket) socket->state = SOCKET_END_ONCLOSE; if (!conn->upload_progress) conn->upload_progress = init_progress(0); - start_update_progress(conn->upload_progress, - (void (*)(void *))update_upload_progress, conn); write_to_socket(socket, header.source, header.length, S_TRANS, send_big_files); done_string(&header);