(se)SerializeString: Include max length in the name

This commit clarifies the maximal length of the serialized strings.
It will avoid accidental use of serializeString() when a larger string can be expected.

Removes unused Wide String serialization functions
master
SmallJoker 2020-09-20 13:12:55 +02:00 committed by Loïc Blot
parent ca5c2dbefa
commit 947466ab28
23 changed files with 168 additions and 223 deletions

View File

@ -371,7 +371,7 @@ void GenericCAO::processInitData(const std::string &data)
}
// PROTOCOL_VERSION >= 37
m_name = deSerializeString(is);
m_name = deSerializeString16(is);
m_is_player = readU8(is);
m_id = readU16(is);
m_position = readV3F32(is);
@ -381,7 +381,7 @@ void GenericCAO::processInitData(const std::string &data)
const u8 num_messages = readU8(is);
for (int i = 0; i < num_messages; i++) {
std::string message = deSerializeLongString(is);
std::string message = deSerializeString32(is);
processMessage(message);
}
@ -1657,7 +1657,7 @@ void GenericCAO::processMessage(const std::string &data)
rot_translator.update(m_rotation, false, update_interval);
updateNodePos();
} else if (cmd == AO_CMD_SET_TEXTURE_MOD) {
std::string mod = deSerializeString(is);
std::string mod = deSerializeString16(is);
// immediately reset a engine issued texture modifier if a mod sends a different one
if (m_reset_textures_timer > 0) {
@ -1735,7 +1735,7 @@ void GenericCAO::processMessage(const std::string &data)
m_animation_speed = readF32(is);
updateAnimationSpeed();
} else if (cmd == AO_CMD_SET_BONE_POSITION) {
std::string bone = deSerializeString(is);
std::string bone = deSerializeString16(is);
v3f position = readV3F32(is);
v3f rotation = readV3F32(is);
m_bone_position[bone] = core::vector2d<v3f>(position, rotation);
@ -1743,7 +1743,7 @@ void GenericCAO::processMessage(const std::string &data)
// updateBonePosition(); now called every step
} else if (cmd == AO_CMD_ATTACH_TO) {
u16 parent_id = readS16(is);
std::string bone = deSerializeString(is);
std::string bone = deSerializeString16(is);
v3f position = readV3F32(is);
v3f rotation = readV3F32(is);
@ -1793,7 +1793,7 @@ void GenericCAO::processMessage(const std::string &data)
int armor_groups_size = readU16(is);
for(int i=0; i<armor_groups_size; i++)
{
std::string name = deSerializeString(is);
std::string name = deSerializeString16(is);
int rating = readS16(is);
m_armor_groups[name] = rating;
}

View File

@ -43,26 +43,26 @@ static bool content_nodemeta_deserialize_legacy_body(
if(id == NODEMETA_GENERIC) // GenericNodeMetadata (0.4-dev)
{
meta->getInventory()->deSerialize(is);
deSerializeLongString(is); // m_text
deSerializeString(is); // m_owner
deSerializeString32(is); // m_text
deSerializeString16(is); // m_owner
meta->setString("infotext",deSerializeString(is));
meta->setString("formspec",deSerializeString(is));
meta->setString("infotext",deSerializeString16(is));
meta->setString("formspec",deSerializeString16(is));
readU8(is); // m_allow_text_input
readU8(is); // m_allow_removal
readU8(is); // m_enforce_owner
int num_vars = readU32(is);
for(int i=0; i<num_vars; i++){
std::string name = deSerializeString(is);
std::string var = deSerializeLongString(is);
std::string name = deSerializeString16(is);
std::string var = deSerializeString32(is);
meta->setString(name, var);
}
return false;
}
else if(id == NODEMETA_SIGN) // SignNodeMetadata
{
meta->setString("text", deSerializeString(is));
meta->setString("text", deSerializeString16(is));
//meta->setString("infotext","\"${text}\"");
meta->setString("infotext",
std::string("\"") + meta->getString("text") + "\"");
@ -87,7 +87,7 @@ static bool content_nodemeta_deserialize_legacy_body(
}
else if(id == NODEMETA_LOCKABLE_CHEST) // LockingChestNodeMetadata
{
meta->setString("owner", deSerializeString(is));
meta->setString("owner", deSerializeString16(is));
meta->getInventory()->deSerialize(is);
// Rename inventory list "0" to "main"
@ -138,7 +138,7 @@ static bool content_nodemeta_deserialize_legacy_meta(
s16 id = readS16(is);
// Read data
std::string data = deSerializeString(is);
std::string data = deSerializeString16(is);
std::istringstream tmp_is(data, std::ios::binary);
return content_nodemeta_deserialize_legacy_body(tmp_is, id, meta);
}

View File

@ -145,8 +145,8 @@ void PlayerDatabaseLevelDB::savePlayer(RemotePlayer *player)
StringMap stringvars = sao->getMeta().getStrings();
writeU32(os, stringvars.size());
for (const auto &it : stringvars) {
os << serializeString(it.first);
os << serializeLongString(it.second);
os << serializeString16(it.first);
os << serializeString32(it.second);
}
player->inventory.serialize(os);
@ -183,8 +183,8 @@ bool PlayerDatabaseLevelDB::loadPlayer(RemotePlayer *player, PlayerSAO *sao)
u32 attribute_count = readU32(is);
for (u32 i = 0; i < attribute_count; i++) {
std::string name = deSerializeString(is);
std::string value = deSerializeLongString(is);
std::string name = deSerializeString16(is);
std::string value = deSerializeString32(is);
sao->getMeta().setString(name, value);
}
sao->getMeta().setModified(false);
@ -247,13 +247,13 @@ bool AuthDatabaseLevelDB::getAuth(const std::string &name, AuthEntry &res)
res.id = 1;
res.name = name;
res.password = deSerializeString(is);
res.password = deSerializeString16(is);
u16 privilege_count = readU16(is);
res.privileges.clear();
res.privileges.reserve(privilege_count);
for (u16 i = 0; i < privilege_count; i++) {
res.privileges.push_back(deSerializeString(is));
res.privileges.push_back(deSerializeString16(is));
}
res.last_login = readS64(is);
@ -264,14 +264,14 @@ bool AuthDatabaseLevelDB::saveAuth(const AuthEntry &authEntry)
{
std::ostringstream os;
writeU8(os, 1);
os << serializeString(authEntry.password);
os << serializeString16(authEntry.password);
size_t privilege_count = authEntry.privileges.size();
FATAL_ERROR_IF(privilege_count > U16_MAX,
"Unsupported number of privileges");
writeU16(os, privilege_count);
for (const std::string &privilege : authEntry.privileges) {
os << serializeString(privilege);
os << serializeString16(privilege);
}
writeS64(os, authEntry.last_login);

View File

@ -128,10 +128,10 @@ void ItemDefinition::serialize(std::ostream &os, u16 protocol_version) const
u8 version = 6;
writeU8(os, version);
writeU8(os, type);
os << serializeString(name);
os << serializeString(description);
os << serializeString(inventory_image);
os << serializeString(wield_image);
os << serializeString16(name);
os << serializeString16(description);
os << serializeString16(inventory_image);
os << serializeString16(wield_image);
writeV3F32(os, wield_scale);
writeS16(os, stack_max);
writeU8(os, usable);
@ -143,25 +143,25 @@ void ItemDefinition::serialize(std::ostream &os, u16 protocol_version) const
tool_capabilities->serialize(tmp_os, protocol_version);
tool_capabilities_s = tmp_os.str();
}
os << serializeString(tool_capabilities_s);
os << serializeString16(tool_capabilities_s);
writeU16(os, groups.size());
for (const auto &group : groups) {
os << serializeString(group.first);
os << serializeString16(group.first);
writeS16(os, group.second);
}
os << serializeString(node_placement_prediction);
os << serializeString16(node_placement_prediction);
// Version from ContentFeatures::serialize to keep in sync
sound_place.serialize(os, CONTENTFEATURES_VERSION);
sound_place_failed.serialize(os, CONTENTFEATURES_VERSION);
writeF32(os, range);
os << serializeString(palette_image);
os << serializeString16(palette_image);
writeARGB8(os, color);
os << serializeString(inventory_overlay);
os << serializeString(wield_overlay);
os << serializeString16(inventory_overlay);
os << serializeString16(wield_overlay);
}
void ItemDefinition::deSerialize(std::istream &is)
@ -175,16 +175,16 @@ void ItemDefinition::deSerialize(std::istream &is)
throw SerializationError("unsupported ItemDefinition version");
type = (enum ItemType)readU8(is);
name = deSerializeString(is);
description = deSerializeString(is);
inventory_image = deSerializeString(is);
wield_image = deSerializeString(is);
name = deSerializeString16(is);
description = deSerializeString16(is);
inventory_image = deSerializeString16(is);
wield_image = deSerializeString16(is);
wield_scale = readV3F32(is);
stack_max = readS16(is);
usable = readU8(is);
liquids_pointable = readU8(is);
std::string tool_capabilities_s = deSerializeString(is);
std::string tool_capabilities_s = deSerializeString16(is);
if (!tool_capabilities_s.empty()) {
std::istringstream tmp_is(tool_capabilities_s, std::ios::binary);
tool_capabilities = new ToolCapabilities;
@ -194,22 +194,22 @@ void ItemDefinition::deSerialize(std::istream &is)
groups.clear();
u32 groups_size = readU16(is);
for(u32 i=0; i<groups_size; i++){
std::string name = deSerializeString(is);
std::string name = deSerializeString16(is);
int value = readS16(is);
groups[name] = value;
}
node_placement_prediction = deSerializeString(is);
node_placement_prediction = deSerializeString16(is);
// Version from ContentFeatures::serialize to keep in sync
sound_place.deSerialize(is, CONTENTFEATURES_VERSION);
sound_place_failed.deSerialize(is, CONTENTFEATURES_VERSION);
range = readF32(is);
palette_image = deSerializeString(is);
palette_image = deSerializeString16(is);
color = readARGB8(is);
inventory_overlay = deSerializeString(is);
wield_overlay = deSerializeString(is);
inventory_overlay = deSerializeString16(is);
wield_overlay = deSerializeString16(is);
// If you add anything here, insert it primarily inside the try-catch
// block to not need to increase the version.
@ -521,14 +521,14 @@ public:
// Serialize ItemDefinition and write wrapped in a string
std::ostringstream tmp_os(std::ios::binary);
def->serialize(tmp_os, protocol_version);
os << serializeString(tmp_os.str());
os << serializeString16(tmp_os.str());
}
writeU16(os, m_aliases.size());
for (const auto &it : m_aliases) {
os << serializeString(it.first);
os << serializeString(it.second);
os << serializeString16(it.first);
os << serializeString16(it.second);
}
}
void deSerialize(std::istream &is)
@ -543,7 +543,7 @@ public:
for(u16 i=0; i<count; i++)
{
// Deserialize a string and grab an ItemDefinition from it
std::istringstream tmp_is(deSerializeString(is), std::ios::binary);
std::istringstream tmp_is(deSerializeString16(is), std::ios::binary);
ItemDefinition def;
def.deSerialize(tmp_is);
// Register
@ -552,8 +552,8 @@ public:
u16 num_aliases = readU16(is);
for(u16 i=0; i<num_aliases; i++)
{
std::string name = deSerializeString(is);
std::string convert_to = deSerializeString(is);
std::string name = deSerializeString16(is);
std::string convert_to = deSerializeString16(is);
registerAlias(name, convert_to);
}
}

View File

@ -668,13 +668,13 @@ void MapBlock::deSerialize_pre22(std::istream &is, u8 version, bool disk)
// Ignore errors
try {
if (version <= 15) {
std::string data = deSerializeString(is);
std::string data = deSerializeString16(is);
std::istringstream iss(data, std::ios_base::binary);
content_nodemeta_deserialize_legacy(iss,
&m_node_metadata, &m_node_timers,
m_gamedef->idef());
} else {
//std::string data = deSerializeLongString(is);
//std::string data = deSerializeString32(is);
std::ostringstream oss(std::ios_base::binary);
decompressZlib(is, oss);
std::istringstream iss(oss.str(), std::ios_base::binary);

View File

@ -314,7 +314,7 @@ bool Schematic::deserializeFromMts(std::istream *is,
//// Read node names
u16 nidmapcount = readU16(ss);
for (int i = 0; i != nidmapcount; i++) {
std::string name = deSerializeString(ss);
std::string name = deSerializeString16(ss);
// Instances of "ignore" from v1 are converted to air (and instances
// are fixed to have MTSCHEM_PROB_NEVER later on).
@ -372,7 +372,7 @@ bool Schematic::serializeToMts(std::ostream *os,
writeU16(ss, names.size()); // name count
for (size_t i = 0; i != names.size(); i++)
ss << serializeString(names[i]); // node names
ss << serializeString16(names[i]); // node names
// compressed bulk node data
MapNode::serializeBulk(ss, SER_FMT_VER_HIGHEST_WRITE,

View File

@ -27,7 +27,7 @@ void NameIdMapping::serialize(std::ostream &os) const
writeU16(os, m_id_to_name.size());
for (const auto &i : m_id_to_name) {
writeU16(os, i.first);
os << serializeString(i.second);
os << serializeString16(i.second);
}
}
@ -41,7 +41,7 @@ void NameIdMapping::deSerialize(std::istream &is)
m_name_to_id.clear();
for (u32 i = 0; i < count; i++) {
u16 id = readU16(is);
std::string name = deSerializeString(is);
std::string name = deSerializeString16(is);
m_id_to_name[id] = name;
m_name_to_id[name] = id;
}

View File

@ -497,7 +497,7 @@ void Client::handleCommand_ActiveObjectMessages(NetworkPacket* pkt)
if (!is.good())
break;
std::string message = deSerializeString(is);
std::string message = deSerializeString16(is);
// Pass on to the environment
m_env.processActiveObjectMessage(id, message);
@ -994,7 +994,7 @@ void Client::handleCommand_AddParticleSpawner(NetworkPacket* pkt)
p.minsize = readF32(is);
p.maxsize = readF32(is);
p.collisiondetection = readU8(is);
p.texture = deSerializeLongString(is);
p.texture = deSerializeString32(is);
server_id = readU32(is);
@ -1207,11 +1207,11 @@ void Client::handleCommand_HudSetSky(NetworkPacket* pkt)
SkyboxParams skybox;
skybox.bgcolor = video::SColor(readARGB8(is));
skybox.type = std::string(deSerializeString(is));
skybox.type = std::string(deSerializeString16(is));
u16 count = readU16(is);
for (size_t i = 0; i < count; i++)
skybox.textures.emplace_back(deSerializeString(is));
skybox.textures.emplace_back(deSerializeString16(is));
skybox.clouds = true;
try {

View File

@ -207,7 +207,7 @@ void TileDef::serialize(std::ostream &os, u16 protocol_version) const
u8 version = 6;
writeU8(os, version);
os << serializeString(name);
os << serializeString16(name);
animation.serialize(os, version);
bool has_scale = scale > 0;
u16 flags = 0;
@ -241,7 +241,7 @@ void TileDef::deSerialize(std::istream &is, u8 contentfeatures_version,
int version = readU8(is);
if (version < 6)
throw SerializationError("unsupported TileDef version");
name = deSerializeString(is);
name = deSerializeString16(is);
animation.deSerialize(is, version);
u16 flags = readU16(is);
backface_culling = flags & TILE_FLAG_BACKFACE_CULLING;
@ -416,10 +416,10 @@ void ContentFeatures::serialize(std::ostream &os, u16 protocol_version) const
writeU8(os, version);
// general
os << serializeString(name);
os << serializeString16(name);
writeU16(os, groups.size());
for (const auto &group : groups) {
os << serializeString(group.first);
os << serializeString16(group.first);
writeS16(os, group.second);
}
writeU8(os, param_type);
@ -427,7 +427,7 @@ void ContentFeatures::serialize(std::ostream &os, u16 protocol_version) const
// visual
writeU8(os, drawtype);
os << serializeString(mesh);
os << serializeString16(mesh);
writeF32(os, visual_scale);
writeU8(os, 6);
for (const TileDef &td : tiledef)
@ -442,7 +442,7 @@ void ContentFeatures::serialize(std::ostream &os, u16 protocol_version) const
writeU8(os, color.getRed());
writeU8(os, color.getGreen());
writeU8(os, color.getBlue());
os << serializeString(palette_name);
os << serializeString16(palette_name);
writeU8(os, waving);
writeU8(os, connect_sides);
writeU16(os, connects_to_ids.size());
@ -470,8 +470,8 @@ void ContentFeatures::serialize(std::ostream &os, u16 protocol_version) const
// liquid
writeU8(os, liquid_type);
os << serializeString(liquid_alternative_flowing);
os << serializeString(liquid_alternative_source);
os << serializeString16(liquid_alternative_flowing);
os << serializeString16(liquid_alternative_source);
writeU8(os, liquid_viscosity);
writeU8(os, liquid_renewable);
writeU8(os, liquid_range);
@ -492,7 +492,7 @@ void ContentFeatures::serialize(std::ostream &os, u16 protocol_version) const
writeU8(os, legacy_facedir_simple);
writeU8(os, legacy_wallmounted);
os << serializeString(node_dig_prediction);
os << serializeString16(node_dig_prediction);
writeU8(os, leveled_max);
}
@ -519,11 +519,11 @@ void ContentFeatures::deSerialize(std::istream &is)
throw SerializationError("unsupported ContentFeatures version");
// general
name = deSerializeString(is);
name = deSerializeString16(is);
groups.clear();
u32 groups_size = readU16(is);
for (u32 i = 0; i < groups_size; i++) {
std::string name = deSerializeString(is);
std::string name = deSerializeString16(is);
int value = readS16(is);
groups[name] = value;
}
@ -532,7 +532,7 @@ void ContentFeatures::deSerialize(std::istream &is)
// visual
drawtype = (enum NodeDrawType) readU8(is);
mesh = deSerializeString(is);
mesh = deSerializeString16(is);
visual_scale = readF32(is);
if (readU8(is) != 6)
throw SerializationError("unsupported tile count");
@ -548,7 +548,7 @@ void ContentFeatures::deSerialize(std::istream &is)
color.setRed(readU8(is));
color.setGreen(readU8(is));
color.setBlue(readU8(is));
palette_name = deSerializeString(is);
palette_name = deSerializeString16(is);
waving = readU8(is);
connect_sides = readU8(is);
u16 connects_to_size = readU16(is);
@ -578,8 +578,8 @@ void ContentFeatures::deSerialize(std::istream &is)
// liquid
liquid_type = (enum LiquidType) readU8(is);
liquid_alternative_flowing = deSerializeString(is);
liquid_alternative_source = deSerializeString(is);
liquid_alternative_flowing = deSerializeString16(is);
liquid_alternative_source = deSerializeString16(is);
liquid_viscosity = readU8(is);
liquid_renewable = readU8(is);
liquid_range = readU8(is);
@ -601,7 +601,7 @@ void ContentFeatures::deSerialize(std::istream &is)
legacy_wallmounted = readU8(is);
try {
node_dig_prediction = deSerializeString(is);
node_dig_prediction = deSerializeString16(is);
u8 tmp_leveled_max = readU8(is);
if (is.eof()) /* readU8 doesn't throw exceptions so we have to do this */
throw SerializationError("");
@ -1472,7 +1472,7 @@ void NodeDefManager::serialize(std::ostream &os, u16 protocol_version) const
// strict version incompatibilities
std::ostringstream wrapper_os(std::ios::binary);
f->serialize(wrapper_os, protocol_version);
os2<<serializeString(wrapper_os.str());
os2<<serializeString16(wrapper_os.str());
// must not overflow
u16 next = count + 1;
@ -1480,7 +1480,7 @@ void NodeDefManager::serialize(std::ostream &os, u16 protocol_version) const
count++;
}
writeU16(os, count);
os << serializeLongString(os2.str());
os << serializeString32(os2.str());
}
@ -1491,13 +1491,13 @@ void NodeDefManager::deSerialize(std::istream &is)
if (version != 1)
throw SerializationError("unsupported NodeDefinitionManager version");
u16 count = readU16(is);
std::istringstream is2(deSerializeLongString(is), std::ios::binary);
std::istringstream is2(deSerializeString32(is), std::ios::binary);
ContentFeatures f;
for (u16 n = 0; n < count; n++) {
u16 i = readU16(is2);
// Read it from the string wrapper
std::string wrapper = deSerializeString(is2);
std::string wrapper = deSerializeString16(is2);
std::istringstream wrapper_is(wrapper, std::ios::binary);
f.deSerialize(wrapper_is);

View File

@ -49,8 +49,8 @@ void NodeMetadata::serialize(std::ostream &os, u8 version, bool disk) const
if (!disk && priv)
continue;
os << serializeString(sv.first);
os << serializeLongString(sv.second);
os << serializeString16(sv.first);
os << serializeString32(sv.second);
if (version >= 2)
writeU8(os, (priv) ? 1 : 0);
}
@ -63,8 +63,8 @@ void NodeMetadata::deSerialize(std::istream &is, u8 version)
clear();
int num_vars = readU32(is);
for(int i=0; i<num_vars; i++){
std::string name = deSerializeString(is);
std::string var = deSerializeLongString(is);
std::string name = deSerializeString16(is);
std::string var = deSerializeString32(is);
m_stringvars[name] = var;
if (version >= 2) {
if (readU8(is) == 1)

View File

@ -84,11 +84,11 @@ void ObjectProperties::serialize(std::ostream &os) const
writeV3F32(os, selectionbox.MinEdge);
writeV3F32(os, selectionbox.MaxEdge);
writeU8(os, pointable);
os << serializeString(visual);
os << serializeString16(visual);
writeV3F32(os, visual_size);
writeU16(os, textures.size());
for (const std::string &texture : textures) {
os << serializeString(texture);
os << serializeString16(texture);
}
writeV2S16(os, spritediv);
writeV2S16(os, initial_sprite_basepos);
@ -96,7 +96,7 @@ void ObjectProperties::serialize(std::ostream &os) const
writeU8(os, makes_footstep_sound);
writeF32(os, automatic_rotate);
// Added in protocol version 14
os << serializeString(mesh);
os << serializeString16(mesh);
writeU16(os, colors.size());
for (video::SColor color : colors) {
writeARGB8(os, color);
@ -106,17 +106,17 @@ void ObjectProperties::serialize(std::ostream &os) const
writeU8(os, automatic_face_movement_dir);
writeF32(os, automatic_face_movement_dir_offset);
writeU8(os, backface_culling);
os << serializeString(nametag);
os << serializeString16(nametag);
writeARGB8(os, nametag_color);
writeF32(os, automatic_face_movement_max_rotation_per_sec);
os << serializeString(infotext);
os << serializeString(wield_item);
os << serializeString16(infotext);
os << serializeString16(wield_item);
writeS8(os, glow);
writeU16(os, breath_max);
writeF32(os, eye_height);
writeF32(os, zoom_fov);
writeU8(os, use_texture_alpha);
os << serializeString(damage_texture_modifier);
os << serializeString16(damage_texture_modifier);
writeU8(os, shaded);
// Add stuff only at the bottom.
@ -137,19 +137,19 @@ void ObjectProperties::deSerialize(std::istream &is)
selectionbox.MinEdge = readV3F32(is);
selectionbox.MaxEdge = readV3F32(is);
pointable = readU8(is);
visual = deSerializeString(is);
visual = deSerializeString16(is);
visual_size = readV3F32(is);
textures.clear();
u32 texture_count = readU16(is);
for (u32 i = 0; i < texture_count; i++){
textures.push_back(deSerializeString(is));
textures.push_back(deSerializeString16(is));
}
spritediv = readV2S16(is);
initial_sprite_basepos = readV2S16(is);
is_visible = readU8(is);
makes_footstep_sound = readU8(is);
automatic_rotate = readF32(is);
mesh = deSerializeString(is);
mesh = deSerializeString16(is);
colors.clear();
u32 color_count = readU16(is);
for (u32 i = 0; i < color_count; i++){
@ -160,18 +160,18 @@ void ObjectProperties::deSerialize(std::istream &is)
automatic_face_movement_dir = readU8(is);
automatic_face_movement_dir_offset = readF32(is);
backface_culling = readU8(is);
nametag = deSerializeString(is);
nametag = deSerializeString16(is);
nametag_color = readARGB8(is);
automatic_face_movement_max_rotation_per_sec = readF32(is);
infotext = deSerializeString(is);
wield_item = deSerializeString(is);
infotext = deSerializeString16(is);
wield_item = deSerializeString16(is);
glow = readS8(is);
breath_max = readU16(is);
eye_height = readF32(is);
zoom_fov = readF32(is);
use_texture_alpha = readU8(is);
try {
damage_texture_modifier = deSerializeString(is);
damage_texture_modifier = deSerializeString16(is);
u8 tmp = readU8(is);
if (is.eof())
throw SerializationError("");

View File

@ -28,7 +28,7 @@ void ParticleParameters::serialize(std::ostream &os, u16 protocol_ver) const
writeF32(os, expirationtime);
writeF32(os, size);
writeU8(os, collisiondetection);
os << serializeLongString(texture);
os << serializeString32(texture);
writeU8(os, vertical);
writeU8(os, collision_removal);
animation.serialize(os, 6); /* NOT the protocol ver */
@ -47,7 +47,7 @@ void ParticleParameters::deSerialize(std::istream &is, u16 protocol_ver)
expirationtime = readF32(is);
size = readF32(is);
collisiondetection = readU8(is);
texture = deSerializeLongString(is);
texture = deSerializeString32(is);
vertical = readU8(is);
collision_removal = readU8(is);
animation.deSerialize(is, 6); /* NOT the protocol ver */

View File

@ -802,7 +802,7 @@ void Server::AsyncRunStep(bool initial_step)
// u16 id
// std::string data
buffer.append(idbuf, sizeof(idbuf));
buffer.append(serializeString(aom.datastring));
buffer.append(serializeString16(aom.datastring));
}
}
/*
@ -1993,7 +1993,7 @@ void Server::SendActiveObjectRemoveAdd(RemoteClient *client, PlayerSAO *playersa
writeU8((u8*)buf, type);
data.append(buf, 1);
data.append(serializeLongString(
data.append(serializeString32(
obj->getClientInitializationData(client->net_proto_version)));
// Add to known objects

View File

@ -42,8 +42,8 @@ LuaEntitySAO::LuaEntitySAO(ServerEnvironment *env, v3f pos, const std::string &d
u8 version2 = 0;
u8 version = readU8(is);
name = deSerializeString(is);
state = deSerializeLongString(is);
name = deSerializeString16(is);
state = deSerializeString32(is);
if (version < 1)
break;
@ -225,7 +225,7 @@ std::string LuaEntitySAO::getClientInitializationData(u16 protocol_version)
// PROTOCOL_VERSION >= 37
writeU8(os, 1); // version
os << serializeString(""); // name
os << serializeString16(""); // name
writeU8(os, 0); // is_player
writeU16(os, getId()); //id
writeV3F32(os, m_base_position);
@ -233,26 +233,26 @@ std::string LuaEntitySAO::getClientInitializationData(u16 protocol_version)
writeU16(os, m_hp);
std::ostringstream msg_os(std::ios::binary);
msg_os << serializeLongString(getPropertyPacket()); // message 1
msg_os << serializeLongString(generateUpdateArmorGroupsCommand()); // 2
msg_os << serializeLongString(generateUpdateAnimationCommand()); // 3
msg_os << serializeString32(getPropertyPacket()); // message 1
msg_os << serializeString32(generateUpdateArmorGroupsCommand()); // 2
msg_os << serializeString32(generateUpdateAnimationCommand()); // 3
for (const auto &bone_pos : m_bone_position) {
msg_os << serializeLongString(generateUpdateBonePositionCommand(
msg_os << serializeString32(generateUpdateBonePositionCommand(
bone_pos.first, bone_pos.second.X, bone_pos.second.Y)); // m_bone_position.size
}
msg_os << serializeLongString(generateUpdateAttachmentCommand()); // 4
msg_os << serializeString32(generateUpdateAttachmentCommand()); // 4
int message_count = 4 + m_bone_position.size();
for (const auto &id : getAttachmentChildIds()) {
if (ServerActiveObject *obj = m_env->getActiveObject(id)) {
message_count++;
msg_os << serializeLongString(obj->generateUpdateInfantCommand(
msg_os << serializeString32(obj->generateUpdateInfantCommand(
id, protocol_version));
}
}
msg_os << serializeLongString(generateSetTextureModCommand());
msg_os << serializeString32(generateSetTextureModCommand());
message_count++;
writeU8(os, message_count);
@ -270,14 +270,14 @@ void LuaEntitySAO::getStaticData(std::string *result) const
// version must be 1 to keep backwards-compatibility. See version2
writeU8(os, 1);
// name
os<<serializeString(m_init_name);
os<<serializeString16(m_init_name);
// state
if(m_registered){
std::string state = m_env->getScriptIface()->
luaentity_GetStaticdata(m_id);
os<<serializeLongString(state);
os<<serializeString32(state);
} else {
os<<serializeLongString(m_init_state);
os<<serializeString32(m_init_state);
}
writeU16(os, m_hp);
writeV3F1000(os, m_velocity);
@ -436,7 +436,7 @@ std::string LuaEntitySAO::generateSetTextureModCommand() const
// command
writeU8(os, AO_CMD_SET_TEXTURE_MOD);
// parameters
os << serializeString(m_current_texture_modifier);
os << serializeString16(m_current_texture_modifier);
return os.str();
}

View File

@ -109,7 +109,7 @@ std::string PlayerSAO::getClientInitializationData(u16 protocol_version)
// Protocol >= 15
writeU8(os, 1); // version
os << serializeString(m_player->getName()); // name
os << serializeString16(m_player->getName()); // name
writeU8(os, 1); // is_player
writeS16(os, getId()); // id
writeV3F32(os, m_base_position);
@ -117,22 +117,22 @@ std::string PlayerSAO::getClientInitializationData(u16 protocol_version)
writeU16(os, getHP());
std::ostringstream msg_os(std::ios::binary);
msg_os << serializeLongString(getPropertyPacket()); // message 1
msg_os << serializeLongString(generateUpdateArmorGroupsCommand()); // 2
msg_os << serializeLongString(generateUpdateAnimationCommand()); // 3
msg_os << serializeString32(getPropertyPacket()); // message 1
msg_os << serializeString32(generateUpdateArmorGroupsCommand()); // 2
msg_os << serializeString32(generateUpdateAnimationCommand()); // 3
for (const auto &bone_pos : m_bone_position) {
msg_os << serializeLongString(generateUpdateBonePositionCommand(
msg_os << serializeString32(generateUpdateBonePositionCommand(
bone_pos.first, bone_pos.second.X, bone_pos.second.Y)); // m_bone_position.size
}
msg_os << serializeLongString(generateUpdateAttachmentCommand()); // 4
msg_os << serializeLongString(generateUpdatePhysicsOverrideCommand()); // 5
msg_os << serializeString32(generateUpdateAttachmentCommand()); // 4
msg_os << serializeString32(generateUpdatePhysicsOverrideCommand()); // 5
int message_count = 5 + m_bone_position.size();
for (const auto &id : getAttachmentChildIds()) {
if (ServerActiveObject *obj = m_env->getActiveObject(id)) {
message_count++;
msg_os << serializeLongString(obj->generateUpdateInfantCommand(
msg_os << serializeString32(obj->generateUpdateInfantCommand(
id, protocol_version));
}
}

View File

@ -61,7 +61,7 @@ std::string ServerActiveObject::generateUpdateInfantCommand(u16 infant_id, u16 p
// Clients since 4aa9a66 so no longer need this data
// Version 38 is the first bump after that commit.
// See also: ClientEnvironment::addActiveObject
os << serializeLongString(getClientInitializationData(protocol_version));
os << serializeString32(getClientInitializationData(protocol_version));
}
return os.str();
}

View File

@ -242,7 +242,7 @@ std::string UnitSAO::generateUpdateAttachmentCommand() const
writeU8(os, AO_CMD_ATTACH_TO);
// parameters
writeS16(os, m_attachment_parent_id);
os << serializeString(m_attachment_bone);
os << serializeString16(m_attachment_bone);
writeV3F32(os, m_attachment_position);
writeV3F32(os, m_attachment_rotation);
return os.str();
@ -255,7 +255,7 @@ std::string UnitSAO::generateUpdateBonePositionCommand(
// command
writeU8(os, AO_CMD_SET_BONE_POSITION);
// parameters
os << serializeString(bone);
os << serializeString16(bone);
writeV3F32(os, position);
writeV3F32(os, rotation);
return os.str();
@ -291,7 +291,7 @@ std::string UnitSAO::generateUpdateArmorGroupsCommand() const
writeU8(os, AO_CMD_UPDATE_ARMOR_GROUPS);
writeU16(os, m_armor_groups.size());
for (const auto &armor_group : m_armor_groups) {
os << serializeString(armor_group.first);
os << serializeString16(armor_group.first);
writeS16(os, armor_group.second);
}
return os.str();

View File

@ -39,7 +39,7 @@ struct SimpleSoundSpec
// keep in sync with item definitions
void serialize(std::ostream &os, u8 cf_version) const
{
os << serializeString(name);
os << serializeString16(name);
writeF32(os, gain);
writeF32(os, pitch);
writeF32(os, fade);
@ -49,7 +49,7 @@ struct SimpleSoundSpec
void deSerialize(std::istream &is, u8 cf_version)
{
name = deSerializeString(is);
name = deSerializeString16(is);
gain = readF32(is);
pitch = readF32(is);
fade = readF32(is);

View File

@ -35,7 +35,7 @@ void StaticObject::serialize(std::ostream &os)
// pos
writeV3F1000(os, pos);
// data
os<<serializeString(data);
os<<serializeString16(data);
}
void StaticObject::deSerialize(std::istream &is, u8 version)
{
@ -44,7 +44,7 @@ void StaticObject::deSerialize(std::istream &is, u8 version)
// pos
pos = readV3F1000(is);
// data
data = deSerializeString(is);
data = deSerializeString16(is);
}
void StaticObjectList::serialize(std::ostream &os)

View File

@ -66,7 +66,7 @@ void ToolCapabilities::serialize(std::ostream &os, u16 protocol_version) const
for (const auto &groupcap : groupcaps) {
const std::string *name = &groupcap.first;
const ToolGroupCap *cap = &groupcap.second;
os << serializeString(*name);
os << serializeString16(*name);
writeS16(os, cap->uses);
writeS16(os, cap->maxlevel);
writeU32(os, cap->times.size());
@ -79,7 +79,7 @@ void ToolCapabilities::serialize(std::ostream &os, u16 protocol_version) const
writeU32(os, damageGroups.size());
for (const auto &damageGroup : damageGroups) {
os << serializeString(damageGroup.first);
os << serializeString16(damageGroup.first);
writeS16(os, damageGroup.second);
}
@ -98,7 +98,7 @@ void ToolCapabilities::deSerialize(std::istream &is)
groupcaps.clear();
u32 groupcaps_size = readU32(is);
for (u32 i = 0; i < groupcaps_size; i++) {
std::string name = deSerializeString(is);
std::string name = deSerializeString16(is);
ToolGroupCap cap;
cap.uses = readS16(is);
cap.maxlevel = readS16(is);
@ -113,7 +113,7 @@ void ToolCapabilities::deSerialize(std::istream &is)
u32 damage_groups_size = readU32(is);
for (u32 i = 0; i < damage_groups_size; i++) {
std::string name = deSerializeString(is);
std::string name = deSerializeString16(is);
s16 rating = readS16(is);
damageGroups[name] = rating;
}

View File

@ -44,7 +44,7 @@ public:
std::wstring teststring2_w;
std::string teststring2_w_encoded;
static const u8 test_serialized_data[12 * 13 - 8];
static const u8 test_serialized_data[12 * 11 - 2];
};
static TestSerialization g_test_instance;
@ -91,21 +91,21 @@ void TestSerialization::buildTestStrings()
void TestSerialization::testSerializeString()
{
// Test blank string
UASSERT(serializeString("") == mkstr("\0\0"));
UASSERT(serializeString16("") == mkstr("\0\0"));
// Test basic string
UASSERT(serializeString("Hello world!") == mkstr("\0\14Hello world!"));
UASSERT(serializeString16("Hello world!") == mkstr("\0\14Hello world!"));
// Test character range
UASSERT(serializeString(teststring2) == mkstr("\1\0") + teststring2);
UASSERT(serializeString16(teststring2) == mkstr("\1\0") + teststring2);
}
void TestSerialization::testDeSerializeString()
{
// Test deserialize
{
std::istringstream is(serializeString(teststring2), std::ios::binary);
UASSERT(deSerializeString(is) == teststring2);
std::istringstream is(serializeString16(teststring2), std::ios::binary);
UASSERT(deSerializeString16(is) == teststring2);
UASSERT(!is.eof());
is.get();
UASSERT(is.eof());
@ -114,34 +114,34 @@ void TestSerialization::testDeSerializeString()
// Test deserialize an incomplete length specifier
{
std::istringstream is(mkstr("\x53"), std::ios::binary);
EXCEPTION_CHECK(SerializationError, deSerializeString(is));
EXCEPTION_CHECK(SerializationError, deSerializeString16(is));
}
// Test deserialize a string with incomplete data
{
std::istringstream is(mkstr("\x00\x55 abcdefg"), std::ios::binary);
EXCEPTION_CHECK(SerializationError, deSerializeString(is));
EXCEPTION_CHECK(SerializationError, deSerializeString16(is));
}
}
void TestSerialization::testSerializeLongString()
{
// Test blank string
UASSERT(serializeLongString("") == mkstr("\0\0\0\0"));
UASSERT(serializeString32("") == mkstr("\0\0\0\0"));
// Test basic string
UASSERT(serializeLongString("Hello world!") == mkstr("\0\0\0\14Hello world!"));
UASSERT(serializeString32("Hello world!") == mkstr("\0\0\0\14Hello world!"));
// Test character range
UASSERT(serializeLongString(teststring2) == mkstr("\0\0\1\0") + teststring2);
UASSERT(serializeString32(teststring2) == mkstr("\0\0\1\0") + teststring2);
}
void TestSerialization::testDeSerializeLongString()
{
// Test deserialize
{
std::istringstream is(serializeLongString(teststring2), std::ios::binary);
UASSERT(deSerializeLongString(is) == teststring2);
std::istringstream is(serializeString32(teststring2), std::ios::binary);
UASSERT(deSerializeString32(is) == teststring2);
UASSERT(!is.eof());
is.get();
UASSERT(is.eof());
@ -150,19 +150,19 @@ void TestSerialization::testDeSerializeLongString()
// Test deserialize an incomplete length specifier
{
std::istringstream is(mkstr("\x53"), std::ios::binary);
EXCEPTION_CHECK(SerializationError, deSerializeLongString(is));
EXCEPTION_CHECK(SerializationError, deSerializeString32(is));
}
// Test deserialize a string with incomplete data
{
std::istringstream is(mkstr("\x00\x00\x00\x05 abc"), std::ios::binary);
EXCEPTION_CHECK(SerializationError, deSerializeLongString(is));
EXCEPTION_CHECK(SerializationError, deSerializeString32(is));
}
// Test deserialize a string with a length too large
{
std::istringstream is(mkstr("\xFF\xFF\xFF\xFF blah"), std::ios::binary);
EXCEPTION_CHECK(SerializationError, deSerializeLongString(is));
EXCEPTION_CHECK(SerializationError, deSerializeString32(is));
}
}
@ -235,19 +235,17 @@ void TestSerialization::testStreamRead()
UASSERT(readF1000(is) == F1000_MIN);
UASSERT(readF1000(is) == F1000_MAX);
UASSERT(deSerializeString(is) == "foobar!");
UASSERT(deSerializeString16(is) == "foobar!");
UASSERT(readV2S16(is) == v2s16(500, 500));
UASSERT(readV3S16(is) == v3s16(4207, 604, -30));
UASSERT(readV2S32(is) == v2s32(1920, 1080));
UASSERT(readV3S32(is) == v3s32(-400, 6400054, 290549855));
UASSERT(deSerializeWideString(is) == L"\x02~woof~\x5455");
UASSERT(readV3F1000(is) == v3f(500, 10024.2f, -192.54f));
UASSERT(readARGB8(is) == video::SColor(255, 128, 50, 128));
UASSERT(deSerializeLongString(is) == "some longer string here");
UASSERT(deSerializeString32(is) == "some longer string here");
UASSERT(is.rdbuf()->in_avail() == 2);
UASSERT(readU16(is) == 0xF00D);
@ -275,7 +273,7 @@ void TestSerialization::testStreamWrite()
writeF1000(os, F1000_MIN);
writeF1000(os, F1000_MAX);
os << serializeString("foobar!");
os << serializeString16("foobar!");
data = os.str();
UASSERT(data.size() < sizeof(test_serialized_data));
@ -286,12 +284,10 @@ void TestSerialization::testStreamWrite()
writeV2S32(os, v2s32(1920, 1080));
writeV3S32(os, v3s32(-400, 6400054, 290549855));
os << serializeWideString(L"\x02~woof~\x5455");
writeV3F1000(os, v3f(500, 10024.2f, -192.54f));
writeARGB8(os, video::SColor(255, 128, 50, 128));
os << serializeLongString("some longer string here");
os << serializeString32("some longer string here");
writeU16(os, 0xF00D);
@ -384,7 +380,7 @@ void TestSerialization::testFloatFormat()
UASSERT(test_single(i));
}
const u8 TestSerialization::test_serialized_data[12 * 13 - 8] = {
const u8 TestSerialization::test_serialized_data[12 * 11 - 2] = {
0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb, 0xcc,
0xdd, 0xee, 0xff, 0x80, 0x75, 0x30, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xd5, 0x00, 0x00, 0xd1, 0x1e, 0xee, 0x1e,
@ -392,9 +388,7 @@ const u8 TestSerialization::test_serialized_data[12 * 13 - 8] = {
0x66, 0x6f, 0x6f, 0x62, 0x61, 0x72, 0x21, 0x01, 0xf4, 0x01, 0xf4, 0x10,
0x6f, 0x02, 0x5c, 0xff, 0xe2, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 0x04,
0x38, 0xff, 0xff, 0xfe, 0x70, 0x00, 0x61, 0xa8, 0x36, 0x11, 0x51, 0x70,
0x5f, 0x00, 0x08, 0x00,
0x02, 0x00, 0x7e, 0x00, 'w', 0x00, 'o', 0x00, 'o', 0x00, 'f', 0x00, // \x02~woof~\x5455
0x7e, 0x54, 0x55, 0x00, 0x07, 0xa1, 0x20, 0x00, 0x98, 0xf5, 0x08, 0xff,
0x5f, 0x00, 0x07, 0xa1, 0x20, 0x00, 0x98, 0xf5, 0x08, 0xff,
0xfd, 0x0f, 0xe4, 0xff, 0x80, 0x32, 0x80, 0x00, 0x00, 0x00, 0x17, 0x73,
0x6f, 0x6d, 0x65, 0x20, 0x6c, 0x6f, 0x6e, 0x67, 0x65, 0x72, 0x20, 0x73,
0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x68, 0x65, 0x72, 0x65, 0xF0, 0x0D,

View File

@ -35,13 +35,13 @@ FloatType g_serialize_f32_type = FLOATTYPE_UNKNOWN;
//// String
////
std::string serializeString(const std::string &plain)
std::string serializeString16(const std::string &plain)
{
std::string s;
char buf[2];
if (plain.size() > STRING_MAX_LEN)
throw SerializationError("String too long for serializeString");
throw SerializationError("String too long for serializeString16");
s.reserve(2 + plain.size());
writeU16((u8 *)&buf[0], plain.size());
@ -51,14 +51,14 @@ std::string serializeString(const std::string &plain)
return s;
}
std::string deSerializeString(std::istream &is)
std::string deSerializeString16(std::istream &is)
{
std::string s;
char buf[2];
is.read(buf, 2);
if (is.gcount() != 2)
throw SerializationError("deSerializeString: size not read");
throw SerializationError("deSerializeString16: size not read");
u16 s_size = readU16((u8 *)buf);
if (s_size == 0)
@ -67,66 +67,17 @@ std::string deSerializeString(std::istream &is)
s.resize(s_size);
is.read(&s[0], s_size);
if (is.gcount() != s_size)
throw SerializationError("deSerializeString: couldn't read all chars");
throw SerializationError("deSerializeString16: couldn't read all chars");
return s;
}
////
//// Wide String
////
std::string serializeWideString(const std::wstring &plain)
{
std::string s;
char buf[2];
if (plain.size() > WIDE_STRING_MAX_LEN)
throw SerializationError("String too long for serializeWideString");
s.reserve(2 + 2 * plain.size());
writeU16((u8 *)buf, plain.size());
s.append(buf, 2);
for (wchar_t i : plain) {
writeU16((u8 *)buf, i);
s.append(buf, 2);
}
return s;
}
std::wstring deSerializeWideString(std::istream &is)
{
std::wstring s;
char buf[2];
is.read(buf, 2);
if (is.gcount() != 2)
throw SerializationError("deSerializeWideString: size not read");
u16 s_size = readU16((u8 *)buf);
if (s_size == 0)
return s;
s.reserve(s_size);
for (u32 i = 0; i < s_size; i++) {
is.read(&buf[0], 2);
if (is.gcount() != 2) {
throw SerializationError(
"deSerializeWideString: couldn't read all chars");
}
wchar_t c16 = readU16((u8 *)buf);
s.append(&c16, 1);
}
return s;
}
////
//// Long String
////
std::string serializeLongString(const std::string &plain)
std::string serializeString32(const std::string &plain)
{
std::string s;
char buf[4];
@ -141,7 +92,7 @@ std::string serializeLongString(const std::string &plain)
return s;
}
std::string deSerializeLongString(std::istream &is)
std::string deSerializeString32(std::istream &is)
{
std::string s;
char buf[4];

View File

@ -440,16 +440,16 @@ MAKE_STREAM_WRITE_FXN(video::SColor, ARGB8, 4);
////
// Creates a string with the length as the first two bytes
std::string serializeString(const std::string &plain);
std::string serializeString16(const std::string &plain);
// Reads a string with the length as the first two bytes
std::string deSerializeString(std::istream &is);
std::string deSerializeString16(std::istream &is);
// Creates a string with the length as the first four bytes
std::string serializeLongString(const std::string &plain);
std::string serializeString32(const std::string &plain);
// Reads a string with the length as the first four bytes
std::string deSerializeLongString(std::istream &is);
std::string deSerializeString32(std::istream &is);
// Creates a string encoded in JSON format (almost equivalent to a C string literal)
std::string serializeJsonString(const std::string &plain);