/* EQ2Emulator: Everquest II Server Emulator Copyright (C) 2007 EQ2EMulator Development Team (http://www.eq2emulator.net) This file is part of EQ2Emulator. EQ2Emulator 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. EQ2Emulator 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 EQ2Emulator. If not, see . */ #include #include #include #include "../../common/types.h" #include "IRCMessage.h" IRCMessage::IRCMessage(const char *message, ...) { int n, size = 512; va_list ap; len = 0; serialized = false; while (true) { //allocate our buffer this->message = new char[size]; //print the format into the buffer va_start(ap, message); n = vsnprintf(this->message, size, message, ap); va_end(ap); //did we write what we needed to? if (n > -1 && n < size) break; #ifdef _WIN32 size *= 2; //double the buffer #else if (n > -1) size = n + 1; //we know exactly how many bytes to write else size *= 2; //double the buffer #endif safe_delete_array(this->message); } } IRCMessage::~IRCMessage() { if (message != NULL) safe_delete_array(message); } const char * IRCMessage::Serialize() { char *buf; if (message == NULL || serialized) return message; //allocate enough room for the /r/n, and of course the null len = strlen(message) + 3; buf = new char[len]; snprintf(buf, len, "%s\r\n", message); //now copy back into our true buffer safe_delete_array(message); message = new char[len]; strncpy(message, buf, len); //and finally free our temporary buffer safe_delete_array(buf); //we don't want to do this process again if for some reason Serialize() is called again serialized = true; //we don't want to include the trailing null in the length len--; return message; }