[file-roller: 92/123] libarchive: set the compression option only when a compressor is present



commit fd5b6fec83169c8a397e3ff7dee19e5725e2ca40
Author: Paolo Bacchilega <paobac src gnome org>
Date:   Tue Jul 31 11:28:26 2012 +0200

    libarchive: set the compression option only when a compressor is present

 src/fr-archive-libarchive.c |   69 ++++++++++++++++++++++++------------------
 1 files changed, 39 insertions(+), 30 deletions(-)
---
diff --git a/src/fr-archive-libarchive.c b/src/fr-archive-libarchive.c
index 79e81ca..8fc94c2 100644
--- a/src/fr-archive-libarchive.c
+++ b/src/fr-archive-libarchive.c
@@ -709,76 +709,86 @@ save_data_close (struct archive *a,
 
 
 static void
-_archive_write_set_format_from_filename (struct archive *a,
-					 GFile          *file)
+_archive_write_set_format_from_context (struct archive *a,
+					SaveData       *save_data)
 {
 	char       *uri;
 	const char *ext;
+	int         archive_filter;
 
-	uri = g_file_get_uri (file);
-	ext = _g_filename_get_extension (uri);
+	/* set format and filter from the file extension */
 
+	uri = g_file_get_uri (fr_archive_get_file (LOAD_DATA (save_data)->archive));
+	ext = _g_filename_get_extension (uri);
 	if (ext == NULL) {
 		/* defaults to an uncompressed tar */
 		ext = ".tar";
 	}
+	archive_filter = ARCHIVE_FILTER_NONE;
 
 	if ((strcmp (ext, ".tar.bz2") == 0) || (strcmp (ext, ".tbz2") == 0)) {
 		archive_write_add_filter_bzip2 (a);
 		archive_write_set_format_ustar (a);
+		archive_filter = ARCHIVE_FILTER_BZIP2;
 	}
 	else if ((strcmp (ext, ".tar.Z") == 0) || (strcmp (ext, ".taz") == 0)) {
 		archive_write_add_filter_compress (a);
 		archive_write_set_format_ustar (a);
+		archive_filter = ARCHIVE_FILTER_COMPRESS;
 	}
 	else if ((strcmp (ext, ".tar.gz") == 0) || (strcmp (ext, ".tgz") == 0)) {
 		archive_write_add_filter_gzip (a);
 		archive_write_set_format_ustar (a);
+		archive_filter = ARCHIVE_FILTER_GZIP;
 	}
 	else if ((strcmp (ext, ".tar.lz") == 0) || (strcmp (ext, ".tlz") == 0)) {
 		archive_write_add_filter_lzip (a);
 		archive_write_set_format_ustar (a);
+		archive_filter = ARCHIVE_FILTER_LZIP;
 	}
 	else if ((strcmp (ext, ".tar.lzma") == 0) || (strcmp (ext, ".tzma") == 0)) {
 		archive_write_add_filter_lzma (a);
 		archive_write_set_format_ustar (a);
+		archive_filter = ARCHIVE_FILTER_LZMA;
 	}
 	else if ((strcmp (ext, ".tar.xz") == 0) || (strcmp (ext, ".txz") == 0)) {
 		archive_write_add_filter_xz (a);
 		archive_write_set_format_ustar (a);
+		archive_filter = ARCHIVE_FILTER_XZ;
 	}
 	else {
 		/* defaults to an uncompressed tar */
 		archive_write_add_filter_none (a);
 		archive_write_set_format_ustar (a);
+		archive_filter = ARCHIVE_FILTER_NONE;
 	}
 
-	/* FIXME: add all the supported formats */
+	/* FIXME: add all the libarchive supported formats */
 
-	g_free (uri);
-}
+	/* set the compression level */
 
+	if (archive_filter != ARCHIVE_FILTER_NONE) {
+		char *compression_level = NULL;
 
-static void
-_archive_write_set_compression_level (struct archive *a,
-				      FrCompression   compression)
-{
-	/* FIXME: check if the filter supports the option */
-
-	switch (compression) {
-	case FR_COMPRESSION_VERY_FAST:
-		archive_write_set_filter_option (a, NULL, "compression-level", "1");
-		break;
-	case FR_COMPRESSION_FAST:
-		archive_write_set_filter_option (a, NULL, "compression-level", "3");
-		break;
-	case FR_COMPRESSION_NORMAL:
-		archive_write_set_filter_option (a, NULL, "compression-level", "6");
-		break;
-	case FR_COMPRESSION_MAXIMUM:
-		archive_write_set_filter_option (a, NULL, "compression-level", "9");
-		break;
+		switch (save_data->compression) {
+		case FR_COMPRESSION_VERY_FAST:
+			compression_level = "1";
+			break;
+		case FR_COMPRESSION_FAST:
+			compression_level = "3";
+			break;
+		case FR_COMPRESSION_NORMAL:
+			compression_level = "6";
+			break;
+		case FR_COMPRESSION_MAXIMUM:
+			compression_level = "9";
+			break;
+		}
+		if (compression_level != NULL)
+			archive_write_set_filter_option (a, NULL, "compression-level", compression_level);
 	}
+
+	g_free (uri);
 }
 
 
@@ -964,8 +974,7 @@ save_archive_thread (GSimpleAsyncResult *result,
 	load_data = LOAD_DATA (save_data);
 
 	save_data->b = b = archive_write_new ();
-	_archive_write_set_format_from_filename (b, fr_archive_get_file (load_data->archive));
-	_archive_write_set_compression_level (b, save_data->compression);
+	_archive_write_set_format_from_context (b, save_data);
 	archive_write_open (b, save_data, save_data_open, save_data_write, save_data_close);
 
 	a = archive_read_new ();
@@ -1668,6 +1677,6 @@ fr_archive_libarchive_init (FrArchiveLibarchive *self)
 	base->propExtractCanSkipOlder = TRUE;
 	base->propExtractCanJunkPaths = TRUE;
 	base->propCanExtractAll = TRUE;
-	base->propCanDeleteNonEmptyFolders = TRUE; /* FIXME: not implemented yet */
-	base->propCanExtractNonEmptyFolders = TRUE; /* FIXME: not implemented yet */
+	base->propCanDeleteNonEmptyFolders = TRUE;
+	base->propCanExtractNonEmptyFolders = TRUE;
 }



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