CompressionStream.st
author Stefan Vogel <sv@exept.de>
Tue, 06 May 2003 18:19:20 +0200
changeset 1195 9d887847d1b6
parent 1193 7688148ec90c
child 1197 c86e858c2893
permissions -rw-r--r--
Add BZipStream and ZipStream
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1195
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
     1
"{ Package: 'stx:libbasic2' }"
1059
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
     2
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
     3
Stream subclass:#CompressionStream
1193
7688148ec90c Code formatting & clean up
Stefan Vogel <sv@exept.de>
parents: 1083
diff changeset
     4
	instanceVariableNames:'onStream hitEOF binary position readLimit mode inputBytes
7688148ec90c Code formatting & clean up
Stefan Vogel <sv@exept.de>
parents: 1083
diff changeset
     5
		outputBytes zstream'
7688148ec90c Code formatting & clean up
Stefan Vogel <sv@exept.de>
parents: 1083
diff changeset
     6
	classVariableNames:'BlockSize'
7688148ec90c Code formatting & clean up
Stefan Vogel <sv@exept.de>
parents: 1083
diff changeset
     7
	poolDictionaries:''
7688148ec90c Code formatting & clean up
Stefan Vogel <sv@exept.de>
parents: 1083
diff changeset
     8
	category:'System-Compress'
1059
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
     9
!
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
    10
1193
7688148ec90c Code formatting & clean up
Stefan Vogel <sv@exept.de>
parents: 1083
diff changeset
    11
1059
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
    12
!CompressionStream class methodsFor:'initialization'!
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
    13
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
    14
initialize
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
    15
    BlockSize := 6.
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
    16
! !
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
    17
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
    18
!CompressionStream class methodsFor:'instance creation'!
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
    19
1193
7688148ec90c Code formatting & clean up
Stefan Vogel <sv@exept.de>
parents: 1083
diff changeset
    20
openWithMode:modeSymbol on:aStream
7688148ec90c Code formatting & clean up
Stefan Vogel <sv@exept.de>
parents: 1083
diff changeset
    21
    "open on aStream with mode modeSymbol (#readonly #writeonly)"
7688148ec90c Code formatting & clean up
Stefan Vogel <sv@exept.de>
parents: 1083
diff changeset
    22
7688148ec90c Code formatting & clean up
Stefan Vogel <sv@exept.de>
parents: 1083
diff changeset
    23
    ^ self subclassResponsibility
7688148ec90c Code formatting & clean up
Stefan Vogel <sv@exept.de>
parents: 1083
diff changeset
    24
!
7688148ec90c Code formatting & clean up
Stefan Vogel <sv@exept.de>
parents: 1083
diff changeset
    25
1059
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
    26
readOpenOn:aStream
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
    27
    "read data from an compressed stream
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
    28
    "
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
    29
    ^ self basicNew openWithMode:#readonly on:aStream
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
    30
!
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
    31
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
    32
writeOpenOn:aStream
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
    33
    "write data compressed to stream 
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
    34
    "
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
    35
    ^ self basicNew openWithMode:#writeonly on:aStream
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
    36
! !
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
    37
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
    38
!CompressionStream class methodsFor:'test'!
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
    39
1082
3086d4d4f0b9 *** empty log message ***
ca
parents: 1081
diff changeset
    40
doTestNextN
3086d4d4f0b9 *** empty log message ***
ca
parents: 1081
diff changeset
    41
"
3086d4d4f0b9 *** empty log message ***
ca
parents: 1081
diff changeset
    42
    CompressionStream doTestNextN
3086d4d4f0b9 *** empty log message ***
ca
parents: 1081
diff changeset
    43
"
3086d4d4f0b9 *** empty log message ***
ca
parents: 1081
diff changeset
    44
   |stream time file zipCont nxtCont|
3086d4d4f0b9 *** empty log message ***
ca
parents: 1081
diff changeset
    45
3086d4d4f0b9 *** empty log message ***
ca
parents: 1081
diff changeset
    46
   file := '/phys/exept/tmp/yyy/201--T22--D.20000415.SAGSA.DE0220523.gz' asFilename.
3086d4d4f0b9 *** empty log message ***
ca
parents: 1081
diff changeset
    47
   file isReadable ifFalse:[^ self error:'not existant'].
3086d4d4f0b9 *** empty log message ***
ca
parents: 1081
diff changeset
    48
3086d4d4f0b9 *** empty log message ***
ca
parents: 1081
diff changeset
    49
   time := Time millisecondsToRun:[ |zipStream|
1195
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
    50
	zipStream := stream := zipCont := nil.
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
    51
	[
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
    52
	    stream    := file readStream.
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
    53
	    zipStream := ZipStream readOpenOn:stream.
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
    54
	    zipCont   := zipStream contents.
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
    55
	] valueNowOrOnUnwindDo:[
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
    56
	    zipStream notNil ifTrue:[zipStream close].
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
    57
	    stream    notNil ifTrue:[stream close].
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
    58
	].
1082
3086d4d4f0b9 *** empty log message ***
ca
parents: 1081
diff changeset
    59
   ].
3086d4d4f0b9 *** empty log message ***
ca
parents: 1081
diff changeset
    60
   Transcript showCR:('STX   Time : %1  Size: %2' bindWith:time with:(zipCont size)).
3086d4d4f0b9 *** empty log message ***
ca
parents: 1081
diff changeset
    61
3086d4d4f0b9 *** empty log message ***
ca
parents: 1081
diff changeset
    62
   time := Time millisecondsToRun:[ |zipStream wstream|
1195
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
    63
	zipStream := stream := nxtCont := nil.
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
    64
	[
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
    65
	    stream    := file readStream.
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
    66
	    wstream   := '' writeStream.
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
    67
	    zipStream := ZipStream readOpenOn:stream.
1082
3086d4d4f0b9 *** empty log message ***
ca
parents: 1081
diff changeset
    68
1195
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
    69
	    [zipStream atEnd] whileFalse:[
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
    70
		wstream nextPutAll:(zipStream next:117)
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
    71
	    ].
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
    72
	    nxtCont := wstream contents.
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
    73
	] valueNowOrOnUnwindDo:[
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
    74
	    zipStream notNil ifTrue:[zipStream close].
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
    75
	    stream    notNil ifTrue:[stream close].
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
    76
	].
1082
3086d4d4f0b9 *** empty log message ***
ca
parents: 1081
diff changeset
    77
   ].
3086d4d4f0b9 *** empty log message ***
ca
parents: 1081
diff changeset
    78
   Transcript showCR:('NEXT  Time : %1  Size: %2' bindWith:time with:(nxtCont size)).
3086d4d4f0b9 *** empty log message ***
ca
parents: 1081
diff changeset
    79
3086d4d4f0b9 *** empty log message ***
ca
parents: 1081
diff changeset
    80
   nxtCont = zipCont ifTrue:[ Transcript showCR:'OK' ]
1195
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
    81
		    ifFalse:[ self error:'contents differs' ].
1082
3086d4d4f0b9 *** empty log message ***
ca
parents: 1081
diff changeset
    82
