[file-roller: 101/123] removed the custom format chooser, allow to save an archive with a non-standard mime type



commit 320e4d950418c10c393d77052f5e137904472719
Author: Paolo Bacchilega <paobac src gnome org>
Date:   Thu Aug 2 08:38:23 2012 +0200

    removed the custom format chooser, allow to save an archive with a non-standard mime type

 src/Makefile.am             |    2 -
 src/dlg-batch-add.c         |   17 +-
 src/eggfileformatchooser.c  | 1223 -------------------------------------------
 src/eggfileformatchooser.h  |   85 ---
 src/fr-archive-libarchive.c |   38 +-
 src/fr-archive.c            |   22 +-
 src/fr-archive.h            |    6 +-
 src/fr-init.c               |    2 +-
 src/fr-new-archive-dialog.c |  390 ++++++--------
 src/fr-new-archive-dialog.h |   15 +-
 src/fr-window.c             |   36 +-
 src/fr-window.h             |    4 +-
 12 files changed, 247 insertions(+), 1593 deletions(-)
---
diff --git a/src/Makefile.am b/src/Makefile.am
index f6b4a31..11d7369 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -79,8 +79,6 @@ COMMON_SOURCES = 			\
 	dlg-prop.h			\
 	dlg-update.c			\
 	dlg-update.h			\
-	eggfileformatchooser.c		\
-	eggfileformatchooser.h		\
 	egg-macros.h			\
 	eggtreemultidnd.c		\
 	eggtreemultidnd.h		\
diff --git a/src/dlg-batch-add.c b/src/dlg-batch-add.c
index bc9aa72..7309874 100644
--- a/src/dlg-batch-add.c
+++ b/src/dlg-batch-add.c
@@ -66,6 +66,17 @@ get_ext (DialogData *data)
 }
 
 
