[easytag] Use GIO instead of stdio in picture.c, bug 700050
- From: David King <davidk src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [easytag] Use GIO instead of stdio in picture.c, bug 700050
- Date: Tue, 14 May 2013 16:23:21 +0000 (UTC)
commit d0d458325bc40bbb82da4fc37dc81a64a930333d
Author: Abhinav <abhijangda hotmail com>
Date: Tue May 14 17:18:58 2013 +0530
Use GIO instead of stdio in picture.c, bug 700050
src/picture.c | 237 ++++++++++++++++++++++++++++++++++-----------------------
1 files changed, 143 insertions(+), 94 deletions(-)
---
diff --git a/src/picture.c b/src/picture.c
index aff0966..4d19db6 100644
--- a/src/picture.c
+++ b/src/picture.c
@@ -53,9 +53,9 @@ static const gchar *Picture_Format_String (Picture_Format format);
static const gchar *Picture_Type_String (EtPictureType type);
static gchar *Picture_Info (Picture *pic);
-static Picture *et_picture_load_file_data (GFile *file);
-static gboolean Picture_Save_File_Data (const Picture *pic,
- const gchar *filename);
+static Picture *et_picture_load_file_data (GFile *file, GError **error);
+static gboolean et_picture_save_file_data (const Picture *pic, GFile *file,
+ GError **error);
/*
* Note :
@@ -251,9 +251,36 @@ et_picture_load_file (GFile *file, gpointer user_data)
}
filename_utf8 = g_file_info_get_display_name (info);
- pic = et_picture_load_file_data (file);
+ pic = et_picture_load_file_data (file, &error);
- if (pic && filename_utf8)
+ if (!pic)
+ {
+ GtkWidget *msgdialog;
+
+ /* Picture file not opened */
+ msgdialog = gtk_message_dialog_new (GTK_WINDOW (MainWindow),
+ GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
+ GTK_MESSAGE_ERROR,
+ GTK_BUTTONS_CLOSE,
+ _("Cannot open file: '%s'"),
+ filename_utf8);
+ gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG(msgdialog),
+ "%s", error->message);
+ gtk_window_set_title (GTK_WINDOW (msgdialog), _("Image File Error"));
+ gtk_dialog_run (GTK_DIALOG (msgdialog));
+ gtk_widget_destroy (msgdialog);
+
+ Log_Print (LOG_ERROR, _("Image file not loaded: %s"),
+ error->message);
+ g_error_free (error);
+ return;
+ }
+ else
+ {
+ Log_Print (LOG_OK, _("Image file loaded"));
+ }
+
+ if (filename_utf8)
{
// Behaviour following the tag type...
switch (ETCore->ETFileDisplayed->ETFileDescription->TagType)
@@ -695,45 +722,23 @@ void Picture_Save_Button_Clicked (GObject *object)
response = gtk_dialog_run(GTK_DIALOG(FileSelectionWindow));
if (response == GTK_RESPONSE_OK)
{
- FILE *file;
- gchar *filename, *filename_utf8;
+ GFile *file;
+ GError *error = NULL;
// Save the directory selected for initialize next time
g_free(init_dir);
init_dir = gtk_file_chooser_get_current_folder(GTK_FILE_CHOOSER(FileSelectionWindow));
- filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(FileSelectionWindow));
- filename_utf8 = filename_to_display(filename);
-
- // Warn user if the file already exists, else saves directly
- if ( (file=fopen(filename_utf8,"r"))!=NULL )
- {
- GtkWidget *msgdialog;
-
- fclose(file);
+ file = gtk_file_chooser_get_file (GTK_FILE_CHOOSER (FileSelectionWindow));
- msgdialog = gtk_message_dialog_new(GTK_WINDOW(MainWindow),
- GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
- GTK_MESSAGE_QUESTION,
- GTK_BUTTONS_NONE,
- _("The following file already exists: '%s'"),
- filename_utf8);
- gtk_message_dialog_format_secondary_text(GTK_MESSAGE_DIALOG(msgdialog),"%s",_("Do you want
to save anyway, overwriting the file?"));
-
gtk_dialog_add_buttons(GTK_DIALOG(msgdialog),GTK_STOCK_CANCEL,GTK_RESPONSE_CANCEL,GTK_STOCK_SAVE,GTK_RESPONSE_YES,NULL);
- gtk_window_set_title(GTK_WINDOW(msgdialog),_("Save"));
-
- response = gtk_dialog_run(GTK_DIALOG(msgdialog));
- gtk_widget_destroy(msgdialog);
-
- if (response == GTK_RESPONSE_YES)
- {
- Picture_Save_File_Data(pic, filename_utf8);
- }
- }else
+ if (!et_picture_save_file_data (pic, file, &error))
{
- Picture_Save_File_Data(pic, filename_utf8);
+ Log_Print (LOG_ERROR, _("Image file not saved: %s"),
+ error->message);
+ g_error_free (error);
}
- g_free(filename_utf8);
+
+ g_object_unref (file);
}
gtk_widget_destroy(FileSelectionWindow);
@@ -1108,79 +1113,57 @@ void Picture_Free (Picture *pic)
* Returns: an image on success, %NULL otherwise
*/
static Picture *
-et_picture_load_file_data (GFile *file)
+et_picture_load_file_data (GFile *file, GError **error)
{
- gchar *filename;
Picture *pic;
gchar *buffer = 0;
- size_t size = 0;
- struct stat st;
- FILE *fd;
+ gsize size = 0;
+ GFileInfo *info;
+ GFileInputStream *file_istream;
- filename = g_file_get_path (file);
+ info = g_file_query_info (file, G_FILE_ATTRIBUTE_STANDARD_SIZE,
+ G_FILE_QUERY_INFO_NONE, NULL, error);
- if (stat(filename, &st)==-1)
+ if (!info)
{
- Log_Print (LOG_ERROR, _("Image file not loaded: %s"),
- g_strerror(errno));
- g_free(filename);
+ g_assert (error == NULL || *error != NULL);
return NULL;
}
- size = st.st_size;
- buffer = g_malloc(size);
+ file_istream = g_file_read (file, NULL, error);
- fd = fopen(filename, "rb");
- if (!fd)
+ if (!file_istream)
{
- gchar *filename_utf8;
- GtkWidget *msgdialog;
-
- /* Picture file not opened */
- filename_utf8 = filename_to_display(filename);
- msgdialog = gtk_message_dialog_new(GTK_WINDOW(MainWindow),
- GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
- GTK_MESSAGE_ERROR,
- GTK_BUTTONS_CLOSE,
- _("Cannot open file: '%s'"),
- filename_utf8);
- gtk_message_dialog_format_secondary_text(GTK_MESSAGE_DIALOG(msgdialog),"%s",g_strerror(errno));
- gtk_window_set_title (GTK_WINDOW (msgdialog), _("Image File Error"));
- gtk_dialog_run(GTK_DIALOG(msgdialog));
- gtk_widget_destroy(msgdialog);
-
- Log_Print (LOG_ERROR, _("Image file not loaded: %s"),
- g_strerror(errno));
g_free (buffer);
- g_free(filename_utf8);
- g_free(filename);
+ g_assert (error == NULL || *error != NULL);
return NULL;
}
- g_free(filename);
+ size = g_file_info_get_size (info);
+ buffer = g_malloc(size);
- if (fread(buffer, size, 1, fd) != 1)
+ if (g_input_stream_read (G_INPUT_STREAM (file_istream), buffer, size,
+ NULL, error) == -1)
{
- // Error
- fclose(fd);
+ /* Error on reading*/
if (buffer)
g_free(buffer);
-
- Log_Print (LOG_ERROR, _("Image file not loaded: %s"),
- g_strerror(errno));
+ g_object_unref (info);
+ g_object_unref (file_istream);
+ g_assert (error == NULL || *error != NULL);
return NULL;
- }else
+ }
+ else
{
- // Loaded
- fclose(fd);
-
+ /* Image loaded. */
pic = Picture_Allocate();
pic->size = size;
pic->data = (guchar *)buffer;
- Log_Print (LOG_OK, _("Image file loaded"));
-
+ g_object_unref (info);
+ g_object_unref (file_istream);
+ g_assert (error == NULL || *error == NULL);
return pic;
}
}
@@ -1189,27 +1172,93 @@ et_picture_load_file_data (GFile *file)
* Save picture data to a file (jpeg, png)
*/
static gboolean
-Picture_Save_File_Data (const Picture *pic, const gchar *filename)
+et_picture_save_file_data (const Picture *pic, GFile *file, GError **error)
{
- gint fd;
+ GFileOutputStream *file_ostream;
+
+ g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
+
+ file_ostream = g_file_create (file, G_FILE_CREATE_NONE, NULL, error);
+
+ // Warn user if the file already exists, else saves directly
+ if (!file_ostream)
+ {
+ if (g_error_matches (*error, G_IO_ERROR, G_IO_ERROR_EXISTS))
+ {
+ GFileInfo *info;
+ const gchar *filename_utf8;
+ GtkWidget *msgdialog;
+
+ g_error_free (*error);
+ info = g_file_query_info (file,
+ G_FILE_ATTRIBUTE_STANDARD_DISPLAY_NAME,
+ G_FILE_QUERY_INFO_NONE, NULL, error);
+
+ if (!info)
+ {
+ g_assert (error == NULL || *error != NULL);
+ return FALSE;
+ }
+
+ filename_utf8 = g_file_info_get_display_name (info);
+
+ msgdialog = gtk_message_dialog_new (GTK_WINDOW (MainWindow),
+ GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
+ GTK_MESSAGE_QUESTION,
+ GTK_BUTTONS_NONE,
+ _("The following file already exists: '%s'"),
+ filename_utf8);
+ gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (msgdialog),
+ "%s",
+ _("Do you want to save anyway, overwriting the
file?"));
+ gtk_dialog_add_buttons (GTK_DIALOG (msgdialog), GTK_STOCK_CANCEL,
+ GTK_RESPONSE_CANCEL, GTK_STOCK_SAVE,
+ GTK_RESPONSE_YES, NULL);
+ gtk_window_set_title (GTK_WINDOW (msgdialog), _("Save"));
+
+ if (gtk_dialog_run (GTK_DIALOG (msgdialog)) == GTK_RESPONSE_YES)
+ {
+ file_ostream = g_file_replace (file, NULL, FALSE,
+ G_FILE_CREATE_NONE, NULL,
+ error);
+ }
+ else
+ {
+ g_set_error (error, G_IO_ERROR, G_IO_ERROR_CANCELLED,
+ _("User selected not to overwrite file '%s'"),
+ filename_utf8);
+ g_object_unref (info);
+ g_assert (error == NULL || *error != NULL);
+ return FALSE;
+ }
+
+ g_object_unref (info);
+ gtk_widget_destroy (msgdialog);
+ }
+ else
+ {
+ g_assert (error == NULL || *error != NULL);
+ return FALSE;
+ }
+ }
- fd = open(filename, O_WRONLY|O_CREAT|O_TRUNC, 0666);
- if (fd == -1)
+ if (g_output_stream_write (G_OUTPUT_STREAM (file_ostream), pic->data,
+ pic->size, NULL, error) != pic->size)
{
- Log_Print (LOG_ERROR, _("Image file cannot be saved: %s"),
- g_strerror(errno));
+ g_object_unref (file_ostream);
+ g_assert (error == NULL || *error != NULL);
return FALSE;
}
- if (write(fd, pic->data, pic->size) != pic->size)
+ if (!g_output_stream_close (G_OUTPUT_STREAM (file_ostream), NULL, error))
{
- close(fd);
- Log_Print (LOG_ERROR, _("Image file cannot be saved: %s"),
- g_strerror(errno));
+ g_object_unref (file_ostream);
+ g_assert (error == NULL || *error != NULL);
return FALSE;
}
- close(fd);
+ g_assert (error == NULL || *error == NULL);
+ g_object_unref (file_ostream);
return TRUE;
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]