!
3086d4d4f0b9 *** empty log message ***
ca
parents: 1081
diff changeset
    83
3086d4d4f0b9 *** empty log message ***
ca
parents: 1081
diff changeset
    84
doTestSkipN
3086d4d4f0b9 *** empty log message ***
ca
parents: 1081
diff changeset
    85
"
3086d4d4f0b9 *** empty log message ***
ca
parents: 1081
diff changeset
    86
    CompressionStream doTestSkipN
3086d4d4f0b9 *** empty log message ***
ca
parents: 1081
diff changeset
    87
"
3086d4d4f0b9 *** empty log message ***
ca
parents: 1081
diff changeset
    88
   |stream time file skpCont nxtCont skip|
3086d4d4f0b9 *** empty log message ***
ca
parents: 1081
diff changeset
    89
3086d4d4f0b9 *** empty log message ***
ca
parents: 1081
diff changeset
    90
   file := '/phys/exept/tmp/yyy/201--T22--D.20000415.SAGSA.DE0220523.gz' asFilename.
3086d4d4f0b9 *** empty log message ***
ca
parents: 1081
diff changeset
    91
   file isReadable ifFalse:[^ self error:'not existant'].
3086d4d4f0b9 *** empty log message ***
ca
parents: 1081
diff changeset
    92
3086d4d4f0b9 *** empty log message ***
ca
parents: 1081
diff changeset
    93
   skip := 6885379.
3086d4d4f0b9 *** empty log message ***
ca
parents: 1081
diff changeset
    94
3086d4d4f0b9 *** empty log message ***
ca
parents: 1081
diff changeset
    95
   time := Time millisecondsToRun:[ |zipStream wstream|
1195
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
    96
	zipStream := stream := nxtCont := nil.
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
    97
	[
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
    98
	    stream    := file readStream.
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
    99
	    wstream   := '' writeStream.
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   100
	    zipStream := ZipStream readOpenOn:stream.
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   101
	    skip timesRepeat:[ zipStream next ].
1082
3086d4d4f0b9 *** empty log message ***
ca
parents: 1081
diff changeset
   102
1195
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   103
	    [zipStream atEnd] whileFalse:[
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   104
		wstream nextPutAll:(zipStream next:117)
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   105
	    ].
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   106
	    nxtCont := wstream contents.
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   107
	] valueNowOrOnUnwindDo:[
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   108
	    zipStream notNil ifTrue:[zipStream close].
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   109
	    stream    notNil ifTrue:[stream close].
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   110
	].
1082
3086d4d4f0b9 *** empty log message ***
ca
parents: 1081
diff changeset
   111
   ].
3086d4d4f0b9 *** empty log message ***
ca
parents: 1081
diff changeset
   112
3086d4d4f0b9 *** empty log message ***
ca
parents: 1081
diff changeset
   113
   Transcript showCR:('STX   Time : %1  Size: %2' bindWith:time with:(nxtCont size)).
3086d4d4f0b9 *** empty log message ***
ca
parents: 1081
diff changeset
   114
3086d4d4f0b9 *** empty log message ***
ca
parents: 1081
diff changeset
   115
   time := Time millisecondsToRun:[ |zipStream wstream|
1195
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   116
	zipStream := stream := skpCont := nil.
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   117
	[
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   118
	    stream    := file readStream.
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   119
	    wstream   := '' writeStream.
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   120
	    zipStream := ZipStream readOpenOn:stream.
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   121
	    zipStream skip:skip.
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   122
	    [zipStream atEnd] whileFalse:[
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   123
		wstream nextPutAll:(zipStream next:117)
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   124
	    ].
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   125
	    skpCont := wstream contents.
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   126
	] valueNowOrOnUnwindDo:[
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   127
	    zipStream notNil ifTrue:[zipStream close].
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   128
	    stream    notNil ifTrue:[stream close].
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   129
	].
1082
3086d4d4f0b9 *** empty log message ***
ca
parents: 1081
diff changeset
   130
   ].
3086d4d4f0b9 *** empty log message ***
ca
parents: 1081
diff changeset
   131
   Transcript showCR:('NEXT  Time : %1  Size: %2' bindWith:time with:(skpCont size)).
3086d4d4f0b9 *** empty log message ***
ca
parents: 1081
diff changeset
   132
3086d4d4f0b9 *** empty log message ***
ca
parents: 1081
diff changeset
   133
   nxtCont = skpCont ifTrue:[ Transcript showCR:'OK' ]
1195
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   134
		    ifFalse:[ self error:'contents differs' ].
1082
3086d4d4f0b9 *** empty log message ***
ca
parents: 1081
diff changeset
   135
3086d4d4f0b9 *** empty log message ***
ca
parents: 1081
diff changeset
   136
!
3086d4d4f0b9 *** empty log message ***
ca
parents: 1081
diff changeset
   137
3086d4d4f0b9 *** empty log message ***
ca
parents: 1081
diff changeset
   138
doTestUnixAgainstClass
3086d4d4f0b9 *** empty log message ***
ca
parents: 1081
diff changeset
   139
"
3086d4d4f0b9 *** empty log message ***
ca
parents: 1081
diff changeset
   140
    CompressionStream doTestUnixAgainstClass
3086d4d4f0b9 *** empty log message ***
ca
parents: 1081
diff changeset
   141
"
1080
fe4e074affae *** empty log message ***
ca
parents: 1079
diff changeset
   142
   |stream time file zipCont cmdCont|
fe4e074affae *** empty log message ***
ca
parents: 1079
diff changeset
   143
fe4e074affae *** empty log message ***
ca
parents: 1079
diff changeset
   144
   file := '/phys/exept/tmp/yyy/201--T22--D.20000415.SAGSA.DE0220523.gz' asFilename.
fe4e074affae *** empty log message ***
ca
parents: 1079
diff changeset
   145
   file isReadable ifFalse:[^ self error:'not existant'].
fe4e074affae *** empty log message ***
ca
parents: 1079
diff changeset
   146
fe4e074affae *** empty log message ***
ca
parents: 1079
diff changeset
   147
   time := Time millisecondsToRun:[ |zipStream|
1195
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   148
	zipStream := stream := zipCont := nil.
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   149
	[
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   150
	    stream    := file readStream.
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   151
	    zipStream := ZipStream readOpenOn:stream.
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   152
	    zipCont   := zipStream contents.
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   153
	] valueNowOrOnUnwindDo:[
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   154
	    zipStream notNil ifTrue:[zipStream close].
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   155
	    stream    notNil ifTrue:[stream close].
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   156
	].
1080
fe4e074affae *** empty log message ***
ca
parents: 1079
diff changeset
   157
   ].
fe4e074affae *** empty log message ***
ca
parents: 1079
diff changeset
   158
   Transcript showCR:('STX   Time : %1  Size: %2' bindWith:time with:(zipCont size)).
fe4e074affae *** empty log message ***
ca
parents: 1079
diff changeset
   159
