Browse Source

Switch COMPONENT_INFORMATION compression to lzma

QGC4.4
DonLakeFlyer 4 years ago committed by Lorenz Meier
parent
commit
14a4e74db2
  1. 7
      qgroundcontrol.pro
  2. 2
      qgroundcontrol.qrc
  3. 97
      src/Compression/QGCLZMA.cc
  4. 21
      src/Compression/QGCLZMA.h
  5. 0
      src/Compression/QGCZlib.cc
  6. 0
      src/Compression/QGCZlib.h
  7. 6
      src/Vehicle/ComponentInformationManager.cc
  8. BIN
      src/comm/MockLink.Parameter.MetaData.json.xz
  9. BIN
      src/comm/MockLink.Version.MetaData.json.xz
  10. 4
      src/comm/MockLink.cc
  11. 6
      src/comm/MockLinkFTP.cc

7
qgroundcontrol.pro

@ -383,6 +383,7 @@ INCLUDEPATH += \ @@ -383,6 +383,7 @@ INCLUDEPATH += \
src/api \
src/AnalyzeView \
src/Camera \
src/Compression \
src/AutoPilotPlugins \
src/FlightDisplay \
src/FlightMap \
@ -568,6 +569,8 @@ HEADERS += \ @@ -568,6 +569,8 @@ HEADERS += \
src/Camera/QGCCameraIO.h \
src/Camera/QGCCameraManager.h \
src/CmdLineOptParser.h \
src/Compression/QGCLZMA.h \
src/Compression/QGCZlib.h \
src/FirmwarePlugin/PX4/px4_custom_mode.h \
src/FollowMe/FollowMe.h \
src/Joystick/Joystick.h \
@ -639,7 +642,6 @@ HEADERS += \ @@ -639,7 +642,6 @@ HEADERS += \
src/QGCQGeoCoordinate.h \
src/QGCTemporaryFile.h \
src/QGCToolbox.h \
src/QGCZlib.h \
src/QmlControls/AppMessages.h \
src/QmlControls/EditPositionDialogController.h \
src/QmlControls/FlightPathSegment.h \
@ -801,6 +803,8 @@ SOURCES += \ @@ -801,6 +803,8 @@ SOURCES += \
src/Camera/QGCCameraIO.cc \
src/Camera/QGCCameraManager.cc \
src/CmdLineOptParser.cc \
src/Compression/QGCLZMA.cc \
src/Compression/QGCZlib.cc \
src/FollowMe/FollowMe.cc \
src/Joystick/Joystick.cc \
src/Joystick/JoystickManager.cc \
@ -868,7 +872,6 @@ SOURCES += \ @@ -868,7 +872,6 @@ SOURCES += \
src/QGCQGeoCoordinate.cc \
src/QGCTemporaryFile.cc \
src/QGCToolbox.cc \
src/QGCZlib.cc \
src/QmlControls/AppMessages.cc \
src/QmlControls/EditPositionDialogController.cc \
src/QmlControls/FlightPathSegment.cc \

2
qgroundcontrol.qrc

@ -337,6 +337,8 @@ @@ -337,6 +337,8 @@
<file alias="PX4MockLink.params">src/comm/PX4MockLink.params</file>
<file alias="Version.MetaData.json">src/comm/MockLink.Version.MetaData.json</file>
<file alias="Version.MetaData.json.gz">src/comm/MockLink.Version.MetaData.json.gz</file>
<file alias="Version.MetaData.json.xz">src/comm/MockLink.Version.MetaData.json.xz</file>
<file alias="Parameter.MetaData.json.xz">src/comm/MockLink.Parameter.MetaData.json.xz</file>
<file alias="Parameter.MetaData.json">src/comm/MockLink.Parameter.MetaData.json</file>
</qresource>
</RCC>

97
src/Compression/QGCLZMA.cc

