ZipStream.st
author ca
Wed, 26 Jun 2002 08:44:39 +0200
changeset 1061 be824dc5e0e7
parent 1060 a59e60d44eb4
child 1193 7688148ec90c
permissions -rw-r--r--
*** empty log message ***
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1047
1cd99e473c08 *** empty log message ***
ca
parents: 1046
diff changeset
     1
'From Smalltalk/X, Version:4.1.4 on 20-jun-2002 at 06:09:31 am'                 !
1cd99e473c08 *** empty log message ***
ca
parents: 1046
diff changeset
     2
1044
c73aee830691 initial checkin
ca
parents:
diff changeset
     3
"{ Package: 'ca:Compress' }"
c73aee830691 initial checkin
ca
parents:
diff changeset
     4
1059
b47e4eff5543 *** empty log message ***
ca
parents: 1058
diff changeset
     5
CompressionStream subclass:#ZipStream
1060
a59e60d44eb4 *** empty log message ***
ca
parents: 1059
diff changeset
     6
        instanceVariableNames:''
a59e60d44eb4 *** empty log message ***
ca
parents: 1059
diff changeset
     7
        classVariableNames:'Z_DEFLATED HEAD_OS_CODE HEAD_RESERVED HEAD_EXTRA_FIELD
a59e60d44eb4 *** empty log message ***
ca
parents: 1059
diff changeset
     8
                HEAD_ORIG_NAME HEAD_COMMENT HEAD_CRC GZ_MAGIC_ID'
a59e60d44eb4 *** empty log message ***
ca
parents: 1059
diff changeset
     9
        poolDictionaries:''
a59e60d44eb4 *** empty log message ***
ca
parents: 1059
diff changeset
    10
        category:'A-Compress'
1044
c73aee830691 initial checkin
ca
parents:
diff changeset
    11
!
c73aee830691 initial checkin
ca
parents:
diff changeset
    12
1045
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
    13
!ZipStream primitiveDefinitions!
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
    14
%{
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
    15
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
    16
/*
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
    17
 * includes, defines, structure definitions
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
    18
 * and typedefs come here.
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
    19
 */
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
    20
1060
a59e60d44eb4 *** empty log message ***
ca
parents: 1059
diff changeset
    21
#include "zlib/zlib.h"
a59e60d44eb4 *** empty log message ***
ca
parents: 1059
diff changeset
    22
#include "zlib/zutil.h"
1045
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
    23
1051
4f18d73427bb *** empty log message ***
ca
parents: 1050
diff changeset
    24
typedef enum {
1061
be824dc5e0e7 *** empty log message ***
ca
parents: 1060
diff changeset
    25
          e_opmode_unspecified          /* processing done */
be824dc5e0e7 *** empty log message ***
ca
parents: 1060
diff changeset
    26
        , e_opmode_deflate              /* running deflate */
be824dc5e0e7 *** empty log message ***
ca
parents: 1060
diff changeset
    27
        , e_opmode_inflate              /* running inflate */
1051
4f18d73427bb *** empty log message ***
ca
parents: 1050
diff changeset
    28
} e_opmode;
4f18d73427bb *** empty log message ***
ca
parents: 1050
diff changeset
    29
1045
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
    30
typedef struct {
1061
be824dc5e0e7 *** empty log message ***
ca
parents: 1060
diff changeset
    31
        z_stream        stream;         /* pointer to the external in -stream */
be824dc5e0e7 *** empty log message ***
ca
parents: 1060
diff changeset
    32
        Bytef *         in_ref;         /* size    of the external in -stream */
be824dc5e0e7 *** empty log message ***
ca
parents: 1060
diff changeset
    33
        Bytef *         out_ref;        /* pointer to the external out-stream */
be824dc5e0e7 *** empty log message ***
ca
parents: 1060
diff changeset
    34
        uLong           out_total;      /* size    of the external out-stream */
1045
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
    35
1061
be824dc5e0e7 *** empty log message ***
ca
parents: 1060
diff changeset
    36
        e_opmode        op_mode;        /* current operational mode */
be824dc5e0e7 *** empty log message ***
ca
parents: 1060
diff changeset
    37
        uLong           crc_32;         /* keeps the current crc */
be824dc5e0e7 *** empty log message ***
ca
parents: 1060
diff changeset
    38
be824dc5e0e7 *** empty log message ***
ca
parents: 1060
diff changeset
    39
        Bytef           tail_buff[ 8 ]; /* store the tail in the read modus */
be824dc5e0e7 *** empty log message ***
ca
parents: 1060
diff changeset
    40
        uLong           tail_size;      /* to check the crc and data length */
1045
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
    41
} zstream_s;
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
    42
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
    43
%}
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
    44
! !
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
    45
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
    46
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
    47
!ZipStream class methodsFor:'initialization'!
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
    48
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
    49
initialize
1061
be824dc5e0e7 *** empty log message ***
ca
parents: 1060
diff changeset
    50
    "setup class attributes derived from the library
be824dc5e0e7 *** empty log message ***
ca
parents: 1060
diff changeset
    51
    "
1059
b47e4eff5543 *** empty log message ***
ca
parents: 1058
diff changeset
    52
    |z_deflated os_code|
1045
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
    53
%{
1059
b47e4eff5543 *** empty log message ***
ca
parents: 1058
diff changeset
    54
    z_deflated = __MKSMALLINT( Z_DEFLATED );
b47e4eff5543 *** empty log message ***
ca
parents: 1058
diff changeset
    55
    os_code    = __MKSMALLINT( OS_CODE );
1045
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
    56
%}.
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
    57
1059
b47e4eff5543 *** empty log message ***
ca
parents: 1058
diff changeset
    58
    Z_DEFLATED            := z_deflated.
1045
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
    59
1059
b47e4eff5543 *** empty log message ***
ca
parents: 1058
diff changeset
    60
    HEAD_OS_CODE          := os_code.
1045
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
    61
    HEAD_RESERVED         := 16rE0.     " bits 5..7:  reserved "
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
    62
    HEAD_EXTRA_FIELD      := 16r04.     " bit 2 set:  extra field present "
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
    63
    HEAD_ORIG_NAME        := 16r08.     " bit 3 set:  original file name present "
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
    64
    HEAD_COMMENT          := 16r10.     " bit 4 set:  file comment present "
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
    65
    HEAD_CRC              := 16r02.     " bit 1 set:  header CRC present "
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
    66
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
    67
    GZ_MAGIC_ID           := #[ 16r1f 16r8b ]
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
    68
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
    69
