Skip to content

Commit 7613cc7

Browse files
committed
refactor(compression): Unify compression APIs with enhanced infrastructure
Complete refactor of QGC compression system using libarchive as the single backend for all archive operations (ZIP, TAR, GZIP, etc.). Key changes: - Unified QGCCompression API with decompression-only support - QGCCompressionJob for async operations with progress tracking - QGClibarchive backend replacing multiple format-specific handlers - QGCArchiveModel for QML-friendly archive browsing - QGCArchiveWatcher for monitoring archive directories Enhanced file download infrastructure: - QGCFileDownload with progress, retry logic, and range requests - QGCCachedFileDownload with ETag/Last-Modified validation - Concurrent download management - Removed http_parser dependency (inline HTTP status handling) Includes comprehensive test coverage for compression and downloads.
1 parent e7f76e6 commit 7613cc7

99 files changed

Lines changed: 14619 additions & 899 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/build-config.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
"ndk_full_version": "27.2.12479018",
1414
"ndk_version": "r27c",
1515
"qt_minimum_version": "6.10.0",
16-
"qt_modules": "qtcharts qtlocation qtpositioning qtspeech qt5compat qtmultimedia qtserialport qtimageformats qtshadertools qtconnectivity qtquick3d qtsensors qtscxml",
16+
"qt_modules": "qtcharts qtlocation qtpositioning qtspeech qt5compat qtmultimedia qtserialport qtimageformats qtshadertools qtconnectivity qtquick3d qtsensors qtscxml qthttpserver",
1717
"qt_version": "6.10.1",
1818
"xcode_ios_version": "latest-stable",
1919
"xcode_version": "16.x"

CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -161,6 +161,7 @@ find_package(Qt6
161161
Core
162162
Core5Compat
163163
Gui
164+
HttpServer
164165
LinguistTools
165166
Location
166167
LocationPrivate

src/Camera/VehicleCameraControl.cc

Lines changed: 11 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,9 @@
66
#include "VideoManager.h"
77
#include "QGCCameraManager.h"
88
#include "FTPManager.h"
9-
#include "QGCLZMA.h"
9+
#include "QGCCompression.h"
1010
#include "QGCCorePlugin.h"
11+
#include "QGCFileHelper.h"
1112
#include "Vehicle.h"
1213
#include "LinkInterface.h"
1314
#include "MAVLinkProtocol.h"
@@ -20,9 +21,10 @@
2021
#include <QtXml/QDomDocument>
2122
#include <QtXml/QDomNodeList>
2223
#include <QtQml/QQmlEngine>
23-
#include <QtNetwork/QNetworkProxy>
2424
#include <QtNetwork/QNetworkReply>
2525

26+
#include "QGCNetworkHelper.h"
27+
2628
//-----------------------------------------------------------------------------
2729
QGCCameraOptionExclusion::QGCCameraOptionExclusion(QObject* parent, QString param_, QString value_, QStringList exclusions_)
2830
: QObject(parent)
@@ -1574,9 +1576,9 @@ VehicleCameraControl::handleCaptureStatus(const mavlink_camera_capture_status_t&
15741576
//-- Time Lapse
15751577
if(photoCaptureStatus() == PHOTO_CAPTURE_INTERVAL_IDLE || photoCaptureStatus() == PHOTO_CAPTURE_INTERVAL_IN_PROGRESS) {
15761578
//-- Capture local image as well
1577-
QString photoPath = SettingsManager::instance()->appSettings()->savePath()->rawValue().toString() + QStringLiteral("/Photo");
1578-
QDir().mkpath(photoPath);
1579-
photoPath += "/" + QDateTime::currentDateTime().toString("yyyy-MM-dd_hh.mm.ss.zzz") + ".jpg";
1579+
const QString photoDir = SettingsManager::instance()->appSettings()->savePath()->rawValue().toString() + QStringLiteral("/Photo");
1580+
QGCFileHelper::ensureDirectoryExists(photoDir);
1581+
const QString photoPath = photoDir + "/" + QDateTime::currentDateTime().toString("yyyy-MM-dd_hh.mm.ss.zzz") + ".jpg";
15801582
VideoManager::instance()->grabImage(photoPath);
15811583
}
15821584
}
@@ -2129,18 +2131,14 @@ VehicleCameraControl::_httpRequest(const QString &url)
21292131
if(!_netManager) {
21302132
_netManager = new QNetworkAccessManager(this);
21312133
}
2132-
QNetworkProxy savedProxy = _netManager->proxy();
2133-
QNetworkProxy tempProxy;
2134-
tempProxy.setType(QNetworkProxy::DefaultProxy);
2135-
_netManager->setProxy(tempProxy);
2134+
QGCNetworkHelper::configureProxy(_netManager);
21362135
QNetworkRequest request(QUrl::fromUserInput(url));
21372136
request.setAttribute(QNetworkRequest::RedirectPolicyAttribute, true);
21382137
QSslConfiguration conf = request.sslConfiguration();
21392138
conf.setPeerVerifyMode(QSslSocket::VerifyNone);
21402139
request.setSslConfiguration(conf);
21412140
QNetworkReply* reply = _netManager->get(request);
21422141
connect(reply, &QNetworkReply::finished, this, &VehicleCameraControl::_downloadFinished);
2143-
_netManager->setProxy(savedProxy);
21442142
}
21452143

