@@ -135,63 +135,66 @@ static hpatch_BOOL _NewStream_write(const hpatch_TStreamOutput* stream,
135135 check (self->_vout ->endVirtual (self->_vout ));
136136#endif
137137 ++self->_curFileIndex ;
138- }else {
139- break ;
140- }
141- }
142-
143- if (self->_curFileIndex <self->_fileCount ){// open file for write
144- ZipFilePos_t uncompressedSize=UnZipper_file_uncompressedSize (&self->_newZipVCE ,self->_curFileIndex );
145- ZipFilePos_t compressedSize=uncompressedSize;
146- if (UnZipper_file_isCompressed (&self->_newZipVCE ,self->_curFileIndex )){
147- check (self->_curNewReCompressSizeIndex <self->_newReCompressSizeCount );
148- compressedSize=self->_newReCompressSizeList [self->_curNewReCompressSizeIndex ];
149- ++self->_curNewReCompressSizeIndex ;
150- }
151- _update_compressedSize (self,self->_curFileIndex ,compressedSize);
152-
153- bool isWriteOtherCompressedData=(self->_curNewOtherCompressIndex <self->_newRefOtherCompressedCount )
154- &&((int )self->_newRefOtherCompressedList [self->_curNewOtherCompressIndex ]==self->_curFileIndex );
155- if (isWriteOtherCompressedData)
156- ++self->_curNewOtherCompressIndex ;
138+ }else {// open file for write
139+ ZipFilePos_t uncompressedSize=UnZipper_file_uncompressedSize (&self->_newZipVCE ,self->_curFileIndex );
140+ ZipFilePos_t compressedSize=uncompressedSize;
141+ if (UnZipper_file_isCompressed (&self->_newZipVCE ,self->_curFileIndex )){
142+ check (self->_curNewReCompressSizeIndex <self->_newReCompressSizeCount );
143+ compressedSize=self->_newReCompressSizeList [self->_curNewReCompressSizeIndex ];
144+ ++self->_curNewReCompressSizeIndex ;
145+ }
146+ _update_compressedSize (self,self->_curFileIndex ,compressedSize);
147+
148+ bool isWriteOtherCompressedData=(self->_curNewOtherCompressIndex <self->_newRefOtherCompressedCount )
149+ &&((int )self->_newRefOtherCompressedList [self->_curNewOtherCompressIndex ]==self->_curFileIndex );
150+ if (isWriteOtherCompressedData)
151+ ++self->_curNewOtherCompressIndex ;
157152
158- bool is0FileSize=false ; // in zip
159- #if (_IS_NEED_VIRTUAL_ZIP)
160- TVirtualZip_out_type ty=kVirtualZip_out_void ;
161- if (self->_vout ){
162- ty=self->_vout ->beginVirtual (self->_vout ,&self->_newZipVCE ,self->_curFileIndex );
163- switch (ty) {
164- case kVirtualZip_out_void : { // ok, do nothing
165- assert (self->_vout ->virtualStream ==0 ); } break ;
166- case kVirtualZip_out_emptyFile_cast : { // set fileSize==0
167- assert (self->_vout ->virtualStream ==0 );
168- _update_fileSize (self,self->_curFileIndex ,0 ,0 );
169- is0FileSize=true ; } break ;
170- case kVirtualZip_out_emptyFile_uncompressed : { // set fileSize==0, need out and endVirtual
171- assert (self->_vout ->virtualStream !=0 );
172- _update_fileSize (self,self->_curFileIndex ,0 ,0 );
173- is0FileSize=true ; } break ;
174- default : { check (false ); } break ; // error, or unknow as error
153+ bool isVirtualFile0Size=false ; // is notInZip virtualFile && uncompressedFizeSize==0 ?
154+ #if (_IS_NEED_VIRTUAL_ZIP)
155+ TVirtualZip_out_type ty=kVirtualZip_out_void ;
156+ if (self->_vout ){
157+ ty=self->_vout ->beginVirtual (self->_vout ,&self->_newZipVCE ,self->_curFileIndex );
158+ switch (ty) {
159+ case kVirtualZip_out_void : { // ok, do nothing
160+ assert (self->_vout ->virtualStream ==0 ); } break ;
161+ case kVirtualZip_out_emptyFile_cast : { // set fileSize==0
162+ assert (self->_vout ->virtualStream ==0 );
163+ _update_fileSize (self,self->_curFileIndex ,0 ,0 );
164+ isVirtualFile0Size=true ; } break ;
165+ case kVirtualZip_out_emptyFile_uncompressed : { // set fileSize==0, need out and endVirtual
166+ assert (self->_vout ->virtualStream !=0 );
167+ _update_fileSize (self,self->_curFileIndex ,0 ,0 );
168+ isVirtualFile0Size=true ; } break ;
169+ default : { check (false ); } break ; // error, or unknow as error
170+ }
175171 }
176- }
177- #endif
178- if (isWriteOtherCompressedData && self->_newOtherCompressIsValid ){
179- check (Zipper_file_append_beginWith (self->_out_newZip ,&self->_newZipVCE ,self->_curFileIndex ,
180- false ,is0FileSize?0 :uncompressedSize,is0FileSize?0 :compressedSize,
181- self->_newOtherCompressLevel ,self->_newOtherCompressMemLevel ));
182- self->_curWriteToPosEnd +=uncompressedSize;
183- }else {
184- #if (_IS_NEED_VIRTUAL_ZIP)
185- if (ty==kVirtualZip_out_emptyFile_uncompressed ){
186- check (!isWriteOtherCompressedData); // now unsupport auto decompress data
172+ #endif
173+ if (isWriteOtherCompressedData && self->_newOtherCompressIsValid ){
174+ check (Zipper_file_append_beginWith (self->_out_newZip ,&self->_newZipVCE ,self->_curFileIndex ,
175+ false ,isVirtualFile0Size?0 :uncompressedSize,isVirtualFile0Size?0 :compressedSize,
176+ self->_newOtherCompressLevel ,self->_newOtherCompressMemLevel ));
177+ self->_curWriteToPosEnd +=uncompressedSize;
178+ }else {
179+ #if (_IS_NEED_VIRTUAL_ZIP)
180+ if (ty==kVirtualZip_out_emptyFile_uncompressed ){
181+ check (!isWriteOtherCompressedData); // now unsupport auto decompress data
182+ }
183+ #endif
184+ check (Zipper_file_append_begin (self->_out_newZip ,&self->_newZipVCE ,self->_curFileIndex ,
185+ isWriteOtherCompressedData,
186+ isVirtualFile0Size?0 :uncompressedSize,isVirtualFile0Size?0 :compressedSize));
187+ self->_curWriteToPosEnd +=isWriteOtherCompressedData?compressedSize:uncompressedSize;
188+ }
189+
190+ if ((!isVirtualFile0Size)&&(uncompressedSize==0 )){ // compressed && empty file
191+ check (Zipper_file_append_part (self->_out_newZip ,0 ,0 ));
192+ check (Zipper_file_append_end (self->_out_newZip ));
193+ ++self->_curFileIndex ;
194+ }else {
195+ return hpatch_TRUE; // opened a file wait for write;
187196 }
188- #endif
189- check (Zipper_file_append_begin (self->_out_newZip ,&self->_newZipVCE ,self->_curFileIndex ,
190- isWriteOtherCompressedData,
191- is0FileSize?0 :uncompressedSize,is0FileSize?0 :compressedSize));
192- self->_curWriteToPosEnd +=isWriteOtherCompressedData?compressedSize:uncompressedSize;
193197 }
194- return hpatch_TRUE;
195198 }
196199
197200 // file entry end
0 commit comments