[file-roller: 101/123] removed the custom format chooser, allow to save an archive with a non-standard mime type
- From: Paolo Bacchilega <paobac src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [file-roller: 101/123] removed the custom format chooser, allow to save an archive with a non-standard mime type
- Date: Mon, 6 Aug 2012 13:49:21 +0000 (UTC)
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]