session rename: eventwait stream for live refresh, fix infinite loop
This commit is contained in:
parent
cd0f92e16d
commit
76f97c42eb
|
|
@ -38,6 +38,7 @@ Ollie9pClient::Ollie9pClient(QObject *parent)
|
|||
{
|
||||
refreshSessions();
|
||||
ensureRootDataLoaded();
|
||||
startEventStream();
|
||||
}
|
||||
|
||||
Ollie9pClient::~Ollie9pClient()
|
||||
|
|
@ -373,6 +374,13 @@ void Ollie9pClient::stopStreams()
|
|||
m_stateProc->deleteLater();
|
||||
m_stateProc = nullptr;
|
||||
}
|
||||
if (m_eventProc) {
|
||||
m_eventProc->disconnect();
|
||||
m_eventProc->kill();
|
||||
m_eventProc->waitForFinished(1000);
|
||||
m_eventProc->deleteLater();
|
||||
m_eventProc = nullptr;
|
||||
}
|
||||
}
|
||||
|
||||
void Ollie9pClient::onChatReadyRead()
|
||||
|
|
@ -408,6 +416,31 @@ void Ollie9pClient::onStateFinished(int, QProcess::ExitStatus)
|
|||
startStateStream();
|
||||
}
|
||||
|
||||
void Ollie9pClient::startEventStream()
|
||||
{
|
||||
if (m_eventProc) return;
|
||||
m_eventProc = new QProcess(this);
|
||||
connect(m_eventProc, &QProcess::readyReadStandardOutput, this, &Ollie9pClient::onEventReadyRead);
|
||||
connect(m_eventProc, QOverload<int, QProcess::ExitStatus>::of(&QProcess::finished),
|
||||
this, &Ollie9pClient::onEventFinished);
|
||||
m_eventProc->start(ninepBin(), {"-a", serverAddr(), "read", "session/eventwait"});
|
||||
}
|
||||
|
||||
void Ollie9pClient::onEventReadyRead()
|
||||
{
|
||||
// Consume the data to prevent readyRead from firing again
|
||||
m_eventProc->readAllStandardOutput();
|
||||
// Session index changed (create/delete/rename). Refresh.
|
||||
refreshSessions();
|
||||
}
|
||||
|
||||
void Ollie9pClient::onEventFinished(int, QProcess::ExitStatus)
|
||||
{
|
||||
m_eventProc->deleteLater();
|
||||
m_eventProc = nullptr;
|
||||
startEventStream();
|
||||
}
|
||||
|
||||
// --- Helpers ---
|
||||
|
||||
QString Ollie9pClient::agentPath() const
|
||||
|
|
|
|||
|
|
@ -84,12 +84,15 @@ signals:
|
|||
private slots:
|
||||
void onChatReadyRead();
|
||||
void onStateReadyRead();
|
||||
void onEventReadyRead();
|
||||
void onChatFinished(int exitCode, QProcess::ExitStatus status);
|
||||
void onStateFinished(int exitCode, QProcess::ExitStatus status);
|
||||
void onEventFinished(int exitCode, QProcess::ExitStatus status);
|
||||
|
||||
private:
|
||||
void startChatStream();
|
||||
void startStateStream();
|
||||
void startEventStream();
|
||||
void stopStreams();
|
||||
QString agentPath() const;
|
||||
QByteArray run9p(const QStringList &args);
|
||||
|
|
@ -111,6 +114,7 @@ private:
|
|||
|
||||
QProcess *m_chatProc = nullptr;
|
||||
QProcess *m_stateProc = nullptr;
|
||||
QProcess *m_eventProc = nullptr;
|
||||
};
|
||||
|
||||
#endif // OLLIE9PCLIENT_H
|
||||
|
|
|
|||
Reference in New Issue