/* * HostListPacket.cpp * * Copyright (C) 2008 Matthias Schiffer * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the * Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . */ #include "HostListPacket.h" #include #include namespace Mad { namespace Net { namespace Packets { void HostListPacket::assemblePacket() { std::string str; for(std::vector::iterator host = hostList.begin(); host != hostList.end(); ++host) str += host->getName() + "\n" + host->getIP() + "\n"; setLength(sizeof(uint16_t) + sizeof(HostData)*hostList.size() + str.length()); nHosts = (uint16_t*)rawData->data; hostData = (HostData*)(rawData->data + sizeof(uint16_t)); charData = (char*)(rawData->data + sizeof(uint16_t) + sizeof(HostData)*hostList.size()); std::memcpy(charData, str.c_str(), str.length()); *nHosts = htons(hostList.size()); for(size_t i = 0; i < hostList.size(); ++i) { hostData[i].state = htons((uint16_t)hostList[i].getState()); } } void HostListPacket::parsePacket() { hostList.clear(); if(getLength() < sizeof(uint16_t)) return; nHosts = (uint16_t*)rawData->data; hostList.resize(ntohs(*nHosts)); if(getLength() < sizeof(uint16_t) + sizeof(HostData)*hostList.size()) setLength(sizeof(uint16_t) + sizeof(HostData)*hostList.size()); nHosts = (uint16_t*)rawData->data; hostData = (HostData*)(rawData->data + sizeof(uint16_t)); charData = (char*)(rawData->data + sizeof(uint16_t) + sizeof(HostData)*hostList.size()); std::istringstream stream(std::string(charData, getLength() - (sizeof(uint16_t)+sizeof(HostData)*hostList.size()))); for(size_t i = 0; i < hostList.size(); ++i) { hostList[i].setState((Common::HostInfo::State)ntohs(hostData[i].state)); if(!stream.eof()) { std::string str; std::getline(stream, str); hostList[i].setName(str); std::getline(stream, str); hostList[i].setIP(str); } } } } } }