libzipper 1.0.1
libzipper C++ (de)compression library

Introduction

libzipper offers a flexible C++ interface for reading compressed files in multiple formats.

Homepage

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.

Supported Formats

Reading a compressed file into memory

#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;
}

Writing compressed files.

#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));
}