|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#ifndef AGENT_H |
|
#define AGENT_H |
|
|
|
#include <windows.h> |
|
#include <stdint.h> |
|
|
|
#include <memory> |
|
#include <string> |
|
|
|
#include "DsrSender.h" |
|
#include "EventLoop.h" |
|
#include "Win32Console.h" |
|
|
|
class ConsoleInput; |
|
class NamedPipe; |
|
class ReadBuffer; |
|
class Scraper; |
|
class WriteBuffer; |
|
class Win32ConsoleBuffer; |
|
|
|
class Agent : public EventLoop, public DsrSender |
|
{ |
|
public: |
|
Agent(LPCWSTR controlPipeName, |
|
uint64_t agentFlags, |
|
int mouseMode, |
|
int initialCols, |
|
int initialRows); |
|
virtual ~Agent(); |
|
void sendDsr() override; |
|
|
|
private: |
|
NamedPipe &connectToControlPipe(LPCWSTR pipeName); |
|
NamedPipe &createDataServerPipe(bool write, const wchar_t *kind); |
|
|
|
private: |
|
void pollControlPipe(); |
|
void handlePacket(ReadBuffer &packet); |
|
void writePacket(WriteBuffer &packet); |
|
void handleStartProcessPacket(ReadBuffer &packet); |
|
void handleSetSizePacket(ReadBuffer &packet); |
|
void handleGetConsoleProcessListPacket(ReadBuffer &packet); |
|
void pollConinPipe(); |
|
|
|
protected: |
|
virtual void onPollTimeout() override; |
|
virtual void onPipeIo(NamedPipe &namedPipe) override; |
|
|
|
private: |
|
void autoClosePipesForShutdown(); |
|
std::unique_ptr<Win32ConsoleBuffer> openPrimaryBuffer(); |
|
void resizeWindow(int cols, int rows); |
|
void scrapeBuffers(); |
|
void syncConsoleTitle(); |
|
|
|
private: |
|
const bool m_useConerr; |
|
const bool m_plainMode; |
|
const int m_mouseMode; |
|
Win32Console m_console; |
|
std::unique_ptr<Scraper> m_primaryScraper; |
|
std::unique_ptr<Scraper> m_errorScraper; |
|
std::unique_ptr<Win32ConsoleBuffer> m_errorBuffer; |
|
NamedPipe *m_controlPipe = nullptr; |
|
NamedPipe *m_coninPipe = nullptr; |
|
NamedPipe *m_conoutPipe = nullptr; |
|
NamedPipe *m_conerrPipe = nullptr; |
|
bool m_autoShutdown = false; |
|
bool m_exitAfterShutdown = false; |
|
bool m_closingOutputPipes = false; |
|
std::unique_ptr<ConsoleInput> m_consoleInput; |
|
HANDLE m_childProcess = nullptr; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
std::wstring m_currentTitle = L" "; |
|
}; |
|
|
|
#endif |
|
|