2
* UGENE - Integrated Bioinformatics Tools.
3
* Copyright (C) 2008-2011 UniPro <ugene@unipro.ru>
4
* http://ugene.unipro.ru
6
* This program is free software; you can redistribute it and/or
7
* modify it under the terms of the GNU General Public License
8
* as published by the Free Software Foundation; either version 2
9
* of the License, or (at your option) any later version.
11
* This program is distributed in the hope that it will be useful,
12
* but WITHOUT ANY WARRANTY; without even the implied warranty of
13
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
* GNU General Public License for more details.
16
* You should have received a copy of the GNU General Public License
17
* along with this program; if not, write to the Free Software
18
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
22
#ifndef _U2_ZLIB_ADAPTER_H_
23
#define _U2_ZLIB_ADAPTER_H_
25
#include <U2Core/IOAdapter.h>
26
#include "RingBuffer.h"
32
struct GZipIndexAccessPoint;
34
class U2CORE_EXPORT ZlibAdapter: public IOAdapter {
37
ZlibAdapter(IOAdapter* io);
40
virtual bool open(const GUrl& url, IOAdapterMode m_ );
42
virtual bool isOpen() const {return io->isOpen();}
46
virtual qint64 readBlock(char* data, qint64 maxSize);
48
virtual qint64 writeBlock(const char* data, qint64 size);
50
virtual bool skip(qint64 nBytes);
52
virtual qint64 left() const {return -1;}
54
virtual int getProgress() const {return io->getProgress();}
56
virtual qint64 bytesRead() const;
58
virtual GUrl getURL() const;
61
* should be invoked after open() ( needs z not null )
63
bool skip( const GZipIndexAccessPoint& point, qint64 offset );
66
*on error *ok set to false and GZipIndex() is returned
67
* io - opened ioadapter, on the beginning of the file
69
static GZipIndex buildGzipIndex( IOAdapter* io, qint64 span, bool* ok = NULL );
72
* returns -1 if a file is failed to open
74
static qint64 getUncompressedFileSizeInBytes(const GUrl &url);
77
static const int BUFLEN = 32768;
80
RingBuffer* buf; // seek buffer
81
int rewinded; // how much should read from seek buffer
84
struct GZipIndexAccessPoint {
85
qint64 out; // corresponding offset in uncompressed data
86
qint64 in; // offset in input file of first full byte
87
int bits; // number of bits (1-7) from byte at in - 1, or 0
88
QByteArray window; //preceding WINSIZE of uncompressed data
91
struct U2CORE_EXPORT GZipIndex {
92
static const int WINSIZE = 32768;
93
static const qint64 SPAN = 1048576L;
94
static const int CHUNK = 16384;
96
QList< GZipIndexAccessPoint > points;