// BgzfStream_p.h (c) 2011 Derek Barnett
// Marth Lab, Department of Biology, Boston College
// ---------------------------------------------------------------------------
-// Last modified: 5 April 2011(DB)
+// Last modified: 10 October 2011(DB)
// ---------------------------------------------------------------------------
// Based on BGZF routines developed at the Broad Institute.
// Provides the basic functionality for reading & writing BGZF files
//
// We mean it.
-#include <api/BamAux.h>
-#include <api/BamConstants.h>
-#include "zlib.h"
-#include <cstdio>
+#include "api/api_global.h"
+#include "api/IBamIODevice.h"
#include <string>
namespace BamTools {
public:
// closes BGZF file
void Close(void);
- // opens the BGZF file (mode is either "rb" for reading, or "wb" for writing)
- bool Open(const std::string& filename, const char* mode);
+ // returns true if BgzfStream open for IO
+ bool IsOpen(void) const;
+ // opens the BGZF file
+ void Open(const std::string& filename, const IBamIODevice::OpenMode mode);
// reads BGZF data into a byte buffer
- int Read(char* data, const unsigned int dataLength);
+ size_t Read(char* data, const size_t dataLength);
// seek to position in BGZF file
- bool Seek(const int64_t& position);
+ void Seek(const int64_t& position);
+ // sets IO device (closes previous, if any, but does not attempt to open)
+ void SetIODevice(IBamIODevice* device);
// enable/disable compressed output
void SetWriteCompressed(bool ok);
// get file position in BGZF file
int64_t Tell(void) const;
// writes the supplied data into the BGZF buffer
- unsigned int Write(const char* data, const unsigned int dataLen);
+ size_t Write(const char* data, const size_t dataLength);
// internal methods
private:
// compresses the current block
- int DeflateBlock(void);
+ size_t DeflateBlock(void);
// flushes the data in the BGZF block
void FlushBlock(void);
// de-compresses the current block
- int InflateBlock(const int& blockLength);
+ size_t InflateBlock(const size_t& blockLength);
// reads a BGZF block
- bool ReadBlock(void);
+ void ReadBlock(void);
// static 'utility' methods
public:
// checks BGZF block header
- static inline bool CheckBlockHeader(char* header);
+ static bool CheckBlockHeader(char* header);
// data members
public:
- unsigned int UncompressedBlockSize;
- unsigned int CompressedBlockSize;
- unsigned int BlockLength;
- unsigned int BlockOffset;
- uint64_t BlockAddress;
- bool IsOpen;
- bool IsWriteOnly;
- bool IsWriteCompressed;
- FILE* Stream;
- char* UncompressedBlock;
- char* CompressedBlock;
-};
+ unsigned int m_blockLength;
+ unsigned int m_blockOffset;
+ uint64_t m_blockAddress;
-// -------------------------------------------------------------
-// static 'utility' method implementations
+ bool m_isWriteCompressed;
+ IBamIODevice* m_device;
-// checks BGZF block header
-inline
-bool BgzfStream::CheckBlockHeader(char* header) {
- return (header[0] == Constants::GZIP_ID1 &&
- header[1] == (char)Constants::GZIP_ID2 &&
- header[2] == Z_DEFLATED &&
- (header[3] & Constants::FLG_FEXTRA) != 0 &&
- BamTools::UnpackUnsignedShort(&header[10]) == Constants::BGZF_XLEN &&
- header[12] == Constants::BGZF_ID1 &&
- header[13] == Constants::BGZF_ID2 &&
- BamTools::UnpackUnsignedShort(&header[14]) == Constants::BGZF_LEN );
-}
+ struct RaiiWrapper {
+ RaiiWrapper(void);
+ ~RaiiWrapper(void);
+ char* UncompressedBlock;
+ char* CompressedBlock;
+ };
+ RaiiWrapper Resources;
+};
} // namespace Internal
} // namespace BamTools