1 #include "itemstackmetadata.h"
2 #include "util/serialize.h"
3 #include "util/strfnd.h"
5 #define DESERIALIZE_START '\x01'
6 #define DESERIALIZE_KV_DELIM '\x02'
7 #define DESERIALIZE_PAIR_DELIM '\x03'
8 #define DESERIALIZE_START_STR "\x01"
9 #define DESERIALIZE_KV_DELIM_STR "\x02"
10 #define DESERIALIZE_PAIR_DELIM_STR "\x03"
12 #define TOOLCAP_KEY "tool_capabilities"
14 void ItemStackMetadata::clear()
17 updateToolCapabilities();
20 bool ItemStackMetadata::setString(const std::string &name, const std::string &var)
22 bool result = Metadata::setString(name, var);
23 if (name == TOOLCAP_KEY)
24 updateToolCapabilities();
28 void ItemStackMetadata::serialize(std::ostream &os) const
30 std::ostringstream os2;
31 os2 << DESERIALIZE_START;
32 for (const auto &stringvar : m_stringvars) {
33 if (!stringvar.first.empty() || !stringvar.second.empty())
34 os2 << stringvar.first << DESERIALIZE_KV_DELIM
35 << stringvar.second << DESERIALIZE_PAIR_DELIM;
37 os << serializeJsonStringIfNeeded(os2.str());
40 void ItemStackMetadata::deSerialize(std::istream &is)
42 std::string in = deSerializeJsonStringIfNeeded(is);
47 if (in[0] == DESERIALIZE_START) {
50 while (!fnd.at_end()) {
51 std::string name = fnd.next(DESERIALIZE_KV_DELIM_STR);
52 std::string var = fnd.next(DESERIALIZE_PAIR_DELIM_STR);
53 m_stringvars[name] = var;
56 // BACKWARDS COMPATIBILITY
57 m_stringvars[""] = in;
60 updateToolCapabilities();
63 void ItemStackMetadata::updateToolCapabilities()
65 if (contains(TOOLCAP_KEY)) {
66 toolcaps_overridden = true;
67 toolcaps_override = ToolCapabilities();
68 std::istringstream is(getString(TOOLCAP_KEY));
69 toolcaps_override.deserializeJson(is);
71 toolcaps_overridden = false;
75 void ItemStackMetadata::setToolCapabilities(const ToolCapabilities &caps)
77 std::ostringstream os;
78 caps.serializeJson(os);
79 setString(TOOLCAP_KEY, os.str());
82 void ItemStackMetadata::clearToolCapabilities()
84 setString(TOOLCAP_KEY, "");