5 #include "extractzip.h"
6 #include "unzip/unzip.h"
8 #define WRITEBUFFERSIZE (8192)
9 #define MAXFILENAME (256)
11 int doExtractCurrentFile(unzFile uf, const QStringList &excludedExtensions)
13 char fileNameInZip[MAXFILENAME];
14 char *fileNameWithoutPath;
22 unz_file_info64 fileInfo;
24 err = unzGetCurrentFileInfo64(uf, &fileInfo, fileNameInZip,
25 sizeof(fileNameInZip), NULL, 0, NULL, 0);
27 qDebug() << "doExtractCurrentFile: Error" << err
28 << "in unzGetCurrentFileInfo";
32 bufSize = WRITEBUFFERSIZE;
33 buf = (void *)malloc(bufSize);
35 qDebug() << "doExtractCurrentFile: Error allocating memory";
36 return UNZ_INTERNALERROR;
39 p = fileNameWithoutPath = fileNameInZip;
40 while ((*p) != '\0') {
41 if (((*p) == '/') || ((*p) == '\\')) {
42 fileNameWithoutPath = p + 1;
47 if ((*fileNameWithoutPath) == '\0') {
48 dir.mkdir(fileNameInZip);
51 QString name(fileNameInZip);
52 for (int i = 0; i < excludedExtensions.length(); i++) {
53 if (name.endsWith(excludedExtensions[i], Qt::CaseInsensitive)) {
54 qDebug() << "extractCurrentFile: Skipping" << name;
59 qDebug() << "extractCurrentFile: Extracting" << name;
61 const char *writeFileName;
64 writeFileName = fileNameInZip;
66 err = unzOpenCurrentFilePassword(uf, 0);
68 qDebug() << "doExtractCurrentFile: Error" << err
69 << "in unzOpenCurrentFilePassword";
73 if ((skip == 0) && (err == UNZ_OK)) {
74 f = new QFile(writeFileName);
75 ret = f->open(QIODevice::WriteOnly);
77 /* some zipfile don't contain directory alone before file */
78 if (!ret && (fileNameWithoutPath != (char *)fileNameInZip))
80 char c = *(fileNameWithoutPath-1);
81 *(fileNameWithoutPath - 1) = '\0';
82 dir.mkpath(writeFileName);
83 *(fileNameWithoutPath - 1) = c;
85 f = new QFile(writeFileName);
86 ret = f->open(QIODevice::WriteOnly);
90 qDebug() << "doExtractCurrentFile: Error opening"
97 err = unzReadCurrentFile(uf, buf, bufSize);
99 qDebug() << "doExtractCurrentFile: Error" << err
100 << "in unzReadCurrentFile";
104 if (f->write((char *)buf, err) != err) {
105 qDebug() << "doExtractCurrentFile:"
106 << "Error in writing extracted file";
118 err = unzCloseCurrentFile(uf);
120 qDebug() << "doExtractCurrentFile: Error" << err
121 << "with zipfile in unzCloseCurrentFile";
125 unzCloseCurrentFile(uf); /* don't lose the error */
134 bool doExtract(unzFile uf, const QStringList &excludedExtensions)
137 unz_global_info64 gi;
140 err = unzGetGlobalInfo64(uf, &gi);
142 qDebug() << "doExtract: Error" << err << "in unzGetGlobalInfo";
146 for (i = 0; i < gi.number_entry; i++) {
147 if (doExtractCurrentFile(uf, excludedExtensions) != UNZ_OK) {
150 if ((i + 1) < gi.number_entry) {
151 err = unzGoToNextFile(uf);
153 qDebug() << "doExtract: Error" << err << "in unzGoToNextFile";
162 bool extractZip(const QString &zipFile, const QStringList &excludedExtensions)
167 uf = unzOpen64(zipFile.toUtf8().constData());
169 ret = doExtract(uf, excludedExtensions);