/* 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 . */ #ifndef __EQ2_DATABUFFER_ #define __EQ2_DATABUFFER_ #include #include "../common/types.h" #include "../common/EQPacket.h" #include "../common/EQ2_Common_Structs.h" #ifdef WORLD #include "../WorldServer/SpawnLists.h" #endif using namespace std; class DataBuffer{ public: bool changed; uchar* getData(){ return (uchar*)buffer.c_str(); } int32 getDataSize(){ return buffer.length(); } string* getDataString(){ return &buffer; } void CreateEQ2Color(EQ2_Color& color){ CreateEQ2Color(&color); } uchar* GetLoadBuffer(){ return load_buffer; } int32 GetLoadPos(){ return load_pos; } int32 GetLoadLen(){ return load_len; } void SetLoadPos(int32 new_pos){ load_pos = new_pos; } void CreateEQ2Color(EQ2_Color* color){ int8 rgb[3]; float* tmp = 0; for(int i=0;i<3;i++){ tmp = (float*)(load_buffer + load_pos); rgb[i] = (int8)((*tmp)*255); load_pos += sizeof(float); } color->red = rgb[0]; color->green = rgb[1]; color->blue = rgb[2]; } template void MakeEQ2_Int8(Type& output){ MakeEQ2_Int8(&output); } template void MakeEQ2_Int8(Type* output){ float* tmp = (float*)(load_buffer + load_pos); if(*tmp < 0) *tmp *= -1; sint8 result = (sint8)((*tmp)*100); memcpy(output, &result, sizeof(sint8)); load_pos += sizeof(float); } void InitializeGetData(){ get_buffer = (uchar*)buffer.c_str(); get_len = buffer.length(); get_pos = 0; } void InitializeLoadData(uchar* input, int32 size){ buffer = string((char*)input, size); load_buffer = (uchar*)buffer.c_str(); load_len = size; load_pos = 0; } template void LoadDataString(String& output){ LoadDataString(&output); } template void LoadDataString(String* output){ if((sizeof(output->size) + load_pos) <= load_len){ memcpy(&output->size, load_buffer + load_pos, sizeof(output->size)); load_pos += sizeof(output->size); } if((output->size + load_pos) <= load_len){ output->data = string((char*)(load_buffer + load_pos), output->size); load_pos += output->size; } } template void LoadData(Type& output){ LoadData(&output); } template void LoadData(Type* output, int32 array_size){ if(array_size<=1){ LoadData(output); } else{ for(int32 i=0;i void LoadData(Type* output){ if((sizeof(Type) + load_pos) <= load_len){ memcpy(output, load_buffer + load_pos, sizeof(Type)); load_pos += sizeof(Type); } } template void LoadData(Type& output, int32 array_size){ LoadData(&output, array_size); } void LoadSkip(int8 bytes){ load_pos += bytes; } template void LoadSkip(Type& skip){ LoadSkip(&skip); } template void LoadSkip(Type* skip){ load_pos += sizeof(Type); } template void GetData(Type* output){ if((sizeof(Type) + get_pos) <= get_len){ *output = (Type*)get_buffer; get_pos += sizeof(output); } } void AddZeros(int16 num){ int8* data = new int8[num]; memset(data, 0, num); AddData(*data); safe_delete_array(data); } template void StructAddData(Type input, int16 size, string* datastring){ if(datastring) datastring->append((char*)&input, size); else buffer.append((char*)&input, size); } template void StructAddData(Type input, int32 array_size, int16 size, string* datastring){ if(array_size>0){ for(int32 i=0;i void AddData(Type input, string* datastring = 0){ if(!datastring) datastring = &buffer; datastring->append((char*)&input, sizeof(input)); } template void AddData(Type input, int32 array_size, string* datastring = 0){ if(array_size>0){ for(int32 i=0;i void AddDataString(String* input, string* datastring = 0){ AddDataString(*input, datastring); } template void AddDataString(String input, string* datastring = 0){ input.size = input.data.length(); if(!datastring) datastring = &buffer; datastring->append((char*)&input.size, sizeof(input.size)); datastring->append(input.data); } void AddCharArray(char* array, string* datastring = 0){ if(!datastring) datastring = &buffer; datastring->append(array); } void AddCharArray(char* array, int16 size, string* datastring = 0){ if(!datastring) datastring = &buffer; datastring->append(array, size); } void AddData(string data, string* datastring = 0){ if(!datastring) datastring = &buffer; datastring->append(data); } void Clear() { buffer.clear(); } private: string buffer; uchar* get_buffer; uchar* load_buffer; int32 get_len; int32 get_pos; int32 load_len; int32 load_pos; }; #endif