Changeset 5ebff60 for protocols/purple/ft-direct.c
- Timestamp:
- 2015-02-20T22:50:54Z (10 years ago)
- Branches:
- master
- Children:
- 0b9daac, 3d45471, 7733b8c
- Parents:
- af359b4
- git-author:
- Indent <please@…> (19-02-15 05:47:20)
- git-committer:
- dequis <dx@…> (20-02-15 22:50:54)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
protocols/purple/ft-direct.c
raf359b4 r5ebff60 34 34 #include <purple.h> 35 35 36 struct prpl_xfer_data 37 { 36 struct prpl_xfer_data { 38 37 PurpleXfer *xfer; 39 38 file_transfer_t *ft; … … 45 44 static file_transfer_t *next_ft; 46 45 47 struct im_connection *purple_ic_by_pa( PurpleAccount *pa);46 struct im_connection *purple_ic_by_pa(PurpleAccount *pa); 48 47 49 48 /* Glorious hack: We seem to have to remind at least some libpurple plugins 50 49 that we're ready because this info may get lost if we give it too early. 51 50 So just do it ten times a second. :-/ */ 52 static gboolean prplcb_xfer_write_request_cb( gpointer data, gint fd, b_input_condition cond)51 static gboolean prplcb_xfer_write_request_cb(gpointer data, gint fd, b_input_condition cond) 53 52 { 54 53 struct prpl_xfer_data *px = data; 55 56 purple_xfer_ui_ready( px->xfer ); 57 58 return purple_xfer_get_type( px->xfer ) == PURPLE_XFER_RECEIVE; 59 } 60 61 static gboolean prpl_xfer_write_request( struct file_transfer *ft ) 62 { 63 struct prpl_xfer_data *px = ft->data; 64 px->ready_timer = b_timeout_add( 100, prplcb_xfer_write_request_cb, px ); 54 55 purple_xfer_ui_ready(px->xfer); 56 57 return purple_xfer_get_type(px->xfer) == PURPLE_XFER_RECEIVE; 58 } 59 60 static gboolean prpl_xfer_write_request(struct file_transfer *ft) 61 { 62 struct prpl_xfer_data *px = ft->data; 63 64 px->ready_timer = b_timeout_add(100, prplcb_xfer_write_request_cb, px); 65 65 return TRUE; 66 66 } 67 67 68 static gboolean prpl_xfer_write( struct file_transfer *ft, char *buffer, unsigned int len)69 { 70 struct prpl_xfer_data *px = ft->data; 71 72 px->buf = g_memdup( buffer, len);68 static gboolean prpl_xfer_write(struct file_transfer *ft, char *buffer, unsigned int len) 69 { 70 struct prpl_xfer_data *px = ft->data; 71 72 px->buf = g_memdup(buffer, len); 73 73 px->buf_len = len; 74 74 75 75 //purple_xfer_ui_ready( px->xfer ); 76 px->ready_timer = b_timeout_add( 0, prplcb_xfer_write_request_cb, px);77 76 px->ready_timer = b_timeout_add(0, prplcb_xfer_write_request_cb, px); 77 78 78 return TRUE; 79 79 } 80 80 81 static void prpl_xfer_accept( struct file_transfer *ft ) 82 { 83 struct prpl_xfer_data *px = ft->data; 84 purple_xfer_request_accepted( px->xfer, NULL ); 85 prpl_xfer_write_request( ft ); 86 } 87 88 static void prpl_xfer_canceled( struct file_transfer *ft, char *reason ) 89 { 90 struct prpl_xfer_data *px = ft->data; 91 purple_xfer_request_denied( px->xfer ); 92 } 93 94 static gboolean prplcb_xfer_new_send_cb( gpointer data, gint fd, b_input_condition cond ) 81 static void prpl_xfer_accept(struct file_transfer *ft) 82 { 83 struct prpl_xfer_data *px = ft->data; 84 85 purple_xfer_request_accepted(px->xfer, NULL); 86 prpl_xfer_write_request(ft); 87 } 88 89 static void prpl_xfer_canceled(struct file_transfer *ft, char *reason) 90 { 91 struct prpl_xfer_data *px = ft->data; 92 93 purple_xfer_request_denied(px->xfer); 94 } 95 96 static gboolean prplcb_xfer_new_send_cb(gpointer data, gint fd, b_input_condition cond) 95 97 { 96 98 PurpleXfer *xfer = data; 97 struct im_connection *ic = purple_ic_by_pa( xfer->account);98 struct prpl_xfer_data *px = g_new0( struct prpl_xfer_data, 1);99 struct im_connection *ic = purple_ic_by_pa(xfer->account); 100 struct prpl_xfer_data *px = g_new0(struct prpl_xfer_data, 1); 99 101 PurpleBuddy *buddy; 100 102 const char *who; 101 102 buddy = purple_find_buddy( xfer->account, xfer->who);103 who = buddy ? purple_buddy_get_name( buddy) : xfer->who;104 103 104 buddy = purple_find_buddy(xfer->account, xfer->who); 105 who = buddy ? purple_buddy_get_name(buddy) : xfer->who; 106 105 107 /* TODO(wilmer): After spreading some more const goodness in BitlBee, 106 108 remove the evil cast below. */ 107 px->ft = imcb_file_send_start( ic, (char*) who, xfer->filename, xfer->size);109 px->ft = imcb_file_send_start(ic, (char *) who, xfer->filename, xfer->size); 108 110 px->ft->data = px; 109 111 px->xfer = data; 110 112 px->xfer->ui_data = px; 111 113 112 114 px->ft->accept = prpl_xfer_accept; 113 115 px->ft->canceled = prpl_xfer_canceled; 114 116 px->ft->write_request = prpl_xfer_write_request; 115 117 116 118 return FALSE; 117 119 } 118 120 119 static void prplcb_xfer_new( PurpleXfer *xfer ) 120 { 121 if( purple_xfer_get_type( xfer ) == PURPLE_XFER_RECEIVE ) 122 { 121 static void prplcb_xfer_new(PurpleXfer *xfer) 122 { 123 if (purple_xfer_get_type(xfer) == PURPLE_XFER_RECEIVE) { 123 124 /* This should suppress the stupid file dialog. */ 124 purple_xfer_set_local_filename( xfer, "/tmp/wtf123");125 125 purple_xfer_set_local_filename(xfer, "/tmp/wtf123"); 126 126 127 /* Sadly the xfer struct is still empty ATM so come back after 127 128 the caller is done. */ 128 b_timeout_add( 0, prplcb_xfer_new_send_cb, xfer ); 129 } 130 else 131 { 132 struct prpl_xfer_data *px = g_new0( struct prpl_xfer_data, 1 ); 133 129 b_timeout_add(0, prplcb_xfer_new_send_cb, xfer); 130 } else { 131 struct prpl_xfer_data *px = g_new0(struct prpl_xfer_data, 1); 132 134 133 px->ft = next_ft; 135 134 px->ft->data = px; 136 135 px->xfer = xfer; 137 136 px->xfer->ui_data = px; 138 139 purple_xfer_set_filename( xfer, px->ft->file_name);140 purple_xfer_set_size( xfer, px->ft->file_size);141 137 138 purple_xfer_set_filename(xfer, px->ft->file_name); 139 purple_xfer_set_size(xfer, px->ft->file_size); 140 142 141 next_ft = NULL; 143 142 } 144 143 } 145 144 146 static void prplcb_xfer_progress( PurpleXfer *xfer, double percent)147 { 148 fprintf( stderr, "prplcb_xfer_dbg 0x%p %f\n", xfer, percent);149 } 150 151 static void prplcb_xfer_dbg( PurpleXfer *xfer)152 { 153 fprintf( stderr, "prplcb_xfer_dbg 0x%p\n", xfer);154 } 155 156 static gssize prplcb_xfer_write( PurpleXfer *xfer, const guchar *buffer, gssize size)145 static void prplcb_xfer_progress(PurpleXfer *xfer, double percent) 146 { 147 fprintf(stderr, "prplcb_xfer_dbg 0x%p %f\n", xfer, percent); 148 } 149 150 static void prplcb_xfer_dbg(PurpleXfer *xfer) 151 { 152 fprintf(stderr, "prplcb_xfer_dbg 0x%p\n", xfer); 153 } 154 155 static gssize prplcb_xfer_write(PurpleXfer *xfer, const guchar *buffer, gssize size) 157 156 { 158 157 struct prpl_xfer_data *px = xfer->ui_data; 159 158 gboolean st; 160 161 fprintf( stderr, "xfer_write %d %d\n", size, px->buf_len);162 163 b_event_remove( px->ready_timer);159 160 fprintf(stderr, "xfer_write %d %d\n", size, px->buf_len); 161 162 b_event_remove(px->ready_timer); 164 163 px->ready_timer = 0; 165 166 st = px->ft->write( px->ft, (char*) buffer, size ); 167 168 if( st && xfer->bytes_remaining == size ) 169 imcb_file_finished( px->ft ); 170 164 165 st = px->ft->write(px->ft, (char *) buffer, size); 166 167 if (st && xfer->bytes_remaining == size) { 168 imcb_file_finished(px->ft); 169 } 170 171 171 return st ? size : 0; 172 172 } 173 173 174 gssize prplcb_xfer_read( PurpleXfer *xfer, guchar **buffer, gssize size)174 gssize prplcb_xfer_read(PurpleXfer *xfer, guchar **buffer, gssize size) 175 175 { 176 176 struct prpl_xfer_data *px = xfer->ui_data; 177 178 fprintf( stderr, "xfer_read %d %d\n", size, px->buf_len ); 179 180 if( px->buf ) 181 { 177 178 fprintf(stderr, "xfer_read %d %d\n", size, px->buf_len); 179 180 if (px->buf) { 182 181 *buffer = px->buf; 183 182 px->buf = NULL; 184 185 px->ft->write_request( px->ft);186 183 184 px->ft->write_request(px->ft); 185 187 186 return px->buf_len; 188 187 } 189 188 190 189 return 0; 191 190 } … … 204 203 }; 205 204 206 static gboolean prplcb_xfer_send_cb( gpointer data, gint fd, b_input_condition cond);207 208 void purple_transfer_request( struct im_connection *ic, file_transfer_t *ft, char *handle)205 static gboolean prplcb_xfer_send_cb(gpointer data, gint fd, b_input_condition cond); 206 207 void purple_transfer_request(struct im_connection *ic, file_transfer_t *ft, char *handle) 209 208 { 210 209 PurpleAccount *pa = ic->proto_data; 211 210 struct prpl_xfer_data *px; 212 211 213 212 /* xfer_new() will pick up this variable. It's a hack but we're not 214 213 multi-threaded anyway. */ 215 214 next_ft = ft; 216 serv_send_file( purple_account_get_connection( pa ), handle, ft->file_name);217 215 serv_send_file(purple_account_get_connection(pa), handle, ft->file_name); 216 218 217 ft->write = prpl_xfer_write; 219 218 220 219 px = ft->data; 221 imcb_file_recv_start( ft);222 223 px->ready_timer = b_timeout_add( 100, prplcb_xfer_send_cb, px);224 } 225 226 static gboolean prplcb_xfer_send_cb( gpointer data, gint fd, b_input_condition cond)220 imcb_file_recv_start(ft); 221 222 px->ready_timer = b_timeout_add(100, prplcb_xfer_send_cb, px); 223 } 224 225 static gboolean prplcb_xfer_send_cb(gpointer data, gint fd, b_input_condition cond) 227 226 { 228 227 struct prpl_xfer_data *px = data; 229 230 if( px->ft->status & FT_STATUS_TRANSFERRING ) 231 { 232 fprintf( stderr, "The ft, it is ready...\n" ); 233 px->ft->write_request( px->ft ); 234 228 229 if (px->ft->status & FT_STATUS_TRANSFERRING) { 230 fprintf(stderr, "The ft, it is ready...\n"); 231 px->ft->write_request(px->ft); 232 235 233 return FALSE; 236 234 } 237 235 238 236 return TRUE; 239 237 }
Note: See TracChangeset
for help on using the changeset viewer.