summaryrefslogtreecommitdiff
path: root/src/fe-common/irc/dcc/fe-dcc.c
diff options
context:
space:
mode:
authorTimo Sirainen <cras@irssi.org>2002-11-21 18:48:03 +0000
committercras <cras@dbcabf3a-b0e7-0310-adc4-f8d773084564>2002-11-21 18:48:03 +0000
commitecff491e025b25261680b83a24f7b934fd36eb4f (patch)
treee0d3d3da3271cd2dd09cbf55bef1c1549bbea811 /src/fe-common/irc/dcc/fe-dcc.c
parent5bf764ac14c499f3ecab554a13b62edd343ff47d (diff)
downloadirssi-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.c34
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)