aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorulim <a.sporto+bee@gmail.com>2008-08-04 16:21:49 +0200
committerulim <a.sporto+bee@gmail.com>2008-08-04 16:21:49 +0200
commit4ac647dbcef152bebde7209f7c9cbbf8a5e0fc37 (patch)
treed845669fadf79af229e72230369078389b16cad8
parent8a90001ab2cde971abc64b8d5e4174dc4c4b0ae2 (diff)
moved some stuff around in preperation for MSN merge.
* both ends (proto&dcc) need to finish a transfer now for it to be finished * moved throughput calc. and some messages to dcc (no need to implement in protocols)
-rw-r--r--dcc.c39
-rw-r--r--dcc.h4
-rw-r--r--protocols/ft.h2
-rw-r--r--protocols/jabber/jabber.c12
-rw-r--r--protocols/jabber/s5bytestream.c14
-rw-r--r--protocols/jabber/si.c15
6 files changed, 59 insertions, 27 deletions
diff --git a/dcc.c b/dcc.c
index d815e9b7..909fedad 100644
--- a/dcc.c
+++ b/dcc.c
@@ -113,6 +113,17 @@ gboolean imcb_file_recv_start( file_transfer_t *ft )
return dccs_recv_start( ft );
}
+/* As defined in ft.h */
+void imcb_file_finished( file_transfer_t *file )
+{
+ dcc_file_transfer_t *df = file->priv;
+
+ if( file->bytes_transferred >= file->file_size )
+ dcc_finish( file );
+ else
+ df->proto_finished = TRUE;
+}
+
dcc_file_transfer_t *dcc_alloc_transfer( char *file_name, size_t file_size, struct im_connection *ic )
{
file_transfer_t *file = g_new0( file_transfer_t, 1 );
@@ -154,6 +165,10 @@ file_transfer_t *dccs_send_start( struct im_connection *ic, char *user_nick, cha
df->progress_timeout = b_timeout_add( DCC_MAX_STALL * 1000, dcc_progress, df );
+ imcb_log( ic, "File transfer request from %s for %s (%zd kb). ", user_nick, file_name, file_size/1024 );
+
+ imcb_log( ic, "Accept the file transfer if you'd like the file. If you don't, issue the 'transfers reject' command.");
+
return file;
}
@@ -410,7 +425,8 @@ gboolean dccs_send_proto( gpointer data, gint fd, b_input_condition cond )
file->bytes_transferred = bytes_received;
if( file->bytes_transferred >= file->file_size ) {
- dcc_finish( file );
+ if( df->proto_finished )
+ dcc_finish( file );
return FALSE;
}
@@ -492,6 +508,9 @@ gboolean dccs_recv_proto( gpointer data, gint fd, b_input_condition cond)
if( ret == 0 )
return dcc_abort( df, "Remote end closed connection" );
+ if( !ft->write( df->ft, ft->buffer, ret ) )
+ return FALSE;
+
df->bytes_sent += ret;
done = df->bytes_sent >= ft->file_size;
@@ -508,13 +527,16 @@ gboolean dccs_recv_proto( gpointer data, gint fd, b_input_condition cond)
return dcc_abort( df, "Error sending DCC ACK, sent %d instead of 4 bytes", ackret );
}
- if( !ft->write( df->ft, ft->buffer, ret ) )
- return FALSE;
+ if( df->bytes_sent == ret )
+ ft->started = time( NULL );
if( done )
{
- closesocket( fd );
- dcc_finish( ft );
+ if( df->watch_out )
+ b_event_remove( df->watch_out );
+
+ if( df->proto_finished )
+ dcc_finish( ft );
df->watch_in = 0;
return FALSE;
@@ -571,6 +593,9 @@ gboolean dccs_send_write( file_transfer_t *file, char *data, unsigned int data_l
if( ret < data_len )
return dcc_abort( df, "send() sent %d instead of %d", ret, data_len );
+ if( df->bytes_sent == 0 )
+ file->started = time( NULL );
+
df->bytes_sent += ret;
if( df->bytes_sent < df->ft->file_size )
@@ -609,11 +634,15 @@ static void dcc_close( file_transfer_t *file )
void dcc_finish( file_transfer_t *file )
{
+ dcc_file_transfer_t *df = file->priv;
+ time_t diff = time( NULL ) - file->started ? : 1;
+
file->status |= FT_STATUS_FINISHED;
if( file->finished )
file->finished( file );
+ imcb_log( df->ic, "File %s transferred successfully at %d kb/s!" , file->file_name, (int) ( file->bytes_transferred / 1024 / diff ) );
dcc_close( file );
}
diff --git a/dcc.h b/dcc.h
index de24dac0..4be5a338 100644
--- a/dcc.h
+++ b/dcc.h
@@ -82,6 +82,10 @@ typedef struct dcc_file_transfer {
/* if we're receiving, this is the sender's socket address */
struct sockaddr_storage saddr;
+ /* set to true if the protocol has finished
+ * (i.e. called imcb_file_finished)
+ */
+ int proto_finished;
} dcc_file_transfer_t;
file_transfer_t *dccs_send_start( struct im_connection *ic, char *user_nick, char *file_name, size_t file_size );
diff --git a/protocols/ft.h b/protocols/ft.h
index 42333c90..1155f06f 100644
--- a/protocols/ft.h
+++ b/protocols/ft.h
@@ -170,4 +170,6 @@ file_transfer_t *imcb_file_send_start( struct im_connection *ic, char *user_nick
void imcb_file_canceled( file_transfer_t *file, char *reason );
gboolean imcb_file_recv_start( file_transfer_t *ft );
+
+void imcb_file_finished( file_transfer_t *file );
#endif
diff --git a/protocols/jabber/jabber.c b/protocols/jabber/jabber.c
index 8b1d78db..987ef96e 100644
--- a/protocols/jabber/jabber.c
+++ b/protocols/jabber/jabber.c
@@ -244,6 +244,18 @@ static void jabber_logout( struct im_connection *ic )
{
struct jabber_data *jd = ic->proto_data;
+ while( jd->filetransfers )
+ imcb_file_canceled( ( ( struct jabber_transfer *) jd->filetransfers->data )->ft, "Logging out" );
+
+ while( jd->streamhosts )
+ {
+ jabber_streamhost_t *sh = jd->streamhosts->data;
+ jd->streamhosts = g_slist_remove( jd->streamhosts, sh );
+ g_free( sh->jid );
+ g_free( sh->host );
+ g_free( sh );
+ }
+
if( jd->fd >= 0 )
jabber_end_stream( ic );
diff --git a/protocols/jabber/s5bytestream.c b/protocols/jabber/s5bytestream.c
index c492491b..7e4ca2ab 100644
--- a/protocols/jabber/s5bytestream.c
+++ b/protocols/jabber/s5bytestream.c
@@ -642,11 +642,11 @@ gboolean jabber_bs_recv_read( gpointer data, gint fd, b_input_condition cond )
if( ret == 0 )
return jabber_bs_abort( bt, "Remote end closed connection" );
- if( tf->bytesread == 0 )
- tf->ft->started = time( NULL );
-
tf->bytesread += ret;
+ if( tf->bytesread >= tf->ft->file_size )
+ imcb_file_finished( tf->ft );
+
tf->ft->write( tf->ft, tf->ft->buffer, ret );
return FALSE;
@@ -700,16 +700,16 @@ gboolean jabber_bs_send_write( file_transfer_t *ft, char *buffer, unsigned int l
/* TODO: catch broken pipe */
ASSERTSOCKOP( ret = send( tf->fd, buffer, len, 0 ), "Sending" );
- if( tf->byteswritten == 0 )
- tf->ft->started = time( NULL );
-
tf->byteswritten += ret;
/* TODO: this should really not be fatal */
if( ret < len )
return jabber_bs_abort( bt, "send() sent %d instead of %d (send buffer too big!)", ret, len );
- bt->tf->watch_out = b_input_add( tf->fd, GAIM_INPUT_WRITE, jabber_bs_send_can_write, bt );
+ if( tf->byteswritten >= ft->file_size )
+ imcb_file_finished( ft );
+ else
+ bt->tf->watch_out = b_input_add( tf->fd, GAIM_INPUT_WRITE, jabber_bs_send_can_write, bt );
return TRUE;
}
diff --git a/protocols/jabber/si.c b/protocols/jabber/si.c
index e7cb2a17..e7aeffc9 100644
--- a/protocols/jabber/si.c
+++ b/protocols/jabber/si.c
@@ -53,15 +53,6 @@ void jabber_si_free_transfer( file_transfer_t *ft)
g_free( tf->sid );
}
-/* file_transfer finished() callback */
-void jabber_si_finished( file_transfer_t *ft )
-{
- struct jabber_transfer *tf = ft->data;
- time_t diff = time( NULL ) - ft->started ? : 1;
-
- imcb_log( tf->ic, "File %s transferred successfully at %d kb/s!" , ft->file_name, (int) ( ft->bytes_transferred / 1024 / diff ) );
-}
-
/* file_transfer canceled() callback */
void jabber_si_canceled( file_transfer_t *ft, char *reason )
{
@@ -176,7 +167,6 @@ void jabber_si_transfer_request( struct im_connection *ic, file_transfer_t *ft,
tf->fd = -1;
tf->ft->data = tf;
tf->ft->free = jabber_si_free_transfer;
- tf->ft->finished = jabber_si_finished;
tf->bud = bud;
ft->write = jabber_bs_send_write;
@@ -301,10 +291,6 @@ int jabber_si_handle_request( struct im_connection *ic, struct xt_node *node, st
/* Request is fine. */
- imcb_log( ic, "File transfer request from %s for %s (%zd kb). ", xt_find_attr( node, "from" ), name, size/1024 );
-
- imcb_log( ic, "Accept the file transfer if you'd like the file. If you don't, issue the 'transfers reject' command.");
-
tf = g_new0( struct jabber_transfer, 1 );
tf->ini_jid = g_strdup( ini_jid );
@@ -317,7 +303,6 @@ int jabber_si_handle_request( struct im_connection *ic, struct xt_node *node, st
tf->ft->data = tf;
tf->ft->accept = jabber_si_answer_request;
tf->ft->free = jabber_si_free_transfer;
- tf->ft->finished = jabber_si_finished;
tf->ft->canceled = jabber_si_canceled;
jd->filetransfers = g_slist_prepend( jd->filetransfers, tf );