/* XXX This hack is needed, as gtk_expander_set_label seems * not to work from egg_file_format_chooser_init */ static gboolean select_default_file_format (gpointer data) { EggFileFormatChooser *self = EGG_FILE_FORMAT_CHOOSER (data); egg_file_format_chooser_set_format (self, 0); self->priv->idle_hack = 0; return FALSE; }
static char * get_full_uri (DlgNewData *data) { char *full_uri = NULL; char *uri; const char *filename; int idx; uri = gtk_file_chooser_get_uri (GTK_FILE_CHOOSER (data->dialog)); if ((uri == NULL) || (*uri == 0)) return NULL; filename = file_name_from_path (uri); if ((filename == NULL) || (*filename == 0)) { g_free (uri); return NULL; } idx = egg_file_format_chooser_get_format (EGG_FILE_FORMAT_CHOOSER (data->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[data->supported_types[idx-1]].default_ext; if (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; return full_uri; }
static char * get_archive_filename_from_selector (DlgNewData *data) { char *uri = NULL; GFile *file, *dir; GFileInfo *info; GError *err = NULL; uri = get_full_uri (data); if ((uri == NULL) || (*uri == 0)) { GtkWidget *dialog; g_free (uri); dialog = _gtk_error_dialog_new (GTK_WINDOW (data->dialog), 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)); gtk_widget_destroy (GTK_WIDGET (dialog)); return NULL; } file = g_file_new_for_uri (uri); dir = g_file_get_parent (file); info = g_file_query_info (dir, G_FILE_ATTRIBUTE_ACCESS_CAN_READ "," G_FILE_ATTRIBUTE_ACCESS_CAN_WRITE "," G_FILE_ATTRIBUTE_ACCESS_CAN_EXECUTE, 0, NULL, &err); if (err != NULL) { g_warning ("Failed to get permission for extraction dir: %s", err->message); g_clear_error (&err); g_object_unref (info); g_object_unref (dir); g_object_unref (file); g_free (uri); return NULL; } if (! g_file_info_get_attribute_boolean (info, G_FILE_ATTRIBUTE_ACCESS_CAN_WRITE)) { GtkWidget *dialog; g_object_unref (info); g_object_unref (dir); g_object_unref (file); g_free (uri); dialog = _gtk_error_dialog_new (GTK_WINDOW (data->dialog), GTK_DIALOG_DESTROY_WITH_PARENT, NULL, _("Could not create the archive"), "%s", _("You don't have permission to create an archive in this folder")); gtk_dialog_run (GTK_DIALOG (dialog)); gtk_widget_destroy (GTK_WIDGET (dialog)); return NULL; } g_object_unref (info); g_object_unref (dir); /* 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 (data->format_chooser), uri); if (idx > 0) ext = mime_type_desc[data->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 (uri_exists (uri)) { GtkWidget *dialog; if (! is_supported_extension (data->dialog, uri, data->supported_types)) { dialog = _gtk_error_dialog_new (GTK_WINDOW (data->dialog), GTK_DIALOG_MODAL, 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; } g_file_delete (file, NULL, &err); if (err != NULL) { GtkWidget *dialog; dialog = _gtk_error_dialog_new (GTK_WINDOW (data->dialog), GTK_DIALOG_DESTROY_WITH_PARENT, NULL, _("Could not delete the old archive."), "%s", err->message); gtk_dialog_run (GTK_DIALOG (dialog)); gtk_widget_destroy (GTK_WIDGET (dialog)); g_error_free (err); g_free (uri); g_object_unref (file); return NULL; } } g_object_unref (file); return uri; }