! !
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
    70
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
    71
!ZipStream methodsFor:'low level'!
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
    72
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
    73
zclose
1052
055841c03c8a *** empty log message ***
ca
parents: 1051
diff changeset
    74
    "low level close of the zip stream
055841c03c8a *** empty log message ***
ca
parents: 1051
diff changeset
    75
    "
1045
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
    76
%{
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
    77
    OBJ _zstreamObj = __INST( zstream );
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
    78
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
    79
    if( _zstreamObj != nil )
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
    80
    {
1047
1cd99e473c08 *** empty log message ***
ca
parents: 1046
diff changeset
    81
        zstream_s * _zstream = (zstream_s *) __externalBytesAddress( _zstreamObj );
1045
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
    82
1047
1cd99e473c08 *** empty log message ***
ca
parents: 1046
diff changeset
    83
        __INST(zstream) = nil;
1045
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
    84
1047
1cd99e473c08 *** empty log message ***
ca
parents: 1046
diff changeset
    85
        if( _zstream->stream.state != NULL )
1cd99e473c08 *** empty log message ***
ca
parents: 1046
diff changeset
    86
        {
1051
4f18d73427bb *** empty log message ***
ca
parents: 1050
diff changeset
    87
            if( _zstream->op_mode == e_opmode_inflate )
1047
1cd99e473c08 *** empty log message ***
ca
parents: 1046
diff changeset
    88
                inflateEnd( & _zstream->stream );
1cd99e473c08 *** empty log message ***
ca
parents: 1046
diff changeset
    89
            else
1cd99e473c08 *** empty log message ***
ca
parents: 1046
diff changeset
    90
                deflateEnd( & _zstream->stream );
1cd99e473c08 *** empty log message ***
ca
parents: 1046
diff changeset
    91
        }
1cd99e473c08 *** empty log message ***
ca
parents: 1046
diff changeset
    92
        free( _zstream );
1045
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
    93
    }
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
    94
%}.
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
    95
!
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
    96
1057
9df4a60df0ef *** empty log message ***
ca
parents: 1056
diff changeset
    97
zdeflate
1052
055841c03c8a *** empty log message ***
ca
parents: 1051
diff changeset
    98
    "low level - deflate
055841c03c8a *** empty log message ***
ca
parents: 1051
diff changeset
    99
    "
1045
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
   100
    |errorNo|
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
   101
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
   102
    errorNo := nil.
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
   103
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
   104
%{
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
   105
    OBJ _zstreamObj = __INST( zstream );
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
   106
1056
44871623590b *** empty log message ***
ca
parents: 1054
diff changeset
   107
    if( _zstreamObj != nil )
1045
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
   108
    {
1056
44871623590b *** empty log message ***
ca
parents: 1054
diff changeset
   109
        int         _errorNo, _action;
1051
4f18d73427bb *** empty log message ***
ca
parents: 1050
diff changeset
   110
        uLong       _bfsize;
1047
1cd99e473c08 *** empty log message ***
ca
parents: 1046
diff changeset
   111
        zstream_s * _zstream = (zstream_s *) __externalBytesAddress( _zstreamObj );
1cd99e473c08 *** empty log message ***
ca
parents: 1046
diff changeset
   112
1051
4f18d73427bb *** empty log message ***
ca
parents: 1050
diff changeset
   113
        if( _zstream->op_mode != e_opmode_deflate )
1057
9df4a60df0ef *** empty log message ***
ca
parents: 1056
diff changeset
   114
            RETURN( false );
1051
4f18d73427bb *** empty log message ***
ca
parents: 1050
diff changeset
   115
4f18d73427bb *** empty log message ***
ca
parents: 1050
diff changeset
   116
        _bfsize = _zstream->out_total;
4f18d73427bb *** empty log message ***
ca
parents: 1050
diff changeset
   117
1050
b7e7d51e0a9f *** empty log message ***
ca
parents: 1049
diff changeset
   118
        if( _zstream->stream.state == NULL )
b7e7d51e0a9f *** empty log message ***
ca
parents: 1049
diff changeset
   119
        {
1051
4f18d73427bb *** empty log message ***
ca
parents: 1050
diff changeset
   120
            /* processing finished; write crc_32 and the total size
4f18d73427bb *** empty log message ***
ca
parents: 1050
diff changeset
   121
            */
4f18d73427bb *** empty log message ***
ca
parents: 1050
diff changeset
   122
            uLong   v, i;
4f18d73427bb *** empty log message ***
ca
parents: 1050
diff changeset
   123
            Bytef * p = _zstream->out_ref;
4f18d73427bb *** empty log message ***
ca
parents: 1050
diff changeset
   124
4f18d73427bb *** empty log message ***
ca
parents: 1050
diff changeset
   125
            v = _zstream->crc_32;
4f18d73427bb *** empty log message ***
ca
parents: 1050
diff changeset
   126
            for( i = 0; i < 4; ++i ) { p[i] = v & 0xff; v >>= 8; }
4f18d73427bb *** empty log message ***
ca
parents: 1050
diff changeset
   127
4f18d73427bb *** empty log message ***
ca
parents: 1050
diff changeset
   128
            v = _zstream->stream.total_in;
4f18d73427bb *** empty log message ***
ca
parents: 1050
diff changeset
   129
            for( i = 4; i < 8; ++i ) { p[i] = v & 0xff; v >>= 8; }
4f18d73427bb *** empty log message ***
ca
parents: 1050
diff changeset
   130
4f18d73427bb *** empty log message ***
ca
parents: 1050
diff changeset
   131
            _zstream->op_mode          = e_opmode_unspecified;
4f18d73427bb *** empty log message ***
ca
parents: 1050
diff changeset
   132
            _zstream->stream.avail_in  = 0;
4f18d73427bb *** empty log message ***
ca
parents: 1050
diff changeset
   133
            _zstream->stream.next_in   = Z_NULL;
4f18d73427bb *** empty log message ***
ca
parents: 1050
diff changeset
   134
            _zstream->stream.avail_out = _bfsize - 8;
4f18d73427bb *** empty log message ***
ca
parents: 1050
diff changeset
   135
            RETURN( true );
1050
b7e7d51e0a9f *** empty log message ***
ca
parents: 1049
diff changeset
   136
        }
1051
4f18d73427bb *** empty log message ***
ca
parents: 1050
diff changeset
   137
        _zstream->stream.avail_out = _bfsize;
1050
b7e7d51e0a9f *** empty log message ***
ca
parents: 1049
diff changeset
   138
        _zstream->stream.next_out  = _zstream->out_ref;
1056
44871623590b *** empty log message ***
ca
parents: 1054
diff changeset
   139
1057
9df4a60df0ef *** empty log message ***
ca
parents: 1056
diff changeset
   140
        _action  = (__INST(hitEOF) == true) ? Z_FINISH : Z_NO_FLUSH;        
1056
44871623590b *** empty log message ***
ca
parents: 1054
diff changeset
   141
        _errorNo = deflate( & _zstream->stream, _action );
1045
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
   142
1050
b7e7d51e0a9f *** empty log message ***
ca
parents: 1049
diff changeset
   143
        if( _errorNo == Z_STREAM_END )
1047
1cd99e473c08 *** empty log message ***
ca
parents: 1046
diff changeset
   144
        {
1050
b7e7d51e0a9f *** empty log message ***
ca
parents: 1049
diff changeset
   145
            _zstream->stream.avail_in = 0;
b7e7d51e0a9f *** empty log message ***
ca
parents: 1049
diff changeset
   146
            _zstream->stream.next_in  = Z_NULL;
b7e7d51e0a9f *** empty log message ***
ca
parents: 1049
diff changeset
   147
            _errorNo = deflateEnd( & _zstream->stream );
1047
1cd99e473c08 *** empty log message ***
ca
parents: 1046
diff changeset
   148
        }
1045
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
   149
1050
b7e7d51e0a9f *** empty log message ***
ca
parents: 1049
diff changeset
   150
        if( _errorNo == Z_OK )
b7e7d51e0a9f *** empty log message ***
ca
parents: 1049
diff changeset
   151
        {
1051
4f18d73427bb *** empty log message ***
ca
parents: 1050
diff changeset
   152
            if(   (_zstream->stream.avail_out != _bfsize)
1050
b7e7d51e0a9f *** empty log message ***
ca
parents: 1049
diff changeset
   153
               || (_zstream->stream.avail_in  != 0)
b7e7d51e0a9f *** empty log message ***
ca
parents: 1049
diff changeset
   154
              )
b7e7d51e0a9f *** empty log message ***
ca
parents: 1049
diff changeset
   155
              RETURN( true );
b7e7d51e0a9f *** empty log message ***
ca
parents: 1049
diff changeset
   156
b7e7d51e0a9f *** empty log message ***
ca
parents: 1049
diff changeset
   157
            RETURN( false );
b7e7d51e0a9f *** empty log message ***
ca
parents: 1049
diff changeset
   158
        }
1047
1cd99e473c08 *** empty log message ***
ca
parents: 1046
diff changeset
   159
        errorNo = __MKSMALLINT( _errorNo );
1045
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
   160
    }
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
   161
%}.
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
   162
    errorNo ifNil:[
1047
1cd99e473c08 *** empty log message ***
ca
parents: 1046
diff changeset
   163
        zstream ifNil:[self errorNotOpen].
1cd99e473c08 *** empty log message ***
ca
parents: 1046
diff changeset
   164
        self invalidArguments.
1045
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
   165
    ].
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
   166
    self zerror:errorNo.
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
   167
