Maconv/src/stuffit/methods.h

88 lines
2.1 KiB
C++

/*
All Stuffit compression methods.
Copyright (C) 2019, Guillaume Gonnet
This program is free software: you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free Software
Foundation, either version 3 of the License, or (at your option) any later
version.
This program is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE. See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License along with
this program. If not, see <https://www.gnu.org/licenses/>.
*/
#pragma once
#include "stuffit/stuffit.h"
#include <memory>
#include <string>
namespace maconv {
namespace stuffit {
// Exception when extracting a fork.
struct ExtractException : std::exception {
ExtractException(std::string what) : msg{what} {}
const char* what() const noexcept { return msg.c_str(); }
std::string msg;
};
// A compression method.
struct CompressionMethod {
virtual ~CompressionMethod() = default;
// Read the next bytes.
virtual int32_t ReadBytes(uint8_t *data, uint32_t length) { return -1; }
// Initialize the algorithm.
virtual void Initialize() {}
// Extract data from the compressed fork.
virtual void Extract(const StuffitCompInfo &info, uint8_t *data,
std::vector<fs::DataPtr> &mem_pool);
uint8_t *data; // Compressed data.
uint8_t *end; // End of compressed data.
uint8_t *uncompressed; // Pointer on t uncompressed data.
uint32_t total_size; // Length of uncompressed data.
};
// An unique pointer on a compression method.
using CompMethodPtr = std::unique_ptr<CompressionMethod>;
// Get a compression method (from a method number).
CompMethodPtr GetCompressionMethod(uint8_t method);
// "No compression" method.
struct NoneMethod : CompressionMethod {
// Extract data from the compressed fork.
void Extract(const StuffitCompInfo &info, uint8_t *data,
std::vector<fs::DataPtr> &mem_pool) override;
};
} // namespace stuffit
} // namespace maconv