Changeset 2309152


Ignore:
Timestamp:
2010-05-17T00:14:14Z (15 years ago)
Author:
Wilmer van der Gaast <wilmer@…>
Branches:
master
Children:
553767c
Parents:
ec86b22
Message:

Split off the file transfer stuff into a separate file. What a mess.

Location:
protocols/purple
Files:
1 added
2 edited

Legend:

Unmodified
Added
Removed
  • protocols/purple/Makefile

    rec86b22 r2309152  
    1010
    1111# [SH] Program variables
    12 objects = purple.o
     12objects = ft.o purple.o
    1313
    1414CFLAGS += -Wall $(PURPLE_CFLAGS)
  • protocols/purple/purple.c

    rec86b22 r2309152  
    3737static irc_t *local_irc;
    3838
    39 static struct im_connection *purple_ic_by_pa( PurpleAccount *pa )
     39struct im_connection *purple_ic_by_pa( PurpleAccount *pa )
    4040{
    4141        GSList *i;
     
    827827};
    828828
    829 
    830 struct prpl_xfer_data
    831 {
    832         PurpleXfer *xfer;
    833         file_transfer_t *ft;
    834         gint ready_timer;
    835         char *buf;
    836         int buf_len;
    837 };
    838 
    839 static file_transfer_t *next_ft;
    840 
    841 /* Glorious hack: We seem to have to remind at least some libpurple plugins
    842    that we're ready because this info may get lost if we give it too early.
    843    So just do it ten times a second. :-/ */
    844 static gboolean prplcb_xfer_write_request_cb( gpointer data, gint fd, b_input_condition cond )
    845 {
    846         struct prpl_xfer_data *px = data;
    847        
    848         purple_xfer_ui_ready( px->xfer );
    849        
    850         return purple_xfer_get_type( px->xfer ) == PURPLE_XFER_RECEIVE;
    851 }
    852 
    853 static gboolean prpl_xfer_write_request( struct file_transfer *ft )
    854 {
    855         struct prpl_xfer_data *px = ft->data;
    856         px->ready_timer = b_timeout_add( 100, prplcb_xfer_write_request_cb, px );
    857         return TRUE;
    858 }
    859 
    860 static gssize prplcb_xfer_write( PurpleXfer *xfer, const guchar *buffer, gssize size )
    861 {
    862         struct prpl_xfer_data *px = xfer->ui_data;
    863         gboolean st;
    864        
    865         b_event_remove( px->ready_timer );
    866         px->ready_timer = 0;
    867        
    868         st = px->ft->write( px->ft, (char*) buffer, size );
    869        
    870         if( st && xfer->bytes_remaining == size )
    871                 imcb_file_finished( px->ft );
    872        
    873         return st ? size : 0;
    874 }
    875 
    876 static gboolean prpl_xfer_write( struct file_transfer *ft, char *buffer, unsigned int len )
    877 {
    878         struct prpl_xfer_data *px = ft->data;
    879        
    880         px->buf = g_memdup( buffer, len );
    881         px->buf_len = len;
    882        
    883         //purple_xfer_ui_ready( px->xfer );
    884         px->ready_timer = b_timeout_add( 0, prplcb_xfer_write_request_cb, px );
    885        
    886         return TRUE;
    887 }
    888 
    889 static void prpl_xfer_accept( struct file_transfer *ft )
    890 {
    891         struct prpl_xfer_data *px = ft->data;
    892         purple_xfer_request_accepted( px->xfer, NULL );
    893         prpl_xfer_write_request( ft );
    894 }
    895 
    896 static void prpl_xfer_canceled( struct file_transfer *ft, char *reason )
    897 {
    898         struct prpl_xfer_data *px = ft->data;
    899         purple_xfer_request_denied( px->xfer );
    900 }
    901 
    902 static gboolean prplcb_xfer_new_send_cb( gpointer data, gint fd, b_input_condition cond )
    903 {
    904         PurpleXfer *xfer = data;
    905         struct im_connection *ic = purple_ic_by_pa( xfer->account );
    906         struct prpl_xfer_data *px = g_new0( struct prpl_xfer_data, 1 );
    907         PurpleBuddy *buddy;
    908         const char *who;
    909        
    910         buddy = purple_find_buddy( xfer->account, xfer->who );
    911         who = buddy ? purple_buddy_get_name( buddy ) : xfer->who;
    912        
    913         /* TODO(wilmer): After spreading some more const goodness in BitlBee,
    914            remove the evil cast below. */
    915         px->ft = imcb_file_send_start( ic, (char*) who, xfer->filename, xfer->size );
    916         px->ft->data = px;
    917         px->xfer = data;
    918         px->xfer->ui_data = px;
    919        
    920         px->ft->accept = prpl_xfer_accept;
    921         px->ft->canceled = prpl_xfer_canceled;
    922         px->ft->write_request = prpl_xfer_write_request;
    923        
    924         return FALSE;
    925 }
    926 
    927 static void prplcb_xfer_new( PurpleXfer *xfer )
    928 {
    929         if( purple_xfer_get_type( xfer ) == PURPLE_XFER_RECEIVE )
    930         {
    931                 /* This should suppress the stupid file dialog. */
    932                 purple_xfer_set_local_filename( xfer, "/tmp/wtf123" );
    933                
    934                 /* Sadly the xfer struct is still empty ATM so come back after
    935                    the caller is done. */
    936                 b_timeout_add( 0, prplcb_xfer_new_send_cb, xfer );
    937         }
    938         else
    939         {
    940                 struct prpl_xfer_data *px = g_new0( struct prpl_xfer_data, 1 );
    941                
    942                 px->ft = next_ft;
    943                 px->ft->data = px;
    944                 px->xfer = xfer;
    945                 px->xfer->ui_data = px;
    946                
    947                 purple_xfer_set_filename( xfer, px->ft->file_name );
    948                 purple_xfer_set_size( xfer, px->ft->file_size );
    949                
    950                 next_ft = NULL;
    951         }
    952 }
    953 
    954 static void prplcb_xfer_dbg( PurpleXfer *xfer )
    955 {
    956         fprintf( stderr, "prplcb_xfer_dbg 0x%p\n", xfer );
    957 }
    958 
    959 gssize prplcb_xfer_read( PurpleXfer *xfer, guchar **buffer, gssize size )
    960 {
    961         struct prpl_xfer_data *px = xfer->ui_data;
    962        
    963         fprintf( stderr, "xfer_read %d %d\n", size, px->buf_len );
    964 
    965         if( px->buf )
    966         {
    967                 *buffer = px->buf;
    968                 px->buf = NULL;
    969                
    970                 px->ft->write_request( px->ft );
    971                
    972                 return px->buf_len;
    973         }
    974        
    975         return 0;
    976 }
    977 
    978 static PurpleXferUiOps bee_xfer_uiops =
    979 {
    980         prplcb_xfer_new,
    981         prplcb_xfer_dbg,
    982         prplcb_xfer_dbg,
    983         prplcb_xfer_dbg,
    984         prplcb_xfer_dbg,
    985         prplcb_xfer_dbg,
    986         prplcb_xfer_write,
    987         prplcb_xfer_read,
    988         prplcb_xfer_dbg,
    989 };
    990 
    991 static gboolean prplcb_xfer_send_cb( gpointer data, gint fd, b_input_condition cond );
    992 
    993 void purple_transfer_request( struct im_connection *ic, file_transfer_t *ft, char *handle )
    994 {
    995         PurpleAccount *pa = ic->proto_data;
    996         struct prpl_xfer_data *px;
    997        
    998         /* xfer_new() will pick up this variable. It's a hack but we're not
    999            multi-threaded anyway. */
    1000         next_ft = ft;
    1001         serv_send_file( purple_account_get_connection( pa ), handle, ft->file_name );
    1002        
    1003         ft->write = prpl_xfer_write;
    1004        
    1005         px = ft->data;
    1006         imcb_file_recv_start( ft );
    1007        
    1008         px->ready_timer = b_timeout_add( 100, prplcb_xfer_send_cb, px );
    1009 }
    1010 
    1011 static gboolean prplcb_xfer_send_cb( gpointer data, gint fd, b_input_condition cond )
    1012 {
    1013         struct prpl_xfer_data *px = data;
    1014        
    1015         if( px->ft->status & FT_STATUS_TRANSFERRING )
    1016         {
    1017                 fprintf( stderr, "The ft, it is ready...\n" );
    1018                 px->ft->write_request( px->ft );
    1019                
    1020                 return FALSE;
    1021         }
    1022        
    1023         return TRUE;
    1024 }
     829extern PurpleXferUiOps bee_xfer_uiops;
    1025830
    1026831static void purple_ui_init()
Note: See TracChangeset for help on using the changeset viewer.