!
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
   168
1059
b47e4eff5543 *** empty log message ***
ca
parents: 1058
diff changeset
   169
zdeflateInit
1052
055841c03c8a *** empty log message ***
ca
parents: 1051
diff changeset
   170
    "low level - deflateInit
055841c03c8a *** empty log message ***
ca
parents: 1051
diff changeset
   171
    "
1059
b47e4eff5543 *** empty log message ***
ca
parents: 1058
diff changeset
   172
    |errorNo level|
1045
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
   173
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
   174
    errorNo := nil.
1059
b47e4eff5543 *** empty log message ***
ca
parents: 1058
diff changeset
   175
    level   := BlockSize.
1045
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
   176
%{
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
   177
    OBJ _zstreamObj = __INST( zstream );
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
   178
1059
b47e4eff5543 *** empty log message ***
ca
parents: 1058
diff changeset
   179
    if( (_zstreamObj != nil) && __isSmallInteger(level) )
1045
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
   180
    {
1047
1cd99e473c08 *** empty log message ***
ca
parents: 1046
diff changeset
   181
        int         _errorNo;
1cd99e473c08 *** empty log message ***
ca
parents: 1046
diff changeset
   182
        zstream_s * _zstream = (zstream_s *) __externalBytesAddress( _zstreamObj );
1045
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
   183
1051
4f18d73427bb *** empty log message ***
ca
parents: 1050
diff changeset
   184
        _zstream->op_mode = e_opmode_deflate;
4f18d73427bb *** empty log message ***
ca
parents: 1050
diff changeset
   185
1047
1cd99e473c08 *** empty log message ***
ca
parents: 1046
diff changeset
   186
        _errorNo = deflateInit2( & _zstream->stream
1059
b47e4eff5543 *** empty log message ***
ca
parents: 1058
diff changeset
   187
                               , __intVal( level )
1047
1cd99e473c08 *** empty log message ***
ca
parents: 1046
diff changeset
   188
                               , Z_DEFLATED
1cd99e473c08 *** empty log message ***
ca
parents: 1046
diff changeset
   189
                               , -MAX_WBITS
1059
b47e4eff5543 *** empty log message ***
ca
parents: 1058
diff changeset
   190
                               , DEF_MEM_LEVEL
b47e4eff5543 *** empty log message ***
ca
parents: 1058
diff changeset
   191
                               , Z_DEFAULT_STRATEGY
1047
1cd99e473c08 *** empty log message ***
ca
parents: 1046
diff changeset
   192
                               );
1045
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
   193
1047
1cd99e473c08 *** empty log message ***
ca
parents: 1046
diff changeset
   194
        if( _errorNo == Z_OK )
1cd99e473c08 *** empty log message ***
ca
parents: 1046
diff changeset
   195
            RETURN( self );
1045
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
   196
1047
1cd99e473c08 *** empty log message ***
ca
parents: 1046
diff changeset
   197
        errorNo = __MKSMALLINT( _errorNo );
1045
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
   198
    }
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
   199
%}.
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
   200
    errorNo ifNil:[
1047
1cd99e473c08 *** empty log message ***
ca
parents: 1046
diff changeset
   201
        zstream ifNil:[ self errorNotOpen ].
1cd99e473c08 *** empty log message ***
ca
parents: 1046
diff changeset
   202
        self invalidArguments .
1045
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
   203
    ].
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
   204
    self zerror:errorNo.
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
   205
