Skip to content

Commit 10e72c9

Browse files
committed
Improve progress reporting for compressible files.
From ralfjunker in #414.
1 parent 07d514f commit 10e72c9

File tree

1 file changed

+10
-4
lines changed

1 file changed

+10
-4
lines changed

lib/zip_close.c

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@
4444

4545
static int add_data(zip_t *, zip_source_t *, zip_dirent_t *, zip_uint32_t);
4646
static int copy_data(zip_t *, zip_uint64_t);
47-
static int copy_source(zip_t *, zip_source_t *, zip_int64_t);
47+
static int copy_source(zip_t *, zip_source_t *, zip_source_t *, zip_int64_t);
4848
static int torrentzip_compare_names(const void *a, const void *b);
4949
static int write_cdir(zip_t *, const zip_filelist_t *, zip_uint64_t);
5050
static int write_data_descriptor(zip_t *za, const zip_dirent_t *dirent, int is_zip64);
@@ -495,7 +495,7 @@ add_data(zip_t *za, zip_source_t *src, zip_dirent_t *de, zip_uint32_t changed) {
495495
return -1;
496496
}
497497

498-
ret = copy_source(za, src_final, data_length);
498+
ret = copy_source(za, src_final, src, data_length);
499499

500500
if (zip_source_stat(src_final, &st) < 0) {
501501
zip_error_set_from_source(&za->error, src_final);
@@ -605,7 +605,7 @@ copy_data(zip_t *za, zip_uint64_t len) {
605605

606606

607607
static int
608-
copy_source(zip_t *za, zip_source_t *src, zip_int64_t data_length) {
608+
copy_source(zip_t *za, zip_source_t *src, zip_source_t *src_for_length, zip_int64_t data_length) {
609609
DEFINE_BYTE_ARRAY(buf, BUFSIZE);
610610
zip_int64_t n, current;
611611
int ret;
@@ -628,7 +628,13 @@ copy_source(zip_t *za, zip_source_t *src, zip_int64_t data_length) {
628628
break;
629629
}
630630
if (n == BUFSIZE && za->progress && data_length > 0) {
631-
current += n;
631+
zip_int64_t t;
632+
t = zip_source_tell(src_for_length);
633+
if (t >= 0) {
634+
current = t;
635+
} else {
636+
current += n;
637+
}
632638
if (_zip_progress_update(za->progress, (double)current / (double)data_length) != 0) {
633639
zip_error_set(&za->error, ZIP_ER_CANCELLED, 0);
634640
ret = -1;

0 commit comments

Comments
 (0)