QGroundControl
Ground Control Station for MAVLink Drones
Loading...
Searching...
No Matches
QGClibarchive.h
Go to the documentation of this file.
1#pragma once
2
6
8
9#include <QtCore/QByteArray>
10#include <QtCore/QFile>
11#include <QtCore/QIODevice>
12#include <QtCore/QString>
13#include <QtCore/QStringList>
14
15#include <archive.h>
16
17namespace QGClibarchive {
18
19// ============================================================================
20// Types (re-export from QGCCompression for internal use)
21// ============================================================================
22
27
29
30// ============================================================================
31// Archive Reader Mode
32// ============================================================================
33
35enum class ReaderMode {
38};
39
40// ============================================================================
41// RAII Archive Reader
42// ============================================================================
43
47public:
48 ArchiveReader() = default;
50
51 ArchiveReader(const ArchiveReader&) = delete;
53
58 bool open(const QString &path, ReaderMode mode = ReaderMode::AllFormats);
59
65 bool open(QIODevice *device, ReaderMode mode = ReaderMode::AllFormats);
66
68 struct archive* handle() const { return _archive; }
69
71 struct archive* release() { auto *a = _archive; _archive = nullptr; return a; }
72
74 bool isOpen() const { return _archive != nullptr; }
75
78 qint64 dataSize() const;
79
82 QString formatName() const;
83
86 QString filterName() const;
87
88private:
89 struct archive *_archive = nullptr;
90 QString _filePath; // Stored path for size queries
91 QByteArray _resourceData; // Holds data for Qt resources
92 QIODevice *_device = nullptr; // Device for streaming reads
93};
94
95// ============================================================================
96// QIODevice Streaming Callbacks
97// ============================================================================
98
103la_ssize_t deviceReadCallback(struct archive *a, void *clientData, const void **buffer);
104
109la_int64_t deviceSkipCallback(struct archive *a, void *clientData, la_int64_t request);
110
114int deviceCloseCallback(struct archive *a, void *clientData);
115
121la_int64_t deviceSeekCallback(struct archive *a, void *clientData, la_int64_t offset, int whence);
122
123// ============================================================================
124// Utility Functions
125// ============================================================================
126
130ArchiveEntry toArchiveEntry(struct archive_entry *entry);
131
132// ============================================================================
133// Low-level Operations
134// ============================================================================
135
142bool openArchiveForReading(struct archive *a, const QString &filePath, QByteArray &resourceData);
143
151bool extractAnyArchive(const QString &archivePath, const QString &outputDirectoryPath,
152 ProgressCallback progress = nullptr,
153 qint64 maxBytes = 0);
154
164bool extractArchiveAtomic(const QString &archivePath, const QString &outputDirectoryPath,
165 ProgressCallback progress = nullptr,
166 qint64 maxBytes = 0);
167
173bool extractSingleFile(const QString &archivePath, const QString &fileName,
174 const QString &outputPath);
175
180QByteArray extractFileToMemory(const QString &archivePath, const QString &fileName);
181
187bool extractMultipleFiles(const QString &archivePath, const QStringList &fileNames,
188 const QString &outputDirectoryPath);
189
197bool extractByPattern(const QString &archivePath, const QStringList &patterns,
198 const QString &outputDirectoryPath,
199 QStringList *extractedFiles = nullptr);
200
204bool validateArchive(const QString &archivePath);
205
210bool fileExistsInArchive(const QString &archivePath, const QString &fileName);
211
215QStringList listArchiveEntries(const QString &archivePath);
216
220QList<ArchiveEntry> listArchiveEntriesDetailed(const QString &archivePath);
221
225ArchiveStats getArchiveStats(const QString &archivePath);
226
234bool extractWithFilter(const QString &archivePath, const QString &outputDirectoryPath,
235 EntryFilter filter,
236 ProgressCallback progress = nullptr,
237 qint64 maxBytes = 0);
238
239// ============================================================================
240// Single-File Decompression
241// ============================================================================
242
249bool decompressSingleFile(const QString &inputPath, const QString &outputPath,
250 ProgressCallback progress = nullptr,
251 qint64 maxBytes = 0);
252
257QByteArray decompressDataFromMemory(const QByteArray &data, qint64 maxBytes = 0);
258
259// ============================================================================
260// QIODevice-based Operations (streaming)
261// ============================================================================
262
269bool extractFromDevice(QIODevice *device, const QString &outputDirectoryPath,
270 ProgressCallback progress = nullptr,
271 qint64 maxBytes = 0);
272
277QByteArray extractFileDataFromDevice(QIODevice *device, const QString &fileName);
278
285bool decompressFromDevice(QIODevice *device, const QString &outputPath,
286 ProgressCallback progress = nullptr,
287 qint64 maxBytes = 0);
288
293QByteArray decompressDataFromDevice(QIODevice *device, qint64 maxBytes = 0);
294
295// ============================================================================
296// Format Detection (Thread-Local State)
297// ============================================================================
298
301QString lastDetectedFormatName();
302
305QString lastDetectedFilterName();
306
307} // namespace QGClibarchive
Shared type definitions for compression/archive operations.
std::function< void(int)> ProgressCallback
RAII wrapper for libarchive reader with automatic cleanup.
bool open(const QString &path, ReaderMode mode=ReaderMode::AllFormats)
bool isOpen() const
Check if archive is open.
struct archive * handle() const
Get the underlying archive handle.
struct archive * release()
Release ownership of archive handle (caller must free)
ArchiveReader & operator=(const ArchiveReader &)=delete
ArchiveReader(const ArchiveReader &)=delete
std::function< bool(const ArchiveEntry &entry)> EntryFilter
std::function< bool(qint64 bytesProcessed, qint64 totalBytes)> ProgressCallback
constexpr quint32 kDefaultFilePermissions
Default Unix permissions for extracted files (rw-r–r–)
QGCCompression::EntryFilter EntryFilter
ArchiveStats getArchiveStats(const QString &archivePath)
bool extractMultipleFiles(const QString &archivePath, const QStringList &fileNames, const QString &outputDirectoryPath)
QString lastDetectedFormatName()
bool extractWithFilter(const QString &archivePath, const QString &outputDirectoryPath, EntryFilter filter, ProgressCallback progress, qint64 maxBytes)
la_int64_t deviceSkipCallback(struct archive *, void *clientData, la_int64_t request)
QGCCompression::ProgressCallback ProgressCallback
QString lastDetectedFilterName()
ReaderMode
Mode for ArchiveReader format support.
@ AllFormats
Support all archive formats (ZIP, TAR, 7z, etc.)
@ RawFormat
Raw format for single-file decompression (.gz, .xz, etc.)
bool decompressSingleFile(const QString &inputPath, const QString &outputPath, ProgressCallback progress, qint64 maxBytes)
bool extractFromDevice(QIODevice *device, const QString &outputDirectoryPath, ProgressCallback progress, qint64 maxBytes)
QGCCompression::ArchiveEntry ArchiveEntry
QStringList listArchiveEntries(const QString &archivePath)
la_ssize_t deviceReadCallback(struct archive *, void *clientData, const void **buffer)
bool extractSingleFile(const QString &archivePath, const QString &fileName, const QString &outputPath)
bool openArchiveForReading(struct archive *a, const QString &filePath, QByteArray &resourceData)
QByteArray decompressDataFromDevice(QIODevice *device, qint64 maxBytes)
QList< ArchiveEntry > listArchiveEntriesDetailed(const QString &archivePath)
la_int64_t deviceSeekCallback(struct archive *, void *clientData, la_int64_t offset, int whence)
bool extractArchiveAtomic(const QString &archivePath, const QString &outputDirectoryPath, ProgressCallback progress, qint64 maxBytes)
QByteArray extractFileToMemory(const QString &archivePath, const QString &fileName)
QByteArray decompressDataFromMemory(const QByteArray &data, qint64 maxBytes)
ArchiveEntry toArchiveEntry(struct archive_entry *entry)
bool validateArchive(const QString &archivePath)
bool fileExistsInArchive(const QString &archivePath, const QString &fileName)
bool decompressFromDevice(QIODevice *device, const QString &outputPath, ProgressCallback progress, qint64 maxBytes)
bool extractAnyArchive(const QString &archivePath, const QString &outputDirectoryPath, ProgressCallback progress, qint64 maxBytes)
int deviceCloseCallback(struct archive *, void *)
QGCCompression::ArchiveStats ArchiveStats
QByteArray extractFileDataFromDevice(QIODevice *device, const QString &fileName)
bool extractByPattern(const QString &archivePath, const QStringList &patterns, const QString &outputDirectoryPath, QStringList *extractedFiles)
Metadata for a single entry in an archive.
Summary statistics for an archive.