Commit 0aec0e08 authored by Alexey Ivanov's avatar Alexey Ivanov 🐢

libzipplugin.cpp: replace zip_fopen/zip_fclose with unique_ptr

parent aa4a790d
...@@ -479,9 +479,9 @@ bool LibzipPlugin::testArchive() ...@@ -479,9 +479,9 @@ bool LibzipPlugin::testArchive()
return false; return false;
} }
zip_file *zipFile = zip_fopen_index(archive, i, 0); std::unique_ptr<zip_file, decltype(&zip_fclose)> zipFile { zip_fopen_index(archive, i, 0), &zip_fclose };
std::unique_ptr<uchar[]> buf(new uchar[statBuffer.size]); std::unique_ptr<uchar[]> buf(new uchar[statBuffer.size]);
const int len = zip_fread(zipFile, buf.get(), statBuffer.size); const int len = zip_fread(zipFile.get(), buf.get(), statBuffer.size)
if (len == -1 || uint(len) != statBuffer.size) { if (len == -1 || uint(len) != statBuffer.size) {
qCCritical(ARK) << "Failed to read data for" << statBuffer.name; qCCritical(ARK) << "Failed to read data for" << statBuffer.name;
return false; return false;
...@@ -490,9 +490,6 @@ bool LibzipPlugin::testArchive() ...@@ -490,9 +490,6 @@ bool LibzipPlugin::testArchive()
qCCritical(ARK) << "CRC check failed for" << statBuffer.name; qCCritical(ARK) << "CRC check failed for" << statBuffer.name;
return false; return false;
} }
// Free libzip file entry from the memory
zip_fclose(zipFile);
emit progress(float(i) / nofEntries); emit progress(float(i) / nofEntries);
} }
...@@ -676,11 +673,10 @@ bool LibzipPlugin::extractEntry(zip_t *archive, const QString &entry, const QStr ...@@ -676,11 +673,10 @@ bool LibzipPlugin::extractEntry(zip_t *archive, const QString &entry, const QStr
} }
// Handle password-protected files. // Handle password-protected files.
zip_file *zipFile = nullptr; std::unique_ptr<zip_file, decltype(&zip_fclose)> zipFile { zip_fopen(archive, entry.toUtf8().constData(), 0), &zip_fclose };
bool firstTry = true; bool firstTry = true;
while (!zipFile) { while (!zipFile.get()) {
zipFile = zip_fopen(archive, entry.toUtf8().constData(), 0); if (zipFile.get()) {
if (zipFile) {
break; break;
} else if (zip_error_code_zip(zip_get_error(archive)) == ZIP_ER_NOPASSWD || } else if (zip_error_code_zip(zip_get_error(archive)) == ZIP_ER_NOPASSWD ||
zip_error_code_zip(zip_get_error(archive)) == ZIP_ER_WRONGPASSWD) { zip_error_code_zip(zip_get_error(archive)) == ZIP_ER_WRONGPASSWD) {
...@@ -718,7 +714,7 @@ bool LibzipPlugin::extractEntry(zip_t *archive, const QString &entry, const QStr ...@@ -718,7 +714,7 @@ bool LibzipPlugin::extractEntry(zip_t *archive, const QString &entry, const QStr
qulonglong sum = 0; qulonglong sum = 0;
char buf[1000]; char buf[1000];
while (sum != statBuffer.size) { while (sum != statBuffer.size) {
const auto readBytes = zip_fread(zipFile, buf, 1000); const auto readBytes = zip_fread(zipFile.get(), buf, 1000);
if (readBytes < 0) { if (readBytes < 0) {
qCCritical(ARK) << "Failed to read data"; qCCritical(ARK) << "Failed to read data";
emit error(xi18n("Failed to read data for entry: %1", entry)); emit error(xi18n("Failed to read data for entry: %1", entry));
...@@ -757,9 +753,7 @@ bool LibzipPlugin::extractEntry(zip_t *archive, const QString &entry, const QStr ...@@ -757,9 +753,7 @@ bool LibzipPlugin::extractEntry(zip_t *archive, const QString &entry, const QStr
default: // TODO: non-UNIX. default: // TODO: non-UNIX.
break; break;
} }
// Free libzip file entry from the memory
zip_fclose(zipFile);
// Close extracted file, flush any buffered data // Close extracted file, flush any buffered data
file.close(); file.close();
} }
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment