diff --git a/src/ox/mc/presencemask.cpp b/src/ox/mc/presencemask.cpp index 0860efdb7..2ae87bb34 100644 --- a/src/ox/mc/presencemask.cpp +++ b/src/ox/mc/presencemask.cpp @@ -10,9 +10,6 @@ #include "err.hpp" #include "presencemask.hpp" -#include -using namespace std; - namespace ox { FieldPresenseMask::FieldPresenseMask(uint8_t *mask, size_t maxLen) { @@ -45,4 +42,8 @@ void FieldPresenseMask::setMaxLen(int maxLen) { m_maxLen = maxLen; } +int FieldPresenseMask::getMaxLen() { + return m_maxLen; +} + } diff --git a/src/ox/mc/presencemask.hpp b/src/ox/mc/presencemask.hpp index 0001c1d29..13da66c3c 100644 --- a/src/ox/mc/presencemask.hpp +++ b/src/ox/mc/presencemask.hpp @@ -25,6 +25,8 @@ class FieldPresenseMask { int set(int i, bool on); void setMaxLen(int); + + int getMaxLen(); }; } diff --git a/src/ox/mc/read.hpp b/src/ox/mc/read.hpp index 7ed0e7baa..e718ae423 100644 --- a/src/ox/mc/read.hpp +++ b/src/ox/mc/read.hpp @@ -57,9 +57,11 @@ class MetalClawReader { template int MetalClawReader::op(const char*, T *val) { int err = 0; - MetalClawReader reader(m_buff + m_buffIt, m_buffLen - m_buffIt); - err |= ioOp(&reader, val); - m_buffIt += reader.m_buffIt; + if (m_fieldPresence.get(m_field)) { + MetalClawReader reader(m_buff + m_buffIt, m_buffLen - m_buffIt); + err |= ioOp(&reader, val); + m_buffIt += reader.m_buffIt; + } m_field++; return err; }; diff --git a/src/ox/mc/write.hpp b/src/ox/mc/write.hpp index c3b5b9f42..a68a994e7 100644 --- a/src/ox/mc/write.hpp +++ b/src/ox/mc/write.hpp @@ -81,9 +81,14 @@ int MetalClawWriter::op(const char*, ox::bstring *val) { template int MetalClawWriter::op(const char*, T *val) { int err = 0; + bool fieldSet = false; MetalClawWriter writer(m_buff + m_buffIt, m_buffLen - m_buffIt); err |= ioOp(&writer, val); - m_buffIt += writer.m_buffIt; + if ((size_t) writer.m_fieldPresence.getMaxLen() < writer.m_buffIt) { + m_buffIt += writer.m_buffIt; + fieldSet = true; + } + err |= m_fieldPresence.set(m_field, fieldSet); m_field++; return err; };