[gimp] app: port gimp_text_buffer_load() and _save() to GIO
- From: Michael Natterer <mitch src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gimp] app: port gimp_text_buffer_load() and _save() to GIO
- Date: Thu, 3 Jul 2014 11:04:30 +0000 (UTC)
commit 0753b5a137d0fcff0581f30ec53f1e10a322b973
Author: Michael Natterer <mitch gimp org>
Date: Thu Jul 3 12:57:18 2014 +0200
app: port gimp_text_buffer_load() and _save() to GIO
app/widgets/gimptextbuffer.c | 140 +++++++++++++++++++++---------------------
1 files changed, 71 insertions(+), 69 deletions(-)
---
diff --git a/app/widgets/gimptextbuffer.c b/app/widgets/gimptextbuffer.c
index 5f32e7e..9b6b773 100644
--- a/app/widgets/gimptextbuffer.c
+++ b/app/widgets/gimptextbuffer.c
@@ -21,22 +21,6 @@
#include "config.h"
#include <stdlib.h>
-#include <errno.h>
-#include <fcntl.h>
-#include <string.h>
-#include <sys/types.h>
-
-#ifdef HAVE_UNISTD_H
-#include <unistd.h>
-#endif
-
-#include <glib/gstdio.h>
-
-#include <glib.h>
-
-#ifdef G_OS_WIN32
-#include "libgimpbase/gimpwin32-io.h"
-#endif
#include <gegl.h>
#include <gtk/gtk.h>
@@ -1403,25 +1387,26 @@ gimp_text_buffer_load (GimpTextBuffer *buffer,
GFile *file,
GError **error)
{
- gchar *path;
- FILE *f;
- gchar buf[2048];
- gint remaining = 0;
- GtkTextIter iter;
+ GInputStream *input;
+ gchar buf[2048];
+ gint to_read;
+ gsize bytes_read;
+ gsize total_read = 0;
+ gint remaining = 0;
+ GtkTextIter iter;
+ GError *my_error = NULL;
g_return_val_if_fail (GIMP_IS_TEXT_BUFFER (buffer), FALSE);
g_return_val_if_fail (G_IS_FILE (file), FALSE);
g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
- path = g_file_get_path (file);
- f = g_fopen (path, "r");
- g_free (file);
-
- if (! f)
+ input = G_INPUT_STREAM (g_file_read (file, NULL, &my_error));
+ if (! input)
{
- g_set_error_literal (error, G_FILE_ERROR,
- g_file_error_from_errno (errno),
- g_strerror (errno));
+ g_set_error (error, my_error->domain, my_error->code,
+ _("Could not open '%s' for reading: %s"),
+ gimp_file_get_utf8_name (file), my_error->message);
+ g_clear_error (&my_error);
return FALSE;
}
@@ -1430,35 +1415,55 @@ gimp_text_buffer_load (GimpTextBuffer *buffer,
gimp_text_buffer_set_text (buffer, NULL);
gtk_text_buffer_get_end_iter (GTK_TEXT_BUFFER (buffer), &iter);
- while (! feof (f))
+ do
{
+ gboolean success;
const char *leftover;
- gint count;
- gint to_read = sizeof (buf) - remaining - 1;
- count = fread (buf + remaining, 1, to_read, f);
- buf[count + remaining] = '\0';
+ to_read = sizeof (buf) - remaining - 1;
+
+ success = g_input_stream_read_all (input, buf + remaining, to_read,
+ &bytes_read, NULL, &my_error);
+
+ total_read += bytes_read;
+ buf[bytes_read + remaining] = '\0';
- g_utf8_validate (buf, count + remaining, &leftover);
+ g_utf8_validate (buf, bytes_read + remaining, &leftover);
gtk_text_buffer_insert (GTK_TEXT_BUFFER (buffer), &iter,
buf, leftover - buf);
gtk_text_buffer_get_end_iter (GTK_TEXT_BUFFER (buffer), &iter);
- remaining = (buf + remaining + count) - leftover;
+ remaining = (buf + remaining + bytes_read) - leftover;
g_memmove (buf, leftover, remaining);
- if (remaining > 6 || count < to_read)
- break;
+ if (! success)
+ {
+ if (total_read > 0)
+ {
+ g_message (_("Input file '%s' appears truncated: %s"),
+ gimp_file_get_utf8_name (file),
+ my_error->message);
+ g_clear_error (&my_error);
+ break;
+ }
+
+ gtk_text_buffer_end_user_action (GTK_TEXT_BUFFER (buffer));
+ g_object_unref (input);
+
+ g_propagate_error (error, my_error);
+
+ return FALSE;
+ }
}
+ while (remaining <= 6 && bytes_read == to_read);
if (remaining)
g_message (_("Invalid UTF-8 data in file '%s'."),
gimp_file_get_utf8_name (file));
- fclose (f);
-
gtk_text_buffer_end_user_action (GTK_TEXT_BUFFER (buffer));
+ g_object_unref (input);
return TRUE;
}
@@ -1469,25 +1474,25 @@ gimp_text_buffer_save (GimpTextBuffer *buffer,
gboolean selection_only,
GError **error)
{
- GtkTextIter start_iter;
- GtkTextIter end_iter;
- gchar *path;
- gint fd;
- gchar *text_contents;
+ GOutputStream *output;
+ GtkTextIter start_iter;
+ GtkTextIter end_iter;
+ gchar *text_contents;
+ GError *my_error = NULL;
g_return_val_if_fail (GIMP_IS_TEXT_BUFFER (buffer), FALSE);
g_return_val_if_fail (G_IS_FILE (file), FALSE);
g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
- path = g_file_get_path (file);
- fd = g_open (path, O_WRONLY | O_CREAT | O_APPEND, 0666);
- g_free (path);
-
- if (fd == -1)
+ output = G_OUTPUT_STREAM (g_file_replace (file,
+ NULL, FALSE, G_FILE_CREATE_NONE,
+ NULL, &my_error));
+ if (! output)
{
- g_set_error_literal (error, G_FILE_ERROR,
- g_file_error_from_errno (errno),
- g_strerror (errno));
+ g_set_error (error, my_error->domain, my_error->code,
+ _("Could not open '%s' for writing: %s"),
+ gimp_file_get_utf8_name (file), my_error->message);
+ g_clear_error (&my_error);
return FALSE;
}
@@ -1503,29 +1508,26 @@ gimp_text_buffer_save (GimpTextBuffer *buffer,
if (text_contents)
{
- gint text_length = strlen (text_contents);
+ gint text_length = strlen (text_contents);
+ gsize bytes_written;
- if (text_length > 0)
+ if (! g_output_stream_write_all (output, text_contents, text_length,
+ &bytes_written, NULL, &my_error) ||
+ bytes_written != text_length)
{
- gint bytes_written;
-
- bytes_written = write (fd, text_contents, text_length);
-
- if (bytes_written != text_length)
- {
- g_free (text_contents);
- close (fd);
- g_set_error_literal (error, G_FILE_ERROR,
- g_file_error_from_errno (errno),
- g_strerror (errno));
- return FALSE;
- }
+ g_set_error (error, my_error->domain, my_error->code,
+ _("Writing palette file '%s' failed: %s"),
+ gimp_file_get_utf8_name (file), my_error->message);
+ g_clear_error (&my_error);
+ g_free (text_contents);
+ g_object_unref (output);
+ return FALSE;
}
g_free (text_contents);
}
- close (fd);
+ g_object_unref (output);
return TRUE;
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]