QGroundControl
Ground Control Station for MAVLink Drones
Loading...
Searching...
No Matches
QGCArchiveWatcher.h
Go to the documentation of this file.
1#pragma once
2
5
6#include "QGCFileWatcher.h"
7#include "QGCCompression.h"
8
9#include <QtCore/QObject>
10#include <QtCore/QSet>
11#include <QtCore/QString>
12
14
34class QGCArchiveWatcher : public QObject
35{
36 Q_OBJECT
37 Q_DISABLE_COPY_MOVE(QGCArchiveWatcher)
38
39
40 Q_PROPERTY(bool autoDecompress READ autoDecompress WRITE setAutoDecompress NOTIFY autoDecompressChanged FINAL)
41
42
43 Q_PROPERTY(bool extracting READ isExtracting NOTIFY extractingChanged FINAL)
44
45
46 Q_PROPERTY(qreal progress READ progress NOTIFY progressChanged FINAL)
47
48
49 Q_PROPERTY(QString outputDirectory READ outputDirectory WRITE setOutputDirectory
50 NOTIFY outputDirectoryChanged FINAL)
51
52public:
54 enum class FilterMode {
55 Archives,
57 Both
58 };
59 Q_ENUM(FilterMode)
60
61 explicit QGCArchiveWatcher(QObject *parent = nullptr);
62 ~QGCArchiveWatcher() override;
63
64 // ========================================================================
65 // Configuration
66 // ========================================================================
67
70 void setFilterMode(FilterMode mode);
71 FilterMode filterMode() const { return _filterMode; }
72
75 void setAutoDecompress(bool enable);
76 bool autoDecompress() const { return _autoDecompress; }
77
80 void setOutputDirectory(const QString &directory);
81 QString outputDirectory() const { return _outputDirectory; }
82
85 void setRemoveAfterExtraction(bool remove);
86 bool removeAfterExtraction() const { return _removeAfterExtraction; }
87
90 void setDebounceDelay(int milliseconds);
91 int debounceDelay() const;
92
93 // ========================================================================
94 // Directory Watching
95 // ========================================================================
96
100 bool watchDirectory(const QString &directoryPath);
101
105 bool unwatchDirectory(const QString &directoryPath);
106
109 QStringList watchedDirectories() const;
110
112 void clear();
113
114 // ========================================================================
115 // Status
116 // ========================================================================
117
119 bool isExtracting() const { return _extracting; }
120
122 qreal progress() const { return _progress; }
123
124 // ========================================================================
125 // Manual Operations
126 // ========================================================================
127
131 QStringList scanDirectory(const QString &directoryPath) const;
132
134 void cancelExtraction();
135
136signals:
140 void archiveDetected(const QString &archivePath, QGCCompression::Format format);
141
147 void extractionComplete(const QString &archivePath, const QString &outputPath,
148 bool success, const QString &errorString);
149
152 void extractingChanged(bool extracting);
154 void outputDirectoryChanged(const QString &directory);
155
156private slots:
157 void _onDirectoryChanged(const QString &path);
158 void _onExtractionProgress(qreal progress);
159 void _onExtractionFinished(bool success);
160
161private:
162 bool _isWatchedFormat(const QString &filePath) const;
163 void _processNewFile(const QString &filePath);
164 void _startExtraction(const QString &archivePath);
165 void _setExtracting(bool extracting);
166 void _setProgress(qreal progress);
167
168 QGCFileWatcher *_fileWatcher = nullptr;
169 QGCCompressionJob *_extractionJob = nullptr;
170
171 // Configuration
172 FilterMode _filterMode = FilterMode::Both;
173 bool _autoDecompress = false;
174 bool _removeAfterExtraction = false;
175 QString _outputDirectory;
176
177 // State
178 bool _extracting = false;
179 qreal _progress = 0.0;
180
181 // Track files to avoid duplicate processing
182 QHash<QString, QSet<QString>> _knownFiles; // directory -> known files
183
184 // Pending extractions queue
185 QStringList _pendingExtractions;
186 QString _currentArchive;
187 bool _cancelPending = false;
188};
QString errorString
Wrapper around QFileSystemWatcher with callback-based API.
Watches directories for new archive files and optionally auto-decompresses them.
void setRemoveAfterExtraction(bool remove)
QStringList watchedDirectories() const
QStringList scanDirectory(const QString &directoryPath) const
qreal progress() const
Get current extraction progress.
void setOutputDirectory(const QString &directory)
void cancelExtraction()
Cancel current extraction.
void autoDecompressChanged(bool autoDecompress)
Property change signals.
void setFilterMode(FilterMode mode)
void setDebounceDelay(int milliseconds)
bool watchDirectory(const QString &directoryPath)
bool unwatchDirectory(const QString &directoryPath)
bool removeAfterExtraction() const
QString outputDirectory() const
bool isExtracting() const
Check if extraction is in progress.
bool autoDecompress() const
void progressChanged(qreal progress)
void setAutoDecompress(bool enable)
FilterMode filterMode() const
FilterMode
Whether auto-decompression is enabled.
@ Both
Watch for both archives and compressed files.
@ Archives
Watch for archive files (.zip, .tar, .tar.gz, .7z)
@ Compressed
Watch for single-file compressed (.gz, .xz, .zst, .bz2, .lz4)
void extractionComplete(const QString &archivePath, const QString &outputPath, bool success, const QString &errorString)
void outputDirectoryChanged(const QString &directory)
void clear()
Stop watching all directories.
~QGCArchiveWatcher() override
void extractingChanged(bool extracting)
void archiveDetected(const QString &archivePath, QGCCompression::Format format)
QObject wrapper for compression operations with progress signals.
Callback-based file/directory watcher with debouncing support.
Format
Archive and compression format types (for decompression)