static FrArchiveCap fr_command_7z_get_capabilities (FrArchive *archive, const char *mime_type, gboolean check_command) { FrArchiveCap capabilities; capabilities = FR_ARCHIVE_CAN_STORE_MANY_FILES; if (! _g_program_is_available ("7za", check_command) && ! _g_program_is_available ("7zr", check_command) && ! _g_program_is_available ("7z", check_command)) return capabilities; if (_g_mime_type_matches (mime_type, "application/x-7z-compressed")) { capabilities |= FR_ARCHIVE_CAN_READ_WRITE | FR_ARCHIVE_CAN_CREATE_VOLUMES; if (_g_program_is_available ("7z", check_command)) capabilities |= FR_ARCHIVE_CAN_ENCRYPT | FR_ARCHIVE_CAN_ENCRYPT_HEADER; } else if (_g_mime_type_matches (mime_type, "application/x-7z-compressed-tar")) { capabilities |= FR_ARCHIVE_CAN_READ_WRITE; if (_g_program_is_available ("7z", check_command)) capabilities |= FR_ARCHIVE_CAN_ENCRYPT | FR_ARCHIVE_CAN_ENCRYPT_HEADER; } else if (_g_program_is_available ("7z", check_command)) { if (_g_mime_type_matches (mime_type, "application/x-rar") || _g_mime_type_matches (mime_type, "application/x-cbr")) { /* give priority to rar and unrar that supports RAR files better. */ if (!_g_program_is_available ("rar", check_command) && !_g_program_is_available ("unrar", check_command) && (! check_command || g_file_test ("/usr/lib/p7zip/Codecs/Rar29.so", G_FILE_TEST_EXISTS))) capabilities |= FR_ARCHIVE_CAN_READ; } else capabilities |= FR_ARCHIVE_CAN_READ; if (_g_mime_type_matches (mime_type, "application/x-cbz") || _g_mime_type_matches (mime_type, "application/x-ms-dos-executable") || _g_mime_type_matches (mime_type, "application/zip")) { capabilities |= FR_ARCHIVE_CAN_WRITE | FR_ARCHIVE_CAN_ENCRYPT; } } else if (_g_program_is_available ("7za", check_command)) { if (_g_mime_type_matches (mime_type, "application/vnd.ms-cab-compressed") || _g_mime_type_matches (mime_type, "application/zip")) { capabilities |= FR_ARCHIVE_CAN_READ; } if (_g_mime_type_matches (mime_type, "application/zip")) capabilities |= FR_ARCHIVE_CAN_WRITE; } /* multi-volumes are read-only */ if ((archive->files->len > 0) && archive->multi_volume && (capabilities & FR_ARCHIVE_CAN_WRITE)) capabilities ^= FR_ARCHIVE_CAN_WRITE; return capabilities; }
static const char * fr_command_7z_get_packages (FrArchive *archive, const char *mime_type) { if (_g_mime_type_matches (mime_type, "application/x-rar")) return PACKAGES ("p7zip,p7zip-rar"); else if (_g_mime_type_matches (mime_type, "application/zip") || _g_mime_type_matches (mime_type, "application/vnd.ms-cab-compressed")) return PACKAGES ("p7zip,p7zip-full"); else return PACKAGES ("p7zip"); }
static void fr_command_7z_delete (FrCommand *command, const char *from_file, GList *file_list) { FrArchive *archive = FR_ARCHIVE (command); GList *scan; fr_command_7z_begin_command (command); fr_process_add_arg (command->process, "d"); fr_process_add_arg (command->process, "-bd"); fr_process_add_arg (command->process, "-y"); if (_g_mime_type_matches (FR_ARCHIVE (command)->mime_type, "application/x-ms-dos-executable")) fr_process_add_arg (command->process, "-sfx"); if (_g_mime_type_matches (archive->mime_type, "application/zip") || _g_mime_type_matches (archive->mime_type, "application/x-cbz")) { fr_process_add_arg (command->process, "-tzip"); } if (from_file != NULL) fr_process_add_arg_concat (command->process, "-i@", from_file, NULL); if (from_file == NULL) for (scan = file_list; scan; scan = scan->next) /* Files prefixed with '@' need to be handled specially */ if (g_str_has_prefix (scan->data, "@")) fr_process_add_arg_concat (command->process, "-i!", scan->data, NULL); add_password_arg (command, FR_ARCHIVE (command)->password, FALSE); fr_process_add_arg (command->process, "--"); fr_process_add_arg (command->process, command->filename); if (from_file == NULL) for (scan = file_list; scan; scan = scan->next) /* Skip files prefixed with '@', already added */ if (!g_str_has_prefix (scan->data, "@")) fr_process_add_arg (command->process, scan->data); fr_process_end_command (command->process); }
static void add_compress_arg (FrCommand *comm) { FrArchive *archive = FR_ARCHIVE (comm); if (_g_mime_type_matches (archive->mime_type, "application/x-compressed-tar")) fr_process_add_arg (comm->process, "-z"); else if (_g_mime_type_matches (archive->mime_type, "application/x-bzip-compressed-tar")) fr_process_add_arg (comm->process, "--use-compress-program=bzip2"); else if (_g_mime_type_matches (archive->mime_type, "application/x-tarz")) { if (_g_program_is_in_path ("gzip")) fr_process_add_arg (comm->process, "-z"); else fr_process_add_arg (comm->process, "-Z"); } else if (_g_mime_type_matches (archive->mime_type, "application/x-lrzip-compressed-tar")) fr_process_add_arg (comm->process, "--use-compress-program=lrzip"); else if (_g_mime_type_matches (archive->mime_type, "application/x-lzip-compressed-tar")) fr_process_add_arg (comm->process, "--use-compress-program=lzip"); else if (_g_mime_type_matches (archive->mime_type, "application/x-lzma-compressed-tar")) fr_process_add_arg (comm->process, "--use-compress-program=lzma"); else if (_g_mime_type_matches (archive->mime_type, "application/x-xz-compressed-tar")) fr_process_add_arg (comm->process, "--use-compress-program=xz"); else if (_g_mime_type_matches (archive->mime_type, "application/x-lzop-compressed-tar")) fr_process_add_arg (comm->process, "--use-compress-program=lzop"); else if (_g_mime_type_matches (archive->mime_type, "application/x-7z-compressed-tar")) { FrCommandTar *comm_tar = (FrCommandTar*) comm; char *option; option = g_strdup_printf ("--use-compress-program=%s", comm_tar->compress_command); fr_process_add_arg (comm->process, option); g_free (option); } }
static char * get_uncompressed_name (FrCommandTar *c_tar, const char *e_filename) { FrCommand *comm = FR_COMMAND (c_tar); FrArchive *archive = FR_ARCHIVE (comm); char *new_name = g_strdup (e_filename); int l = strlen (new_name); if (_g_mime_type_matches (archive->mime_type, "application/x-compressed-tar")) { /* X.tgz --> X.tar * X.tar.gz --> X.tar */ if (_g_filename_has_extension (e_filename, ".tgz")) { new_name[l - 2] = 'a'; new_name[l - 1] = 'r'; } else if (_g_filename_has_extension (e_filename, ".tar.gz")) new_name[l - 3] = 0; } else if (_g_mime_type_matches (archive->mime_type, "application/x-bzip-compressed-tar")) { /* X.tbz2 --> X.tar * X.tar.bz2 --> X.tar */ if (_g_filename_has_extension (e_filename, ".tbz2")) { new_name[l - 3] = 'a'; new_name[l - 2] = 'r'; new_name[l - 1] = 0; } else if (_g_filename_has_extension (e_filename, ".tar.bz2")) new_name[l - 4] = 0; } else if (_g_mime_type_matches (archive->mime_type, "application/x-tarz")) { /* X.taz --> X.tar * X.tar.Z --> X.tar */ if (_g_filename_has_extension (e_filename, ".taz")) new_name[l - 1] = 'r'; else if (_g_filename_has_extension (e_filename, ".tar.Z")) new_name[l - 2] = 0; } else if (_g_mime_type_matches (archive->mime_type, "application/x-lrzip-compressed-tar")) { /* X.tlrz --> X.tar * X.tar.lrz --> X.tar */ if (_g_filename_has_extension (e_filename, ".tlrz")) { new_name[l - 3] = 'a'; new_name[l - 2] = 'r'; new_name[l - 1] = 0; } else if (_g_filename_has_extension (e_filename, ".tar.lrz")) new_name[l - 4] = 0; } else if (_g_mime_type_matches (archive->mime_type, "application/x-lzip-compressed-tar")) { /* X.tlz --> X.tar * X.tar.lz --> X.tar */ if (_g_filename_has_extension (e_filename, ".tlz")) { new_name[l - 2] = 'a'; new_name[l - 1] = 'r'; } else if (_g_filename_has_extension (e_filename, ".tar.lz")) new_name[l - 3] = 0; } else if (_g_mime_type_matches (archive->mime_type, "application/x-lzma-compressed-tar")) { /* X.tar.lzma --> X.tar * (There doesn't seem to be a shorthand suffix) */ if (_g_filename_has_extension (e_filename, ".tar.lzma")) new_name[l - 5] = 0; } else if (_g_mime_type_matches (archive->mime_type, "application/x-xz-compressed-tar")) { /* X.tar.xz --> X.tar * (There doesn't seem to be a shorthand suffix) */ if (_g_filename_has_extension (e_filename, ".tar.xz")) new_name[l - 3] = 0; } else if (_g_mime_type_matches (archive->mime_type, "application/x-lzop-compressed-tar")) { /* X.tzo --> X.tar * X.tar.lzo --> X.tar */ if (_g_filename_has_extension (e_filename, ".tzo")) { new_name[l - 2] = 'a'; new_name[l - 1] = 'r'; } else if (_g_filename_has_extension (e_filename, ".tar.lzo")) new_name[l - 4] = 0; } else if (_g_mime_type_matches (archive->mime_type, "application/x-7z-compressed-tar")) { /* X.tar.7z --> X.tar */ if (_g_filename_has_extension (e_filename, ".tar.7z")) new_name[l - 3] = 0; } return new_name; }
static void fr_command_tar_recompress (FrCommand *comm) { FrCommandTar *c_tar = FR_COMMAND_TAR (comm); FrArchive *archive = FR_ARCHIVE (comm); char *new_name = NULL; if (can_create_a_compressed_archive (comm)) return; if (_g_mime_type_matches (archive->mime_type, "application/x-compressed-tar")) { fr_process_begin_command (comm->process, "gzip"); fr_process_set_begin_func (comm->process, begin_func__recompress, comm); fr_process_set_continue_func (comm->process, gzip_continue_func, comm); switch (archive->compression) { case FR_COMPRESSION_VERY_FAST: fr_process_add_arg (comm->process, "-1"); break; case FR_COMPRESSION_FAST: fr_process_add_arg (comm->process, "-3"); break; case FR_COMPRESSION_NORMAL: fr_process_add_arg (comm->process, "-6"); break; case FR_COMPRESSION_MAXIMUM: fr_process_add_arg (comm->process, "-9"); break; } fr_process_add_arg (comm->process, "-f"); fr_process_add_arg (comm->process, c_tar->uncomp_filename); fr_process_end_command (comm->process); new_name = g_strconcat (c_tar->uncomp_filename, ".gz", NULL); } else if (_g_mime_type_matches (archive->mime_type, "application/x-bzip-compressed-tar")) { fr_process_begin_command (comm->process, "bzip2"); fr_process_set_begin_func (comm->process, begin_func__recompress, comm); switch (archive->compression) { case FR_COMPRESSION_VERY_FAST: fr_process_add_arg (comm->process, "-1"); break; case FR_COMPRESSION_FAST: fr_process_add_arg (comm->process, "-3"); break; case FR_COMPRESSION_NORMAL: fr_process_add_arg (comm->process, "-6"); break; case FR_COMPRESSION_MAXIMUM: fr_process_add_arg (comm->process, "-9"); break; } fr_process_add_arg (comm->process, "-f"); fr_process_add_arg (comm->process, c_tar->uncomp_filename); fr_process_end_command (comm->process); new_name = g_strconcat (c_tar->uncomp_filename, ".bz2", NULL); } else if (_g_mime_type_matches (archive->mime_type, "application/x-tarz")) { fr_process_begin_command (comm->process, "compress"); fr_process_set_begin_func (comm->process, begin_func__recompress, comm); fr_process_add_arg (comm->process, "-f"); fr_process_add_arg (comm->process, c_tar->uncomp_filename); fr_process_end_command (comm->process); new_name = g_strconcat (c_tar->uncomp_filename, ".Z", NULL); } else if (_g_mime_type_matches (archive->mime_type, "application/x-lrzip-compressed-tar")) { fr_process_begin_command (comm->process, "lrzip"); fr_process_set_begin_func (comm->process, begin_func__recompress, comm); switch (archive->compression) { case FR_COMPRESSION_VERY_FAST: fr_process_add_arg (comm->process, "-l"); break; case FR_COMPRESSION_FAST: fr_process_add_arg (comm->process, "-g"); break; case FR_COMPRESSION_NORMAL: fr_process_add_arg (comm->process, "-b"); break; case FR_COMPRESSION_MAXIMUM: fr_process_add_arg (comm->process, "-z"); break; } fr_process_add_arg (comm->process, "-o"); fr_process_add_arg (comm->process, c_tar->uncomp_filename); fr_process_end_command (comm->process); new_name = g_strconcat (c_tar->uncomp_filename, ".lrz", NULL); } else if (_g_mime_type_matches (archive->mime_type, "application/x-lzip-compressed-tar")) { fr_process_begin_command (comm->process, "lzip"); fr_process_set_begin_func (comm->process, begin_func__recompress, comm); switch (archive->compression) { case FR_COMPRESSION_VERY_FAST: fr_process_add_arg (comm->process, "-1"); break; case FR_COMPRESSION_FAST: fr_process_add_arg (comm->process, "-3"); break; case FR_COMPRESSION_NORMAL: fr_process_add_arg (comm->process, "-6"); break; case FR_COMPRESSION_MAXIMUM: fr_process_add_arg (comm->process, "-9"); break; } fr_process_add_arg (comm->process, "-f"); fr_process_add_arg (comm->process, c_tar->uncomp_filename); fr_process_end_command (comm->process); new_name = g_strconcat (c_tar->uncomp_filename, ".lz", NULL); } else if (_g_mime_type_matches (archive->mime_type, "application/x-lzma-compressed-tar")) { fr_process_begin_command (comm->process, "lzma"); fr_process_set_begin_func (comm->process, begin_func__recompress, comm); switch (archive->compression) { case FR_COMPRESSION_VERY_FAST: fr_process_add_arg (comm->process, "-1"); break; case FR_COMPRESSION_FAST: fr_process_add_arg (comm->process, "-3"); break; case FR_COMPRESSION_NORMAL: fr_process_add_arg (comm->process, "-6"); break; case FR_COMPRESSION_MAXIMUM: fr_process_add_arg (comm->process, "-9"); break; } fr_process_add_arg (comm->process, "-f"); fr_process_add_arg (comm->process, c_tar->uncomp_filename); fr_process_end_command (comm->process); new_name = g_strconcat (c_tar->uncomp_filename, ".lzma", NULL); } else if (_g_mime_type_matches (archive->mime_type, "application/x-xz-compressed-tar")) { fr_process_begin_command (comm->process, "xz"); fr_process_set_begin_func (comm->process, begin_func__recompress, comm); switch (archive->compression) { case FR_COMPRESSION_VERY_FAST: fr_process_add_arg (comm->process, "-1"); break; case FR_COMPRESSION_FAST: fr_process_add_arg (comm->process, "-3"); break; case FR_COMPRESSION_NORMAL: fr_process_add_arg (comm->process, "-6"); break; case FR_COMPRESSION_MAXIMUM: fr_process_add_arg (comm->process, "-9"); break; } fr_process_add_arg (comm->process, "-f"); fr_process_add_arg (comm->process, c_tar->uncomp_filename); fr_process_end_command (comm->process); new_name = g_strconcat (c_tar->uncomp_filename, ".xz", NULL); } else if (_g_mime_type_matches (archive->mime_type, "application/x-lzop-compressed-tar")) { fr_process_begin_command (comm->process, "lzop"); fr_process_set_begin_func (comm->process, begin_func__recompress, comm); switch (archive->compression) { case FR_COMPRESSION_VERY_FAST: fr_process_add_arg (comm->process, "-1"); break; case FR_COMPRESSION_FAST: fr_process_add_arg (comm->process, "-3"); break; case FR_COMPRESSION_NORMAL: fr_process_add_arg (comm->process, "-6"); break; case FR_COMPRESSION_MAXIMUM: fr_process_add_arg (comm->process, "-9"); break; } fr_process_add_arg (comm->process, "-fU"); fr_process_add_arg (comm->process, "--no-stdin"); fr_process_add_arg (comm->process, c_tar->uncomp_filename); fr_process_end_command (comm->process); new_name = g_strconcat (c_tar->uncomp_filename, ".lzo", NULL); } else if (_g_mime_type_matches (archive->mime_type, "application/x-7z-compressed-tar")) { FrCommandTar *comm_tar = (FrCommandTar*) comm; fr_process_begin_command (comm->process, comm_tar->compress_command); fr_process_set_begin_func (comm->process, begin_func__recompress, comm); switch (archive->compression) { case FR_COMPRESSION_VERY_FAST: fr_process_add_arg (comm->process, "-mx=1"); break; case FR_COMPRESSION_FAST: fr_process_add_arg (comm->process, "-mx=5"); break; case FR_COMPRESSION_NORMAL: fr_process_add_arg (comm->process, "-mx=5"); break; case FR_COMPRESSION_MAXIMUM: fr_process_add_arg (comm->process, "-mx=7"); break; } fr_process_add_arg (comm->process, "a"); fr_process_add_arg (comm->process, "-bd"); fr_process_add_arg (comm->process, "-y"); fr_process_add_arg (comm->process, "-l"); new_name = g_strconcat (c_tar->uncomp_filename, ".7z", NULL); fr_process_add_arg_concat (comm->process, new_name, NULL); fr_process_add_arg (comm->process, c_tar->uncomp_filename); fr_process_end_command (comm->process); /* remove the uncompressed tar */ fr_process_begin_command (comm->process, "rm"); fr_process_add_arg (comm->process, "-f"); fr_process_add_arg (comm->process, c_tar->uncomp_filename); fr_process_end_command (comm->process); } if (c_tar->name_modified) { char *tmp_dir; /* Restore original name. */ fr_process_begin_command (comm->process, "mv"); fr_process_add_arg (comm->process, "-f"); fr_process_add_arg (comm->process, "--"); fr_process_add_arg (comm->process, new_name); fr_process_add_arg (comm->process, comm->filename); fr_process_end_command (comm->process); tmp_dir = _g_path_remove_level (new_name); fr_process_begin_command (comm->process, "rm"); fr_process_set_sticky (comm->process, TRUE); fr_process_add_arg (comm->process, "-fr"); fr_process_add_arg (comm->process, tmp_dir); fr_process_end_command (comm->process); g_free (tmp_dir); } g_free (new_name); g_free (c_tar->uncomp_filename); c_tar->uncomp_filename = NULL; }
static gboolean can_create_a_compressed_archive (FrCommand *comm) { return comm->creating_archive && ! _g_mime_type_matches (FR_ARCHIVE (comm)->mime_type, "application/x-7z-compressed-tar"); }
static void fr_command_7z_add (FrCommand *command, const char *from_file, GList *file_list, const char *base_dir, gboolean update, gboolean follow_links) { FrArchive *archive = FR_ARCHIVE (command); GList *scan; fr_process_use_standard_locale (command->process, TRUE); fr_process_set_out_line_func (command->process, process_line__add, command); fr_command_7z_begin_command (command); if (update) fr_process_add_arg (command->process, "u"); else fr_process_add_arg (command->process, "a"); if (base_dir != NULL) fr_process_set_working_dir (command->process, base_dir); if (_g_mime_type_matches (archive->mime_type, "application/zip") || _g_mime_type_matches (archive->mime_type, "application/x-cbz")) { fr_process_add_arg (command->process, "-tzip"); fr_process_add_arg (command->process, "-mem=AES128"); } fr_process_add_arg (command->process, "-bd"); fr_process_add_arg (command->process, "-y"); if (follow_links) fr_process_add_arg (command->process, "-l"); add_password_arg (command, archive->password, FALSE); if ((archive->password != NULL) && (*archive->password != 0) && archive->encrypt_header && fr_archive_is_capable_of (archive, FR_ARCHIVE_CAN_ENCRYPT_HEADER)) { fr_process_add_arg (command->process, "-mhe=on"); } /* fr_process_add_arg (command->process, "-ms=off"); FIXME: solid mode off? */ switch (archive->compression) { case FR_COMPRESSION_VERY_FAST: fr_process_add_arg (command->process, "-mx=1"); break; case FR_COMPRESSION_FAST: fr_process_add_arg (command->process, "-mx=5"); break; case FR_COMPRESSION_NORMAL: fr_process_add_arg (command->process, "-mx=7"); break; case FR_COMPRESSION_MAXIMUM: fr_process_add_arg (command->process, "-mx=9"); if (! _g_mime_type_matches (archive->mime_type, "application/zip") && ! _g_mime_type_matches (archive->mime_type, "application/x-cbz")) { fr_process_add_arg (command->process, "-m0=lzma2");; } break; } if (_g_mime_type_matches (archive->mime_type, "application/x-ms-dos-executable")) fr_process_add_arg (command->process, "-sfx"); if (archive->volume_size > 0) fr_process_add_arg_printf (command->process, "-v%ub", archive->volume_size); if (from_file != NULL) fr_process_add_arg_concat (command->process, "-i@", from_file, NULL); if (from_file == NULL) for (scan = file_list; scan; scan = scan->next) /* Files prefixed with '@' need to be handled specially */ if (g_str_has_prefix (scan->data, "@")) fr_process_add_arg_concat (command->process, "-i!", scan->data, NULL); fr_process_add_arg (command->process, "--"); fr_process_add_arg (command->process, command->filename); if (from_file == NULL) for (scan = file_list; scan; scan = scan->next) /* Skip files prefixed with '@', already added */ if (!g_str_has_prefix (scan->data, "@")) fr_process_add_arg (command->process, scan->data); fr_process_end_command (command->process); }