aboutsummaryrefslogtreecommitdiffstats
path: root/protocols/ft.h
diff options
context:
space:
mode:
authorulim <a.sporto+bee@gmail.com>2007-12-04 01:48:57 +0100
committerulim <a.sporto+bee@gmail.com>2007-12-04 01:48:57 +0100
commitdce390357114e30a424106c99e49cef1e682e1af (patch)
treef238de491573827510c55e29cf80e2fda7ccc793 /protocols/ft.h
parent2ff20765990c756533957e8da9c7c29dd3102e79 (diff)
Send and receive seems to work now! Also adopted the new buffering strategy,
only one buffer of 2k per transfer now.
Diffstat (limited to 'protocols/ft.h')
-rw-r--r--protocols/ft.h31
1 files changed, 20 insertions, 11 deletions
diff --git a/protocols/ft.h b/protocols/ft.h
index d41eb6c1..d35580d0 100644
--- a/protocols/ft.h
+++ b/protocols/ft.h
@@ -26,6 +26,13 @@
#ifndef _FT_H
#define _FT_H
+/*
+ * One buffer is needed for each transfer. The receiver stores a message
+ * in it and gives it to the sender. The sender will stall the receiver
+ * till the buffer has been sent out.
+ */
+#define FT_BUFFER_SIZE 2048
+
typedef enum {
FT_STATUS_LISTENING = 1,
FT_STATUS_TRANSFERRING = 2,
@@ -130,15 +137,24 @@ typedef struct file_transfer {
void (*canceled) ( struct file_transfer *file, char *reason );
/*
- * If set, called when the transfer queue is running empty and
- * more data can be added.
+ * called by the sending side to indicate that it is writable.
+ * The callee should check if data is available and call the
+ * function(as seen below) if that is the case.
*/
- void (*out_of_data) ( struct file_transfer *file );
+ gboolean (*write_request) ( struct file_transfer *file );
/*
* When sending files, protocols register this function to receive data.
+ * This should only be called once after write_request is called. The caller
+ * should not read more data until write_request is called again. This technique
+ * avoids buffering.
+ */
+ gboolean (*write) (struct file_transfer *file, char *buffer, unsigned int len );
+
+ /* The send buffer associated with this transfer.
+ * Since receivers always wait for a write_request call one is enough.
*/
- gboolean (*write) (struct file_transfer *file, char *buffer, int len );
+ char buffer[FT_BUFFER_SIZE];
} file_transfer_t;
@@ -153,12 +169,5 @@ file_transfer_t *imcb_file_send_start( struct im_connection *ic, char *user_nick
*/
void imcb_file_canceled( file_transfer_t *file, char *reason );
-/*
- * The given buffer is queued for transfer and MUST NOT be freed by the caller.
- * When the method returns false the caller should not invoke this method again
- * until out_of_data has been called.
- */
-gboolean imcb_file_write( file_transfer_t *file, gpointer data, size_t data_size );
-
gboolean imcb_file_recv_start( file_transfer_t *ft );
#endif