Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mapsme/omim.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorrachytski <siarhei.rachytski@gmail.com>2012-02-26 23:33:04 +0400
committerAlex Zolotarev <alex@maps.me>2015-09-23 01:34:42 +0300
commit7b61b446b63a3628cbacd91aaa975fd6b85a874f (patch)
treed7a77b051708b035d50015bdcaa7b2735f4a16df /coding/zip_reader.cpp
parentadcdbd28b1e5164e945ae7a67318212af1c77500 (diff)
added progress tracking to UnzipFile.
Diffstat (limited to 'coding/zip_reader.cpp')
-rw-r--r--coding/zip_reader.cpp13
1 files changed, 12 insertions, 1 deletions
diff --git a/coding/zip_reader.cpp b/coding/zip_reader.cpp
index 68530bdeba..fa22648bee 100644
--- a/coding/zip_reader.cpp
+++ b/coding/zip_reader.cpp
@@ -73,7 +73,7 @@ bool ZipFileReader::IsZip(string const & zipContainer)
}
void ZipFileReader::UnzipFile(string const & zipContainer, string const & fileInZip,
- string const & outFilePath)
+ string const & outFilePath, ProgressFn progressFn)
{
unzFile zip = unzOpen64(zipContainer.c_str());
if (!zip)
@@ -85,12 +85,18 @@ void ZipFileReader::UnzipFile(string const & zipContainer, string const & fileIn
if (UNZ_OK != unzOpenCurrentFile(zip))
MYTHROW(LocateZipException, ("Can't open file inside zip", fileInZip));
+
+ unz_file_info64 fileInfo;
+ if (UNZ_OK != unzGetCurrentFileInfo64(zip, &fileInfo, NULL, 0, NULL, 0, NULL, 0))
+ MYTHROW(LocateZipException, ("Can't get uncompressed file size inside zip", fileInZip));
+
MY_SCOPE_GUARD(currentFileGuard, bind(&unzCloseCurrentFile, zip));
try
{
FileWriter outFile(outFilePath);
+ int pos = 0;
int readBytes;
static size_t const BUF_SIZE = 4096;
char buf[BUF_SIZE];
@@ -103,6 +109,11 @@ void ZipFileReader::UnzipFile(string const & zipContainer, string const & fileIn
MYTHROW(InvalidZipException, ("Error", readBytes, "while unzipping", fileInZip, "from", zipContainer));
else
break;
+
+ pos += readBytes;
+
+ if (progressFn)
+ progressFn(fileInfo.uncompressed_size, pos);
}
}
catch (Exception const & e)