blob: 64cc4f4e0be07aad9d2419176b3f8b38246983ad [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.
#ifndef THIRD_PARTY_UNRAR_SRC_UNRAR_WRAPPER_H_
#define THIRD_PARTY_UNRAR_SRC_UNRAR_WRAPPER_H_
#include "base/files/file.h"
#include "base/files/file_path.h"
#include "base/files/platform_file.h"
#include "base/memory/scoped_refptr.h"
// TODO(drubery): Remove this once http://crbug/909778 is fully rolled out.
#include "third_party/unrar/src/rar.hpp"
namespace third_party_unrar {
// TODO(drubery): Remove this once http://crbug/909778 is fully rolled out.
static const int kUnrarEndarcHead = HEAD_ENDARC;
// 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;
// This class is used for extracting RAR files, one entry at a time.
class RarReader {
public:
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;
};
RarReader();
~RarReader();
// 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_; }
private:
// 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
#endif // THIRD_PARTY_UNRAR_SRC_UNRAR_WRAPPER_H_