comparison src/ft.c @ 4247:3ea14f99c35c

[gaim-migrate @ 4497] Fixed the "Clicking the close button on a file transfer send crashes gaim" bug. It turns out everything was mapped to ft_cancel(), which accepted a struct file_transfer *, but all those signal handlers had different params, so all kinds of bad, evil things happened. Tsk tsk. And now, back to work on my Instant Massage prpl. committer: Tailor Script <tailor@pidgin.im>
author Christian Hammond <chipx86@chipx86.com>
date Wed, 08 Jan 2003 07:04:01 +0000
parents cd84b0fd63fc
children 9c7fcb211886
comparison
equal deleted inserted replaced
4246:2a2d6d21f1d7 4247:3ea14f99c35c
83 static void ft_delete(struct file_transfer *xfer); 83 static void ft_delete(struct file_transfer *xfer);
84 static void ft_callback(gpointer data, gint source, GaimInputCondition condition); 84 static void ft_callback(gpointer data, gint source, GaimInputCondition condition);
85 static void ft_nextfile(struct file_transfer *xfer); 85 static void ft_nextfile(struct file_transfer *xfer);
86 static int ft_mkdir(const char *name); 86 static int ft_mkdir(const char *name);
87 static int ft_mkdir_help(char *dir); 87 static int ft_mkdir_help(char *dir);
88 static gboolean ft_choose_file_close(GtkWidget *widget, GdkEvent *event,
89 gpointer user_data);
88 90
89 static struct file_transfer *ft_new(int type, struct gaim_connection *gc, 91 static struct file_transfer *ft_new(int type, struct gaim_connection *gc,
90 const char *who) 92 const char *who)
91 { 93 {
92 struct file_transfer *xfer = g_new0(struct file_transfer, 1); 94 struct file_transfer *xfer = g_new0(struct file_transfer, 1);
93 xfer->type = type; 95 xfer->type = type;
94 xfer->state = FILE_TRANSFER_STATE_ASK; 96 xfer->state = FILE_TRANSFER_STATE_ASK;
95 xfer->gc = gc; 97 xfer->gc = gc;
96 xfer->who = g_strdup(who); 98 xfer->who = g_strdup(who);
97 xfer->filesdone = 0; 99 xfer->filesdone = 0;
100 xfer->w = NULL;
98 101
99 return xfer; 102 return xfer;
100 } 103 }
101 104
102 struct file_transfer *transfer_in_add(struct gaim_connection *gc, 105 struct file_transfer *transfer_in_add(struct gaim_connection *gc,
164 /* We canceled the transfer, either by declining the initial 167 /* We canceled the transfer, either by declining the initial
165 * confirmation dialog or canceling the file dialog. 168 * confirmation dialog or canceling the file dialog.
166 */ 169 */
167 static void ft_cancel(struct file_transfer *xfer) 170 static void ft_cancel(struct file_transfer *xfer)
168 { 171 {
172 debug_printf("** ft_cancel\n");
173
169 /* Make sure we weren't aborted while waiting for 174 /* Make sure we weren't aborted while waiting for
170 * confirmation from the user. 175 * confirmation from the user.
171 */ 176 */
172 if (xfer->state == FILE_TRANSFER_STATE_INTERRUPTED) { 177 if (xfer->state == FILE_TRANSFER_STATE_INTERRUPTED) {
173 xfer->state = FILE_TRANSFER_STATE_CLEANUP; 178 xfer->state = FILE_TRANSFER_STATE_CLEANUP;
230 else if (xfer->state == FILE_TRANSFER_STATE_CHOOSEFILE) { 235 else if (xfer->state == FILE_TRANSFER_STATE_CHOOSEFILE) {
231 /* It's safe to clean up now. Just make sure we 236 /* It's safe to clean up now. Just make sure we
232 * destroy the dialog window first. 237 * destroy the dialog window first.
233 */ 238 */
234 if (xfer->w) { 239 if (xfer->w) {
235 gtk_signal_disconnect_by_func(GTK_OBJECT(xfer->w), 240 g_signal_handlers_disconnect_by_func(G_OBJECT(xfer->w),
236 G_CALLBACK(ft_cancel), xfer); 241 G_CALLBACK(ft_choose_file_close), xfer);
237 gtk_widget_destroy(xfer->w); 242 gtk_widget_destroy(xfer->w);
238 xfer->w = NULL; 243 xfer->w = NULL;
239 } 244 }
240 } 245 }
241 246
365 *size = xfer->sizes[xfer->filesdone]; 370 *size = xfer->sizes[xfer->filesdone];
366 *name = xfer->names[xfer->filesdone]; 371 *name = xfer->names[xfer->filesdone];
367 return 0; 372 return 0;
368 } 373 }
369 374
375 static gboolean
376 ft_choose_file_close(GtkWidget *widget, GdkEvent *event, gpointer user_data)
377 {
378 ft_cancel((struct file_transfer *)user_data);
379
380 return FALSE;
381 }
382
383 static void
384 ft_cancel_button_cb(GtkButton *button, gpointer user_data)
385 {
386 ft_cancel((struct file_transfer *)user_data);
387 }
388
370 static int ft_choose_file(struct file_transfer *xfer) 389 static int ft_choose_file(struct file_transfer *xfer)
371 { 390 {
372 char *curdir = g_get_current_dir(); /* should be freed */ 391 char *curdir = g_get_current_dir(); /* should be freed */
373 char *initstr; 392 char *initstr;
374 393
399 418
400 gtk_file_selection_set_filename(GTK_FILE_SELECTION(xfer->w), 419 gtk_file_selection_set_filename(GTK_FILE_SELECTION(xfer->w),
401 initstr); 420 initstr);
402 g_free(initstr); 421 g_free(initstr);
403 422
404 g_signal_connect(GTK_OBJECT(xfer->w), "delete_event", 423 g_signal_connect(G_OBJECT(xfer->w), "delete_event",
405 G_CALLBACK(ft_cancel), xfer); 424 G_CALLBACK(ft_choose_file_close), xfer);
406 g_signal_connect(GTK_OBJECT(GTK_FILE_SELECTION(xfer->w)->cancel_button), 425 g_signal_connect(G_OBJECT(GTK_FILE_SELECTION(xfer->w)->cancel_button), "clicked",
407 "clicked", G_CALLBACK(ft_cancel), xfer); 426 G_CALLBACK(ft_cancel_button_cb), xfer);
408 g_signal_connect(GTK_OBJECT(GTK_FILE_SELECTION(xfer->w)->ok_button), 427 g_signal_connect(G_OBJECT(GTK_FILE_SELECTION(xfer->w)->ok_button), "clicked",
409 "clicked", G_CALLBACK(ft_choose_ok), xfer); 428 G_CALLBACK(ft_choose_ok), xfer);
429
410 gtk_widget_show(xfer->w); 430 gtk_widget_show(xfer->w);
411 431
412 return 0; 432 return 0;
413 } 433 }
414 434