diff options
Diffstat (limited to 'common/connectionbase.cpp')
m--------- | common | 0 | ||||
-rw-r--r-- | common/connectionbase.cpp | 229 |
2 files changed, 0 insertions, 229 deletions
diff --git a/common b/common new file mode 160000 +Subproject dd64a35c949738c2c321989d065e0754556823d diff --git a/common/connectionbase.cpp b/common/connectionbase.cpp deleted file mode 100644 index a0c5ab8..0000000 --- a/common/connectionbase.cpp +++ /dev/null @@ -1,229 +0,0 @@ -#include "connectionbase.h" - -#include <boost/serialization/vector.hpp> -#include <boost/serialization/string.hpp> -#include <boost/serialization/utility.hpp> -#include <boost/serialization/shared_ptr.hpp> -#include <boost/archive/binary_oarchive.hpp> -#include <boost/archive/binary_iarchive.hpp> - -#include <cstring> -#include <sstream> -#include <exception> -#include <stdexcept> - -#include <iostream> - -void ConnectionBase::start_recv() { - request_data(4); -} - -void ConnectionBase::got_data(uint8_t* data, std::size_t bytes) { - if(pending_size == 0) { - if(bytes != 4) { - error("Deserialization header error."); - } - - uint16_t* header = (uint16_t*)data; - - pending_type = (Message::Type)header[0]; - pending_size = (std::size_t)header[1]; - - if(pending_size) { - request_data(pending_size); - return; - } - - bytes = 0; - } - - if(bytes != pending_size) { - std::cout << "Bytes: " << bytes << " Pending size: " << pending_size << std::endl; - error("Deserialization attempted with incomplete data."); - // TODO: Calling got_data() with incomplete data should be allowed. - } - - pending_size = 0; - - try { - // Create Boost.Serialization archive of data. - std::istringstream is(std::string((char*)data, bytes)); - boost::archive::binary_iarchive ia(is); - - switch(pending_type) { - case Message::Types::Hello: { - Message::Hello::p m = make_shared<Message::Hello>(); - ia & m; - got_message(m); - } break; - - case Message::Types::Login: { - Message::Login::p m = make_shared<Message::Login>(); - ia & m; - got_message(m); - } break; - - case Message::Types::LoginResponse: { - Message::LoginResponse::p m = make_shared<Message::LoginResponse>(); - ia & m; - got_message(m); - } break; - - case Message::Types::LobbyStatus: { - Message::LobbyStatus::p m = make_shared<Message::LobbyStatus>(); - ia & m; - got_message(m); - } break; - - case Message::Types::LobbyAction: { - Message::LobbyAction::p m = make_shared<Message::LobbyAction>(); - ia & m; - got_message(m); - } break; - - case Message::Types::GameStart: { - Message::GameStart::p m = make_shared<Message::GameStart>(); - ia & m; - got_message(m); - } break; - - case Message::Types::Ready: { - Message::Ready::p m = make_shared<Message::Ready>(); - ia & m; - got_message(m); - } break; - - case Message::Types::RoundStart: { - Message::RoundStart::p m = make_shared<Message::RoundStart>(); - ia & m; - got_message(m); - } break; - - case Message::Types::RoundState: { - Message::RoundState::p m = make_shared<Message::RoundState>(); - ia & m; - got_message(m); - } break; - - case Message::Types::RoundAction: { - Message::RoundAction::p m = make_shared<Message::RoundAction>(); - ia & m; - got_message(m); - } break; - - case Message::Types::RoundEnd: { - Message::RoundEnd::p m = make_shared<Message::RoundEnd>(); - ia & m; - got_message(m); - } break; - - case Message::Types::GameEnd: { - Message::GameEnd::p m = make_shared<Message::GameEnd>(); - ia & m; - got_message(m); - } break; - - default: - throw std::runtime_error("Deserialization attempted on unknown message type."); - } - - } catch(std::exception& e) { - error(std::string("Deserialization failed: ") + e.what()); - } -} - -void ConnectionBase::send(const Message::p& msg) { - // Create Boost.Serialization archive. - std::ostringstream os; - boost::archive::binary_oarchive oa(os); - - switch(msg->type) { - case Message::Types::Hello: { - Message::Hello::p m = dynamic_pointer_cast<Message::Hello>(msg); - oa & m; - } break; - - case Message::Types::Login: { - Message::Login::p m = dynamic_pointer_cast<Message::Login>(msg); - oa & m; - } break; - - case Message::Types::LoginResponse: { - Message::LoginResponse::p m = dynamic_pointer_cast<Message::LoginResponse>(msg); - oa & m; - } break; - - case Message::Types::LobbyStatus: { - Message::LobbyStatus::p m = dynamic_pointer_cast<Message::LobbyStatus>(msg); - oa & m; - } break; - - case Message::Types::LobbyAction: { - Message::LobbyAction::p m = dynamic_pointer_cast<Message::LobbyAction>(msg); - oa & m; - } break; - - case Message::Types::GameStart: { - Message::GameStart::p m = dynamic_pointer_cast<Message::GameStart>(msg); - oa & m; - } break; - - case Message::Types::Ready: { - Message::Ready::p m = dynamic_pointer_cast<Message::Ready>(msg); - oa & m; - } break; - - case Message::Types::RoundStart: { - Message::RoundStart::p m = dynamic_pointer_cast<Message::RoundStart>(msg); - oa & m; - } break; - - case Message::Types::RoundState: { - Message::RoundState::p m = dynamic_pointer_cast<Message::RoundState>(msg); - oa & m; - } break; - - case Message::Types::RoundAction: { - Message::RoundAction::p m = dynamic_pointer_cast<Message::RoundAction>(msg); - oa & m; - } break; - - case Message::Types::RoundEnd: { - Message::RoundEnd::p m = dynamic_pointer_cast<Message::RoundEnd>(msg); - oa & m; - } break; - - case Message::Types::GameEnd: { - Message::GameEnd::p m = dynamic_pointer_cast<Message::GameEnd>(msg); - oa & m; - } break; - - default: - throw std::runtime_error("Serialization attempted on unknown message type."); - } - - // Extract data. - std::string s = os.str(); - - // Allocate buffer. - uint8_t* buf = new uint8_t[4 + s.size()]; - - // Write header. - uint16_t* header = (uint16_t*)buf; - header[0] = uint16_t(msg->type); - header[1] = uint16_t(s.size()); - - // Copy data. - memcpy(buf + 4, s.c_str(), s.size()); - - // Send buffer. - write_data(buf, 4 + s.size()); -} - -ConnectionBase::ConnectionBase() { - pending_size = 0; -} - -ConnectionBase::~ConnectionBase() { - std::cout << "Connection destroyed." << std::endl; -} |