file-roller r2296 - in trunk: . src



Author: paobac
Date: Tue Jun  3 17:44:29 2008
New Revision: 2296
URL: http://svn.gnome.org/viewvc/file-roller?rev=2296&view=rev

Log:
2008-06-03  Paolo Bacchilega  <paobac svn gnome org>

	* src/main.c: 
	* src/fr-window.c: 
	* src/fr-command-tar.h: 
	* src/fr-command-tar.c: 
	* src/fr-archive.c: 

	Added partial support for tar archives compressed with 7zip. 

Modified:
   trunk/ChangeLog
   trunk/src/fr-archive.c
   trunk/src/fr-command-tar.c
   trunk/src/fr-command-tar.h
   trunk/src/fr-window.c
   trunk/src/main.c

Modified: trunk/src/fr-archive.c
==============================================================================
--- trunk/src/fr-archive.c	(original)
+++ trunk/src/fr-archive.c	Tue Jun  3 17:44:29 2008
@@ -513,8 +513,10 @@
 	
 	archive->is_compressed_file = FALSE;
 	
-	requested_capabilities |= FR_COMMAND_CAP_READ;
-	if (! loading) {
+	if (loading) {
+		requested_capabilities |= FR_COMMAND_CAP_READ;
+	}
+	else {
 		requested_capabilities |= FR_COMMAND_CAP_WRITE;	
 		if (! archive->can_create_compressed_file)
 			requested_capabilities |= FR_COMMAND_CAP_ARCHIVE_MANY_FILES;
@@ -543,23 +545,20 @@
 }
 
 
-static gboolean
-create_command_from_filename (FrArchive *archive,
-			      gboolean   loading)
+static const char *
+get_mime_type_from_filename (GFile *file)
 {
-	char     *filename;
-	gboolean  result = FALSE;
+	const char *mime_type = NULL;
+	char       *filename;
 	
-	if (archive->local_copy == NULL)
+	if (file == NULL)
 		return FALSE;
 	
-	filename = g_file_get_path (archive->local_copy);
-	result = create_command_from_mime_type (archive, 
-					        get_mime_type_from_extension (get_file_extension (filename)), 
-					        loading);
+	filename = g_file_get_path (file);
+	mime_type = get_mime_type_from_extension (get_file_extension (filename));
 	g_free (filename);
 	
-	return result;
+	return mime_type;
 }
 
 
@@ -888,15 +887,18 @@
 fr_archive_create (FrArchive  *archive,
 		   const char *uri)
 {
-	FrCommand *tmp_command;
-
+	FrCommand  *tmp_command;
+	const char *mime_type;
+	
 	if (uri == NULL)
 		return FALSE;
 
 	fr_archive_set_uri (archive, uri);
 
 	tmp_command = archive->command;
-	if (! create_command_from_filename (archive, FALSE)) {
+	
+	mime_type = get_mime_type_from_filename (archive->local_copy);
+	if (! create_command_from_mime_type (archive, mime_type, FALSE)) {
 		archive->command = tmp_command;
 		return FALSE;
 	}
@@ -958,16 +960,16 @@
 		    const char *password)
 {
 	FrCommand  *tmp_command;
-	const char *mime_type = NULL;
-
+	const char *mime_type;
+	
 	archive->read_only = ! check_permissions (uri, W_OK);
 
-	/* find out the archive mime type */
-
 	tmp_command = archive->command;
-	mime_type = get_mime_type_from_content (archive->local_copy);
+	
+	mime_type = get_mime_type_from_filename (archive->local_copy);
 	if (! create_command_from_mime_type (archive, mime_type, TRUE)) {
-		if (! create_command_from_filename (archive, TRUE)) {
+		mime_type = get_mime_type_from_content (archive->local_copy);
+		if (! create_command_from_mime_type (archive, mime_type, TRUE)) {
 			archive->command = tmp_command;
 			fr_archive_action_completed (archive,
 						     FR_ACTION_LOADING_ARCHIVE, 
@@ -976,6 +978,7 @@
 			return;
 		}
 	}
+	
 	if (tmp_command != NULL) {
 		g_signal_handlers_disconnect_by_data (tmp_command, archive);
 		g_object_unref (tmp_command);

Modified: trunk/src/fr-command-tar.c
==============================================================================
--- trunk/src/fr-command-tar.c	(original)
+++ trunk/src/fr-command-tar.c	Tue Jun  3 17:44:29 2008
@@ -191,14 +191,26 @@
 {
 	if (is_mime_type (comm->mime_type, "application/x-compressed-tar")) 
 		fr_process_add_arg (comm->process, "-z");
+		
 	else if (is_mime_type (comm->mime_type, "application/x-bzip-compressed-tar"))
 		fr_process_add_arg (comm->process, "--use-compress-program=bzip2");
+		
 	else if (is_mime_type (comm->mime_type, "application/x-compressed-tar"))
 		fr_process_add_arg (comm->process, "-Z");
+		
 	else if (is_mime_type (comm->mime_type, "application/x-lzma-compressed-tar"))
 		fr_process_add_arg (comm->process, "--use-compress-program=lzma");
+		
 	else if (is_mime_type (comm->mime_type, "application/x-lzop-compressed-tar"))
 		fr_process_add_arg (comm->process, "--use-compress-program=lzop");
+		
+	else if (is_mime_type (comm->mime_type, "application/x-7z-compressed-tar")) {
+		FrCommandTar *comm_tar = (FrCommandTar*) comm;
+		char         *option;	
+		option = g_strdup_printf ("--use-compress-program=%s", comm_tar->compress_command);
+		fr_process_add_arg (comm->process, option);
+		g_free (option);
+	}
 }
 
 
@@ -517,6 +529,45 @@
 
 		new_name = g_strconcat (c_tar->uncomp_filename, ".lzo", NULL);
 	}
+	else if (is_mime_type (comm->mime_type, "application/x-7z-compressed-tar")) {
+		FrCommandTar *comm_tar = (FrCommandTar*) comm;
+		char         *e_name;
+		
+		fr_process_begin_command (comm->process, comm_tar->compress_command);
+		fr_process_set_sticky (comm->process, TRUE);
+		fr_process_set_begin_func (comm->process, begin_func__recompress, comm);
+		switch (compression) {
+		case FR_COMPRESSION_VERY_FAST:
+			fr_process_add_arg (comm->process, "-mx=1"); break;
+		case FR_COMPRESSION_FAST:
+			fr_process_add_arg (comm->process, "-mx=5"); break;
+		case FR_COMPRESSION_NORMAL:
+			fr_process_add_arg (comm->process, "-mx=5"); break;
+		case FR_COMPRESSION_MAXIMUM:
+			fr_process_add_arg (comm->process, "-mx=7"); break;
+		}
+		fr_process_add_arg (comm->process, "a");
+		fr_process_add_arg (comm->process, "-bd");
+		fr_process_add_arg (comm->process, "-y");
+		fr_process_add_arg (comm->process, "-l");
+		
+		new_name = g_strconcat (c_tar->uncomp_filename, ".7z", NULL);
+		e_name = shell_escape (new_name);
+		fr_process_add_arg (comm->process, e_name);
+		g_free (e_name);
+		
+		fr_process_add_arg (comm->process, c_tar->uncomp_filename);
+		fr_process_end_command (comm->process);
+
+		/* remove the uncompressed tar */
+		
+		fr_process_begin_command (comm->process, "rm");
+		fr_process_add_arg (comm->process, "-f");
+		e_name = shell_escape (c_tar->uncomp_filename);
+		fr_process_add_arg (comm->process, e_name);
+		g_free (e_name);
+		fr_process_end_command (comm->process);
+	}
 
 	if (c_tar->name_modified) {
 		char *tmp_dir;
@@ -609,6 +660,11 @@
 		else if (file_extension_is (e_filename, ".tar.lzo"))
 			new_name[l - 4] = 0;
 	}
+	else if (is_mime_type (comm->mime_type, "application/x-7z-compressed-tar")) {
+		/* X.tar.7z -->  X.tar */
+		if (file_extension_is (e_filename, ".tar.7z")) 
+			new_name[l - 3] = 0;
+	}
 
 	return new_name;
 }
@@ -710,6 +766,24 @@
 			fr_process_add_arg (comm->process, tmp_name);
 			fr_process_end_command (comm->process);
 		}
+		else if (is_mime_type (comm->mime_type, "application/x-7z-compressed-tar")) {
+			FrCommandTar *comm_tar = (FrCommandTar*) comm;
+			
+			fr_process_begin_command (comm->process, comm_tar->compress_command);
+			fr_process_set_begin_func (comm->process, begin_func__uncompress, comm);
+			fr_process_add_arg (comm->process, "e");
+			fr_process_add_arg (comm->process, "-bd");
+			fr_process_add_arg (comm->process, "-y");
+			fr_process_add_arg (comm->process, tmp_name);
+			fr_process_end_command (comm->process);
+			
+			/* remove the compressed tar */
+			
+			fr_process_begin_command (comm->process, "rm");
+			fr_process_add_arg (comm->process, "-f");
+			fr_process_add_arg (comm->process, tmp_name);
+			fr_process_end_command (comm->process);
+		}
 	}
 
 	c_tar->uncomp_filename = get_uncompressed_name (c_tar, tmp_name);
@@ -748,6 +822,8 @@
 fr_command_tar_set_mime_type (FrCommand  *comm,
 		 	      const char *mime_type)
 {
+	FrCommandTar *comm_tar = FR_COMMAND_TAR (comm);
+	
 	FR_COMMAND_CLASS (parent_class)->set_mime_type (comm, mime_type);
 
 	/* In solaris gtar is present under /usr/sfw/bin */
@@ -782,6 +858,18 @@
 		if (is_program_in_path ("lzop"))
 			comm->capabilities |= FR_COMMAND_CAP_READ_WRITE;
 	}
+	else if (is_mime_type (comm->mime_type, "application/x-7z-compressed-tar")) {
+		char *try_command[3] = { "7za", "7zr", "7z" };
+		int   i;
+		
+		for (i = 0; i < G_N_ELEMENTS (try_command); i++) {
+			if (is_program_in_path (try_command[i])) {
+				comm->capabilities |= FR_COMMAND_CAP_READ_WRITE;
+				comm_tar->compress_command = g_strdup (try_command[i]);
+				break;
+			}
+		}
+	}
 }
 
 
@@ -851,6 +939,11 @@
 		g_free (comm_tar->msg);
 		comm_tar->msg = NULL;
 	}
