libzipper 1.0.1
|
libzipper offers a flexible C++ interface for reading compressed files in multiple formats.
libzipper aims to provide applications a transparent method of accessing compressed data. eg. libzipper is suited to reading XML config files that are compressed to save space.
libzipper is not a general-purpose archive management library, as it does not provide access to the filesystem attributes of each file. (ie. libzipper does not support the concepts of file owner, group or permissions.
#include <zipper.hh> #include <algorithm> #include <vector> class MemWriter : public zipper::Writer { public: std::vector<uint8_t> data; virtual void writeData( zsize_t offset, zsize_t bytes, const uint8_t* inData) { data.resize(std::max(offset + bytes, data.size())); std::copy(inData, inData + bytes, &data[offset]); } virtual zsize_t getSize() const { return data.size(); } }; std::vector<uint8_t> readSavedGame(const std::string& filename) { // open the compressed input file. FileReader will throw an // exception if an IO error occurs. zipper::FileReader reader(filename); MemWriter writer; zipper::Decompressor decomp(reader); std::vector<zipper::CompressedFilePtr> entries(decomp.getEntries()); if (!entries.empty()) { // Uncompress the first file. Will pass-though data as-is if the // file is not compressed. entries.front()->decompress(writer); } return writer.data; }
#include <zipper.hh> #include <algorithm> #include <vector> class MemReader : public zipper::Reader { public: MemReader(const vector<uint8_t>& data) : m_data(data) {} virtual const std::string& getSourceName() const { static std::string Name("savedGame.dat"); return Name; } virtual const timeval& getModTime() const { return zipper::s_now; } virtual zsize_t getSize() const { return m_data.size(); } virtual void readData(zsize_t offset, zsize_t bytes, uint8_t* dest) const { std::copy(&m_data[offset], &m_data[offset + bytes], dest); } private: std::vector<uint8_t> m_data; }; void writeSavedGame( const std::string& filename, const std::vector<uint8_t>& gameData) { zipper::FileWriter writer(filename); zipper::Compressor comp(zipper::Container_zip, writer); comp.addFile(MemReader(gameData)); }