5151#endif
5252
5353
54- typedef struct {
55- double last_update ; /* last value callback function was called with */
56-
57- double start ; /* start of sub-progress setcion */
58- double end ; /* end of sub-progress setcion */
59- } progress_state_t ;
60-
61- static int add_data (zip_t * , zip_source_t * , zip_dirent_t * , progress_state_t * );
62- static int copy_data (zip_t * , zip_uint64_t , progress_state_t * );
63- static int copy_source (zip_t * , zip_source_t * , progress_state_t * , zip_int64_t );
54+ static int add_data (zip_t * , zip_source_t * , zip_dirent_t * );
55+ static int copy_data (zip_t * , zip_uint64_t );
56+ static int copy_source (zip_t * , zip_source_t * , zip_int64_t );
6457static int write_cdir (zip_t * , const zip_filelist_t * , zip_uint64_t );
65- static void _zip_progress (zip_t * , progress_state_t * , double );
6658
6759ZIP_EXTERN int
6860zip_close (zip_t * za )
@@ -72,7 +64,6 @@ zip_close(zip_t *za)
7264 int error ;
7365 zip_filelist_t * filelist ;
7466 int changed ;
75- progress_state_t progress_state ;
7667
7768 if (za == NULL )
7869 return -1 ;
@@ -129,22 +120,15 @@ zip_close(zip_t *za)
129120 free (filelist );
130121 return -1 ;
131122 }
132-
133- if (za -> progress_callback ) {
134- progress_state .last_update = 0.0 ;
135- za -> progress_callback (0.0 );
136- }
123+
124+ _zip_progress_start (za -> progress );
137125 error = 0 ;
138126 for (j = 0 ; j < survivors ; j ++ ) {
139127 int new_data ;
140128 zip_entry_t * entry ;
141129 zip_dirent_t * de ;
142130
143- if (za -> progress_callback ) {
144- progress_state .start = (double )j / (double )survivors ;
145- progress_state .end = (double )(j + 1 ) / (double )survivors ;
146- _zip_progress (za , & progress_state , 0.0 );
147- }
131+ _zip_progress_subrange (za -> progress , (double )j / (double )survivors , (double )(j + 1 ) / (double )survivors );
148132
149133 i = filelist [j ].idx ;
150134 entry = za -> entry + i ;
@@ -184,7 +168,7 @@ zip_close(zip_t *za)
184168 }
185169
186170 /* add_data writes dirent */
187- if (add_data (za , zs ? zs : entry -> source , de , & progress_state ) < 0 ) {
171+ if (add_data (za , zs ? zs : entry -> source , de ) < 0 ) {
188172 error = 1 ;
189173 if (zs )
190174 zip_source_free (zs );
@@ -211,7 +195,7 @@ zip_close(zip_t *za)
211195 error = 1 ;
212196 break ;
213197 }
214- if (copy_data (za , de -> comp_size , & progress_state ) < 0 ) {
198+ if (copy_data (za , de -> comp_size ) < 0 ) {
215199 error = 1 ;
216200 break ;
217201 }
@@ -237,9 +221,7 @@ zip_close(zip_t *za)
237221 return -1 ;
238222 }
239223
240- if (za -> progress_callback ) {
241- _zip_progress (za , & progress_state , 1.0 );
242- }
224+ _zip_progress_end (za -> progress );
243225
244226 zip_discard (za );
245227
@@ -248,7 +230,7 @@ zip_close(zip_t *za)
248230
249231
250232static int
251- add_data (zip_t * za , zip_source_t * src , zip_dirent_t * de , progress_state_t * progress_state )
233+ add_data (zip_t * za , zip_source_t * src , zip_dirent_t * de )
252234{
253235 zip_int64_t offstart , offdata , offend , data_length ;
254236 struct zip_stat st ;
@@ -430,7 +412,7 @@ add_data(zip_t *za, zip_source_t *src, zip_dirent_t *de, progress_state_t *progr
430412 return -1 ;
431413 }
432414
433- ret = copy_source (za , src_final , progress_state , data_length );
415+ ret = copy_source (za , src_final , data_length );
434416
435417 if (zip_source_stat (src_final , & st ) < 0 ) {
436418 _zip_error_set_from_source (& za -> error , src_final );
@@ -495,7 +477,7 @@ add_data(zip_t *za, zip_source_t *src, zip_dirent_t *de, progress_state_t *progr
495477
496478
497479static int
498- copy_data (zip_t * za , zip_uint64_t len , progress_state_t * progress_state )
480+ copy_data (zip_t * za , zip_uint64_t len )
499481{
500482 zip_uint8_t buf [BUFSIZE ];
501483 size_t n ;
@@ -512,18 +494,16 @@ copy_data(zip_t *za, zip_uint64_t len, progress_state_t *progress_state)
512494 }
513495
514496 len -= n ;
515-
516- if (za -> progress_callback ) {
517- _zip_progress (za , progress_state , (total - (double )len ) / total );
518- }
497+
498+ _zip_progress_update (za -> progress , (total - (double )len ) / total );
519499 }
520500
521501 return 0 ;
522502}
523503
524504
525505static int
526- copy_source (zip_t * za , zip_source_t * src , progress_state_t * progress_state , zip_int64_t data_length )
506+ copy_source (zip_t * za , zip_source_t * src , zip_int64_t data_length )
527507{
528508 zip_uint8_t buf [BUFSIZE ];
529509 zip_int64_t n , current ;
@@ -541,9 +521,9 @@ copy_source(zip_t *za, zip_source_t *src, progress_state_t *progress_state, zip_
541521 ret = -1 ;
542522 break ;
543523 }
544- if (n == sizeof (buf ) && za -> progress_callback && data_length > 0 ) {
524+ if (n == sizeof (buf ) && za -> progress && data_length > 0 ) {
545525 current += n ;
546- _zip_progress (za , progress_state , (double )current /(double )data_length );
526+ _zip_progress_update (za -> progress , (double )current /(double )data_length );
547527 }
548528 }
549529
@@ -602,20 +582,3 @@ _zip_changed(const zip_t *za, zip_uint64_t *survivorsp)
602582
603583 return changed ;
604584}
605-
606- static void
607- _zip_progress (zip_t * za , progress_state_t * progress_state , double sub_current )
608- {
609- double current ;
610-
611- if (za -> progress_callback == NULL ) {
612- return ;
613- }
614-
615- current = ZIP_MIN (ZIP_MAX (sub_current , 0.0 ), 1.0 ) * (progress_state -> end - progress_state -> start ) + progress_state -> start ;
616-
617- if (current - progress_state -> last_update > 0.001 ) {
618- za -> progress_callback (current );
619- progress_state -> last_update = current ;
620- }
621- }
0 commit comments