+static const char *
+get_mime_type (DialogData *data)
+{
+	int idx;
+
+	idx = gtk_combo_box_get_active (GTK_COMBO_BOX (data->archive_type_combo_box));
+
+	return mime_type_desc[data->supported_types[idx]].mime_type;
+}
+
+
 /* called when the main dialog is closed. */
 static void
 destroy_cb (GtkWidget  *widget,
@@ -128,6 +139,7 @@ add_clicked_cb (GtkWidget  *widget,
 	char       *archive_file;
 	char       *tmp;
 	const char *archive_ext;
+	const char *mime_type;
 	gboolean    do_not_add = FALSE;
 	GError     *error = NULL;
 
@@ -270,6 +282,8 @@ add_clicked_cb (GtkWidget  *widget,
 	/**/
 
 	archive_ext = get_ext (data);
+	mime_type = get_mime_type (data);
+
 	tmp = archive_name;
 	archive_name = g_strconcat (tmp, archive_ext, NULL);
 	g_free (tmp);
@@ -332,10 +346,11 @@ add_clicked_cb (GtkWidget  *widget,
 			return;
 		}
 	}
+
 	set_archive_options (data);
 	gtk_widget_destroy (GET_WIDGET ("dialog"));
 
-	fr_window_create_archive_and_continue (window, archive_file, NULL);
+	fr_window_create_archive_and_continue (window, archive_file, mime_type, NULL);
 
 	g_free (archive_name);
 	g_free (archive_dir);
diff --git a/src/fr-archive-libarchive.c b/src/fr-archive-libarchive.c
index 916a85c..da25048 100644
--- a/src/fr-archive-libarchive.c
+++ b/src/fr-archive-libarchive.c
@@ -744,61 +744,55 @@ static void
 _archive_write_set_format_from_context (struct archive *a,
 					SaveData       *save_data)
 {
-	char       *uri;
-	const char *ext;
+	const char *mime_type;
 	int         archive_filter;
 
-	/* set format and filter from the file extension */
+	/* set format and filter from the mime type */
 
-	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";
-	}
+	mime_type = fr_archive_get_mime_type (LOAD_DATA (save_data)->archive);
 	archive_filter = ARCHIVE_FILTER_NONE;
 
-	if ((strcmp (ext, ".tar.bz2") == 0) || (strcmp (ext, ".tbz2") == 0)) {
+	if (_g_str_equal (mime_type, "application/x-bzip-compressed-tar")) {
 		archive_write_set_format_pax_restricted (a);
 		archive_filter = ARCHIVE_FILTER_BZIP2;
 	}
-	else if ((strcmp (ext, ".tar.Z") == 0) || (strcmp (ext, ".taz") == 0)) {
+	else if (_g_str_equal (mime_type, "application/x-tarz")) {
 		archive_write_set_format_pax_restricted (a);
 		archive_filter = ARCHIVE_FILTER_COMPRESS;
 	}
-	else if ((strcmp (ext, ".tar.gz") == 0) || (strcmp (ext, ".tgz") == 0)) {
+	else if (_g_str_equal (mime_type, "application/x-compressed-tar")) {
 		archive_write_set_format_pax_restricted (a);
 		archive_filter = ARCHIVE_FILTER_GZIP;
 	}
-	else if ((strcmp (ext, ".tar.lz") == 0) || (strcmp (ext, ".tlz") == 0)) {
+	else if (_g_str_equal (mime_type, "application/x-lzip-compressed-tar")) {
 		archive_write_set_format_pax_restricted (a);
 		archive_filter = ARCHIVE_FILTER_LZIP;
 	}
-	else if ((strcmp (ext, ".tar.lzma") == 0) || (strcmp (ext, ".tzma") == 0)) {
+	else if (_g_str_equal (mime_type, "application/x-lzma-compressed-tar")) {
 		archive_write_set_format_pax_restricted (a);
 		archive_filter = ARCHIVE_FILTER_LZMA;
 	}
-	else if ((strcmp (ext, ".tar.xz") == 0) || (strcmp (ext, ".txz") == 0)) {
+	else if (_g_str_equal (mime_type, "application/x-xz-compressed-tar")) {
 		archive_write_set_format_pax_restricted (a);
 		archive_filter = ARCHIVE_FILTER_XZ;
 	}
-	else if (strcmp (ext, ".tar") == 0) {
+	else if (_g_str_equal (mime_type, "application/x-tar")) {
 		archive_write_add_filter_none (a);
 		archive_write_set_format_pax_restricted (a);
 	}
-	else if (strcmp (ext, ".iso") == 0) {
+	else if (_g_str_equal (mime_type, "application/x-cd-image")) {
 		archive_write_set_format_iso9660 (a);
 	}
-	else if (strcmp (ext, ".cpio") == 0) {
+	else if (_g_str_equal (mime_type, "application/x-cpio")) {
 		archive_write_set_format_cpio (a);
 	}
-	else if (strcmp (ext, ".xar") == 0) {
+	else if (_g_str_equal (mime_type, "application/x-xar")) {
 		archive_write_set_format_xar (a);
 	}
-	else if (strcmp (ext, ".ar") == 0) {
+	else if (_g_str_equal (mime_type, "application/x-ar")) {
 		archive_write_set_format_ar_svr4 (a);
 	}
-	else if (strcmp (ext, ".7z") == 0) {
+	else if (_g_str_equal (mime_type, "application/x-7z-compressed")) {
 		archive_write_set_format_7zip (a);
 	}
 
@@ -850,8 +844,6 @@ _archive_write_set_format_from_context (struct archive *a,
 		if (compression_level != NULL)
 			archive_write_set_filter_option (a, NULL, "compression-level", compression_level);
 	}
-
-	g_free (uri);
 }
 
 
diff --git a/src/fr-archive.c b/src/fr-archive.c
index c743181..bf49693 100644
--- a/src/fr-archive.c
+++ b/src/fr-archive.c
@@ -485,7 +485,7 @@ fr_archive_is_capable_of (FrArchive     *self,
 
 
 const char **
-fr_archive_get_mime_types (FrArchive *self)
+fr_archive_get_supported_types (FrArchive *self)
 {
 	return FR_ARCHIVE_GET_CLASS (G_OBJECT (self))->get_mime_types (self);
 }
@@ -517,6 +517,13 @@ fr_archive_set_mime_type (FrArchive  *self,
 
 
 const char *
+fr_archive_get_mime_type (FrArchive  *self)
+{
+	return self->mime_type;
+}
+
+
+const char *
 fr_archive_get_packages (FrArchive  *self,
 			 const char *mime_type)
 {
@@ -582,14 +589,15 @@ create_archive_for_mime_type (GType          archive_type,
 
 
 FrArchive *
-fr_archive_create (GFile *file)
+fr_archive_create (GFile      *file,
+		   const char *mime_type)
 {
-	const char *mime_type;
-	GType       archive_type;
-	FrArchive  *archive;
-	GFile      *parent;
+	GType      archive_type;
+	FrArchive *archive;
+	GFile     *parent;
 
-	mime_type = get_mime_type_from_filename (file);
+	if (mime_type == NULL)
+		mime_type = get_mime_type_from_filename (file);
 	archive_type = get_archive_type_from_mime_type (mime_type, FR_ARCHIVE_CAN_WRITE);
 
 	archive = create_archive_for_mime_type (archive_type,
diff --git a/src/fr-archive.h b/src/fr-archive.h
index 1d13a55..88a71c0 100644
--- a/src/fr-archive.h
+++ b/src/fr-archive.h
@@ -310,18 +310,20 @@ GType         fr_archive_get_type                (void);
 GFile *       fr_archive_get_file                (FrArchive           *archive);
 gboolean      fr_archive_is_capable_of           (FrArchive           *archive,
 						  FrArchiveCaps        capabilities);
-const char ** fr_archive_get_mime_types          (FrArchive           *archive);
+const char ** fr_archive_get_supported_types     (FrArchive           *archive);
 void          fr_archive_update_capabilities     (FrArchive           *archive);
 FrArchiveCap  fr_archive_get_capabilities        (FrArchive           *archive,
 						  const char          *mime_type,
 						  gboolean             check_command);
 void          fr_archive_set_mime_type           (FrArchive           *archive,
 						  const char          *mime_type);
+const char *  fr_archive_get_mime_type           (FrArchive           *archive);
 const char *  fr_archive_get_packages            (FrArchive           *archive,
 						  const char          *mime_type);
 void          fr_archive_set_stoppable           (FrArchive           *archive,
 						  gboolean             stoppable);
-FrArchive *   fr_archive_create                  (GFile               *file);
+FrArchive *   fr_archive_create                  (GFile               *file,
+						  const char          *mime_type);
 void          fr_archive_open                    (GFile               *file,
 		       	       	       	          GCancellable        *cancellable,
 		       	       	       	          GAsyncReadyCallback  callback,
diff --git a/src/fr-init.c b/src/fr-init.c
index 56f5928..1f2024c 100644
--- a/src/fr-init.c
+++ b/src/fr-init.c
@@ -223,7 +223,7 @@ fr_registered_archive_new (GType command_type)
 	reg_com->packages = g_ptr_array_new ();
 
 	archive = (FrArchive*) g_object_new (reg_com->type, NULL);
-	mime_types = fr_archive_get_mime_types (archive);
+	mime_types = fr_archive_get_supported_types (archive);
 	for (i = 0; mime_types[i] != NULL; i++) {
 		const char         *mime_type;
 		FrMimeTypeCap      *cap;
diff --git a/src/fr-new-archive-dialog.c b/src/fr-new-archive-dialog.c
index a64f5fe..899252b 100644
--- a/src/fr-new-archive-dialog.c
+++ b/src/fr-new-archive-dialog.c
@@ -24,7 +24,6 @@
 #include <math.h>
 #include <unistd.h>
 #include <gio/gio.h>
-#include "eggfileformatchooser.h"
 #include "file-utils.h"
 #include "fr-init.h"
 #include "fr-new-archive-dialog.h"
@@ -34,18 +33,19 @@
 #include "preferences.h"
 
 
-#define GET_WIDGET(x)     (_gtk_builder_get_widget (self->priv->builder, (x)))
-#define DEFAULT_EXTENSION ".tar.gz"
-#define MEGABYTE          (1024 * 1024)
+#define GET_WIDGET(x)       (_gtk_builder_get_widget (self->priv->builder, (x)))
+#define DEFAULT_EXTENSION   ".tar.gz"
+#define MEGABYTE            (1024 * 1024)
+#define MIME_TYPE_INDEX_KEY "fr-mime-type-idx"
 
 
 struct _FrNewArchiveDialogPrivate {
-	GtkBuilder           *builder;
-	EggFileFormatChooser *format_chooser;
-	int                  *supported_types;
-	gboolean              can_encrypt;
-	gboolean              can_encrypt_header;
-	gboolean              can_create_volumes;
+	GtkBuilder *builder;
+	int        *supported_types;
+	GHashTable *supported_ext;
+	gboolean    can_encrypt;
+	gboolean    can_encrypt_header;
+	gboolean    can_create_volumes;
 };
 
 
@@ -60,6 +60,7 @@ fr_new_archive_dialog_finalize (GObject *object)
 	self = FR_NEW_ARCHIVE_DIALOG (object);
 
 	g_object_unref (self->priv->builder);
+	g_hash_table_unref (self->priv->supported_ext);
 
 	G_OBJECT_CLASS (fr_new_archive_dialog_parent_class)->finalize (object);
 }
@@ -82,6 +83,7 @@ fr_new_archive_dialog_init (FrNewArchiveDialog *self)
 {
 	self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self, FR_TYPE_NEW_ARCHIVE_DIALOG, FrNewArchiveDialogPrivate);
 	self->priv->builder = NULL;
+	self->priv->supported_ext = g_hash_table_new (g_str_hash, g_str_equal);
 }
 
 
@@ -135,51 +137,6 @@ _fr_new_archive_dialog_update_sensitivity_for_ext (FrNewArchiveDialog *self,
 }
 
 
-/* FIXME
-static void
-archive_type_combo_box_changed_cb (GtkComboBox *combo_box,
-				   DlgNewData  *data)
-{
-	const char *uri;
-	const char *ext;
-	int         idx;
-
-	uri = gtk_file_chooser_get_uri (GTK_FILE_CHOOSER (data->dialog));
-
-	ext = get_archive_filename_extension (uri);
-	idx = gtk_combo_box_get_active (GTK_COMBO_BOX (data->n_archive_type_combo_box)) - 1;
-	if ((ext == NULL) && (idx >= 0))
-		ext = mime_type_desc[self->priv->supported_types[idx]].default_ext;
-
-	_fr_new_archive_dialog_update_sensitivity_for_ext (data, ext);
-
-	if ((idx >= 0) && (uri != NULL)) {
-		const char *new_ext;
-		const char *basename;
-		char       *basename_noext;
-		char       *new_basename;
-		char       *new_basename_uft8;
-
-		new_ext = mime_type_desc[self->priv->supported_types[idx]].default_ext;
-		basename = _g_path_get_file_name (uri);
-		if (g_str_has_suffix (basename, ext))
-			basename_noext = g_strndup (basename, strlen (basename) - strlen (ext));
-		else
-			basename_noext = g_strdup (basename);
-		new_basename = g_strconcat (basename_noext, new_ext, NULL);
-		new_basename_uft8 = g_uri_unescape_string (new_basename, NULL);
-
-		gtk_file_chooser_set_current_name (GTK_FILE_CHOOSER (data->dialog), new_basename_uft8);
-		_fr_new_archive_dialog_update_sensitivity_for_ext (data, new_ext);
-
-		g_free (new_basename_uft8);
-		g_free (new_basename);
-		g_free (basename_noext);
-	}
-}
-*/
-
-
 static void
 password_entry_changed_cb (GtkEditable *editable,
 			   gpointer     user_data)
@@ -196,9 +153,34 @@ volume_toggled_cb (GtkToggleButton *toggle_button,
 }
 
 
+static int
+_fr_new_archive_dialog_get_format (FrNewArchiveDialog *self,
+				   const char         *uri)
+{
+	GtkFileFilter *filter;
+	int            idx;
+
+	filter = gtk_file_chooser_get_filter (GTK_FILE_CHOOSER (self));
+	if (filter == NULL) {
+		const char *ext;
+
+		/* get the format from the extension */
+
+		ext = _g_filename_get_extension (uri);
+		idx = GPOINTER_TO_INT (g_hash_table_lookup (self->priv->supported_ext, ext));
+
+		return idx - 1;
+	}
+
+	idx = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (filter), MIME_TYPE_INDEX_KEY));
+	return idx - 1;
+}
+
+
 static void
-format_chooser_selection_changed_cb (EggFileFormatChooser *format_chooser,
-				     gpointer              user_data)
+filter_notify_cb (GObject    *gobject,
+                  GParamSpec *pspec,
+                  gpointer    user_data)
 {
 	FrNewArchiveDialog *self = user_data;
 	const char         *uri;
@@ -209,10 +191,13 @@ format_chooser_selection_changed_cb (EggFileFormatChooser *format_chooser,
 	if (uri == NULL)
 		return;
 
+	n_format = _fr_new_archive_dialog_get_format (self, uri);
+	if (n_format < 0)
+		return;
+
 	ext = get_archive_filename_extension (uri);
-	n_format = egg_file_format_chooser_get_format (EGG_FILE_FORMAT_CHOOSER (self->priv->format_chooser), uri);
 	if (ext == NULL)
-		ext = mime_type_desc[self->priv->supported_types[n_format - 1]].default_ext;
+		ext = mime_type_desc[self->priv->supported_types[n_format]].default_ext;
 
 	_fr_new_archive_dialog_update_sensitivity_for_ext (self, ext);
 
@@ -223,7 +208,7 @@ format_chooser_selection_changed_cb (EggFileFormatChooser *format_chooser,
 		char       *new_basename;
 		char       *new_basename_uft8;
 
-		new_ext = mime_type_desc[self->priv->supported_types[n_format - 1]].default_ext;
+		new_ext = mime_type_desc[self->priv->supported_types[n_format]].default_ext;
 		basename = _g_path_get_file_name (uri);
 		if (g_str_has_suffix (basename, ext))
 			basename_noext = g_strndup (basename, strlen (basename) - strlen (ext));
@@ -242,34 +227,18 @@ format_chooser_selection_changed_cb (EggFileFormatChooser *format_chooser,
 }
 
 
-static void
-options_expander_unmap_cb (GtkWidget *widget,
-			   gpointer   user_data)
-{
-	egg_file_format_chooser_emit_size_changed ((EggFileFormatChooser *) user_data);
-}
-
-
-static char *
-get_icon_name_for_type (const char *mime_type)
+static gboolean
+all_supported_files_filter_func (const GtkFileFilterInfo *filter_info,
+				 gpointer                 data)
 {
-	char *name = NULL;
-
-	if (mime_type != NULL) {
-		char *s;
-
-		name = g_strconcat ("gnome-mime-", mime_type, NULL);
-		for (s = name; *s; ++s)
-			if (! g_ascii_isalpha (*s))
-				*s = '-';
-	}
-
-	if ((name == NULL) || ! gtk_icon_theme_has_icon (gtk_icon_theme_get_default (), name)) {
-		g_free (name);
-		name = g_strdup ("package-x-generic");
-	}
+	FrNewArchiveDialog *self = data;
+	const char         *ext;
 
-	return name;
+	ext = _g_filename_get_extension (filter_info->uri);
+	if (ext != NULL)
+		return g_hash_table_lookup (self->priv->supported_ext, ext) != NULL;
+	else
+		return FALSE;
 }
 
 
@@ -279,11 +248,11 @@ _fr_new_archive_dialog_construct (FrNewArchiveDialog *self,
 				  FrNewArchiveAction  action,
 				  const char         *default_name)
 {
-	GSettings *settings;
-	int        i;
+	GSettings     *settings;
+	GtkFileFilter *filter;
+	int            i;
 
 	gtk_file_chooser_set_action (GTK_FILE_CHOOSER (self), GTK_FILE_CHOOSER_ACTION_SAVE);
-	gtk_file_chooser_set_do_overwrite_confirmation (GTK_FILE_CHOOSER (self), TRUE);
 	gtk_file_chooser_set_local_only (GTK_FILE_CHOOSER (self), FALSE);
 	gtk_window_set_modal (GTK_WINDOW (self), TRUE);
 	gtk_window_set_transient_for (GTK_WINDOW (self), parent);
@@ -329,45 +298,68 @@ _fr_new_archive_dialog_construct (FrNewArchiveDialog *self,
 	gtk_spin_button_set_value (GTK_SPIN_BUTTON (GET_WIDGET("volume_spinbutton")), (double) g_settings_get_int (settings, PREF_BATCH_ADD_VOLUME_SIZE) / MEGABYTE);
 	g_object_unref (settings);
 
-	/* format chooser */
+	/* file filter */
+
+	/* all files */
+
+	filter = gtk_file_filter_new ();
+	gtk_file_filter_add_pattern (filter, "*");
+	gtk_file_filter_set_name (filter, _("All Files"));
+	gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (self), filter);
+
+	/* all supported files */
+
+	filter = gtk_file_filter_new ();
+	gtk_file_filter_add_custom (filter,
+				    GTK_FILE_FILTER_URI,
+				    all_supported_files_filter_func,
+				    self,
+				    NULL);
+	gtk_file_filter_set_name (filter, _("All Supported Files"));
+	gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (self), filter);
+	gtk_file_chooser_set_filter (GTK_FILE_CHOOSER (self), filter);
 
-	self->priv->format_chooser = (EggFileFormatChooser *) egg_file_format_chooser_new ();
 	for (i = 0; self->priv->supported_types[i] != -1; i++) {
-		int   idx = self->priv->supported_types[i];
-		char *exts[4];
-		int   e;
-		int   n_exts;
-		char *icon_name;
-
-		n_exts = 0;
-		for (e = 0; (n_exts < 4) && file_ext_type[e].ext != NULL; e++) {
-			if (strcmp (file_ext_type[e].ext, mime_type_desc[idx].default_ext) == 0)
-				continue;
-			if (strcmp (file_ext_type[e].mime_type, mime_type_desc[idx].mime_type) == 0)
-				exts[n_exts++] = file_ext_type[e].ext;
+		int      idx;
+		GString *name;
+		int      n_ext;
+		int      e;
+
+		filter = gtk_file_filter_new ();
+		g_object_set_data (G_OBJECT (filter), MIME_TYPE_INDEX_KEY, GINT_TO_POINTER (i + 1));
+
+		idx = self->priv->supported_types[i];
+		name = g_string_new (_(mime_type_desc[idx].name));
+		g_string_append (name, " (");
+
+		n_ext = 0;
+		for (e = 0; file_ext_type[e].ext != NULL; e++) {
+			if (_g_str_equal (file_ext_type[e].mime_type, mime_type_desc[idx].mime_type)) {
+				char *ext;
+				char *pattern;
+
+				ext = file_ext_type[e].ext;
+				g_hash_table_insert (self->priv->supported_ext, ext, GINT_TO_POINTER (idx + 1));
+				n_ext++;
+
+				if (n_ext > 1)
+					g_string_append (name, ", ");
+				g_string_append (name, "*");
+				g_string_append (name, ext);
+
+				pattern = g_strdup_printf ("*%s", ext);
+				gtk_file_filter_add_pattern (filter, pattern);
+
+				g_free (pattern);
+			}
 		}
-		while (n_exts < 4)
-			exts[n_exts++] = NULL;
-
-		/* g_print ("%s => %s, %s, %s, %s\n", mime_type_desc[idx].mime_type, exts[0], exts[1], exts[2], exts[3]); */
-
-		icon_name = get_icon_name_for_type (mime_type_desc[idx].mime_type);
-		egg_file_format_chooser_add_format (self->priv->format_chooser,
-						    0,
-						    _(mime_type_desc[idx].name),
-						    icon_name,
-						    mime_type_desc[idx].default_ext,
-						    exts[0],
-						    exts[1],
-						    exts[2],
-						    exts[3],
-						    NULL);
-
-		g_free (icon_name);
+
+		g_string_append (name, ")");
+		gtk_file_filter_set_name (filter, name->str);
+		gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (self), filter);
+
+		g_string_free (name, TRUE);
 	}
-	egg_file_format_chooser_set_format (self->priv->format_chooser, 0);
-	gtk_widget_show (GTK_WIDGET (self->priv->format_chooser));
-	gtk_box_pack_start (GTK_BOX (GET_WIDGET ("format_chooser_box")), GTK_WIDGET (self->priv->format_chooser), TRUE, TRUE, 0);
 
 	gtk_widget_set_vexpand (GET_WIDGET ("extra_widget"), FALSE);
 
@@ -375,10 +367,6 @@ _fr_new_archive_dialog_construct (FrNewArchiveDialog *self,
 
 	/* Set the signals handlers. */
 
-	/* FIXME g_signal_connect (GET_WIDGET ("archive_type_combo_box"),
-			  "changed",
-			  G_CALLBACK (archive_type_combo_box_changed_cb),
-			  self); */
 	g_signal_connect (GET_WIDGET ("password_entry"),
 			  "changed",
 			  G_CALLBACK (password_entry_changed_cb),
@@ -387,14 +375,10 @@ _fr_new_archive_dialog_construct (FrNewArchiveDialog *self,
 			  "toggled",
 			  G_CALLBACK (volume_toggled_cb),
 			  self);
-	g_signal_connect (self->priv->format_chooser,
-			  "selection-changed",
-			  G_CALLBACK (format_chooser_selection_changed_cb),
+	g_signal_connect (self,
+			  "notify::filter",
+			  G_CALLBACK (filter_notify_cb),
 			  self);
-	g_signal_connect_after (GET_WIDGET ("other_options_alignment"),
-				"unmap",
-				G_CALLBACK (options_expander_unmap_cb),
-				self->priv->format_chooser);
 }
 
 
@@ -424,12 +408,11 @@ _fr_new_archive_dialog_get_archive_type (FrNewArchiveDialog *self)
 
 	ext = get_archive_filename_extension (uri);
 	if (ext == NULL) {
-		int idx;
+		int n_format;
 
-		idx = egg_file_format_chooser_get_format (EGG_FILE_FORMAT_CHOOSER (self->priv->format_chooser), uri);
-		/*idx = gtk_combo_box_get_active (GTK_COMBO_BOX (data->n_archive_type_combo_box)) - 1;*/
-		if (idx >= 0)
-			return self->priv->supported_types[idx];
+		n_format = _fr_new_archive_dialog_get_format (self, uri);
+		if (n_format >= 0)
+			return self->priv->supported_types[n_format];
 
 		ext = DEFAULT_EXTENSION;
 	}
@@ -438,87 +421,64 @@ _fr_new_archive_dialog_get_archive_type (FrNewArchiveDialog *self)
 }
 
 
-/* when on Automatic the user provided extension needs to be supported,
-   otherwise an existing unsupported archive can be deleted (if the user
-   provided name matches with its name) before we find out that the
-   archive is unsupported
-*/
-static gboolean
-is_supported_extension (char *filename,
-			int  *file_types)
+char *
+fr_new_archive_dialog_get_uri (FrNewArchiveDialog  *self,
+			       const char         **mime_type)
 {
-	int i;
-	for (i = 0; file_types[i] != -1; i++)
-		if (_g_filename_has_extension (filename, mime_type_desc[file_types[i]].default_ext))
-			return TRUE;
-	return FALSE;
-}
-
+	char       *uri = NULL;
+	int         n_format;
+	const char *file_mime_type;
+	GFile      *file, *dir;
+	GFileInfo  *dir_info;
+	GError     *err = NULL;
+	GtkWidget  *dialog;
 
-static char *
-_fr_new_archive_dialog_get_uri (FrNewArchiveDialog *self)
-{
-	char        *full_uri = NULL;
-	char        *uri;
-	const char  *filename;
-	int          idx;
+	/* uri */
 
 	uri = gtk_file_chooser_get_uri (GTK_FILE_CHOOSER (self));
-
-	if ((uri == NULL) || (*uri == 0))
-		return NULL;
-
-	filename = _g_path_get_file_name (uri);
-	if ((filename == NULL) || (*filename == 0)) {
+	if ((uri == NULL) || (*uri == 0)) {
 		g_free (uri);
-		return NULL;
-	}
-
-	idx = egg_file_format_chooser_get_format (EGG_FILE_FORMAT_CHOOSER (self->priv->format_chooser), uri);
-	if (idx > 0) {
-		const char *uri_ext;
-		char       *default_ext;
 
-		uri_ext = get_archive_filename_extension (uri);
-		default_ext = mime_type_desc[self->priv->supported_types[idx-1]].default_ext;
-		if (_g_strcmp_null_tolerant (uri_ext, default_ext) != 0) {
-			full_uri = g_strconcat (uri, default_ext, NULL);
-			g_free (uri);
-		}
-	}
-	if (full_uri == NULL)
-		full_uri = uri;
+		dialog = _gtk_error_dialog_new (GTK_WINDOW (self),
+						GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
+						NULL,
+						_("Could not create the archive"),
+						"%s",
+						_("You have to specify an archive name."));
+		gtk_dialog_run (GTK_DIALOG (dialog));
 
-	return full_uri;
-}
+		gtk_widget_destroy (GTK_WIDGET (dialog));
 
+		return NULL;
+	}
 
-char *
-fr_new_archive_dialog_get_uri (FrNewArchiveDialog *self)
-{
-	char      *uri = NULL;
-	GFile     *file, *dir;
-	GFileInfo *dir_info;
-	GError    *err = NULL;
-	GtkWidget *dialog;
+	/* mime type */
 
-	uri = _fr_new_archive_dialog_get_uri (self);
-	if ((uri == NULL) || (*uri == 0)) {
-		g_free (uri);
+	n_format = _fr_new_archive_dialog_get_format (self, uri);
+	if (n_format >= 0)
+		file_mime_type = mime_type_desc[self->priv->supported_types[n_format]].mime_type;
+	else
+		file_mime_type = NULL;
+	if (mime_type != NULL)
+		*mime_type = file_mime_type;
 
+	if (file_mime_type == NULL) {
 		dialog = _gtk_error_dialog_new (GTK_WINDOW (self),
 						GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
 						NULL,
 						_("Could not create the archive"),
 						"%s",
-						_("You have to specify an archive name."));
+						_("Archive type not supported."));
 		gtk_dialog_run (GTK_DIALOG (dialog));
 
 		gtk_widget_destroy (GTK_WIDGET (dialog));
+		g_free (uri);
 
 		return NULL;
 	}
 
+	/* check permissions */
+
 	file = g_file_new_for_uri (uri);
 	dir = g_file_get_parent (file);
 	dir_info = g_file_query_info (dir,
@@ -556,39 +516,7 @@ fr_new_archive_dialog_get_uri (FrNewArchiveDialog *self)
 		return NULL;
 	}
 
-	/* if the user did not specify a valid extension use the filetype combobox current type
-	 * or tar.gz if automatic is selected. */
-	if (get_archive_filename_extension (uri) == NULL) {
-		int   idx;
-		char *new_uri;
-		char *ext = NULL;
-
-		idx = egg_file_format_chooser_get_format (EGG_FILE_FORMAT_CHOOSER (self->priv->format_chooser), uri);
-		if (idx > 0)
-			ext = mime_type_desc[self->priv->supported_types[idx-1]].default_ext;
-		else
-			ext = ".tar.gz";
-		new_uri = g_strconcat (uri, ext, NULL);
-		g_free (uri);
-		uri = new_uri;
-	}
-
-	debug (DEBUG_INFO, "create/save %s\n", uri);
-
-	if (! is_supported_extension (uri, self->priv->supported_types)) {
-		dialog = _gtk_error_dialog_new (GTK_WINDOW (self),
-						GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
-						NULL,
-						_("Could not create the archive"),
-						"%s",
-						_("Archive type not supported."));
-		gtk_dialog_run (GTK_DIALOG (dialog));
-
-		gtk_widget_destroy (GTK_WIDGET (dialog));
-		g_free (uri);
-
-		return NULL;
-	}
+	/* overwrite confirmation */
 
 	file = g_file_new_for_uri (uri);
 
diff --git a/src/fr-new-archive-dialog.h b/src/fr-new-archive-dialog.h
index c2f63b9..d19b35d 100644
--- a/src/fr-new-archive-dialog.h
+++ b/src/fr-new-archive-dialog.h
@@ -50,12 +50,13 @@ struct _FrNewArchiveDialogClass {
 };
 
 GType           fr_new_archive_dialog_get_type            (void);
-GtkWidget *     fr_new_archive_dialog_new                 (GtkWindow          *parent,
-							   FrNewArchiveAction  action,
-							   const char         *default_name);
-char *          fr_new_archive_dialog_get_uri             (FrNewArchiveDialog *dialog);
-const char *    fr_new_archive_dialog_get_password        (FrNewArchiveDialog *dialog);
-gboolean        fr_new_archive_dialog_get_encrypt_header  (FrNewArchiveDialog *dialog);
-int             fr_new_archive_dialog_get_volume_size     (FrNewArchiveDialog *dialog);
+GtkWidget *     fr_new_archive_dialog_new                 (GtkWindow           *parent,
+							   FrNewArchiveAction   action,
+							   const char          *default_name);
+char *          fr_new_archive_dialog_get_uri             (FrNewArchiveDialog  *dialog,
+							   const char         **mime_type);
+const char *    fr_new_archive_dialog_get_password        (FrNewArchiveDialog  *dialog);
+gboolean        fr_new_archive_dialog_get_encrypt_header  (FrNewArchiveDialog  *dialog);
+int             fr_new_archive_dialog_get_volume_size     (FrNewArchiveDialog  *dialog);
 
 #endif /* FR_NEW_ARCHIVE_DIALOG_H */
diff --git a/src/fr-window.c b/src/fr-window.c
index 791928f..7c4e78b 100644
--- a/src/fr-window.c
+++ b/src/fr-window.c
@@ -3990,11 +3990,12 @@ get_clipboard_data_from_selection_data (FrWindow   *window,
 gboolean
 fr_window_create_archive_and_continue (FrWindow   *window,
 			  	       const char *uri,
+			  	       const char *mime_type,
 			  	       GtkWindow  *error_dialog_parent)
 {
 	gboolean result = FALSE;
 
-	if (fr_window_archive_new (FR_WINDOW (window), uri)) {
+	if (fr_window_archive_new (FR_WINDOW (window), uri, mime_type)) {
 		if (! fr_window_is_batch_mode (FR_WINDOW (window)))
 			gtk_window_present (GTK_WINDOW (window));
 		_archive_operation_completed (window, FR_ACTION_CREATING_NEW_ARCHIVE, NULL);
@@ -4024,6 +4025,7 @@ new_archive_dialog_response_cb (GtkDialog *dialog,
 {
 	FrWindow   *window = user_data;
 	char       *uri;
+	const char *mime_type;
 	GtkWidget  *archive_window;
 	gboolean    new_window;
 	const char *password;
@@ -4036,7 +4038,7 @@ new_archive_dialog_response_cb (GtkDialog *dialog,
 		return;
 	}
 
-	uri = fr_new_archive_dialog_get_uri (FR_NEW_ARCHIVE_DIALOG (dialog));
+	uri = fr_new_archive_dialog_get_uri (FR_NEW_ARCHIVE_DIALOG (dialog), &mime_type);
 	if (uri == NULL)
 		return;
 
@@ -4054,8 +4056,13 @@ new_archive_dialog_response_cb (GtkDialog *dialog,
 	fr_window_set_encrypt_header (FR_WINDOW (archive_window), encrypt_header);
 	fr_window_set_volume_size (FR_WINDOW (archive_window), volume_size);
 
-	if (fr_window_create_archive_and_continue (FR_WINDOW (archive_window), uri, GTK_WINDOW (dialog)))
+	if (fr_window_create_archive_and_continue (FR_WINDOW (archive_window),
+						   uri,
+						   mime_type,
+						   GTK_WINDOW (dialog)))
+	{
 		gtk_widget_destroy (GTK_WIDGET (dialog));
+	}
 	else if (new_window)
 		gtk_widget_destroy (archive_window);
 
@@ -6105,7 +6112,8 @@ _fr_window_set_archive_uri (FrWindow   *window,
 
 gboolean
 fr_window_archive_new (FrWindow   *window,
-		       const char *uri)
+		       const char *uri,
+		       const char *mime_type)
 {
 	GFile     *file;
 	FrArchive *archive;
@@ -6113,7 +6121,7 @@ fr_window_archive_new (FrWindow   *window,
 	g_return_val_if_fail (window != NULL, FALSE);
 
 	file = g_file_new_for_uri (uri);
-	archive = fr_archive_create (file);
+	archive = fr_archive_create (file, mime_type);
 	if (archive != NULL) {
 		fr_window_archive_close (window);
 		_fr_window_set_archive (window, archive);
@@ -7402,6 +7410,7 @@ fr_window_action_new_archive (FrWindow *window)
 
 typedef struct {
 	char     *uri;
+	char     *mime_type;
 	char     *password;
 	gboolean  encrypt_header;
 	guint     volume_size;
@@ -7410,6 +7419,7 @@ typedef struct {
 
 static SaveAsData *
 save_as_data_new (const char *uri,
+		  const char *mime_type,
 		  const char *password,
 		  gboolean    encrypt_header,
 	  	  guint       volume_size)
@@ -7419,6 +7429,8 @@ save_as_data_new (const char *uri,
 	sdata = g_new0 (SaveAsData, 1);
 	if (uri != NULL)
 		sdata->uri = g_strdup (uri);
+	if (mime_type != NULL)
+		sdata->mime_type = g_strdup (mime_type);
 	if (password != NULL)
 		sdata->password = g_strdup (password);
 	sdata->encrypt_header = encrypt_header;
@@ -7434,6 +7446,7 @@ save_as_data_free (SaveAsData *sdata)
 	if (sdata == NULL)
 		return;
 	g_free (sdata->uri);
+	g_free (sdata->mime_type);
 	g_free (sdata->password);
 	g_free (sdata);
 }
@@ -7537,6 +7550,7 @@ archive_extraction_ready_for_convertion_cb (GObject      *source_object,
 static void
 fr_window_archive_save_as (FrWindow   *window,
 			   const char *uri,
+			   const char *mime_type,
 			   const char *password,
 			   gboolean    encrypt_header,
 			   guint       volume_size)
@@ -7553,7 +7567,7 @@ fr_window_archive_save_as (FrWindow   *window,
 	/* create the new archive */
 
 	file = g_file_new_for_uri (uri);
-	window->priv->convert_data.new_archive = fr_archive_create (file);
+	window->priv->convert_data.new_archive = fr_archive_create (file, mime_type);
 	g_object_unref (file);
 
 	if (window->priv->convert_data.new_archive == NULL) {
@@ -7591,7 +7605,7 @@ fr_window_archive_save_as (FrWindow   *window,
 
 	fr_window_set_current_batch_action (window,
 					    FR_BATCH_ACTION_SAVE_AS,
-					    save_as_data_new (uri, password, encrypt_header, volume_size),
+					    save_as_data_new (uri, mime_type, password, encrypt_header, volume_size),
 					    (GFreeFunc) save_as_data_free);
 
 	g_signal_connect (G_OBJECT (window->priv->convert_data.new_archive),
@@ -7640,6 +7654,7 @@ save_as_archive_dialog_response_cb (GtkDialog *dialog,
 {
 	FrWindow   *window = user_data;
 	char       *uri;
+	const char *mime_type;
 	const char *password;
 	gboolean    encrypt_header;
 	int         volume_size;
@@ -7654,7 +7669,7 @@ save_as_archive_dialog_response_cb (GtkDialog *dialog,
 	if (response != GTK_RESPONSE_OK)
 		return;
 
-	uri = fr_new_archive_dialog_get_uri (FR_NEW_ARCHIVE_DIALOG (dialog));
+	uri = fr_new_archive_dialog_get_uri (FR_NEW_ARCHIVE_DIALOG (dialog), &mime_type);
 	if (uri == NULL)
 		return;
 
@@ -7666,7 +7681,7 @@ save_as_archive_dialog_response_cb (GtkDialog *dialog,
 	g_settings_set_int (settings, PREF_BATCH_ADD_VOLUME_SIZE, volume_size);
 	g_object_unref (settings);
 
-	fr_window_archive_save_as (window, uri, password, encrypt_header, volume_size);
+	fr_window_archive_save_as (window, uri, mime_type, password, encrypt_header, volume_size);
 
 	gtk_widget_destroy (GTK_WIDGET (dialog));
 	g_free (uri);
@@ -9132,7 +9147,7 @@ fr_window_exec_batch_action (FrWindow      *window,
 		if (! _g_uri_query_exists ((char*) action->data)) {
 			GError *error = NULL;
 
-			if (! fr_window_archive_new (window, (char*) action->data))
+			if (! fr_window_archive_new (window, (char*) action->data, NULL))
 				error = g_error_new_literal (FR_ERROR, FR_ERROR_GENERIC, _("Archive type not supported."));
 			_archive_operation_completed (window, FR_ACTION_CREATING_NEW_ARCHIVE, error);
 
@@ -9233,6 +9248,7 @@ fr_window_exec_batch_action (FrWindow      *window,
 		sdata = action->data;
 		fr_window_archive_save_as (window,
 					   sdata->uri,
+					   sdata->mime_type,
 					   sdata->password,
 					   sdata->encrypt_header,
 					   sdata->volume_size);
diff --git a/src/fr-window.h b/src/fr-window.h
index e94572d..b44fcaa 100644
--- a/src/fr-window.h
+++ b/src/fr-window.h
@@ -109,7 +109,8 @@ void            fr_window_close                        (FrWindow      *window);
 /* archive operations */
 
 gboolean        fr_window_archive_new                  (FrWindow      *window,
-						        const char    *uri);
+						        const char    *uri,
+						        const char    *mime_type);
 FrWindow *      fr_window_archive_open                 (FrWindow      *window,
 						        const char    *uri,
 						        GtkWindow     *parent);
@@ -233,6 +234,7 @@ void            fr_window_stop                         (FrWindow    *window);
 void            fr_window_action_new_archive           (FrWindow   *window);
 gboolean        fr_window_create_archive_and_continue  (FrWindow   *window,
 							const char *uri,
+							const char *mime_type,
 							GtkWindow  *error_dialog_parent);
 void            fr_window_action_save_as               (FrWindow   *window);
 void            fr_window_view_last_output             (FrWindow   *window,



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