ZipStream.st
changeset 3535 d62d6f27f07c
parent 3283 836136cf9e8d
child 3536 2df6c954138e
--- a/ZipStream.st	Mon Mar 23 18:27:33 2015 +0100
+++ b/ZipStream.st	Fri Mar 27 10:21:44 2015 +0100
@@ -1,3 +1,5 @@
+"{ Encoding: utf8 }"
+
 "
  COPYRIGHT (c) 2002 by eXept Software AG
 	      All Rights Reserved
@@ -11,6 +13,8 @@
 "
 "{ Package: 'stx:libbasic2' }"
 
+"{ NameSpace: Smalltalk }"
+
 CompressionStream subclass:#ZipStream
 	instanceVariableNames:''
 	classVariableNames:'Z_DEFLATED HEAD_OS_CODE HEAD_RESERVED HEAD_EXTRA_FIELD
@@ -172,6 +176,16 @@
         suppressHeaderAndChecksum:(self defaultSuppressHeaderAndChecksum)    
 !
 
+readOpenAsZipStreamOn:aStream suppressFileHeader:suppressFileHeader suppressZipHeaderAndChecksum:suppressZipHeaderAndChecksum
+    "open to read data compressed from stream,
+     the default readOpenOn: will open ZipStream as gzip stream"
+
+    ^ self basicNew
+        streamOpenWithMode:#readonly
+        on:aStream
+        suppressFileHeader:suppressFileHeader suppressZipHeaderAndChecksum:suppressZipHeaderAndChecksum
+!
+
 readOpenAsZipStreamOn:aStream suppressHeaderAndChecksum:aBoolean
     "open to read data compressed from stream,
      the default readOpenOn: will open ZipStream as gzip stream"
@@ -191,6 +205,16 @@
         suppressHeaderAndChecksum:(self defaultSuppressHeaderAndChecksum)    
 !
 
+writeOpenAsZipStreamOn:aStream suppressFileHeader:suppressFileHeader suppressZipHeaderAndChecksum:suppressZipHeaderAndChecksum
+    "open to write data compressed to stream,
+     the default writeOpenOn: will open ZipStream as gzip stream"
+
+    ^ self basicNew
+        streamOpenWithMode:#writeonly
+        on:aStream
+        suppressFileHeader:suppressFileHeader suppressZipHeaderAndChecksum:suppressZipHeaderAndChecksum
+!
+
 writeOpenAsZipStreamOn:aStream suppressHeaderAndChecksum:aBoolean
     "open to write data compressed to stream,
      the default writeOpenOn: will open ZipStream as gzip stream"
@@ -782,23 +806,42 @@
 
 !ZipStream methodsFor:'startup & release'!
 
-openWithMode:aMode on:aStream suppressHeaderAndChecksum:aBoolean
-    "open stream and write or check gzip header"
+openWithMode:aMode on:aStream suppressFileHeader:suppressFileHeader suppressZipHeaderAndChecksum:suppressZipHeaderAndChecksum
+    "open stream and write or check gzip header
+     suppressFileHeader:
+        if true, the gzip header (magic number and a few extra fields) is not written/read
+     suppressZipHeaderAndChecksum
+        controls if the gzip checksum and 2 header bytes should be written/checked"
 
     super
         openWithMode:aMode
         on:aStream
-        suppressHeaderAndChecksum:aBoolean.
+        suppressHeaderAndChecksum:suppressZipHeaderAndChecksum.
 
-    self isReadable ifTrue:[
-        "Check for the gzip magic id"
-        self readHeader
-    ] ifFalse:[
-        "write the gzip magic id"
-        self writeHeader
+    suppressFileHeader ifFalse:[
+        self isReadable ifTrue:[
+            "Check for the gzip magic id"
+            self readHeader
+        ] ifFalse:[
+            "write the gzip magic id"
+            self writeHeader
+        ].
     ].
 !
 
+openWithMode:aMode on:aStream suppressHeaderAndChecksum:aBoolean
+    "open stream and write or check gzip header.
+     Caveat:
+        Backward compatibility: aBoolean controls if the gzip checksum and 2 header bytes should be written/checked
+        (i.e. NOT the file header with the zip magic)"
+
+    self 
+        openWithMode:aMode 
+        on:aStream 
+        suppressFileHeader:false 
+        suppressZipHeaderAndChecksum:aBoolean
+!
+
 readHeader
     "Check for the gzip magic id"
     |flags|
@@ -819,15 +862,18 @@
     "discard time, xflags and OS code"
     onStream skip:6.
 
-    (flags bitAnd:HEAD_EXTRA_FIELD) ~~ 0 ifTrue:[|len|
+    (flags bitAnd:HEAD_EXTRA_FIELD) ~~ 0 ifTrue:[
+        |len|
         "skip the extra field"
         len := onStream nextByte + (onStream nextByte bitShift:8).
-        len timesRepeat:[ onStream nextByte ].
+        "/ len timesRepeat:[ onStream nextByte ].
+        "/ faster:
+        onStream skip:len.
     ].
 
     (flags bitAnd:HEAD_ORIG_NAME) ~~ 0 ifTrue:[
         |b|
-        "skip the original file name"
+        "skip the original file name (up to zero byte)"
         [ (b := onStream nextByte) ~~ 0 ] whileTrue.
     ].
 
@@ -858,11 +904,11 @@
 !ZipStream class methodsFor:'documentation'!
 
 version
-    ^ '$Header: /cvs/stx/stx/libbasic2/ZipStream.st,v 1.41 2014-05-19 14:41:09 stefan Exp $'
+    ^ '$Header: /cvs/stx/stx/libbasic2/ZipStream.st,v 1.42 2015-03-27 09:21:44 cg Exp $'
 !
 
 version_CVS
-    ^ '$Header: /cvs/stx/stx/libbasic2/ZipStream.st,v 1.41 2014-05-19 14:41:09 stefan Exp $'
+    ^ '$Header: /cvs/stx/stx/libbasic2/ZipStream.st,v 1.42 2015-03-27 09:21:44 cg Exp $'
 ! !