19 changed files with 25445 additions and 103 deletions
@ -0,0 +1,85 @@
@@ -0,0 +1,85 @@
|
||||
/****************************************************************************
|
||||
* |
||||
* (c) 2009-2020 QGROUNDCONTROL PROJECT <http://www.qgroundcontrol.org>
|
||||
* |
||||
* QGroundControl is licensed according to the terms in the file |
||||
* COPYING.md in the root of the source code directory. |
||||
* |
||||
****************************************************************************/ |
||||
|
||||
#include "QGCZlib.h" |
||||
|
||||
#include <QFile> |
||||
#include <QDir> |
||||
#include <QtDebug> |
||||
|
||||
#include "zlib.h" |
||||
|
||||
bool QGCZlib::inflateGzipFile(const QString& gzippedFileName, const QString& decompressedFilename) |
||||
{ |
||||
bool success = true; |
||||
int ret; |
||||
const int cBuffer = 1024 * 5; |
||||
unsigned char inputBuffer[cBuffer]; |
||||
unsigned char outputBuffer[cBuffer]; |
||||
z_stream strm; |
||||
|
||||
QFile inputFile(gzippedFileName); |
||||
if (!inputFile.open(QIODevice::ReadOnly)) { |
||||
qWarning() << "QGCZlib::inflateGzipFile: open input file failed" << gzippedFileName << inputFile.errorString(); |
||||
return false; |
||||
} |
||||
|
||||
QFile outputFile(decompressedFilename); |
||||
if (!outputFile.open(QIODevice::WriteOnly | QIODevice::Truncate)) { |
||||
qWarning() << "QGCZlib::inflateGzipFile: open input file failed" << outputFile.fileName() << outputFile.errorString(); |
||||
return false; |
||||
} |
||||
|
||||
strm.zalloc = nullptr; |
||||
strm.zfree = nullptr; |
||||
strm.opaque = nullptr; |
||||
strm.avail_in = 0; |
||||
strm.next_in = nullptr; |
||||
|
||||
ret = inflateInit2(&strm, 16+MAX_WBITS); |
||||
if (ret != Z_OK) { |
||||
qWarning() << "QGCZlib::inflateGzipFile: inflateInit2 failed:" << ret; |
||||
goto Error; |
||||
} |
||||
|
||||
do { |
||||
strm.avail_in = static_cast<unsigned>(inputFile.read((char*)inputBuffer, cBuffer)); |
||||
if (strm.avail_in == 0) { |
||||
break; |
||||
} |
||||
strm.next_in = inputBuffer; |
||||
|
||||
do { |
||||
strm.avail_out = cBuffer; |
||||
strm.next_out = outputBuffer; |
||||
|
||||
ret = inflate(&strm, Z_NO_FLUSH); |
||||
if (ret != Z_OK && ret != Z_STREAM_END) { |
||||
qWarning() << "QGCZlib::inflateGzipFile: inflate failed:" << ret; |
||||
goto Error; |
||||
} |
||||
|
||||
unsigned cBytesInflated = cBuffer - strm.avail_out; |
||||
qint64 cBytesWritten = outputFile.write((char*)outputBuffer, static_cast<int>(cBytesInflated)); |
||||
if (cBytesWritten != cBytesInflated) { |
||||
qWarning() << "QGCZlib::inflateGzipFile: output file write failed:" << outputFile.fileName() << outputFile.errorString(); |
||||
goto Error; |
||||
|
||||
} |
||||
} while (strm.avail_out == 0); |
||||
} while (ret != Z_STREAM_END); |
||||
|
||||
Out: |
||||
inflateEnd(&strm); |
||||
return success; |
||||
|
||||
Error: |
||||
success = false; |
||||
goto Out; |
||||
} |
@ -0,0 +1,21 @@
@@ -0,0 +1,21 @@
|
||||
/****************************************************************************
|
||||
* |
||||
* (c) 2009-2020 QGROUNDCONTROL PROJECT <http://www.qgroundcontrol.org>
|
||||
* |
||||
* QGroundControl is licensed according to the terms in the file |
||||
* COPYING.md in the root of the source code directory. |
||||
* |
||||
****************************************************************************/ |
||||
|
||||
#pragma once |
||||
|
||||
#include <QString> |
||||
|
||||
class QGCZlib |
||||
{ |
||||
public: |
||||
/// Decompresses the specified file to the specified directory
|
||||
/// @param gzipFilename Fully qualified path to gzip file
|
||||
/// @param decompressedFilename Fully qualified path to for file to decompress to
|
||||
static bool inflateGzipFile(const QString& gzippedFileName, const QString& decompressedFilename); |
||||
}; |
File diff suppressed because it is too large
Load Diff
Binary file not shown.
Loading…
Reference in new issue