00001
00002
00003 #include "cheprep/GZIPOutputStreamBuffer.h"
00004
00009 namespace cheprep {
00010
00011 using namespace std;
00012
00013 GZIPOutputStreamBuffer::GZIPOutputStreamBuffer( streambuf *aBuffer)
00014 : DeflateOutputStreamBuffer(aBuffer),
00015 open(false) {
00016
00017 init(true);
00018 }
00019
00020 void GZIPOutputStreamBuffer::setFilename( const string &name ) {
00021 filename = name ;
00022 }
00023
00024 void GZIPOutputStreamBuffer::setComment( const string &c ) {
00025 comment = c ;
00026 }
00027
00028 void GZIPOutputStreamBuffer::close() {
00029 if (!open) return;
00030
00031 finish();
00032 writeTrailer();
00033
00034 open = false ;
00035 }
00036
00037 GZIPOutputStreamBuffer::~GZIPOutputStreamBuffer() {
00038 close() ;
00039 }
00040
00041 int GZIPOutputStreamBuffer::overflow( int c ) {
00042 if (!open) {
00043 writeHeader();
00044 open = true;
00045 }
00046 return DeflateOutputStreamBuffer::overflow( c ) ;
00047 }
00048
00049 void GZIPOutputStreamBuffer::writeHeader() {
00050 unsigned char flag = 0x00;
00051 flag |= (filename == "") ? 0x00 : 0x08;
00052 flag |= (comment == "") ? 0x00 : 0x10;
00053
00054 putUB(0x1f);
00055 putUB(0x8b);
00056 putUB(0x08);
00057 putUB(flag);
00058 putUI(0x00000000);
00059 putUB(0x00);
00060 putUB(0x00);
00061
00062 if (filename != "") {
00063 putS(filename);
00064 putUB(0x00);
00065 }
00066
00067 if (comment != "") {
00068 putS(comment);
00069 putUB(0x00);
00070 }
00071 }
00072
00073 void GZIPOutputStreamBuffer::writeTrailer() {
00074 putUI(getCRC());
00075 putUI(getSize());
00076 }
00077
00078 }