--- a/ZipArchive.st Mon Jun 19 09:57:38 2017 +0200
+++ b/ZipArchive.st Mon Jun 19 09:58:01 2017 +0200
@@ -1,6 +1,6 @@
"
COPYRIGHT (c) 1998 by eXept Software AG
- All Rights Reserved
+ All Rights Reserved
This software is furnished under a license and may be used
only in accordance with the terms of that license and with the
@@ -87,7 +87,7 @@
#define NEXTBYTE (*inPtr++)
#define XXXFLUSH(n) slide += (n)
-#define FLUSH(n) { bcopy(slide, outPtr, (n)); outPtr += (n); }
+#define FLUSH(n) { memcpy(outPtr, slide, (n)); outPtr += (n); }
#ifdef DEBUG
# define Trace(x) if (debugTrace) { console_fprintf x ; }
@@ -142,25 +142,25 @@
/* Tables for deflate from PKZIP's appnote.txt. */
static unsigned border[] = { /* Order of the bit length code lengths */
- 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15};
+ 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15};
static ushort cplens[] = { /* Copy lengths for literal codes 257..285 */
- 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31,
- 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0};
- /* note: see note #13 above about the 258 in this list. */
+ 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31,
+ 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0};
+ /* note: see note #13 above about the 258 in this list. */
static ushort cplext[] = { /* Extra bits for literal codes 257..285 */
- 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2,
- 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0, 99, 99}; /* 99==invalid */
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2,
+ 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0, 99, 99}; /* 99==invalid */
static ushort cpdist[] = { /* Copy offsets for distance codes 0..29 */
- 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193,
- 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145,
- 8193, 12289, 16385, 24577};
+ 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193,
+ 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145,
+ 8193, 12289, 16385, 24577};
static ushort cpdext[] = { /* Extra bits for distance codes */
- 0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6,
- 7, 7, 8, 8, 9, 9, 10, 10, 11, 11,
- 12, 12, 13, 13};
+ 0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6,
+ 7, 7, 8, 8, 9, 9, 10, 10, 11, 11,
+ 12, 12, 13, 13};
/* And'ing with mask[n] masks the lower n bits */
static ushort mask[] = {
@@ -173,9 +173,9 @@
/* Macros for inflate() bit peeking and grabbing.
The usage is:
- NEEDBITS(j)
- x = b & mask[j];
- DUMPBITS(j)
+ NEEDBITS(j)
+ x = b & mask[j];
+ DUMPBITS(j)
where NEEDBITS makes sure that b has at least j bits in it, and
DUMPBITS removes the bits from b. The macros use the variable k
@@ -390,79 +390,79 @@
/* make tables up to required level */
while (k > w + l[h])
{
- w += l[h++]; /* add bits already decoded */
-
- /* compute minimum size table less than or equal to *m bits */
- z = (z = g - w) > (unsigned)*m ? *m : z; /* upper limit */
- if ((f = 1 << (j = k - w)) > a + 1) /* try a k-w bit table */
- { /* too few codes for k-w bit table */
- f -= a + 1; /* deduct codes from patterns left */
- xp = c + k;
- while (++j < z) /* try smaller tables up to z bits */
- {
- if ((f <<= 1) <= *++xp)
- break; /* enough codes to use up j bits */
- f -= *xp; /* else deduct codes from patterns */
- }
- }
- if ((unsigned)w + j > el && (unsigned)w < el)
- j = el - w; /* make EOB code end at table */
- z = 1 << j; /* table entries for j-bit table */
- l[h] = j; /* set table size in stack */
-
- /* allocate and link in new table */
- if ((q = (struct huft *)malloc((z + 1)*sizeof(struct huft))) ==
- (struct huft *)NULL)
- {
- if (h)
- huft_free(u[0]);
- return 3; /* not enough memory */
- }
- hufts += z + 1; /* track memory usage */
- *t = q + 1; /* link to list for huft_free() */
- *(t = &(q->v.t)) = (struct huft *)NULL;
- u[h] = ++q; /* table starts after link */
-
- /* connect to last table, if there is one */
- if (h)
- {
- x[h] = i; /* save pattern for backing up */
- r.b = (uchar)l[h-1]; /* bits to dump before this table */
- r.e = (uchar)(16 + j); /* bits in this table */
- r.v.t = q; /* pointer to this table */
- j = (i & ((1 << w) - 1)) >> (w - l[h-1]);
- u[h-1][j] = r; /* connect to last table */
- }
+ w += l[h++]; /* add bits already decoded */
+
+ /* compute minimum size table less than or equal to *m bits */
+ z = (z = g - w) > (unsigned)*m ? *m : z; /* upper limit */
+ if ((f = 1 << (j = k - w)) > a + 1) /* try a k-w bit table */
+ { /* too few codes for k-w bit table */
+ f -= a + 1; /* deduct codes from patterns left */
+ xp = c + k;
+ while (++j < z) /* try smaller tables up to z bits */
+ {
+ if ((f <<= 1) <= *++xp)
+ break; /* enough codes to use up j bits */
+ f -= *xp; /* else deduct codes from patterns */
+ }
+ }
+ if ((unsigned)w + j > el && (unsigned)w < el)
+ j = el - w; /* make EOB code end at table */
+ z = 1 << j; /* table entries for j-bit table */
+ l[h] = j; /* set table size in stack */
+
+ /* allocate and link in new table */
+ if ((q = (struct huft *)malloc((z + 1)*sizeof(struct huft))) ==
+ (struct huft *)NULL)
+ {
+ if (h)
+ huft_free(u[0]);
+ return 3; /* not enough memory */
+ }
+ hufts += z + 1; /* track memory usage */
+ *t = q + 1; /* link to list for huft_free() */
+ *(t = &(q->v.t)) = (struct huft *)NULL;
+ u[h] = ++q; /* table starts after link */
+
+ /* connect to last table, if there is one */
+ if (h)
+ {
+ x[h] = i; /* save pattern for backing up */
+ r.b = (uchar)l[h-1]; /* bits to dump before this table */
+ r.e = (uchar)(16 + j); /* bits in this table */
+ r.v.t = q; /* pointer to this table */
+ j = (i & ((1 << w) - 1)) >> (w - l[h-1]);
+ u[h-1][j] = r; /* connect to last table */
+ }
}
/* set up table entry in r */
r.b = (uchar)(k - w);
if (p >= v + n)
- r.e = 99; /* out of values--invalid code */
+ r.e = 99; /* out of values--invalid code */
else if (*p < s)
{
- r.e = (uchar)(*p < 256 ? 16 : 15); /* 256 is end-of-block code */
- r.v.n = *p++; /* simple code is just the value */
+ r.e = (uchar)(*p < 256 ? 16 : 15); /* 256 is end-of-block code */
+ r.v.n = *p++; /* simple code is just the value */
}
else
{
- r.e = (uchar)e[*p - s]; /* non-simple--look up in lists */
- r.v.n = d[*p++ - s];
+ r.e = (uchar)e[*p - s]; /* non-simple--look up in lists */
+ r.v.n = d[*p++ - s];
}
/* fill code-like entries with r */
f = 1 << (k - w);
for (j = i >> w; j < z; j += f)
- q[j] = r;
+ q[j] = r;
/* backwards increment the k-bit code i */
for (j = 1 << (k - 1); i & j; j >>= 1)
- i ^= j;
+ i ^= j;
i ^= j;
/* backup over finished tables */
while ((i & ((1 << w) - 1)) != x[h])
- w -= l[--h]; /* don't need to update q */
+ w -= l[--h]; /* don't need to update q */
}
}
@@ -513,11 +513,11 @@
NEEDBITS((unsigned)bl)
if ((e = (t = tl + ((unsigned)b & ml))->e) > 16)
do {
- if (e == 99)
- return 1;
- DUMPBITS(t->b)
- e -= 16;
- NEEDBITS(e)
+ if (e == 99)
+ return 1;
+ DUMPBITS(t->b)
+ e -= 16;
+ NEEDBITS(e)
} while ((e = (t = t->v.t + ((unsigned)b & mask[e]))->e) > 16);
DUMPBITS(t->b)
if (e == 16) /* then it's a literal */
@@ -525,15 +525,15 @@
slide[w++] = (uchar)t->v.n;
if (w == WSIZE)
{
- FLUSH(w);
- w = 0;
+ FLUSH(w);
+ w = 0;
}
}
else /* it's an EOB or a length */
{
/* exit if end of block */
if (e == 15)
- break;
+ break;
/* get length of block to copy */
NEEDBITS(e)
@@ -543,13 +543,13 @@
/* decode distance of block to copy */
NEEDBITS((unsigned)bd)
if ((e = (t = td + ((unsigned)b & md))->e) > 16)
- do {
- if (e == 99)
- return 1;
- DUMPBITS(t->b)
- e -= 16;
- NEEDBITS(e)
- } while ((e = (t = t->v.t + ((unsigned)b & mask[e]))->e) > 16);
+ do {
+ if (e == 99)
+ return 1;
+ DUMPBITS(t->b)
+ e -= 16;
+ NEEDBITS(e)
+ } while ((e = (t = t->v.t + ((unsigned)b & mask[e]))->e) > 16);
DUMPBITS(t->b)
NEEDBITS(e)
d = w - t->v.n - ((unsigned)b & mask[e]);
@@ -557,28 +557,24 @@
/* do the copy */
do {
- n -= (e = (e = WSIZE - ((d &= WSIZE-1) > w ? d : w)) > n ? n : e);
+ n -= (e = (e = WSIZE - ((d &= WSIZE-1) > w ? d : w)) > n ? n : e);
#ifndef NOMEMCPY
- if (w - d >= e) /* (this test assumes unsigned comparison) */
- {
-# ifdef USE_MEMCPY
- memcpy(slide + w, slide + d, e);
-# else
- bcopy(slide + d, slide + w, e);
-# endif
- w += e;
- d += e;
- }
- else /* do it slow to avoid memcpy() overlap */
+ if (w - d >= e) /* (this test assumes unsigned comparison) */
+ {
+ memcpy(slide + w, slide + d, e);
+ w += e;
+ d += e;
+ }
+ else /* do it slow to avoid memcpy() overlap */
#endif /* !NOMEMCPY */
- do {
- slide[w++] = slide[d++];
- } while (--e);
- if (w == WSIZE)
- {
- FLUSH(w);
- w = 0;
- }
+ do {
+ slide[w++] = slide[d++];
+ } while (--e);
+ if (w == WSIZE)
+ {
+ FLUSH(w);
+ w = 0;
+ }
} while (n);
}
}
@@ -681,7 +677,7 @@
l[i] = 8;
fixed_bl = 7;
if ((i = huft_build(l, 288, 257, cplens, cplext,
- &fixed_tl, &fixed_bl)) != 0)
+ &fixed_tl, &fixed_bl)) != 0)
{
Trace((stderr, "incomplete code set 1\n"));
fixed_tl = (struct huft *)NULL;
@@ -800,9 +796,9 @@
j = 3 + ((unsigned)b & 3);
DUMPBITS(2)
if ((unsigned)i + j > n)
- return 1;
+ return 1;
while (j--)
- ll[i++] = l;
+ ll[i++] = l;
}
else if (j == 17) /* 3 to 10 zero length codes */
{
@@ -810,9 +806,9 @@
j = 3 + ((unsigned)b & 7);
DUMPBITS(3)
if ((unsigned)i + j > n)
- return 1;
+ return 1;
while (j--)
- ll[i++] = 0;
+ ll[i++] = 0;
l = 0;
}
else /* j == 18: 11 to 138 zero length codes */
@@ -821,9 +817,9 @@
j = 11 + ((unsigned)b & 0x7f);
DUMPBITS(7)
if ((unsigned)i + j > n)
- return 1;
+ return 1;
while (j--)
- ll[i++] = 0;
+ ll[i++] = 0;
l = 0;
}
}
@@ -1021,7 +1017,7 @@
copyright
"
COPYRIGHT (c) 1998 by eXept Software AG
- All Rights Reserved
+ All Rights Reserved
This software is furnished under a license and may be used
only in accordance with the terms of that license and with the
@@ -1039,65 +1035,65 @@
Trailing slash.
- Some implementations require a trailing slash in directory
- names (such as the OpenOffice zip implementation). Others just
- ignore external file attributes and indicate a directory entry
- by adding a trailing slash (such as the Java zip implementation).
-
- Since ZipArchive 1.98 a trailing slash is added for all directory
- entries iff appendTrailingSlash instvar is set to true. By default
- it is set to the value of DefaultAppendTrailingSlash which defaults
- to true.
-
- Setting appendTrailingSlash to false inhibits trailing slash
- behavior.
+ Some implementations require a trailing slash in directory
+ names (such as the OpenOffice zip implementation). Others just
+ ignore external file attributes and indicate a directory entry
+ by adding a trailing slash (such as the Java zip implementation).
+
+ Since ZipArchive 1.98 a trailing slash is added for all directory
+ entries iff appendTrailingSlash instvar is set to true. By default
+ it is set to the value of DefaultAppendTrailingSlash which defaults
+ to true.
+
+ Setting appendTrailingSlash to false inhibits trailing slash
+ behavior.
Caveat:
- the only compression methods (for now) are store and deflate.
+ the only compression methods (for now) are store and deflate.
[author:]
- Claus Gittinger
+ Claus Gittinger
[classvars:]
- DefaultAppendTrailingSlash...a default value for appendTralingSlash instvar.
- For details, see above
+ DefaultAppendTrailingSlash...a default value for appendTralingSlash instvar.
+ For details, see above
"
!
examples
"
- [exBegin]
+ [exBegin]
|zip bytes|
zip := ZipArchive oldFileNamed:'foo.zip'.
bytes := zip extract:'bar'.
zip close.
- [exEnd]
-
- [exBegin]
+ [exEnd]
+
+ [exBegin]
|zip bytes|
zip := ZipArchive oldFileNamed:'source/stx/libbasic2.zip'.
zip entries do:[:entry |
- Transcript showCR:entry
+ Transcript showCR:entry
].
zip close.
- [exEnd]
-
- [exBegin]
+ [exEnd]
+
+ [exBegin]
|zip bytes|
zip := ZipArchive oldFileNamed:'source/stx/libbasic2.zip'.
bytes := zip extract:'TwoByteStr.st'.
zip close.
Transcript showCR:(bytes asString).
- [exEnd]
+ [exEnd]
compatibility write check with winzip (compressed with deflate)
- [exBegin]
+ [exBegin]
|zipwr testDirectory testFileWr|
testDirectory := 'C:\Dokumente und Einstellungen\stefan\Eigene Dateien\tmp\'.
@@ -1106,10 +1102,10 @@
zipwr := ZipArchive newFileNamed:(testDirectory, testFileWr).
zipwr addFile:'crcTest_resume_compressed.txt' withContents: 'resume'.
zipwr close.
- [exEnd]
+ [exEnd]
compatibility read check with winzip (compressed with deflate)
- [exBegin]
+ [exBegin]
|ziprd testDirectory testFileRd contents|
testDirectory := 'C:\Dokumente und Einstellungen\stefan\Eigene Dateien\tmp\'.
@@ -1119,10 +1115,10 @@
contents := ziprd extract: ziprd entries first.
contents inspect.
ziprd close.
- [exEnd]
+ [exEnd]
compatibility write check with winzip (uncompressed)
- [exBegin]
+ [exBegin]
|zipwr testDirectory testFileWr|
testDirectory := 'C:\Dokumente und Einstellungen\stefan\Eigene Dateien\tmp\'.
@@ -1131,15 +1127,15 @@
zipwr := ZipArchive newFileNamed:(testDirectory, testFileWr).
zipwr addFile:'crcTest_resume_uncompressed.txt'
- withContents:'resume'
+ withContents:'resume'
compressMethod:0
- asDirectory:false.
+ asDirectory:false.
zipwr close.
- [exEnd]
+ [exEnd]
compatibility read check with winzip (uncompressed)
- [exBegin]
+ [exBegin]
|ziprd testDirectory testFileRd contents|
testDirectory := 'C:\Dokumente und Einstellungen\stefan\Eigene Dateien\tmp\'.
@@ -1149,11 +1145,11 @@
contents := ziprd extract: ziprd entries first.
contents inspect.
ziprd close.
- [exEnd]
+ [exEnd]
read an archive with files and/or directories, fetch the entries
and create a new archive with the same content
- [exBegin]
+ [exBegin]
|ziprd zipwr entryDict testDirectory testFileRd testFileWr|
testDirectory := 'C:\Dokumente und Einstellungen\stefan\Eigene Dateien\tmp\'.
@@ -1163,22 +1159,22 @@
ziprd := ZipArchive oldFileNamed:(testDirectory, testFileRd).
entryDict := Dictionary new.
ziprd entries do: [:aFileName|
- entryDict at:aFileName put:(ziprd extract: aFileName) asString.
+ entryDict at:aFileName put:(ziprd extract: aFileName) asString.
].
ziprd close.
zipwr := ZipArchive newFileNamed:(testDirectory, testFileWr).
entryDict keysAndValuesDo: [:key :value|
- (value size == 0) ifTrue: [
- zipwr addDirectory:key.
- ] ifFalse: [
- zipwr addFile:key withContents:value
- ].
+ (value size == 0) ifTrue: [
+ zipwr addDirectory:key.
+ ] ifFalse: [
+ zipwr addFile:key withContents:value
+ ].
].
zipwr close.
- [exEnd]
-
- [exBegin]
+ [exEnd]
+
+ [exBegin]
|zipwr ziprd testDirectory testFileWr testFileRd zs|
testDirectory := 'C:\Dokumente und Einstellungen\stefan\Eigene Dateien\tmp\'.
@@ -1194,9 +1190,9 @@
zs := ziprd readStreamFor: 'crcTest_resume_compressed.txt'.
zs inspect.
ziprd close.
- [exEnd]
-
- [exBegin]
+ [exEnd]
+
+ [exBegin]
|zipwr ziprd testDirectory testFileWr testFileRd rs result|
testDirectory := 'C:\Dokumente und Einstellungen\stefan\Eigene Dateien\tmp\'.
@@ -1212,17 +1208,17 @@
result := ''.
[ rs atEnd ] whileFalse: [
- result := result, (rs nextAvailable:5).
+ result := result, (rs nextAvailable:5).
].
result inspect.
rs close.
ziprd close.
- [exEnd]
+ [exEnd]
read an archive with files and/or directories and/or zipArchives,
fetch the entries (also from the include zip archives)
and create a new archive
- [exBegin]
+ [exBegin]
|ziprd zipwr entryDict testDirectory testFileRd testFileWr zipRdSub1 zipRdSub2|
testDirectory := 'C:\Dokumente und Einstellungen\stefan\Eigene Dateien\tmp\'.
@@ -1232,43 +1228,43 @@
ziprd := ZipArchive oldFileNamed:(testDirectory, testFileRd).
entryDict := Dictionary new.
ziprd entries do: [:aFileName|
- Transcript showCR: 'processing in top: ', aFileName.
- (aFileName endsWith:'.zip') ifTrue: [
- zipRdSub1 := ziprd extractArchive: aFileName.
- zipRdSub1 entries do: [:aFileName1|
- Transcript showCR: 'processing in sub 1: ', aFileName1.
- (aFileName1 endsWith:'.zip') ifTrue: [
- zipRdSub2 := zipRdSub1 extractArchive: aFileName1.
- zipRdSub2 entries do: [:aFileName2|
- Transcript showCR: 'processing in sub 2: ', aFileName2.
- (aFileName2 endsWith:'.zip') ifTrue: [
- self halt.
- ] ifFalse: [
- entryDict at:aFileName2 put:(zipRdSub2 extract: aFileName2) asString.
- ].
- ].
- zipRdSub2 close.
- ] ifFalse: [
- entryDict at:aFileName1 put:(zipRdSub1 extract: aFileName1) asString.
- ].
- ].
- zipRdSub1 close.
- ] ifFalse: [
- entryDict at:aFileName put:(ziprd extract: aFileName) asString.
- ].
+ Transcript showCR: 'processing in top: ', aFileName.
+ (aFileName endsWith:'.zip') ifTrue: [
+ zipRdSub1 := ziprd extractArchive: aFileName.
+ zipRdSub1 entries do: [:aFileName1|
+ Transcript showCR: 'processing in sub 1: ', aFileName1.
+ (aFileName1 endsWith:'.zip') ifTrue: [
+ zipRdSub2 := zipRdSub1 extractArchive: aFileName1.
+ zipRdSub2 entries do: [:aFileName2|
+ Transcript showCR: 'processing in sub 2: ', aFileName2.
+ (aFileName2 endsWith:'.zip') ifTrue: [
+ self halt.
+ ] ifFalse: [
+ entryDict at:aFileName2 put:(zipRdSub2 extract: aFileName2) asString.
+ ].
+ ].
+ zipRdSub2 close.
+ ] ifFalse: [
+ entryDict at:aFileName1 put:(zipRdSub1 extract: aFileName1) asString.
+ ].
+ ].
+ zipRdSub1 close.
+ ] ifFalse: [
+ entryDict at:aFileName put:(ziprd extract: aFileName) asString.
+ ].
].
ziprd close.
zipwr := ZipArchive newFileNamed:(testDirectory, testFileWr).
entryDict keysAndValuesDo: [:key :value|
- (value size == 0) ifTrue: [
- zipwr addDirectory:key.
- ] ifFalse: [
- zipwr addFile:key withContents:value
- ].
+ (value size == 0) ifTrue: [
+ zipwr addDirectory:key.
+ ] ifFalse: [
+ zipwr addFile:key withContents:value
+ ].
].
zipwr close.
- [exEnd]
+ [exEnd]
"
!
@@ -1276,10 +1272,10 @@
examples2
"
add to new zip archive a entry which is located in memory using selector
- addFile:'crcTest_resume_compressed.txt' withContents:
+ addFile:'crcTest_resume_compressed.txt' withContents:
and real file contents from disk (uncompressed) identified by a readStream using selector
- addFile:rdStreamFile fromStream:
- [exBegin]
+ addFile:rdStreamFile fromStream:
+ [exBegin]
|zipwr testDirectory testFileWr rdStreamFile rdFileStream |
testDirectory := 'C:\Dokumente und Einstellungen\stefan\Eigene Dateien\tmp\'.
@@ -1292,13 +1288,13 @@
zipwr addFile:rdStreamFile fromStream: rdFileStream.
zipwr close.
- [exEnd]
+ [exEnd]
read from zip archive a entry into memory using selector
- extract:'crcTest_resume_compressed.txt'
+ extract:'crcTest_resume_compressed.txt'
and store an uncompressed archive entry to disk using a writeStream
- extract: intoStream:
- [exBegin]
+ extract: intoStream:
+ [exBegin]
|ziprd testDirectory testFileRd wrStreamFile wrFileStream data1|
testDirectory := 'C:\Dokumente und Einstellungen\stefan\Eigene Dateien\tmp\'.
@@ -1310,18 +1306,18 @@
wrFileStream := ('C:\Dokumente und Einstellungen\stefan\Eigene Dateien\tmp\', wrStreamFile) asFilename writeStream.
(ziprd extract:'projects.zip' intoStream: wrFileStream) ifFalse: [
- self halt.
+ self halt.
].
ziprd close.
wrFileStream close.
- [exEnd]
+ [exEnd]
add (compressed) to new zip archive a real file contents from disk e.g. a pdf
identified by a readStream
using selector
- addFile: fromStream: compressMethod:
- [exBegin]
+ addFile: fromStream: compressMethod:
+ [exBegin]
|zipwr testDirectory testFileWr rdStreamFile rdFileStream|
testDirectory := 'C:\Dokumente und Einstellungen\stefan\Eigene Dateien\tmp\'.
@@ -1333,13 +1329,13 @@
zipwr addFileCompressed:rdStreamFile fromStream: rdFileStream.
zipwr close.
- [exEnd]
+ [exEnd]
read from zip archive a compressed entry e.g. a pdf and store the contents
to disk using a readStream
using selector
- readStreamFor: rdStreamFile
- [exBegin]
+ readStreamFor: rdStreamFile
+ [exBegin]
|ziprd testDirectory testFileRd wrStreamFile wrFileStream|
testDirectory := 'C:\Dokumente und Einstellungen\stefan\Eigene Dateien\tmp\'.
@@ -1350,12 +1346,12 @@
wrFileStream := ('C:\Dokumente und Einstellungen\stefan\Eigene Dateien\tmp\', wrStreamFile) asFilename writeStream.
(ziprd extract:'test.pdf' intoStream: wrFileStream) ifFalse: [
- self halt.
+ self halt.
].
ziprd close.
wrFileStream close.
- [exEnd]
+ [exEnd]
"
!
@@ -1363,8 +1359,8 @@
examples3
"
add to new zip archive recursive the contents of a directory (uncompressed)
- addArchiveDirectory: fromOsDirectory:
- [exBegin]
+ addArchiveDirectory: fromOsDirectory:
+ [exBegin]
|zipwr testDirectory testFileWr zipDirectory |
testDirectory := 'C:\Dokumente und Einstellungen\stefan\Eigene Dateien\tmp\'.
@@ -1376,12 +1372,12 @@
zipwr addArchiveDirectory: 'attachments' fromOsDirectory: (testDirectory,zipDirectory).
zipwr close.
- [exEnd]
+ [exEnd]
read from zip archive all entries which are stored in an archive directory (uncompressed)
and store all those entries in a directory on the file system
- restoreOsDirectory: fromArchiveDirectory:
- [exBegin]
+ restoreOsDirectory: fromArchiveDirectory:
+ [exBegin]
|ziprd testDirectory testFileRd zipDirectory|
testDirectory := 'C:\Dokumente und Einstellungen\stefan\Eigene Dateien\tmp\'.
@@ -1391,12 +1387,12 @@
ziprd := ZipArchive oldFileNamed:(testDirectory, testFileRd).
ziprd restoreOsDirectory: (testDirectory,zipDirectory) fromArchiveDirectory: 'attachments'.
ziprd close.
- [exEnd]
+ [exEnd]
add to new zip archive recursive the contents of a directory (compressed)
- addArchiveDirectoryCompressed: fromOsDirectory:
- [exBegin]
+ addArchiveDirectoryCompressed: fromOsDirectory:
+ [exBegin]
|zipwr testDirectory testFileWr zipDirectory |
testDirectory := 'C:\Dokumente und Einstellungen\stefan\Eigene Dateien\tmp\'.
@@ -1408,12 +1404,12 @@
zipwr addArchiveDirectoryCompressed: 'attachments' fromOsDirectory: (testDirectory,zipDirectory).
zipwr close.
- [exEnd]
+ [exEnd]
read from zip archive all entries which are stored in an archive directory (compressed)
and store all those entries in a directory on the file system
- restoreOsDirectory: fromArchiveDirectory:
- [exBegin]
+ restoreOsDirectory: fromArchiveDirectory:
+ [exBegin]
|ziprd testDirectory testFileRd zipDirectory|
testDirectory := 'C:\Dokumente und Einstellungen\stefan\Eigene Dateien\tmp\'.
@@ -1423,7 +1419,7 @@
ziprd := ZipArchive oldFileNamed:(testDirectory, testFileRd).
ziprd restoreOsDirectory: (testDirectory,zipDirectory) fromArchiveDirectory: 'attachments'.
ziprd close.
- [exEnd]
+ [exEnd]
"
!
@@ -1431,7 +1427,7 @@
fileFormatDescription
"/File: APPNOTE.TXT - .ZIP File Format Specification
-"/Version: 6.3.2
+"/Version: 6.3.2
"/Revised: September 28, 2007
"/Copyright (c) 1989 - 2007 PKWARE Inc., All Rights Reserved.
"/
@@ -1443,12 +1439,12 @@
"/----------
"/
"/This specification is intended to define a cross-platform,
-"/interoperable file storage and transfer format. Since its
-"/first publication in 1989, PKWARE has remained committed to
-"/ensuring the interoperability of the .ZIP file format through
-"/publication and maintenance of this specification. We trust that
-"/all .ZIP compatible vendors and application developers that have
-"/adopted and benefited from this format will share and support
+"/interoperable file storage and transfer format. Since its
+"/first publication in 1989, PKWARE has remained committed to
+"/ensuring the interoperability of the .ZIP file format through
+"/publication and maintenance of this specification. We trust that
+"/all .ZIP compatible vendors and application developers that have
+"/adopted and benefited from this format will share and support
"/this commitment to interoperability.
"/
"/II. Contacting PKWARE
@@ -1466,9 +1462,9 @@
"/
"/Although PKWARE will attempt to supply current and accurate
"/information relating to its file formats, algorithms, and the
-"/subject programs, the possibility of error or omission cannot
-"/be eliminated. PKWARE therefore expressly disclaims any warranty
-"/that the information contained in the associated materials relating
+"/subject programs, the possibility of error or omission cannot
+"/be eliminated. PKWARE therefore expressly disclaims any warranty
+"/that the information contained in the associated materials relating
"/to the subject programs and/or the format of the files created or
"/accessed by the subject programs and/or the algorithms used by
"/the subject programs, or any other matter, is current, correct or
@@ -1480,10 +1476,10 @@
"/subject to change without notice.
"/
"/If the version of this file is marked as a NOTIFICATION OF CHANGE,
-"/the content defines an Early Feature Specification (EFS) change
-"/to the .ZIP file format that may be subject to modification prior
+"/the content defines an Early Feature Specification (EFS) change
+"/to the .ZIP file format that may be subject to modification prior
"/to publication of the Final Feature Specification (FFS). This
-"/document may also contain information on Planned Feature
+"/document may also contain information on Planned Feature
"/Specifications (PFS) defining recognized future extensions.
"/
"/IV. Change Log
@@ -1504,13 +1500,13 @@
"/6.2.1 -Added Extra Field placeholder for 04/01/2005
"/ POSZIP using ID 0x4690
"/
-"/ -Clarified size field on
+"/ -Clarified size field on
"/ "zip64 end of central directory record"
"/
"/6.2.2 -Documented Final Feature Specification 01/06/2006
"/ for Strong Encryption
"/
-"/ -Clarifications and typographical
+"/ -Clarifications and typographical
"/ corrections
"/
"/6.3.0 -Added tape positioning storage 09/29/2006
@@ -1524,13 +1520,13 @@
"/ -Expanded list of supported encryption
"/ algorithms
"/
-"/ -Added option for Unicode filename
+"/ -Added option for Unicode filename
"/ storage
"/
"/ -Clarifications for consistent use
"/ of Data Descriptor records
"/
-"/ -Added additional "Extra Field"
+"/ -Added additional "Extra Field"
"/ definitions
"/
"/6.3.1 -Corrected standard hash values for 04/11/2007
@@ -1547,24 +1543,24 @@
"/
"/ Files stored in arbitrary order. Large .ZIP files can span multiple
"/ volumes or be split into user-defined segment sizes. All values
-"/ are stored in little-endian byte order unless otherwise specified.
+"/ are stored in little-endian byte order unless otherwise specified.
"/
"/ Overall .ZIP file format:
"/
"/ [local file header 1]
"/ [file data 1]
"/ [data descriptor 1]
-"/ .
+"/ .
"/ .
"/ .
"/ [local file header n]
"/ [file data n]
"/ [data descriptor n]
-"/ [archive decryption header]
-"/ [archive extra data record]
+"/ [archive decryption header]
+"/ [archive extra data record]
"/ [central directory]
"/ [zip64 end of central directory record]
-"/ [zip64 end of central directory locator]
+"/ [zip64 end of central directory locator]
"/ [end of central directory record]
"/
"/
@@ -1588,9 +1584,9 @@
"/ B. File data
"/
"/ Immediately following the local header for a file
-"/ is the compressed or stored data for the file.
+"/ is the compressed or stored data for the file.
"/ The series of [local file header][file data][data
-"/ descriptor] repeats for each file in the .ZIP archive.
+"/ descriptor] repeats for each file in the .ZIP archive.
"/
"/ C. Data descriptor:
"/
@@ -1606,18 +1602,18 @@
"/ was standard output or a non-seekable device. For ZIP64(tm) format
"/ archives, the compressed and uncompressed sizes are 8 bytes each.
"/
-"/ When compressing files, compressed and uncompressed sizes
-"/ should be stored in ZIP64 format (as 8 byte values) when a
-"/ files size exceeds 0xFFFFFFFF. However ZIP64 format may be
-"/ used regardless of the size of a file. When extracting, if
-"/ the zip64 extended information extra field is present for
+"/ When compressing files, compressed and uncompressed sizes
+"/ should be stored in ZIP64 format (as 8 byte values) when a
+"/ files size exceeds 0xFFFFFFFF. However ZIP64 format may be
+"/ used regardless of the size of a file. When extracting, if
+"/ the zip64 extended information extra field is present for
"/ the file the compressed and uncompressed sizes will be 8
-"/ byte values.
-"/
-"/ Although not originally assigned a signature, the value
-"/ 0x08074b50 has commonly been adopted as a signature value
-"/ for the data descriptor record. Implementers should be
-"/ aware that ZIP files may be encountered with or without this
+"/ byte values.
+"/
+"/ Although not originally assigned a signature, the value
+"/ 0x08074b50 has commonly been adopted as a signature value
+"/ for the data descriptor record. Implementers should be
+"/ aware that ZIP files may be encountered with or without this
"/ signature marking data descriptors and should account for
"/ either case when reading ZIP files to ensure compatibility.
"/ When writing ZIP files, it is recommended to include the
@@ -1637,26 +1633,26 @@
"/ its presence, the values in fields of the data descriptor
"/ record should be set to binary zeros.
"/
-"/ D. Archive decryption header:
+"/ D. Archive decryption header:
"/
"/ The Archive Decryption Header is introduced in version 6.2
"/ of the ZIP format specification. This record exists in support
-"/ of the Central Directory Encryption Feature implemented as part of
+"/ of the Central Directory Encryption Feature implemented as part of
"/ the Strong Encryption Specification as described in this document.
"/ When the Central Directory Structure is encrypted, this decryption
"/ header will precede the encrypted data segment. The encrypted
"/ data segment will consist of the Archive extra data record (if
"/ present) and the encrypted Central Directory Structure data.
"/ The format of this data record is identical to the Decryption
-"/ header record preceding compressed file data. If the central
+"/ header record preceding compressed file data. If the central
"/ directory structure is encrypted, the location of the start of
"/ this data record is determined using the Start of Central Directory
-"/ field in the Zip64 End of Central Directory record. Refer to the
+"/ field in the Zip64 End of Central Directory record. Refer to the
"/ section on the Strong Encryption Specification for information
"/ on the fields used in the Archive Decryption Header record.
"/
"/
-"/ E. Archive extra data record:
+"/ E. Archive extra data record:
"/
"/ archive extra data signature 4 bytes (0x08064b50)
"/ extra field length 4 bytes
@@ -1664,15 +1660,15 @@
"/
"/ The Archive Extra Data Record is introduced in version 6.2
"/ of the ZIP format specification. This record exists in support
-"/ of the Central Directory Encryption Feature implemented as part of
+"/ of the Central Directory Encryption Feature implemented as part of
"/ the Strong Encryption Specification as described in this document.
-"/ When present, this record immediately precedes the central
+"/ When present, this record immediately precedes the central
"/ directory data structure. The size of this data record will be
"/ included in the Size of the Central Directory field in the
"/ End of Central Directory record. If the central directory structure
"/ is compressed, but not encrypted, the location of the start of
"/ this data record is determined using the Start of Central Directory
-"/ field in the Zip64 End of Central Directory record.
+"/ field in the Zip64 End of Central Directory record.
"/
"/
"/ F. Central directory structure:
@@ -1680,9 +1676,9 @@
"/ [file header 1]
"/ .
"/ .
-"/ .
+"/ .
"/ [file header n]
-"/ [digital signature]
+"/ [digital signature]
"/
"/ File header:
"/
@@ -1714,26 +1710,26 @@
"/ size of data 2 bytes
"/ signature data (variable size)
"/
-"/ With the introduction of the Central Directory Encryption
-"/ feature in version 6.2 of this specification, the Central
-"/ Directory Structure may be stored both compressed and encrypted.
+"/ With the introduction of the Central Directory Encryption
+"/ feature in version 6.2 of this specification, the Central
+"/ Directory Structure may be stored both compressed and encrypted.
"/ Although not required, it is assumed when encrypting the
"/ Central Directory Structure, that it will be compressed
"/ for greater storage efficiency. Information on the
"/ Central Directory Encryption feature can be found in the section
-"/ describing the Strong Encryption Specification. The Digital
+"/ describing the Strong Encryption Specification. The Digital
"/ Signature record will be neither compressed nor encrypted.
"/
"/ G. Zip64 end of central directory record
"/
-"/ zip64 end of central dir
+"/ zip64 end of central dir
"/ signature 4 bytes (0x06064b50)
"/ size of zip64 end of central
"/ directory record 8 bytes
"/ version made by 2 bytes
"/ version needed to extract 2 bytes
"/ number of this disk 4 bytes
-"/ number of the disk with the
+"/ number of the disk with the
"/ start of the central directory 4 bytes
"/ total number of entries in the
"/ central directory on this disk 8 bytes
@@ -1751,15 +1747,15 @@
"/
"/ Size = SizeOfFixedFields + SizeOfVariableData - 12.
"/
-"/ The above record structure defines Version 1 of the
-"/ zip64 end of central directory record. Version 1 was
-"/ implemented in versions of this specification preceding
-"/ 6.2 in support of the ZIP64 large file feature. The
-"/ introduction of the Central Directory Encryption feature
-"/ implemented in version 6.2 as part of the Strong Encryption
-"/ Specification defines Version 2 of this record structure.
-"/ Refer to the section describing the Strong Encryption
-"/ Specification for details on the version 2 format for
+"/ The above record structure defines Version 1 of the
+"/ zip64 end of central directory record. Version 1 was
+"/ implemented in versions of this specification preceding
+"/ 6.2 in support of the ZIP64 large file feature. The
+"/ introduction of the Central Directory Encryption feature
+"/ implemented in version 6.2 as part of the Strong Encryption
+"/ Specification defines Version 2 of this record structure.
+"/ Refer to the section describing the Strong Encryption
+"/ Specification for details on the version 2 format for
"/ this record.
"/
"/ Special purpose data may reside in the zip64 extensible data
@@ -1771,7 +1767,7 @@
"/ Header ID - 2 bytes
"/ Data Size - 4 bytes
"/
-"/ The Header ID field indicates the type of data that is in the
+"/ The Header ID field indicates the type of data that is in the
"/ data block that follows.
"/
"/ Data Size identifies the number of bytes that follow for this
@@ -1784,10 +1780,10 @@
"/
"/ H. Zip64 end of central directory locator
"/
-"/ zip64 end of central dir locator
+"/ zip64 end of central dir locator
"/ signature 4 bytes (0x07064b50)
"/ number of the disk with the
-"/ start of the zip64 end of
+"/ start of the zip64 end of
"/ central directory 4 bytes
"/ relative offset of the zip64
"/ end of central directory record 8 bytes
@@ -1815,11 +1811,11 @@
"/ version made by (2 bytes)
"/
"/ The upper byte indicates the compatibility of the file
-"/ attribute information. If the external file attributes
-"/ are compatible with MS-DOS and can be read by PKZIP for
-"/ DOS version 2.04g then this value will be zero. If these
-"/ attributes are not compatible, then this value will
-"/ identify the host system on which the attributes are
+"/ attribute information. If the external file attributes
+"/ are compatible with MS-DOS and can be read by PKZIP for
+"/ DOS version 2.04g then this value will be zero. If these
+"/ attributes are not compatible, then this value will
+"/ identify the host system on which the attributes are
"/ compatible. Software can use this information to determine
"/ the line record format for text files etc. The current
"/ mappings are:
@@ -1836,22 +1832,22 @@
"/ 17 - Tandem 18 - OS/400
"/ 19 - OS/X (Darwin) 20 thru 255 - unused
"/
-"/ The lower byte indicates the ZIP specification version
-"/ (the version of this document) supported by the software
-"/ used to encode the file. The value/10 indicates the major
-"/ version number, and the value mod 10 is the minor version
-"/ number.
+"/ The lower byte indicates the ZIP specification version
+"/ (the version of this document) supported by the software
+"/ used to encode the file. The value/10 indicates the major
+"/ version number, and the value mod 10 is the minor version
+"/ number.
"/
"/ version needed to extract (2 bytes)
"/
-"/ The minimum supported ZIP specification version needed to
-"/ extract the file, mapped as above. This value is based on
-"/ the specific format features a ZIP program must support to
+"/ The minimum supported ZIP specification version needed to
+"/ extract the file, mapped as above. This value is based on
+"/ the specific format features a ZIP program must support to
"/ be able to extract the file. If multiple features are
-"/ applied to a file, the minimum version should be set to the
-"/ feature having the highest value. New features or feature
-"/ changes affecting the published format specification will be
-"/ implemented using higher version numbers than the last
+"/ applied to a file, the minimum version should be set to the
+"/ feature having the highest value. New features or feature
+"/ changes affecting the published format specification will be
+"/ implemented using higher version numbers than the last
"/ published value to avoid conflict.
"/
"/ Current minimum feature versions are as defined below:
@@ -1862,8 +1858,8 @@
"/ 2.0 - File is compressed using Deflate compression
"/ 2.0 - File is encrypted using traditional PKWARE encryption
"/ 2.1 - File is compressed using Deflate64(tm)
-"/ 2.5 - File is compressed using PKWARE DCL Implode
-"/ 2.7 - File is a patch data set
+"/ 2.5 - File is compressed using PKWARE DCL Implode
+"/ 2.7 - File is a patch data set
"/ 4.5 - File uses ZIP64 format extensions
"/ 4.6 - File is compressed using BZIP2 compression*
"/ 5.0 - File is encrypted using DES
@@ -1895,14 +1891,14 @@
"/ versions of PKZIP older than 6.1 (5.0 or 6.0).
"/
"/ + Files compressed using PPMd should set the version
-"/ needed to extract field to 6.3, however, not all ZIP
-"/ programs enforce this and may be unable to decompress
+"/ needed to extract field to 6.3, however, not all ZIP
+"/ programs enforce this and may be unable to decompress
"/ data files compressed using PPMd if this value is set.
"/
"/ When using ZIP64 extensions, the corresponding value in the
-"/ zip64 end of central directory record should also be set.
-"/ This field should be set appropriately to indicate whether
-"/ Version 1 or Version 2 format is in use.
+"/ zip64 end of central directory record should also be set.
+"/ This field should be set appropriately to indicate whether
+"/ Version 1 or Version 2 format is in use.
"/
"/ general purpose bit flag: (2 bytes)
"/
@@ -1938,26 +1934,26 @@
"/ Note: Bits 1 and 2 are undefined if the compression
"/ method is any other.
"/
-"/ Bit 3: If this bit is set, the fields crc-32, compressed
-"/ size and uncompressed size are set to zero in the
-"/ local header. The correct values are put in the
+"/ Bit 3: If this bit is set, the fields crc-32, compressed
+"/ size and uncompressed size are set to zero in the
+"/ local header. The correct values are put in the
"/ data descriptor immediately following the compressed
-"/ data. (Note: PKZIP version 2.04g for DOS only
-"/ recognizes this bit for method 8 compression, newer
-"/ versions of PKZIP recognize this bit for any
+"/ data. (Note: PKZIP version 2.04g for DOS only
+"/ recognizes this bit for method 8 compression, newer
+"/ versions of PKZIP recognize this bit for any
"/ compression method.)
"/
"/ Bit 4: Reserved for use with method 8, for enhanced
-"/ deflating.
-"/
-"/ Bit 5: If this bit is set, this indicates that the file is
-"/ compressed patched data. (Note: Requires PKZIP
+"/ deflating.
+"/
+"/ Bit 5: If this bit is set, this indicates that the file is
+"/ compressed patched data. (Note: Requires PKZIP
"/ version 2.70 or greater)
"/
"/ Bit 6: Strong encryption. If this bit is set, you should
"/ set the version needed to extract value to at least
"/ 50 and you must also set bit 0. If AES encryption
-"/ is used, the version needed to extract value must
+"/ is used, the version needed to extract value must
"/ be at least 51.
"/
"/ Bit 7: Currently unused.
@@ -1974,9 +1970,9 @@
"/
"/ Bit 12: Reserved by PKWARE for enhanced compression.
"/
-"/ Bit 13: Used when encrypting the Central Directory to indicate
+"/ Bit 13: Used when encrypting the Central Directory to indicate
"/ selected data values in the Local Header are masked to
-"/ hide their actual values. See the section describing
+"/ hide their actual values. See the section describing
"/ the Strong Encryption Specification for details.
"/
"/ Bit 14: Reserved by PKWARE.
@@ -2015,10 +2011,10 @@
"/
"/ The date and time are encoded in standard MS-DOS format.
"/ If input came from standard input, the date and time are
-"/ those at which compression was started for this data.
-"/ If encrypting the central directory and general purpose bit
-"/ flag 13 is set indicating masking, the value stored in the
-"/ Local Header will be zero.
+"/ those at which compression was started for this data.
+"/ If encrypting the central directory and general purpose bit
+"/ flag 13 is set indicating masking, the value stored in the
+"/ Local Header will be zero.
"/
"/ CRC-32: (4 bytes)
"/
@@ -2035,9 +2031,9 @@
"/ field is set to zero in the local header and the correct
"/ value is put in the data descriptor and in the central
"/ directory. When encrypting the central directory, if the
-"/ local header is not in ZIP64 format and general purpose
-"/ bit flag 13 is set indicating masking, the value stored
-"/ in the Local Header will be zero.
+"/ local header is not in ZIP64 format and general purpose
+"/ bit flag 13 is set indicating masking, the value stored
+"/ in the Local Header will be zero.
"/
"/ compressed size: (4 bytes)
"/ uncompressed size: (4 bytes)
@@ -2046,16 +2042,16 @@
"/ respectively. When a decryption header is present it will
"/ be placed in front of the file data and the value of the
"/ compressed file size will include the bytes of the decryption
-"/ header. If bit 3 of the general purpose bit flag is set,
-"/ these fields are set to zero in the local header and the
+"/ header. If bit 3 of the general purpose bit flag is set,
+"/ these fields are set to zero in the local header and the
"/ correct values are put in the data descriptor and
"/ in the central directory. If an archive is in ZIP64 format
"/ and the value in this field is 0xFFFFFFFF, the size will be
-"/ in the corresponding 8 byte ZIP64 extended information
+"/ in the corresponding 8 byte ZIP64 extended information
"/ extra field. When encrypting the central directory, if the
-"/ local header is not in ZIP64 format and general purpose bit
-"/ flag 13 is set indicating masking, the value stored for the
-"/ uncompressed size in the Local Header will be zero.
+"/ local header is not in ZIP64 format and general purpose bit
+"/ flag 13 is set indicating masking, the value stored for the
+"/ uncompressed size in the Local Header will be zero.
"/
"/ file name length: (2 bytes)
"/ extra field length: (2 bytes)
@@ -2065,13 +2061,13 @@
"/ fields respectively. The combined length of any
"/ directory record and these three fields should not
"/ generally exceed 65,535 bytes. If input came from standard
-"/ input, the file name length is set to zero.
+"/ input, the file name length is set to zero.
"/
"/ disk number start: (2 bytes)
"/
-"/ The number of the disk on which this file begins. If an
-"/ archive is in ZIP64 format and the value in this field is
-"/ 0xFFFF, the size will be in the corresponding 4 byte zip64
+"/ The number of the disk on which this file begins. If an
+"/ archive is in ZIP64 format and the value in this field is
+"/ 0xFFFF, the size will be in the corresponding 4 byte zip64
"/ extended information extra field.
"/
"/ internal file attributes: (2 bytes)
@@ -2083,13 +2079,13 @@
"/ set, that the file apparently contains binary data.
"/ The remaining bits are unused in version 1.0.
"/
-"/ The 0x0002 bit of this field indicates, if set, that a
-"/ 4 byte variable record length control field precedes each
-"/ logical record indicating the length of the record. The
+"/ The 0x0002 bit of this field indicates, if set, that a
+"/ 4 byte variable record length control field precedes each
+"/ logical record indicating the length of the record. The
"/ record length control field is stored in little-endian byte
-"/ order. This flag is independent of text control characters,
-"/ and if used in conjunction with text data, includes any
-"/ control characters in the total length of the record. This
+"/ order. This flag is independent of text control characters,
+"/ and if used in conjunction with text data, includes any
+"/ control characters in the total length of the record. This
"/ value is provided for mainframe data transfer support.
"/
"/ external file attributes: (4 bytes)
@@ -2105,7 +2101,7 @@
"/ This is the offset from the start of the first disk on
"/ which this file appears, to where the local header should
"/ be found. If an archive is in ZIP64 format and the value
-"/ in this field is 0xFFFFFFFF, the size will be in the
+"/ in this field is 0xFFFFFFFF, the size will be in the
"/ corresponding 8 byte zip64 extended information extra field.
"/
"/ file name: (Variable)
@@ -2117,21 +2113,21 @@
"/ backwards slashes '\' for compatibility with Amiga
"/ and UNIX file systems etc. If input came from standard
"/ input, there is no file name field. If encrypting
-"/ the central directory and general purpose bit flag 13 is set
-"/ indicating masking, the file name stored in the Local Header
-"/ will not be the actual file name. A masking value consisting
-"/ of a unique hexadecimal value will be stored. This value will
+"/ the central directory and general purpose bit flag 13 is set
+"/ indicating masking, the file name stored in the Local Header
+"/ will not be the actual file name. A masking value consisting
+"/ of a unique hexadecimal value will be stored. This value will
"/ be sequentially incremented for each file in the archive. See
-"/ the section on the Strong Encryption Specification for details
-"/ on retrieving the encrypted file name.
+"/ the section on the Strong Encryption Specification for details
+"/ on retrieving the encrypted file name.
"/
"/ extra field: (Variable)
"/
"/ This is for expansion. If additional information
-"/ needs to be stored for special needs or for specific
-"/ platforms, it should be stored here. Earlier versions
-"/ of the software can then safely skip this file, and
-"/ find the next file or header. This field will be 0
+"/ needs to be stored for special needs or for specific
+"/ platforms, it should be stored here. Earlier versions
+"/ of the software can then safely skip this file, and
+"/ find the next file or header. This field will be 0
"/ length in version 1.0.
"/
"/ In order to allow different programs and different types
@@ -2162,23 +2158,23 @@
"/ 0x0008 Reserved for extended language encoding data (PFS)
"/ (see APPENDIX D)
"/ 0x0009 OS/2
-"/ 0x000a NTFS
+"/ 0x000a NTFS
"/ 0x000c OpenVMS
"/ 0x000d UNIX
"/ 0x000e Reserved for file stream and fork descriptors
"/ 0x000f Patch Descriptor
"/ 0x0014 PKCS#7 Store for X.509 Certificates
-"/ 0x0015 X.509 Certificate ID and Signature for
+"/ 0x0015 X.509 Certificate ID and Signature for
"/ individual file
"/ 0x0016 X.509 Certificate ID for Central Directory
"/ 0x0017 Strong Encryption Header
"/ 0x0018 Record Management Controls
"/ 0x0019 PKCS#7 Encryption Recipient Certificate List
-"/ 0x0065 IBM S/390 (Z390), AS/400 (I400) attributes
+"/ 0x0065 IBM S/390 (Z390), AS/400 (I400) attributes
"/ - uncompressed
-"/ 0x0066 Reserved for IBM S/390 (Z390), AS/400 (I400)
+"/ 0x0066 Reserved for IBM S/390 (Z390), AS/400 (I400)
"/ attributes - compressed
-"/ 0x4690 POSZIP 4690 (reserved)
+"/ 0x4690 POSZIP 4690 (reserved)
"/
"/ Third party mappings commonly used are:
"/
@@ -2188,7 +2184,7 @@
"/ 0x2705 ZipIt Macintosh 1.3.5+
"/ 0x2805 ZipIt Macintosh 1.3.5+
"/ 0x334d Info-ZIP Macintosh
-"/ 0x4341 Acorn/SparkFS
+"/ 0x4341 Acorn/SparkFS
"/ 0x4453 Windows NT security descriptor (binary ACL)
"/ 0x4704 VM/CMS
"/ 0x470f MVS
@@ -2208,9 +2204,9 @@
"/ 0xa220 Microsoft Open Packaging Growth Hint
"/ 0xfd4a SMS/QDOS
"/
-"/ Detailed descriptions of Extra Fields defined by third
+"/ Detailed descriptions of Extra Fields defined by third
"/ party mappings will be documented as information on
-"/ these data structures is made available to PKWARE.
+"/ these data structures is made available to PKWARE.
"/ PKWARE does not guarantee the accuracy of any published
"/ third party data.
"/
@@ -2234,12 +2230,12 @@
"/
"/ -Zip64 Extended Information Extra Field (0x0001):
"/
-"/ The following is the layout of the zip64 extended
+"/ The following is the layout of the zip64 extended
"/ information "extra" block. If one of the size or
"/ offset fields in the Local or Central directory
"/ record is too small to hold the required data,
"/ a Zip64 extended information record is created.
-"/ The order of the fields in the zip64 extended
+"/ The order of the fields in the zip64 extended
"/ information record is fixed, but the fields will
"/ only appear if the corresponding Local or Central
"/ directory record field is set to 0xFFFF or 0xFFFFFFFF.
@@ -2250,7 +2246,7 @@
"/ ----- ---- -----------
"/ (ZIP64) 0x0001 2 bytes Tag for this "extra" block type
"/ Size 2 bytes Size of this "extra" block
-"/ Original
+"/ Original
"/ Size 8 bytes Original uncompressed file size
"/ Compressed
"/ Size 8 bytes Size of compressed data
@@ -2258,10 +2254,10 @@
"/ Offset 8 bytes Offset of local header record
"/ Disk Start
"/ Number 4 bytes Number of the disk on which
-"/ this file starts
+"/ this file starts
"/
"/ This entry in the Local header must include BOTH original
-"/ and compressed file size fields. If encrypting the
+"/ and compressed file size fields. If encrypting the
"/ central directory and bit 13 of the general purpose bit
"/ flag is set indicating masking, the value stored in the
"/ Local Header for the original file size will be zero.
@@ -2269,7 +2265,7 @@
"/
"/ -OS/2 Extra Field (0x0009):
"/
-"/ The following is the layout of the OS/2 attributes "extra"
+"/ The following is the layout of the OS/2 attributes "extra"
"/ block. (Last Revision 09/05/95)
"/
"/ Note: all fields stored in Intel low-byte/high-byte order.
@@ -2283,16 +2279,16 @@
"/ EACRC 4 bytes CRC value for uncompress block
"/ (var) variable Compressed block
"/
-"/ The OS/2 extended attribute structure (FEA2LIST) is
-"/ compressed and then stored in it's entirety within this
-"/ structure. There will only ever be one "block" of data in
+"/ The OS/2 extended attribute structure (FEA2LIST) is
+"/ compressed and then stored in it's entirety within this
+"/ structure. There will only ever be one "block" of data in
"/ VarFields[].
"/
"/ -NTFS Extra Field (0x000a):
"/
-"/ The following is the layout of the NTFS attributes
+"/ The following is the layout of the NTFS attributes
"/ "extra" block. (Note: At this time the Mtime, Atime
-"/ and Ctime values may be used on any WIN32 system.)
+"/ and Ctime values may be used on any WIN32 system.)
"/
"/ Note: all fields stored in Intel low-byte/high-byte order.
"/
@@ -2316,7 +2312,7 @@
"/
"/ Tag Size Description
"/ ----- ---- -----------
-"/ 0x0001 2 bytes Tag for attribute #1
+"/ 0x0001 2 bytes Tag for attribute #1
"/ Size1 2 bytes Size of attribute #1, in bytes
"/ Mtime 8 bytes File last modification time
"/ Atime 8 bytes File last access time
@@ -2324,7 +2320,7 @@
"/
"/ -OpenVMS Extra Field (0x000c):
"/
-"/ The following is the layout of the OpenVMS attributes
+"/ The following is the layout of the OpenVMS attributes
"/ "extra" block.
"/
"/ Note: all fields stored in Intel low-byte/high-byte order.
@@ -2346,10 +2342,10 @@
"/
"/ Rules:
"/
-"/ 1. There will be one or more of attributes present, which
-"/ will each be preceded by the above TagX & SizeX values.
-"/ These values are identical to the ATR$C_XXXX and
-"/ ATR$S_XXXX constants which are defined in ATR.H under
+"/ 1. There will be one or more of attributes present, which
+"/ will each be preceded by the above TagX & SizeX values.
+"/ These values are identical to the ATR$C_XXXX and
+"/ ATR$S_XXXX constants which are defined in ATR.H under
"/ OpenVMS C. Neither of these values will ever be zero.
"/
"/ 2. No word alignment or padding is performed.
@@ -2362,7 +2358,7 @@
"/ -UNIX Extra Field (0x000d):
"/
"/ The following is the layout of the UNIX "extra" block.
-"/ Note: all fields are stored in Intel low-byte/high-byte
+"/ Note: all fields are stored in Intel low-byte/high-byte
"/ order.
"/
"/ Value Size Description
@@ -2375,9 +2371,9 @@
"/ Gid 2 bytes File group ID
"/ (var) variable Variable length data field
"/
-"/ The variable length data field will contain file type
+"/ The variable length data field will contain file type
"/ specific data. Currently the only values allowed are
-"/ the original "linked to" file names for hard or symbolic
+"/ the original "linked to" file names for hard or symbolic
"/ links, and the major and minor device node numbers for
"/ character and block device nodes. Since device nodes
"/ cannot be either symbolic or hard links, only one set of
@@ -2401,11 +2397,11 @@
"/ (Patch) 0x000f 2 bytes Tag for this "extra" block type
"/ TSize 2 bytes Size of the total "extra" block
"/ Version 2 bytes Version of the descriptor
-"/ Flags 4 bytes Actions and reactions (see below)
-"/ OldSize 4 bytes Size of the file about to be patched
-"/ OldCRC 4 bytes 32-bit CRC of the file to be patched
-"/ NewSize 4 bytes Size of the resulting file
-"/ NewCRC 4 bytes 32-bit CRC of the resulting file
+"/ Flags 4 bytes Actions and reactions (see below)
+"/ OldSize 4 bytes Size of the file about to be patched
+"/ OldCRC 4 bytes 32-bit CRC of the file to be patched
+"/ NewSize 4 bytes Size of the resulting file
+"/ NewCRC 4 bytes 32-bit CRC of the resulting file
"/
"/ Actions and reactions
"/
@@ -2416,7 +2412,7 @@
"/ 2-3 RESERVED
"/ 4-5 Action (see below)
"/ 6-7 RESERVED
-"/ 8-9 Reaction (see below) to absent file
+"/ 8-9 Reaction (see below) to absent file
"/ 10-11 Reaction (see below) to newer file
"/ 12-13 Reaction (see below) to unknown file
"/ 14-15 RESERVED
@@ -2425,7 +2421,7 @@
"/ Actions
"/
"/ Action Value
-"/ ------ -----
+"/ ------ -----
"/ none 0
"/ add 1
"/ delete 2
@@ -2440,21 +2436,21 @@
"/ ignore 2
"/ fail 3
"/
-"/ Patch support is provided by PKPatchMaker(tm) technology and is
-"/ covered under U.S. Patents and Patents Pending. The use or
+"/ Patch support is provided by PKPatchMaker(tm) technology and is
+"/ covered under U.S. Patents and Patents Pending. The use or
"/ implementation in a product of certain technological aspects set
-"/ forth in the current APPNOTE, including those with regard to
+"/ forth in the current APPNOTE, including those with regard to
"/ strong encryption, patching, or extended tape operations requires
-"/ a license from PKWARE. Please contact PKWARE with regard to
-"/ acquiring a license.
+"/ a license from PKWARE. Please contact PKWARE with regard to
+"/ acquiring a license.
"/
"/ -PKCS#7 Store for X.509 Certificates (0x0014):
"/
-"/ This field contains information about each of the certificates
-"/ files may be signed with. When the Central Directory Encryption
-"/ feature is enabled for a ZIP file, this record will appear in
-"/ the Archive Extra Data Record, otherwise it will appear in the
-"/ first central directory record and will be ignored in any
+"/ This field contains information about each of the certificates
+"/ files may be signed with. When the Central Directory Encryption
+"/ feature is enabled for a ZIP file, this record will appear in
+"/ the Archive Extra Data Record, otherwise it will appear in the
+"/ first central directory record and will be ignored in any
"/ other record.
"/
"/ Note: all fields stored in Intel low-byte/high-byte order.
@@ -2468,9 +2464,9 @@
"/
"/ -X.509 Certificate ID and Signature for individual file (0x0015):
"/
-"/ This field contains the information about which certificate in
-"/ the PKCS#7 store was used to sign a particular file. It also
-"/ contains the signature data. This field can appear multiple
+"/ This field contains the information about which certificate in
+"/ the PKCS#7 store was used to sign a particular file. It also
+"/ contains the signature data. This field can appear multiple
"/ times, but can only appear once per certificate.
"/
"/ Note: all fields stored in Intel low-byte/high-byte order.
@@ -2483,10 +2479,10 @@
"/
"/ -X.509 Certificate ID and Signature for central directory (0x0016):
"/
-"/ This field contains the information about which certificate in
+"/ This field contains the information about which certificate in
"/ the PKCS#7 store was used to sign the central directory structure.
-"/ When the Central Directory Encryption feature is enabled for a
-"/ ZIP file, this record will appear in the Archive Extra Data Record,
+"/ When the Central Directory Encryption feature is enabled for a
+"/ ZIP file, this record will appear in the Archive Extra Data Record,
"/ otherwise it will appear in the first central directory record.
"/
"/ Note: all fields stored in Intel low-byte/high-byte order.
@@ -2509,8 +2505,8 @@
"/ Flags 2 bytes Processing flags
"/ CertData TSize-8 Certificate decryption extra field data
"/ (refer to the explanation for CertData
-"/ in the section describing the
-"/ Certificate Processing Method under
+"/ in the section describing the
+"/ Certificate Processing Method under
"/ the Strong Encryption Specification)
"/
"/
@@ -2531,14 +2527,14 @@
"/ DataN SizeN Attribute N data
"/
"/
-"/ -PKCS#7 Encryption Recipient Certificate List (0x0019):
+"/ -PKCS#7 Encryption Recipient Certificate List (0x0019):
"/
"/ This field contains information about each of the certificates
"/ used in encryption processing and it can be used to identify who is
-"/ allowed to decrypt encrypted files. This field should only appear
-"/ in the archive extra data record. This field is not required and
-"/ serves only to aide archive modifications by preserving public
-"/ encryption key data. Individual security requirements may dictate
+"/ allowed to decrypt encrypted files. This field should only appear
+"/ in the archive extra data record. This field is not required and
+"/ serves only to aide archive modifications by preserving public
+"/ encryption key data. Individual security requirements may dictate
"/ that this data be omitted to deter information exposure.
"/
"/ Note: all fields stored in Intel low-byte/high-byte order.
@@ -2591,10 +2587,10 @@
"/
"/ -ZipIt Macintosh Extra Field (long) (0x2605):
"/
-"/ The following is the layout of the ZipIt extra block
-"/ for Macintosh. The local-header and central-header versions
-"/ are identical. This block must be present if the file is
-"/ stored MacBinary-encoded and it should not be used if the file
+"/ The following is the layout of the ZipIt extra block
+"/ for Macintosh. The local-header and central-header versions
+"/ are identical. This block must be present if the file is
+"/ stored MacBinary-encoded and it should not be used if the file
"/ is not stored MacBinary-encoded.
"/
"/ Value Size Description
@@ -2632,7 +2628,7 @@
"/
"/ The following is the layout of a shortened variant of the
"/ ZipIt extra block for Macintosh used only for directory
-"/ entries. This variant is used by ZipIt 1.3.5 and newer to
+"/ entries. This variant is used by ZipIt 1.3.5 and newer to
"/ save some optional Mac-specific information about directories.
"/ The local-header and central-header versions are identical.
"/
@@ -2709,9 +2705,9 @@
"/ The ComCRC32 is the standard zip CRC32 checksum of the File Comment
"/ field in the central directory header. This is used to verify that
"/ the comment field has not changed since the Unicode Comment extra field
-"/ was created. This can happen if a utility changes the File Comment
-"/ field but does not update the UTF-8 Comment extra field. If the CRC
-"/ check fails, this Unicode Comment extra field should be ignored and
+"/ was created. This can happen if a utility changes the File Comment
+"/ field but does not update the UTF-8 Comment extra field. If the CRC
+"/ check fails, this Unicode Comment extra field should be ignored and
"/ the File Comment field in the header should be used instead.
"/
"/ The UnicodeCom field is the UTF-8 version of the File Comment field
@@ -2791,8 +2787,8 @@
"/
"/ The number of this disk, which contains central
"/ directory end record. If an archive is in ZIP64 format
-"/ and the value in this field is 0xFFFF, the size will
-"/ be in the corresponding 4 byte zip64 end of central
+"/ and the value in this field is 0xFFFF, the size will
+"/ be in the corresponding 4 byte zip64 end of central
"/ directory field.
"/
"/
@@ -2801,42 +2797,42 @@
"/
"/ The number of the disk on which the central
"/ directory starts. If an archive is in ZIP64 format
-"/ and the value in this field is 0xFFFF, the size will
-"/ be in the corresponding 4 byte zip64 end of central
+"/ and the value in this field is 0xFFFF, the size will
+"/ be in the corresponding 4 byte zip64 end of central
"/ directory field.
"/
-"/ total number of entries in the central dir on
+"/ total number of entries in the central dir on
"/ this disk: (2 bytes)
"/
"/ The number of central directory entries on this disk.
-"/ If an archive is in ZIP64 format and the value in
-"/ this field is 0xFFFF, the size will be in the
-"/ corresponding 8 byte zip64 end of central
+"/ If an archive is in ZIP64 format and the value in
+"/ this field is 0xFFFF, the size will be in the
+"/ corresponding 8 byte zip64 end of central
"/ directory field.
"/
"/ total number of entries in the central dir: (2 bytes)
"/
-"/ The total number of files in the .ZIP file. If an
+"/ The total number of files in the .ZIP file. If an
"/ archive is in ZIP64 format and the value in this field
-"/ is 0xFFFF, the size will be in the corresponding 8 byte
+"/ is 0xFFFF, the size will be in the corresponding 8 byte
"/ zip64 end of central directory field.
"/
"/ size of the central directory: (4 bytes)
"/
"/ The size (in bytes) of the entire central directory.
-"/ If an archive is in ZIP64 format and the value in
-"/ this field is 0xFFFFFFFF, the size will be in the
-"/ corresponding 8 byte zip64 end of central
+"/ If an archive is in ZIP64 format and the value in
+"/ this field is 0xFFFFFFFF, the size will be in the
+"/ corresponding 8 byte zip64 end of central
"/ directory field.
"/
"/ offset of start of central directory with respect to
"/ the starting disk number: (4 bytes)
"/
"/ Offset of the start of the central directory on the
-"/ disk on which the central directory starts. If an
-"/ archive is in ZIP64 format and the value in this
-"/ field is 0xFFFFFFFF, the size will be in the
-"/ corresponding 8 byte zip64 end of central
+"/ disk on which the central directory starts. If an
+"/ archive is in ZIP64 format and the value in this
+"/ field is 0xFFFFFFFF, the size will be in the
+"/ corresponding 8 byte zip64 end of central
"/ directory field.
"/
"/ .ZIP file comment length: (2 bytes)
@@ -2857,11 +2853,11 @@
"/
"/ K. Splitting and Spanning ZIP files
"/
-"/ Spanning is the process of segmenting a ZIP file across
-"/ multiple removable media. This support has typically only
-"/ been provided for DOS formatted floppy diskettes.
-"/
-"/ File splitting is a newer derivative of spanning.
+"/ Spanning is the process of segmenting a ZIP file across
+"/ multiple removable media. This support has typically only
+"/ been provided for DOS formatted floppy diskettes.
+"/
+"/ File splitting is a newer derivative of spanning.
"/ Splitting follows the same segmentation process as
"/ spanning, however, it does not require writing each
"/ segment to a unique removable medium and instead supports
@@ -2869,21 +2865,21 @@
"/ such as file systems, local drives, folders, etc...
"/
"/ A key difference between spanned and split ZIP files is
-"/ that all pieces of a spanned ZIP file have the same name.
-"/ Since each piece is written to a separate volume, no name
-"/ collisions occur and each segment can reuse the original
+"/ that all pieces of a spanned ZIP file have the same name.
+"/ Since each piece is written to a separate volume, no name
+"/ collisions occur and each segment can reuse the original
"/ .ZIP file name given to the archive.
"/
-"/ Sequence ordering for DOS spanned archives uses the DOS
+"/ Sequence ordering for DOS spanned archives uses the DOS
"/ volume label to determine segment numbers. Volume labels
-"/ for each segment are written using the form PKBACK#xxx,
-"/ where xxx is the segment number written as a decimal
+"/ for each segment are written using the form PKBACK#xxx,
+"/ where xxx is the segment number written as a decimal
"/ value from 001 - nnn.
"/
"/ Split ZIP files are typically written to the same location
"/ and are subject to name collisions if the spanned name
-"/ format is used since each segment will reside on the same
-"/ drive. To avoid name collisions, split archives are named
+"/ format is used since each segment will reside on the same
+"/ drive. To avoid name collisions, split archives are named
"/ as follows.
"/
"/ Segment 1 = filename.z01
@@ -2928,9 +2924,9 @@
oldFileNamed:name startOfArchive: startOfArchive endOfArchive: endOfArchive
^ self new
- setArchiveStartPosition:startOfArchive endPosition:endOfArchive;
- name:name mode:#read;
- yourself.
+ setArchiveStartPosition:startOfArchive endPosition:endOfArchive;
+ name:name mode:#read;
+ yourself.
"Modified: / 17-02-2017 / 22:15:25 / stefan"
!
@@ -2938,13 +2934,13 @@
readingFrom:aPositionableStream
"open an existing Zip archive - read data from aPositionableStream"
- ^ self new readingFrom:aPositionableStream.
+ ^ self new readingFrom:aPositionableStream.
!
writingTo:aPositionableStream
"open an new Zip archive - write data to aPositionableStream"
- ^ self new writingTo:aPositionableStream.
+ ^ self new writingTo:aPositionableStream.
! !
!ZipArchive class methodsFor:'Signal constants'!
@@ -2980,10 +2976,10 @@
!
zipFileCachingTime:seconds
- "by default, zip files are cached for some time,
+ "by default, zip files are cached for some time,
in case they are reconsulted soon.
The defualt time is 60s, but can be changed by this setter"
-
+
ZipFileCachingTime := seconds
! !
@@ -2991,13 +2987,13 @@
initialize
ZipFileFormatErrorSignal isNil ifTrue:[
- ZipFileFormatErrorSignal := OpenError newSignalMayProceed:true.
- ZipFileFormatErrorSignal nameClass:self message:#zipFileFormatErrorSignal.
- ZipFileFormatErrorSignal notifierString:'unrecognized/bad zip file format'.
-
- UnsupportedZipFileFormatErrorSignal := ZipFileFormatErrorSignal newSignal.
- UnsupportedZipFileFormatErrorSignal nameClass:self message:#unsupportedZipFileFormatErrorSignal.
- UnsupportedZipFileFormatErrorSignal notifierString:'unsupported zip file format'.
+ ZipFileFormatErrorSignal := OpenError newSignalMayProceed:true.
+ ZipFileFormatErrorSignal nameClass:self message:#zipFileFormatErrorSignal.
+ ZipFileFormatErrorSignal notifierString:'unrecognized/bad zip file format'.
+
+ UnsupportedZipFileFormatErrorSignal := ZipFileFormatErrorSignal newSignal.
+ UnsupportedZipFileFormatErrorSignal nameClass:self message:#unsupportedZipFileFormatErrorSignal.
+ UnsupportedZipFileFormatErrorSignal notifierString:'unsupported zip file format'.
].
DefaultAppendTrailingSlash := true.
@@ -3016,7 +3012,7 @@
"forget about cached zipArchives"
FlushBlock notNil ifTrue:[
- Processor removeTimedBlock:FlushBlock.
+ Processor removeTimedBlock:FlushBlock.
].
RecentlyUsedZipArchives := nil. FlushBlock := nil.
@@ -3029,7 +3025,7 @@
"forget about cached zipArchives"
FlushBlock isNil ifTrue:[
- FlushBlock := [RecentlyUsedZipArchives := nil. FlushBlock := nil].
+ FlushBlock := [RecentlyUsedZipArchives := nil. FlushBlock := nil].
].
Processor addTimedBlock:FlushBlock for:Processor timeoutHandlerProcess afterSeconds:(ZipFileCachingTime ? 60).
@@ -3116,9 +3112,9 @@
debugTrace:aBoolean
%{
if (aBoolean == true) {
- debugTrace = 1;
+ debugTrace = 1;
} else {
- debugTrace = 0;
+ debugTrace = 0;
}
%}
! !
@@ -3145,16 +3141,16 @@
dateToZipFileDate:aDate
"/ data in msdos format
- ^ (((aDate day)
- bitOr: (aDate month bitShift: 5))
- bitOr: (((aDate year) - 1980) bitShift: 9))
+ ^ (((aDate day)
+ bitOr: (aDate month bitShift: 5))
+ bitOr: (((aDate year) - 1980) bitShift: 9))
!
timeToZipFileTime:aTime
"/ time in msdos format
- ^ (((aTime seconds // 2)
- bitOr: (aTime minutes bitShift: 5))
- bitOr: (aTime hours bitShift: 11))
+ ^ (((aTime seconds // 2)
+ bitOr: (aTime minutes bitShift: 5))
+ bitOr: (aTime hours bitShift: 11))
! !
!ZipArchive methodsFor:'Compatibility-Squeak'!
@@ -3174,7 +3170,7 @@
see class documentation"
appendTrailingSlash isNil ifTrue:[
- appendTrailingSlash := DefaultAppendTrailingSlash
+ appendTrailingSlash := DefaultAppendTrailingSlash
].
^appendTrailingSlash
@@ -3183,7 +3179,7 @@
appendTrailingSlash:aBoolean
"Sets trailing slash behavior. If true, all directory entries
- will have a trailing slash in its nama. For details, see class
+ will have a trailing slash in its nama. For details, see class
documentation"
appendTrailingSlash := aBoolean.
@@ -3204,7 +3200,7 @@
fileSize
stream notNil ifTrue:[
- ^ stream size
+ ^ stream size
].
^ 0
!
@@ -3252,7 +3248,7 @@
signatureInformation
"for compatibility with SignedZipArchive"
-
+
^ nil
!
@@ -3270,27 +3266,27 @@
= aZipArchiveToCompare
"open both archives
- - check file size
- - check number of archive members
- - perform a binary compare of the archives."
+ - check file size
+ - check number of archive members
+ - perform a binary compare of the archives."
|streamBufferSize rdSize buf1 buf2 nextBlockSize stream1 stream2|
self == aZipArchiveToCompare ifTrue:[
- ^ true.
+ ^ true.
].
self class ~~ aZipArchiveToCompare class ifTrue:[
- ^ false.
+ ^ false.
].
(self fileSize ~= aZipArchiveToCompare fileSize) ifTrue:[
- ^ false
+ ^ false
].
(self numberOfEntries ~= aZipArchiveToCompare numberOfEntries) ifTrue:[
- ^ false
+ ^ false
].
"/ perform a binary compare of the archives
- streamBufferSize := self class streamBufferSize.
+ streamBufferSize := self class streamBufferSize.
rdSize := self fileSize.
buf1 := ByteArray new:streamBufferSize.
buf2 := ByteArray new:streamBufferSize.
@@ -3301,20 +3297,20 @@
stream2 reset.
[rdSize > 0] whileTrue:[
- rdSize > streamBufferSize ifTrue: [
- nextBlockSize := streamBufferSize.
- ] ifFalse: [
- nextBlockSize := rdSize.
- buf1 := ByteArray new:nextBlockSize.
- buf2 := ByteArray new:nextBlockSize.
- ].
-
- stream1 nextBytes:nextBlockSize into:buf1 startingAt:1.
- stream2 nextBytes:nextBlockSize into:buf2 startingAt:1.
- buf1 ~= buf2 ifTrue:[
- ^ false.
- ].
- rdSize := rdSize - nextBlockSize.
+ rdSize > streamBufferSize ifTrue: [
+ nextBlockSize := streamBufferSize.
+ ] ifFalse: [
+ nextBlockSize := rdSize.
+ buf1 := ByteArray new:nextBlockSize.
+ buf2 := ByteArray new:nextBlockSize.
+ ].
+
+ stream1 nextBytes:nextBlockSize into:buf1 startingAt:1.
+ stream2 nextBytes:nextBlockSize into:buf2 startingAt:1.
+ buf1 ~= buf2 ifTrue:[
+ ^ false.
+ ].
+ rdSize := rdSize - nextBlockSize.
].
^ true
@@ -3334,10 +3330,10 @@
close
stream notNil ifTrue:[
- self flush.
- stream close.
- stream := archiveName := centralDirectory := zipMembersByName := nil.
- firstEntry := lastEntry := nil.
+ self flush.
+ stream close.
+ stream := archiveName := centralDirectory := zipMembersByName := nil.
+ firstEntry := lastEntry := nil.
].
!
@@ -3345,7 +3341,7 @@
"finish the zip archive, but do not close the underlying stream"
(stream notNil and:[mode == #write]) ifTrue: [
- self addCentralZipDirectory
+ self addCentralZipDirectory
]
!
@@ -3356,14 +3352,14 @@
filename := name asFilename.
(readOrWriteMode = #read and:[filename exists not]) ifTrue:[
- ^ OpenError raiseRequestWith:filename errorString:' - file does not exist'.
+ ^ OpenError raiseRequestWith:filename errorString:' - file does not exist'.
].
filename isDirectory ifTrue:[
- ^ OpenError raiseRequestWith:filename errorString:' - file is a directory'.
+ ^ OpenError raiseRequestWith:filename errorString:' - file is a directory'.
].
stream notNil ifTrue: [
- self close.
+ self close.
].
archiveName := filename name.
@@ -3371,28 +3367,28 @@
self openFile.
mode ~~ #write ifTrue:[
- |mustCloseFile|
-
- mustCloseFile := true.
- [
- self readDirectory.
- mustCloseFile := false.
-
- mode == #append ifTrue:[
- members := self zipMembersByName values.
- members isEmptyOrNil ifTrue:[^ self].
-
- maxStartPosition := members maxApplying:[:eachMember | self dataStartOf:eachMember].
- lastMember := members detect:[:eachMember | eachMember dataStart = maxStartPosition].
-
- stream position:(startOfArchive + lastMember dataStart + lastMember compressedSize).
- mode := #write.
- ].
- ] ensure:[
- mustCloseFile ifTrue:[self close].
- ].
+ |mustCloseFile|
+
+ mustCloseFile := true.
+ [
+ self readDirectory.
+ mustCloseFile := false.
+
+ mode == #append ifTrue:[
+ members := self zipMembersByName values.
+ members isEmptyOrNil ifTrue:[^ self].
+
+ maxStartPosition := members maxApplying:[:eachMember | self dataStartOf:eachMember].
+ lastMember := members detect:[:eachMember | eachMember dataStart = maxStartPosition].
+
+ stream position:(startOfArchive + lastMember dataStart + lastMember compressedSize).
+ mode := #write.
+ ].
+ ] ensure:[
+ mustCloseFile ifTrue:[self close].
+ ].
] ifFalse:[
- zipMembersByName := Dictionary new.
+ zipMembersByName := Dictionary new.
].
"Modified: / 31-08-2010 / 12:39:25 / sr"
@@ -3412,21 +3408,21 @@
"initialize the archive to read from aPositionableStream"
stream notNil ifTrue: [
- stream ~~ aPositionableStream ifTrue: [
- self close.
- ].
+ stream ~~ aPositionableStream ifTrue: [
+ self close.
+ ].
].
mode := #read.
aPositionableStream binary.
stream := aPositionableStream.
aPositionableStream isFileStream ifTrue:[
- archiveName := aPositionableStream pathName.
- aPositionableStream isDirectory ifTrue:[
- OpenError raiseWith:self errorString:(' - is a directory').
- ].
+ archiveName := aPositionableStream pathName.
+ aPositionableStream isDirectory ifTrue:[
+ OpenError raiseWith:self errorString:(' - is a directory').
+ ].
] ifFalse:[
- archiveName := 'internal stream'.
+ archiveName := 'internal stream'.
].
self readDirectory.
@@ -3435,9 +3431,9 @@
reopenForReading
stream isNil ifTrue:[
- mode := #read.
- stream := archiveName asFilename readStream.
- stream binary
+ mode := #read.
+ stream := archiveName asFilename readStream.
+ stream binary
]
"Created: / 21-11-2010 / 12:02:37 / cg"
@@ -3447,16 +3443,16 @@
"initialize the archive to write to aPositionableStream"
stream notNil ifTrue: [
- self close.
+ self close.
].
mode := #write.
aPositionableStream binary.
stream := aPositionableStream.
aPositionableStream isFileStream ifTrue:[
- archiveName := aPositionableStream pathName.
+ archiveName := aPositionableStream pathName.
] ifFalse:[
- archiveName := 'internal stream'.
+ archiveName := 'internal stream'.
].
zipMembersByName := Dictionary new.
! !
@@ -3475,38 +3471,38 @@
dataStartOf:zipEntry
"fetch the absolute start address of the data of a given zipEntry.
Note: extra field and extra field length may be different from that in
- the central directory entry. Sow e have to fetch the local header."
+ the central directory entry. Sow e have to fetch the local header."
|dataStart fileHeaderStart fileNameLength extraFieldLength|
dataStart := zipEntry dataStart.
dataStart notNil ifTrue:[
- ^ dataStart.
+ ^ dataStart.
].
fileHeaderStart := zipEntry relativeLocalHeaderOffset + startOfArchive.
(fileHeaderStart + 30) > endOfArchive ifTrue: [
- ^ ZipFileFormatErrorSignal raiseRequestErrorString:' - zipEntry end is out of the archive bounds'.
+ ^ ZipFileFormatErrorSignal raiseRequestErrorString:' - zipEntry end is out of the archive bounds'.
].
"Now read the fileHeader:
- 0 local file header signature 4 bytes (0x04034b50)
- 4 version needed to extract 2 bytes
- 6 general purpose bit flag 2 bytes
- 8 compression method 2 bytes
- 10 last mod file time 2 bytes
- 12 last mod file date 2 bytes
- 14 crc-32 4 bytes
- 18 compressed size 4 bytes
- 22 uncompressed size 4 bytes
- 26 file name length (x) 2 bytes
- 28 extra field length (y) 2 bytes
- fixd size total len: 30
- 30 file name (variable size)
- 30+x extra field (variable size)
- 30+x+y data
+ 0 local file header signature 4 bytes (0x04034b50)
+ 4 version needed to extract 2 bytes
+ 6 general purpose bit flag 2 bytes
+ 8 compression method 2 bytes
+ 10 last mod file time 2 bytes
+ 12 last mod file date 2 bytes
+ 14 crc-32 4 bytes
+ 18 compressed size 4 bytes
+ 22 uncompressed size 4 bytes
+ 26 file name length (x) 2 bytes
+ 28 extra field length (y) 2 bytes
+ fixd size total len: 30
+ 30 file name (variable size)
+ 30+x extra field (variable size)
+ 30+x+y data
Note: extra field and extra field length may be different from that in
- the central directory entry!!
+ the central directory entry!!
"
stream position:fileHeaderStart+26.
@@ -3516,7 +3512,7 @@
dataStart := fileHeaderStart + 30 + fileNameLength + extraFieldLength.
(dataStart + (zipEntry compressedSize)) > endOfArchive ifTrue: [
- ^ ZipFileFormatErrorSignal raiseRequestErrorString:' - zipEntry end is out of the archive bounds'.
+ ^ ZipFileFormatErrorSignal raiseRequestErrorString:' - zipEntry end is out of the archive bounds'.
].
zipEntry dataStart:dataStart.
@@ -3527,17 +3523,17 @@
|fn|
stream isNil ifTrue:[
- fn := archiveName asFilename.
- mode ~~ #write ifTrue:[
- mode == #append ifTrue:[
- stream := fn readWriteStream.
- ] ifFalse:[
- stream := fn readStream.
- ].
- ] ifFalse:[
- stream := fn writeStream
- ].
- stream binary.
+ fn := archiveName asFilename.
+ mode ~~ #write ifTrue:[
+ mode == #append ifTrue:[
+ stream := fn readWriteStream.
+ ] ifFalse:[
+ stream := fn readStream.
+ ].
+ ] ifFalse:[
+ stream := fn writeStream
+ ].
+ stream binary.
].
"Modified: / 31-08-2010 / 12:40:41 / sr"
@@ -3548,13 +3544,13 @@
before. In that case the archive is the complete file."
startOfArchive isNil ifTrue: [
- "/ set archive zero position
- startOfArchive := 0.
+ "/ set archive zero position
+ startOfArchive := 0.
].
endOfArchive isNil ifTrue: [
- "/ set archive end position
- endOfArchive := stream size.
+ "/ set archive end position
+ endOfArchive := stream size.
].
!
@@ -3564,17 +3560,17 @@
fileNameParts := zipFileName asCollectionOfSubstringsSeparatedByAny:'/\'.
fileNameParts do:[:eachPart|
- eachPart notEmptyOrNil ifTrue:[
- validZipFileName isNil ifTrue:[
- validZipFileName := eachPart.
- ] ifFalse:[
- validZipFileName := validZipFileName, '/', eachPart.
- ].
- ].
+ eachPart notEmptyOrNil ifTrue:[
+ validZipFileName isNil ifTrue:[
+ validZipFileName := eachPart.
+ ] ifFalse:[
+ validZipFileName := validZipFileName, '/', eachPart.
+ ].
+ ].
].
validZipFileName isEmptyOrNil ifTrue:[
- ^ ZipFileFormatErrorSignal raiseRequestErrorString: (' - invalid zip file name ', zipFileName).
+ ^ ZipFileFormatErrorSignal raiseRequestErrorString: (' - invalid zip file name ', zipFileName).
].
^ validZipFileName
@@ -3596,10 +3592,10 @@
"decode rawBytes into a byteArray"
^ self
- decode:rawBytes
- method:compressionMethod
- size:uncompressedSize
- asString:false
+ decode:rawBytes
+ method:compressionMethod
+ size:uncompressedSize
+ asString:false
!
decode:rawBytes method:compressionMethod size:uncompressedSize asString:asString
@@ -3608,55 +3604,55 @@
|outBytes|
compressionMethod == COMPRESSION_STORED ifTrue:[
- "/
- "/ uncompressed
- "/
- asString ifTrue:[^ rawBytes asString].
- ^ rawBytes
+ "/
+ "/ uncompressed
+ "/
+ asString ifTrue:[^ rawBytes asString].
+ ^ rawBytes
].
compressionMethod == COMPRESSION_DEFLATED ifTrue:[
- "/
- "/ deflate/inflate algorithm
- "/
- asString ifTrue:[
- outBytes := String new:uncompressedSize.
- ] ifFalse:[
- outBytes := ByteArray new:uncompressedSize.
- ].
- ^ self inflate:rawBytes to:outBytes
+ "/
+ "/ deflate/inflate algorithm
+ "/
+ asString ifTrue:[
+ outBytes := String new:uncompressedSize.
+ ] ifFalse:[
+ outBytes := ByteArray new:uncompressedSize.
+ ].
+ ^ self inflate:rawBytes to:outBytes
].
"/
"/ the other algorithms are not (yet) supported
"/
compressionMethod == COMPRESSION_SHRUNK ifTrue:[
- self error:'unsupported compression method: SHRUNK'.
- ^ nil
+ self error:'unsupported compression method: SHRUNK'.
+ ^ nil
].
compressionMethod == COMPRESSION_REDUCED1 ifTrue:[
- self error:'unsupported compression method: REDUCED1'.
- ^ nil
+ self error:'unsupported compression method: REDUCED1'.
+ ^ nil
].
compressionMethod == COMPRESSION_REDUCED2 ifTrue:[
- self error:'unsupported compression method: REDUCED2'.
- ^ nil
+ self error:'unsupported compression method: REDUCED2'.
+ ^ nil
].
compressionMethod == COMPRESSION_REDUCED3 ifTrue:[
- self error:'unsupported compression method: REDUCED3'.
- ^ nil
+ self error:'unsupported compression method: REDUCED3'.
+ ^ nil
].
compressionMethod == COMPRESSION_REDUCED4 ifTrue:[
- self error:'unsupported compression method: REDUCED4'.
- ^ nil
+ self error:'unsupported compression method: REDUCED4'.
+ ^ nil
].
compressionMethod == COMPRESSION_IMPLODED ifTrue:[
- self error:'unsupported compression method: IMPLODED'.
- ^ nil
+ self error:'unsupported compression method: IMPLODED'.
+ ^ nil
].
compressionMethod == COMPRESSION_TOKENIZED ifTrue:[
- self error:'unsupported compression method: TOKENIZED'.
- ^ nil
+ self error:'unsupported compression method: TOKENIZED'.
+ ^ nil
].
self error:'unsupported compression method'.
@@ -3673,40 +3669,40 @@
char *in, *out;
if (__isByteArrayLike(inBytes)) {
- in = __byteArrayVal(inBytes);
+ in = __byteArrayVal(inBytes);
} else if (__isStringLike(inBytes)) {
- in = __stringVal(inBytes);
+ in = __stringVal(inBytes);
} else {
- inflateReturnCode = @symbol(badArgument1);
- goto badArgument;
+ inflateReturnCode = @symbol(badArgument1);
+ goto badArgument;
}
if (__isByteArray(outBytes)) {
- out = __byteArrayVal(outBytes);
+ out = __byteArrayVal(outBytes);
} else if (__isString(outBytes)) {
- out = __stringVal(outBytes);
+ out = __stringVal(outBytes);
} else {
- inflateReturnCode = @symbol(badArgument2);
- goto badArgument;
+ inflateReturnCode = @symbol(badArgument2);
+ goto badArgument;
}
{
- int rc = stx_inflate(in, out);
-
- if (rc == 0) {
- RETURN (outBytes);
- }
- inflateReturnCode = __MKSMALLINT(rc);
+ int rc = stx_inflate(in, out);
+
+ if (rc == 0) {
+ RETURN (outBytes);
+ }
+ inflateReturnCode = __MKSMALLINT(rc);
}
badArgument: ;
%}.
inflateReturnCode notNil ifTrue:[
- inflateReturnCode isSymbol ifTrue:[
- self primitiveFailed:inflateReturnCode
- ].
-
- "/ bad blockType 2
- self error:'inflate error: ' , inflateReturnCode printString
+ inflateReturnCode isSymbol ifTrue:[
+ self primitiveFailed:inflateReturnCode
+ ].
+
+ "/ bad blockType 2
+ self error:'inflate error: ' , inflateReturnCode printString
].
^ nil.
@@ -3715,11 +3711,11 @@
!ZipArchive methodsFor:'private - directory stuff'!
-addCentralZipDirectory
+addCentralZipDirectory
|noEntries|
centralDirectory isNil ifTrue: [
- centralDirectory := ZipCentralDirectory new default.
+ centralDirectory := ZipCentralDirectory new default.
].
noEntries := 0.
@@ -3730,36 +3726,36 @@
centralDirectory centralDirectoryStartOffset: stream position.
self zipMembersDo:[:zipEntry |
- noEntries := noEntries + 1.
- stream nextPutInt32LSB: C_CENTRAL_HEADER_SIGNATURE.
- stream nextPutInt16LSB:zipEntry versionMadeBy.
- stream nextPutInt16LSB:zipEntry versionNeedToExtract.
- stream nextPutInt16LSB:zipEntry generalPurposBitFlag.
- stream nextPutInt16LSB:zipEntry compressionMethod.
- stream nextPutInt16LSB:zipEntry lastModFileTime.
- stream nextPutInt16LSB:zipEntry lastModFileDate.
- stream nextPutInt32LSB:zipEntry crc32.
- stream nextPutInt32LSB:zipEntry compressedSize.
- stream nextPutInt32LSB:zipEntry uncompressedSize.
- stream nextPutInt16LSB:zipEntry fileNameLength.
- stream nextPutInt16LSB:zipEntry extraFieldLength.
- stream nextPutInt16LSB:zipEntry fileCommentLength.
- stream nextPutInt16LSB:zipEntry diskNumberStart.
- stream nextPutInt16LSB:zipEntry internalFileAttributes.
- stream nextPutInt32LSB:zipEntry externalFileAttributes.
- stream nextPutInt32LSB:zipEntry relativeLocalHeaderOffset.
-
- self assert:zipEntry fileNameLength = zipEntry fileName size.
- stream nextPutAll:zipEntry fileName.
-
- zipEntry extraField notNil ifTrue: [
- self assert:zipEntry extraFieldLength = zipEntry extraField size.
- stream nextPutAll:zipEntry extraField.
- ].
- zipEntry fileComment notNil ifTrue: [
- self assert:zipEntry fileCommentLength = zipEntry fileComment size.
- stream nextPutAll:zipEntry fileComment.
- ].
+ noEntries := noEntries + 1.
+ stream nextPutInt32LSB: C_CENTRAL_HEADER_SIGNATURE.
+ stream nextPutInt16LSB:zipEntry versionMadeBy.
+ stream nextPutInt16LSB:zipEntry versionNeedToExtract.
+ stream nextPutInt16LSB:zipEntry generalPurposBitFlag.
+ stream nextPutInt16LSB:zipEntry compressionMethod.
+ stream nextPutInt16LSB:zipEntry lastModFileTime.
+ stream nextPutInt16LSB:zipEntry lastModFileDate.
+ stream nextPutInt32LSB:zipEntry crc32.
+ stream nextPutInt32LSB:zipEntry compressedSize.
+ stream nextPutInt32LSB:zipEntry uncompressedSize.
+ stream nextPutInt16LSB:zipEntry fileNameLength.
+ stream nextPutInt16LSB:zipEntry extraFieldLength.
+ stream nextPutInt16LSB:zipEntry fileCommentLength.
+ stream nextPutInt16LSB:zipEntry diskNumberStart.
+ stream nextPutInt16LSB:zipEntry internalFileAttributes.
+ stream nextPutInt32LSB:zipEntry externalFileAttributes.
+ stream nextPutInt32LSB:zipEntry relativeLocalHeaderOffset.
+
+ self assert:zipEntry fileNameLength = zipEntry fileName size.
+ stream nextPutAll:zipEntry fileName.
+
+ zipEntry extraField notNil ifTrue: [
+ self assert:zipEntry extraFieldLength = zipEntry extraField size.
+ stream nextPutAll:zipEntry extraField.
+ ].
+ zipEntry fileComment notNil ifTrue: [
+ self assert:zipEntry fileCommentLength = zipEntry fileComment size.
+ stream nextPutAll:zipEntry fileComment.
+ ].
].
centralDirectory centralDirectoryTotalNoOfEntries: noEntries.
@@ -3779,7 +3775,7 @@
stream nextPutInt16LSB:centralDirectory zipCommentLength.
centralDirectory zipCommentLength ~~ 0 ifTrue: [
- stream nextPutAll: centralDirectory zipComment.
+ stream nextPutAll: centralDirectory zipComment.
].
"Modified: / 19-11-2010 / 16:23:36 / cg"
@@ -3788,18 +3784,18 @@
addMember:zmemb
"add a zipMember"
- zipMembersByName at:zmemb fileName put:zmemb ifPresent:[:oldEntry|
- "ignore duplicate entries for backward compatibility.
- Argh: expecco once added wrong duplicates to the end of ets files.
- The first entry is valid."
- Logger warning:'duplicate entry in ZIP file ignored: %1' with:zmemb fileName.
- ^ oldEntry.
- ].
+ zipMembersByName at:zmemb fileName put:zmemb ifPresent:[:oldEntry|
+ "ignore duplicate entries for backward compatibility.
+ Argh: expecco once added wrong duplicates to the end of ets files.
+ The first entry is valid."
+ Logger warning:'duplicate entry in ZIP file ignored: %1' with:zmemb fileName.
+ ^ oldEntry.
+ ].
firstEntry isNil ifTrue:[
- firstEntry := zmemb
+ firstEntry := zmemb
] ifFalse:[
- lastEntry next:zmemb.
+ lastEntry next:zmemb.
].
lastEntry := zmemb.
@@ -3816,18 +3812,18 @@
|size|
stream isNil ifTrue: [
- ^ false
+ ^ false
].
self setDefaultArchiveBounds.
size := endOfArchive - startOfArchive.
size == 0 ifTrue:[
- ^ false
+ ^ false
].
(size < (ECREC_SIZE+4)) ifTrue:[
- ^ false.
+ ^ false.
].
^ self searchForEndOfCentralDirectorySignature
@@ -3841,9 +3837,9 @@
self openFile.
^ [
- self checkZipArchive.
+ self checkZipArchive.
] ensure:[
- self close.
+ self close.
].
"Modified: / 17-02-2017 / 22:22:44 / stefan"
@@ -3864,18 +3860,18 @@
nameWithSlash := name , '/'.
self zipMembersDo:[:each |
- | fn |
-
- fn := each fileName.
- (fn = name) ifTrue:[^ each].
- "Try if they differ only in trailing slash"
- ((fn size) = (name size + 1)
- and:[fn = nameWithSlash]) ifTrue:[
- "/Here, return a copy with patched name:
- ^each copy
- fileName: name;
- yourself.
- ]
+ | fn |
+
+ fn := each fileName.
+ (fn = name) ifTrue:[^ each].
+ "Try if they differ only in trailing slash"
+ ((fn size) = (name size + 1)
+ and:[fn = nameWithSlash]) ifTrue:[
+ "/Here, return a copy with patched name:
+ ^each copy
+ fileName: name;
+ yourself.
+ ]
].
^ nil
@@ -3886,7 +3882,7 @@
"find a zipMember by condition"
self zipMembersDo:[:zipd |
- (aOneArgBlock value:zipd) ifTrue:[^ zipd].
+ (aOneArgBlock value:zipd) ifTrue:[^ zipd].
].
^ nil
@@ -3902,15 +3898,15 @@
size := endOfArchive - startOfArchive.
(size == 0) ifTrue:[
- ^ self
+ ^ self
].
(size < (ECREC_SIZE+4)) ifTrue:[
- ^ ZipFileFormatErrorSignal raiseRequestErrorString:' - zipfile too short'.
+ ^ ZipFileFormatErrorSignal raiseRequestErrorString:' - zipfile too short'.
].
self searchForEndOfCentralDirectorySignature ifFalse: [
- ^ ZipFileFormatErrorSignal raiseRequestErrorString:' - could not find end of directory signature'.
+ ^ ZipFileFormatErrorSignal raiseRequestErrorString:' - could not find end of directory signature'.
].
"/ position before end of central directory signature
@@ -3919,52 +3915,52 @@
"/ Now we have found the end of central directory record
centralDirectory := ZipCentralDirectory new.
EndOfStreamNotification handle:[:ex|
- ZipFileFormatErrorSignal raiseRequestErrorString:' - file format error or short file: ' ,
- (stream isFileStream ifTrue:[stream pathName] ifFalse:['inStream']).
- ^ self.
+ ZipFileFormatErrorSignal raiseRequestErrorString:' - file format error or short file: ' ,
+ (stream isFileStream ifTrue:[stream pathName] ifFalse:['inStream']).
+ ^ self.
] do:[
- centralDirectory readFrom:stream.
-
- "/ set file position to start of central directory
- (pos0 - centralDirectory centralDirectoryStartOffset - centralDirectory centralDirectorySize) < startOfArchive ifTrue: [
- ^ ZipFileFormatErrorSignal raiseRequestErrorString:' - central directory start is out of the archive bounds'.
- ].
-
- startOfArchive := pos0 - centralDirectory centralDirectoryStartOffset - centralDirectory centralDirectorySize.
- stream position:(pos0 - (centralDirectory centralDirectorySize)).
-
- zipMembersByName := Dictionary new:centralDirectory centralDirectoryTotalNoOfEntries.
-
- "/ read central directory entries
- 1 to:(centralDirectory centralDirectoryTotalNoOfEntries) do:[:i |
- |zipd centralFileHeaderSignature|
-
- (stream position + (self class centralDirectoryMinimumSize)) > endOfArchive ifTrue: [
- ^ ZipFileFormatErrorSignal raiseRequestErrorString:' - central directory entry out of archive bounds'.
- ].
- centralFileHeaderSignature := stream nextInt32MSB:false.
- centralFileHeaderSignature ~= C_CENTRAL_HEADER_SIGNATURE ifTrue:[
- ZipFileFormatErrorSignal raiseRequestErrorString:' - file format error - bad centralHeaderSignature in: ' ,
- (stream isFileStream ifTrue:[stream pathName] ifFalse:['inStream']).
- ^ self.
- ].
-
- zipd := ZipMember new readCentralDirectoryEntryFrom:stream.
- self addMember:zipd.
- ].
-
- (stream position + 6) > endOfArchive ifTrue: [
- "/ archive has no digital signature
- ^ self.
- ].
-
- "/ check for digital signature
- ((stream nextByte ~~ ($P codePoint))
- or:[stream nextByte ~~ ($K codePoint)
- or:[stream nextByte ~~ 8r005
- or:[stream nextByte ~~ 8r005]]]) ifTrue:[
- centralDirectory readDigitalSignatureFrom:stream.
- ].
+ centralDirectory readFrom:stream.
+
+ "/ set file position to start of central directory
+ (pos0 - centralDirectory centralDirectoryStartOffset - centralDirectory centralDirectorySize) < startOfArchive ifTrue: [
+ ^ ZipFileFormatErrorSignal raiseRequestErrorString:' - central directory start is out of the archive bounds'.
+ ].
+
+ startOfArchive := pos0 - centralDirectory centralDirectoryStartOffset - centralDirectory centralDirectorySize.
+ stream position:(pos0 - (centralDirectory centralDirectorySize)).
+
+ zipMembersByName := Dictionary new:centralDirectory centralDirectoryTotalNoOfEntries.
+
+ "/ read central directory entries
+ 1 to:(centralDirectory centralDirectoryTotalNoOfEntries) do:[:i |
+ |zipd centralFileHeaderSignature|
+
+ (stream position + (self class centralDirectoryMinimumSize)) > endOfArchive ifTrue: [
+ ^ ZipFileFormatErrorSignal raiseRequestErrorString:' - central directory entry out of archive bounds'.
+ ].
+ centralFileHeaderSignature := stream nextInt32MSB:false.
+ centralFileHeaderSignature ~= C_CENTRAL_HEADER_SIGNATURE ifTrue:[
+ ZipFileFormatErrorSignal raiseRequestErrorString:' - file format error - bad centralHeaderSignature in: ' ,
+ (stream isFileStream ifTrue:[stream pathName] ifFalse:['inStream']).
+ ^ self.
+ ].
+
+ zipd := ZipMember new readCentralDirectoryEntryFrom:stream.
+ self addMember:zipd.
+ ].
+
+ (stream position + 6) > endOfArchive ifTrue: [
+ "/ archive has no digital signature
+ ^ self.
+ ].
+
+ "/ check for digital signature
+ ((stream nextByte ~~ ($P codePoint))
+ or:[stream nextByte ~~ ($K codePoint)
+ or:[stream nextByte ~~ 8r005
+ or:[stream nextByte ~~ 8r005]]]) ifTrue:[
+ centralDirectory readDigitalSignatureFrom:stream.
+ ].
]
"
@@ -3991,36 +3987,36 @@
or:[stream nextByte ~~ ($K codePoint)
or:[stream nextByte ~~ 8r005
or:[stream nextByte ~~ 8r006]]]) ifTrue:[
- "/ search from end of archive backwards for "end of central directory signature",
- "/ this is necessary if the archive includes a .ZIP file comment or a digital signature
- "/ then the end of the directory signature may be on an other position
-
- "/ but the "end of central directory signature" must be located in the
- "/ last 64k of the archive
- size > 65536 ifTrue: [
- searchEndPos := (endOfArchive - 65536).
- ] ifFalse: [
- searchEndPos := startOfArchive.
- ].
-
- stream position: (pos0 := endOfArchive - 4).
-
- [foundPK] whileFalse: [
- (stream nextByte == ($P codePoint)
- and:[stream nextByte == ($K codePoint)
- and:[stream nextByte == 8r005
- and:[stream nextByte == 8r006]]]) ifTrue:[
- ^ true
- ].
- stream position <= searchEndPos ifTrue: [
- ^ false.
- ].
- pos0 == 0 ifTrue:[
- ^ false.
- ].
- stream position: (pos0 := pos0 - 1).
- ].
- ^ false
+ "/ search from end of archive backwards for "end of central directory signature",
+ "/ this is necessary if the archive includes a .ZIP file comment or a digital signature
+ "/ then the end of the directory signature may be on an other position
+
+ "/ but the "end of central directory signature" must be located in the
+ "/ last 64k of the archive
+ size > 65536 ifTrue: [
+ searchEndPos := (endOfArchive - 65536).
+ ] ifFalse: [
+ searchEndPos := startOfArchive.
+ ].
+
+ stream position: (pos0 := endOfArchive - 4).
+
+ [foundPK] whileFalse: [
+ (stream nextByte == ($P codePoint)
+ and:[stream nextByte == ($K codePoint)
+ and:[stream nextByte == 8r005
+ and:[stream nextByte == 8r006]]]) ifTrue:[
+ ^ true
+ ].
+ stream position <= searchEndPos ifTrue: [
+ ^ false.
+ ].
+ pos0 == 0 ifTrue:[
+ ^ false.
+ ].
+ stream position: (pos0 := pos0 - 1).
+ ].
+ ^ false
].
^ true
!
@@ -4032,8 +4028,8 @@
zipd := firstEntry.
[zipd notNil] whileTrue:[
- aBlock value:zipd.
- zipd := zipd next
+ aBlock value:zipd.
+ zipd := zipd next
].
"Created: / 29.3.1998 / 19:15:15 / cg"
@@ -4052,10 +4048,10 @@
isValidPath: anArchivePathName
self zipMembersByName
- keysDo:[:eachMemberName |
- ((eachMemberName startsWith:anArchivePathName,'/')
- or:[eachMemberName = anArchivePathName]) ifTrue:[^ true]
- ].
+ keysDo:[:eachMemberName |
+ ((eachMemberName startsWith:anArchivePathName,'/')
+ or:[eachMemberName = anArchivePathName]) ifTrue:[^ true]
+ ].
^ false.
! !
@@ -4073,22 +4069,22 @@
"extract an entry identified by fileName as a byteArray or string;
nil on errors"
- self
- withPositionAndMemberFor:fileName
- do:[:zmemb :position |
- |rawContents data|
-
- stream position:position.
- rawContents := stream nextBytes:(zmemb compressedSize).
-
- data := self
- decode:rawContents
- method:(zmemb compressionMethod)
- size:(zmemb uncompressedSize)
- asString:asString.
-
- ^ data.
- ].
+ self
+ withPositionAndMemberFor:fileName
+ do:[:zmemb :position |
+ |rawContents data|
+
+ stream position:position.
+ rawContents := stream nextBytes:(zmemb compressedSize).
+
+ data := self
+ decode:rawContents
+ method:(zmemb compressionMethod)
+ size:(zmemb uncompressedSize)
+ asString:asString.
+
+ ^ data.
+ ].
^ nil
@@ -4111,54 +4107,54 @@
osDirectory := osDirectoryName asFilename.
directoryAlreadyCreated := osDirectory exists.
(directoryAlreadyCreated and: [osDirectory isDirectory not]) ifTrue:[
- "no way to create the base directory - done"
- OperatingSystem accessDeniedErrorSignal
- raiseRequestWith:osDirectory
- errorString:(' - ZipArchive - cannot create base directory: ' , osDirectory asString).
- ^ self.
+ "no way to create the base directory - done"
+ OperatingSystem accessDeniedErrorSignal
+ raiseRequestWith:osDirectory
+ errorString:(' - ZipArchive - cannot create base directory: ' , osDirectory asString).
+ ^ self.
].
archiveDirectoryNameSize := archiveDirectoryName size.
self members do: [:eachZipArchiveMember|
- |eachZipArchiveMemberName baseName directory fileNameOrDirectoryEntry|
-
- eachZipArchiveMemberName := eachZipArchiveMember fileName.
-
- ((eachZipArchiveMemberName startsWith:archiveDirectoryName)
- and:[eachZipArchiveMemberName size = archiveDirectoryNameSize
- or:[(eachZipArchiveMemberName at:archiveDirectoryNameSize+1) == $/]]) ifTrue: [
-
- directoryAlreadyCreated ifFalse:[
- osDirectory recursiveMakeDirectory.
- directoryAlreadyCreated := true.
- ].
- baseName := eachZipArchiveMemberName copyFrom:(archiveDirectoryNameSize+1).
- (baseName notEmpty and:[baseName first == $/]) ifTrue:[
- baseName := baseName copyFrom:2.
- ].
-
- baseName notEmpty ifTrue:[
- fileNameOrDirectoryEntry := osDirectory construct:baseName.
-
- "Note, that a ZipArchive usually does not contain entries for directories!!"
- (eachZipArchiveMember externalFileAttributes bitTest:EXTERNALFILEATTRIBUTES_ISDIRECTORY) ifTrue:[
- fileNameOrDirectoryEntry recursiveMakeDirectory.
- ] ifFalse: [
- "make sure, that the directory exists"
- directory := fileNameOrDirectoryEntry directory.
- directory isDirectory ifFalse:[
- directory recursiveMakeDirectory.
- ].
-
- fileNameOrDirectoryEntry writingFileDo:[:aStream|
- self
- extract:eachZipArchiveMemberName
- intoStream: aStream.
- ].
- ].
- ].
- ]
+ |eachZipArchiveMemberName baseName directory fileNameOrDirectoryEntry|
+
+ eachZipArchiveMemberName := eachZipArchiveMember fileName.
+
+ ((eachZipArchiveMemberName startsWith:archiveDirectoryName)
+ and:[eachZipArchiveMemberName size = archiveDirectoryNameSize
+ or:[(eachZipArchiveMemberName at:archiveDirectoryNameSize+1) == $/]]) ifTrue: [
+
+ directoryAlreadyCreated ifFalse:[
+ osDirectory recursiveMakeDirectory.
+ directoryAlreadyCreated := true.
+ ].
+ baseName := eachZipArchiveMemberName copyFrom:(archiveDirectoryNameSize+1).
+ (baseName notEmpty and:[baseName first == $/]) ifTrue:[
+ baseName := baseName copyFrom:2.
+ ].
+
+ baseName notEmpty ifTrue:[
+ fileNameOrDirectoryEntry := osDirectory construct:baseName.
+
+ "Note, that a ZipArchive usually does not contain entries for directories!!"
+ (eachZipArchiveMember externalFileAttributes bitTest:EXTERNALFILEATTRIBUTES_ISDIRECTORY) ifTrue:[
+ fileNameOrDirectoryEntry recursiveMakeDirectory.
+ ] ifFalse: [
+ "make sure, that the directory exists"
+ directory := fileNameOrDirectoryEntry directory.
+ directory isDirectory ifFalse:[
+ directory recursiveMakeDirectory.
+ ].
+
+ fileNameOrDirectoryEntry writingFileDo:[:aStream|
+ self
+ extract:eachZipArchiveMemberName
+ intoStream: aStream.
+ ].
+ ].
+ ].
+ ]
].
!
@@ -4166,8 +4162,8 @@
|zmemb dataStart|
(stream isNil or:[mode ~~ #read]) ifTrue:[
- ^ self error: 'ZipArchive not open for reading ...'.
- ].
+ ^ self error: 'ZipArchive not open for reading ...'.
+ ].
zmemb := self findMember:fileName.
zmemb isNil ifTrue:[^ nil].
@@ -4185,43 +4181,43 @@
"extract an entry identified by filename into aWriteStream"
self
- withPositionAndMemberFor:fileName
- do:[:zmemb :position |
- |buffer rdSize compressionMethod nextBlockSize streamBufferSize myZipStream|
-
- stream position:position.
-
- compressionMethod := zmemb compressionMethod.
- rdSize := zmemb uncompressedSize.
- nextBlockSize := streamBufferSize := self class streamBufferSize.
- buffer := ByteArray new: streamBufferSize.
- [
- [rdSize > 0] whileTrue: [
- rdSize < streamBufferSize ifTrue: [
- nextBlockSize := rdSize.
- ].
-
- compressionMethod == COMPRESSION_DEFLATED ifTrue:[
- myZipStream isNil ifTrue: [
- stream binary.
- myZipStream := ZipStream readOpenAsZipStreamOn:stream suppressHeaderAndChecksum:true.
- ].
- myZipStream next:nextBlockSize into:buffer startingAt:1.
- ] ifFalse:[compressionMethod == COMPRESSION_STORED ifTrue:[
- stream nextBytes:nextBlockSize into:buffer startingAt:1.
- ] ifFalse:[
- UnsupportedZipFileFormatErrorSignal raiseErrorString:'unsupported compressMethod'
- ]].
-
- aWriteStream nextPutBytes:nextBlockSize from:buffer startingAt:1.
- rdSize := rdSize - nextBlockSize.
- ].
- ] ensure:[
- myZipStream notNil ifTrue:[
- myZipStream close.
- ].
- ].
- ]
+ withPositionAndMemberFor:fileName
+ do:[:zmemb :position |
+ |buffer rdSize compressionMethod nextBlockSize streamBufferSize myZipStream|
+
+ stream position:position.
+
+ compressionMethod := zmemb compressionMethod.
+ rdSize := zmemb uncompressedSize.
+ nextBlockSize := streamBufferSize := self class streamBufferSize.
+ buffer := ByteArray new: streamBufferSize.
+ [
+ [rdSize > 0] whileTrue: [
+ rdSize < streamBufferSize ifTrue: [
+ nextBlockSize := rdSize.
+ ].
+
+ compressionMethod == COMPRESSION_DEFLATED ifTrue:[
+ myZipStream isNil ifTrue: [
+ stream binary.
+ myZipStream := ZipStream readOpenAsZipStreamOn:stream suppressHeaderAndChecksum:true.
+ ].
+ myZipStream next:nextBlockSize into:buffer startingAt:1.
+ ] ifFalse:[compressionMethod == COMPRESSION_STORED ifTrue:[
+ stream nextBytes:nextBlockSize into:buffer startingAt:1.
+ ] ifFalse:[
+ UnsupportedZipFileFormatErrorSignal raiseErrorString:'unsupported compressMethod'
+ ]].
+
+ aWriteStream nextPutBytes:nextBlockSize from:buffer startingAt:1.
+ rdSize := rdSize - nextBlockSize.
+ ].
+ ] ensure:[
+ myZipStream notNil ifTrue:[
+ myZipStream close.
+ ].
+ ].
+ ]
"Modified: / 21-11-2010 / 11:56:51 / cg"
"Modified (format): / 31-05-2017 / 15:03:06 / mawalch"
@@ -4233,12 +4229,12 @@
|zipEntry dataStart|
(stream isNil or:[mode ~~ #read]) ifTrue:[
- ^ OpenError raiseRequestWith:nameOfFileInArchive errorString:'ZipArchive not open for reading ...'.
- ].
+ ^ OpenError raiseRequestWith:nameOfFileInArchive errorString:'ZipArchive not open for reading ...'.
+ ].
zipEntry := self findMember:nameOfFileInArchive.
zipEntry isNil ifTrue:[
- ^ OpenError raiseRequestWith:nameOfFileInArchive errorString:'ZipArchive member does not exist: '.
+ ^ OpenError raiseRequestWith:nameOfFileInArchive errorString:'ZipArchive member does not exist: '.
].
dataStart := self dataStartOf:zipEntry.
@@ -4253,7 +4249,7 @@
"extract an entry identified by filename into aWriteStream"
stream isNil ifTrue:[
- self reopenForReading.
+ self reopenForReading.
].
self extract:fileName intoStream: aWriteStream.
stream close.
@@ -4274,23 +4270,23 @@
osDirectory := osDirectoryName asFilename.
osDirectory exists ifFalse:[
- ^ self
+ ^ self
].
"do not create directories (isDirectory = true) - they are not compatible between operating systems"
"/ self addDirectory: archiveDirectoryName.
osDirectory recursiveDirectoryContentsDo: [:entry|
- fileNameOrDirectoryEntry := osDirectory construct: entry.
- fileNameOrDirectoryEntry isDirectory ifTrue: [
+ fileNameOrDirectoryEntry := osDirectory construct: entry.
+ fileNameOrDirectoryEntry isDirectory ifTrue: [
"/ self addDirectory: (archiveDirectoryName, '/', entry).
- ] ifFalse: [
- fileNameOrDirectoryEntry readingFileDo: [:aStream|
- self addFile: (archiveDirectoryName, '/', entry)
- fromStream: aStream
- compressMethod: theCompressMethod
- asDirectory:false.
- ].
- ].
+ ] ifFalse: [
+ fileNameOrDirectoryEntry readingFileDo: [:aStream|
+ self addFile: (archiveDirectoryName, '/', entry)
+ fromStream: aStream
+ compressMethod: theCompressMethod
+ asDirectory:false.
+ ].
+ ].
].
!
@@ -4324,35 +4320,35 @@
addFile:aFileName fromStream:aStream compressMethod:theCompressMethodArg asDirectory:isDirectory
"do not create directories (isDirectory = true) - they are not compatible between operating systems"
- |zipEntry theZipFileName theCompressMethod streamBufferSize buffer
+ |zipEntry theZipFileName theCompressMethod streamBufferSize buffer
crc32 unCompressedDataSize startDataPosition nextBlockSize myZipStream|
(stream isNil or: [mode ~~ #write]) ifTrue: [
- ^ self error: 'ZipArchive not open for writing ...'.
+ ^ self error: 'ZipArchive not open for writing ...'.
].
theCompressMethod := theCompressMethodArg.
- ((theCompressMethod == COMPRESSION_DEFLATED)
+ ((theCompressMethod == COMPRESSION_DEFLATED)
or:[ theCompressMethod == COMPRESSION_STORED ]) ifFalse:[
- UnsupportedZipFileFormatErrorSignal raiseRequestErrorString:'unsupported compressMethod'.
- "/ if proceeded, write as uncompressed
- theCompressMethod := COMPRESSION_STORED
+ UnsupportedZipFileFormatErrorSignal raiseRequestErrorString:'unsupported compressMethod'.
+ "/ if proceeded, write as uncompressed
+ theCompressMethod := COMPRESSION_STORED
].
zipEntry := ZipMember new default.
- theZipFileName := self validZipFileNameFrom:aFileName.
+ theZipFileName := self validZipFileNameFrom:aFileName.
zipEntry fileName: theZipFileName.
zipEntry uncompressedSize: 0.
isDirectory ifTrue: [
- theCompressMethod := COMPRESSION_STORED.
- zipEntry externalFileAttributes: EXTERNALFILEATTRIBUTES_ISDIRECTORY.
+ theCompressMethod := COMPRESSION_STORED.
+ zipEntry externalFileAttributes: EXTERNALFILEATTRIBUTES_ISDIRECTORY.
] ifFalse: [
- zipEntry compressionMethod: theCompressMethod.
- zipEntry internalFileAttributes: 1.
- zipEntry externalFileAttributes: EXTERNALFILEATTRIBUTES_ISFILE.
+ zipEntry compressionMethod: theCompressMethod.
+ zipEntry internalFileAttributes: 1.
+ zipEntry externalFileAttributes: EXTERNALFILEATTRIBUTES_ISFILE.
].
"/ data and time in msdos format
@@ -4363,35 +4359,35 @@
zipEntry writeTo:stream.
- streamBufferSize := self class streamBufferSize.
+ streamBufferSize := self class streamBufferSize.
buffer := ByteArray new:streamBufferSize.
crc32 := 0.
unCompressedDataSize := 0.
startDataPosition := stream position.
[
- [aStream atEnd] whileFalse: [
- nextBlockSize := aStream nextBytes:streamBufferSize into:buffer startingAt:1.
-
- nextBlockSize > 0 ifTrue: [
- unCompressedDataSize := unCompressedDataSize + nextBlockSize.
- crc32 := ZipStream crc32BytesIn: buffer from:1 to:nextBlockSize crc:crc32.
- theCompressMethod == COMPRESSION_DEFLATED ifTrue: [
- myZipStream isNil ifTrue: [
- myZipStream := ZipStream writeOpenAsZipStreamOn:stream suppressHeaderAndChecksum:true.
- ].
- myZipStream nextPutBytes:nextBlockSize from:buffer startingAt:1.
- ] ifFalse: [theCompressMethod == COMPRESSION_STORED ifTrue: [
- stream nextPutBytes:nextBlockSize from:buffer startingAt:1.
- ] ifFalse:[
- UnsupportedZipFileFormatErrorSignal raiseRequestErrorString:'unsupported compressMethod'.
- ]].
- ].
- ].
+ [aStream atEnd] whileFalse: [
+ nextBlockSize := aStream nextBytes:streamBufferSize into:buffer startingAt:1.
+
+ nextBlockSize > 0 ifTrue: [
+ unCompressedDataSize := unCompressedDataSize + nextBlockSize.
+ crc32 := ZipStream crc32BytesIn: buffer from:1 to:nextBlockSize crc:crc32.
+ theCompressMethod == COMPRESSION_DEFLATED ifTrue: [
+ myZipStream isNil ifTrue: [
+ myZipStream := ZipStream writeOpenAsZipStreamOn:stream suppressHeaderAndChecksum:true.
+ ].
+ myZipStream nextPutBytes:nextBlockSize from:buffer startingAt:1.
+ ] ifFalse: [theCompressMethod == COMPRESSION_STORED ifTrue: [
+ stream nextPutBytes:nextBlockSize from:buffer startingAt:1.
+ ] ifFalse:[
+ UnsupportedZipFileFormatErrorSignal raiseRequestErrorString:'unsupported compressMethod'.
+ ]].
+ ].
+ ].
] ensure:[
- myZipStream notNil ifTrue:[
- myZipStream close.
- ].
+ myZipStream notNil ifTrue:[
+ myZipStream close.
+ ].
].
zipEntry compressedSize:(stream position) - startDataPosition.
@@ -4440,21 +4436,21 @@
"Modified: / 19-11-2010 / 17:47:26 / cg"
!
-basicAddFile:aFileName withContents:data compressMethod:theCompressMethodArg asDirectory:isDirectory
+basicAddFile:aFileName withContents:data compressMethod:theCompressMethodArg asDirectory:isDirectory
"do not create directories (isDirectory = true) - they are not compatible between operating systems"
-
+
| zipEntry theCompressedData theZipFileName theCompressMethod compressedDataOffset|
(stream isNil or:[ mode ~~ #write ]) ifTrue:[
- ^ self error:'ZipArchive not open for writing ...'.
+ ^ self error:'ZipArchive not open for writing ...'.
].
theCompressMethod := theCompressMethodArg.
- ((theCompressMethod ~~ COMPRESSION_DEFLATED)
+ ((theCompressMethod ~~ COMPRESSION_DEFLATED)
and:[theCompressMethod ~~ COMPRESSION_STORED]) ifTrue:[
- UnsupportedZipFileFormatErrorSignal
- raiseRequestErrorString:'unsupported compressMethod'.
- "/ if proceeded, write as uncompressed
- theCompressMethod := COMPRESSION_STORED
+ UnsupportedZipFileFormatErrorSignal
+ raiseRequestErrorString:'unsupported compressMethod'.
+ "/ if proceeded, write as uncompressed
+ theCompressMethod := COMPRESSION_STORED
].
zipEntry := ZipMember new default.
@@ -4462,46 +4458,46 @@
zipEntry fileName:theZipFileName.
(self appendTrailingSlash and:[isDirectory]) ifTrue:[
- theZipFileName last == $/ ifFalse:[
- zipEntry fileName:theZipFileName , $/.
- zipEntry fileNameLength:theZipFileName size + 1.
- ].
+ theZipFileName last == $/ ifFalse:[
+ zipEntry fileName:theZipFileName , $/.
+ zipEntry fileNameLength:theZipFileName size + 1.
+ ].
].
zipEntry uncompressedSize:data size.
isDirectory ifTrue:[
- zipEntry externalFileAttributes:EXTERNALFILEATTRIBUTES_ISDIRECTORY.
+ zipEntry externalFileAttributes:EXTERNALFILEATTRIBUTES_ISDIRECTORY.
] ifFalse:[
- zipEntry compressionMethod:theCompressMethod.
- zipEntry internalFileAttributes: 1.
- zipEntry externalFileAttributes: EXTERNALFILEATTRIBUTES_ISFILE.
+ zipEntry compressionMethod:theCompressMethod.
+ zipEntry internalFileAttributes: 1.
+ zipEntry externalFileAttributes: EXTERNALFILEATTRIBUTES_ISFILE.
].
-
+
"/ data and time in msdos format
zipEntry setModificationTimeAndDateToNow.
data notEmptyOrNil ifTrue:[
- "/ crc32 is always required (not as written in docu to be zero in case of uncompressed mode)
- zipEntry crc32:(ZipStream crc32BytesIn:data from:1 to:data size crc:0).
+ "/ crc32 is always required (not as written in docu to be zero in case of uncompressed mode)
+ zipEntry crc32:(ZipStream crc32BytesIn:data from:1 to:data size crc:0).
].
(isDirectory not and:[ theCompressMethod == COMPRESSION_DEFLATED ]) ifTrue:[
- |tmpCompressedDataSize|
-
- theCompressedData := ByteArray new:(data size + 16).
- tmpCompressedDataSize := ZipStream compress:data into:theCompressedData.
- zipEntry compressedSize:tmpCompressedDataSize - 6.
- compressedDataOffset := 3.
+ |tmpCompressedDataSize|
+
+ theCompressedData := ByteArray new:(data size + 16).
+ tmpCompressedDataSize := ZipStream compress:data into:theCompressedData.
+ zipEntry compressedSize:tmpCompressedDataSize - 6.
+ compressedDataOffset := 3.
] ifFalse:["theCompressMethod == COMPRESSION_STORED"
- zipEntry compressedSize:zipEntry uncompressedSize.
- theCompressedData := data.
- compressedDataOffset := 1.
+ zipEntry compressedSize:zipEntry uncompressedSize.
+ theCompressedData := data.
+ compressedDataOffset := 1.
].
-
+
"/ ensure that the file position is at the end
stream setToEnd.
zipEntry writeTo:stream.
theCompressedData notNil ifTrue:[
- stream nextPutBytes:zipEntry compressedSize from:theCompressedData startingAt:compressedDataOffset.
+ stream nextPutBytes:zipEntry compressedSize from:theCompressedData startingAt:compressedDataOffset.
].
self addMember:zipEntry.
@@ -4526,20 +4522,20 @@
|zipEntry theZipFileName theCompressMethod|
(stream isNil or:[mode ~~ #write]) ifTrue: [
- ^ self error: 'ZipArchive not open for writing ...'.
+ ^ self error: 'ZipArchive not open for writing ...'.
].
theCompressMethod := theCompressMethodArg.
- ((theCompressMethod == COMPRESSION_DEFLATED)
+ ((theCompressMethod == COMPRESSION_DEFLATED)
or:[theCompressMethod == COMPRESSION_STORED]) ifFalse:[
- UnsupportedZipFileFormatErrorSignal raiseRequestErrorString:'unsupported compressMethod'.
- "/ if proceeded, write as uncompressed
- theCompressMethod := COMPRESSION_STORED
+ UnsupportedZipFileFormatErrorSignal raiseRequestErrorString:'unsupported compressMethod'.
+ "/ if proceeded, write as uncompressed
+ theCompressMethod := COMPRESSION_STORED
].
zipEntry := ZipMember new default.
- theZipFileName := self validZipFileNameFrom:nameOfFileInArchive.
+ theZipFileName := self validZipFileNameFrom:nameOfFileInArchive.
zipEntry fileName: theZipFileName.
zipEntry uncompressedSize: 0.
@@ -4598,7 +4594,7 @@
contentsSpecies
"return a class of which instances will be returned, when
- parts of the collection are asked for.
+ parts of the collection are asked for.
(see upTo-kind of methods in Stream)"
^ compressingStream contentsSpecies
@@ -4703,9 +4699,9 @@
centralDirectoryTotalNoOfEntries := 0.
centralDirectorySize := 0.
centralDirectoryStartOffset := 0.
- zipCommentLength := 0.
+ zipCommentLength := 0.
zipComment := nil.
- digitalSignatureDataSize := 0.
+ digitalSignatureDataSize := 0.
digitalSignatureData := nil.
! !
@@ -4719,8 +4715,8 @@
"/ (file position + (centralDirectory digitalSignatureDataSize)) > endOfArchive ifTrue: [
"/ ^ ZipFileFormatErrorSignal raiseRequestErrorString:' - digital signature entry out of archive bounds'.
"/ ].
- digitalSignatureData := String new:digitalSignatureDataSize.
- aStream nextBytes:digitalSignatureDataSize into:digitalSignatureData.
+ digitalSignatureData := String new:digitalSignatureDataSize.
+ aStream nextBytes:digitalSignatureDataSize into:digitalSignatureData.
].
!
@@ -4735,8 +4731,8 @@
centralDirectoryStartOffset := aStream nextInt32MSB:false.
zipCommentLength := aStream nextUnsignedInt16MSB:false.
zipCommentLength ~~ 0 ifTrue: [
- zipComment := String new:zipCommentLength.
- aStream nextBytes:zipCommentLength into:zipComment.
+ zipComment := String new:zipCommentLength.
+ aStream nextBytes:zipCommentLength into:zipComment.
].
! !
@@ -4869,7 +4865,7 @@
fileNameLength
fileNameLength isNil ifTrue:[
- ^ fileName size.
+ ^ fileName size.
].
^ fileNameLength
!
@@ -4937,7 +4933,7 @@
setModificationTimeAndDateToNow
|curTime curDate|
- curTime := Time now.
+ curTime := Time now.
curDate := Date today.
"/ data and time in msdos format
self lastModFileTime: (ZipArchive timeToZipFileTime:curTime).
@@ -5007,9 +5003,9 @@
!ZipArchive::ZipMember methodsFor:'queries'!
isDirectory
- ^
+ ^
((externalFileAttributes ? 0) bitTest:EXTERNALFILEATTRIBUTES_ISDIRECTORY)
- or:[uncompressedSize == 0 and:[fileName last = $/]].
+ or:[uncompressedSize == 0 and:[fileName last = $/]].
"Created: / 28-03-2011 / 19:19:26 / cg"
"Modified: / 19-11-2012 / 12:02:36 / Jan Vrany <jan.vrany@fit.cvut.cz>"
@@ -5020,20 +5016,20 @@
readCentralDirectoryEntryFrom:aStream
"read a central directory entry"
- versionMadeBy := aStream nextUnsignedInt16MSB:false.
- versionNeedToExtract := aStream nextUnsignedInt16MSB:false.
- generalPurposBitFlag := aStream nextUnsignedInt16MSB:false.
+ versionMadeBy := aStream nextUnsignedInt16MSB:false.
+ versionNeedToExtract := aStream nextUnsignedInt16MSB:false.
+ generalPurposBitFlag := aStream nextUnsignedInt16MSB:false.
compressionMethod := aStream nextUnsignedInt16MSB:false.
- lastModFileTime := aStream nextUnsignedInt16MSB:false.
+ lastModFileTime := aStream nextUnsignedInt16MSB:false.
lastModFileDate := aStream nextUnsignedInt16MSB:false.
crc32 := aStream nextUnsignedInt32MSB: false.
- compressedSize := aStream nextUnsignedInt32MSB:false.
- uncompressedSize := aStream nextUnsignedInt32MSB:false.
- fileNameLength := aStream nextUnsignedInt16MSB:false.
- extraFieldLength := aStream nextUnsignedInt16MSB:false.
- fileCommentLength := aStream nextUnsignedInt16MSB:false.
- diskNumberStart := aStream nextUnsignedInt16MSB:false.
- internalFileAttributes := aStream nextUnsignedInt16MSB:false.
+ compressedSize := aStream nextUnsignedInt32MSB:false.
+ uncompressedSize := aStream nextUnsignedInt32MSB:false.
+ fileNameLength := aStream nextUnsignedInt16MSB:false.
+ extraFieldLength := aStream nextUnsignedInt16MSB:false.
+ fileCommentLength := aStream nextUnsignedInt16MSB:false.
+ diskNumberStart := aStream nextUnsignedInt16MSB:false.
+ internalFileAttributes := aStream nextUnsignedInt16MSB:false.
externalFileAttributes := aStream nextUnsignedInt32MSB:false.
relativeLocalHeaderOffset := aStream nextUnsignedInt32MSB:false.
@@ -5047,16 +5043,16 @@
"/ (aStream position + extraFieldLength) > endOfArchive ifTrue: [
"/ ^ ZipArchive zipFileFormatErrorSignal raiseRequestErrorString:' - central directory entry out of archive bounds'.
"/ ].
- extraField := ByteArray new:extraFieldLength.
- aStream nextBytes:extraFieldLength into:extraField.
+ extraField := ByteArray new:extraFieldLength.
+ aStream nextBytes:extraFieldLength into:extraField.
].
fileCommentLength ~~ 0 ifTrue: [
"/ (aStream position + fileCommentLength) > endOfArchive ifTrue: [
"/ ^ ZipArchive zipFileFormatErrorSignal raiseRequestErrorString:' - central directory entry out of archive bounds'.
"/ ].
- fileComment := String new:fileCommentLength.
- aStream nextBytes:fileCommentLength into:fileComment.
+ fileComment := String new:fileCommentLength.
+ aStream nextBytes:fileCommentLength into:fileComment.
].
!
@@ -5065,10 +5061,10 @@
aStream position:relativeLocalHeaderOffset+14.
- aStream
- nextPutInt32:crc32 MSB:false;
- nextPutInt32:compressedSize MSB:false;
- nextPutInt32:uncompressedSize MSB:false.
+ aStream
+ nextPutInt32:crc32 MSB:false;
+ nextPutInt32:compressedSize MSB:false;
+ nextPutInt32:uncompressedSize MSB:false.
!
writeTo:aStream
@@ -5076,23 +5072,23 @@
relativeLocalHeaderOffset := aStream position.
- aStream
- nextPutInt32LSB:C_LOCAL_HEADER_SIGNATURE ;
- nextPutInt16LSB:versionNeedToExtract;
- nextPutInt16LSB:generalPurposBitFlag;
- nextPutInt16LSB:compressionMethod;
- nextPutInt16LSB:lastModFileTime;
- nextPutInt16LSB:lastModFileDate;
- nextPutInt32LSB:crc32;
- nextPutInt32LSB:compressedSize;
- nextPutInt32LSB:uncompressedSize;
- nextPutInt16LSB:self fileNameLength;
- nextPutInt16LSB:extraFieldLength;
- nextPutAll:fileName.
+ aStream
+ nextPutInt32LSB:C_LOCAL_HEADER_SIGNATURE ;
+ nextPutInt16LSB:versionNeedToExtract;
+ nextPutInt16LSB:generalPurposBitFlag;
+ nextPutInt16LSB:compressionMethod;
+ nextPutInt16LSB:lastModFileTime;
+ nextPutInt16LSB:lastModFileDate;
+ nextPutInt32LSB:crc32;
+ nextPutInt32LSB:compressedSize;
+ nextPutInt32LSB:uncompressedSize;
+ nextPutInt16LSB:self fileNameLength;
+ nextPutInt16LSB:extraFieldLength;
+ nextPutAll:fileName.
extraField notNil ifTrue: [
- self assert:(extraField size = extraFieldLength).
- aStream nextPutAll:extraField.
+ self assert:(extraField size = extraFieldLength).
+ aStream nextPutAll:extraField.
].
"Modified: / 19-11-2010 / 15:45:38 / cg"
@@ -5124,10 +5120,10 @@
readPosition := 0.
zipEntry compressionMethod == COMPRESSION_DEFLATED ifTrue:[
- compressingStream := ZipStream readOpenAsZipStreamOn:zipFileStream suppressHeaderAndChecksum:true.
+ compressingStream := ZipStream readOpenAsZipStreamOn:zipFileStream suppressHeaderAndChecksum:true.
] ifFalse:[
- compressingStream := zipFileStream.
- compressingStream text.
+ compressingStream := zipFileStream.
+ compressingStream text.
].
"Modified: / 19-11-2010 / 15:47:14 / cg"
@@ -5152,14 +5148,14 @@
|result|
peek notNil ifTrue:[
- result := peek.
- peek := nil.
+ result := peek.
+ peek := nil.
] ifFalse:[
- readPosition >= uncompressedDataSize ifTrue:[
- ^ self pastEndRead.
- ].
-
- result := compressingStream next.
+ readPosition >= uncompressedDataSize ifTrue:[
+ ^ self pastEndRead.
+ ].
+
+ result := compressingStream next.
].
readPosition := readPosition + 1.
@@ -5172,14 +5168,14 @@
|result|
peek notNil ifTrue:[
- result := peek.
- peek := nil.
+ result := peek.
+ peek := nil.
] ifFalse:[
- readPosition >= uncompressedDataSize ifTrue:[
- ^ nil.
- ].
-
- result := compressingStream next.
+ readPosition >= uncompressedDataSize ifTrue:[
+ ^ nil.
+ ].
+
+ result := compressingStream next.
].
readPosition := readPosition + 1.
@@ -5190,11 +5186,11 @@
"peek a character"
peek notNil ifTrue:[
- ^ peek.
+ ^ peek.
].
readPosition >= uncompressedDataSize ifTrue:[
- ^ self pastEndRead.
+ ^ self pastEndRead.
].
peek := compressingStream next.
@@ -5207,8 +5203,8 @@
"finalize the data"
compressingStream ~~ zipFileStream ifTrue:[
- "close ZipStream"
- compressingStream close.
+ "close ZipStream"
+ compressingStream close.
].
compressingStream := nil.
@@ -5236,9 +5232,9 @@
uncompressedDataSize := 0.
zipEntry compressionMethod == COMPRESSION_DEFLATED ifTrue:[
- compressingStream := ZipStream writeOpenAsZipStreamOn:zipFileStream suppressHeaderAndChecksum:true.
+ compressingStream := ZipStream writeOpenAsZipStreamOn:zipFileStream suppressHeaderAndChecksum:true.
] ifFalse:[
- compressingStream := zipFileStream.
+ compressingStream := zipFileStream.
].
"Modified: / 19-11-2010 / 15:46:57 / cg"
@@ -5315,9 +5311,9 @@
size := aCollection size.
size = 0 ifFalse:[
- uncompressedDataSize := uncompressedDataSize + size.
- crc32 := ZipStream crc32BytesIn:aCollection from:1 to:size crc:crc32.
- compressingStream nextPutAll:aCollection
+ uncompressedDataSize := uncompressedDataSize + size.
+ crc32 := ZipStream crc32BytesIn:aCollection from:1 to:size crc:crc32.
+ compressingStream nextPutAll:aCollection
].
! !