fe4e074affae *** empty log message ***
ca
parents: 1079
diff changeset
   160
   time := Time millisecondsToRun:[ |command|
1195
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   161
	cmdCont := stream := nil.
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   162
	[
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   163
	    command := 'gunzip < ' , file pathName.
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   164
	    stream  := PipeStream readingFrom:command.
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   165
	    cmdCont := stream contentsOfEntireFile.
1080
fe4e074affae *** empty log message ***
ca
parents: 1079
diff changeset
   166
1195
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   167
	] valueNowOrOnUnwindDo:[
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   168
	    stream notNil ifTrue:[stream close].
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   169
	]
1080
fe4e074affae *** empty log message ***
ca
parents: 1079
diff changeset
   170
   ].
fe4e074affae *** empty log message ***
ca
parents: 1079
diff changeset
   171
   Transcript showCR:('UNIX  Time : %1  Size: %2' bindWith:time with:(cmdCont size)).
fe4e074affae *** empty log message ***
ca
parents: 1079
diff changeset
   172
fe4e074affae *** empty log message ***
ca
parents: 1079
diff changeset
   173
   cmdCont = zipCont ifTrue:[ Transcript showCR:'OK' ]
1195
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   174
		    ifFalse:[ self error:'contents differs' ].
1080
fe4e074affae *** empty log message ***
ca
parents: 1079
diff changeset
   175
!
fe4e074affae *** empty log message ***
ca
parents: 1079
diff changeset
   176
1059
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   177
test
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   178
"
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   179
CompressionStream test
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   180
"
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   181
   |original compressed contents in out zip|
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   182
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   183
   original := 'smalltalk.rc' asFilename contentsOfEntireFile.
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   184
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   185
   in := original readStream.
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   186
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   187
   [ |b|
1195
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   188
	out := #[] writeStream.
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   189
	zip := self writeOpenOn:out.
1059
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   190
1195
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   191
	[in atEnd] whileFalse:[
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   192
	    (b := in next) ifNotNil:[zip nextPut:b]
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   193
	]
1059
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   194
   ] valueNowOrOnUnwindDo:[ zip ifNotNil:[ zip close ] ].
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   195
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   196
   compressed := out contents.
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   197
   [ |b|
1195
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   198
	zip := self readOpenOn:(compressed readStream).
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   199
	out := '' writeStream.
1059
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   200
1195
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   201
	[ (b := zip next) notNil ] whileTrue:[ out nextPut:b ]
1059
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   202
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   203
   ] valueNowOrOnUnwindDo:[
1195
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   204
	zip ifNotNil:[ zip close ].
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   205
	contents := out contents.
1059
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   206
1195
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   207
	Transcript showCR:(contents   size).
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   208
	Transcript showCR:(compressed size).
1059
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   209
   ].
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   210
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   211
   original = contents ifFalse:[
1195
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   212
	self halt:'contents differs'.
1059
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   213
      ^ self
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   214
   ].
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   215
   Transcript showCR:'OK'.
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   216
!
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   217
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   218
testFile
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   219
"
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   220
CompressionStream testFile
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   221
"
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   222
   |fileContents in zip out gzipCmd|
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   223
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   224
   fileContents := 'smalltalk.rc' asFilename contentsOfEntireFile.
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   225
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   226
   in  := fileContents readStream.
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   227
   out := FileStream newFileNamed:'YYY.gz'.
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   228
   out ifNil:[ ^ self ].
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   229
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   230
   [ zip := self writeOpenOn:out.
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   231
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   232
     [in atEnd] whileFalse:[ |buf|
1195
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   233
	buf := in nextAvailable:512.
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   234
	buf do:[:n|
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   235
	    zip nextPut:n
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   236
	]
1059
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   237
     ].
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   238
   ] valueNowOrOnUnwindDo:[
1195
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   239
	zip ifNotNil:[ zip close ].
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   240
	out close.
1059
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   241
   ].
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   242
   gzipCmd := 'gzip -dc YYY.gz > YYY; diff YYY smalltalk.rc'.
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   243
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   244
   Transcript showCR:gzipCmd.
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   245
   gzipCmd printCR.
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   246
! !
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   247
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   248
!CompressionStream methodsFor:'accessing'!
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   249
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   250
binary
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   251
    "switch to binary mode - default is text
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   252
    "
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   253
    binary := true.
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   254
!
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   255
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   256
text
1193
7688148ec90c Code formatting & clean up
Stefan Vogel <sv@exept.de>
parents: 1083
diff changeset
   257
    "switch to text mode - default is text"
7688148ec90c Code formatting & clean up
Stefan Vogel <sv@exept.de>
parents: 1083
diff changeset
   258
1059
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   259
    binary := false.
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   260
! !
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   261
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   262
!CompressionStream methodsFor:'error handling'!
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   263
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   264
errorNotOpen
1193
7688148ec90c Code formatting & clean up
Stefan Vogel <sv@exept.de>
parents: 1083
diff changeset
   265
    "report an error, that the stream has not been opened"
7688148ec90c Code formatting & clean up
Stefan Vogel <sv@exept.de>
parents: 1083
diff changeset
   266
1059
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   267
    self zerror:'not open'.
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   268
!
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   269
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   270
errorReadOnly
1193
7688148ec90c Code formatting & clean up
Stefan Vogel <sv@exept.de>
parents: 1083
diff changeset
   271
    "report an error, that the stream is a readOnly stream"
7688148ec90c Code formatting & clean up
Stefan Vogel <sv@exept.de>
parents: 1083
diff changeset
   272
1059
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   273
    self zerror:'is readonly'
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   274
!
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   275
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   276
errorWriteOnly
1193
7688148ec90c Code formatting & clean up
Stefan Vogel <sv@exept.de>
parents: 1083
diff changeset
   277
    "report an error, that the stream is a writeOnly stream"
7688148ec90c Code formatting & clean up
Stefan Vogel <sv@exept.de>
parents: 1083
diff changeset
   278
1059
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   279
    self zerror:'is writeonly'
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   280
!
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   281
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   282
invalidArgument
1193
7688148ec90c Code formatting & clean up
Stefan Vogel <sv@exept.de>
parents: 1083
diff changeset
   283
    "called if a method is invoked with invalid parameters"
7688148ec90c Code formatting & clean up
Stefan Vogel <sv@exept.de>
parents: 1083
diff changeset
   284
1059
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   285
    self zerror:'invalid arguments'.
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   286
!
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   287
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   288
pastEnd
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   289
    self zerror:'end of stream'.
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   290
!
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   291
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   292
zerror:anError
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   293
    |error|
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   294
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   295
    zstream isNil ifTrue:[
1195
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   296
	error := 'not open'.
1059
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   297
    ] ifFalse:[
1195
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   298
	anError isNumber ifTrue:[
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   299
		     anError ==  1 ifTrue:[ error := 'stream at end' ]
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   300
	    ifFalse:[anError == -1 ifTrue:[ error := 'processing error: ', anError printString ]
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   301
	    ifFalse:[anError == -2 ifTrue:[ error := 'processing error' ]
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   302
	    ifFalse:[anError == -3 ifTrue:[ error := 'input data are corrupted' ]
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   303
	    ifFalse:[anError == -4 ifTrue:[ error := 'not enough memory' ]
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   304
	    ifFalse:[anError == -5 ifTrue:[ error := 'not enough memory in the output stream' ]
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   305
	    ifFalse:[anError == -6 ifTrue:[ error := 'version error' ]
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   306
	    ifFalse:[
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   307
		    error := 'compressing error: ', anError printString                
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   308
	    ]]]]]]].
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   309
	] ifFalse:[
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   310
	    error := anError printString
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   311
	].
1059
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   312
    ].
