Index: protocols/purple/ft.c
===================================================================
--- protocols/purple/ft.c	(revision 2309152972f1d52af6adbb0e7e5d9c5ad3ae80f9)
+++ protocols/purple/ft.c	(revision 553767cacf43e1a4a1038530c47dc0af5fdd0369)
@@ -22,4 +22,9 @@
 \***************************************************************************/
 
+/* Do file transfers via disk for now, since libpurple was really designed
+   for straight-to/from disk fts and is only just learning how to pass the
+   file contents the the UI instead (2.6.0 and higher it seems, and with
+   varying levels of success). */
+
 #include "bitlbee.h"
 
@@ -42,21 +47,7 @@
 struct im_connection *purple_ic_by_pa( PurpleAccount *pa );
 
-/* Glorious hack: We seem to have to remind at least some libpurple plugins
-   that we're ready because this info may get lost if we give it too early.
-   So just do it ten times a second. :-/ */
-static gboolean prplcb_xfer_write_request_cb( gpointer data, gint fd, b_input_condition cond )
-{
-	struct prpl_xfer_data *px = data;
-	
-	purple_xfer_ui_ready( px->xfer );
-	
-	return purple_xfer_get_type( px->xfer ) == PURPLE_XFER_RECEIVE;
-}
-
 static gboolean prpl_xfer_write_request( struct file_transfer *ft )
 {
-	struct prpl_xfer_data *px = ft->data;
-	px->ready_timer = b_timeout_add( 100, prplcb_xfer_write_request_cb, px );
-	return TRUE;
+	return FALSE;
 }
 
@@ -65,11 +56,5 @@
 	struct prpl_xfer_data *px = ft->data;
 	
-	px->buf = g_memdup( buffer, len );
-	px->buf_len = len;
-
-	//purple_xfer_ui_ready( px->xfer );
-	px->ready_timer = b_timeout_add( 0, prplcb_xfer_write_request_cb, px );
-	
-	return TRUE;
+	return FALSE;
 }
 
@@ -85,4 +70,35 @@
 	struct prpl_xfer_data *px = ft->data;
 	purple_xfer_request_denied( px->xfer );
+}
+
+static gboolean prplcb_xfer_new_send_cb( gpointer data, gint fd, b_input_condition cond );
+
+static void prplcb_xfer_new( PurpleXfer *xfer )
+{
+	if( purple_xfer_get_type( xfer ) == PURPLE_XFER_RECEIVE )
+	{
+		/* This should suppress the stupid file dialog. */
+		purple_xfer_set_local_filename( xfer, "/tmp/wtf123" );
+		
+		/* Sadly the xfer struct is still empty ATM so come back after
+		   the caller is done. */
+		b_timeout_add( 0, prplcb_xfer_new_send_cb, xfer );
+	}
+	else
+	{
+		/*
+		struct prpl_xfer_data *px = g_new0( struct prpl_xfer_data, 1 );
+		
+		px->ft = next_ft;
+		px->ft->data = px;
+		px->xfer = xfer;
+		px->xfer->ui_data = px;
+		
+		purple_xfer_set_filename( xfer, px->ft->file_name );
+		purple_xfer_set_size( xfer, px->ft->file_size );
+		
+		next_ft = NULL;
+		*/
+	}
 }
 
@@ -112,31 +128,4 @@
 }
 
-static void prplcb_xfer_new( PurpleXfer *xfer )
-{
-	if( purple_xfer_get_type( xfer ) == PURPLE_XFER_RECEIVE )
-	{
-		/* This should suppress the stupid file dialog. */
-		purple_xfer_set_local_filename( xfer, "/tmp/wtf123" );
-		
-		/* Sadly the xfer struct is still empty ATM so come back after
-		   the caller is done. */
-		b_timeout_add( 0, prplcb_xfer_new_send_cb, xfer );
-	}
-	else
-	{
-		struct prpl_xfer_data *px = g_new0( struct prpl_xfer_data, 1 );
-		
-		px->ft = next_ft;
-		px->ft->data = px;
-		px->xfer = xfer;
-		px->xfer->ui_data = px;
-		
-		purple_xfer_set_filename( xfer, px->ft->file_name );
-		purple_xfer_set_size( xfer, px->ft->file_size );
-		
-		next_ft = NULL;
-	}
-}
-
 static void prplcb_xfer_progress( PurpleXfer *xfer, double percent )
 {
@@ -149,41 +138,4 @@
 }
 
-static gssize prplcb_xfer_write( PurpleXfer *xfer, const guchar *buffer, gssize size )
-{
-	struct prpl_xfer_data *px = xfer->ui_data;
-	gboolean st;
-	
-	fprintf( stderr, "xfer_write %d %d\n", size, px->buf_len );
-	
-	b_event_remove( px->ready_timer );
-	px->ready_timer = 0;
-	
-	st = px->ft->write( px->ft, (char*) buffer, size );
-	
-	if( st && xfer->bytes_remaining == size )
-		imcb_file_finished( px->ft );
-	
-	return st ? size : 0;
-}
-
-gssize prplcb_xfer_read( PurpleXfer *xfer, guchar **buffer, gssize size )
-{
-	struct prpl_xfer_data *px = xfer->ui_data;
-	
-	fprintf( stderr, "xfer_read %d %d\n", size, px->buf_len );
-
-	if( px->buf )
-	{
-		*buffer = px->buf;
-		px->buf = NULL;
-		
-		px->ft->write_request( px->ft );
-		
-		return px->buf_len;
-	}
-	
-	return 0;
-}
-
 PurpleXferUiOps bee_xfer_uiops =
 {
@@ -194,6 +146,6 @@
 	prplcb_xfer_dbg,
 	prplcb_xfer_dbg,
-	prplcb_xfer_write,
-	prplcb_xfer_read,
+	NULL,
+	NULL,
 	prplcb_xfer_dbg,
 };
@@ -215,20 +167,3 @@
 	px = ft->data;
 	imcb_file_recv_start( ft );
-	
-	px->ready_timer = b_timeout_add( 100, prplcb_xfer_send_cb, px );
 }
-
-static gboolean prplcb_xfer_send_cb( gpointer data, gint fd, b_input_condition cond )
-{
-	struct prpl_xfer_data *px = data;
-	
-	if( px->ft->status & FT_STATUS_TRANSFERRING )
-	{
-		fprintf( stderr, "The ft, it is ready...\n" );
-		px->ft->write_request( px->ft );
-		
-		return FALSE;
-	}
-	
-	return TRUE;
-}