!
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
   206
1059
b47e4eff5543 *** empty log message ***
ca
parents: 1058
diff changeset
   207
zget_avail_out
b47e4eff5543 *** empty log message ***
ca
parents: 1058
diff changeset
   208
    "low level - get the number of available out bytes
b47e4eff5543 *** empty log message ***
ca
parents: 1058
diff changeset
   209
    "
b47e4eff5543 *** empty log message ***
ca
parents: 1058
diff changeset
   210
%{
b47e4eff5543 *** empty log message ***
ca
parents: 1058
diff changeset
   211
    OBJ _zstreamObj = __INST( zstream );
b47e4eff5543 *** empty log message ***
ca
parents: 1058
diff changeset
   212
b47e4eff5543 *** empty log message ***
ca
parents: 1058
diff changeset
   213
    if( _zstreamObj != nil )
b47e4eff5543 *** empty log message ***
ca
parents: 1058
diff changeset
   214
    {
b47e4eff5543 *** empty log message ***
ca
parents: 1058
diff changeset
   215
        uInt        _count;
b47e4eff5543 *** empty log message ***
ca
parents: 1058
diff changeset
   216
        zstream_s * _zstream = (zstream_s *) __externalBytesAddress( _zstreamObj );
b47e4eff5543 *** empty log message ***
ca
parents: 1058
diff changeset
   217
b47e4eff5543 *** empty log message ***
ca
parents: 1058
diff changeset
   218
        _count = _zstream->out_total - _zstream->stream.avail_out;
b47e4eff5543 *** empty log message ***
ca
parents: 1058
diff changeset
   219
b47e4eff5543 *** empty log message ***
ca
parents: 1058
diff changeset
   220
        RETURN( __MKSMALLINT (_count) );
b47e4eff5543 *** empty log message ***
ca
parents: 1058
diff changeset
   221
    }
b47e4eff5543 *** empty log message ***
ca
parents: 1058
diff changeset
   222
%}.
b47e4eff5543 *** empty log message ***
ca
parents: 1058
diff changeset
   223
    self errorNotOpen.
b47e4eff5543 *** empty log message ***
ca
parents: 1058
diff changeset
   224
!
b47e4eff5543 *** empty log message ***
ca
parents: 1058
diff changeset
   225
1050
b7e7d51e0a9f *** empty log message ***
ca
parents: 1049
diff changeset
   226
zinflate
1052
055841c03c8a *** empty log message ***
ca
parents: 1051
diff changeset
   227
    "low level - inflate
055841c03c8a *** empty log message ***
ca
parents: 1051
diff changeset
   228
    "
1061
be824dc5e0e7 *** empty log message ***
ca
parents: 1060
diff changeset
   229
    |errorNo tailError|
1050
b7e7d51e0a9f *** empty log message ***
ca
parents: 1049
diff changeset
   230
1061
be824dc5e0e7 *** empty log message ***
ca
parents: 1060
diff changeset
   231
    tailError := nil.
be824dc5e0e7 *** empty log message ***
ca
parents: 1060
diff changeset
   232
    errorNo   := nil.
1050
b7e7d51e0a9f *** empty log message ***
ca
parents: 1049
diff changeset
   233
