diff options
| author | ulim <a.sporto+bee@gmail.com> | 2008-08-04 16:21:49 +0200 | 
|---|---|---|
| committer | ulim <a.sporto+bee@gmail.com> | 2008-08-04 16:21:49 +0200 | 
| commit | 4ac647dbcef152bebde7209f7c9cbbf8a5e0fc37 (patch) | |
| tree | d845669fadf79af229e72230369078389b16cad8 | |
| parent | 8a90001ab2cde971abc64b8d5e4174dc4c4b0ae2 (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.c | 39 | ||||
| -rw-r--r-- | dcc.h | 4 | ||||
| -rw-r--r-- | protocols/ft.h | 2 | ||||
| -rw-r--r-- | protocols/jabber/jabber.c | 12 | ||||
| -rw-r--r-- | protocols/jabber/s5bytestream.c | 14 | ||||
| -rw-r--r-- | protocols/jabber/si.c | 15 | 
6 files changed, 59 insertions, 27 deletions
| @@ -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 );  } @@ -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 ); | 
