static void process_line (char *line, gpointer data) { FrCommandUnarchiver *unar_comm = FR_COMMAND_UNARCHIVER (data); g_memory_input_stream_add_data (G_MEMORY_INPUT_STREAM (unar_comm->stream), line, -1, NULL); }
static void list_command_completed (gpointer data) { FrCommandUnarchiver *unar_comm = FR_COMMAND_UNARCHIVER (data); JsonParser *parser; GError *error = NULL; parser = json_parser_new (); if (json_parser_load_from_stream (parser, unar_comm->stream, NULL, &error)) { JsonObject *root; root = json_node_get_object (json_parser_get_root (parser)); if (json_object_get_int_member (root, "lsarFormatVersion") == LSAR_SUPPORTED_FORMAT) { JsonArray *content; int i; content = json_object_get_array_member (root, "lsarContents"); for (i = 0; i < json_array_get_length (content); i++) { JsonObject *entry; FileData *fdata; const char *filename; entry = json_array_get_object_element (content, i); fdata = file_data_new (); fdata->size = json_object_get_int_member (entry, "XADFileSize"); fdata->modified = mktime_from_string (json_object_get_string_member (entry, "XADLastModificationDate")); if (json_object_has_member (entry, "XADIsEncrypted")) fdata->encrypted = json_object_get_int_member (entry, "XADIsEncrypted") == 1; filename = json_object_get_string_member (entry, "XADFileName"); if (*filename == '/') { fdata->full_path = g_strdup (filename); fdata->original_path = fdata->full_path; } else { fdata->full_path = g_strconcat ("/", filename, NULL); fdata->original_path = fdata->full_path + 1; } fdata->link = NULL; if (json_object_has_member (entry, "XADIsDirectory")) fdata->dir = json_object_get_int_member (entry, "XADIsDirectory") == 1; if (fdata->dir) fdata->name = _g_path_get_dir_name (fdata->full_path); else fdata->name = g_strdup (_g_path_get_basename (fdata->full_path)); fdata->path = _g_path_remove_level (fdata->full_path); fr_archive_add_file (FR_ARCHIVE (unar_comm), fdata); } } } g_object_unref (parser); }
static void fr_command_unarchiver_finalize (GObject *object) { FrCommandUnarchiver *self; g_return_if_fail (object != NULL); g_return_if_fail (FR_IS_COMMAND_UNARCHIVER (object)); self = FR_COMMAND_UNARCHIVER (object); _g_object_unref (self->stream); if (G_OBJECT_CLASS (fr_command_unarchiver_parent_class)->finalize) G_OBJECT_CLASS (fr_command_unarchiver_parent_class)->finalize (object); }
static void fr_command_unarchiver_extract (FrCommand *comm, const char *from_file, GList *file_list, const char *dest_dir, gboolean overwrite, gboolean skip_older, gboolean junk_paths) { FrCommandUnarchiver *unar_comm = FR_COMMAND_UNARCHIVER (comm); GList *scan; unar_comm->n_line = 0; fr_process_use_standard_locale (comm->process, TRUE); fr_process_set_out_line_func (comm->process, process_line__extract, comm); fr_process_begin_command (comm->process, "unar"); if (overwrite) fr_process_add_arg (comm->process, "-f"); else fr_process_add_arg (comm->process, "-s"); fr_process_add_arg (comm->process, "-D"); if ((comm->password != NULL) && (comm->password[0] != '\0')) fr_process_add_arg_concat (comm->process, "-password="******"-output-directory=", dest_dir, NULL); fr_process_add_arg (comm->process, comm->filename); for (scan = file_list; scan; scan = scan->next) { char *escaped; escaped = escape_str (scan->data, "["); fr_process_add_arg (comm->process, escaped); g_free (escaped); } fr_process_end_command (comm->process); }
static gboolean fr_command_unarchiver_list (FrCommand *comm) { FrCommandUnarchiver *unar_comm = FR_COMMAND_UNARCHIVER (comm); _g_object_unref (unar_comm->stream); unar_comm->stream = g_memory_input_stream_new (); fr_process_set_out_line_func (comm->process, process_line, comm); fr_process_begin_command (comm->process, "lsar"); fr_process_set_end_func (comm->process, list_command_completed, comm); fr_process_add_arg (comm->process, "-j"); if ((FR_ARCHIVE (comm)->password != NULL) && (FR_ARCHIVE (comm)->password[0] != '\0')) fr_process_add_arg_concat (comm->process, "-password=", FR_ARCHIVE (comm)->password, NULL); fr_process_add_arg (comm->process, comm->filename); fr_process_end_command (comm->process); return TRUE; }
static void process_line__extract (char *line, gpointer data) { FrCommand *comm = FR_COMMAND (data); FrArchive *archive = FR_ARCHIVE (comm); FrCommandUnarchiver *unar_comm = FR_COMMAND_UNARCHIVER (comm); if (line == NULL) return; unar_comm->n_line++; /* the first line is the name of the archive */ if (unar_comm->n_line == 1) return; if (fr_archive_progress_get_total_files (archive) > 1) fr_archive_progress (archive, fr_archive_progress_inc_completed_files (archive, 1)); else fr_archive_message (archive, line); }
static void process_line__extract (char *line, gpointer data) { FrCommand *comm = FR_COMMAND (data); FrCommandUnarchiver *unar_comm = FR_COMMAND_UNARCHIVER (comm); if (line == NULL) return; unar_comm->n_line++; /* the first line is the name of the archive */ if (unar_comm->n_line == 1) return; if (comm->n_files > 1) { double fraction = (double) ++comm->n_file / (comm->n_files + 1); fr_command_progress (comm, CLAMP (fraction, 0.0, 1.0)); } else fr_command_message (comm, line); }