/* * FSInfoPacket.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 "FSInfoPacket.h" #include #include namespace Mad { namespace Net { namespace Packets { void FSInfoPacket::assemblePacket() { std::string str; for(std::vector::iterator fs = fsList.begin(); fs != fsList.end(); ++fs) str += fs->fsName + "\n" + fs->mountedOn + "\n"; setLength(sizeof(uint16_t) + sizeof(FSData)*fsList.size() + str.length()); nFS = (uint16_t*)rawData->data; fsData = (FSData*)(rawData->data + sizeof(uint16_t)); charData = (char*)(rawData->data + sizeof(uint16_t) + sizeof(FSData)*fsList.size()); std::memcpy(charData, str.c_str(), str.length()); *nFS = htons(fsList.size()); for(size_t i = 0; i < fsList.size(); ++i) { fsData[i].total = htonll(fsList[i].total); fsData[i].used = htonll(fsList[i].used); fsData[i].available = htonll(fsList[i].available); } } void FSInfoPacket::parsePacket() { fsList.clear(); if(getLength() < sizeof(uint16_t)) return; nFS = (uint16_t*)rawData->data; fsList.resize(ntohs(*nFS)); if(getLength() < sizeof(uint16_t) + sizeof(FSData)*fsList.size()) setLength(sizeof(uint16_t) + sizeof(FSData)*fsList.size()); nFS = (uint16_t*)rawData->data; fsData = (FSData*)(rawData->data + sizeof(uint16_t)); charData = (char*)(rawData->data + sizeof(uint16_t) + sizeof(FSData)*fsList.size()); std::istringstream stream(std::string(charData, getLength() - (sizeof(uint16_t)+sizeof(FSData)*fsList.size()))); for(size_t i = 0; i < fsList.size(); ++i) { fsList[i].total = ntohll(fsData[i].total); fsList[i].used = ntohll(fsData[i].used); fsList[i].available = ntohll(fsData[i].available); if(!stream.eof()) { std::string str; std::getline(stream, str); fsList[i].fsName = str; std::getline(stream, str); fsList[i].mountedOn = str; } } } } } }