1061
be824dc5e0e7 *** empty log message ***
ca
parents: 1059
diff changeset
   313
    self closeZStream.
1059
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   314
    Stream streamErrorSignal raiseErrorString:(self class name , ': ', error).
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   315
! !
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   316
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   317
!CompressionStream methodsFor:'finalization'!
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   318
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   319
executor
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   320
    "redefined to return a lightweight copy 
1193
7688148ec90c Code formatting & clean up
Stefan Vogel <sv@exept.de>
parents: 1083
diff changeset
   321
     - all we need is the memory handle"
7688148ec90c Code formatting & clean up
Stefan Vogel <sv@exept.de>
parents: 1083
diff changeset
   322
1059
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   323
    ^ self class basicNew finalizeCopy:zstream.    
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   324
!
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   325
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   326
finalize
1061
be824dc5e0e7 *** empty log message ***
ca
parents: 1059
diff changeset
   327
    "the compressin-stream was garbage collected;
1193
7688148ec90c Code formatting & clean up
Stefan Vogel <sv@exept.de>
parents: 1083
diff changeset
   328
     close the underlying zip-stream"
7688148ec90c Code formatting & clean up
Stefan Vogel <sv@exept.de>
parents: 1083
diff changeset
   329
1061
be824dc5e0e7 *** empty log message ***
ca
parents: 1059
diff changeset
   330
    self closeZStream.
1059
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   331
!
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   332
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   333
finalizeCopy:aZStream
1193
7688148ec90c Code formatting & clean up
Stefan Vogel <sv@exept.de>
parents: 1083
diff changeset
   334
    "used for finalization to close the underlying zip-stream"
7688148ec90c Code formatting & clean up
Stefan Vogel <sv@exept.de>
parents: 1083
diff changeset
   335
1059
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   336
    zstream := aZStream.
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   337
! !
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   338
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   339
!CompressionStream methodsFor:'low level'!
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   340
1079
b6e148cf5df4 *** empty log message ***
ca
parents: 1062
diff changeset
   341
z_nextAvailableInto:aCollection startingAt:offset
b6e148cf5df4 *** empty log message ***
ca
parents: 1062
diff changeset
   342
    "read the next available bytes into a collection, a string or byteArray;
1193
7688148ec90c Code formatting & clean up
Stefan Vogel <sv@exept.de>
parents: 1083
diff changeset
   343
     returns the size read"
7688148ec90c Code formatting & clean up
Stefan Vogel <sv@exept.de>
parents: 1083
diff changeset
   344
1079
b6e148cf5df4 *** empty log message ***
ca
parents: 1062
diff changeset
   345
    |start count avail|
b6e148cf5df4 *** empty log message ***
ca
parents: 1062
diff changeset
   346
b6e148cf5df4 *** empty log message ***
ca
parents: 1062
diff changeset
   347
    avail := readLimit - position.
b6e148cf5df4 *** empty log message ***
ca
parents: 1062
diff changeset
   348
    avail > 0 ifFalse:[^ 0].
b6e148cf5df4 *** empty log message ***
ca
parents: 1062
diff changeset
   349
b6e148cf5df4 *** empty log message ***
ca
parents: 1062
diff changeset
   350
    count := aCollection size - offset + 1.
b6e148cf5df4 *** empty log message ***
ca
parents: 1062
diff changeset
   351
b6e148cf5df4 *** empty log message ***
ca
parents: 1062
diff changeset
   352
    count > 0 ifFalse:[
1195
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   353
	count < 0 ifTrue:[
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   354
	    self zerror:'invalid arguments'
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   355
	].
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   356
	^ 0
1079
b6e148cf5df4 *** empty log message ***
ca
parents: 1062
diff changeset
   357
    ].
b6e148cf5df4 *** empty log message ***
ca
parents: 1062
diff changeset
   358
    count    := avail min:count.
b6e148cf5df4 *** empty log message ***
ca
parents: 1062
diff changeset
   359
    start    := position.
b6e148cf5df4 *** empty log message ***
ca
parents: 1062
diff changeset
   360
    position := position + count.
b6e148cf5df4 *** empty log message ***
ca
parents: 1062
diff changeset
   361
b6e148cf5df4 *** empty log message ***
ca
parents: 1062
diff changeset
   362
%{  unsigned char * _dstPt;
b6e148cf5df4 *** empty log message ***
ca
parents: 1062
diff changeset
   363
b6e148cf5df4 *** empty log message ***
ca
parents: 1062
diff changeset
   364
    if( __isBytes(aCollection) ) {
1195
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   365
	_dstPt = (unsigned char *) (__ByteArrayInstPtr(aCollection)->ba_element);
1079
b6e148cf5df4 *** empty log message ***
ca
parents: 1062
diff changeset
   366
    } else if (__isString(aCollection)) {
1195
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   367
	_dstPt = (unsigned char *) (__stringVal( aCollection));
1079
b6e148cf5df4 *** empty log message ***
ca
parents: 1062
diff changeset
   368
    } else
1195
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   369
	_dstPt = (unsigned char *) 0;
1079
b6e148cf5df4 *** empty log message ***
ca
parents: 1062
diff changeset
   370
b6e148cf5df4 *** empty log message ***
ca
parents: 1062
diff changeset
   371
    if( _dstPt )
b6e148cf5df4 *** empty log message ***
ca
parents: 1062
diff changeset
   372
    {
1195
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   373
	int             _loop, _count, _offset;
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   374
	unsigned char * _srcPt;
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   375
	OBJ             _srcObj = __INST( outputBytes );
1079
b6e148cf5df4 *** empty log message ***
ca
parents: 1062
diff changeset
   376
1195
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   377
	_offset = __intVal( offset );
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   378
	_dstPt  = _dstPt + _offset - 1;
1079
b6e148cf5df4 *** empty log message ***
ca
parents: 1062
diff changeset
   379
1195
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   380
	_srcPt  = (unsigned char *) __externalBytesAddress( _srcObj );
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   381
	_srcPt += __intVal( start );
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   382
	_count  = __intVal( count );
1079
b6e148cf5df4 *** empty log message ***
ca
parents: 1062
diff changeset
   383
1195
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   384
	for( _loop = 0; _loop < _count; ++_loop )
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   385
	    * _dstPt++ = * _srcPt++;
1079
b6e148cf5df4 *** empty log message ***
ca
parents: 1062
diff changeset
   386
1195
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   387
	RETURN(__MKSMALLINT(_count));
1079
b6e148cf5df4 *** empty log message ***
ca
parents: 1062
diff changeset
   388
    }
b6e148cf5df4 *** empty log message ***
ca
parents: 1062
diff changeset
   389
%}.
b6e148cf5df4 *** empty log message ***
ca
parents: 1062
diff changeset
   390
