summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/Makefile.am2
-rw-r--r--src/fr-archive.c9
-rw-r--r--src/fr-command.c11
-rw-r--r--src/fr-marshal.list3
-rw-r--r--src/fr-proc-error.c55
-rw-r--r--src/fr-proc-error.h31
-rw-r--r--src/fr-process.c18
-rw-r--r--src/fr-process.h3
8 files changed, 116 insertions, 16 deletions
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 <http://www.gnu.org/licenses/>.
+ */
+
+#include <config.h>
+#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 <http://www.gnu.org/licenses/>.
+ */
+
+#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 <sys/wait.h>
#include <unistd.h>
#include <glib.h>
+#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);
};