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/QLoggingCategory>
13#include <QtCore/QString>
14#include <QtCore/QStringList>
15
16#include <archive.h>
17
18Q_DECLARE_LOGGING_CATEGORY(QGClibarchiveLog)
19
20namespace QGClibarchive {
21
22// ============================================================================
23// Types (re-export from QGCCompression for internal use)
24// ============================================================================
25
30
32
33// ============================================================================
34// Archive Reader Mode
35// ============================================================================
36
38enum class ReaderMode {
41};
42
43// ============================================================================
44// RAII Archive Reader
45// ============================================================================
46
49public:
50 ArchiveReader() = default;
52
53 ArchiveReader(const ArchiveReader&) = delete;
55
60 bool open(const QString &path, ReaderMode mode = ReaderMode::AllFormats);
61
67 bool open(QIODevice *device, ReaderMode mode = ReaderMode::AllFormats);
68
70 struct archive* handle() const { return _archive; }
71
73 struct archive* release() { auto *a = _archive; _archive = nullptr; return a; }
74
76 bool isOpen() const { return _archive != nullptr; }
77
80 qint64 dataSize() const;
81
84 QString formatName() const;
85
88 QString filterName() const;
89
90private:
91 struct archive *_archive = nullptr;
92 QString _filePath; // Stored path for size queries
93 QByteArray _resourceData; // Holds data for Qt resources
94 QIODevice *_device = nullptr; // Device for streaming reads
95};
96
97// ============================================================================
98// QIODevice Streaming Callbacks
99// ============================================================================
100
105la_ssize_t deviceReadCallback(struct archive *a, void *clientData, const void **buffer);
106
111la_int64_t deviceSkipCallback(struct archive *a, void *clientData, la_int64_t request);
112
116int deviceCloseCallback(struct archive *a, void *clientData);
117
123la_int64_t deviceSeekCallback(struct archive *a, void *clientData, la_int64_t offset, int whence);
124
125// ============================================================================
126// Utility Functions
127// ============================================================================
128
132ArchiveEntry toArchiveEntry(struct archive_entry *entry);
133
134// ============================================================================
135// Low-level Operations
136// ============================================================================
137
144bool openArchiveForReading(struct archive *a, const QString &filePath, QByteArray &resourceData);
145
153bool extractAnyArchive(const QString &archivePath, const QString &outputDirectoryPath,
154 ProgressCallback progress = nullptr,
155 qint64 maxBytes = 0);
156
166bool extractArchiveAtomic(const QString &archivePath, const QString &outputDirectoryPath,
167 ProgressCallback progress = nullptr,
168 qint64 maxBytes = 0);
169
175bool extractSingleFile(const QString &archivePath, const QString &fileName,
176 const QString &outputPath);
177
182QByteArray extractFileToMemory(const QString &archivePath, const QString &fileName);
183
189bool extractMultipleFiles(const QString &archivePath, const QStringList &fileNames,
190 const QString &outputDirectoryPath);
191
199bool extractByPattern(const QString &archivePath, const QStringList &patterns,
200 const QString &outputDirectoryPath,
201 QStringList *extractedFiles = nullptr);
202
206bool validateArchive(const QString &archivePath);
207
212bool fileExistsInArchive(const QString &archivePath, const QString &fileName);
213
217QStringList listArchiveEntries(const QString &archivePath);
218
222QList<ArchiveEntry> listArchiveEntriesDetailed(const QString &archivePath);
223
227ArchiveStats getArchiveStats(const QString &archivePath);
228
236bool extractWithFilter(const QString &archivePath, const QString &outputDirectoryPath,
237 EntryFilter filter,
238 ProgressCallback progress = nullptr,
239 qint64 maxBytes = 0);
240
241// ============================================================================
242// Single-File Decompression
243// ============================================================================
244
251bool decompressSingleFile(const QString &inputPath, const QString &outputPath,
252 ProgressCallback progress = nullptr,
253 qint64 maxBytes = 0);
254
259QByteArray decompressDataFromMemory(const QByteArray &data, qint64 maxBytes = 0);
260
261// ============================================================================
262// QIODevice-based Operations (streaming)
263// ============================================================================
264
271bool extractFromDevice(QIODevice *device, const QString &outputDirectoryPath,
272 ProgressCallback progress = nullptr,
273 qint64 maxBytes = 0);
274
279QByteArray extractFileDataFromDevice(QIODevice *device, const QString &fileName);
280
287bool decompressFromDevice(QIODevice *device, const QString &outputPath,
288 ProgressCallback progress = nullptr,
289 qint64 maxBytes = 0);
290
295QByteArray decompressDataFromDevice(QIODevice *device, qint64 maxBytes = 0);
296
297// ============================================================================
298// Format Detection (Thread-Local State)
299// ============================================================================
300
303QString lastDetectedFormatName();
304
307QString lastDetectedFilterName();
308
309} // namespace QGClibarchive
Q_DECLARE_LOGGING_CATEGORY(AndroidSerialLog)
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.