| 429 } |
429 } |
| 430 |
430 |
| 431 static void |
431 static void |
| 432 open_button_cb(GtkButton *button, PidginXferDialog *dialog) |
432 open_button_cb(GtkButton *button, PidginXferDialog *dialog) |
| 433 { |
433 { |
| 434 #ifdef _WIN32 |
434 gchar *uri = NULL; |
| 435 /* If using Win32... */ |
435 GError *error = NULL; |
| 436 int code; |
436 |
| 437 wchar_t *wc_filename = g_utf8_to_utf16( |
437 uri = g_strdup_printf("file://%s", |
| 438 purple_xfer_get_local_filename( |
438 purple_xfer_get_local_filename(dialog->selected_xfer)); |
| 439 dialog->selected_xfer), |
439 if(!gtk_show_uri_on_window(GTK_WINDOW(dialog), uri, GDK_CURRENT_TIME, |
| 440 -1, NULL, NULL, NULL); |
440 &error)) |
| 441 |
|
| 442 code = (int) ShellExecuteW(NULL, NULL, wc_filename, NULL, NULL, |
|
| 443 SW_SHOW); |
|
| 444 |
|
| 445 g_free(wc_filename); |
|
| 446 |
|
| 447 if (code == SE_ERR_ASSOCINCOMPLETE || code == SE_ERR_NOASSOC) |
|
| 448 { |
441 { |
| 449 purple_notify_error(dialog, NULL, |
442 gchar *tmp = g_strdup_printf( |
| 450 _("There is no application configured to open this type of file."), |
443 _("Error launching %s: %s"), |
| 451 NULL, NULL); |
444 purple_xfer_get_local_filename(dialog->selected_xfer), |
| 452 } |
445 error->message); |
| 453 else if (code < 32) |
446 purple_notify_error(dialog, NULL, _("Unable to open file."), tmp, NULL); |
| 454 { |
447 g_free(tmp); |
| 455 purple_notify_error(dialog, NULL, |
448 g_error_free(error); |
| 456 _("An error occurred while opening the file."), NULL, NULL); |
449 } |
| 457 purple_debug_warning("xfer", "filename: %s; code: %d\n", |
450 g_free(uri); |
| 458 purple_xfer_get_local_filename(dialog->selected_xfer), code); |
|
| 459 } |
|
| 460 #else |
|
| 461 const char *filename = purple_xfer_get_local_filename(dialog->selected_xfer); |
|
| 462 char *command = NULL; |
|
| 463 GError *error = NULL; |
|
| 464 |
|
| 465 if (purple_running_gnome()) |
|
| 466 { |
|
| 467 char *escaped = g_shell_quote(filename); |
|
| 468 command = g_strdup_printf("gnome-open %s", escaped); |
|
| 469 g_free(escaped); |
|
| 470 } |
|
| 471 else if (purple_running_kde()) |
|
| 472 { |
|
| 473 char *escaped = g_shell_quote(filename); |
|
| 474 |
|
| 475 if (g_str_has_suffix(filename, ".desktop")) { |
|
| 476 command = g_strdup_printf("kfmclient openURL %s 'text/plain'", escaped); |
|
| 477 } else { |
|
| 478 command = g_strdup_printf("kfmclient openURL %s", escaped); |
|
| 479 } |
|
| 480 g_free(escaped); |
|
| 481 } |
|
| 482 else |
|
| 483 { |
|
| 484 gchar *uri = g_strdup_printf("file://%s", filename); |
|
| 485 purple_notify_uri(NULL, uri); |
|
| 486 g_free(uri); |
|
| 487 return; |
|
| 488 } |
|
| 489 |
|
| 490 if (purple_program_is_valid(command)) |
|
| 491 { |
|
| 492 gint exit_status; |
|
| 493 if (!g_spawn_command_line_sync(command, NULL, NULL, &exit_status, &error)) |
|
| 494 { |
|
| 495 char *tmp = g_strdup_printf(_("Error launching %s: %s"), |
|
| 496 purple_xfer_get_local_filename(dialog->selected_xfer), |
|
| 497 error->message); |
|
| 498 purple_notify_error(dialog, NULL, _("Unable to open file."), tmp, NULL); |
|
| 499 g_free(tmp); |
|
| 500 g_error_free(error); |
|
| 501 } |
|
| 502 if (exit_status != 0) |
|
| 503 { |
|
| 504 char *primary = g_strdup_printf(_("Error running %s"), command); |
|
| 505 char *secondary = g_strdup_printf(_("Process returned error code %d"), |
|
| 506 exit_status); |
|
| 507 purple_notify_error(dialog, NULL, primary, secondary, NULL); |
|
| 508 g_free(primary); |
|
| 509 g_free(secondary); |
|
| 510 } |
|
| 511 } |
|
| 512 #endif |
|
| 513 } |
451 } |
| 514 |
452 |
| 515 static void |
453 static void |
| 516 remove_button_cb(GtkButton *button, PidginXferDialog *dialog) |
454 remove_button_cb(GtkButton *button, PidginXferDialog *dialog) |
| 517 { |
455 { |