diff --git a/include/opendht/value.h b/include/opendht/value.h index b7452aa19b9b1ad7721e373ee9ad38a38ed41f13..f191cf082103202b95a59fc4acbb2d742e2c6688 100644 --- a/include/opendht/value.h +++ b/include/opendht/value.h @@ -43,7 +43,19 @@ namespace dht { +static const std::string VALUE_KEY_ID("id"); +static const std::string VALUE_KEY_DAT("dat"); static const std::string VALUE_KEY_PRIO("p"); +static const std::string VALUE_KEY_SIGNATURE("sig"); + +static const std::string VALUE_KEY_SEQ("seq"); +static const std::string VALUE_KEY_DATA("data"); +static const std::string VALUE_KEY_OWNER("owner"); +static const std::string VALUE_KEY_TYPE("type"); +static const std::string VALUE_KEY_TO("to"); +static const std::string VALUE_KEY_BODY("body"); +static const std::string VALUE_KEY_USERTYPE("utype"); + struct Value; struct Query; @@ -488,17 +500,17 @@ struct OPENDHT_PUBLIC Value bool has_owner = owner && *owner; pk.pack_map((user_type.empty()?0:1) + (has_owner?(recipient ? 5 : 4):2)); if (has_owner) { // isSigned - pk.pack(std::string("seq")); pk.pack(seq); - pk.pack(std::string("owner")); owner->msgpack_pack(pk); + pk.pack(VALUE_KEY_SEQ); pk.pack(seq); + pk.pack(VALUE_KEY_OWNER); owner->msgpack_pack(pk); if (recipient) { - pk.pack(std::string("to")); pk.pack(recipient); + pk.pack(VALUE_KEY_TO); pk.pack(recipient); } } - pk.pack(std::string("type")); pk.pack(type); - pk.pack(std::string("data")); pk.pack_bin(data.size()); - pk.pack_bin_body((const char*)data.data(), data.size()); + pk.pack(VALUE_KEY_TYPE); pk.pack(type); + pk.pack(VALUE_KEY_DATA); pk.pack_bin(data.size()); + pk.pack_bin_body((const char*)data.data(), data.size()); if (not user_type.empty()) { - pk.pack(std::string("utype")); pk.pack(user_type); + pk.pack(VALUE_KEY_USERTYPE); pk.pack(user_type); } } @@ -510,10 +522,10 @@ struct OPENDHT_PUBLIC Value pk.pack_bin_body((const char*)cypher.data(), cypher.size()); } else { pk.pack_map(isSigned() ? 2 : 1); - pk.pack(std::string("body")); msgpack_pack_to_sign(pk); + pk.pack(VALUE_KEY_BODY); msgpack_pack_to_sign(pk); if (isSigned()) { - pk.pack(std::string("sig")); pk.pack_bin(signature.size()); - pk.pack_bin_body((const char*)signature.data(), signature.size()); + pk.pack(VALUE_KEY_SIGNATURE); pk.pack_bin(signature.size()); + pk.pack_bin_body((const char*)signature.data(), signature.size()); } } } @@ -522,8 +534,8 @@ struct OPENDHT_PUBLIC Value void msgpack_pack(Packer& pk) const { pk.pack_map(2 + (priority?1:0)); - pk.pack(std::string("id")); pk.pack(id); - pk.pack(std::string("dat")); msgpack_pack_to_encrypt(pk); + pk.pack(VALUE_KEY_ID); pk.pack(id); + pk.pack(VALUE_KEY_DAT); msgpack_pack_to_encrypt(pk); if (priority) { pk.pack(VALUE_KEY_PRIO); pk.pack(priority); } diff --git a/src/value.cpp b/src/value.cpp index 181b17d676d0e7a9224c9b45f8fdb3964b2072aa..ac2c8782327236da0b4a55353ba85eccf01244d2 100644 --- a/src/value.cpp +++ b/src/value.cpp @@ -96,15 +96,15 @@ Value::size() const void Value::msgpack_unpack(const msgpack::object& o) { - if (o.type != msgpack::type::MAP) throw msgpack::type_error(); - if (o.via.map.size < 2) throw msgpack::type_error(); + if (o.type != msgpack::type::MAP or o.via.map.size < 2) + throw msgpack::type_error(); - if (auto rid = findMapValue(o, "id")) { + if (auto rid = findMapValue(o, VALUE_KEY_ID)) { id = rid->as<Id>(); } else throw msgpack::type_error(); - if (auto rdat = findMapValue(o, "dat")) { + if (auto rdat = findMapValue(o, VALUE_KEY_DAT)) { msgpack_unpack_body(*rdat); } else throw msgpack::type_error(); @@ -130,37 +130,37 @@ Value::msgpack_unpack_body(const msgpack::object& o) } else { if (o.type != msgpack::type::MAP) throw msgpack::type_error(); - auto rbody = findMapValue(o, "body"); + auto rbody = findMapValue(o, VALUE_KEY_BODY); if (not rbody) throw msgpack::type_error(); - if (auto rdata = findMapValue(*rbody, "data")) { + if (auto rdata = findMapValue(*rbody, VALUE_KEY_DATA)) { data = unpackBlob(*rdata); } else throw msgpack::type_error(); - if (auto rtype = findMapValue(*rbody, "type")) { + if (auto rtype = findMapValue(*rbody, VALUE_KEY_TYPE)) { type = rtype->as<ValueType::Id>(); } else throw msgpack::type_error(); - if (auto rutype = findMapValue(*rbody, "utype")) { + if (auto rutype = findMapValue(*rbody, VALUE_KEY_USERTYPE)) { user_type = rutype->as<std::string>(); } - if (auto rowner = findMapValue(*rbody, "owner")) { - if (auto rseq = findMapValue(*rbody, "seq")) + if (auto rowner = findMapValue(*rbody, VALUE_KEY_OWNER)) { + if (auto rseq = findMapValue(*rbody, VALUE_KEY_SEQ)) seq = rseq->as<decltype(seq)>(); else throw msgpack::type_error(); crypto::PublicKey new_owner; new_owner.msgpack_unpack(*rowner); owner = std::make_shared<const crypto::PublicKey>(std::move(new_owner)); - if (auto rrecipient = findMapValue(*rbody, "to")) { + if (auto rrecipient = findMapValue(*rbody, VALUE_KEY_TO)) { recipient = rrecipient->as<InfoHash>(); } - if (auto rsig = findMapValue(o, "sig")) { + if (auto rsig = findMapValue(o, VALUE_KEY_SIGNATURE)) { signature = unpackBlob(*rsig); } else throw msgpack::type_error(); @@ -171,32 +171,32 @@ Value::msgpack_unpack_body(const msgpack::object& o) #ifdef OPENDHT_JSONCPP Value::Value(const Json::Value& json) { - id = Value::Id(unpackId(json, "id")); + id = Value::Id(unpackId(json, VALUE_KEY_ID)); const auto& jcypher = json["cypher"]; if (jcypher.isString()) cypher = base64_decode(jcypher.asString()); - const auto& jsig = json["sig"]; + const auto& jsig = json[VALUE_KEY_SIGNATURE]; if (jsig.isString()) signature = base64_decode(jsig.asString()); - const auto& jseq = json["seq"]; + const auto& jseq = json[VALUE_KEY_SEQ]; if (!jseq.isNull()) seq = jseq.asInt(); - const auto& jowner = json["owner"]; + const auto& jowner = json[VALUE_KEY_OWNER]; if (jowner.isString()) { auto ownerStr = jowner.asString(); auto ownerBlob = std::vector<unsigned char>(ownerStr.begin(), ownerStr.end()); owner = std::make_shared<const crypto::PublicKey>(ownerBlob); } - const auto& jto = json["to"]; + const auto& jto = json[VALUE_KEY_TO]; if (jto.isString()) recipient = InfoHash(jto.asString()); - const auto& jtype = json["type"]; + const auto& jtype = json[VALUE_KEY_TYPE]; if (!jtype.isNull()) type = jtype.asInt(); - const auto& jdata = json["data"]; + const auto& jdata = json[VALUE_KEY_DATA]; if (jdata.isString()) data = base64_decode(jdata.asString()); - const auto& jutype = json["utype"]; + const auto& jutype = json[VALUE_KEY_USERTYPE]; if (jutype.isString()) user_type = jutype.asString(); const auto& jprio = json["prio"]; @@ -208,23 +208,23 @@ Json::Value Value::toJson() const { Json::Value val; - val["id"] = std::to_string(id); + val[VALUE_KEY_ID] = std::to_string(id); if (isEncrypted()) { val["cypher"] = base64_encode(cypher); } else { if (isSigned()) - val["sig"] = base64_encode(signature); + val[VALUE_KEY_SIGNATURE] = base64_encode(signature); bool has_owner = owner && *owner; if (has_owner) { // isSigned - val["seq"] = seq; - val["owner"] = owner->toString(); + val[VALUE_KEY_SEQ] = seq; + val[VALUE_KEY_OWNER] = owner->toString(); if (recipient) - val["to"] = recipient.toString(); + val[VALUE_KEY_TO] = recipient.toString(); } - val["type"] = type; - val["data"] = base64_encode(data); + val[VALUE_KEY_TYPE] = type; + val[VALUE_KEY_DATA] = base64_encode(data); if (not user_type.empty()) - val["utype"] = user_type; + val[VALUE_KEY_USERTYPE] = user_type; } if (priority) val["prio"] = priority; @@ -235,13 +235,11 @@ uint64_t unpackId(const Json::Value& json, const std::string& key) { uint64_t ret = 0; try { - if (json.isMember(key)) { - const auto& t = json[key]; - if (t.isString()) { - ret = std::stoull(t.asString()); - } else { - ret = t.asLargestUInt(); - } + const auto& t = json[key]; + if (t.isString()) { + ret = std::stoull(t.asString()); + } else { + ret = t.asLargestUInt(); } } catch (...) {} return ret; @@ -411,13 +409,13 @@ Select::Select(const std::string& q_str) { while (std::getline(fields, token, ',')) { trim_str(token); - if (token == "id") + if (token == VALUE_KEY_ID) field(Value::Field::Id); else if (token == "value_type") field(Value::Field::ValueType); else if (token == "owner_pk") field(Value::Field::OwnerPk); - if (token == "seq") + if (token == VALUE_KEY_SEQ) field(Value::Field::SeqNum); else if (token == "user_type") field(Value::Field::UserType); @@ -453,13 +451,13 @@ Where::Where(const std::string& q_str) { s = value_str.substr(1, value_str.size()-2); else s = value_str; - if (field_str == "id") + if (field_str == VALUE_KEY_ID) id(v); else if (field_str == "value_type") valueType(v); else if (field_str == "owner_pk") owner(InfoHash(s)); - else if (field_str == "seq") + else if (field_str == VALUE_KEY_SEQ) seq(v); else if (field_str == "user_type") userType(s); @@ -519,7 +517,7 @@ std::ostream& operator<<(std::ostream& s, const dht::Select& select) { for (auto fs = select.fieldSelection_.begin() ; fs != select.fieldSelection_.end() ; ++fs) { switch (*fs) { case Value::Field::Id: - s << "id"; + s << VALUE_KEY_ID; break; case Value::Field::ValueType: s << "value_type"; @@ -531,7 +529,7 @@ std::ostream& operator<<(std::ostream& s, const dht::Select& select) { s << "owner_public_key"; break; case Value::Field::SeqNum: - s << "seq"; + s << VALUE_KEY_SEQ; break; default: break;