ZipArchive.st
changeset 4677 a73ebe9d10cb
parent 4633 d3bd3c9cc3d1
child 4680 2675216b9dd7
--- a/ZipArchive.st	Sat May 26 11:32:48 2018 +0200
+++ b/ZipArchive.st	Mon Jun 11 14:57:51 2018 +0200
@@ -26,7 +26,7 @@
 !
 
 PeekableStream subclass:#AbstractZipStream
-	instanceVariableNames:'zipArchive zipEntry zipFileStream compressingStream crc32
+	instanceVariableNames:'zipArchive zipEntry zipFileStream compressingStream
 		uncompressedDataSize startDataPosition'
 	classVariableNames:''
 	poolDictionaries:''
@@ -64,7 +64,7 @@
 !
 
 ZipArchive::AbstractZipStream subclass:#ZipWriteStream
-	instanceVariableNames:''
+	instanceVariableNames:'crc32'
 	classVariableNames:''
 	poolDictionaries:'ZipArchiveConstants'
 	privateIn:ZipArchive
@@ -4582,6 +4582,16 @@
     ^ self basicNew zipFileStream:something zipEntry:compressionMethodArg
 ! !
 
+!ZipArchive::AbstractZipStream class methodsFor:'queries'!
+
+isAbstract
+    "Return if this class is an abstract class.
+     True is returned here for myself only; false for subclasses.
+     Abstract subclasses must redefine this again."
+
+    ^ self == ZipArchive::AbstractZipStream.
+! !
+
 !ZipArchive::AbstractZipStream methodsFor:'accessing'!
 
 zipArchive
@@ -4604,6 +4614,28 @@
     ^ zipFileStream
 ! !
 
+!ZipArchive::AbstractZipStream methodsFor:'closing'!
+
+close
+    (compressingStream notNil and:[compressingStream ~~ zipFileStream]) ifTrue:[
+        "close ZipStream"
+        compressingStream close.
+    ].
+    compressingStream := nil.
+
+    "Modified: / 11-06-2018 / 14:14:26 / Stefan Vogel"
+! !
+
+!ZipArchive::AbstractZipStream methodsFor:'initialization'!
+
+zipFileStream:zipFileStreamArg zipEntry:zipEntryArg
+    "raise an error: must be redefined in concrete subclass(es)"
+
+    ^ self subclassResponsibility
+
+    "Modified (format): / 11-06-2018 / 14:53:22 / Stefan Vogel"
+! !
+
 !ZipArchive::AbstractZipStream methodsFor:'misc'!
 
 binary
@@ -5120,32 +5152,38 @@
     "Created: / 30-05-2017 / 20:19:18 / mawalch"
 ! !
 
-!ZipArchive::ZipReadStream methodsFor:'closing'!
-
-close
-    "nothing to do here"
-! !
-
 !ZipArchive::ZipReadStream methodsFor:'initialization'!
 
+reset
+    "reset the stream to the initial position"
+
+    readPosition := 0.
+    peek := nil.
+
+    zipEntry compressionMethod == COMPRESSION_DEFLATED ifTrue:[
+        compressingStream notNil ifTrue:[
+            compressingStream close.
+        ].
+        compressingStream := ZipStream readOpenAsZipStreamOn:zipFileStream suppressHeaderAndChecksum:true.
+    ] ifFalse:[
+        compressingStream := zipFileStream.
+        compressingStream text.
+    ].
+
+    "Created: / 11-06-2018 / 14:03:51 / Stefan Vogel"
+!
+
 zipFileStream:something zipEntry:aZipEntry
-
     zipEntry := aZipEntry.
     zipFileStream := something.
     startDataPosition := zipFileStream position.
-    crc32 := 0.
     uncompressedDataSize := zipEntry uncompressedSize.
-    readPosition := 0.
-
-    zipEntry compressionMethod == COMPRESSION_DEFLATED ifTrue:[
-	compressingStream := ZipStream readOpenAsZipStreamOn:zipFileStream suppressHeaderAndChecksum:true.
-    ] ifFalse:[
-	compressingStream := zipFileStream.
-	compressingStream text.
-    ].
+
+    self reset.
 
     "Modified: / 19-11-2010 / 15:47:14 / cg"
     "Modified (format): / 30-05-2017 / 20:17:24 / mawalch"
+    "Modified: / 11-06-2018 / 14:06:58 / Stefan Vogel"
 ! !
 
 !ZipArchive::ZipReadStream methodsFor:'queries'!
@@ -5220,29 +5258,24 @@
 close
     "finalize the data"
 
-    compressingStream ~~ zipFileStream ifTrue:[
-	"close ZipStream"
-	compressingStream close.
-    ].
-    compressingStream := nil.
+    super close.
 
     zipEntry compressedSize:(zipFileStream position) - startDataPosition.
 
     "/ crc32 is always required (not as written in docu to be zero in case of uncompressed mode)
     zipEntry crc32:crc32.
     zipEntry uncompressedSize:uncompressedDataSize.
-
     zipEntry rewriteCrcAndSizeTo:zipFileStream.
 
     zipFileStream setToEnd.
 
     "Modified (comment): / 30-05-2017 / 19:02:28 / mawalch"
+    "Modified (format): / 11-06-2018 / 14:46:37 / Stefan Vogel"
 ! !
 
 !ZipArchive::ZipWriteStream methodsFor:'initialization'!
 
 zipFileStream:something zipEntry:aZipEntry
-
     zipEntry := aZipEntry.
     zipFileStream := something.
     startDataPosition := zipFileStream position.
@@ -5250,13 +5283,14 @@
     uncompressedDataSize := 0.
 
     zipEntry compressionMethod == COMPRESSION_DEFLATED ifTrue:[
-	compressingStream := ZipStream writeOpenAsZipStreamOn:zipFileStream suppressHeaderAndChecksum:true.
+        compressingStream := ZipStream writeOpenAsZipStreamOn:zipFileStream suppressHeaderAndChecksum:true.
     ] ifFalse:[
-	compressingStream := zipFileStream.
+        compressingStream := zipFileStream.
     ].
 
     "Modified: / 19-11-2010 / 15:46:57 / cg"
     "Modified (format): / 30-05-2017 / 20:20:41 / mawalch"
+    "Modified (format): / 11-06-2018 / 14:45:55 / Stefan Vogel"
 ! !
 
 !ZipArchive::ZipWriteStream methodsFor:'queries'!
@@ -5280,24 +5314,27 @@
 contents
     "return the entire contents of the stream.
      For a readStream, that is the rest (i.e. upToEnd),
-     for a writeStream, that is the collected data. As we do not know here,
-     what we are, this is the responsibility of a subclass..."
+     for a writeStream, that is the collected data."
 
     self shouldNotImplement
+
+    "Modified (comment): / 11-06-2018 / 14:47:59 / Stefan Vogel"
 !
 
 next
-    "return the next element of the stream
-     - we do not know here how to do it, it must be redefined in subclass"
+    "return the next element of the stream"
 
     self shouldNotImplement
+
+    "Modified (comment): / 11-06-2018 / 14:48:24 / Stefan Vogel"
 !
 
 peek
-    "return the next element of the stream
-     - we do not know here how to do it, it must be redefined in subclass"
+    "return the next element of the stream"
 
     self shouldNotImplement
+
+    "Modified (comment): / 11-06-2018 / 14:48:32 / Stefan Vogel"
 ! !
 
 !ZipArchive::ZipWriteStream methodsFor:'writing'!