blob: 05bf5b256383f16c1b2a54b54bdb1a8e6e418d16 [file] [log] [blame]
// Copyright 2018 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "base/files/file.h"
#include "base/files/file_path.h"
#include "base/files/platform_file.h"
#include "base/memory/scoped_refptr.h"
// Forward declare the unrar symbols needed for extraction, so users of
// RarReader don't need all the symbols from unrar.
class Archive;
class CmdExtract;
class CommandData;
namespace third_party_unrar {
// This class is used for extracting RAR files, one entry at a time.
class RarReader {
struct EntryInfo {
// The relative path of this entry, within the archive.
base::FilePath file_path;
// Whether the entry is a directory or a file.
bool is_directory;
// Whether the entry has encrypted contents.
bool is_encrypted;
// The actual size of the entry.
size_t file_size;
// Opens the RAR archive in |rar_file|, and uses |temp_file| for extracting
// each entry.
bool Open(base::File rar_file, base::File temp_file);
// Extracts the next entry in the RAR archive. Returns true on success and
// updates the information in |current_entry()|.
bool ExtractNextEntry();
// Returns the EntryInfo for the most recently extracted entry in the RAR
// archive.
const EntryInfo& current_entry() { return current_entry_; }
// The temporary file used for extracting each entry. This allows RAR
// extraction to safely occur within a sandbox.
base::File temp_file_;
// The RAR archive being extracted.
base::File rar_file_;
// Information for the current entry in the RAR archive.
EntryInfo current_entry_;
// Unrar data structures needed for extraction.
std::unique_ptr<Archive> archive_;
std::unique_ptr<CmdExtract> extractor_;
std::unique_ptr<CommandData> command_;
} // namespace third_party_unrar