You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
101 lines
3.1 KiB
101 lines
3.1 KiB
/* |
|
* Copyright (C) 2011-2018 Daniel Scharrer |
|
* |
|
* This software is provided 'as-is', without any express or implied |
|
* warranty. In no event will the author(s) be held liable for any damages |
|
* arising from the use of this software. |
|
* |
|
* Permission is granted to anyone to use this software for any purpose, |
|
* including commercial applications, and to alter it and redistribute it |
|
* freely, subject to the following restrictions: |
|
* |
|
* 1. The origin of this software must not be misrepresented; you must not |
|
* claim that you wrote the original software. If you use this software |
|
* in a product, an acknowledgment in the product documentation would be |
|
* appreciated but is not required. |
|
* 2. Altered source versions must be plainly marked as such, and must not be |
|
* misrepresented as being the original software. |
|
* 3. This notice may not be removed or altered from any source distribution. |
|
*/ |
|
|
|
/*! |
|
* \file |
|
* |
|
* Wrapper to read a single file from a chunk (\ref stream::chunk_reader). |
|
*/ |
|
#ifndef INNOEXTRACT_STREAM_FILE_HPP |
|
#define INNOEXTRACT_STREAM_FILE_HPP |
|
|
|
#include <istream> |
|
|
|
#include <boost/iostreams/chain.hpp> |
|
|
|
#include "crypto/checksum.hpp" |
|
#include "util/unique_ptr.hpp" |
|
|
|
namespace stream { |
|
|
|
enum compression_filter { |
|
NoFilter, |
|
InstructionFilter4108, |
|
InstructionFilter5200, |
|
InstructionFilter5309, |
|
ZlibFilter, |
|
}; |
|
|
|
/*! |
|
* Information specifying a single file inside a compressed chunk. |
|
* |
|
* This data is stored in \ref setup::data_entry "data entries". |
|
* |
|
* Files specified by this struct can be read using \ref file_reader. |
|
*/ |
|
struct file { |
|
|
|
boost::uint64_t offset; //!< Offset of this file within the decompressed chunk. |
|
boost::uint64_t size; //!< Pre-filter size of this file in the decompressed chunk. |
|
|
|
crypto::checksum checksum; //!< Checksum for the file. |
|
|
|
compression_filter filter; //!< Additional filter used before compression. |
|
|
|
bool operator<(const file & o) const; |
|
bool operator==(const file & o) const; |
|
|
|
}; |
|
|
|
/*! |
|
* Wrapper to read a single file from a \ref chunk_reader. |
|
* Restrics the stream to the file size and applies the appropriate filters. |
|
*/ |
|
class file_reader { |
|
|
|
typedef boost::iostreams::chain<boost::iostreams::input> base_type; |
|
|
|
public: |
|
|
|
typedef std::istream type; |
|
typedef util::unique_ptr<type>::type pointer; |
|
typedef file file_t; |
|
|
|
/*! |
|
* Wrap a \ref chunk_reader to read a single file. |
|
* |
|
* Only one wrapper can be used at the same time for each \c base. |
|
* |
|
* \param base The chunk reader containing the file. |
|
* It must already be positioned at the file's offset. |
|
* \param file Information specifying the file to read. |
|
* \param checksum Optional pointer to a checksum that is updated as the file is read. |
|
* The type of the checksum will be the same as that stored in the file |
|
* struct. |
|
* |
|
* \return a pointer to a non-seekable input stream for the requested file. |
|
*/ |
|
static pointer get(base_type & base, const file_t & file, crypto::checksum * checksum); |
|
|
|
}; |
|
|
|
} // namespace stream |
|
|
|
#endif // INNOEXTRACT_STREAM_FILE_HPP
|
|
|