@ -0,0 +1,97 @@ @@ -0,0 +1,97 @@
/****************************************************************************
*
* (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 "QGCLZMA.h"
#include <QFile>
#include <QDir>
#include <QtDebug>
#include "lzma.h"
bool QGCLZMA::inflateLZMAFile(const QString& lzmaFilename, const QString& decompressedFilename)
{
bool success = true;
const int cBuffer = 1024 * 5;
unsigned char inputBuffer[cBuffer];
unsigned char outputBuffer[cBuffer];
lzma_stream lzmaStrm = LZMA_STREAM_INIT;
QFile inputFile(lzmaFilename);
if (!inputFile.open(QIODevice::ReadOnly)) {
qWarning() << "QGCLZMA::inflateLZMAFile: open input file failed" << lzmaFilename << inputFile.errorString();
return false;
}
QFile outputFile(decompressedFilename);
if (!outputFile.open(QIODevice::WriteOnly | QIODevice::Truncate)) {
qWarning() << "QGCLZMA::inflateLZMAFile: open input file failed" << outputFile.fileName() << outputFile.errorString();
return false;
}
// UINT64_MAX - used as much memory as needed to decode
int lzmaRetCode = lzma_alone_decoder(&lzmaStrm, UINT64_MAX);
if (lzmaRetCode != LZMA_OK) {
qWarning() << "QGCLZMA::inflateLZMAFile: lzma_alone_decoder failed:" << lzmaRetCode;
return false;
}
// When LZMA_CONCATENATED flag was used when initializing the decoder,
// we need to tell lzma_code() when there will be no more input.
// This is done by setting action to LZMA_FINISH instead of LZMA_RUN
// in the same way as it is done when encoding.
//
// When LZMA_CONCATENATED isn't used, there is no need to use
// LZMA_FINISH to tell when all the input has been read, but it
// is still OK to use it if you want. When LZMA_CONCATENATED isn't
// used, the decoder will stop after the first .xz stream. In that
// case some unused data may be left in lzmaStrm.next_in.
lzma_action action = LZMA_RUN;
lzmaStrm.next_in = nullptr;
lzmaStrm.avail_in = 0;
lzmaStrm.next_out = nullptr;
lzmaStrm.avail_out = cBuffer;
do {
lzmaStrm.avail_in = static_cast<unsigned>(inputFile.read((char*)inputBuffer, cBuffer));
if (lzmaStrm.avail_in == 0) {
break;
}
lzmaStrm.next_in = inputBuffer;
do {
lzmaStrm.avail_out = cBuffer;
lzmaStrm.next_out = outputBuffer;
lzmaRetCode = lzma_code(&lzmaStrm, action);
if (lzmaRetCode != LZMA_OK && lzmaRetCode != LZMA_STREAM_END) {
qWarning() << "QGCLZMA::inflateLZMAFile: inflate failed:" << lzmaRetCode;
goto Error;
}
unsigned cBytesInflated = cBuffer - lzmaStrm.avail_out;
qint64 cBytesWritten = outputFile.write((char*)outputBuffer, static_cast<int>(cBytesInflated));
if (cBytesWritten != cBytesInflated) {
qWarning() << "QGCLZMA::inflateLZMAFile: output file write failed:" << outputFile.fileName() << outputFile.errorString();
goto Error;
}
} while (lzmaStrm.avail_out == 0);
} while (lzmaRetCode != LZMA_STREAM_END);
Out:
lzma_end(&lzmaStrm);
return success;
Error:
success = false;
goto Out;
}

21
src/Compression/QGCLZMA.h

@ -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 QGCLZMA
{
public:
/// Decompresses the specified file to the specified directory
/// @param lzmaFilename Fully qualified path to lzma file
/// @param decompressedFilename Fully qualified path to for file to decompress to
static bool inflateLZMAFile(const QString& lzmaFilename, const QString& decompressedFilename);
};

0
src/QGCZlib.cc → src/Compression/QGCZlib.cc

0
src/QGCZlib.h → src/Compression/QGCZlib.h

6
src/Vehicle/ComponentInformationManager.cc

@ -10,7 +10,7 @@ @@ -10,7 +10,7 @@
#include "ComponentInformationManager.h"
#include "Vehicle.h"
#include "FTPManager.h"
#include "QGCZlib.h"
#include "QGCLZMA.h"
#include "JsonHelper.h"
#include "CompInfoVersion.h"
#include "CompInfoParam.h"
@ -210,9 +210,9 @@ QString RequestMetaDataTypeStateMachine::_downloadCompleteJsonWorker(const QStri @@ -210,9 +210,9 @@ QString RequestMetaDataTypeStateMachine::_downloadCompleteJsonWorker(const QStri
{
QString outputFileName = fileName;
if (fileName.endsWith(".gz", Qt::CaseInsensitive)) {
if (fileName.endsWith(".lzma", Qt::CaseInsensitive)) {
outputFileName = (QDir(QStandardPaths::writableLocation(QStandardPaths::TempLocation)).absoluteFilePath(inflatedFileName));
if (QGCZlib::inflateGzipFile(fileName, outputFileName)) {
if (QGCLZMA::inflateLZMAFile(fileName, outputFileName)) {
QFile(fileName).remove();
} else {
qCWarning(ComponentInformationManagerLog) << "Inflate of compressed json failed" << inflatedFileName;

BIN
src/comm/MockLink.Parameter.MetaData.json.xz

Binary file not shown.

BIN
src/comm/MockLink.Version.MetaData.json.xz

Binary file not shown.

4
src/comm/MockLink.cc

@ -1619,7 +1619,7 @@ void MockLink::_sendVersionMetaData(void) @@ -1619,7 +1619,7 @@ void MockLink::_sendVersionMetaData(void)
{
mavlink_message_t responseMsg;
#if 1
char metaDataURI[MAVLINK_MSG_COMPONENT_INFORMATION_FIELD_METADATA_URI_LEN] = "mftp://[;comp=1]version.json.gz";
char metaDataURI[MAVLINK_MSG_COMPONENT_INFORMATION_FIELD_METADATA_URI_LEN] = "mftp://[;comp=1]version.json";
#else
char metaDataURI[MAVLINK_MSG_COMPONENT_INFORMATION_FIELD_METADATA_URI_LEN] = "https://bit.ly/31nm0fs";
#endif
@ -1642,7 +1642,7 @@ void MockLink::_sendParameterMetaData(void) @@ -1642,7 +1642,7 @@ void MockLink::_sendParameterMetaData(void)
{
mavlink_message_t responseMsg;
#if 1
char metaDataURI[MAVLINK_MSG_COMPONENT_INFORMATION_FIELD_METADATA_URI_LEN] = "mftp://[;comp=1]parameter.json";
char metaDataURI[MAVLINK_MSG_COMPONENT_INFORMATION_FIELD_METADATA_URI_LEN] = "mftp://[;comp=1]parameter.json.xz";
#else
char metaDataURI[MAVLINK_MSG_COMPONENT_INFORMATION_FIELD_METADATA_URI_LEN] = "https://bit.ly/2ZKRIRE";
#endif

6
src/comm/MockLinkFTP.cc

@ -119,10 +119,12 @@ void MockLinkFTP::_openCommand(uint8_t senderSystemId, uint8_t senderComponentId @@ -119,10 +119,12 @@ void MockLinkFTP::_openCommand(uint8_t senderSystemId, uint8_t senderComponentId
tmpFilename = _createTestTempFile(sizeString.toInt());
} else if (path == "/version.json") {
tmpFilename = ":MockLink/Version.MetaData.json";
} else if (path == "/version.json.gz") {
tmpFilename = ":MockLink/Version.MetaData.json.gz";
} else if (path == "/version.json.xz") {
tmpFilename = ":MockLink/Version.MetaData.json.xz";
} else if (path == "/parameter.json") {
tmpFilename = ":MockLink/Parameter.MetaData.json";
} else if (path == "/parameter.json.xz") {
tmpFilename = ":MockLink/Parameter.MetaData.json.xz";
}
if (!tmpFilename.isEmpty()) {

Loading…
Cancel
Save