+	
+	if (comm_tar->compress_command != NULL) {
+		g_free (comm_tar->compress_command);
+		comm_tar->compress_command = NULL;
+	}
 
 	/* Chain up */
         if (G_OBJECT_CLASS (parent_class)->finalize)

Modified: trunk/src/fr-command-tar.h
==============================================================================
--- trunk/src/fr-command-tar.h	(original)
+++ trunk/src/fr-command-tar.h	Tue Jun  3 17:44:29 2008
@@ -44,10 +44,11 @@
 
 	/*<private>*/
 
-	char              *uncomp_filename;
-	gboolean           name_modified;
-
-	char              *msg;
+	char      *uncomp_filename;
+	gboolean   name_modified;
+	char      *compress_command;
+	
+	char      *msg;
 };
 
 struct _FrCommandTarClass

Modified: trunk/src/fr-window.c
==============================================================================
--- trunk/src/fr-window.c	(original)
+++ trunk/src/fr-window.c	Tue Jun  3 17:44:29 2008
@@ -63,7 +63,7 @@
 #define CHECK_CLIPBOARD_TIMEOUT 500
 
 #define PROGRESS_DIALOG_WIDTH 300
-#define PROGRESS_TIMEOUT_MSECS 500     /* FIXME */
+#define PROGRESS_TIMEOUT_MSECS 1000     /* FIXME */
 #define PROGRESS_BAR_HEIGHT 10
 
 #define HIDE_PROGRESS_TIMEOUT_MSECS 500 /* FIXME */
