- Timestamp:
- 2010-04-11T14:37:06Z (14 years ago)
- Branches:
- master
- Children:
- a87e6ba
- Parents:
- 1f92a58
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
dcc.c
r1f92a58 r17a6ee9 61 61 unsigned int receivedchunks=0, receiveddata=0; 62 62 63 staticvoid dcc_finish( file_transfer_t *file );64 staticvoid dcc_close( file_transfer_t *file );63 void dcc_finish( file_transfer_t *file ); 64 void dcc_close( file_transfer_t *file ); 65 65 gboolean dccs_send_proto( gpointer data, gint fd, b_input_condition cond ); 66 int dccs_send_request( struct dcc_file_transfer *df, char *user_nick, struct sockaddr_storage *saddr ); 67 gboolean dccs_recv_start( file_transfer_t *ft ); 66 int dccs_send_request( struct dcc_file_transfer *df, irc_user_t *iu, struct sockaddr_storage *saddr ); 68 67 gboolean dccs_recv_proto( gpointer data, gint fd, b_input_condition cond); 69 68 gboolean dccs_recv_write_request( file_transfer_t *ft ); … … 71 70 gboolean dcc_abort( dcc_file_transfer_t *df, char *reason, ... ); 72 71 73 /* As defined in ft.h */ 74 file_transfer_t *imcb_file_send_start( struct im_connection *ic, char *handle, char *file_name, size_t file_size ) 75 { 76 user_t *u = user_findhandle( ic, handle ); 77 /* one could handle this more intelligent like imcb_buddy_msg. 78 * can't call it directly though cause it does some wrapping. 79 * Maybe give imcb_buddy_msg a parameter NO_WRAPPING? */ 80 if (!u) return NULL; 81 82 return dccs_send_start( ic, u->nick, file_name, file_size ); 83 }; 84 85 /* As defined in ft.h */ 86 void imcb_file_canceled( file_transfer_t *file, char *reason ) 87 { 88 if( file->canceled ) 89 file->canceled( file, reason ); 90 91 dcc_close( file ); 92 } 93 94 /* As defined in ft.h */ 95 gboolean imcb_file_recv_start( file_transfer_t *ft ) 96 { 97 return dccs_recv_start( ft ); 98 } 99 100 /* As defined in ft.h */ 101 void imcb_file_finished( file_transfer_t *file ) 102 { 103 dcc_file_transfer_t *df = file->priv; 104 105 if( file->bytes_transferred >= file->file_size ) 106 dcc_finish( file ); 107 else 108 df->proto_finished = TRUE; 109 } 110 111 dcc_file_transfer_t *dcc_alloc_transfer( char *file_name, size_t file_size, struct im_connection *ic ) 72 dcc_file_transfer_t *dcc_alloc_transfer( const char *file_name, size_t file_size, struct im_connection *ic ) 112 73 { 113 74 file_transfer_t *file = g_new0( file_transfer_t, 1 ); … … 124 85 125 86 /* This is where the sending magic starts... */ 126 file_transfer_t *dccs_send_start( struct im_connection *ic, char *user_nick,char *file_name, size_t file_size )87 file_transfer_t *dccs_send_start( struct im_connection *ic, irc_user_t *iu, const char *file_name, size_t file_size ) 127 88 { 128 89 file_transfer_t *file; 129 90 dcc_file_transfer_t *df; 91 irc_t *irc = (irc_t *) ic->bee->ui_data; 130 92 struct sockaddr_storage saddr; 131 93 char *errmsg; … … 150 112 file->status = FT_STATUS_LISTENING; 151 113 152 if( !dccs_send_request( df, user_nick, &saddr ) )114 if( !dccs_send_request( df, iu, &saddr ) ) 153 115 return NULL; 154 116 … … 156 118 df->watch_in = b_input_add( df->fd, GAIM_INPUT_READ, dccs_send_proto, df ); 157 119 158 df->ic->irc->file_transfers = g_slist_prepend( df->ic->irc->file_transfers, file );120 irc->file_transfers = g_slist_prepend( irc->file_transfers, file ); 159 121 160 122 df->progress_timeout = b_timeout_add( DCC_MAX_STALL * 1000, dcc_progress, df ); … … 163 125 "Accept the file transfer if you'd like the file. If you don't, " 164 126 "issue the 'transfers reject' command.", 165 user_nick, file_name, file_size / 1024 );127 iu->nick, file_name, file_size / 1024 ); 166 128 167 129 return file; … … 216 178 217 179 /* Creates the "DCC SEND" line and sends it to the server */ 218 int dccs_send_request( struct dcc_file_transfer *df, char *user_nick, struct sockaddr_storage *saddr )180 int dccs_send_request( struct dcc_file_transfer *df, irc_user_t *iu, struct sockaddr_storage *saddr ) 219 181 { 220 182 char ipaddr[INET6_ADDRSTRLEN]; … … 250 212 df->ft->file_name, ipaddr, port, df->ft->file_size ); 251 213 252 if ( !irc_msgfrom( df->ic->irc, user_nick, cmd ) ) 253 return dcc_abort( df, "Couldn't send `DCC SEND' message to %s.", user_nick ); 214 irc_send_msg_raw( iu, "PRIVMSG", iu->irc->user->nick, cmd ); 254 215 255 216 g_free( cmd ); … … 496 457 * Cleans up after a transfer. 497 458 */ 498 staticvoid dcc_close( file_transfer_t *file )459 void dcc_close( file_transfer_t *file ) 499 460 { 500 461 dcc_file_transfer_t *df = file->priv; 462 irc_t *irc = (irc_t *) df->ic->bee->ui_data; 501 463 502 464 if( file->free ) … … 514 476 b_event_remove( df->progress_timeout ); 515 477 516 df->ic->irc->file_transfers = g_slist_remove( df->ic->irc->file_transfers, file );478 irc->file_transfers = g_slist_remove( irc->file_transfers, file ); 517 479 518 480 g_free( df ); … … 544 506 file_transfer_t *dcc_request( struct im_connection *ic, char *line ) 545 507 { 508 irc_t *irc = (irc_t *) ic->bee->ui_data; 546 509 char *pattern = "SEND" 547 510 " (([^\"][^ ]*)|\"(([^\"]|\\\")*)\")" … … 627 590 g_free( input ); 628 591 629 df->ic->irc->file_transfers = g_slist_prepend( df->ic->irc->file_transfers, ft );592 irc->file_transfers = g_slist_prepend( irc->file_transfers, ft ); 630 593 631 594 return ft;
Note: See TracChangeset
for help on using the changeset viewer.