Polyphase Game Engine
Loading...
Searching...
No Matches
TerminalSession.h
Go to the documentation of this file.
1#pragma once
2
3#if EDITOR
4
5#include "ITerminalProcess.h"
7
8#include <atomic>
9#include <memory>
10#include <mutex>
11#include <string>
12#include <thread>
13
21enum class TerminalSessionState
22{
23 Stopped,
24 Starting,
25 Running,
26 Stopping,
27 Error,
28};
29
30const char* TerminalSessionStateName(TerminalSessionState state);
31
39class TerminalSession
40{
41public:
42 TerminalSession();
43 ~TerminalSession();
44
46 void Tick();
47
49 bool Start();
50
52 void Stop();
53
55 void Restart();
56
58 void Clear();
59
61 bool SendCommand(const std::string& line);
62
68 bool SendRaw(const char* data, size_t len);
69
71 void ShutdownSync();
72
73 TerminalSessionState GetState() const { return mState.load(); }
74 int GetLastExitCode() const { return mLastExitCode; }
75 const std::string& GetExecutableLabel() const { return mExecutableLabel; }
76 const std::string& GetLastError() const { return mLastError; }
77 TerminalOutputBuffer& GetBuffer() { return mBuffer; }
78
80 bool IsTty() const { return mProcess && mProcess->IsTty(); }
81
82private:
83 void EmitSystem(const std::string& msg);
84 void OnProcessOutput(TerminalEntryKind kind, std::string text);
85 void OnProcessExit(int exitCode);
86 void RunStopSequence(int timeoutMs);
87 void TransitionTo(TerminalSessionState newState);
88
89 std::unique_ptr<ITerminalProcess> mProcess;
90 TerminalOutputBuffer mBuffer;
91
92 std::atomic<TerminalSessionState> mState{ TerminalSessionState::Stopped };
93 std::atomic<bool> mPendingExit{ false };
94 std::atomic<bool> mWantsRestartAfterStop{ false };
95
96 std::string mLastError;
97 std::string mExecutableLabel;
98 int mLastExitCode = 0;
99
100 std::thread mStopThread;
101 std::mutex mStopThreadMutex;
102};
103
104#endif
void Tick()
Definition HttpClient.cpp:202