QGroundControl
Ground Control Station for MAVLink Drones
Loading...
Searching...
No Matches
QGCCompression.h
Go to the documentation of this file.
1#pragma once
2
4
5#include <QtCore/QByteArray>
6#include <QtCore/QCryptographicHash>
7#include <QtCore/QIODevice>
8#include <QtCore/QJsonDocument>
9#include <QtCore/QJsonParseError>
10#include <QtCore/QString>
11#include <QtCore/QStringList>
12
16namespace QGCCompression {
17
18// ============================================================================
19// Error Handling
20// ============================================================================
21
35
38
40QString lastErrorString();
41
43QString errorName(Error error);
44
45// ============================================================================
46// Format Definitions
47// ============================================================================
48
50enum class Format {
51 Auto,
52 ZIP,
53 SEVENZ,
54 GZIP,
55 XZ,
56 ZSTD,
57 BZIP2,
58 LZ4,
59 TAR,
60 TAR_GZ,
61 TAR_XZ,
62 TAR_ZSTD,
63 TAR_BZ2,
64 TAR_LZ4,
65};
66
67// ============================================================================
68// Format Detection
69// ============================================================================
70
77Format detectFormat(const QString &filePath, bool useContentFallback = true);
78
83Format detectFormatFromFile(const QString &filePath);
84
88Format detectFormatFromData(const QByteArray &data);
89
91QString formatExtension(Format format);
92
94QString formatName(Format format);
95
97bool isArchiveFormat(Format format);
98
100bool isCompressionFormat(Format format);
101
103inline bool isCompressedFile(const QString &filePath) {
104 return isCompressionFormat(detectFormat(filePath));
105}
106
108inline bool isArchiveFile(const QString &filePath) {
109 return isArchiveFormat(detectFormat(filePath));
110}
111
114QString strippedPath(const QString &filePath);
115
119QString detectedFormatName();
120
124QString detectedFilterName();
125
126// ============================================================================
127// Single-File Decompression
128// ============================================================================
129
137bool decompressFile(const QString &inputPath, const QString &outputPath = QString(),
138 Format format = Format::Auto,
139 ProgressCallback progress = nullptr,
140 qint64 maxDecompressedBytes = 0);
141
147QString decompressIfNeeded(const QString &filePath,
148 const QString &outputPath = QString(),
149 bool removeOriginal = false);
150
156QByteArray decompressData(const QByteArray &data, Format format = Format::Auto,
157 qint64 maxDecompressedBytes = 0);
158
159// ============================================================================
160// Archive Extraction (Multiple Files)
161// ============================================================================
162
170bool extractArchive(const QString &archivePath, const QString &outputDirectoryPath,
171 Format format = Format::Auto,
172 ProgressCallback progress = nullptr,
173 qint64 maxDecompressedBytes = 0);
174
184bool extractArchiveAtomic(const QString &archivePath, const QString &outputDirectoryPath,
185 Format format = Format::Auto,
186 ProgressCallback progress = nullptr,
187 qint64 maxDecompressedBytes = 0);
188
196bool extractArchiveFiltered(const QString &archivePath, const QString &outputDirectoryPath,
197 EntryFilter filter,
198 ProgressCallback progress = nullptr,
199 qint64 maxDecompressedBytes = 0);
200
205QStringList listArchive(const QString &archivePath, Format format = Format::Auto);
206
211QList<ArchiveEntry> listArchiveDetailed(const QString &archivePath, Format format = Format::Auto);
212
217ArchiveStats getArchiveStats(const QString &archivePath, Format format = Format::Auto);
218
223bool validateArchive(const QString &archivePath, Format format = Format::Auto);
224
230bool fileExists(const QString &archivePath, const QString &fileName,
231 Format format = Format::Auto);
232
239bool extractFile(const QString &archivePath, const QString &fileName,
240 const QString &outputPath = QString(),
241 Format format = Format::Auto);
242
248QByteArray extractFileData(const QString &archivePath, const QString &fileName,
249 Format format = Format::Auto);
250
257bool extractFiles(const QString &archivePath, const QStringList &fileNames,
258 const QString &outputDirectoryPath,
259 Format format = Format::Auto);
260
269bool extractByPattern(const QString &archivePath, const QStringList &patterns,
270 const QString &outputDirectoryPath,
271 QStringList *extractedFiles = nullptr,
272 Format format = Format::Auto);
273
274// ============================================================================
275// QIODevice-based Operations (streaming)
276// ============================================================================
277
285bool decompressFromDevice(QIODevice *device, const QString &outputPath,
286 ProgressCallback progress = nullptr,
287 qint64 maxDecompressedBytes = 0);
288
293QByteArray decompressFromDevice(QIODevice *device, qint64 maxDecompressedBytes = 0);
294
301bool extractFromDevice(QIODevice *device, const QString &outputDirectoryPath,
302 ProgressCallback progress = nullptr,
303 qint64 maxDecompressedBytes = 0);
304
309QByteArray extractFileDataFromDevice(QIODevice *device, const QString &fileName);
310
311// ============================================================================
312// In-Memory Compression (zlib via qCompress/qUncompress)
313// ============================================================================
314
316 None = 0,
317 Fast = 1,
318 Default = 6,
319 Best = 9
320};
321
326QByteArray compress(const QByteArray &data,
328
332QByteArray uncompress(const QByteArray &data);
333
339QByteArray compressData(const QByteArray &data,
341 int minSize = 256);
342
346QByteArray uncompressData(const QByteArray &data, qint64 maxDecompressedSize = 64LL * 1024 * 1024);
347
349bool isDataCompressed(const QByteArray &data);
350
353
355QByteArray readFile(const QString &filePath, QString *errorString = nullptr,
356 qint64 maxBytes = 0);
357
359QString computeFileHash(const QString &filePath,
360 QCryptographicHash::Algorithm algorithm = QCryptographicHash::Sha256);
361
362// ============================================================================
363// Compressed JSON Helpers
364// ============================================================================
365
368bool looksLikeCompressedData(const QByteArray &data);
369
371QJsonDocument parseCompressedJson(const QByteArray &data, QJsonParseError *error = nullptr);
372
373} // namespace QGCCompression
Shared type definitions for compression/archive operations.
QString formatName
QString errorString
Error error
std::function< void(int)> ProgressCallback
bool isCompressionFormat(Format format)
Check if format is a compression format (single stream)
QString computeFileHash(const QString &filePath, QCryptographicHash::Algorithm algorithm)
Hash file contents post-decompression.
bool fileExists(const QString &archivePath, const QString &fileName, Format format)
QByteArray decompressData(const QByteArray &data, Format format, qint64 maxDecompressedBytes)
bool extractArchiveAtomic(const QString &archivePath, const QString &outputDirectoryPath, Format format, ProgressCallback progress, qint64 maxDecompressedBytes)
bool extractArchive(const QString &archivePath, const QString &outputDirectoryPath, Format format, ProgressCallback progress, qint64 maxDecompressedBytes)
bool decompressFile(const QString &inputPath, const QString &outputPath, Format format, ProgressCallback progress, qint64 maxDecompressedBytes)
bool isArchiveFile(const QString &filePath)
Check if file path indicates an archive file (.zip, .tar, .tar.gz, etc.)
std::function< bool(const ArchiveEntry &entry)> EntryFilter
bool looksLikeCompressedData(const QByteArray &data)
QByteArray uncompressData(const QByteArray &data, qint64 maxDecompressedSize)
int lastCompressionRatio()
Compression ratio from the last compressData() call (thread-local, percentage of original size).
QByteArray compressData(const QByteArray &data, CompressionLevel level, int minSize)
QStringList listArchive(const QString &archivePath, Format format)
bool extractArchiveFiltered(const QString &archivePath, const QString &outputDirectoryPath, EntryFilter filter, ProgressCallback progress, qint64 maxDecompressedBytes)
bool isArchiveFormat(Format format)
Check if format is an archive (contains multiple files)
bool extractByPattern(const QString &archivePath, const QStringList &patterns, const QString &outputDirectoryPath, QStringList *extractedFiles, Format format)
Format detectFormatFromData(const QByteArray &data)
QString lastErrorString()
Get a human-readable error message from the last operation (thread-local)
QString strippedPath(const QString &filePath)
QString detectedFilterName()
bool isCompressedFile(const QString &filePath)
Check if file path indicates a compressed file (.gz, .xz, .zst)
QString errorName(Error error)
Get a human-readable name for an error code.
bool decompressFromDevice(QIODevice *device, const QString &outputPath, ProgressCallback progress, qint64 maxDecompressedBytes)
Format
Archive and compression format types (for decompression)
@ Auto
Auto-detect from file extension or magic bytes.
@ TAR_ZSTD
TAR + Zstandard (.tar.zst)
@ TAR_BZ2
TAR + BZip2 (.tar.bz2, .tbz2)
@ XZ
XZ/LZMA compression (single file, .xz)
@ ZIP
ZIP archive (multiple files)
@ TAR_XZ
TAR + XZ (.tar.xz, .txz)
@ SEVENZ
7-Zip archive (.7z)
@ TAR_LZ4
TAR + LZ4 (.tar.lz4)
@ BZIP2
BZip2 compression (single file, .bz2)
@ ZSTD
Zstandard compression (single file, .zst)
@ TAR_GZ
TAR + GZIP (.tar.gz, .tgz)
@ LZ4
LZ4 compression (single file, .lz4)
@ TAR
TAR archive (uncompressed, multiple files)
@ GZIP
GZIP compression (single file, .gz)
QByteArray extractFileData(const QString &archivePath, const QString &fileName, Format format)
QByteArray compress(const QByteArray &data, CompressionLevel level)
QByteArray uncompress(const QByteArray &data)
ArchiveStats getArchiveStats(const QString &archivePath, Format format)
QByteArray readFile(const QString &filePath, QString *errorString, qint64 maxBytes)
Read file contents, transparently decompressing .gz/.xz/.zst/.bz2/.lz4 files.
QList< ArchiveEntry > listArchiveDetailed(const QString &archivePath, Format format)
Error
Error codes for decompression operations.
@ FileNotFound
Input file does not exist.
@ FileNotInArchive
Requested file not found in archive.
@ PermissionDenied
Cannot read input or write output.
@ InvalidArchive
Archive is corrupt or invalid.
@ None
No error (success)
@ InternalError
Unexpected internal error.
@ Cancelled
Operation cancelled by progress callback.
@ SizeLimitExceeded
Decompressed size exceeded limit.
@ UnsupportedFormat
Format not recognized or not supported.
@ IoError
General I/O error (read/write failure)
QJsonDocument parseCompressedJson(const QByteArray &data, QJsonParseError *error)
Parse JSON from data that may be compressed. Auto-detects gzip/xz/zstd/bzip2/lz4.
bool validateArchive(const QString &archivePath, Format format)
bool extractFile(const QString &archivePath, const QString &fileName, const QString &outputPath, Format format)
Error lastError()
Get the error code from the last operation (thread-local)
bool isDataCompressed(const QByteArray &data)
Check if data has the compressed framing header.
bool extractFromDevice(QIODevice *device, const QString &outputDirectoryPath, ProgressCallback progress, qint64 maxDecompressedBytes)
QByteArray extractFileDataFromDevice(QIODevice *device, const QString &fileName)
bool extractFiles(const QString &archivePath, const QStringList &fileNames, const QString &outputDirectoryPath, Format format)
QString detectedFormatName()
QString decompressIfNeeded(const QString &filePath, const QString &outputPath, bool removeOriginal)
QString formatExtension(Format format)
Get file extension for a format.
Format detectFormatFromFile(const QString &filePath)
Format detectFormat(const QString &filePath, bool useContentFallback)