static void migrate_options_directory (void) { char *old_directory_path; GFile *old_directory; GFile *new_directory; old_directory_path = get_home_relative_path (".gnome2/file-roller/options"); old_directory = g_file_new_for_path (old_directory_path); new_directory = _g_file_new_user_config_subdir (ADD_FOLDER_OPTIONS_DIR, FALSE); if (g_file_query_exists (old_directory, NULL) && ! g_file_query_exists (new_directory, NULL)) { GFile *parent; parent = g_file_get_parent (new_directory); if (_g_file_make_directory_tree (parent, 0700, NULL)) g_file_move (old_directory, new_directory, 0, NULL, NULL, NULL, NULL); g_object_unref (parent); } g_object_unref (new_directory); g_object_unref (old_directory); g_free (old_directory_path); }
static int extract_cb (GtkWidget *w, DialogData *data) { FrWindow *window = data->window; gboolean do_not_extract = FALSE; GFile *destination; gboolean skip_newer; gboolean selected_files; gboolean pattern_files; gboolean junk_paths; GList *file_list; char *base_dir = NULL; GError *error = NULL; data->extract_clicked = TRUE; /* collect extraction options. */ destination = gtk_file_chooser_get_file (GTK_FILE_CHOOSER (data->dialog)); /* check directory existence. */ if (! _g_file_query_is_dir (destination)) { if (! ForceDirectoryCreation) { GtkWidget *d; int r; char *folder_name; char *msg; folder_name = _g_file_get_display_basename (destination); msg = g_strdup_printf (_("Destination folder \"%s\" does not exist.\n\nDo you want to create it?"), folder_name); g_free (folder_name); d = _gtk_message_dialog_new (GTK_WINDOW (data->dialog), GTK_DIALOG_MODAL, msg, NULL, _GTK_LABEL_CANCEL, GTK_RESPONSE_CANCEL, _("Create _Folder"), GTK_RESPONSE_YES, NULL); gtk_dialog_set_default_response (GTK_DIALOG (d), GTK_RESPONSE_YES); r = gtk_dialog_run (GTK_DIALOG (d)); gtk_widget_destroy (GTK_WIDGET (d)); g_free (msg); if (r != GTK_RESPONSE_YES) do_not_extract = TRUE; } if (! do_not_extract && ! _g_file_make_directory_tree (destination, 0755, &error)) { GtkWidget *d; d = _gtk_error_dialog_new (GTK_WINDOW (window), GTK_DIALOG_DESTROY_WITH_PARENT, NULL, _("Extraction not performed"), _("Could not create the destination folder: %s."), error->message); gtk_dialog_run (GTK_DIALOG (d)); gtk_widget_destroy (GTK_WIDGET (d)); g_error_free (error); return FALSE; } } if (do_not_extract) { GtkWidget *d; d = _gtk_message_dialog_new (GTK_WINDOW (window), GTK_DIALOG_DESTROY_WITH_PARENT, _("Extraction not performed"), NULL, _GTK_LABEL_CLOSE, GTK_RESPONSE_OK, NULL); gtk_dialog_set_default_response (GTK_DIALOG (d), GTK_RESPONSE_OK); gtk_dialog_run (GTK_DIALOG (d)); gtk_widget_destroy (GTK_WIDGET (d)); if (fr_window_is_batch_mode (data->window)) gtk_widget_destroy (data->dialog); return FALSE; } /* check extraction directory permissions. */ if (_g_file_query_is_dir (destination) && ! _g_file_check_permissions (destination, R_OK | W_OK)) { GtkWidget *d; char *utf8_path; utf8_path = _g_file_get_display_basename (destination); d = _gtk_error_dialog_new (GTK_WINDOW (window), GTK_DIALOG_DESTROY_WITH_PARENT, NULL, _("Extraction not performed"), _("You don't have the right permissions to extract archives in the folder \"%s\""), utf8_path); gtk_dialog_run (GTK_DIALOG (d)); gtk_widget_destroy (GTK_WIDGET (d)); g_free (utf8_path); g_object_unref (destination); return FALSE; } fr_window_set_extract_default_dir (window, destination); skip_newer = ! gtk_toggle_button_get_inconsistent (GTK_TOGGLE_BUTTON (GET_WIDGET ("keep_newer_checkbutton"))) && gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (GET_WIDGET ("keep_newer_checkbutton"))); junk_paths = ! gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (GET_WIDGET ("keep_structure_checkbutton"))); if (! gtk_toggle_button_get_inconsistent (GTK_TOGGLE_BUTTON (GET_WIDGET ("keep_newer_checkbutton")))) g_settings_set_boolean (data->settings, PREF_EXTRACT_SKIP_NEWER, skip_newer); g_settings_set_boolean (data->settings, PREF_EXTRACT_RECREATE_FOLDERS, ! junk_paths); selected_files = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (GET_WIDGET ("selected_files_radiobutton"))); pattern_files = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (GET_WIDGET ("file_pattern_radiobutton"))); /* create the file list. */ file_list = NULL; if (selected_files) { file_list = data->selected_files; data->selected_files = NULL; /* do not the list when destroying the dialog. */ } else if (pattern_files) { const char *pattern; pattern = gtk_entry_get_text (GTK_ENTRY (GET_WIDGET ("file_pattern_entry"))); file_list = fr_window_get_file_list_pattern (window, pattern); if (file_list == NULL) { gtk_widget_destroy (data->dialog); g_object_unref (destination); return FALSE; } } if (selected_files) { base_dir = data->base_dir_for_selection; data->base_dir_for_selection = NULL; } else base_dir = NULL; /* close the dialog. */ gtk_widget_destroy (data->dialog); /* extract ! */ fr_window_extract_archive_and_continue (window, file_list, destination, base_dir, skip_newer, FR_OVERWRITE_ASK, junk_paths); _g_string_list_free (file_list); g_object_unref (destination); g_free (base_dir); return TRUE; }
static void fr_command_jar_add (FrCommand *comm, const char *from_file, GList *file_list, const char *base_dir, gboolean update, gboolean follow_links) { FrProcess *proc = comm->process; GList *zip_list = NULL, *jardata_list = NULL, *jar_list = NULL; GList *scan; char *tmp_dir; for (scan = file_list; scan; scan = scan->next) { char *filename = scan->data; char *path = g_build_filename (base_dir, filename, NULL); char *package = NULL; if (_g_filename_has_extension (filename, ".java")) package = get_package_name_from_java_file (path); else if (_g_filename_has_extension (filename, ".class")) package = get_package_name_from_class_file (path); if ((package == NULL) || (strlen (package) == 0)) zip_list = g_list_append (zip_list, g_strdup (filename)); else { JarData *newdata = g_new0 (JarData, 1); newdata->package_minus_one_level = _g_path_remove_level (package); newdata->link_name = g_strdup (_g_path_get_basename (package)); newdata->rel_path = _g_path_remove_level (filename); newdata->filename = g_strdup (_g_path_get_basename (filename)); jardata_list = g_list_append (jardata_list, newdata); } g_free (package); g_free (path); } tmp_dir = _g_path_get_temp_work_dir (NULL); for (scan = jardata_list; scan ; scan = scan->next) { JarData *jdata = scan->data; char *pack_path; GFile *directory; char *old_link; char *link_name; int retval; pack_path = g_build_filename (tmp_dir, jdata->package_minus_one_level, NULL); directory = g_file_new_for_path (pack_path); if (! _g_file_make_directory_tree (directory, 0755, NULL)) { g_object_unref (directory); g_free (pack_path); continue; } old_link = g_build_filename (base_dir, jdata->rel_path, NULL); link_name = g_build_filename (pack_path, jdata->link_name, NULL); retval = symlink (old_link, link_name); if ((retval != -1) || (errno == EEXIST)) jar_list = g_list_append (jar_list, g_build_filename (jdata->package_minus_one_level, jdata->link_name, jdata->filename, NULL)); g_free (link_name); g_free (old_link); g_object_unref (directory); g_free (pack_path); } if (zip_list != NULL) FR_COMMAND_CLASS (fr_command_jar_parent_class)->add (comm, NULL, zip_list, base_dir, update, follow_links); if (jar_list != NULL) FR_COMMAND_CLASS (fr_command_jar_parent_class)->add (comm, NULL, jar_list, tmp_dir, update, follow_links); fr_process_begin_command (proc, "rm"); fr_process_set_working_dir (proc, "/"); fr_process_add_arg (proc, "-r"); fr_process_add_arg (proc, "-f"); fr_process_add_arg (proc, tmp_dir); fr_process_end_command (proc); fr_process_set_sticky (proc, TRUE); for (scan = jardata_list; scan ; scan = scan->next) { JarData *jdata = scan->data; g_free (jdata->filename); g_free (jdata->package_minus_one_level); g_free (jdata->link_name); g_free (jdata->rel_path); } _g_string_list_free (jardata_list); _g_string_list_free (jar_list); _g_string_list_free (zip_list); g_free (tmp_dir); }