/* net/netclient.cc This file is part of the Osirion project and is distributed under the terms of the GNU General Public License version 2 */ #include #include #include "sys/sys.h" #include "net/net.h" #include "core/netclient.h" namespace core { NetClient::NetClient(int clientfd, std::string host, int port) : net::TCPClient(clientfd), client_host(host) { std::ostringstream osstream; //osstream << "host << ":" << port; osstream << "Player" << clientfd; client_player.player_name = osstream.str(); client_player.player_id = (unsigned int) clientfd; client_host = host; client_port = port; } NetClient::~NetClient() { } std::string NetClient::host() const { return client_host; } int NetClient::port() const { return client_port; } Player *NetClient::player() { return &client_player; } bool NetClient::has_messages() const { return (recvq.size() > 0 ); } void NetClient::retreive(std::string & message) { if (recvq.size() > 0 ) { message.assign(recvq.front()); recvq.pop_front(); } else { message.clear(); } } // receive data and decode it into lines void NetClient::receive() { std::string datablock; net::TCPClient::receive(datablock); while(datablock.size() > 0 ) { // scan the datablock for enters if (datablock[0] == '\n' || datablock[0] == '\r') { // TODO detect "begin binary block" message for zlib compression if (messageblock.size() > 0 ) { recvq.push_back(messageblock); messageblock.clear(); } } else { if (messageblock.size() < net::FRAMESIZE) { messageblock.append(datablock.substr(0,1)); } else { con_warn << "NetClient " << fd() << ": message block overflow" << std::endl; messageblock.clear(); } } datablock.erase(0,1); } datablock.clear(); } }