diff -r 316b0a396e86 -r 4a33a6715a51 ZipStream.st --- a/ZipStream.st Tue Jun 24 15:32:55 2008 +0200 +++ b/ZipStream.st Mon Jun 30 11:07:57 2008 +0200 @@ -679,68 +679,80 @@ openWithMode:aMode on:aStream "open stream and write or check gzip header" + super openWithMode:aMode on:aStream. + self isReadable ifTrue:[ "Check for the gzip magic id" - |flags| + self readHeader + ] ifFalse:[ + "write the gzip magic id" + self writeHeader + ]. +! - GZ_MAGIC_ID do:[:b| - onStream nextByte ~~ b ifTrue:[ self zerror:'version error' ] - ]. - - onStream nextByte ~~ Z_DEFLATED ifTrue:[ - self zerror:'invalid method (not deflated)' - ]. +readHeader + "Check for the gzip magic id" + |flags| - flags := onStream nextByte. - (flags bitAnd:HEAD_RESERVED) ~~ 0 ifTrue:[ - self zerror:'wrong data format' - ]. + GZ_MAGIC_ID do:[:b| + onStream nextByte ~~ b ifTrue:[ self zerror:'version error' ] + ]. + + onStream nextByte ~~ Z_DEFLATED ifTrue:[ + self zerror:'invalid method (not deflated)' + ]. - "discard time, xflags and OS code" - onStream skip:6. + flags := onStream nextByte. + (flags bitAnd:HEAD_RESERVED) ~~ 0 ifTrue:[ + self zerror:'wrong data format' + ]. - (flags bitAnd:HEAD_EXTRA_FIELD) ~~ 0 ifTrue:[|len| - "skip the extra field" - len := onStream nextByte + (onStream nextByte bitShift:8). - len timesRepeat:[ onStream nextByte ]. - ]. + "discard time, xflags and OS code" + onStream skip:6. - (flags bitAnd:HEAD_ORIG_NAME) ~~ 0 ifTrue:[|b| - "skip the original file name" - [ (b := onStream nextByte) ~~ 0 ] whileTrue. - ]. + (flags bitAnd:HEAD_EXTRA_FIELD) ~~ 0 ifTrue:[|len| + "skip the extra field" + len := onStream nextByte + (onStream nextByte bitShift:8). + len timesRepeat:[ onStream nextByte ]. + ]. - (flags bitAnd:HEAD_CRC) ~~ 0 ifTrue:[ - "skip the header crc" - onStream skip:2. - ]. - ] ifFalse:[ - "write the gzip magic id - " - GZ_MAGIC_ID do:[:b| onStream nextPutByte:b ]. + (flags bitAnd:HEAD_ORIG_NAME) ~~ 0 ifTrue:[|b| + "skip the original file name" + [ (b := onStream nextByte) ~~ 0 ] whileTrue. + ]. + + (flags bitAnd:HEAD_CRC) ~~ 0 ifTrue:[ + "skip the header crc" + onStream skip:2. + ]. +! - "write the method" - onStream nextPutByte:Z_DEFLATED. +writeHeader + "write the gzip magic id" - "write the flags" - onStream nextPutByte:0. + GZ_MAGIC_ID do:[:b| onStream nextPutByte:b ]. + + "write the method" + onStream nextPutByte:Z_DEFLATED. - "write time" - 4 timesRepeat:[ onStream nextPutByte:0 ]. + "write the flags" + onStream nextPutByte:0. + + "write time" + 4 timesRepeat:[ onStream nextPutByte:0 ]. - "write xflags" - onStream nextPutByte:0. + "write xflags" + onStream nextPutByte:0. - "write OS code" - onStream nextPutByte:HEAD_OS_CODE. - ]. + "write OS code" + onStream nextPutByte:HEAD_OS_CODE. ! ! !ZipStream class methodsFor:'documentation'! version - ^ '$Header: /cvs/stx/stx/libbasic2/ZipStream.st,v 1.29 2008-06-05 09:16:16 ab Exp $' + ^ '$Header: /cvs/stx/stx/libbasic2/ZipStream.st,v 1.30 2008-06-30 09:07:57 cg Exp $' ! ! ZipStream initialize!