aboutsummaryrefslogtreecommitdiffstats
path: root/protocols/purple/ft.c
diff options
context:
space:
mode:
Diffstat (limited to 'protocols/purple/ft.c')
-rw-r--r--protocols/purple/ft.c137
1 files changed, 36 insertions, 101 deletions
diff --git a/protocols/purple/ft.c b/protocols/purple/ft.c
index 62a1092a..4b5a3f49 100644
--- a/protocols/purple/ft.c
+++ b/protocols/purple/ft.c
@@ -21,6 +21,11 @@
* *
\***************************************************************************/
+/* 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"
#include <stdarg.h>
@@ -41,36 +46,16 @@ static file_transfer_t *next_ft;
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;
}
static gboolean prpl_xfer_write( struct file_transfer *ft, char *buffer, unsigned int len )
{
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;
}
static void prpl_xfer_accept( struct file_transfer *ft )
@@ -86,30 +71,7 @@ static void prpl_xfer_canceled( struct file_transfer *ft, char *reason )
purple_xfer_request_denied( px->xfer );
}
-static gboolean prplcb_xfer_new_send_cb( gpointer data, gint fd, b_input_condition cond )
-{
- PurpleXfer *xfer = data;
- struct im_connection *ic = purple_ic_by_pa( xfer->account );
- struct prpl_xfer_data *px = g_new0( struct prpl_xfer_data, 1 );
- PurpleBuddy *buddy;
- const char *who;
-
- buddy = purple_find_buddy( xfer->account, xfer->who );
- who = buddy ? purple_buddy_get_name( buddy ) : xfer->who;
-
- /* TODO(wilmer): After spreading some more const goodness in BitlBee,
- remove the evil cast below. */
- px->ft = imcb_file_send_start( ic, (char*) who, xfer->filename, xfer->size );
- px->ft->data = px;
- px->xfer = data;
- px->xfer->ui_data = px;
-
- px->ft->accept = prpl_xfer_accept;
- px->ft->canceled = prpl_xfer_canceled;
- px->ft->write_request = prpl_xfer_write_request;
-
- return FALSE;
-}
+static gboolean prplcb_xfer_new_send_cb( gpointer data, gint fd, b_input_condition cond );
static void prplcb_xfer_new( PurpleXfer *xfer )
{
@@ -124,6 +86,7 @@ static void prplcb_xfer_new( PurpleXfer *xfer )
}
else
{
+ /*
struct prpl_xfer_data *px = g_new0( struct prpl_xfer_data, 1 );
px->ft = next_ft;
@@ -135,54 +98,43 @@ static void prplcb_xfer_new( PurpleXfer *xfer )
purple_xfer_set_size( xfer, px->ft->file_size );
next_ft = NULL;
+ */
}
}
-static void prplcb_xfer_progress( PurpleXfer *xfer, double percent )
-{
- fprintf( stderr, "prplcb_xfer_dbg 0x%p %f\n", xfer, percent );
-}
-
-static void prplcb_xfer_dbg( PurpleXfer *xfer )
-{
- fprintf( stderr, "prplcb_xfer_dbg 0x%p\n", xfer );
-}
-
-static gssize prplcb_xfer_write( PurpleXfer *xfer, const guchar *buffer, gssize size )
+static gboolean prplcb_xfer_new_send_cb( gpointer data, gint fd, b_input_condition cond )
{
- struct prpl_xfer_data *px = xfer->ui_data;
- gboolean st;
-
- fprintf( stderr, "xfer_write %d %d\n", size, px->buf_len );
+ PurpleXfer *xfer = data;
+ struct im_connection *ic = purple_ic_by_pa( xfer->account );
+ struct prpl_xfer_data *px = g_new0( struct prpl_xfer_data, 1 );
+ PurpleBuddy *buddy;
+ const char *who;
- b_event_remove( px->ready_timer );
- px->ready_timer = 0;
+ buddy = purple_find_buddy( xfer->account, xfer->who );
+ who = buddy ? purple_buddy_get_name( buddy ) : xfer->who;
- st = px->ft->write( px->ft, (char*) buffer, size );
+ /* TODO(wilmer): After spreading some more const goodness in BitlBee,
+ remove the evil cast below. */
+ px->ft = imcb_file_send_start( ic, (char*) who, xfer->filename, xfer->size );
+ px->ft->data = px;
+ px->xfer = data;
+ px->xfer->ui_data = px;
- if( st && xfer->bytes_remaining == size )
- imcb_file_finished( px->ft );
+ px->ft->accept = prpl_xfer_accept;
+ px->ft->canceled = prpl_xfer_canceled;
+ px->ft->write_request = prpl_xfer_write_request;
- return st ? size : 0;
+ return FALSE;
}
-gssize prplcb_xfer_read( PurpleXfer *xfer, guchar **buffer, gssize size )
+static void prplcb_xfer_progress( PurpleXfer *xfer, double percent )
{
- struct prpl_xfer_data *px = xfer->ui_data;
-
- fprintf( stderr, "xfer_read %d %d\n", size, px->buf_len );
+ fprintf( stderr, "prplcb_xfer_dbg 0x%p %f\n", xfer, percent );
+}
- if( px->buf )
- {
- *buffer = px->buf;
- px->buf = NULL;
-
- px->ft->write_request( px->ft );
-
- return px->buf_len;
- }
-
- return 0;
+static void prplcb_xfer_dbg( PurpleXfer *xfer )
+{
+ fprintf( stderr, "prplcb_xfer_dbg 0x%p\n", xfer );
}
PurpleXferUiOps bee_xfer_uiops =
@@ -193,8 +145,8 @@ PurpleXferUiOps bee_xfer_uiops =
prplcb_xfer_progress,
prplcb_xfer_dbg,
prplcb_xfer_dbg,
- prplcb_xfer_write,
- prplcb_xfer_read,
+ NULL,
+ NULL,
prplcb_xfer_dbg,
};
@@ -214,21 +166,4 @@ void purple_transfer_request( struct im_connection *ic, file_transfer_t *ft, cha
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;
}