1
0

Connection.cpp 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. #include "Connection.h"
  2. #include <functional>
  3. #include <sstream>
  4. namespace MailServer {
  5. Connection::Connection(asio::io_service& ioService, const Util::Context& context) :
  6. m_ioService(ioService),
  7. m_socket(ioService),
  8. m_protocol(context)
  9. {
  10. }
  11. asio::ip::tcp::socket& Connection::Socket()
  12. {
  13. return m_socket;
  14. }
  15. void Connection::Start()
  16. {
  17. StartWrite(m_protocol.OpenConnection(m_socket.remote_endpoint().address().to_string()).second);
  18. }
  19. void Connection::StartRead()
  20. {
  21. m_socket.async_read_some(asio::buffer(m_data), std::bind(&Connection::HandleRead, this, std::placeholders::_1, std::placeholders::_2));
  22. }
  23. void Connection::HandleRead(const asio::error_code& ec, std::size_t length)
  24. {
  25. if (!ec)
  26. {
  27. Protocol::Protocol::Result result = m_protocol.ProcessMessage(std::string(m_data.begin(), m_data.begin() + length));
  28. if (result.second.size() > 0)
  29. StartWrite(result.second);
  30. else
  31. StartRead();
  32. if (result.first == Protocol::Protocol::State::Disconnected)
  33. m_socket.close();
  34. }
  35. }
  36. void Connection::StartWrite(const std::string& message)
  37. {
  38. std::copy(message.begin(), message.end(), m_data.data());
  39. size_t length = message.size() + 1;
  40. m_data[message.size()] = '\n';
  41. asio::async_write(m_socket, asio::buffer(m_data, length), std::bind(&Connection::HandleWrite, this, std::placeholders::_1));
  42. }
  43. void Connection::HandleWrite(const asio::error_code& ec)
  44. {
  45. if (!ec)
  46. StartRead();
  47. }
  48. } // namespace MailServer