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() << "Skipping" << name;
60 const char *writeFileName;
63 writeFileName = fileNameInZip;
65 err = unzOpenCurrentFilePassword(uf, 0);
67 qDebug() << "doExtractCurrentFile: Error" << err
68 << "in unzOpenCurrentFilePassword";
72 if ((skip == 0) && (err == UNZ_OK)) {
73 f = new QFile(writeFileName);
74 ret = f->open(QIODevice::WriteOnly);
76 /* some zipfile don't contain directory alone before file */
77 if (!ret && (fileNameWithoutPath != (char *)fileNameInZip))
79 char c = *(fileNameWithoutPath-1);
80 *(fileNameWithoutPath - 1) = '\0';
81 dir.mkpath(writeFileName);
82 *(fileNameWithoutPath - 1) = c;
84 f = new QFile(writeFileName);
85 ret = f->open(QIODevice::WriteOnly);
89 qDebug() << "doExtractCurrentFile: Error opening"
96 err = unzReadCurrentFile(uf, buf, bufSize);
98 qDebug() << "doExtractCurrentFile: Error" << err
99 << "in unzReadCurrentFile";
103 if (f->write((char *)buf, err) != err) {
104 qDebug() << "doExtractCurrentFile:"
105 << "Error in writing extracted file";
117 err = unzCloseCurrentFile(uf);
119 qDebug() << "doExtractCurrentFile: Error" << err
120 << "with zipfile in unzCloseCurrentFile";
124 unzCloseCurrentFile(uf); /* don't lose the error */
133 bool doExtract(unzFile uf, const QStringList &excludedExtensions)
136 unz_global_info64 gi;
139 err = unzGetGlobalInfo64(uf, &gi);
141 qDebug() << "doExtract: Error" << err << "in unzGetGlobalInfo";
145 for (i = 0; i < gi.number_entry; i++) {
146 if (doExtractCurrentFile(uf, excludedExtensions) != UNZ_OK) {
149 if ((i + 1) < gi.number_entry) {
150 err = unzGoToNextFile(uf);
152 qDebug() << "doExtract: Error" << err << "in unzGoToNextFile";
161 bool extractZip(const QString &zipFile, const QStringList &excludedExtensions)
166 uf = unzOpen64(zipFile.toUtf8().constData());
168 ret = doExtract(uf, excludedExtensions);