@@ -7760,7 +7760,7 @@
         	return FALSE;
         }
         
-        files_to_open = g_list_append (files_to_open, (char*) first_file);
+        files_to_open = g_list_append (files_to_open, g_filename_to_uri (first_file, NULL, NULL));
         
         if (g_app_info_supports_files (app)) {
         	GList *scan;
@@ -7774,14 +7774,14 @@
 				continue;
 
 			if (strcmp (mime_type, first_mime_type) == 0) {
-				files_to_open = g_list_append (files_to_open, (char*) path);
+				files_to_open = g_list_append (files_to_open, g_filename_to_uri (path, NULL, NULL));
 			}
 			else {
 				GAppInfo *app2;
 				
 				app2 = g_app_info_get_default_for_type (mime_type, FALSE);
 				if (g_app_info_equal (app, app2))
-					files_to_open = g_list_append (files_to_open, (char*) path);
+					files_to_open = g_list_append (files_to_open, g_filename_to_uri (path, NULL, NULL));
 				g_object_unref (app2);
 			}
 		}
@@ -7794,7 +7794,7 @@
         }
         
         g_object_unref (app);
-        g_list_free (files_to_open);
+        path_list_free (files_to_open);
         
 	return result;
 }

Modified: trunk/src/main.c
==============================================================================
--- trunk/src/main.c	(original)
+++ trunk/src/main.c	Tue Jun  3 17:44:29 2008
@@ -77,36 +77,37 @@
 static char  *default_url = NULL;
 
 FrMimeTypeDescription mime_type_desc[] = {
-	{ "application/x-ace",                 ".ace",      N_("Ace (.ace)"), FALSE, FALSE },
-	{ "application/x-ar",                  ".ar",       N_("Ar (.ar)"), FALSE, TRUE },
-	{ "application/x-arj",                 ".arj",      N_("Arj (.arj)"), TRUE, TRUE },
-	{ "application/x-bzip",                ".bz2",      NULL, FALSE, FALSE },
-	{ "application/x-bzip1",               ".bz",       NULL, FALSE, FALSE },
-	{ "application/x-compress",            ".Z",        NULL, FALSE, FALSE },
-	{ "application/x-cpio",                ".cpio",     NULL, FALSE, TRUE },
-	{ "application/x-deb",                 ".deb",      NULL, FALSE, TRUE },
-	{ "application/x-cd-image",            ".iso",      NULL, FALSE, TRUE },
-	{ "application/x-ear",                 ".ear",      N_("Ear (.ear)"), TRUE, TRUE },
-	{ "application/x-ms-dos-executable",   ".exe",      N_("Self-extracting zip (.exe)"), FALSE, TRUE },
-	{ "application/x-gzip",                ".gz",       NULL, FALSE, FALSE },
-	{ "application/x-jar",                 ".jar",      N_("Jar (.jar)"), TRUE, TRUE },
-	{ "application/x-lha",                 ".lzh",      N_("Lha (.lzh)"), FALSE, TRUE },
-	{ "application/x-lzma",                ".lzma",     NULL, FALSE, FALSE },
-	{ "application/x-lzop",                ".lzo",      NULL, FALSE, FALSE },
-	{ "application/x-rar",                 ".rar",      N_("Rar (.rar)"), TRUE, TRUE },
-	{ "application/x-rpm",                 ".rpm",      NULL, FALSE, TRUE },
-	{ "application/x-tar",                 ".tar",      N_("Tar uncompressed (.tar)"), FALSE, TRUE },
+	{ "application/x-ace",                  ".ace",      N_("Ace (.ace)"), FALSE, FALSE },
+	{ "application/x-ar",                   ".ar",       N_("Ar (.ar)"), FALSE, TRUE },
+	{ "application/x-arj",                  ".arj",      N_("Arj (.arj)"), TRUE, TRUE },
+	{ "application/x-bzip",                 ".bz2",      NULL, FALSE, FALSE },
+	{ "application/x-bzip1",                ".bz",       NULL, FALSE, FALSE },
+	{ "application/x-compress",             ".Z",        NULL, FALSE, FALSE },
+	{ "application/x-cpio",                 ".cpio",     NULL, FALSE, TRUE },
+	{ "application/x-deb",                  ".deb",      NULL, FALSE, TRUE },
+	{ "application/x-cd-image",             ".iso",      NULL, FALSE, TRUE },
+	{ "application/x-ear",                  ".ear",      N_("Ear (.ear)"), TRUE, TRUE },
+	{ "application/x-ms-dos-executable",    ".exe",      N_("Self-extracting zip (.exe)"), FALSE, TRUE },
+	{ "application/x-gzip",                 ".gz",       NULL, FALSE, FALSE },
+	{ "application/x-jar",                  ".jar",      N_("Jar (.jar)"), TRUE, TRUE },
+	{ "application/x-lha",                  ".lzh",      N_("Lha (.lzh)"), FALSE, TRUE },
+	{ "application/x-lzma",                 ".lzma",     NULL, FALSE, FALSE },
+	{ "application/x-lzop",                 ".lzo",      NULL, FALSE, FALSE },
+	{ "application/x-rar",                  ".rar",      N_("Rar (.rar)"), TRUE, TRUE },
+	{ "application/x-rpm",                  ".rpm",      NULL, FALSE, TRUE },
+	{ "application/x-tar",                  ".tar",      N_("Tar uncompressed (.tar)"), FALSE, TRUE },
 	{ "application/x-bzip1-compressed-tar", ".tar.bz",   N_("Tar compressed with bzip (.tar.bz)"), FALSE, TRUE },
-	{ "application/x-bzip-compressed-tar", ".tar.bz2",  N_("Tar compressed with bzip2 (.tar.bz2)"), FALSE, TRUE },
-	{ "application/x-compressed-tar",      ".tar.gz",   N_("Tar compressed with gzip (.tar.gz)"), FALSE, TRUE },
-	{ "application/x-lzma-compressed-tar", ".tar.lzma", N_("Tar compressed with lzma (.tar.lzma)"), FALSE, TRUE },
-	{ "application/x-lzop-compressed-tar", ".tar.lzo",  N_("Tar compressed with lzop (.tar.lzo)"), FALSE, TRUE },
-	{ "application/x-compressed-tar",      ".tar.Z",    N_("Tar compressed with compress (.tar.Z)"), FALSE, TRUE },
-	{ "application/x-stuffit",             ".sit",      NULL, FALSE, TRUE },
-	{ "application/x-war",                 ".war",      N_("War (.war)"), TRUE, TRUE },
-	{ "application/zip",                   ".zip",      N_("Zip (.zip)"), TRUE, TRUE },
-	{ "application/x-zoo",                 ".zoo",      N_("Zoo (.zoo)"), FALSE, TRUE },
-	{ "application/x-7z-compressed",       ".7z",       N_("7-Zip (.7z)"), TRUE, TRUE },
+	{ "application/x-bzip-compressed-tar",  ".tar.bz2",  N_("Tar compressed with bzip2 (.tar.bz2)"), FALSE, TRUE },
+	{ "application/x-compressed-tar",       ".tar.gz",   N_("Tar compressed with gzip (.tar.gz)"), FALSE, TRUE },
+	{ "application/x-lzma-compressed-tar",  ".tar.lzma", N_("Tar compressed with lzma (.tar.lzma)"), FALSE, TRUE },
+	{ "application/x-lzop-compressed-tar",  ".tar.lzo",  N_("Tar compressed with lzop (.tar.lzo)"), FALSE, TRUE },
+	{ "application/x-7z-compressed-tar",    ".tar.7z",   N_("Tar compressed with 7z (.tar.7z)"), FALSE, TRUE },
+	{ "application/x-compressed-tar",       ".tar.Z",    N_("Tar compressed with compress (.tar.Z)"), FALSE, TRUE },
+	{ "application/x-stuffit",              ".sit",      NULL, FALSE, TRUE },
+	{ "application/x-war",                  ".war",      N_("War (.war)"), TRUE, TRUE },
+	{ "application/zip",                    ".zip",      N_("Zip (.zip)"), TRUE, TRUE },
+	{ "application/x-zoo",                  ".zoo",      N_("Zoo (.zoo)"), FALSE, TRUE },
+	{ "application/x-7z-compressed",        ".7z",       N_("7-Zip (.7z)"), TRUE, TRUE },
 	{ NULL, NULL, NULL, FALSE, FALSE }
 };
 