21462144
//-----------------------------------------------------------------------------
@@ -2174,16 +2172,9 @@ void VehicleCameraControl::_ftpDownloadComplete(const QString& fileName, const Q
21742172

21752173
disconnect(_vehicle->ftpManager(), &FTPManager::downloadComplete, this, &VehicleCameraControl::_ftpDownloadComplete);
21762174

2177-
QString outputFileName = fileName;
2178-
2179-
if (fileName.endsWith(".lzma", Qt::CaseInsensitive) || fileName.endsWith(".xz", Qt::CaseInsensitive)) {
2180-
outputFileName = fileName.left(fileName.lastIndexOf("."));
2181-
if (QGCLZMA::inflateLZMAFile(fileName, outputFileName)) {
2182-
QFile(fileName).remove();
2183-
} else {
2184-
qCWarning(CameraControlLog) << "Inflate of compressed xml failed" << fileName;
2185-
outputFileName.clear();
2186-
}
2175+
QString outputFileName = QGCCompression::decompressIfNeeded(fileName);
2176+
if (outputFileName.isEmpty()) {
2177+
qCWarning(CameraControlLog) << "Inflate of compressed xml failed" << fileName;
21872178
}
21882179

21892180
QFile xmlFile(outputFileName);

src/Comms/BluetoothLink.cc

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
#include "BluetoothLink.h"
22

3-
#include "DeviceInfo.h"
43
#include "QGCLoggingCategory.h"
4+
#include "QGCNetworkHelper.h"
55

66
#include <QtCore/QCoreApplication>
77
#include <QtCore/QPermissions>
@@ -93,7 +93,7 @@ void BluetoothConfiguration::saveSettings(QSettings &settings, const QString &ro
9393

9494
QString BluetoothConfiguration::settingsTitle() const
9595
{
96-
if (QGCDeviceInfo::isBluetoothAvailable()) {
96+
if (QGCNetworkHelper::isBluetoothAvailable()) {
9797
return tr("Bluetooth Link Settings");
9898
}
9999

src/Comms/LinkManager.cc

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
#include "LinkManager.h"
2-
#include "DeviceInfo.h"
32
#include "LogReplayLink.h"
3+
#include "QGCNetworkHelper.h"
44
#include "MAVLinkProtocol.h"
55
#include "MultiVehicleManager.h"
66
#include "QGCApplication.h"
@@ -697,7 +697,7 @@ void LinkManager::_removeConfiguration(const LinkConfiguration *config)
697697

698698
bool LinkManager::isBluetoothAvailable()
699699
{
700-
return QGCDeviceInfo::isBluetoothAvailable();
700+
return QGCNetworkHelper::isBluetoothAvailable();
701701
}
702702

703703
bool LinkManager::containsLink(const LinkInterface *link)

src/Comms/MAVLinkProtocol.cc

Lines changed: 20 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,17 @@
11
#include "MAVLinkProtocol.h"
2+
#include "AppSettings.h"
23
#include "LinkManager.h"
4+
#include "MavlinkSettings.h"
35
#include "MultiVehicleManager.h"
46
#include "QGCApplication.h"
7+
#include "QGCFileHelper.h"
58
#include "QGCLoggingCategory.h"
6-
#include "QGCTemporaryFile.h"
7-
#include "SettingsManager.h"
8-
#include "MavlinkSettings.h"
9-
#include "AppSettings.h"
109
#include "QmlObjectListModel.h"
10+
#include "SettingsManager.h"
1111

1212
#include <QtCore/QApplicationStatic>
1313
#include <QtCore/QDir>
14+
#include <QtCore/QFile>
1415
#include <QtCore/QFileInfo>
1516
#include <QtCore/QMetaType>
1617
#include <QtCore/QSettings>
@@ -23,7 +24,7 @@ Q_APPLICATION_STATIC(MAVLinkProtocol, _mavlinkProtocolInstance);
2324

2425
MAVLinkProtocol::MAVLinkProtocol(QObject *parent)
2526
: QObject(parent)
26-
, _tempLogFile(new QGCTemporaryFile(QStringLiteral("%2.%3").arg(_tempLogFileTemplate, _logFileExtension), this))
27+
, _tempLogFile(new QFile(this))
2728
{
2829
qCDebug(MAVLinkProtocolLog) << this;
2930
}
@@ -300,8 +301,20 @@ void MAVLinkProtocol::_startLogging()
300301
return;
301302
}
302303

303-
if (!_tempLogFile->open()) {
304-
const QString message = QStringLiteral("Opening Flight Data file for writing failed. Unable to write to %1. Please choose a different file location.").arg(_tempLogFile->fileName());
304+
// Generate unique temp file path for this logging session
305+
const QString logPath = QGCFileHelper::uniqueTempPath(
306+
QStringLiteral("%1.%2").arg(_tempLogFileTemplate, _logFileExtension));
307+
if (logPath.isEmpty()) {
308+
qCWarning(MAVLinkProtocolLog) << "Failed to generate temp log path";
309+
_logSuspendError = true;
310+
return;
311+
}
312+
313+
_tempLogFile->setFileName(logPath);
314+
if (!_tempLogFile->open(QIODevice::WriteOnly)) {
315+
const QString message = QStringLiteral("Opening Flight Data file for writing failed. "
316+
"Unable to write to %1. Please choose a different file location.")
317+
.arg(_tempLogFile->fileName());
305318
qgcApp()->showAppMessage(message, getName());
306319
_closeLogFile();
307320
_logSuspendError = true;

src/Comms/MAVLinkProtocol.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
#include "LinkInterface.h"
99
#include "MAVLinkLib.h"
1010

11-
class QGCTemporaryFile;
11+
class QFile;
1212

1313
Q_DECLARE_LOGGING_CATEGORY(MAVLinkProtocolLog)
1414

@@ -93,7 +93,7 @@ private slots:
9393
void _saveTelemetryLog(const QString &tempLogfile);
9494
bool _checkTelemetrySavePath();
9595

96-
QGCTemporaryFile * const _tempLogFile = nullptr;
96+
QFile *_tempLogFile = nullptr;
9797

9898
bool _logSuspendError = false; ///< true: Logging suspended due to error
9999
bool _logSuspendReplay = false; ///< true: Logging suspended due to replay

src/Comms/MockLink/MockLinkFTP.cc

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
#include "MockLinkFTP.h"
22
#include "MockLink.h"
33
#include "QGCLoggingCategory.h"
4-
#include "QGCTemporaryFile.h"
4+
5+
#include <QtCore/QDir>
6+
#include <QtCore/QTemporaryFile>
57

68
QGC_LOGGING_CATEGORY(MockLinkFTPLog, "Comms.MockLink.MockLinkFTP")
79

@@ -553,11 +555,12 @@ uint16_t MockLinkFTP::_nextSeqNumber(uint16_t seqNumber) const
553555

554556
QString MockLinkFTP::_createTestTempFile(int size)
555557
{
556-
QGCTemporaryFile tmpFile("MockLinkFTPTestCase");
558+
QTemporaryFile tmpFile(QDir::tempPath() + QStringLiteral("/MockLinkFTPTestCaseXXXXXX"));
559+
tmpFile.setAutoRemove(false);
557560

558-
if (tmpFile.open(QIODevice::WriteOnly | QIODevice::Truncate)) {
561+
if (tmpFile.open()) {
559562
for (int i = 0; i < size; i++) {
560-
(void) tmpFile.write(QByteArray(1, i % 255));
563+
(void) tmpFile.write(QByteArray(1, static_cast<char>(i % 255)));
561564
}
562565
tmpFile.close();
563566
}

src/Comms/TCPLink.cc

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
#include "TCPLink.h"
2-
#include "DeviceInfo.h"
32
#include "QGCLoggingCategory.h"
3+
#include "QGCNetworkHelper.h"
44

55
#include <QtCore/QThread>
66
#include <QtCore/QTimer>
@@ -337,5 +337,5 @@ void TCPLink::_writeBytes(const QByteArray& bytes)
337337

338338
bool TCPLink::isSecureConnection() const
339339
{
340-
return QGCDeviceInfo::isNetworkEthernet();
340+
return QGCNetworkHelper::isNetworkEthernet();
341341
}

src/Comms/UDPLink.cc

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
#include "UDPLink.h"
22
#include "AutoConnectSettings.h"
3-
#include "DeviceInfo.h"
43
#include "QGCLoggingCategory.h"
4+
#include "QGCNetworkHelper.h"
55
#include "SettingsManager.h"
66

77
#include <QtCore/QMutexLocker>
@@ -642,5 +642,5 @@ void UDPLink::_writeBytes(const QByteArray& bytes)
642642

643643
bool UDPLink::isSecureConnection() const
644644
{
645-
return QGCDeviceInfo::isNetworkEthernet();
645+
return QGCNetworkHelper::isNetworkEthernet();
646646
}

0 commit comments

Comments
 (0)