aboutsummaryrefslogtreecommitdiffstats
path: root/root_commands.c
diff options
context:
space:
mode:
authorWilmer van der Gaast <wilmer@gaast.net>2010-03-21 16:06:31 +0000
committerWilmer van der Gaast <wilmer@gaast.net>2010-03-21 16:06:31 +0000
commit767a148faa35c18cdf4da77b5919a2f6e2df868a (patch)
tree43f981453468759d31d7b215d84d750dbe4876ac /root_commands.c
parent545d7c058d0604dd6acfa37c68e9867e72f25c2e (diff)
parenta81d679654e36055ce9913cd7541885b41380947 (diff)
Merging in file transfer support. Most important points from my review
are fixed now, time to let it settle in and get people to try it.
Diffstat (limited to 'root_commands.c')
-rw-r--r--root_commands.c63
1 files changed, 63 insertions, 0 deletions
diff --git a/root_commands.c b/root_commands.c
index e4e07605..e42268b5 100644
--- a/root_commands.c
+++ b/root_commands.c
@@ -1156,6 +1156,68 @@ static void cmd_chat( irc_t *irc, char **cmd )
}
}
+static void cmd_transfer( irc_t *irc, char **cmd )
+{
+ GSList *files = irc->file_transfers;
+ enum { LIST, REJECT, CANCEL };
+ int subcmd = LIST;
+ int fid;
+
+ if( !files )
+ {
+ irc_usermsg( irc, "No pending transfers" );
+ return;
+ }
+
+ if( cmd[1] && ( strcmp( cmd[1], "reject" ) == 0 ) )
+ {
+ subcmd = REJECT;
+ }
+ else if( cmd[1] && ( strcmp( cmd[1], "cancel" ) == 0 ) &&
+ cmd[2] && ( sscanf( cmd[2], "%d", &fid ) == 1 ) )
+ {
+ subcmd = CANCEL;
+ }
+
+ for( ; files; files = g_slist_next( files ) )
+ {
+ file_transfer_t *file = files->data;
+
+ switch( subcmd ) {
+ case LIST:
+ if ( file->status == FT_STATUS_LISTENING )
+ irc_usermsg( irc,
+ "Pending file(id %d): %s (Listening...)", file->local_id, file->file_name);
+ else
+ {
+ int kb_per_s = 0;
+ time_t diff = time( NULL ) - file->started ? : 1;
+ if ( ( file->started > 0 ) && ( file->bytes_transferred > 0 ) )
+ kb_per_s = file->bytes_transferred / 1024 / diff;
+
+ irc_usermsg( irc,
+ "Pending file(id %d): %s (%10zd/%zd kb, %d kb/s)", file->local_id, file->file_name,
+ file->bytes_transferred/1024, file->file_size/1024, kb_per_s);
+ }
+ break;
+ case REJECT:
+ if( file->status == FT_STATUS_LISTENING )
+ {
+ irc_usermsg( irc, "Rejecting file transfer for %s", file->file_name );
+ imcb_file_canceled( file, "Denied by user" );
+ }
+ break;
+ case CANCEL:
+ if( file->local_id == fid )
+ {
+ irc_usermsg( irc, "Canceling file transfer for %s", file->file_name );
+ imcb_file_canceled( file, "Canceled by user" );
+ }
+ break;
+ }
+ }
+}
+
const command_t commands[] = {
{ "help", 0, cmd_help, 0 },
{ "identify", 1, cmd_identify, 0 },
@@ -1177,5 +1239,6 @@ const command_t commands[] = {
{ "qlist", 0, cmd_qlist, 0 },
{ "join_chat", 2, cmd_join_chat, 0 },
{ "chat", 1, cmd_chat, 0 },
+ { "transfer", 0, cmd_transfer, 0 },
{ NULL }
};