@@ -138,6 +139,7 @@
 	{ ".tar.gz", "application/x-compressed-tar" },
 	{ ".tar.lzma", "application/x-lzma-compressed-tar" },
 	{ ".tar.lzo", "application/x-lzop-compressed-tar" },
+	{ ".tar.7z", "application/x-7z-compressed-tar" },
 	{ ".tar.Z", "application/x-compressed-tar" },
 	{ ".taz", "application/x-compressed-tar" },
 	{ ".tbz", "application/x-bzip-compressed-tar" },
@@ -193,7 +195,9 @@
 	/*{ "bzip",     "application/x-bzip1-compressed-tar", FALSE, TRUE },*/
 	{ "lzma",      "application/x-lzma-compressed-tar", TRUE, TRUE },
 	{ "lzop",      "application/x-lzop-compressed-tar", TRUE, TRUE },
-	{ "compress",  "application/x-compressed-tar", TRUE, TRUE }
+	{ "compress",  "application/x-compressed-tar", TRUE, TRUE },
+	{ "7za",       "application/x-7z-compressed-tar", FALSE, TRUE },
+	{ "7zr",       "application/x-7z-compressed-tar", FALSE, TRUE }
 };
 
 
@@ -593,6 +597,7 @@
 			  "application/x-bzip-compressed-tar", FR_COMMAND_CAP_ALL,
 			  "application/x-lzma-compressed-tar", FR_COMMAND_CAP_ALL,
 			  "application/x-lzop-compressed-tar", FR_COMMAND_CAP_ALL,
+			  "application/x-7z-compressed-tar", FR_COMMAND_CAP_WRITE | FR_COMMAND_CAP_ARCHIVE_MANY_FILES,
 			  NULL);
 	register_command (FR_TYPE_COMMAND_UNSTUFF,
 			  "application/x-stuffit", FR_COMMAND_CAP_READ | FR_COMMAND_CAP_ARCHIVE_MANY_FILES,
@@ -700,9 +705,12 @@
 					
 				idx = get_mime_type_index (comm_desc_2.mime_type);
 				if (idx >= 0) {
-					open_type[o_i++] = idx;
-					save_type[s_i++] = idx;
-					single_file_save_type[sf_i++] = idx;
+					if (comm_desc_2.can_open)
+						open_type[o_i++] = idx;
+					if (comm_desc_2.can_save && mime_type_desc[idx].supports_many_files)
+						save_type[s_i++] = idx;
+					if (comm_desc_2.can_save)
+						single_file_save_type[sf_i++] = idx;
 				}
 			}
 		}



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]