7 #include "extractzip.h"
8 #include "unzip/unzip.h"
10 #define WRITEBUFFERSIZE (8192)
11 #define MAXFILENAME (256)
13 int doExtractCurrentFile(unzFile uf, const QStringList &excludedExtensions)
15 char fileNameInZip[MAXFILENAME];
16 char *fileNameWithoutPath;
24 unz_file_info64 fileInfo;
26 err = unzGetCurrentFileInfo64(uf, &fileInfo, fileNameInZip,
27 sizeof(fileNameInZip), NULL, 0, NULL, 0);
29 qDebug() << "doExtractCurrentFile: Error" << err
30 << "in unzGetCurrentFileInfo";
34 bufSize = WRITEBUFFERSIZE;
35 buf = (void *)malloc(bufSize);
37 qDebug() << "doExtractCurrentFile: Error allocating memory";
38 return UNZ_INTERNALERROR;
41 p = fileNameWithoutPath = fileNameInZip;
42 while ((*p) != '\0') {
43 if (((*p) == '/') || ((*p) == '\\')) {
44 fileNameWithoutPath = p + 1;
49 if ((*fileNameWithoutPath) == '\0') {
50 dir.mkdir(fileNameInZip);
53 QString name(fileNameInZip);
54 for (int i = 0; i < excludedExtensions.length(); i++) {
55 if (name.endsWith(excludedExtensions[i], Qt::CaseInsensitive)) {
56 qDebug() << "Skipping" << name;
62 const char *writeFileName;
65 writeFileName = fileNameInZip;
67 err = unzOpenCurrentFilePassword(uf, 0);
69 qDebug() << "doExtractCurrentFile: Error" << err
70 << "in unzOpenCurrentFilePassword";
74 if ((skip == 0) && (err == UNZ_OK)) {
75 f = new QFile(writeFileName);
76 ret = f->open(QIODevice::WriteOnly);
78 /* some zipfile don't contain directory alone before file */
79 if (!ret && (fileNameWithoutPath != (char *)fileNameInZip))
81 char c = *(fileNameWithoutPath-1);
82 *(fileNameWithoutPath - 1) = '\0';
83 dir.mkpath(writeFileName);
84 *(fileNameWithoutPath - 1) = c;
86 f = new QFile(writeFileName);
87 ret = f->open(QIODevice::WriteOnly);
91 qDebug() << "doExtractCurrentFile: Error opening"
98 err = unzReadCurrentFile(uf, buf, bufSize);
100 qDebug() << "doExtractCurrentFile: Error" << err
101 << "in unzReadCurrentFile";
105 if (f->write((char *)buf, err) != err) {
106 qDebug() << "doExtractCurrentFile:"
107 << "Error in writing extracted file";
119 err = unzCloseCurrentFile(uf);
121 qDebug() << "doExtractCurrentFile: Error" << err
122 << "with zipfile in unzCloseCurrentFile";
126 unzCloseCurrentFile(uf); /* don't lose the error */
135 bool doExtract(unzFile uf, const QStringList &excludedExtensions)
138 unz_global_info64 gi;
141 err = unzGetGlobalInfo64(uf, &gi);
143 qDebug() << "doExtract: Error" << err << "in unzGetGlobalInfo";
147 for (i = 0; i < gi.number_entry; i++) {
148 if (doExtractCurrentFile(uf, excludedExtensions) != UNZ_OK) {
151 if ((i + 1) < gi.number_entry) {
152 err = unzGoToNextFile(uf);
154 qDebug() << "doExtract: Error" << err << "in unzGoToNextFile";
163 bool extractZip(const QString &zipFile, const QStringList &excludedExtensions)
168 uf = unzOpen64(zipFile.toUtf8().constData());
170 ret = doExtract(uf, excludedExtensions);