Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • dcc.c

    r17a6ee9 r4ed9c8c  
    6161unsigned int receivedchunks=0, receiveddata=0;
    6262
    63 void dcc_finish( file_transfer_t *file );
    64 void dcc_close( file_transfer_t *file );
     63static void dcc_finish( file_transfer_t *file );
     64static void dcc_close( file_transfer_t *file );
    6565gboolean dccs_send_proto( gpointer data, gint fd, b_input_condition cond );
    66 int dccs_send_request( struct dcc_file_transfer *df, irc_user_t *iu, struct sockaddr_storage *saddr );
     66int dccs_send_request( struct dcc_file_transfer *df, char *user_nick, struct sockaddr_storage *saddr );
     67gboolean dccs_recv_start( file_transfer_t *ft );
    6768gboolean dccs_recv_proto( gpointer data, gint fd, b_input_condition cond);
    6869gboolean dccs_recv_write_request( file_transfer_t *ft );
     
    7071gboolean dcc_abort( dcc_file_transfer_t *df, char *reason, ... );
    7172
    72 dcc_file_transfer_t *dcc_alloc_transfer( const char *file_name, size_t file_size, struct im_connection *ic )
     73/* As defined in ft.h */
     74file_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 */
     86void 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 */
     95gboolean imcb_file_recv_start( file_transfer_t *ft )
     96{
     97        return dccs_recv_start( ft );
     98}
     99
     100/* As defined in ft.h */
     101void 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
     111dcc_file_transfer_t *dcc_alloc_transfer( char *file_name, size_t file_size, struct im_connection *ic )
    73112{
    74113        file_transfer_t *file = g_new0( file_transfer_t, 1 );
     
    85124
    86125/* This is where the sending magic starts... */
    87 file_transfer_t *dccs_send_start( struct im_connection *ic, irc_user_t *iu, const char *file_name, size_t file_size )
     126file_transfer_t *dccs_send_start( struct im_connection *ic, char *user_nick, char *file_name, size_t file_size )
    88127{
    89128        file_transfer_t *file;
    90129        dcc_file_transfer_t *df;
    91         irc_t *irc = (irc_t *) ic->bee->ui_data;
    92130        struct sockaddr_storage saddr;
    93131        char *errmsg;
     
    112150        file->status = FT_STATUS_LISTENING;
    113151
    114         if( !dccs_send_request( df, iu, &saddr ) )
     152        if( !dccs_send_request( df, user_nick, &saddr ) )
    115153                return NULL;
    116154
     
    118156        df->watch_in = b_input_add( df->fd, GAIM_INPUT_READ, dccs_send_proto, df );
    119157
    120         irc->file_transfers = g_slist_prepend( irc->file_transfers, file );
     158        df->ic->irc->file_transfers = g_slist_prepend( df->ic->irc->file_transfers, file );
    121159
    122160        df->progress_timeout = b_timeout_add( DCC_MAX_STALL * 1000, dcc_progress, df );
     
    125163                      "Accept the file transfer if you'd like the file. If you don't, "
    126164                      "issue the 'transfers reject' command.",
    127                       iu->nick, file_name, file_size / 1024 );
     165                      user_nick, file_name, file_size / 1024 );
    128166
    129167        return file;
     
    178216
    179217/* Creates the "DCC SEND" line and sends it to the server */
    180 int dccs_send_request( struct dcc_file_transfer *df, irc_user_t *iu, struct sockaddr_storage *saddr )
     218int dccs_send_request( struct dcc_file_transfer *df, char *user_nick, struct sockaddr_storage *saddr )
    181219{
    182220        char ipaddr[INET6_ADDRSTRLEN];
     
    212250                                df->ft->file_name, ipaddr, port, df->ft->file_size );
    213251       
    214         irc_send_msg_raw( iu, "PRIVMSG", iu->irc->user->nick, cmd );
     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 );
    215254
    216255        g_free( cmd );
     
    457496 * Cleans up after a transfer.
    458497 */
    459 void dcc_close( file_transfer_t *file )
     498static void dcc_close( file_transfer_t *file )
    460499{
    461500        dcc_file_transfer_t *df = file->priv;
    462         irc_t *irc = (irc_t *) df->ic->bee->ui_data;
    463501
    464502        if( file->free )
     
    476514                b_event_remove( df->progress_timeout );
    477515       
    478         irc->file_transfers = g_slist_remove( irc->file_transfers, file );
     516        df->ic->irc->file_transfers = g_slist_remove( df->ic->irc->file_transfers, file );
    479517       
    480518        g_free( df );
     
    506544file_transfer_t *dcc_request( struct im_connection *ic, char *line )
    507545{
    508         irc_t *irc = (irc_t *) ic->bee->ui_data;
    509546        char *pattern = "SEND"
    510547                " (([^\"][^ ]*)|\"(([^\"]|\\\")*)\")"
     
    590627                g_free( input );
    591628
    592                 irc->file_transfers = g_slist_prepend( irc->file_transfers, ft );
     629                df->ic->irc->file_transfers = g_slist_prepend( df->ic->irc->file_transfers, ft );
    593630
    594631                return ft;
Note: See TracChangeset for help on using the changeset viewer.