5 #include "extractzip.h"
6 #include "unzip/unzip.h"
8 #define WRITEBUFFERSIZE (8192)
9 #define MAXFILENAME (256)
11 int doExtractCurrentFile(unzFile uf)
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 const char *writeFileName;
54 writeFileName = fileNameInZip;
56 err = unzOpenCurrentFilePassword(uf, 0);
58 qDebug() << "doExtractCurrentFile: Error" << err
59 << "in unzOpenCurrentFilePassword";
63 if ((skip == 0) && (err == UNZ_OK)) {
64 f = new QFile(writeFileName);
65 ret = f->open(QIODevice::WriteOnly);
67 /* some zipfile don't contain directory alone before file */
68 if (!ret && (fileNameWithoutPath != (char *)fileNameInZip))
70 char c = *(fileNameWithoutPath-1);
71 *(fileNameWithoutPath - 1) = '\0';
72 dir.mkpath(writeFileName);
73 *(fileNameWithoutPath - 1) = c;
75 f = new QFile(writeFileName);
76 ret = f->open(QIODevice::WriteOnly);
80 qDebug() << "doExtractCurrentFile: Error opening"
87 err = unzReadCurrentFile(uf, buf, bufSize);
89 qDebug() << "doExtractCurrentFile: Error" << err
90 << "in unzReadCurrentFile";
94 if (f->write((char *)buf, err) != err) {
95 qDebug() << "doExtractCurrentFile:"
96 << "Error in writing extracted file";
108 err = unzCloseCurrentFile(uf);
110 qDebug() << "doExtractCurrentFile: Error" << err
111 << "with zipfile in unzCloseCurrentFile";
115 unzCloseCurrentFile(uf); /* don't lose the error */
124 bool doExtract(unzFile uf)
127 unz_global_info64 gi;
130 err = unzGetGlobalInfo64(uf,&gi);
132 qDebug() << "doExtract: Error" << err << "in unzGetGlobalInfo";
136 for (i = 0; i < gi.number_entry; i++) {
137 if (doExtractCurrentFile(uf) != UNZ_OK) {
140 if ((i + 1) < gi.number_entry) {
141 err = unzGoToNextFile(uf);
143 qDebug() << "doExtract: Error" << err << "in unzGoToNextFile";
152 bool extractZip(const QString &zipFile)
157 uf = unzOpen64(zipFile.toUtf8().constData());