- Timestamp:
- 2010-05-18T00:08:17Z (15 years ago)
- Branches:
- master
- Children:
- 31fc06fb
- Parents:
- 5d1b3a95
- Location:
- protocols/purple
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
protocols/purple/ft.c
r5d1b3a95 rc96c72f 46 46 47 47 struct im_connection *purple_ic_by_pa( PurpleAccount *pa ); 48 static gboolean prplcb_xfer_new_send_cb( gpointer data, gint fd, b_input_condition cond ); 49 static gboolean prpl_xfer_write_request( struct file_transfer *ft ); 50 51 52 /* Receiving files (IM->UI): */ 53 static void prpl_xfer_accept( struct file_transfer *ft ) 54 { 55 struct prpl_xfer_data *px = ft->data; 56 purple_xfer_request_accepted( px->xfer, NULL ); 57 prpl_xfer_write_request( ft ); 58 } 59 60 static void prpl_xfer_canceled( struct file_transfer *ft, char *reason ) 61 { 62 struct prpl_xfer_data *px = ft->data; 63 purple_xfer_request_denied( px->xfer ); 64 } 65 66 static void prplcb_xfer_new( PurpleXfer *xfer ) 67 { 68 if( purple_xfer_get_type( xfer ) == PURPLE_XFER_RECEIVE ) 69 { 70 struct prpl_xfer_data *px = g_new0( struct prpl_xfer_data, 1 ); 71 72 xfer->ui_data = px; 73 px->xfer = xfer; 74 px->fn = mktemp( g_strdup( "/tmp/bitlbee-purple-ft.XXXXXX" ) ); 75 px->fd = -1; 76 77 purple_xfer_set_local_filename( xfer, px->fn ); 78 79 /* Sadly the xfer struct is still empty ATM so come back after 80 the caller is done. */ 81 b_timeout_add( 0, prplcb_xfer_new_send_cb, xfer ); 82 } 83 else 84 { 85 /* 86 struct prpl_xfer_data *px = g_new0( struct prpl_xfer_data, 1 ); 87 88 px->fd = -1; 89 px->ft = next_ft; 90 px->ft->data = px; 91 px->xfer = xfer; 92 px->xfer->ui_data = px; 93 94 purple_xfer_set_filename( xfer, px->ft->file_name ); 95 purple_xfer_set_size( xfer, px->ft->file_size ); 96 97 next_ft = NULL; 98 */ 99 } 100 } 101 102 static gboolean prplcb_xfer_new_send_cb( gpointer data, gint fd, b_input_condition cond ) 103 { 104 PurpleXfer *xfer = data; 105 struct im_connection *ic = purple_ic_by_pa( xfer->account ); 106 struct prpl_xfer_data *px = xfer->ui_data; 107 PurpleBuddy *buddy; 108 const char *who; 109 110 buddy = purple_find_buddy( xfer->account, xfer->who ); 111 who = buddy ? purple_buddy_get_name( buddy ) : xfer->who; 112 113 /* TODO(wilmer): After spreading some more const goodness in BitlBee, 114 remove the evil cast below. */ 115 px->ft = imcb_file_send_start( ic, (char*) who, xfer->filename, xfer->size ); 116 px->ft->data = px; 117 118 px->ft->accept = prpl_xfer_accept; 119 px->ft->canceled = prpl_xfer_canceled; 120 px->ft->write_request = prpl_xfer_write_request; 121 122 return FALSE; 123 } 48 124 49 125 gboolean try_write_to_ui( gpointer data, gint fd, b_input_condition cond ) … … 53 129 struct stat fs; 54 130 off_t tx_bytes; 55 56 fprintf( stderr, "write_to_ui\n" );57 131 58 132 /* If we don't have the file opened yet, there's no data so wait. */ … … 63 137 fstat( px->fd, &fs ); 64 138 65 fprintf( stderr, "write_to_ui %zd %zd %zd\n", fs.st_size, tx_bytes, px->xfer->size );66 67 139 if( fs.st_size > tx_bytes ) 68 140 { … … 72 144 if( read( px->fd, buf, n ) == n && ft->write( ft, buf, n ) ) 73 145 { 74 fprintf( stderr, "Wrote %zd bytes\n", n );75 146 px->ui_wants_data = FALSE; 76 147 } … … 96 167 struct prpl_xfer_data *px = ft->data; 97 168 98 fprintf( stderr, "wrq\n" );99 100 169 px->ui_wants_data = TRUE; 101 170 try_write_to_ui( ft, 0, 0 ); … … 104 173 } 105 174 106 static gboolean prpl_xfer_write( struct file_transfer *ft, char *buffer, unsigned int len ) 107 { 108 return FALSE; 109 } 110 111 static void prpl_xfer_accept( struct file_transfer *ft ) 112 { 113 struct prpl_xfer_data *px = ft->data; 114 purple_xfer_request_accepted( px->xfer, NULL ); 115 prpl_xfer_write_request( ft ); 116 } 117 118 static void prpl_xfer_canceled( struct file_transfer *ft, char *reason ) 119 { 120 struct prpl_xfer_data *px = ft->data; 121 purple_xfer_request_denied( px->xfer ); 122 } 123 124 static gboolean prplcb_xfer_new_send_cb( gpointer data, gint fd, b_input_condition cond ); 125 126 static void prplcb_xfer_new( PurpleXfer *xfer ) 127 { 128 if( purple_xfer_get_type( xfer ) == PURPLE_XFER_RECEIVE ) 129 { 130 struct prpl_xfer_data *px = g_new0( struct prpl_xfer_data, 1 ); 131 132 xfer->ui_data = px; 133 px->xfer = xfer; 134 px->fn = mktemp( g_strdup( "/tmp/bitlbee-purple-ft.XXXXXX" ) ); 135 px->fd = -1; 136 137 purple_xfer_set_local_filename( xfer, px->fn ); 138 139 /* Sadly the xfer struct is still empty ATM so come back after 140 the caller is done. */ 141 b_timeout_add( 0, prplcb_xfer_new_send_cb, xfer ); 142 } 143 else 144 { 145 /* 146 struct prpl_xfer_data *px = g_new0( struct prpl_xfer_data, 1 ); 147 148 px->fd = -1; 149 px->ft = next_ft; 150 px->ft->data = px; 151 px->xfer = xfer; 152 px->xfer->ui_data = px; 153 154 purple_xfer_set_filename( xfer, px->ft->file_name ); 155 purple_xfer_set_size( xfer, px->ft->file_size ); 156 157 next_ft = NULL; 158 */ 159 } 160 } 161 162 static gboolean prplcb_xfer_new_send_cb( gpointer data, gint fd, b_input_condition cond ) 163 { 164 PurpleXfer *xfer = data; 165 struct im_connection *ic = purple_ic_by_pa( xfer->account ); 166 struct prpl_xfer_data *px = xfer->ui_data; 167 PurpleBuddy *buddy; 168 const char *who; 169 170 buddy = purple_find_buddy( xfer->account, xfer->who ); 171 who = buddy ? purple_buddy_get_name( buddy ) : xfer->who; 172 173 /* TODO(wilmer): After spreading some more const goodness in BitlBee, 174 remove the evil cast below. */ 175 px->ft = imcb_file_send_start( ic, (char*) who, xfer->filename, xfer->size ); 176 px->ft->data = px; 177 178 px->ft->accept = prpl_xfer_accept; 179 px->ft->canceled = prpl_xfer_canceled; 180 px->ft->write_request = prpl_xfer_write_request; 181 182 return FALSE; 183 } 184 175 176 /* Generic (IM<>UI): */ 185 177 static void prplcb_xfer_destroy( PurpleXfer *xfer ) 186 178 { … … 197 189 struct prpl_xfer_data *px = xfer->ui_data; 198 190 199 fprintf( stderr, "prplcb_xfer_progress 0x%p %f\n", xfer, percent );200 201 191 if( px->fd == -1 && percent > 0 ) 202 192 { … … 206 196 207 197 /* Unlink it now, because we don't need it after this. */ 208 //unlink( px->fn );198 unlink( px->fn ); 209 199 } 210 200 … … 212 202 try_write_to_ui( px->ft, 0, 0 ); 213 203 else 204 /* Another nice problem: If we have the whole file, it only 205 gets closed when we return. Problem: There may still be 206 stuff buffered and not written, we'll only see it after 207 the caller close()s the file. So poll the file after that. */ 214 208 b_timeout_add( 0, try_write_to_ui, px->ft ); 215 209 } … … 226 220 fprintf( stderr, "prplcb_xfer_dbg 0x%p\n", xfer ); 227 221 } 222 223 224 /* Sending files (UI->IM): */ 225 static gboolean prpl_xfer_write( struct file_transfer *ft, char *buffer, unsigned int len ) 226 { 227 return FALSE; 228 } 229 230 void purple_transfer_request( struct im_connection *ic, file_transfer_t *ft, char *handle ) 231 { 232 PurpleAccount *pa = ic->proto_data; 233 struct prpl_xfer_data *px; 234 235 /* xfer_new() will pick up this variable. It's a hack but we're not 236 multi-threaded anyway. */ 237 next_ft = ft; 238 serv_send_file( purple_account_get_connection( pa ), handle, ft->file_name ); 239 240 ft->write = prpl_xfer_write; 241 242 px = ft->data; 243 imcb_file_recv_start( ft ); 244 } 245 246 247 228 248 229 249 PurpleXferUiOps bee_xfer_uiops = … … 239 259 prplcb_xfer_dbg, 240 260 }; 241 242 void purple_transfer_request( struct im_connection *ic, file_transfer_t *ft, char *handle )243 {244 PurpleAccount *pa = ic->proto_data;245 struct prpl_xfer_data *px;246 247 /* xfer_new() will pick up this variable. It's a hack but we're not248 multi-threaded anyway. */249 next_ft = ft;250 serv_send_file( purple_account_get_connection( pa ), handle, ft->file_name );251 252 ft->write = prpl_xfer_write;253 254 px = ft->data;255 imcb_file_recv_start( ft );256 } -
protocols/purple/purple.c
r5d1b3a95 rc96c72f 142 142 PurpleKeyValuePair *kv = io->data; 143 143 opts = g_slist_append( opts, kv->value ); 144 /* TODO: kv->value is not a char*, WTF? */ 144 145 if( strcmp( kv->value, kv->key ) != 0 ) 145 g_string_append_printf( help, "%s (%s), ", kv->value, kv->key );146 g_string_append_printf( help, "%s (%s), ", (char*) kv->value, kv->key ); 146 147 else 147 g_string_append_printf( help, "%s, ", kv->value );148 g_string_append_printf( help, "%s, ", (char*) kv->value ); 148 149 } 149 150 g_string_truncate( help, help->len - 2 ); … … 455 456 } 456 457 457 void purple_chat_leave( struct groupchat *gc , char *who)458 void purple_chat_leave( struct groupchat *gc ) 458 459 { 459 460 PurpleConversation *pc = gc->data;
Note: See TracChangeset
for help on using the changeset viewer.