diff --git a/messagingclient/main.cpp b/messagingclient/main.cpp index d3df494..f56df89 100644 --- a/messagingclient/main.cpp +++ b/messagingclient/main.cpp @@ -13,6 +13,10 @@ int main(int argc, char **argv) message.copyTo(map); qDebug() << "full" << map; + + + qDebug() << "changing name..."; + message.setName("Peter"); map.clear(); @@ -23,9 +27,15 @@ int main(int argc, char **argv) message.copyTouchedTo(map); qDebug() << "delta:" << map; - qDebug() << "clearing touched..."; - message.setTouched(false); + + qDebug() << "clearing name..."; + + message.nameField().clear(); + + map.clear(); + message.copyTo(map); + qDebug() << "full" << map; map.clear(); message.copyTouchedTo(map); diff --git a/messagingcorelib/dbmsglib.cpp b/messagingcorelib/dbmsglib.cpp index fdcaf1f..743974b 100644 --- a/messagingcorelib/dbmsglib.cpp +++ b/messagingcorelib/dbmsglib.cpp @@ -7,7 +7,7 @@ #include DbMsgFieldBase::DbMsgFieldBase() : - m_touched(false) + m_hasValue(false), m_touched(false) { } @@ -15,6 +15,16 @@ DbMsgFieldBase::~DbMsgFieldBase() { } +bool DbMsgFieldBase::hasValue() const +{ + return m_hasValue; +} + +void DbMsgFieldBase::clear() +{ + m_hasValue = false; +} + bool DbMsgFieldBase::touched() const { return m_touched; @@ -25,6 +35,16 @@ void DbMsgFieldBase::setTouched(bool touched) m_touched = touched; } +void DbMsgFieldBase::setHasValue(bool hasValue) +{ + if(m_hasValue && !hasValue) + clear(); + else + m_hasValue = hasValue; +} + +const QString DbMsgBase::m_clearedFieldsName(QStringLiteral("__CLEARED_FIELDS")); + DbMsgBase::DbMsgBase() { } @@ -62,7 +82,16 @@ void DbMsgBase::copyTo(QVariantMap &variantMap) const { const auto fields = getFields(); for(auto iter = fields.cbegin(); iter != fields.cend(); iter++) - variantMap.insert(iter.key(), iter.value()->getVariant()); + { + const auto key = iter.key(); + const auto field = iter.value(); + const auto hasValue = field->hasValue(); + const auto variant = field->getVariant(); + if(hasValue) + variantMap.insert(key, variant); + else + qWarning() << key << "has no value for full transmission!"; + } } void DbMsgBase::copyTouchedTo(QJsonObject &jsonObject) const @@ -73,8 +102,18 @@ void DbMsgBase::copyTouchedTo(QJsonObject &jsonObject) const void DbMsgBase::copyTouchedTo(QVariantMap &variantMap) const { + QStringList clearedFields; + const auto fields = getFields(); for(auto iter = fields.cbegin(); iter != fields.cend(); iter++) if(iter.value()->touched()) - variantMap.insert(iter.key(), iter.value()->getVariant()); + { + if(iter.value()->hasValue()) + variantMap.insert(iter.key(), iter.value()->getVariant()); + else + clearedFields.append(iter.key()); + } + + if(!clearedFields.isEmpty()) + variantMap.insert(m_clearedFieldsName, clearedFields); } diff --git a/messagingcorelib/dbmsglib.h b/messagingcorelib/dbmsglib.h index b89f3d5..daf1f7a 100644 --- a/messagingcorelib/dbmsglib.h +++ b/messagingcorelib/dbmsglib.h @@ -12,12 +12,19 @@ public: DbMsgFieldBase(); virtual ~DbMsgFieldBase(); + bool hasValue() const; + virtual void clear(); + bool touched() const; void setTouched(bool touched); virtual QVariant getVariant() const = 0; +protected: + void setHasValue(bool hasValue); + private: + bool m_hasValue; bool m_touched; }; @@ -32,27 +39,25 @@ public: const T &getValue() const; void setValue(const T &value); - bool hasValue() const; - - QVariant getVariant() const; + void clear() override; + QVariant getVariant() const override; private: T m_value; - bool m_hasValue; }; template DbMsgField::DbMsgField() : - DbMsgFieldBase(), - m_hasValue(false) + DbMsgFieldBase() { } template DbMsgField::DbMsgField(const T &value) : DbMsgFieldBase(), - m_value(value), m_hasValue(true) + m_value(value) { + setHasValue(true); } template @@ -70,15 +75,16 @@ const T &DbMsgField::getValue() const template void DbMsgField::setValue(const T &value) { - m_hasValue = true; m_value = value; + setHasValue(true); setTouched(true); } template -bool DbMsgField::hasValue() const +void DbMsgField::clear() { - return m_hasValue; + DbMsgFieldBase::clear(); + m_value = T(); } template @@ -89,6 +95,8 @@ QVariant DbMsgField::getVariant() const class DbMsgBase { + static const QString m_clearedFieldsName; + public: DbMsgBase(); virtual ~DbMsgBase();