%{
b7e7d51e0a9f *** empty log message ***
ca
parents: 1049
diff changeset
   234
    OBJ _zstreamObj = __INST( zstream );
b7e7d51e0a9f *** empty log message ***
ca
parents: 1049
diff changeset
   235
b7e7d51e0a9f *** empty log message ***
ca
parents: 1049
diff changeset
   236
    if( _zstreamObj != nil )
b7e7d51e0a9f *** empty log message ***
ca
parents: 1049
diff changeset
   237
    {
b7e7d51e0a9f *** empty log message ***
ca
parents: 1049
diff changeset
   238
        int         _errorNo, _count;
b7e7d51e0a9f *** empty log message ***
ca
parents: 1049
diff changeset
   239
        zstream_s * _zstream;
1061
be824dc5e0e7 *** empty log message ***
ca
parents: 1060
diff changeset
   240
        int         _avail_in;
1050
b7e7d51e0a9f *** empty log message ***
ca
parents: 1049
diff changeset
   241
b7e7d51e0a9f *** empty log message ***
ca
parents: 1049
diff changeset
   242
        _zstream = (zstream_s *) __externalBytesAddress( _zstreamObj );
b7e7d51e0a9f *** empty log message ***
ca
parents: 1049
diff changeset
   243
1051
4f18d73427bb *** empty log message ***
ca
parents: 1050
diff changeset
   244
        if( _zstream->op_mode != e_opmode_inflate )
4f18d73427bb *** empty log message ***
ca
parents: 1050
diff changeset
   245
            RETURN( nil );
4f18d73427bb *** empty log message ***
ca
parents: 1050
diff changeset
   246
1061
be824dc5e0e7 *** empty log message ***
ca
parents: 1060
diff changeset
   247
        _avail_in = _zstream->stream.avail_in;
be824dc5e0e7 *** empty log message ***
ca
parents: 1060
diff changeset
   248
1050
b7e7d51e0a9f *** empty log message ***
ca
parents: 1049
diff changeset
   249
        if( _zstream->stream.state == NULL )
b7e7d51e0a9f *** empty log message ***
ca
parents: 1049
diff changeset
   250
        {
1061
be824dc5e0e7 *** empty log message ***
ca
parents: 1060
diff changeset
   251
            /* processing finished : check crc and data length */
be824dc5e0e7 *** empty log message ***
ca
parents: 1060
diff changeset
   252
            Bytef * _next_in;
be824dc5e0e7 *** empty log message ***
ca
parents: 1060
diff changeset
   253
            Bytef * _buff;
be824dc5e0e7 *** empty log message ***
ca
parents: 1060
diff changeset
   254
            uLong   _tnum;
be824dc5e0e7 *** empty log message ***
ca
parents: 1060
diff changeset
   255
            int     _i;
be824dc5e0e7 *** empty log message ***
ca
parents: 1060
diff changeset
   256
be824dc5e0e7 *** empty log message ***
ca
parents: 1060
diff changeset
   257
            _next_in   = _zstream->stream.next_in;
be824dc5e0e7 *** empty log message ***
ca
parents: 1060
diff changeset
   258
            _buff = _zstream->tail_buff;
be824dc5e0e7 *** empty log message ***
ca
parents: 1060
diff changeset
   259
            _tnum = _zstream->tail_size;
be824dc5e0e7 *** empty log message ***
ca
parents: 1060
diff changeset
   260
be824dc5e0e7 *** empty log message ***
ca
parents: 1060
diff changeset
   261
            while( (_avail_in > 0) && (_tnum < 8) )
be824dc5e0e7 *** empty log message ***
ca
parents: 1060
diff changeset
   262
            {
be824dc5e0e7 *** empty log message ***
ca
parents: 1060
diff changeset
   263
               _buff[_tnum] = * _next_in;
be824dc5e0e7 *** empty log message ***
ca
parents: 1060
diff changeset
   264
be824dc5e0e7 *** empty log message ***
ca
parents: 1060
diff changeset
   265
                ++_next_in;
be824dc5e0e7 *** empty log message ***
ca
parents: 1060
diff changeset
   266
                ++_tnum;
be824dc5e0e7 *** empty log message ***
ca
parents: 1060
diff changeset
   267
                --_avail_in;
be824dc5e0e7 *** empty log message ***
ca
parents: 1060
diff changeset
   268
            }
be824dc5e0e7 *** empty log message ***
ca
parents: 1060
diff changeset
   269
            _zstream->tail_size = _tnum;
be824dc5e0e7 *** empty log message ***
ca
parents: 1060
diff changeset
   270
be824dc5e0e7 *** empty log message ***
ca
parents: 1060
diff changeset
   271
            if( _tnum < 8 )                     /* test whether tail is read */
be824dc5e0e7 *** empty log message ***
ca
parents: 1060
diff changeset
   272
                RETURN( __MKSMALLINT (0) );     /* need more data */
be824dc5e0e7 *** empty log message ***
ca
parents: 1060
diff changeset
   273
be824dc5e0e7 *** empty log message ***
ca
parents: 1060
diff changeset
   274
            /* compute and check crc */
be824dc5e0e7 *** empty log message ***
ca
parents: 1060
diff changeset
   275
            for( _tnum = 0, _i = 4; --_i >= 0; _tnum = (_tnum << 8) + _buff[_i] );
be824dc5e0e7 *** empty log message ***
ca
parents: 1060
diff changeset
   276
be824dc5e0e7 *** empty log message ***
ca
parents: 1060
diff changeset
   277
            if( _tnum != _zstream->crc_32 )
be824dc5e0e7 *** empty log message ***
ca
parents: 1060
diff changeset
   278
                { tailError = __MKSMALLINT( 1 ); goto badTail; }
be824dc5e0e7 *** empty log message ***
ca
parents: 1060
diff changeset
   279
be824dc5e0e7 *** empty log message ***
ca
parents: 1060
diff changeset
   280
            /* compute and check data length */
be824dc5e0e7 *** empty log message ***
ca
parents: 1060
diff changeset
   281
            for( _tnum = 0, _i = 8; --_i >= 4; _tnum = (_tnum << 8) + _buff[_i] );
be824dc5e0e7 *** empty log message ***
ca
parents: 1060
diff changeset
   282
be824dc5e0e7 *** empty log message ***
ca
parents: 1060
diff changeset
   283
            if( _zstream->stream.total_out != _tnum )
be824dc5e0e7 *** empty log message ***
ca
parents: 1060
diff changeset
   284
                { tailError = __MKSMALLINT( 2 ); goto badTail; }
1051
4f18d73427bb *** empty log message ***
ca
parents: 1050
diff changeset
   285
4f18d73427bb *** empty log message ***
ca
parents: 1050
diff changeset
   286
            _zstream->op_mode = e_opmode_unspecified;
1050
b7e7d51e0a9f *** empty log message ***
ca
parents: 1049
diff changeset
   287
            RETURN( nil );
b7e7d51e0a9f *** empty log message ***
ca
parents: 1049
diff changeset
   288
        }
1061
be824dc5e0e7 *** empty log message ***
ca
parents: 1060
diff changeset
   289
        if( _avail_in == 0 )
1050
b7e7d51e0a9f *** empty log message ***
ca
parents: 1049
diff changeset
   290
            RETURN( __MKSMALLINT (0) );
b7e7d51e0a9f *** empty log message ***
ca
parents: 1049
diff changeset
   291
b7e7d51e0a9f *** empty log message ***
ca
parents: 1049
diff changeset
   292
        _zstream->stream.avail_out = _zstream->out_total;
b7e7d51e0a9f *** empty log message ***
ca
parents: 1049
diff changeset
   293
        _zstream->stream.next_out  = _zstream->out_ref;
b7e7d51e0a9f *** empty log message ***
ca
parents: 1049
diff changeset
   294
b7e7d51e0a9f *** empty log message ***
ca
parents: 1049
diff changeset
   295
        _errorNo = inflate( & _zstream->stream, Z_NO_FLUSH );
b7e7d51e0a9f *** empty log message ***
ca
parents: 1049
diff changeset
   296
b7e7d51e0a9f *** empty log message ***
ca
parents: 1049
diff changeset
   297
        if( _errorNo == Z_STREAM_END )
b7e7d51e0a9f *** empty log message ***
ca
parents: 1049
diff changeset
   298
            _errorNo = inflateEnd( & _zstream->stream );
b7e7d51e0a9f *** empty log message ***
ca
parents: 1049
diff changeset
   299
b7e7d51e0a9f *** empty log message ***
ca
parents: 1049
diff changeset
   300
        if( _errorNo == Z_OK )
b7e7d51e0a9f *** empty log message ***
ca
parents: 1049
diff changeset
   301
        {
b7e7d51e0a9f *** empty log message ***
ca
parents: 1049
diff changeset
   302
            _count = _zstream->out_total - _zstream->stream.avail_out;
1051
4f18d73427bb *** empty log message ***
ca
parents: 1050
diff changeset
   303
4f18d73427bb *** empty log message ***
ca
parents: 1050
diff changeset
   304
            if( _count > 0 )
4f18d73427bb *** empty log message ***
ca
parents: 1050
diff changeset
   305
                _zstream->crc_32 = crc32( _zstream->crc_32, _zstream->out_ref, _count );
4f18d73427bb *** empty log message ***
ca
parents: 1050
diff changeset
   306
1050
b7e7d51e0a9f *** empty log message ***
ca
parents: 1049
diff changeset
   307
            RETURN( __MKSMALLINT (_count) );
b7e7d51e0a9f *** empty log message ***
ca
parents: 1049
diff changeset
   308
        }
b7e7d51e0a9f *** empty log message ***
ca
parents: 1049
diff changeset
   309
        errorNo = __MKSMALLINT( _errorNo );
b7e7d51e0a9f *** empty log message ***
ca
parents: 1049
diff changeset
   310
    }
1061
be824dc5e0e7 *** empty log message ***
ca
parents: 1060
diff changeset
   311
badTail:;
1050
b7e7d51e0a9f *** empty log message ***
ca
parents: 1049
diff changeset
   312
%}.
1061
be824dc5e0e7 *** empty log message ***
ca
parents: 1060
diff changeset
   313
    errorNo ifNil:[
be824dc5e0e7 *** empty log message ***
ca
parents: 1060
diff changeset
   314
        tailError ifNotNil:[
be824dc5e0e7 *** empty log message ***
ca
parents: 1060
diff changeset
   315
            tailError == 1 ifTrue:[
be824dc5e0e7 *** empty log message ***
ca
parents: 1060
diff changeset
   316
                self zerror:'invalid compressed data--crc error'
be824dc5e0e7 *** empty log message ***
ca
parents: 1060
diff changeset
   317
            ].
be824dc5e0e7 *** empty log message ***
ca
parents: 1060
diff changeset
   318
            self zerror:'invalid compressed data--length error'
be824dc5e0e7 *** empty log message ***
ca
parents: 1060
diff changeset
   319
        ].
be824dc5e0e7 *** empty log message ***
ca
parents: 1060
diff changeset
   320
        self errorNotOpen
be824dc5e0e7 *** empty log message ***
ca
parents: 1060
diff changeset
   321
    ].
