| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| |
|
| | #include "AgentCreateDesktop.h" |
| |
|
| | #include "../shared/BackgroundDesktop.h" |
| | #include "../shared/Buffer.h" |
| | #include "../shared/DebugClient.h" |
| | #include "../shared/StringUtil.h" |
| |
|
| | #include "EventLoop.h" |
| | #include "NamedPipe.h" |
| |
|
| | namespace { |
| |
|
| | static inline WriteBuffer newPacket() { |
| | WriteBuffer packet; |
| | packet.putRawValue<uint64_t>(0); |
| | return packet; |
| | } |
| |
|
| | class CreateDesktopLoop : public EventLoop { |
| | public: |
| | CreateDesktopLoop(LPCWSTR controlPipeName); |
| |
|
| | protected: |
| | virtual void onPipeIo(NamedPipe &namedPipe) override; |
| |
|
| | private: |
| | void writePacket(WriteBuffer &packet); |
| |
|
| | BackgroundDesktop m_desktop; |
| | NamedPipe &m_pipe; |
| | }; |
| |
|
| | CreateDesktopLoop::CreateDesktopLoop(LPCWSTR controlPipeName) : |
| | m_pipe(createNamedPipe()) { |
| | m_pipe.connectToServer(controlPipeName, NamedPipe::OpenMode::Duplex); |
| | auto packet = newPacket(); |
| | packet.putWString(m_desktop.desktopName()); |
| | writePacket(packet); |
| | } |
| |
|
| | void CreateDesktopLoop::writePacket(WriteBuffer &packet) { |
| | const auto &bytes = packet.buf(); |
| | packet.replaceRawValue<uint64_t>(0, bytes.size()); |
| | m_pipe.write(bytes.data(), bytes.size()); |
| | } |
| |
|
| | void CreateDesktopLoop::onPipeIo(NamedPipe &namedPipe) { |
| | if (m_pipe.isClosed()) { |
| | shutdown(); |
| | } |
| | } |
| |
|
| | } |
| |
|
| | void handleCreateDesktop(LPCWSTR controlPipeName) { |
| | try { |
| | CreateDesktopLoop loop(controlPipeName); |
| | loop.run(); |
| | trace("Agent exiting..."); |
| | } catch (const WinptyException &e) { |
| | trace("handleCreateDesktop: internal error: %s", |
| | utf8FromWide(e.what()).c_str()); |
| | } |
| | } |
| |
|