Revision: 2529 http://geany.svn.sourceforge.net/geany/?rev=2529&view=rev Author: eht16 Date: 2008-04-25 05:49:38 -0700 (Fri, 25 Apr 2008)
Log Message: ----------- Refactor write_data_to_disk() and save_convert_to_encoding() from document_save_file(). Include missing error string in error message when writing the file failed.
Modified Paths: -------------- trunk/ChangeLog trunk/src/document.c
Modified: trunk/ChangeLog =================================================================== --- trunk/ChangeLog 2008-04-25 11:50:48 UTC (rev 2528) +++ trunk/ChangeLog 2008-04-25 12:49:38 UTC (rev 2529) @@ -1,3 +1,12 @@ +2008-04-25 Enrico Tröger <enrico(dot)troeger(at)uvena(dot)de> + + * src/document.c: + Refactor write_data_to_disk() and save_convert_to_encoding() + from document_save_file(). + Include missing error string in error message when writing the + file failed. + + 2008-04-25 Nick Treleaven <nick(dot)treleaven(at)btinternet(dot)com>
* src/document.c:
Modified: trunk/src/document.c =================================================================== --- trunk/src/document.c 2008-04-25 11:50:48 UTC (rev 2528) +++ trunk/src/document.c 2008-04-25 12:49:38 UTC (rev 2529) @@ -1315,6 +1315,98 @@ }
+static gsize save_convert_to_encoding(gint idx, gchar *data, gsize *len) +{ + GError *conv_error = NULL; + gchar* conv_file_contents = NULL; + gsize bytes_read; + gsize conv_len; + + g_return_val_if_fail(data != NULL, FALSE); + g_return_val_if_fail(len != NULL, FALSE); + + /* try to convert it from UTF-8 to original encoding */ + conv_file_contents = g_convert(data, *len - 1, doc_list[idx].encoding, "UTF-8", + &bytes_read, &conv_len, &conv_error); + + if (conv_error != NULL) + { + gchar *text = g_strdup_printf( +_("An error occurred while converting the file from UTF-8 in "%s". The file remains unsaved."), + doc_list[idx].encoding); + gchar *error_text; + + if (conv_error->code == G_CONVERT_ERROR_ILLEGAL_SEQUENCE) + { + gchar *context = NULL; + gint line, column; + gint context_len; + gunichar unic; + /* don't read over the doc length */ + gint max_len = MIN((gint)bytes_read + 6, (gint)*len - 1); + context = g_malloc(7); /* read 6 bytes from Sci + '\0' */ + sci_get_text_range(doc_list[idx].sci, bytes_read, max_len, context); + + /* take only one valid Unicode character from the context and discard the leftover */ + unic = g_utf8_get_char_validated(context, -1); + context_len = g_unichar_to_utf8(unic, context); + context[context_len] = '\0'; + get_line_column_from_pos(idx, bytes_read, &line, &column); + + error_text = g_strdup_printf( + _("Error message: %s\nThe error occurred at "%s" (line: %d, column: %d)."), + conv_error->message, context, line + 1, column); + g_free(context); + } + else + error_text = g_strdup_printf(_("Error message: %s."), conv_error->message); + + geany_debug("encoding error: %s", conv_error->message); + dialogs_show_msgbox_with_secondary(GTK_MESSAGE_ERROR, text, error_text); + g_error_free(conv_error); + g_free(text); + g_free(error_text); + return FALSE; + } + else + { + g_free(data); + data = conv_file_contents; + *len = conv_len; + } + + return TRUE; +} + + +static gint write_data_to_disk(gint idx, const gchar *data, gint len) +{ + FILE *fp; + gint bytes_written; + gchar *locale_filename = NULL; + gint err = 0; + + g_return_val_if_fail(data != NULL, EINVAL); + + locale_filename = utils_get_locale_from_utf8(doc_list[idx].file_name); + fp = g_fopen(locale_filename, "wb"); + if (fp == NULL) + { + g_free(locale_filename); + return errno; + } + + bytes_written = fwrite(data, sizeof(gchar), len, fp); + + if (len != bytes_written) + err = errno; + + fclose(fp); + + return err; +} + + /** * Save the %document specified by @a idx. Saving includes replacing tabs by spaces, * stripping trailing spaces and adding a final new line at the end of the file (all only if @@ -1331,13 +1423,15 @@ gboolean document_save_file(gint idx, gboolean force) { gchar *data; - FILE *fp; - gint bytes_written, len; - gchar *locale_filename = NULL; + gsize len; + gint err;
- if (! DOC_IDX_VALID(idx)) return FALSE; + if (! DOC_IDX_VALID(idx)) + return FALSE; + /* the "changed" flag should exclude the "readonly" flag, but check it anyway for safety */ - if (! force && (! doc_list[idx].changed || doc_list[idx].readonly)) return FALSE; + if (! force && (! doc_list[idx].changed || doc_list[idx].readonly)) + return FALSE;
if (doc_list[idx].file_name == NULL) { @@ -1375,85 +1469,24 @@ if (doc_list[idx].encoding != NULL && ! utils_str_equal(doc_list[idx].encoding, "UTF-8") && ! utils_str_equal(doc_list[idx].encoding, encodings[GEANY_ENCODING_NONE].charset)) { - GError *conv_error = NULL; - gchar* conv_file_contents = NULL; - gsize bytes_read; - gsize conv_len; - - /* try to convert it from UTF-8 to original encoding */ - conv_file_contents = g_convert(data, len-1, doc_list[idx].encoding, "UTF-8", - &bytes_read, &conv_len, &conv_error); - - if (conv_error != NULL) + if (! save_convert_to_encoding(idx, data, &len)) { - gchar *text = g_strdup_printf( - _("An error occurred while converting the file from UTF-8 in "%s". The file remains unsaved."), - doc_list[idx].encoding); - gchar *error_text; - - if (conv_error->code == G_CONVERT_ERROR_ILLEGAL_SEQUENCE) - { - gchar *context = NULL; - gint line, column; - gint context_len; - gunichar unic; - gint max_len = MIN((gint)bytes_read + 6, len - 1); /* don't read over the doc length */ - context = g_malloc(7); /* read 6 bytes from Sci + '\0' */ - sci_get_text_range(doc_list[idx].sci, bytes_read, max_len, context); - - /* take only one valid Unicode character from the context and discard the leftover */ - unic = g_utf8_get_char_validated(context, -1); - context_len = g_unichar_to_utf8(unic, context); - context[context_len] = '\0'; - get_line_column_from_pos(idx, bytes_read, &line, &column); - - error_text = g_strdup_printf( - _("Error message: %s\nThe error occurred at "%s" (line: %d, column: %d)."), - conv_error->message, context, line + 1, column); - g_free(context); - } - else - error_text = g_strdup_printf(_("Error message: %s."), conv_error->message); - - geany_debug("encoding error: %s", conv_error->message); - dialogs_show_msgbox_with_secondary(GTK_MESSAGE_ERROR, text, error_text); - g_error_free(conv_error); g_free(data); - g_free(text); - g_free(error_text); return FALSE; } - else - { - g_free(data); - data = conv_file_contents; - len = conv_len; - } } else { len = strlen(data); }
- locale_filename = utils_get_locale_from_utf8(doc_list[idx].file_name); - fp = g_fopen(locale_filename, "wb"); - g_free(locale_filename); - - if (fp == NULL) - { - ui_set_statusbar(TRUE, _("Error saving file (%s)."), g_strerror(errno)); - utils_beep(); - g_free(data); - return FALSE; - } - bytes_written = fwrite(data, sizeof (gchar), len, fp); - fclose (fp); - + /* actually write the content of data to the file on disk */ + err = write_data_to_disk(idx, data, len); g_free(data);
- if (len != bytes_written) + if (err != 0) { - ui_set_statusbar(TRUE, _("Error saving file.")); + ui_set_statusbar(TRUE, _("Error saving file (%s)."), g_strerror(err)); utils_beep(); return FALSE; }
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.