62 lines
1.5 KiB
C++
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
|