gaim/gaim

13282c8edf74
Parents 7de1ace6a7a9
Children 65e83eb75cac
Better handling of filenames in file transfers when using a non-UTF8
filename encoding on the filesyste. This should fix a number of bugs.
  • +23 -12
    src/ft.c
  • +13 -5
    src/gtkft.c
  • --- a/src/ft.c Sun May 15 09:27:59 2005 -0400
    +++ b/src/ft.c Sun May 15 14:15:37 2005 -0400
    @@ -139,23 +139,26 @@
    static void gaim_xfer_show_file_error(GaimXfer *xfer, const char *filename)
    {
    - gchar *msg = NULL;
    + int err = errno;
    + gchar *msg = NULL, *utf8;
    GaimXferType xfer_type = gaim_xfer_get_type(xfer);
    + utf8 = g_filename_to_utf8(filename, -1, NULL, NULL, NULL);
    switch(xfer_type) {
    case GAIM_XFER_SEND:
    msg = g_strdup_printf(_("Error reading %s: \n%s.\n"),
    - filename, strerror(errno));
    + utf8, strerror(err));
    break;
    case GAIM_XFER_RECEIVE:
    msg = g_strdup_printf(_("Error writing %s: \n%s.\n"),
    - filename, strerror(errno));
    + utf8, strerror(err));
    break;
    default:
    msg = g_strdup_printf(_("Error accessing %s: \n%s.\n"),
    - filename, strerror(errno));
    + utf8, strerror(err));
    break;
    - }
    + }
    + g_free(utf8);
    gaim_xfer_conversation_write(xfer, msg, TRUE);
    gaim_xfer_error(xfer_type, xfer->who, msg);
    @@ -200,8 +203,11 @@
    }
    else if ((gaim_xfer_get_type(xfer) == GAIM_XFER_RECEIVE) &&
    S_ISDIR(st.st_mode)) {
    - char *msg = g_strdup_printf(
    - _("%s is not a regular file. Cowardly refusing to overwrite it.\n"), filename);
    + char *utf8, *msg;
    + utf8 = g_filename_to_utf8(filename, -1, NULL, NULL, NULL);
    + msg = g_strdup_printf(
    + _("%s is not a regular file. Cowardly refusing to overwrite it.\n"), utf8);
    + g_free(utf8);
    gaim_notify_error(NULL, NULL, msg, NULL);
    g_free(msg);
    gaim_xfer_request_denied(xfer);
    @@ -354,13 +360,15 @@
    }
    if (type == GAIM_XFER_SEND) {
    - char *msg;
    + char *msg, *utf8;
    /* Check the filename. */
    if (g_strrstr(filename, "..")) {
    + char *utf8 = g_filename_to_utf8(filename, -1, NULL, NULL, NULL);
    - msg = g_strdup_printf(_("%s is not a valid filename.\n"), filename);
    + msg = g_strdup_printf(_("%s is not a valid filename.\n"), utf8);
    gaim_xfer_error(type, xfer->who, msg);
    + g_free(utf8);
    g_free(msg);
    gaim_xfer_unref(xfer);
    @@ -374,11 +382,14 @@
    }
    gaim_xfer_set_local_filename(xfer, filename);
    - gaim_xfer_set_filename(xfer, g_basename(filename));
    gaim_xfer_set_size(xfer, st.st_size);
    -
    +
    + utf8 = g_filename_to_utf8(g_basename(filename), -1, NULL, NULL, NULL);
    + gaim_xfer_set_filename(xfer, utf8);
    +
    msg = g_strdup_printf(_("Offering to send %s to %s"),
    - filename, xfer->who);
    + utf8, xfer->who);
    + g_free(utf8);
    gaim_xfer_conversation_write(xfer, msg, FALSE);
    g_free(msg);
    }
    --- a/src/gtkft.c Sun May 15 09:27:59 2005 -0400
    +++ b/src/gtkft.c Sun May 15 14:15:37 2005 -0400
    @@ -187,7 +187,7 @@
    {
    GaimGtkXferUiData *data;
    char *kbsec, *time_elapsed, *time_remaining;
    - char *status;
    + char *status, *utf8;
    if (dialog == NULL || xfer == NULL)
    return;
    @@ -240,13 +240,18 @@
    gaim_xfer_get_filename(xfer));
    } else {
    char *tmp;
    +
    tmp = g_path_get_basename(gaim_xfer_get_local_filename(xfer));
    - gtk_label_set_text(GTK_LABEL(dialog->filename_label), tmp);
    + utf8 = g_filename_to_utf8(tmp, -1, NULL, NULL, NULL);
    g_free(tmp);
    +
    + gtk_label_set_text(GTK_LABEL(dialog->filename_label), utf8);
    + g_free(utf8);
    }
    - gtk_label_set_text(GTK_LABEL(dialog->localfile_label),
    - gaim_xfer_get_local_filename(xfer));
    + utf8 = g_filename_to_utf8((gaim_xfer_get_local_filename(xfer)), -1, NULL, NULL, NULL);
    + gtk_label_set_text(GTK_LABEL(dialog->localfile_label), utf8);
    + g_free(utf8);
    gtk_label_set_text(GTK_LABEL(dialog->status_label), status);
    @@ -815,7 +820,7 @@
    GaimXferType type;
    GdkPixbuf *pixbuf;
    char *size_str, *remaining_str;
    - char *lfilename;
    + char *lfilename, *utf8;
    g_return_if_fail(dialog != NULL);
    g_return_if_fail(xfer != NULL);
    @@ -843,6 +848,9 @@
    gtk_list_store_append(dialog->model, &data->iter);
    lfilename = g_path_get_basename(gaim_xfer_get_local_filename(xfer));
    + utf8 = g_filename_to_utf8(lfilename, -1, NULL, NULL, NULL);
    + g_free(lfilename);
    + lfilename = utf8;
    gtk_list_store_set(dialog->model, &data->iter,
    COLUMN_STATUS, pixbuf,
    COLUMN_PROGRESS, 0.0,