This repository has been archived on 2026-08-16. You can view files and clone it, but cannot push or open issues or pull requests.
ollie-kde/gui/ninepconnection.h

62 lines
1.5 KiB
C++

#ifndef NINEPCONNECTION_H
#define NINEPCONNECTION_H
#include <QObject>
#include <QProcess>
#include <QTimer>
#include <QStringList>
/**
* NinePConnection - Resilient 9P subprocess connection.
*
* State machine with explicit events and transition table.
*/
class NinePConnection : public QObject
{
Q_OBJECT
public:
enum State { Disconnected, Connecting, Connected, RetryWait };
Q_ENUM(State)
enum Event { EvStart, EvStop, EvOpenMarker, EvExitOk, EvExitFail, EvRetryTimer };
Q_ENUM(Event)
explicit NinePConnection(QObject *parent = nullptr);
~NinePConnection() override;
void start(const QString &program, const QStringList &args, int retryMs = 4000, int maxRetries = 0);
void stop();
State state() const { return m_state; }
signals:
void connected();
void disconnected();
void readyRead(const QByteArray &data);
void stateChanged(State state);
private slots:
void onStdout();
void onStderr();
void onFinished(int exitCode, QProcess::ExitStatus status);
private:
void dispatch(Event ev);
void enter(State state);
void spawnProcess();
void killProcess();
void scheduleRetry();
QProcess *m_process = nullptr;
QTimer m_retryTimer;
QString m_program;
QStringList m_args;
QByteArray m_stderr;
State m_state = Disconnected;
int m_retryMs = 4000;
int m_maxRetries = 0;
int m_retryCount = 0;
bool m_openMarkerSeen = false;
};
#endif // NINEPCONNECTION_H