diff options
author | Timo Sirainen <cras@irssi.org> | 2002-11-21 18:48:03 +0000 |
---|---|---|
committer | cras <cras@dbcabf3a-b0e7-0310-adc4-f8d773084564> | 2002-11-21 18:48:03 +0000 |
commit | ecff491e025b25261680b83a24f7b934fd36eb4f (patch) | |
tree | e0d3d3da3271cd2dd09cbf55bef1c1549bbea811 /src/fe-common/irc/dcc/fe-dcc.c | |
parent | 5bf764ac14c499f3ecab554a13b62edd343ff47d (diff) | |
download | irssi-ecff491e025b25261680b83a24f7b934fd36eb4f.zip |
Prettier displaying of DCC transfers, including adding ETA.
git-svn-id: http://svn.irssi.org/repos/irssi/trunk@3021 dbcabf3a-b0e7-0310-adc4-f8d773084564
Diffstat (limited to 'src/fe-common/irc/dcc/fe-dcc.c')
-rw-r--r-- | src/fe-common/irc/dcc/fe-dcc.c | 34 |
1 files changed, 30 insertions, 4 deletions
diff --git a/src/fe-common/irc/dcc/fe-dcc.c b/src/fe-common/irc/dcc/fe-dcc.c index afe230ec..8d82c3ba 100644 --- a/src/fe-common/irc/dcc/fe-dcc.c +++ b/src/fe-common/irc/dcc/fe-dcc.c @@ -42,6 +42,15 @@ void fe_dcc_get_deinit(void); void fe_dcc_send_init(void); void fe_dcc_send_deinit(void); +char *dcc_get_size_str(uoff_t size) +{ + if (size < 1024) + return g_strdup_printf("%"PRIuUOFF_T"B", size); + if (size < 1024*1024) + return g_strdup_printf("%"PRIuUOFF_T"kB", (size+1023) / 1024); + return g_strdup_printf("%"PRIuUOFF_T"MB", size / (1024*1024)); +} + static void dcc_request(DCC_REC *dcc) { char *service; @@ -91,17 +100,34 @@ static void dcc_error_unknown_type(const char *type) void dcc_list_print_file(FILE_DCC_REC *dcc) { - time_t going; + time_t going, eta; + char *transfd_str, *size_str, etastr[20]; + uoff_t bps; going = time(NULL) - dcc->starttime; - if (going == 0) going = 1; /* no division by zeros :) */ + if (going <= 0) going = 1; + + transfd_str = dcc_get_size_str(dcc->transfd); + size_str = dcc_get_size_str(dcc->size); + + bps = (dcc->transfd-dcc->skipped) / going; + if (bps == 0) { + strcpy(etastr, "(stalled)"); + } else { + eta = (dcc->size - dcc->transfd) / bps; + g_snprintf(etastr, sizeof(etastr), "%02d:%02d:%02d", + (int)(eta/3600), (int)((eta/60)%60), (int)(eta%60)); + } printformat(NULL, NULL, MSGLEVEL_DCC, IRCTXT_DCC_LIST_LINE_FILE, dcc->nick, dcc_type2str(dcc->type), - (dcc->transfd+1023)/1024, (dcc->size+1023)/1024, + transfd_str, size_str, dcc->size == 0 ? 0 : (int)((double)dcc->transfd/(double)dcc->size*100.0), - (double) (dcc->transfd-dcc->skipped)/going/1024, dcc->arg); + (double)bps/1024.0, dcc->arg, etastr); + + g_free(transfd_str); + g_free(size_str); } static void cmd_dcc_list(const char *data) |