b6e148cf5df4 *** empty log message ***
ca
parents: 1062
diff changeset
   391
    ^ self zerror:'invalid argument'
b6e148cf5df4 *** empty log message ***
ca
parents: 1062
diff changeset
   392
!
b6e148cf5df4 *** empty log message ***
ca
parents: 1062
diff changeset
   393
1193
7688148ec90c Code formatting & clean up
Stefan Vogel <sv@exept.de>
parents: 1083
diff changeset
   394
zclose
7688148ec90c Code formatting & clean up
Stefan Vogel <sv@exept.de>
parents: 1083
diff changeset
   395
    "low level close of the zip stream"
7688148ec90c Code formatting & clean up
Stefan Vogel <sv@exept.de>
parents: 1083
diff changeset
   396
7688148ec90c Code formatting & clean up
Stefan Vogel <sv@exept.de>
parents: 1083
diff changeset
   397
    ^ self subclassResponsibility
7688148ec90c Code formatting & clean up
Stefan Vogel <sv@exept.de>
parents: 1083
diff changeset
   398
!
7688148ec90c Code formatting & clean up
Stefan Vogel <sv@exept.de>
parents: 1083
diff changeset
   399
7688148ec90c Code formatting & clean up
Stefan Vogel <sv@exept.de>
parents: 1083
diff changeset
   400
zdeflate
7688148ec90c Code formatting & clean up
Stefan Vogel <sv@exept.de>
parents: 1083
diff changeset
   401
    "low level - deflate
7688148ec90c Code formatting & clean up
Stefan Vogel <sv@exept.de>
parents: 1083
diff changeset
   402
     returns false if the deflate operation is finished otherwise true"
7688148ec90c Code formatting & clean up
Stefan Vogel <sv@exept.de>
parents: 1083
diff changeset
   403
7688148ec90c Code formatting & clean up
Stefan Vogel <sv@exept.de>
parents: 1083
diff changeset
   404
    ^ self subclassResponsibility
7688148ec90c Code formatting & clean up
Stefan Vogel <sv@exept.de>
parents: 1083
diff changeset
   405
!
7688148ec90c Code formatting & clean up
Stefan Vogel <sv@exept.de>
parents: 1083
diff changeset
   406
7688148ec90c Code formatting & clean up
Stefan Vogel <sv@exept.de>
parents: 1083
diff changeset
   407
zdeflateInit
7688148ec90c Code formatting & clean up
Stefan Vogel <sv@exept.de>
parents: 1083
diff changeset
   408
    "low level - deflateInit
7688148ec90c Code formatting & clean up
Stefan Vogel <sv@exept.de>
parents: 1083
diff changeset
   409
     initialize the deflate mode, write header"
7688148ec90c Code formatting & clean up
Stefan Vogel <sv@exept.de>
parents: 1083
diff changeset
   410
7688148ec90c Code formatting & clean up
Stefan Vogel <sv@exept.de>
parents: 1083
diff changeset
   411
    ^ self subclassResponsibility
7688148ec90c Code formatting & clean up
Stefan Vogel <sv@exept.de>
parents: 1083
diff changeset
   412
!
7688148ec90c Code formatting & clean up
Stefan Vogel <sv@exept.de>
parents: 1083
diff changeset
   413
7688148ec90c Code formatting & clean up
Stefan Vogel <sv@exept.de>
parents: 1083
diff changeset
   414
zget_avail_out
7688148ec90c Code formatting & clean up
Stefan Vogel <sv@exept.de>
parents: 1083
diff changeset
   415
    "low level - get the number of available out bytes"
7688148ec90c Code formatting & clean up
Stefan Vogel <sv@exept.de>
parents: 1083
diff changeset
   416
7688148ec90c Code formatting & clean up
Stefan Vogel <sv@exept.de>
parents: 1083
diff changeset
   417
    ^ self subclassResponsibility
7688148ec90c Code formatting & clean up
Stefan Vogel <sv@exept.de>
parents: 1083
diff changeset
   418
!
7688148ec90c Code formatting & clean up
Stefan Vogel <sv@exept.de>
parents: 1083
diff changeset
   419
7688148ec90c Code formatting & clean up
Stefan Vogel <sv@exept.de>
parents: 1083
diff changeset
   420
zinflate
7688148ec90c Code formatting & clean up
Stefan Vogel <sv@exept.de>
parents: 1083
diff changeset
   421
    "low level - inflate
7688148ec90c Code formatting & clean up
Stefan Vogel <sv@exept.de>
parents: 1083
diff changeset
   422
     returns nil if at uncompress is finished, or the number of
7688148ec90c Code formatting & clean up
Stefan Vogel <sv@exept.de>
parents: 1083
diff changeset
   423
     available bytes in the output-buffer"
7688148ec90c Code formatting & clean up
Stefan Vogel <sv@exept.de>
parents: 1083
diff changeset
   424
7688148ec90c Code formatting & clean up
Stefan Vogel <sv@exept.de>
parents: 1083
diff changeset
   425
    ^ self subclassResponsibility
7688148ec90c Code formatting & clean up
Stefan Vogel <sv@exept.de>
parents: 1083
diff changeset
   426
!
7688148ec90c Code formatting & clean up
Stefan Vogel <sv@exept.de>
parents: 1083
diff changeset
   427
7688148ec90c Code formatting & clean up
Stefan Vogel <sv@exept.de>
parents: 1083
diff changeset
   428
zinflateInit
7688148ec90c Code formatting & clean up
Stefan Vogel <sv@exept.de>
parents: 1083
diff changeset
   429
    "low level - inflateInit
7688148ec90c Code formatting & clean up
Stefan Vogel <sv@exept.de>
parents: 1083
diff changeset
   430
     initialize the inflate mode, read and check header"
7688148ec90c Code formatting & clean up
Stefan Vogel <sv@exept.de>
parents: 1083
diff changeset
   431
7688148ec90c Code formatting & clean up
Stefan Vogel <sv@exept.de>
parents: 1083
diff changeset
   432
    ^ self subclassResponsibility
7688148ec90c Code formatting & clean up
Stefan Vogel <sv@exept.de>
parents: 1083
diff changeset
   433
!
7688148ec90c Code formatting & clean up
Stefan Vogel <sv@exept.de>
parents: 1083
diff changeset
   434
1059
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   435
zopen
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   436
    "low level - opens the zip stream
1193
7688148ec90c Code formatting & clean up
Stefan Vogel <sv@exept.de>
parents: 1083
diff changeset
   437
     create the resources"
7688148ec90c Code formatting & clean up
Stefan Vogel <sv@exept.de>
parents: 1083
diff changeset
   438
1059
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   439
    ^ self subclassResponsibility
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   440
!
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   441
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   442
zset_avail_in:count
1193
7688148ec90c Code formatting & clean up
Stefan Vogel <sv@exept.de>
parents: 1083
diff changeset
   443
    "set the 'avail_in' and compute the crc"
7688148ec90c Code formatting & clean up
Stefan Vogel <sv@exept.de>
parents: 1083
diff changeset
   444
