// Transparently decompresses gzip files, as well as uncompressed

// File_Extractor 1.0.0
#ifndef GZIP_READER_H
#define GZIP_READER_H

#include "Data_Reader.h"
#include "Zlib_Inflater.h"

class Gzip_Reader : public Data_Reader
{
        public:
        // Keeps pointer to reader until close(). If
        blargg_err_t open(File_Reader *);

        // True if file is open
        bool opened() const
        {
                return in != NULL;
        }

        // Frees memory
        void close();

        // True if file is compressed
        bool deflated() const
        {
                return inflater.deflated();
        }

        // CRC-32 of data, of 0 if unavailable
        unsigned int crc32() const
        {
                return crc32_;
        }

        // Number of bytes read since opening
        int tell() const
        {
                return size_ - remain();
        }

        public:
        Gzip_Reader();
        virtual ~Gzip_Reader();

        protected:
        virtual blargg_err_t read_v(void *, int);

        private:
        File_Reader *in;
        unsigned crc32_;
        int size_;
        Zlib_Inflater inflater;

        blargg_err_t calc_size();
};

#endif
