1bc03f14fSopenharmony_ci/* 2bc03f14fSopenharmony_ci * Copyright (c) 2022-2023 Huawei Device Co., Ltd. 3bc03f14fSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 4bc03f14fSopenharmony_ci * you may not use this file except in compliance with the License. 5bc03f14fSopenharmony_ci * You may obtain a copy of the License at 6bc03f14fSopenharmony_ci * 7bc03f14fSopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 8bc03f14fSopenharmony_ci * 9bc03f14fSopenharmony_ci * Unless required by applicable law or agreed to in writing, software 10bc03f14fSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 11bc03f14fSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12bc03f14fSopenharmony_ci * See the License for the specific language governing permissions and 13bc03f14fSopenharmony_ci * limitations under the License. 14bc03f14fSopenharmony_ci */ 15bc03f14fSopenharmony_ci 16bc03f14fSopenharmony_ci#include "serializable/serializable.h" 17bc03f14fSopenharmony_cinamespace OHOS { 18bc03f14fSopenharmony_cinamespace DistributedData { 19bc03f14fSopenharmony_cibool Serializable::Unmarshall(const std::string &jsonStr) 20bc03f14fSopenharmony_ci{ 21bc03f14fSopenharmony_ci json jsonObj = cJSON_Parse(jsonStr.c_str()); 22bc03f14fSopenharmony_ci auto result = false; 23bc03f14fSopenharmony_ci if (jsonObj != nullptr) { 24bc03f14fSopenharmony_ci result = Unmarshal(jsonObj); 25bc03f14fSopenharmony_ci cJSON_Delete(jsonObj); 26bc03f14fSopenharmony_ci } 27bc03f14fSopenharmony_ci return result; 28bc03f14fSopenharmony_ci} 29bc03f14fSopenharmony_ci 30bc03f14fSopenharmony_cistd::string Serializable::Marshall() const 31bc03f14fSopenharmony_ci{ 32bc03f14fSopenharmony_ci json node; 33bc03f14fSopenharmony_ci Marshal(node); 34bc03f14fSopenharmony_ci char *value = cJSON_PrintUnformatted(node); 35bc03f14fSopenharmony_ci std::string result; 36bc03f14fSopenharmony_ci if (value != nullptr) { 37bc03f14fSopenharmony_ci result = std::string(value); 38bc03f14fSopenharmony_ci cJSON_free(value); 39bc03f14fSopenharmony_ci } 40bc03f14fSopenharmony_ci return result; 41bc03f14fSopenharmony_ci} 42bc03f14fSopenharmony_ci 43bc03f14fSopenharmony_cibool Serializable::GetValue(const json node, const std::string &name, std::string &value) 44bc03f14fSopenharmony_ci{ 45bc03f14fSopenharmony_ci auto subNode = GetSubNode(node, name); 46bc03f14fSopenharmony_ci if (!cJSON_IsString(subNode)) { 47bc03f14fSopenharmony_ci return false; 48bc03f14fSopenharmony_ci } 49bc03f14fSopenharmony_ci value = cJSON_GetStringValue(subNode); 50bc03f14fSopenharmony_ci return true; 51bc03f14fSopenharmony_ci} 52bc03f14fSopenharmony_ci 53bc03f14fSopenharmony_cibool Serializable::GetValue(const json node, const std::string &name, uint8_t &value) 54bc03f14fSopenharmony_ci{ 55bc03f14fSopenharmony_ci return GetNumber(node, name, value); 56bc03f14fSopenharmony_ci} 57bc03f14fSopenharmony_ci 58bc03f14fSopenharmony_cibool Serializable::GetValue(const json node, const std::string &name, uint16_t &value) 59bc03f14fSopenharmony_ci{ 60bc03f14fSopenharmony_ci return GetNumber(node, name, value); 61bc03f14fSopenharmony_ci} 62bc03f14fSopenharmony_ci 63bc03f14fSopenharmony_cibool Serializable::GetValue(const json node, const std::string &name, uint32_t &value) 64bc03f14fSopenharmony_ci{ 65bc03f14fSopenharmony_ci return GetNumber(node, name, value); 66bc03f14fSopenharmony_ci} 67bc03f14fSopenharmony_ci 68bc03f14fSopenharmony_cibool Serializable::GetValue(const json node, const std::string &name, uint64_t &value) 69bc03f14fSopenharmony_ci{ 70bc03f14fSopenharmony_ci return GetNumber(node, name, value); 71bc03f14fSopenharmony_ci} 72bc03f14fSopenharmony_ci 73bc03f14fSopenharmony_cibool Serializable::GetValue(const json node, const std::string &name, int32_t &value) 74bc03f14fSopenharmony_ci{ 75bc03f14fSopenharmony_ci return GetNumber(node, name, value); 76bc03f14fSopenharmony_ci} 77bc03f14fSopenharmony_ci 78bc03f14fSopenharmony_cibool Serializable::GetValue(const json node, const std::string &name, int64_t &value) 79bc03f14fSopenharmony_ci{ 80bc03f14fSopenharmony_ci return GetNumber(node, name, value); 81bc03f14fSopenharmony_ci} 82bc03f14fSopenharmony_ci 83bc03f14fSopenharmony_cibool Serializable::GetValue(const json node, const std::string &name, bool &value) 84bc03f14fSopenharmony_ci{ 85bc03f14fSopenharmony_ci auto subNode = GetSubNode(node, name); 86bc03f14fSopenharmony_ci if (!cJSON_IsBool(subNode)) { 87bc03f14fSopenharmony_ci return false; 88bc03f14fSopenharmony_ci } 89bc03f14fSopenharmony_ci value = cJSON_IsTrue(subNode); 90bc03f14fSopenharmony_ci return true; 91bc03f14fSopenharmony_ci} 92bc03f14fSopenharmony_ci 93bc03f14fSopenharmony_cibool Serializable::GetValue(const json node, const std::string &name, std::vector<uint8_t> &value) 94bc03f14fSopenharmony_ci{ 95bc03f14fSopenharmony_ci auto subNode = GetSubNode(node, name); 96bc03f14fSopenharmony_ci if (!cJSON_IsArray(subNode)) { 97bc03f14fSopenharmony_ci return false; 98bc03f14fSopenharmony_ci } 99bc03f14fSopenharmony_ci auto arraySize = cJSON_GetArraySize(subNode); 100bc03f14fSopenharmony_ci for (int i = 0; i < arraySize; i++) { 101bc03f14fSopenharmony_ci value.emplace_back(cJSON_GetNumberValue(cJSON_GetArrayItem(subNode, i))); 102bc03f14fSopenharmony_ci } 103bc03f14fSopenharmony_ci return true; 104bc03f14fSopenharmony_ci} 105bc03f14fSopenharmony_ci 106bc03f14fSopenharmony_cibool Serializable::GetValue(const json node, const std::string &name, Serializable &value) 107bc03f14fSopenharmony_ci{ 108bc03f14fSopenharmony_ci auto subNode = GetSubNode(node, name); 109bc03f14fSopenharmony_ci if (!cJSON_IsObject(subNode)) { 110bc03f14fSopenharmony_ci return false; 111bc03f14fSopenharmony_ci } 112bc03f14fSopenharmony_ci return value.Unmarshal(subNode); 113bc03f14fSopenharmony_ci} 114bc03f14fSopenharmony_ci 115bc03f14fSopenharmony_cibool Serializable::SetValue(json &node, const std::string &value, const std::string &name) 116bc03f14fSopenharmony_ci{ 117bc03f14fSopenharmony_ci json subNode = cJSON_CreateString(value.c_str()); 118bc03f14fSopenharmony_ci if (name.empty()) { 119bc03f14fSopenharmony_ci node = subNode; 120bc03f14fSopenharmony_ci return true; 121bc03f14fSopenharmony_ci } 122bc03f14fSopenharmony_ci SetValueToObject(node, subNode, name); 123bc03f14fSopenharmony_ci return true; 124bc03f14fSopenharmony_ci} 125bc03f14fSopenharmony_ci 126bc03f14fSopenharmony_cibool Serializable::SetValue(json &node, const uint8_t &value, const std::string &name) 127bc03f14fSopenharmony_ci{ 128bc03f14fSopenharmony_ci return SetNumber(node, value, name); 129bc03f14fSopenharmony_ci} 130bc03f14fSopenharmony_ci 131bc03f14fSopenharmony_cibool Serializable::SetValue(json &node, const uint16_t &value, const std::string &name) 132bc03f14fSopenharmony_ci{ 133bc03f14fSopenharmony_ci return SetNumber(node, value, name); 134bc03f14fSopenharmony_ci} 135bc03f14fSopenharmony_ci 136bc03f14fSopenharmony_cibool Serializable::SetValue(json &node, const uint32_t &value, const std::string &name) 137bc03f14fSopenharmony_ci{ 138bc03f14fSopenharmony_ci return SetNumber(node, value, name); 139bc03f14fSopenharmony_ci} 140bc03f14fSopenharmony_ci 141bc03f14fSopenharmony_cibool Serializable::SetValue(json &node, const uint64_t &value, const std::string &name) 142bc03f14fSopenharmony_ci{ 143bc03f14fSopenharmony_ci return SetNumber(node, value, name); 144bc03f14fSopenharmony_ci} 145bc03f14fSopenharmony_ci 146bc03f14fSopenharmony_cibool Serializable::SetValue(json &node, const int32_t &value, const std::string &name) 147bc03f14fSopenharmony_ci{ 148bc03f14fSopenharmony_ci return SetNumber(node, value, name); 149bc03f14fSopenharmony_ci} 150bc03f14fSopenharmony_ci 151bc03f14fSopenharmony_cibool Serializable::SetValue(json &node, const int64_t &value, const std::string &name) 152bc03f14fSopenharmony_ci{ 153bc03f14fSopenharmony_ci return SetNumber(node, value, name); 154bc03f14fSopenharmony_ci} 155bc03f14fSopenharmony_ci 156bc03f14fSopenharmony_cibool Serializable::SetValue(json &node, const bool &value, const std::string &name) 157bc03f14fSopenharmony_ci{ 158bc03f14fSopenharmony_ci json subNode = cJSON_CreateBool(value); 159bc03f14fSopenharmony_ci if (name.empty()) { 160bc03f14fSopenharmony_ci node = subNode; 161bc03f14fSopenharmony_ci return true; 162bc03f14fSopenharmony_ci } 163bc03f14fSopenharmony_ci SetValueToObject(node, subNode, name); 164bc03f14fSopenharmony_ci return true; 165bc03f14fSopenharmony_ci} 166bc03f14fSopenharmony_ci 167bc03f14fSopenharmony_cibool Serializable::SetValue(json &node, const std::vector<uint8_t> &value, const std::string &name) 168bc03f14fSopenharmony_ci{ 169bc03f14fSopenharmony_ci json subNode = cJSON_CreateArray(); 170bc03f14fSopenharmony_ci for (const uint8_t &item : value) { 171bc03f14fSopenharmony_ci cJSON_AddItemToArray(subNode, cJSON_CreateNumber(item)); 172bc03f14fSopenharmony_ci } 173bc03f14fSopenharmony_ci if (name.empty()) { 174bc03f14fSopenharmony_ci node = subNode; 175bc03f14fSopenharmony_ci return true; 176bc03f14fSopenharmony_ci } 177bc03f14fSopenharmony_ci SetValueToObject(node, subNode, name); 178bc03f14fSopenharmony_ci return true; 179bc03f14fSopenharmony_ci} 180bc03f14fSopenharmony_ci 181bc03f14fSopenharmony_cibool Serializable::SetValue(json &node, const Serializable &value, const std::string &name) 182bc03f14fSopenharmony_ci{ 183bc03f14fSopenharmony_ci json subNode = nullptr; 184bc03f14fSopenharmony_ci if (!value.Marshal(subNode)) { 185bc03f14fSopenharmony_ci cJSON_Delete(subNode); 186bc03f14fSopenharmony_ci return false; 187bc03f14fSopenharmony_ci } 188bc03f14fSopenharmony_ci if (name.empty()) { 189bc03f14fSopenharmony_ci node = subNode; 190bc03f14fSopenharmony_ci return true; 191bc03f14fSopenharmony_ci } 192bc03f14fSopenharmony_ci SetValueToObject(node, subNode, name); 193bc03f14fSopenharmony_ci return true; 194bc03f14fSopenharmony_ci} 195bc03f14fSopenharmony_ci 196bc03f14fSopenharmony_ciSerializable::json Serializable::GetSubNode(const json node, const std::string &name) 197bc03f14fSopenharmony_ci{ 198bc03f14fSopenharmony_ci if (cJSON_IsNull(node)) { 199bc03f14fSopenharmony_ci return nullptr; 200bc03f14fSopenharmony_ci } 201bc03f14fSopenharmony_ci 202bc03f14fSopenharmony_ci if (name.empty()) { 203bc03f14fSopenharmony_ci return node; 204bc03f14fSopenharmony_ci } 205bc03f14fSopenharmony_ci if (!cJSON_HasObjectItem(node, name.c_str())) { 206bc03f14fSopenharmony_ci return nullptr; 207bc03f14fSopenharmony_ci } 208bc03f14fSopenharmony_ci 209bc03f14fSopenharmony_ci return cJSON_GetObjectItem(node, name.c_str()); 210bc03f14fSopenharmony_ci} 211bc03f14fSopenharmony_ci} // namespace DistributedData 212bc03f14fSopenharmony_ci} // namespace OHOS