Newer
Older
/*
* InputStreamMgr.h
*
* Created on: Mar 21, 2013
* Author: nek3d
*/
#ifndef INPUTSTREAMMGR_H_
#define INPUTSTREAMMGR_H_
using namespace std;
#include "PushBackStreamBuf.h"
#include "InflateStreamBuf.h"
#include "QuickString.h"
#include "api/BamReader.h"
#include "api/internal/io/BgzfStream_p.h"
#include <iostream>
class InputStreamMgr {
public:
//Contsructor: 1st arg can be "-" for stdin. set 2nd arg false if fileType already known.
InputStreamMgr(const QuickString &filename, bool buildScanBuffer = true);
~InputStreamMgr();
bool init();
int read(char *data, size_t dataSize);
//use getScanBuffer for auto-detection of file types.
// istream *getFinalStream() { return _finalInputStream; }
const BTlist<int> &getScanBuffer() const { return _scanBuffer; }
int getBufferLength() const { return _numBytesInBuffer; }
void populateScanBuffer();
const QuickString &getSavedData() const { return _saveDataStr; }
bool isGzipped() const { return _isGzipped; }
PushBackStreamBuf *getPushBackStreamBuf() const {return _pushBackStreamBuf; }
// void getSavedData(QuickString &str) const { str = _saveDataStr; }
BamTools::BamReader *getBamReader() { return _bamReader; }
bool resetStream();
private:
QuickString _filename;
PushBackStreamBuf *_pushBackStreamBuf;
ifstream *_inputFileStream;
BTlist<int> _scanBuffer;
QuickString _saveDataStr;
InflateStreamBuf *_infStreamBuf;
istream * _finalInputStream;
istream *_oldInputStream;
bool _isStdin;
bool _isGzipped;
bool _isBam;
char *_tmpZipBuf;
bool _streamFinished;
vector<int> _possibleBamCode;
static const int SCAN_BUFFER_SIZE = 4096; // 4 K buffer
static const int BAM_SCAN_BUFFER_SIZE = 32768; // 32K
static const int MIN_SCAN_BUFFER_SIZE = 2048;
int _numBytesInBuffer; //this will hold the length of the buffer after the scan.
BamTools::BamReader *_bamReader;
BamTools::Internal::BgzfStream *_bgStream;
void readZipChunk();
bool detectBamOrBgzip(int &numChars, int currChar);
// void decompressBuffer();