1059
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   445
    ^ self subclassResponsibility
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   446
! !
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   447
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   448
!CompressionStream methodsFor:'private'!
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   449
1061
be824dc5e0e7 *** empty log message ***
ca
parents: 1059
diff changeset
   450
closeZStream
1193
7688148ec90c Code formatting & clean up
Stefan Vogel <sv@exept.de>
parents: 1083
diff changeset
   451
    "close the zip-stream"
7688148ec90c Code formatting & clean up
Stefan Vogel <sv@exept.de>
parents: 1083
diff changeset
   452
1061
be824dc5e0e7 *** empty log message ***
ca
parents: 1059
diff changeset
   453
    onStream := mode := nil.
be824dc5e0e7 *** empty log message ***
ca
parents: 1059
diff changeset
   454
    hitEOF   := true.
be824dc5e0e7 *** empty log message ***
ca
parents: 1059
diff changeset
   455
be824dc5e0e7 *** empty log message ***
ca
parents: 1059
diff changeset
   456
    zstream ifNotNil:[
1195
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   457
	self unregisterForFinalization.
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   458
	self zclose.
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   459
	zstream := nil.
1061
be824dc5e0e7 *** empty log message ***
ca
parents: 1059
diff changeset
   460
    ].
be824dc5e0e7 *** empty log message ***
ca
parents: 1059
diff changeset
   461
!
be824dc5e0e7 *** empty log message ***
ca
parents: 1059
diff changeset
   462
1081
40e1129995f5 *** empty log message ***
ca
parents: 1080
diff changeset
   463
contentsSpecies
1193
7688148ec90c Code formatting & clean up
Stefan Vogel <sv@exept.de>
parents: 1083
diff changeset
   464
    "return the kind of object to be returned by sub-collection builders"
7688148ec90c Code formatting & clean up
Stefan Vogel <sv@exept.de>
parents: 1083
diff changeset
   465
7688148ec90c Code formatting & clean up
Stefan Vogel <sv@exept.de>
parents: 1083
diff changeset
   466
    binary == true ifTrue:[^ ByteArray].
7688148ec90c Code formatting & clean up
Stefan Vogel <sv@exept.de>
parents: 1083
diff changeset
   467
    ^ String
1081
40e1129995f5 *** empty log message ***
ca
parents: 1080
diff changeset
   468
!
40e1129995f5 *** empty log message ***
ca
parents: 1080
diff changeset
   469
1059
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   470
onStreamPutBytes:count from:data
1193
7688148ec90c Code formatting & clean up
Stefan Vogel <sv@exept.de>
parents: 1083
diff changeset
   471
    "write compressed data to the (output) stream"
7688148ec90c Code formatting & clean up
Stefan Vogel <sv@exept.de>
parents: 1083
diff changeset
   472
7688148ec90c Code formatting & clean up
Stefan Vogel <sv@exept.de>
parents: 1083
diff changeset
   473
    onStream isNil ifTrue:[self errorNotOpen].
1059
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   474
    onStream nextPutBytes:count from:data startingAt:1
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   475
! !
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   476
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   477
!CompressionStream methodsFor:'queries'!
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   478
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   479
atEnd
1193
7688148ec90c Code formatting & clean up
Stefan Vogel <sv@exept.de>
parents: 1083
diff changeset
   480
    "return true if the end of the compressed input stream has been reached"
7688148ec90c Code formatting & clean up
Stefan Vogel <sv@exept.de>
parents: 1083
diff changeset
   481
1059
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   482
    ^ hitEOF ~~ false
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   483
!
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   484
1062
211b3cb6d628 *** empty log message ***
ca
parents: 1061
diff changeset
   485
canReadWithoutBlocking
211b3cb6d628 *** empty log message ***
ca
parents: 1061
diff changeset
   486
    "returns true if data are available for reading;
211b3cb6d628 *** empty log message ***
ca
parents: 1061
diff changeset
   487
     false if the stream is at end.
1193
7688148ec90c Code formatting & clean up
Stefan Vogel <sv@exept.de>
parents: 1083
diff changeset
   488
     updates the readLimit and position"
7688148ec90c Code formatting & clean up
Stefan Vogel <sv@exept.de>
parents: 1083
diff changeset
   489
1062
211b3cb6d628 *** empty log message ***
ca
parents: 1061
diff changeset
   490
    mode == #readonly ifFalse:[
1195
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   491
	self errorReadOnly
1062
211b3cb6d628 *** empty log message ***
ca
parents: 1061
diff changeset
   492
    ].
211b3cb6d628 *** empty log message ***
ca
parents: 1061
diff changeset
   493
    hitEOF == true ifTrue:[ ^ false ].
211b3cb6d628 *** empty log message ***
ca
parents: 1061
diff changeset
   494
211b3cb6d628 *** empty log message ***
ca
parents: 1061
diff changeset
   495
    position >= readLimit ifTrue:[
1195
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   496
	[ (readLimit := self zinflate) == 0 ] whileTrue:[ |n|
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   497
	    n := onStream nextBytes:(inputBytes size) into:inputBytes startingAt:1.
1062
211b3cb6d628 *** empty log message ***
ca
parents: 1061
diff changeset
   498
1195
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   499
	    (n notNil and:[n > 0]) ifFalse:[
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   500
		self pastEnd
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   501
	    ].
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   502
	    self zset_avail_in:n.
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   503
	].
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   504
	readLimit ifNil:[
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   505
	    hitEOF := true.
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   506
	  ^ false
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   507
	].
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   508
	position := 0.
1062
211b3cb6d628 *** empty log message ***
ca
parents: 1061
diff changeset
   509
    ].
211b3cb6d628 *** empty log message ***
ca
parents: 1061
diff changeset
   510
    ^ true
211b3cb6d628 *** empty log message ***
ca
parents: 1061
diff changeset
   511
!
211b3cb6d628 *** empty log message ***
ca
parents: 1061
diff changeset
   512
1059
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   513
isBinary
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   514
    "return true, if the stream is in binary (as opposed to text-) mode.
1193
7688148ec90c Code formatting & clean up
Stefan Vogel <sv@exept.de>
parents: 1083
diff changeset
   515
     The default when created is false"
7688148ec90c Code formatting & clean up
Stefan Vogel <sv@exept.de>
parents: 1083
diff changeset
   516
1059
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   517
    ^ binary
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   518
!
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   519
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   520
isOpen
1193
7688148ec90c Code formatting & clean up
Stefan Vogel <sv@exept.de>
parents: 1083
diff changeset
   521
    "return true, if this stream is open"
7688148ec90c Code formatting & clean up
Stefan Vogel <sv@exept.de>
parents: 1083
diff changeset
   522
1059
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   523
    ^ onStream notNil
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   524
!
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   525
1193
7688148ec90c Code formatting & clean up
Stefan Vogel <sv@exept.de>
parents: 1083
diff changeset
   526
isReadable
7688148ec90c Code formatting & clean up
Stefan Vogel <sv@exept.de>
parents: 1083
diff changeset
   527
    "return true, if this stream can be read from"
7688148ec90c Code formatting & clean up
Stefan Vogel <sv@exept.de>
parents: 1083
diff changeset
   528
