/* * UserListPacket.cpp * * Copyright (C) 2009 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 "UserListPacket.h" #include #include namespace Mad { namespace Net { namespace Packets { void UserListPacket::assemblePacket() { std::string str; for(std::vector::iterator user = userList.begin(); user != userList.end(); ++user) str += user->getUsername() + "\n" + user->getFullName() + "\n"; setLength(sizeof(uint32_t) + sizeof(UserData)*userList.size() + str.length()); nUsers = (uint32_t*)rawData->data; userData = (UserData*)(rawData->data + sizeof(uint32_t)); charData = (char*)(rawData->data + sizeof(uint32_t) + sizeof(UserData)*userList.size()); std::memcpy(charData, str.c_str(), str.length()); *nUsers = htonl(userList.size()); for(size_t i = 0; i < userList.size(); ++i) { userData[i].uid = htonl((uint32_t)userList[i].getUid()); userData[i].gid = htonl((uint32_t)userList[i].getGid()); } } void UserListPacket::parsePacket() { userList.clear(); if(getLength() < sizeof(uint16_t)) return; nUsers = (uint32_t*)rawData->data; userList.resize(ntohl(*nUsers)); if(getLength() < sizeof(uint32_t) + sizeof(UserData)*userList.size()) setLength(sizeof(uint32_t) + sizeof(UserData)*userList.size()); nUsers = (uint32_t*)rawData->data; userData = (UserData*)(rawData->data + sizeof(uint32_t)); charData = (char*)(rawData->data + sizeof(uint32_t) + sizeof(UserData)*userList.size()); std::istringstream stream(std::string(charData, getLength() - (sizeof(uint32_t)+sizeof(UserData)*userList.size()))); for(size_t i = 0; i < userList.size(); ++i) { userList[i].setUid(ntohl(userData[i].uid)); userList[i].setGid(ntohl(userData[i].gid)); if(!stream.eof()) { std::string str; std::getline(stream, str); userList[i].setUsername(str); std::getline(stream, str); userList[i].setFullName(str); } } } } } }