aboutsummaryrefslogtreecommitdiffstats
path: root/src/mailsync.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/mailsync.h')
-rw-r--r--src/mailsync.h44
1 files changed, 44 insertions, 0 deletions
diff --git a/src/mailsync.h b/src/mailsync.h
new file mode 100644
index 0000000..af4acbc
--- /dev/null
+++ b/src/mailsync.h
@@ -0,0 +1,44 @@
+#pragma once
+
+#include <QObject>
+#include <QProcess>
+#include <QString>
+
+/// Runs the configured external sync command.
+///
+/// qtmaildir deliberately does not implement sync itself. The existing script
+/// holds a flock that is the shared mutex between the user's cron sync, which
+/// runs every 10 minutes, and any manual sync; running the script joins that
+/// mutex, whereas a built-in implementation would sit outside it and could run
+/// mbsync concurrently with cron, corrupting Maildir UID state.
+class MailSync : public QObject
+{
+ Q_OBJECT
+public:
+ explicit MailSync(const QString &command, QObject *parent = nullptr);
+
+ /// False when no command is configured; the UI disables its Sync button.
+ bool isAvailable() const { return !m_command.isEmpty(); }
+ bool isRunning() const;
+
+ /// Returns false if unavailable or already running. A true return means the
+ /// process was handed to the event loop, not that it launched successfully:
+ /// a missing binary surfaces asynchronously through finished(false, ...).
+ bool start();
+
+ QString log() const { return m_log; }
+
+signals:
+ void started();
+ void outputReceived(const QString &chunk);
+ void finished(bool success, int exitCode);
+
+private:
+ void handleReadyRead();
+ void handleFinished(int exitCode, QProcess::ExitStatus status);
+ void handleError(QProcess::ProcessError error);
+
+ QString m_command;
+ QProcess m_process;
+ QString m_log;
+};