1 #include "CommandService.hpp"
4 #include "CommandBuffer.hpp"
14 CommandService::CommandService(CLI &cli, unsigned short port)
17 pool.AddConnection(tcp::Socket(port), this);
18 cout << "listening on TCP port " << port << endl;
21 CommandService::~CommandService() {
26 void CommandService::Wait(int timeout) noexcept {
30 bool CommandService::Ready() noexcept {
34 void CommandService::Handle() {
38 void CommandService::Send() {
42 void CommandService::OnRecv(tcp::Socket &serv) {
43 for (tcp::Socket client = serv.Accept(); client; client = serv.Accept()) {
44 pool.AddConnection(move(client), new CommandBuffer(cli));
49 CommandBuffer::CommandBuffer(CLI &cli)
52 , read_buffer(1440, '\0')
57 CommandBuffer::~CommandBuffer() {
62 void CommandBuffer::Error(const string &msg) {
63 write_buffer += " ! ";
68 void CommandBuffer::Message(const string &msg) {
69 write_buffer += " > ";
74 void CommandBuffer::Broadcast(const string &msg) {
75 // TODO: broadcast should be an operation of the
76 // environment, not the singular context
77 write_buffer += " @ ";
83 void CommandBuffer::OnSend(tcp::Socket &sock) {
84 if (write_buffer.empty()) {
87 size_t len = sock.Send(write_buffer.data(), write_buffer.size());
88 write_buffer.erase(0, len);
91 void CommandBuffer::OnRecv(tcp::Socket &sock) {
92 size_t len = sock.Recv(&read_buffer[0], read_buffer.size() - head);
95 string::iterator begin = read_buffer.begin();
96 string::iterator end = begin + head;
97 string::iterator handled = begin;
99 string::iterator i = find(handled, end, '\n');
101 i = find(handled, end, '\n')
103 string line(handled, i);
104 cli.Execute(*this, line);
107 if (handled == end) {
110 } else if (handled != begin) {
111 // half a line remaining, move it to the start of the buffer
112 move(handled, end, begin);
113 head = distance(handled, end);
117 void CommandBuffer::OnRemove(tcp::Socket &) noexcept {