1050
b7e7d51e0a9f *** empty log message ***
ca
parents: 1049
diff changeset
   322
    self zerror:errorNo.
b7e7d51e0a9f *** empty log message ***
ca
parents: 1049
diff changeset
   323
!
b7e7d51e0a9f *** empty log message ***
ca
parents: 1049
diff changeset
   324
1045
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
   325
zinflateInit
1052
055841c03c8a *** empty log message ***
ca
parents: 1051
diff changeset
   326
    "low level - inflateInit
055841c03c8a *** empty log message ***
ca
parents: 1051
diff changeset
   327
    "
1045
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
   328
    |errorNo|
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
   329
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
   330
    errorNo := nil.
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
   331
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
   332
%{
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
   333
    OBJ _zstreamObj = __INST( zstream );
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
   334
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
   335
    if( _zstreamObj != nil )
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
   336
    {
1047
1cd99e473c08 *** empty log message ***
ca
parents: 1046
diff changeset
   337
        int         _errorNo;
1cd99e473c08 *** empty log message ***
ca
parents: 1046
diff changeset
   338
        zstream_s * _zstream = (zstream_s *) __externalBytesAddress( _zstreamObj );
1045
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
   339
1051
4f18d73427bb *** empty log message ***
ca
parents: 1050
diff changeset
   340
        _zstream->op_mode = e_opmode_inflate;
1047
1cd99e473c08 *** empty log message ***
ca
parents: 1046
diff changeset
   341
        _errorNo = inflateInit2( & _zstream->stream, -MAX_WBITS );
1045
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
   342
1047
1cd99e473c08 *** empty log message ***
ca
parents: 1046
diff changeset
   343
        if( _errorNo == Z_OK )
1cd99e473c08 *** empty log message ***
ca
parents: 1046
diff changeset
   344
            RETURN( self );
1045
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
   345
1047
1cd99e473c08 *** empty log message ***
ca
parents: 1046
diff changeset
   346
        _zstream->stream.avail_in = 0;
1cd99e473c08 *** empty log message ***
ca
parents: 1046
diff changeset
   347
        errorNo = __MKSMALLINT( _errorNo );
1045
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
   348
    }
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
   349
%}.
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
   350
    errorNo ifNil:[ self errorNotOpen ].
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
   351
    self zerror:errorNo.
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
   352
!
1047
1cd99e473c08 *** empty log message ***
ca
parents: 1046
diff changeset
   353
1059
b47e4eff5543 *** empty log message ***
ca
parents: 1058
diff changeset
   354
zopen
1052
055841c03c8a *** empty log message ***
ca
parents: 1051
diff changeset
   355
    "low level - opens the zip stream
055841c03c8a *** empty log message ***
ca
parents: 1051
diff changeset
   356
    "
1051
4f18d73427bb *** empty log message ***
ca
parents: 1050
diff changeset
   357
    |outTotal|
1045
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
   358
1059
b47e4eff5543 *** empty log message ***
ca
parents: 1058
diff changeset
   359
    outTotal := outputBytes size.
1045
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
   360
%{
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
   361
    zstream_s * _zstream = (zstream_s *) malloc( sizeof(zstream_s) );
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
   362
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
   363
    if( _zstream )
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
   364
    {
1047
1cd99e473c08 *** empty log message ***
ca
parents: 1046
diff changeset
   365
        OBJ     _zobj   = __MKEXTERNALADDRESS( _zstream );
1cd99e473c08 *** empty log message ***
ca
parents: 1046
diff changeset
   366
        OBJ     _outObj = __INST( outputBytes );
1cd99e473c08 *** empty log message ***
ca
parents: 1046
diff changeset
   367
        OBJ     _inpObj = __INST( inputBytes  );
1045
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
   368
1047
1cd99e473c08 *** empty log message ***
ca
parents: 1046
diff changeset
   369
        zmemzero( _zstream, sizeof(zstream_s) );
1045
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
   370
1047
1cd99e473c08 *** empty log message ***
ca
parents: 1046
diff changeset
   371
        _zstream->in_ref           = (Bytef *) __externalBytesAddress( _inpObj );
1cd99e473c08 *** empty log message ***
ca
parents: 1046
diff changeset
   372
        _zstream->stream.next_in   = Z_NULL;
1cd99e473c08 *** empty log message ***
ca
parents: 1046
diff changeset
   373
        _zstream->stream.avail_in  = 0;
1cd99e473c08 *** empty log message ***
ca
parents: 1046
diff changeset
   374
        _zstream->stream.total_in  = 0;
1045
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
   375
1047
1cd99e473c08 *** empty log message ***
ca
parents: 1046
diff changeset
   376
        _zstream->out_total        = __intVal( outTotal );
1cd99e473c08 *** empty log message ***
ca
parents: 1046
diff changeset
   377
        _zstream->out_ref          = (Bytef *) __externalBytesAddress( _outObj );
1cd99e473c08 *** empty log message ***
ca
parents: 1046
diff changeset
   378
        _zstream->stream.next_out  = _zstream->out_ref;
1cd99e473c08 *** empty log message ***
ca
parents: 1046
diff changeset
   379
        _zstream->stream.avail_out = _zstream->out_total;
1cd99e473c08 *** empty log message ***
ca
parents: 1046
diff changeset
   380
        _zstream->stream.total_out = 0;
1045
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
   381
1047
1cd99e473c08 *** empty log message ***
ca
parents: 1046
diff changeset
   382
        _zstream->stream.zalloc    = (alloc_func)0;
1cd99e473c08 *** empty log message ***
ca
parents: 1046
diff changeset
   383
        _zstream->stream.zfree     = (free_func) 0;
1cd99e473c08 *** empty log message ***
ca
parents: 1046
diff changeset
   384
        _zstream->stream.opaque    = (voidpf)    0;
1045
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
   385
1047
1cd99e473c08 *** empty log message ***
ca
parents: 1046
diff changeset
   386
        _zstream->crc_32           = crc32( 0L, Z_NULL, 0 );
1051
4f18d73427bb *** empty log message ***
ca
parents: 1050
diff changeset
   387
        _zstream->op_mode          = e_opmode_unspecified;
1061
be824dc5e0e7 *** empty log message ***
ca
parents: 1060
diff changeset
   388
        _zstream->tail_size        = 0;
1045
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
   389
1047
1cd99e473c08 *** empty log message ***
ca
parents: 1046
diff changeset
   390
        __INST (zstream) = _zobj;
1cd99e473c08 *** empty log message ***
ca
parents: 1046
diff changeset
   391
        __STORE(self, _zobj);
1045
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
   392
    }
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
   393
%}.
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
   394
