From b99f3f5e8080f266affd9734d4f73dac0c67215e Mon Sep 17 00:00:00 2001 From: infirit Date: Fri, 21 Nov 2014 17:12:25 +0100 Subject: use a boxed type to pass the error to the 'done' signal Based on FR commit: 4b645f57c856928c508dd74c31e1bfb2132368e1 From: Paolo Bacchilega --- src/Makefile.am | 2 ++ src/fr-archive.c | 9 +++++---- src/fr-command.c | 11 +++++++---- src/fr-marshal.list | 3 ++- src/fr-proc-error.c | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++++ src/fr-proc-error.h | 31 ++++++++++++++++++++++++++++++ src/fr-process.c | 18 ++++++++++++------ src/fr-process.h | 3 ++- 8 files changed, 116 insertions(+), 16 deletions(-) create mode 100644 src/fr-proc-error.c create mode 100644 src/fr-proc-error.h diff --git a/src/Makefile.am b/src/Makefile.am index ef11ec3..450214f 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -127,6 +127,8 @@ engrampa_SOURCES = \ fr-list-model.h \ fr-stock.c \ fr-stock.h \ + fr-proc-error.c \ + fr-proc-error.h \ fr-process.c \ fr-process.h \ fr-window.c \ diff --git a/src/fr-archive.c b/src/fr-archive.c index b466134..fcd50f6 100644 --- a/src/fr-archive.c +++ b/src/fr-archive.c @@ -38,6 +38,7 @@ #include "fr-command.h" #include "fr-error.h" #include "fr-marshal.h" +#include "fr-proc-error.h" #include "fr-process.h" #include "main.h" @@ -247,10 +248,10 @@ fr_archive_class_init (FrArchiveClass *class) G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (FrArchiveClass, done), NULL, NULL, - fr_marshal_VOID__INT_POINTER, + fr_marshal_VOID__INT_BOXED, G_TYPE_NONE, 2, G_TYPE_INT, - G_TYPE_POINTER); + FR_TYPE_PROC_ERROR); fr_archive_signals[PROGRESS] = g_signal_new ("progress", G_TYPE_FROM_CLASS (class), @@ -1603,7 +1604,7 @@ fr_archive_add (FrArchive *archive, archive->process->error.type = FR_PROC_ERROR_NONE; g_signal_emit_by_name (G_OBJECT (archive->process), "done", - FR_ACTION_ADDING_FILES); + &archive->process->error); return; } @@ -1690,7 +1691,7 @@ fr_archive_add (FrArchive *archive, archive->process->error.gerror = g_error_copy (error); g_signal_emit_by_name (G_OBJECT (archive->process), "done", - FR_ACTION_ADDING_FILES); + &archive->process->error); g_clear_error (&error); error_occurred = TRUE; } diff --git a/src/fr-command.c b/src/fr-command.c index 1f00d84..5cf667e 100644 --- a/src/fr-command.c +++ b/src/fr-command.c @@ -29,6 +29,7 @@ #include "fr-command.h" #include "fr-enum-types.h" #include "fr-marshal.h" +#include "fr-proc-error.h" #include "fr-process.h" #include "glib-utils.h" @@ -219,12 +220,14 @@ fr_command_start (FrProcess *process, static void fr_command_done (FrProcess *process, + FrProcError *error, gpointer data) { FrCommand *comm = FR_COMMAND (data); comm->process->restart = FALSE; - fr_command_handle_error (comm, &process->error); + if (error->type != FR_PROC_ERROR_STOPPED) + fr_command_handle_error (comm, error); if (comm->process->restart) { fr_process_start (comm->process); @@ -240,7 +243,7 @@ fr_command_done (FrProcess *process, fr_command_signals[DONE], 0, comm->action, - &process->error); + error); } @@ -402,10 +405,10 @@ fr_command_class_init (FrCommandClass *class) G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (FrCommandClass, done), NULL, NULL, - fr_marshal_VOID__INT_POINTER, + fr_marshal_VOID__INT_BOXED, G_TYPE_NONE, 2, G_TYPE_INT, - G_TYPE_POINTER); + FR_TYPE_PROC_ERROR); fr_command_signals[PROGRESS] = g_signal_new ("progress", G_TYPE_FROM_CLASS (class), diff --git a/src/fr-marshal.list b/src/fr-marshal.list index d3fcc1a..1629043 100644 --- a/src/fr-marshal.list +++ b/src/fr-marshal.list @@ -1,8 +1,9 @@ VOID:INT VOID:INT,INT -VOID:INT,POINTER +VOID:INT,BOXED VOID:POINTER VOID:VOID VOID:DOUBLE VOID:STRING VOID:BOOL +VOID:BOXED diff --git a/src/fr-proc-error.c b/src/fr-proc-error.c new file mode 100644 index 0000000..1f61613 --- /dev/null +++ b/src/fr-proc-error.c @@ -0,0 +1,55 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ + +/* + * File-Roller + * + * Copyright (C) 2001 The Free Software Foundation, Inc. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include +#include "fr-proc-error.h" + + +static gpointer +fr_proc_error_copy (gpointer boxed) +{ + FrProcError *old_error = boxed; + FrProcError *new_error; + + new_error = g_new (FrProcError, 1); + new_error->type = old_error->type; + new_error->status = old_error->status; + new_error->gerror = (old_error->gerror != NULL) ? g_error_copy (old_error->gerror) : NULL; + + return new_error; +} + + +static void +fr_proc_error_free (gpointer boxed) +{ + FrProcError *error = boxed; + + if (error->gerror != NULL) + g_error_free (error->gerror); + g_free (error); +} + + +G_DEFINE_BOXED_TYPE (FrProcError, + fr_proc_error, + fr_proc_error_copy, + fr_proc_error_free) diff --git a/src/fr-proc-error.h b/src/fr-proc-error.h new file mode 100644 index 0000000..d7e4924 --- /dev/null +++ b/src/fr-proc-error.h @@ -0,0 +1,31 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ + +/* + * File-Roller + * + * Copyright (C) 2001 The Free Software Foundation, Inc. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#ifndef FR_PROC_ERROR_H +#define FR_PROC_ERROR_H + +#include "typedefs.h" + +#define FR_TYPE_PROC_ERROR (fr_proc_error_get_type ()) + +GType fr_proc_error_get_type (void); + +#endif /* FR_PROC_ERROR_H */ diff --git a/src/fr-process.c b/src/fr-process.c index 61ed636..01f04e0 100644 --- a/src/fr-process.c +++ b/src/fr-process.c @@ -30,6 +30,7 @@ #include #include #include +#include "fr-proc-error.h" #include "fr-process.h" #include "fr-marshal.h" #include "glib-utils.h" @@ -276,8 +277,9 @@ fr_process_class_init (FrProcessClass *class) G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (FrProcessClass, done), NULL, NULL, - fr_marshal_VOID__VOID, - G_TYPE_NONE, 0); + fr_marshal_VOID__BOXED, + G_TYPE_NONE, 1, + FR_TYPE_PROC_ERROR); fr_process_signals[STICKY_ONLY] = g_signal_new ("sticky_only", G_TYPE_FROM_CLASS (class), @@ -720,7 +722,8 @@ start_current_command (FrProcess *process) process->error.type = FR_PROC_ERROR_SPAWN; g_signal_emit (G_OBJECT (process), fr_process_signals[DONE], - 0); + 0, + &process->error); g_free (argv); return; } @@ -933,7 +936,8 @@ check_child (gpointer data) g_signal_emit (G_OBJECT (process), fr_process_signals[DONE], - 0); + 0, + &process->error); return FALSE; } @@ -976,7 +980,8 @@ fr_process_start (FrProcess *process) process->priv->running = FALSE; g_signal_emit (G_OBJECT (process), fr_process_signals[DONE], - 0); + 0, + &process->error); } else { process->priv->running = TRUE; @@ -1021,7 +1026,8 @@ fr_process_stop_priv (FrProcess *process, if (emit_signal) g_signal_emit (G_OBJECT (process), fr_process_signals[DONE], - 0); + 0, + &process->error); } } diff --git a/src/fr-process.h b/src/fr-process.h index e8fcfc1..8c907bd 100644 --- a/src/fr-process.h +++ b/src/fr-process.h @@ -81,7 +81,8 @@ struct _FrProcessClass { /* -- Signals -- */ void (* start) (FrProcess *fr_proc); - void (* done) (FrProcess *fr_proc); + void (* done) (FrProcess *fr_proc, + FrProcError *error); void (* sticky_only) (FrProcess *fr_proc); }; -- cgit v1.2.1