|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#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()); |
|
} |
|
} |
|
|