23 #include "../util/File.h"
25 #include "../minizip/zip.h"
26 #include "../minizip/unzip.h"
28 #include "../minizip/iowin32.h"
87 DEBUG(
"ZipSerialize::extract()");
95 DEBUG(
"Opened ZIP file '%s' for extracting.", path.c_str());
102 THROW_IOEXCEPTION(
"Failed to go to the first file inside ZIP container. ZLib error: %d", unzResult);
107 DEBUG(
"Extracting ZIP file to temporary directory '%s'", tmpDirectory.c_str());
115 d->extractCurrentFile(zipFile, tmpDirectory);
117 catch(
const IOException&
e)
129 else if(unzResult !=
UNZ_OK)
132 THROW_IOEXCEPTION(
"Failed to go to the next file inside ZIP container. ZLib error: %d", unzResult);
142 DEBUG(
"Successfully closed ZIP file '%s'.", path.c_str());
156 DEBUG(
"ZipSerializePrivate::extractCurrentFile(zipFile = %p, directory = '%s')",
zipFile, directory.c_str());
163 THROW_IOEXCEPTION(
"Failed to get filename of the current file inside ZIP container. ZLib error: %d", unzResult);
165 std::string fileName(fileInfo.size_filename, 0);
168 THROW_IOEXCEPTION(
"Failed to get filename of the current file inside ZIP container. ZLib error: %d", unzResult);
177 THROW_IOEXCEPTION(
"Failed to open current file inside ZIP container. ZLib error: %d", unzResult);
179 if(fileName[fileName.size()-1] ==
'/')
183 DEBUG(
"Extracting file '%s' to '%s'.", fileName.c_str(), path.c_str());
200 size_t bytesWritten = fwrite(buf, 1, unzResult, pFile);
201 if(
int(bytesWritten) != unzResult)
205 THROW_IOEXCEPTION(
"Failed to write %d bytes to file '%s', could only write %d bytes.", unzResult, path.c_str(), bytesWritten);
216 THROW_IOEXCEPTION(
"Failed to read bytes from current file inside ZIP container. ZLib error: %d", unzResult);
220 DEBUG(
"Finished writing data to file '%s', closing file.", path.c_str());
223 if(fclose(pFile) != 0)
232 THROW_IOEXCEPTION(
"Failed to close current file inside ZIP container. ZLib error: %d", unzResult);
244 d->filesAdded.clear();
258 DEBUG(
"ZipSerialize::addFile(containerPath = '%s', path = '%s')", containerPath.c_str(), path.c_str());
261 d->filesAdded.push_back(fileEntry);
274 DEBUG(
"ZipSerialize::save()");
276 if(d->filesAdded.empty())
283 DEBUG(
"Created ZIP file: fileName = '%s', zipFile = %p", fileName.c_str(),
zipFile);
288 for(std::vector<ZipSerializePrivate::FileEntry>::const_iterator iter = d->filesAdded.begin();
289 iter != d->filesAdded.end(); iter++)
303 { uInt(t->tm_sec), uInt(t->tm_min), uInt(t->tm_hour), uInt(t->tm_mday), uInt(t->tm_mon), uInt(t->tm_year) }, 0, 0, 0 };
305 &fileInfo, 0, 0, 0, 0, 0, Z_DEFLATED, Z_DEFAULT_COMPRESSION, 0,
306 -MAX_WBITS,
DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY, 0, 0, 0, 2048);
311 THROW_IOEXCEPTION(
"Failed to create new file inside ZIP container. ZLib error: %d", zipResult);
314 DEBUG(
"Archiving file '%s' to ZIP file '%s' with path '%s'.", iter->path.c_str(), fileName.c_str(), iter->containerPath.c_str());
320 size_t bytesRead = fread(buf, 1, 10240, pFile);
330 THROW_IOEXCEPTION(
"Failed to write bytes to current file inside ZIP container. ZLib error: %d", zipResult);
335 if(fclose(pFile) != 0)
347 THROW_IOEXCEPTION(
"Failed to close current file inside ZIP container. ZLib error: %d", zipResult);
353 int zipResult =
zipClose(zipFile, NULL);
357 DEBUG(
"Successfully closed ZIP file '%s'.", fileName.c_str());
363 d->filesAdded.clear();