1059
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   529
    ^ mode == #readonly
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   530
!
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   531
1193
7688148ec90c Code formatting & clean up
Stefan Vogel <sv@exept.de>
parents: 1083
diff changeset
   532
isWritable
7688148ec90c Code formatting & clean up
Stefan Vogel <sv@exept.de>
parents: 1083
diff changeset
   533
    "return true, if this stream can be written to"
7688148ec90c Code formatting & clean up
Stefan Vogel <sv@exept.de>
parents: 1083
diff changeset
   534
1059
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   535
    ^ mode == #writeonly
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   536
! !
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   537
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   538
!CompressionStream methodsFor:'reading'!
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   539
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   540
contents
1193
7688148ec90c Code formatting & clean up
Stefan Vogel <sv@exept.de>
parents: 1083
diff changeset
   541
    "return the entire contents of and close the stream"
7688148ec90c Code formatting & clean up
Stefan Vogel <sv@exept.de>
parents: 1083
diff changeset
   542
1081
40e1129995f5 *** empty log message ***
ca
parents: 1080
diff changeset
   543
    |species stream bfsize buffer count|
1059
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   544
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   545
    mode == #readonly ifFalse:[ self errorReadOnly ].
1062
211b3cb6d628 *** empty log message ***
ca
parents: 1061
diff changeset
   546
    bfsize := outputBytes size.
1059
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   547
1081
40e1129995f5 *** empty log message ***
ca
parents: 1080
diff changeset
   548
    species := self contentsSpecies.
40e1129995f5 *** empty log message ***
ca
parents: 1080
diff changeset
   549
    buffer  := species new:bfsize.
40e1129995f5 *** empty log message ***
ca
parents: 1080
diff changeset
   550
    stream  := (species new:bfsize) writeStream.
1079
b6e148cf5df4 *** empty log message ***
ca
parents: 1062
diff changeset
   551
b6e148cf5df4 *** empty log message ***
ca
parents: 1062
diff changeset
   552
    [ self canReadWithoutBlocking ] whileTrue:[
1195
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   553
	count := self z_nextAvailableInto:buffer startingAt:1.
1079
b6e148cf5df4 *** empty log message ***
ca
parents: 1062
diff changeset
   554
1195
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   555
	count == bfsize ifTrue:[
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   556
	    stream nextPutAll:buffer.
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   557
	] ifFalse:[
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   558
	    count > 0 ifTrue:[    
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   559
		stream nextPutAll:(buffer copyFrom:1 to:count)
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   560
	    ]
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   561
	].
1059
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   562
    ].
1062
211b3cb6d628 *** empty log message ***
ca
parents: 1061
diff changeset
   563
    self close.
1193
7688148ec90c Code formatting & clean up
Stefan Vogel <sv@exept.de>
parents: 1083
diff changeset
   564
    ^ stream contents
1059
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   565
!
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   566
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   567
next
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   568
    "return the next element, a character or byte (textmode)
1193
7688148ec90c Code formatting & clean up
Stefan Vogel <sv@exept.de>
parents: 1083
diff changeset
   569
     return nil, if there are no more elements"
7688148ec90c Code formatting & clean up
Stefan Vogel <sv@exept.de>
parents: 1083
diff changeset
   570
1059
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   571
    |byte|
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   572
1062
211b3cb6d628 *** empty log message ***
ca
parents: 1061
diff changeset
   573
    self canReadWithoutBlocking ifFalse:[
1195
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   574
	"there is no more element; the stream is at end"
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   575
	^ nil
1059
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   576
    ].
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   577
    position := position + 1.
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   578
    byte := outputBytes at:position.
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   579
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   580
    binary ifTrue:[^ byte ].
1193
7688148ec90c Code formatting & clean up
Stefan Vogel <sv@exept.de>
parents: 1083
diff changeset
   581
    ^ Character value:byte
1082
3086d4d4f0b9 *** empty log message ***
ca
parents: 1081
diff changeset
   582
!
3086d4d4f0b9 *** empty log message ***
ca
parents: 1081
diff changeset
   583
3086d4d4f0b9 *** empty log message ***
ca
parents: 1081
diff changeset
   584
next:n
3086d4d4f0b9 *** empty log message ***
ca
parents: 1081
diff changeset
   585
    "return the next count elements of the stream as a collection.
1193
7688148ec90c Code formatting & clean up
Stefan Vogel <sv@exept.de>
parents: 1083
diff changeset
   586
     Redefined to return a String or ByteArray and for optimization"
7688148ec90c Code formatting & clean up
Stefan Vogel <sv@exept.de>
parents: 1083
diff changeset
   587
1082
3086d4d4f0b9 *** empty log message ***
ca
parents: 1081
diff changeset
   588
    |data count offset species|
3086d4d4f0b9 *** empty log message ***
ca
parents: 1081
diff changeset
   589
3086d4d4f0b9 *** empty log message ***
ca
parents: 1081
diff changeset
   590
    species := self contentsSpecies.
3086d4d4f0b9 *** empty log message ***
ca
parents: 1081
diff changeset
   591
3086d4d4f0b9 *** empty log message ***
ca
parents: 1081
diff changeset
   592
    self canReadWithoutBlocking ifFalse:[
1195
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   593
	^ species new
1082
3086d4d4f0b9 *** empty log message ***
ca
parents: 1081
diff changeset
   594
    ].
3086d4d4f0b9 *** empty log message ***
ca
parents: 1081
diff changeset
   595
    data := species new:n.
3086d4d4f0b9 *** empty log message ***
ca
parents: 1081
diff changeset
   596
    offset := 1.
3086d4d4f0b9 *** empty log message ***
ca
parents: 1081
diff changeset
   597
1193
7688148ec90c Code formatting & clean up
Stefan Vogel <sv@exept.de>
parents: 1083
diff changeset
   598
    [self canReadWithoutBlocking] whileTrue:[
1195
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   599
	count  := self z_nextAvailableInto:data startingAt:offset.
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   600
	offset := count + offset.
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   601
	offset > n ifTrue:[^ data]
1082
3086d4d4f0b9 *** empty log message ***
ca
parents: 1081
diff changeset
   602
    ].
3086d4d4f0b9 *** empty log message ***
ca
parents: 1081
diff changeset
   603
    ^ data copyFrom:1 to:(offset - 1)
3086d4d4f0b9 *** empty log message ***
ca
parents: 1081
diff changeset
   604
!
3086d4d4f0b9 *** empty log message ***
ca
parents: 1081
diff changeset
   605
3086d4d4f0b9 *** empty log message ***
ca
parents: 1081
diff changeset
   606
skip:count 
3086d4d4f0b9 *** empty log message ***
ca
parents: 1081
diff changeset
   607
    "skip count objects, return the receiver
1193
7688148ec90c Code formatting & clean up
Stefan Vogel <sv@exept.de>
parents: 1083
diff changeset
   608
     redefined for optimization"
7688148ec90c Code formatting & clean up
Stefan Vogel <sv@exept.de>
parents: 1083
diff changeset
   609
1082
3086d4d4f0b9 *** empty log message ***
ca
parents: 1081
diff changeset
   610
    |n avail|
