[file-roller: 51/123] fixed loading of archives that require a password
- From: Paolo Bacchilega <paobac src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [file-roller: 51/123] fixed loading of archives that require a password
- Date: Mon, 6 Aug 2012 13:45:09 +0000 (UTC)
commit e2ef6281c42eee03a1f6942187438bf15c1a32c7
Author: Paolo Bacchilega <paobac src gnome org>
Date: Sat Jul 21 13:16:44 2012 +0200
fixed loading of archives that require a password
fixed command error handling
src/fr-command-7z.c | 8 +++---
src/fr-command-ace.c | 4 +-
src/fr-command-alz.c | 11 +++++----
src/fr-command-ar.c | 4 +-
src/fr-command-arj.c | 4 +-
src/fr-command-rar.c | 22 +++++++------------
src/fr-command-tar.c | 2 +-
src/fr-command-unarchiver.c | 2 +-
src/fr-command-unstuff.c | 2 +-
src/fr-command-zip.c | 6 ++--
src/fr-command.c | 50 ++++++++++++++++++++++++++----------------
src/fr-error.c | 18 +++++++++++++++
src/fr-error.h | 27 +++++++++++++----------
13 files changed, 94 insertions(+), 66 deletions(-)
---
diff --git a/src/fr-command-7z.c b/src/fr-command-7z.c
index 6287d23..e4c4814 100644
--- a/src/fr-command-7z.c
+++ b/src/fr-command-7z.c
@@ -480,8 +480,8 @@ fr_command_7z_test (FrCommand *command)
static void
-fr_command_7z_handle_error (FrCommand *command,
- FrError *error)
+fr_command_7z_handle_error (FrCommand *command,
+ FrError *error)
{
FrArchive *archive = FR_ARCHIVE (command);
@@ -503,7 +503,7 @@ fr_command_7z_handle_error (FrCommand *command,
testname = g_strconcat (first->original_path, ".001", NULL);
if (strcmp (basename, testname) == 0)
- error->type = FR_ERROR_ASK_PASSWORD;
+ fr_error_take_gerror (error, g_error_new_literal (FR_ERROR, FR_ERROR_ASK_PASSWORD, ""));
g_free (testname);
g_free (basename);
@@ -523,7 +523,7 @@ fr_command_7z_handle_error (FrCommand *command,
if ((strstr (line, "Wrong password?") != NULL)
|| (strstr (line, "Enter password") != NULL))
{
- error->type = FR_ERROR_ASK_PASSWORD;
+ fr_error_take_gerror (error, g_error_new_literal (FR_ERROR, FR_ERROR_ASK_PASSWORD, ""));
break;
}
}
diff --git a/src/fr-command-ace.c b/src/fr-command-ace.c
index 528b5c1..24a31bf 100644
--- a/src/fr-command-ace.c
+++ b/src/fr-command-ace.c
@@ -220,8 +220,8 @@ fr_command_ace_test (FrCommand *comm)
static void
-fr_command_ace_handle_error (FrCommand *comm,
- FrError *error)
+fr_command_ace_handle_error (FrCommand *comm,
+ FrError *error)
{
/* FIXME */
}
diff --git a/src/fr-command-alz.c b/src/fr-command-alz.c
index 4cd0252..adfeb0a 100644
--- a/src/fr-command-alz.c
+++ b/src/fr-command-alz.c
@@ -279,13 +279,14 @@ fr_command_alz_extract (FrCommand *comm,
static void
-fr_command_alz_handle_error (FrCommand *comm,
- FrError *error)
+fr_command_alz_handle_error (FrCommand *comm,
+ FrError *error)
{
if ((error->type == FR_ERROR_STOPPED)) {
- if (FR_COMMAND_ALZ (comm)->extract_none ||
- FR_COMMAND_ALZ (comm)->invalid_password) {
- error->type = FR_ERROR_ASK_PASSWORD;
+ if (FR_COMMAND_ALZ (comm)->extract_none
+ || FR_COMMAND_ALZ (comm)->invalid_password)
+ {
+ fr_error_take_gerror (error, g_error_new_literal (FR_ERROR, FR_ERROR_ASK_PASSWORD, ""));
}
}
}
diff --git a/src/fr-command-ar.c b/src/fr-command-ar.c
index 9a4dbad..eea3786 100644
--- a/src/fr-command-ar.c
+++ b/src/fr-command-ar.c
@@ -264,8 +264,8 @@ fr_command_ar_extract (FrCommand *comm,
static void
-fr_command_ar_handle_error (FrCommand *comm,
- FrError *error)
+fr_command_ar_handle_error (FrCommand *comm,
+ FrError *error)
{
/* FIXME */
}
diff --git a/src/fr-command-arj.c b/src/fr-command-arj.c
index 31a85b6..19646ef 100644
--- a/src/fr-command-arj.c
+++ b/src/fr-command-arj.c
@@ -302,9 +302,9 @@ fr_command_arj_handle_error (FrCommand *comm,
{
if (error->type != FR_ERROR_NONE) {
if (error->status <= 1)
- error->type = FR_ERROR_NONE;
+ fr_error_clear_gerror (error);
else if (error->status == 3)
- error->type = FR_ERROR_ASK_PASSWORD;
+ fr_error_take_gerror (error, g_error_new_literal (FR_ERROR, FR_ERROR_ASK_PASSWORD, ""));
}
}
diff --git a/src/fr-command-rar.c b/src/fr-command-rar.c
index bf9aea9..328f322 100644
--- a/src/fr-command-rar.c
+++ b/src/fr-command-rar.c
@@ -535,8 +535,8 @@ fr_command_rar_test (FrCommand *comm)
static void
-fr_command_rar_handle_error (FrCommand *comm,
- FrError *error)
+fr_command_rar_handle_error (FrCommand *comm,
+ FrError *error)
{
GList *scan;
@@ -552,22 +552,20 @@ fr_command_rar_handle_error (FrCommand *comm,
if (error->type == FR_ERROR_NONE)
return;
- /*if (error->status == 3)
- error->type = FR_ERROR_ASK_PASSWORD;
- else */
+ /* ignore warnings */
if (error->status <= 1)
- error->type = FR_ERROR_NONE;
+ fr_error_clear_gerror (error);
for (scan = g_list_last (comm->process->err.raw); scan; scan = scan->prev) {
char *line = scan->data;
if (strstr (line, "password incorrect") != NULL) {
- error->type = FR_ERROR_ASK_PASSWORD;
+ fr_error_take_gerror (error, g_error_new_literal (FR_ERROR, FR_ERROR_ASK_PASSWORD, ""));
break;
}
if (strstr (line, "wrong password") != NULL) {
- error->type = FR_ERROR_ASK_PASSWORD;
+ fr_error_take_gerror (error, g_error_new_literal (FR_ERROR, FR_ERROR_ASK_PASSWORD, ""));
break;
}
@@ -576,13 +574,9 @@ fr_command_rar_handle_error (FrCommand *comm,
}
if (strncmp (line, "Cannot find volume", 18) == 0) {
- char *volume_filename;
+ char *volume_filename = g_path_get_basename (line + strlen ("Cannot find volume "));
+ fr_error_take_gerror (error, g_error_new (FR_ERROR, FR_ERROR_MISSING_VOLUME, _("Could not find the volume: %s"), volume_filename));
- g_clear_error (&error->gerror);
-
- error->type = FR_ERROR_MISSING_VOLUME;
- volume_filename = g_path_get_basename (line + strlen ("Cannot find volume "));
- error->gerror = g_error_new (FR_ERROR, error->status, _("Could not find the volume: %s"), volume_filename);
g_free (volume_filename);
break;
}
diff --git a/src/fr-command-tar.c b/src/fr-command-tar.c
index 7082a04..28d1afd 100644
--- a/src/fr-command-tar.c
+++ b/src/fr-command-tar.c
@@ -971,7 +971,7 @@ fr_command_tar_handle_error (FrCommand *comm,
{
if (error->type != FR_ERROR_NONE) {
if (error->status <= 1)
- error->type = FR_ERROR_NONE;
+ fr_error_clear_gerror (error);
}
}
diff --git a/src/fr-command-unarchiver.c b/src/fr-command-unarchiver.c
index 2cad7f7..bd67ac4 100644
--- a/src/fr-command-unarchiver.c
+++ b/src/fr-command-unarchiver.c
@@ -233,7 +233,7 @@ fr_command_unarchiver_handle_error (FrCommand *comm,
char *line = scan->data;
if (strstr (line, "password") != NULL) {
- error->type = FR_ERROR_ASK_PASSWORD;
+ fr_error_take_gerror (error, g_error_new_literal (FR_ERROR, FR_ERROR_ASK_PASSWORD, ""));
break;
}
}
diff --git a/src/fr-command-unstuff.c b/src/fr-command-unstuff.c
index 84b3999..b89465c 100644
--- a/src/fr-command-unstuff.c
+++ b/src/fr-command-unstuff.c
@@ -266,7 +266,7 @@ fr_command_unstuff_handle_error (FrCommand *comm,
if ((error->type != FR_ERROR_NONE)
&& (error->status <= 1))
{
- error->type = FR_ERROR_NONE;
+ fr_error_clear_gerror (error);
}
}
diff --git a/src/fr-command-zip.c b/src/fr-command-zip.c
index 8299263..4994662 100644
--- a/src/fr-command-zip.c
+++ b/src/fr-command-zip.c
@@ -352,9 +352,9 @@ fr_command_zip_handle_error (FrCommand *comm,
return;
if (error->status <= 1)
- error->type = FR_ERROR_NONE;
+ fr_error_clear_gerror (error);
else if ((error->status == 82) || (error->status == 5))
- error->type = FR_ERROR_ASK_PASSWORD;
+ fr_error_take_gerror (error, g_error_new_literal (FR_ERROR, FR_ERROR_ASK_PASSWORD, ""));
else {
int i;
@@ -368,7 +368,7 @@ fr_command_zip_handle_error (FrCommand *comm,
char *line = scan->data;
if (strstr (line, "incorrect password") != NULL) {
- error->type = FR_ERROR_ASK_PASSWORD;
+ fr_error_take_gerror (error, g_error_new_literal (FR_ERROR, FR_ERROR_ASK_PASSWORD, ""));
return;
}
}
diff --git a/src/fr-command.c b/src/fr-command.c
index fcbda5d..7f4dc0c 100644
--- a/src/fr-command.c
+++ b/src/fr-command.c
@@ -480,21 +480,35 @@ fr_command_recompress (FrCommand *self)
static gboolean
fr_command_handle_process_error (FrCommand *self,
GAsyncResult *result,
- FrError **error)
+ GError **error)
{
+ FrError *process_error = NULL;
+
self->process->restart = FALSE;
- if (! fr_process_execute_finish (self->process, result, error)) {
- if (g_error_matches ((*error)->gerror, G_IO_ERROR, G_IO_ERROR_CANCELLED))
- (*error)->type = FR_ERROR_STOPPED;
+ fr_process_execute_finish (self->process, result, &process_error);
- if ((*error)->type != FR_ERROR_STOPPED)
- FR_COMMAND_GET_CLASS (G_OBJECT (self))->handle_error (self, (*error));
+ if (process_error == NULL)
+ process_error = fr_error_new (FR_ERROR_NONE, 0, NULL);
- if (self->process->restart) {
- fr_process_restart (self->process);
- return FALSE;
- }
+ if (g_error_matches (process_error->gerror, G_IO_ERROR, G_IO_ERROR_CANCELLED)) {
+ g_error_free (process_error->gerror);
+ process_error->type = FR_ERROR_STOPPED;
+ process_error->gerror = g_error_new_literal (FR_ERROR, FR_ERROR_STOPPED, "");
+ }
+
+ if (process_error->type != FR_ERROR_STOPPED)
+ /* the command can change process_error->gerror or activate the
+ * 'restart' flag */
+ FR_COMMAND_GET_CLASS (G_OBJECT (self))->handle_error (self, process_error);
+
+ if ((error != NULL) && (process_error->gerror != NULL))
+ *error = g_error_copy (process_error->gerror);
+ fr_error_free (process_error);
+
+ if (self->process->restart) {
+ fr_process_restart (self->process);
+ return FALSE;
}
return TRUE;
@@ -727,20 +741,18 @@ load_local_archive_list_ready_cb (GObject *source_object,
gpointer user_data)
{
LoadData *load_data = user_data;
- FrError *error = NULL;
+ GError *error = NULL;
if (! fr_command_handle_process_error (FR_COMMAND (load_data->archive), result, &error))
+ /* command restarted */
return;
- if (error != NULL) {
- _fr_command_load_complete_with_error (load_data, error->gerror);
- fr_error_free (error);
- return;
- }
-
- _fr_command_load_complete (load_data);
+ if (error != NULL)
+ _fr_command_load_complete_with_error (load_data, error);
+ else
+ _fr_command_load_complete (load_data);
- fr_error_free (error);
+ _g_error_free (error);
}
diff --git a/src/fr-error.c b/src/fr-error.c
index 530f3e5..49435cb 100644
--- a/src/fr-error.c
+++ b/src/fr-error.c
@@ -92,6 +92,24 @@ fr_error_set (FrError *error,
void
+fr_error_take_gerror (FrError *error,
+ GError *gerror)
+{
+ if (gerror != error->gerror) {
+ g_clear_error (&error->gerror);
+ error->gerror = gerror;
+ }
+}
+
+
+void
+fr_error_clear_gerror (FrError *error)
+{
+ g_clear_error (&error->gerror);
+}
+
+
+void
fr_clear_error (FrError **error)
{
if ((error == NULL) || (*error == NULL))
diff --git a/src/fr-error.h b/src/fr-error.h
index 39dc2ed..34159d3 100644
--- a/src/fr-error.h
+++ b/src/fr-error.h
@@ -49,17 +49,20 @@ typedef struct {
int status;
} FrError;
-GQuark fr_error_quark (void);
-GType fr_error_get_type (void);
-FrError * fr_error_new (FrErrorType type,
- int status,
- GError *gerror);
-FrError * fr_error_copy (FrError *error);
-void fr_error_free (FrError *error);
-void fr_error_set (FrError *error,
- FrErrorType type,
- int status,
- GError *gerror);
-void fr_clear_error (FrError **error);
+GQuark fr_error_quark (void);
+GType fr_error_get_type (void);
+FrError * fr_error_new (FrErrorType type,
+ int status,
+ GError *gerror);
+FrError * fr_error_copy (FrError *error);
+void fr_error_free (FrError *error);
+void fr_error_set (FrError *error,
+ FrErrorType type,
+ int status,
+ GError *gerror);
+void fr_error_take_gerror (FrError *error,
+ GError *gerror);
+void fr_error_clear_gerror (FrError *error);
+void fr_clear_error (FrError **error);
#endif /* __FR_ERROR_H__ */
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]