#ifndef __DICT_ZIP_LIB_H__
#define __DICT_ZIP_LIB_H__

#include <ctime>
#include <string>
#include <zlib.h>

#include "mapfile.hpp"


#define DICT_CACHE_SIZE 5

struct dictCache
{
    int chunk;
    char *inBuffer;
    int stamp;
    int count;
};

struct dictData
{
    dictData()
    {}
    bool open(const std::string& filename, int computeCRC);
    void close();
    void read(char *buffer, unsigned long start, unsigned long size);
    ~dictData()
    {
        close();
    }
private:
    const char *start;	/* start of mmap'd area */
    const char *end;		/* end of mmap'd area */
    unsigned long size;		/* size of mmap */

    int type;
    z_stream zStream;
    int initialized;

    int headerLength;
    int method;
    int flags;
    time_t mtime;
    int extraFlags;
    int os;
    int version;
    int chunkLength;
    int chunkCount;
    int *chunks;
    unsigned long *offsets;	/* Sum-scan of chunks. */
    std::string origFilename;
    std::string comment;
    unsigned long crc;
    unsigned long length;
    unsigned long compressedLength;
    dictCache cache[DICT_CACHE_SIZE];
    MapFile mapfile;

    int read_header(const std::string &filename, int computeCRC);
};

#endif//!__DICT_ZIP_LIB_H__