!
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
   395
1059
b47e4eff5543 *** empty log message ***
ca
parents: 1058
diff changeset
   396
zset_avail_in:count
b47e4eff5543 *** empty log message ***
ca
parents: 1058
diff changeset
   397
    "set the 'avail_in' and compute the crc
1052
055841c03c8a *** empty log message ***
ca
parents: 1051
diff changeset
   398
    "
1059
b47e4eff5543 *** empty log message ***
ca
parents: 1058
diff changeset
   399
%{
b47e4eff5543 *** empty log message ***
ca
parents: 1058
diff changeset
   400
    OBJ _zstreamObj = __INST( zstream );
1045
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
   401
1059
b47e4eff5543 *** empty log message ***
ca
parents: 1058
diff changeset
   402
    if( (_zstreamObj != nil) && __isSmallInteger(count) )
b47e4eff5543 *** empty log message ***
ca
parents: 1058
diff changeset
   403
    {
b47e4eff5543 *** empty log message ***
ca
parents: 1058
diff changeset
   404
        int         _count;
b47e4eff5543 *** empty log message ***
ca
parents: 1058
diff changeset
   405
        zstream_s * _zstream = (zstream_s *) __externalBytesAddress( _zstreamObj );
1045
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
   406
1059
b47e4eff5543 *** empty log message ***
ca
parents: 1058
diff changeset
   407
        if( (_count = __intVal( count )) > 0 )
b47e4eff5543 *** empty log message ***
ca
parents: 1058
diff changeset
   408
        {
b47e4eff5543 *** empty log message ***
ca
parents: 1058
diff changeset
   409
            Bytef * _in_ref = _zstream->in_ref;
1045
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
   410
1059
b47e4eff5543 *** empty log message ***
ca
parents: 1058
diff changeset
   411
            _zstream->stream.avail_in = _count;
b47e4eff5543 *** empty log message ***
ca
parents: 1058
diff changeset
   412
            _zstream->stream.next_in  = _in_ref;
1045
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
   413
1059
b47e4eff5543 *** empty log message ***
ca
parents: 1058
diff changeset
   414
            if( _zstream->op_mode == e_opmode_deflate )
b47e4eff5543 *** empty log message ***
ca
parents: 1058
diff changeset
   415
                _zstream->crc_32 = crc32( _zstream->crc_32, _in_ref, _count );
b47e4eff5543 *** empty log message ***
ca
parents: 1058
diff changeset
   416
        } else {
b47e4eff5543 *** empty log message ***
ca
parents: 1058
diff changeset
   417
            _zstream->stream.avail_in = 0;
b47e4eff5543 *** empty log message ***
ca
parents: 1058
diff changeset
   418
            _zstream->stream.next_in  = Z_NULL;
b47e4eff5543 *** empty log message ***
ca
parents: 1058
diff changeset
   419
        }
b47e4eff5543 *** empty log message ***
ca
parents: 1058
diff changeset
   420
        RETURN( self );
b47e4eff5543 *** empty log message ***
ca
parents: 1058
diff changeset
   421
    }
b47e4eff5543 *** empty log message ***
ca
parents: 1058
diff changeset
   422
%}.
b47e4eff5543 *** empty log message ***
ca
parents: 1058
diff changeset
   423
    zstream ifNil:[ self errorNotOpen ].
b47e4eff5543 *** empty log message ***
ca
parents: 1058
diff changeset
   424
    self invalidArguments.
1045
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
   425
! !
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
   426
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
   427
!ZipStream methodsFor:'startup & release'!
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
   428
1059
b47e4eff5543 *** empty log message ***
ca
parents: 1058
diff changeset
   429
openWithMode:aMode on:aStream
b47e4eff5543 *** empty log message ***
ca
parents: 1058
diff changeset
   430
    super openWithMode:aMode on:aStream.
1045
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
   431
