@@ -9,7 +9,8 @@ module.exports = function (/*String|Buffer*/input, /*Number*/inputType) {
99 filename = "" ,
1010 fs = Utils . FileSystem . require ( ) ,
1111 inBuffer = null ,
12- mainHeader = new Headers . MainHeader ( ) ;
12+ mainHeader = new Headers . MainHeader ( ) ,
13+ loadedEntries = false ;
1314
1415 if ( inputType === Utils . Constants . FILE ) {
1516 // is a filename
@@ -22,9 +23,28 @@ module.exports = function (/*String|Buffer*/input, /*Number*/inputType) {
2223 readMainHeader ( ) ;
2324 } else {
2425 // none. is a new file
26+ loadedEntries = true ;
27+ }
28+
29+ function iterateEntries ( callback ) {
30+ const totalEntries = mainHeader . diskEntries ; // total number of entries
31+ let index = mainHeader . offset ; // offset of first CEN header
32+
33+ for ( let i = 0 ; i < totalEntries ; i ++ ) {
34+ let tmp = index ;
35+ const entry = new ZipEntry ( inBuffer ) ;
36+
37+ entry . header = inBuffer . slice ( tmp , tmp += Utils . Constants . CENHDR ) ;
38+ entry . entryName = inBuffer . slice ( tmp , tmp += entry . header . fileNameLength ) ;
39+
40+ index += entry . header . entryHeaderSize ;
41+
42+ callback ( entry ) ;
43+ }
2544 }
2645
2746 function readEntries ( ) {
47+ loadedEntries = true ;
2848 entryTable = { } ;
2949 entryList = new Array ( mainHeader . diskEntries ) ; // total number of entries
3050 var index = mainHeader . offset ; // offset of first CEN header
@@ -90,7 +110,7 @@ module.exports = function (/*String|Buffer*/input, /*Number*/inputType) {
90110 if ( mainHeader . commentLength ) {
91111 _comment = inBuffer . slice ( commentEnd + Utils . Constants . ENDHDR ) ;
92112 }
93- readEntries ( ) ;
113+ // readEntries();
94114 }
95115
96116 return {
@@ -99,6 +119,9 @@ module.exports = function (/*String|Buffer*/input, /*Number*/inputType) {
99119 * @return Array
100120 */
101121 get entries ( ) {
122+ if ( ! loadedEntries ) {
123+ readEntries ( ) ;
124+ }
102125 return entryList ;
103126 } ,
104127
@@ -114,13 +137,33 @@ module.exports = function (/*String|Buffer*/input, /*Number*/inputType) {
114137 _comment = val ;
115138 } ,
116139
140+ getEntryCount : function ( ) {
141+ if ( ! loadedEntries ) {
142+ return mainHeader . diskEntries ;
143+ }
144+
145+ return entryList . length ;
146+ } ,
147+
148+ forEach : function ( callback ) {
149+ if ( ! loadedEntries ) {
150+ iterateEntries ( callback ) ;
151+ return ;
152+ }
153+
154+ entryList . forEach ( callback ) ;
155+ } ,
156+
117157 /**
118158 * Returns a reference to the entry with the given name or null if entry is inexistent
119159 *
120160 * @param entryName
121161 * @return ZipEntry
122162 */
123163 getEntry : function ( /*String*/ entryName ) {
164+ if ( ! loadedEntries ) {
165+ readEntries ( ) ;
166+ }
124167 return entryTable [ entryName ] || null ;
125168 } ,
126169
@@ -130,6 +173,9 @@ module.exports = function (/*String|Buffer*/input, /*Number*/inputType) {
130173 * @param entry
131174 */
132175 setEntry : function ( /*ZipEntry*/ entry ) {
176+ if ( ! loadedEntries ) {
177+ readEntries ( ) ;
178+ }
133179 entryList . push ( entry ) ;
134180 entryTable [ entry . entryName ] = entry ;
135181 mainHeader . totalEntries = entryList . length ;
@@ -142,6 +188,9 @@ module.exports = function (/*String|Buffer*/input, /*Number*/inputType) {
142188 * @param entryName
143189 */
144190 deleteEntry : function ( /*String*/ entryName ) {
191+ if ( ! loadedEntries ) {
192+ readEntries ( ) ;
193+ }
145194 var entry = entryTable [ entryName ] ;
146195 if ( entry && entry . isDirectory ) {
147196 var _self = this ;
@@ -163,6 +212,9 @@ module.exports = function (/*String|Buffer*/input, /*Number*/inputType) {
163212 * @return Array
164213 */
165214 getEntryChildren : function ( /*ZipEntry*/ entry ) {
215+ if ( ! loadedEntries ) {
216+ readEntries ( ) ;
217+ }
166218 if ( entry . isDirectory ) {
167219 var list = [ ] ,
168220 name = entry . entryName ,
@@ -184,6 +236,9 @@ module.exports = function (/*String|Buffer*/input, /*Number*/inputType) {
184236 * @return Buffer
185237 */
186238 compressToBuffer : function ( ) {
239+ if ( ! loadedEntries ) {
240+ readEntries ( ) ;
241+ }
187242 if ( entryList . length > 1 ) {
188243 entryList . sort ( function ( a , b ) {
189244 var nameA = a . entryName . toLowerCase ( ) ;
@@ -258,6 +313,9 @@ module.exports = function (/*String|Buffer*/input, /*Number*/inputType) {
258313 } ,
259314
260315 toAsyncBuffer : function ( /*Function*/ onSuccess , /*Function*/ onFail , /*Function*/ onItemStart , /*Function*/ onItemEnd ) {
316+ if ( ! loadedEntries ) {
317+ readEntries ( ) ;
318+ }
261319 if ( entryList . length > 1 ) {
262320 entryList . sort ( function ( a , b ) {
263321 var nameA = a . entryName . toLowerCase ( ) ;
0 commit comments