[file-roller: 51/123] fixed loading of archives that require a password



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]