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 list__process_line (char *line, gpointer data) { FileData *fdata; FrCommand *comm = FR_COMMAND (data); g_return_if_fail (line != NULL); if (strlen (line) == 0) return; if (! g_str_has_prefix (line, "Decompressed file size:")) return; fdata = file_data_new (); fdata->size = g_ascii_strtoull (_g_str_get_last_field (line, 4), NULL, 10); struct stat st; if (stat (comm->filename, &st) == 0) fdata->modified = st.st_mtim.tv_sec; else time(&(fdata->modified)); fdata->encrypted = FALSE; char *new_fname = g_strdup (_g_path_get_basename (comm->filename)); if (g_str_has_suffix (new_fname, ".lrz")) new_fname[strlen (new_fname) - 4] = '\0'; if (*new_fname == '/') { fdata->full_path = g_strdup (new_fname); fdata->original_path = fdata->full_path; } else { fdata->full_path = g_strconcat ("/", new_fname, NULL); fdata->original_path = fdata->full_path + 1; } fdata->path = _g_path_remove_level (fdata->full_path); fdata->name = new_fname; fdata->dir = FALSE; fdata->link = NULL; if (fdata->name == 0) file_data_free (fdata); else fr_archive_add_file (FR_ARCHIVE (comm), fdata); }
static void process_line (char *line, gpointer data) { FileData *fdata; FrCommandAce *ace_comm = FR_COMMAND_ACE (data); FrCommand *comm = FR_COMMAND (data); char **fields; const char *field_name; g_return_if_fail (line != NULL); if (ace_comm->command_type == FR_ACE_COMMAND_UNKNOWN) { if (g_str_has_prefix (line, "UNACE")) { if (strstr (line, "public version") != NULL) ace_comm->command_type = FR_ACE_COMMAND_PUBLIC; else ace_comm->command_type = FR_ACE_COMMAND_NONFREE; } return; } if (! ace_comm->list_started) { if (ace_comm->command_type == FR_ACE_COMMAND_PUBLIC) { if (g_str_has_prefix (line, "Date")) ace_comm->list_started = TRUE; } else if (ace_comm->command_type == FR_ACE_COMMAND_NONFREE) { if (g_str_has_prefix (line, " Date")) ace_comm->list_started = TRUE; } return; } fdata = file_data_new (); if (ace_comm->command_type == FR_ACE_COMMAND_PUBLIC) fields = g_strsplit (line, "|", 6); else if (ace_comm->command_type == FR_ACE_COMMAND_NONFREE) fields = _g_str_split_line (line, 5); else fields = NULL; if ((fields == NULL) || (fields[0] == NULL) || (g_strv_length (fields) < 5)) return; fdata->size = g_ascii_strtoull (fields[3], NULL, 10); fdata->modified = mktime_from_string (fields[0], fields[1]); if (ace_comm->command_type == FR_ACE_COMMAND_PUBLIC) { field_name = fields[5]; field_name = field_name + 1; } else if (ace_comm->command_type == FR_ACE_COMMAND_NONFREE) field_name = _g_str_get_last_field (line, 6); else g_assert_not_reached (); if (field_name[0] != '/') { fdata->full_path = g_strconcat ("/", field_name, NULL); fdata->original_path = fdata->full_path + 1; } else { fdata->full_path = g_strdup (field_name); fdata->original_path = fdata->full_path; } g_strfreev (fields); fdata->name = g_strdup (_g_path_get_basename (fdata->full_path)); fdata->path = _g_path_remove_level (fdata->full_path); if (*fdata->name == 0) file_data_free (fdata); else fr_archive_add_file (FR_ARCHIVE (comm), fdata); }
static void process_line (char *line, gpointer data) { FileData *fdata; FrCommand *comm = FR_COMMAND (data); char **fields; int date_idx; char *field_date, *field_time, *field_size, *field_name; char *name; g_return_if_fail (line != NULL); date_idx = _g_line_get_index_from_pattern (line, "%n%n%n%n-%n%n-%n%n %n%n:%n%n"); if (date_idx < 0) return; fdata = file_data_new (); field_size = _g_line_get_prev_field (line, date_idx, 1); fdata->size = g_ascii_strtoull (field_size, NULL, 10); g_free (field_size); field_date = _g_line_get_next_field (line, date_idx, 1); field_time = _g_line_get_next_field (line, date_idx, 2); fdata->modified = mktime_from_string (field_date, field_time); g_free (field_date); g_free (field_time); /* Full path */ field_name = tar_get_last_field (line, date_idx, 3); fields = g_strsplit (field_name, " -> ", 2); if (fields[1] == NULL) { g_strfreev (fields); fields = g_strsplit (field_name, " link to ", 2); } name = g_strcompress (fields[0]); if (*name == '/') { fdata->full_path = g_strdup (name); fdata->original_path = fdata->full_path; } else { fdata->full_path = g_strconcat ("/", name, NULL); fdata->original_path = fdata->full_path + 1; } g_free (name); name = g_filename_from_utf8 (fdata->original_path, -1, NULL, NULL, NULL); if (name) fdata->original_path = name; if (fields[1] != NULL) fdata->link = g_strdup (fields[1]); g_strfreev (fields); g_free (field_name); fdata->dir = line[0] == 'd'; 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); if (*fdata->name == 0) file_data_free (fdata); else fr_archive_add_file (FR_ARCHIVE (comm), fdata); }
static void list__process_line (char *line, gpointer data) { FileData *fdata; FrCommand *comm = FR_COMMAND (data); char **fields; const char *name_field; char *name; int ofs = 0; g_return_if_fail (line != NULL); fdata = file_data_new (); #ifdef __sun fields = _g_str_split_line (line, 9); fdata->size = g_ascii_strtoull (fields[4], NULL, 10); fdata->modified = mktime_from_string (fields[5], fields[6], fields[8]); g_strfreev (fields); name_field = _g_str_get_last_field (line, 10); #else /* !__sun */ /* Handle char and block device files */ if ((line[0] == 'c') || (line[0] == 'b')) { fields = _g_str_split_line (line, 9); ofs = 1; fdata->size = 0; /* FIXME: We should also specify the content type */ } else { fields = _g_str_split_line (line, 8); fdata->size = g_ascii_strtoull (fields[4], NULL, 10); } fdata->modified = mktime_from_string (fields[5+ofs], fields[6+ofs], fields[7+ofs]); g_strfreev (fields); name_field = _g_str_get_last_field (line, 9+ofs); #endif /* !__sun */ fields = g_strsplit (name_field, " -> ", 2); if (fields[1] == NULL) { g_strfreev (fields); fields = g_strsplit (name_field, " link to ", 2); } fdata->dir = line[0] == 'd'; name = g_strcompress (fields[0]); if (*(fields[0]) == '/') { fdata->full_path = g_strdup (name); fdata->original_path = fdata->full_path; } else { fdata->full_path = g_strconcat ("/", name, NULL); fdata->original_path = fdata->full_path + 1; } if (fdata->dir && (name[strlen (name) - 1] != '/')) { char *old_full_path = fdata->full_path; fdata->full_path = g_strconcat (old_full_path, "/", NULL); g_free (old_full_path); fdata->original_path = g_strdup (name); fdata->free_original_path = TRUE; } g_free (name); if (fields[1] != NULL) fdata->link = g_strcompress (fields[1]); g_strfreev (fields); 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); if (*fdata->name == 0) file_data_free (fdata); else fr_archive_add_file (FR_ARCHIVE (comm), fdata); }
static void list__process_line (char *line, gpointer data) { FrCommand7z *self = FR_COMMAND_7Z (data); FrArchive *archive = FR_ARCHIVE (data); char **fields; FileData *fdata; g_return_if_fail (line != NULL); if (! self->list_started) { if (strncmp (line, "p7zip Version ", 14) == 0) { const char *ver_start; int ver_len; char version[256]; ver_start = _g_str_eat_spaces (line + 14); ver_len = strchr (ver_start, ' ') - ver_start; strncpy (version, ver_start, ver_len); version[ver_len] = 0; if (strcmp (version, "4.55") < 0) self->old_style = TRUE; else self->old_style = FALSE; } else if (self->old_style && (strncmp (line, "Listing archive: ", 17) == 0)) self->list_started = TRUE; else if (! self->old_style && (strcmp (line, "----------") == 0)) self->list_started = TRUE; else if (strncmp (line, "Multivolume = ", 14) == 0) { fields = g_strsplit (line, " = ", 2); archive->multi_volume = (strcmp (fields[1], "+") == 0); g_strfreev (fields); } return; } if (strcmp (line, "") == 0) { if (self->fdata != NULL) { if (self->fdata->original_path == NULL) { file_data_free (self->fdata); self->fdata = NULL; } else { fdata = self->fdata; 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 (archive, fdata); self->fdata = NULL; } } return; } if (self->fdata == NULL) self->fdata = file_data_new (); fields = g_strsplit (line, " = ", 2); if (g_strv_length (fields) < 2) { g_strfreev (fields); return; } fdata = self->fdata; if (strcmp (fields[0], "Path") == 0) { fdata->free_original_path = TRUE; fdata->original_path = g_strdup (fields[1]); fdata->full_path = g_strconcat ((fdata->original_path[0] != '/') ? "/" : "", fdata->original_path, (fdata->dir && (fdata->original_path[strlen (fdata->original_path) - 1] != '/')) ? "/" : "", NULL); } else if (strcmp (fields[0], "Folder") == 0) { fdata->dir = (strcmp (fields[1], "+") == 0); } else if (strcmp (fields[0], "Size") == 0) { fdata->size = g_ascii_strtoull (fields[1], NULL, 10); } else if (strcmp (fields[0], "Modified") == 0) { char **modified_fields; modified_fields = g_strsplit (fields[1], " ", 2); if (modified_fields[0] != NULL) fdata->modified = mktime_from_string (modified_fields[0], modified_fields[1]); g_strfreev (modified_fields); } else if (strcmp (fields[0], "Encrypted") == 0) { if (strcmp (fields[1], "+") == 0) fdata->encrypted = TRUE; } else if (strcmp (fields[0], "Method") == 0) { if (strstr (fields[1], "AES") != NULL) fdata->encrypted = TRUE; } else if (strcmp (fields[0], "Attributes") == 0) { if (fields[1][0] == 'D') fdata->dir = TRUE; } g_strfreev (fields); }