1059
b47e4eff5543 *** empty log message ***
ca
parents: 1058
diff changeset
   432
    self isReadOpen ifTrue:[
b47e4eff5543 *** empty log message ***
ca
parents: 1058
diff changeset
   433
        "Check the gzip magic id
b47e4eff5543 *** empty log message ***
ca
parents: 1058
diff changeset
   434
        "
b47e4eff5543 *** empty log message ***
ca
parents: 1058
diff changeset
   435
        |flags|
1045
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
   436
1059
b47e4eff5543 *** empty log message ***
ca
parents: 1058
diff changeset
   437
        GZ_MAGIC_ID do:[:b|
b47e4eff5543 *** empty log message ***
ca
parents: 1058
diff changeset
   438
            onStream nextByte ~~ b ifTrue:[ self zerror:'version error' ]
b47e4eff5543 *** empty log message ***
ca
parents: 1058
diff changeset
   439
        ].
1045
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
   440
1059
b47e4eff5543 *** empty log message ***
ca
parents: 1058
diff changeset
   441
        onStream nextByte ~~ Z_DEFLATED ifTrue:[
b47e4eff5543 *** empty log message ***
ca
parents: 1058
diff changeset
   442
            self zerror:'invalid method (not deflated)'
b47e4eff5543 *** empty log message ***
ca
parents: 1058
diff changeset
   443
        ].
1045
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
   444
1059
b47e4eff5543 *** empty log message ***
ca
parents: 1058
diff changeset
   445
        flags := onStream nextByte.
b47e4eff5543 *** empty log message ***
ca
parents: 1058
diff changeset
   446
        (flags bitAnd:HEAD_RESERVED) ~~ 0 ifTrue:[
b47e4eff5543 *** empty log message ***
ca
parents: 1058
diff changeset
   447
            self zerror:'wrong data format'
b47e4eff5543 *** empty log message ***
ca
parents: 1058
diff changeset
   448
        ].
1045
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
   449
1059
b47e4eff5543 *** empty log message ***
ca
parents: 1058
diff changeset
   450
        "discard time, xflags and OS code"
b47e4eff5543 *** empty log message ***
ca
parents: 1058
diff changeset
   451
        onStream skip:6.
1045
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
   452
1059
b47e4eff5543 *** empty log message ***
ca
parents: 1058
diff changeset
   453
        (flags bitAnd:HEAD_EXTRA_FIELD) ~~ 0 ifTrue:[|len|
b47e4eff5543 *** empty log message ***
ca
parents: 1058
diff changeset
   454
            "skip the extra field"
b47e4eff5543 *** empty log message ***
ca
parents: 1058
diff changeset
   455
            len := onStream nextByte + (onStream nextByte bitShift:8).
b47e4eff5543 *** empty log message ***
ca
parents: 1058
diff changeset
   456
            len timesRepeat:[ onStream nextByte ].
1057
9df4a60df0ef *** empty log message ***
ca
parents: 1056
diff changeset
   457
        ].
1045
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
   458
1059
b47e4eff5543 *** empty log message ***
ca
parents: 1058
diff changeset
   459
        (flags bitAnd:HEAD_ORIG_NAME) ~~ 0 ifTrue:[|b|
b47e4eff5543 *** empty log message ***
ca
parents: 1058
diff changeset
   460
            "skip the original file name"
b47e4eff5543 *** empty log message ***
ca
parents: 1058
diff changeset
   461
            [ (b := onStream nextByte) ~~ 0 ] whileTrue.
b47e4eff5543 *** empty log message ***
ca
parents: 1058
diff changeset
   462
        ].
1050
b7e7d51e0a9f *** empty log message ***
ca
parents: 1049
diff changeset
   463
1059
b47e4eff5543 *** empty log message ***
ca
parents: 1058
diff changeset
   464
        (flags bitAnd:HEAD_CRC) ~~ 0 ifTrue:[
b47e4eff5543 *** empty log message ***
ca
parents: 1058
diff changeset
   465
            "skip the header crc"
b47e4eff5543 *** empty log message ***
ca
parents: 1058
diff changeset
   466
            onStream skip:2.
b47e4eff5543 *** empty log message ***
ca
parents: 1058
diff changeset
   467
        ].
b47e4eff5543 *** empty log message ***
ca
parents: 1058
diff changeset
   468
    ] ifFalse:[
b47e4eff5543 *** empty log message ***
ca
parents: 1058
diff changeset
   469
        "write the gzip magic id
b47e4eff5543 *** empty log message ***
ca
parents: 1058
diff changeset
   470
        "
b47e4eff5543 *** empty log message ***
ca
parents: 1058
diff changeset
   471
        GZ_MAGIC_ID do:[:b| onStream nextPutByte:b ].
1050
b7e7d51e0a9f *** empty log message ***
ca
parents: 1049
diff changeset
   472
1059
b47e4eff5543 *** empty log message ***
ca
parents: 1058
diff changeset
   473
        "write the method"
b47e4eff5543 *** empty log message ***
ca
parents: 1058
diff changeset
   474
        onStream nextPutByte:Z_DEFLATED.
b47e4eff5543 *** empty log message ***
ca
parents: 1058
diff changeset
   475
b47e4eff5543 *** empty log message ***
ca
parents: 1058
diff changeset
   476
        "write the flags"
b47e4eff5543 *** empty log message ***
ca
parents: 1058
diff changeset
   477
        onStream nextPutByte:0.
1050
b7e7d51e0a9f *** empty log message ***
ca
parents: 1049
diff changeset
   478
1059
b47e4eff5543 *** empty log message ***
ca
parents: 1058
diff changeset
   479
        "write time"
b47e4eff5543 *** empty log message ***
ca
parents: 1058
diff changeset
   480
        4 timesRepeat:[ onStream nextPutByte:0 ].
1045
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
   481
1059
b47e4eff5543 *** empty log message ***
ca
parents: 1058
diff changeset
   482
        "write xflags"
b47e4eff5543 *** empty log message ***
ca
parents: 1058
diff changeset
   483
        onStream nextPutByte:0.
b47e4eff5543 *** empty log message ***
ca
parents: 1058
diff changeset
   484
b47e4eff5543 *** empty log message ***
ca
parents: 1058
diff changeset
   485
        "write OS code"
b47e4eff5543 *** empty log message ***
ca
parents: 1058
diff changeset
   486
        onStream nextPutByte:HEAD_OS_CODE.
b47e4eff5543 *** empty log message ***
ca
parents: 1058
diff changeset
   487
    ].    
1045
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
   488
! !
1044
c73aee830691 initial checkin
ca
parents:
diff changeset
   489
c73aee830691 initial checkin
ca
parents:
diff changeset
   490
!ZipStream class methodsFor:'documentation'!
c73aee830691 initial checkin
ca
parents:
diff changeset
   491
c73aee830691 initial checkin
ca
parents:
diff changeset
   492
version
1061
be824dc5e0e7 *** empty log message ***
ca
parents: 1060
diff changeset
   493
    ^ '$Header: /cvs/stx/stx/libbasic2/ZipStream.st,v 1.17 2002-06-26 06:44:39 ca Exp $'
1044
c73aee830691 initial checkin
ca
parents:
diff changeset
   494
! !
1047
1cd99e473c08 *** empty log message ***
ca
parents: 1046
diff changeset
   495
ZipStream initialize!