3086d4d4f0b9 *** empty log message ***
ca
parents: 1081
diff changeset
   611
3086d4d4f0b9 *** empty log message ***
ca
parents: 1081
diff changeset
   612
    n := count.
3086d4d4f0b9 *** empty log message ***
ca
parents: 1081
diff changeset
   613
1193
7688148ec90c Code formatting & clean up
Stefan Vogel <sv@exept.de>
parents: 1083
diff changeset
   614
    n <= 0 ifTrue:[
1195
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   615
	n ~~ 0 ifTrue:[
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   616
	    "dont know how to unread ..."
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   617
	    PositionErrorSignal raiseRequest
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   618
	].
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   619
	^ self
1083
5a0ae155f400 *** empty log message ***
ca
parents: 1082
diff changeset
   620
    ].
5a0ae155f400 *** empty log message ***
ca
parents: 1082
diff changeset
   621
1193
7688148ec90c Code formatting & clean up
Stefan Vogel <sv@exept.de>
parents: 1083
diff changeset
   622
    [self canReadWithoutBlocking] whileTrue:[
1195
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   623
	avail := readLimit - position.
1082
3086d4d4f0b9 *** empty log message ***
ca
parents: 1081
diff changeset
   624
1195
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   625
	avail >= n ifTrue:[
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   626
	    position := position + n.
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   627
	    ^ self
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   628
	].
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   629
	position := readLimit := 0. "/ reset input
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   630
	n := n - avail.
1082
3086d4d4f0b9 *** empty log message ***
ca
parents: 1081
diff changeset
   631
    ].
1059
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   632
! !
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   633
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   634
!CompressionStream methodsFor:'startup & release'!
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   635
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   636
close
1193
7688148ec90c Code formatting & clean up
Stefan Vogel <sv@exept.de>
parents: 1083
diff changeset
   637
    "close the zip-stream"
7688148ec90c Code formatting & clean up
Stefan Vogel <sv@exept.de>
parents: 1083
diff changeset
   638
1059
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   639
    hitEOF := true.
1193
7688148ec90c Code formatting & clean up
Stefan Vogel <sv@exept.de>
parents: 1083
diff changeset
   640
    zstream notNil ifTrue:[
1195
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   641
	self flush.
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   642
	self closeZStream.
1059
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   643
    ].
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   644
!
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   645
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   646
openWithMode:aMode on:aStream
1061
be824dc5e0e7 *** empty log message ***
ca
parents: 1059
diff changeset
   647
    "open the zip-stream on a stream
1195
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   648
	 #readonly    uncompress the data derived from the read-stream,  aStream
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   649
	 #writeonly   compress   the data and write to the write-stream, aStream
1061
be824dc5e0e7 *** empty log message ***
ca
parents: 1059
diff changeset
   650
    "
1059
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   651
    (onStream := aStream) ifNil:[ self errorNotOpen ].
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   652
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   653
    mode        := aMode.
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   654
    outputBytes := ExternalBytes unprotectedNew:8192.
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   655
    inputBytes  := ExternalBytes unprotectedNew:8192.
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   656
    readLimit   := position := 0.
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   657
    binary      := false.
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   658
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   659
    self zopen.
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   660
    self registerForFinalization.
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   661
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   662
    hitEOF := false.
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   663
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   664
    aMode == #readonly ifTrue:[
1195
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   665
	self zinflateInit.
1059
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   666
    ] ifFalse:[
1195
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   667
	self zdeflateInit
1059
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   668
    ].
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   669
! !
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   670
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   671
!CompressionStream methodsFor:'writing'!
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   672
1062
211b3cb6d628 *** empty log message ***
ca
parents: 1061
diff changeset
   673
contents:contents
1193
7688148ec90c Code formatting & clean up
Stefan Vogel <sv@exept.de>
parents: 1083
diff changeset
   674
    "write the entire contents to and close the stream"
7688148ec90c Code formatting & clean up
Stefan Vogel <sv@exept.de>
parents: 1083
diff changeset
   675
7688148ec90c Code formatting & clean up
Stefan Vogel <sv@exept.de>
parents: 1083
diff changeset
   676
    contents do:[:c| self nextPut:c].
1062
211b3cb6d628 *** empty log message ***
ca
parents: 1061
diff changeset
   677
    self close.
211b3cb6d628 *** empty log message ***
ca
parents: 1061
diff changeset
   678
!
211b3cb6d628 *** empty log message ***
ca
parents: 1061
diff changeset
   679
1059
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   680
flush
1193
7688148ec90c Code formatting & clean up
Stefan Vogel <sv@exept.de>
parents: 1083
diff changeset
   681
    "flush the input and output buffer"
7688148ec90c Code formatting & clean up
Stefan Vogel <sv@exept.de>
parents: 1083
diff changeset
   682
1059
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   683
    |continue|
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   684
1193
7688148ec90c Code formatting & clean up
Stefan Vogel <sv@exept.de>
parents: 1083
diff changeset
   685
    self isWritable ifFalse:[ ^ self ].
1059
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   686
    self zset_avail_in:position.
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   687
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   688
    position := 0.
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   689
    continue := true.
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   690
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   691
    [continue] whileTrue:[ |count|
1195
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   692
	count := self zget_avail_out.
1059
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   693
1195
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   694
	count > 0 ifTrue:[
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   695
	    self onStreamPutBytes:count from:outputBytes
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   696
	].
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   697
	continue := self zdeflate.
1059
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   698
    ].
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   699
!
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   700
1193
7688148ec90c Code formatting & clean up
Stefan Vogel <sv@exept.de>
parents: 1083
diff changeset
   701
nextPut:aByteOrCharacter
7688148ec90c Code formatting & clean up
Stefan Vogel <sv@exept.de>
parents: 1083
diff changeset
   702
    "write the argument, aByteOrCharacter"
1059
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   703
1193
7688148ec90c Code formatting & clean up
Stefan Vogel <sv@exept.de>
parents: 1083
diff changeset
   704
    position == inputBytes size ifTrue:[self flush].
7688148ec90c Code formatting & clean up
Stefan Vogel <sv@exept.de>
parents: 1083
diff changeset
   705
    position := position + 1.
7688148ec90c Code formatting & clean up
Stefan Vogel <sv@exept.de>
parents: 1083
diff changeset
   706
    inputBytes at:position put:aByteOrCharacter asInteger.
7688148ec90c Code formatting & clean up
Stefan Vogel <sv@exept.de>
parents: 1083
diff changeset
   707
! !
1059
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   708
1193
7688148ec90c Code formatting & clean up
Stefan Vogel <sv@exept.de>
parents: 1083
diff changeset
   709
!CompressionStream class methodsFor:'documentation'!
1059
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   710
1193
7688148ec90c Code formatting & clean up
Stefan Vogel <sv@exept.de>
parents: 1083
diff changeset
   711
version
1195
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   712
    ^ '$Header: /cvs/stx/stx/libbasic2/CompressionStream.st,v 1.10 2003-05-06 16:19:20 stefan Exp $'
1059
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   713
! !
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   714
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   715
CompressionStream initialize!