122736c2fSopenharmony_ci/* 222736c2fSopenharmony_ci * Copyright (c) 2024 Huawei Device Co., Ltd. 322736c2fSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 422736c2fSopenharmony_ci * you may not use this file except in compliance with the License. 522736c2fSopenharmony_ci * You may obtain a copy of the License at 622736c2fSopenharmony_ci * 722736c2fSopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 822736c2fSopenharmony_ci * 922736c2fSopenharmony_ci * Unless required by applicable law or agreed to in writing, software 1022736c2fSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 1122736c2fSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1222736c2fSopenharmony_ci * See the License for the specific language governing permissions and 1322736c2fSopenharmony_ci * limitations under the License. 1422736c2fSopenharmony_ci */ 1522736c2fSopenharmony_ci 1622736c2fSopenharmony_ci#include "serializable.h" 1722736c2fSopenharmony_ci 1822736c2fSopenharmony_cinamespace OHOS { 1922736c2fSopenharmony_cinamespace MiscServices { 2022736c2fSopenharmony_cibool Serializable::Unmarshall(const std::string &content) 2122736c2fSopenharmony_ci{ 2222736c2fSopenharmony_ci auto root = cJSON_Parse(content.c_str()); 2322736c2fSopenharmony_ci if (root == NULL) { 2422736c2fSopenharmony_ci IMSA_HILOGE("%{public}s: parse failed!", content.c_str()); 2522736c2fSopenharmony_ci return false; 2622736c2fSopenharmony_ci } 2722736c2fSopenharmony_ci auto ret = Unmarshal(root); 2822736c2fSopenharmony_ci cJSON_Delete(root); 2922736c2fSopenharmony_ci return ret; 3022736c2fSopenharmony_ci} 3122736c2fSopenharmony_ci 3222736c2fSopenharmony_cibool Serializable::Marshall(std::string &content) const 3322736c2fSopenharmony_ci{ 3422736c2fSopenharmony_ci cJSON *root = cJSON_CreateObject(); 3522736c2fSopenharmony_ci if (root == NULL) { 3622736c2fSopenharmony_ci return false; 3722736c2fSopenharmony_ci } 3822736c2fSopenharmony_ci auto ret = Marshal(root); 3922736c2fSopenharmony_ci if (!ret) { 4022736c2fSopenharmony_ci cJSON_Delete(root); 4122736c2fSopenharmony_ci return false; 4222736c2fSopenharmony_ci } 4322736c2fSopenharmony_ci auto str = cJSON_PrintUnformatted(root); 4422736c2fSopenharmony_ci if (str == NULL) { 4522736c2fSopenharmony_ci cJSON_Delete(root); 4622736c2fSopenharmony_ci return false; 4722736c2fSopenharmony_ci } 4822736c2fSopenharmony_ci content = str; 4922736c2fSopenharmony_ci cJSON_Delete(root); 5022736c2fSopenharmony_ci cJSON_free(str); 5122736c2fSopenharmony_ci return true; 5222736c2fSopenharmony_ci} 5322736c2fSopenharmony_ci 5422736c2fSopenharmony_cibool Serializable::GetValue(cJSON *node, const std::string &name, std::string &value) 5522736c2fSopenharmony_ci{ 5622736c2fSopenharmony_ci auto subNode = GetSubNode(node, name); 5722736c2fSopenharmony_ci if (subNode == nullptr || !cJSON_IsString(subNode)) { 5822736c2fSopenharmony_ci IMSA_HILOGD("%{public}s not string!", name.c_str()); 5922736c2fSopenharmony_ci return false; 6022736c2fSopenharmony_ci } 6122736c2fSopenharmony_ci value = subNode->valuestring; 6222736c2fSopenharmony_ci return true; 6322736c2fSopenharmony_ci} 6422736c2fSopenharmony_ci 6522736c2fSopenharmony_cibool Serializable::GetValue(cJSON *node, const std::string &name, int32_t &value) 6622736c2fSopenharmony_ci{ 6722736c2fSopenharmony_ci auto subNode = GetSubNode(node, name); 6822736c2fSopenharmony_ci if (subNode == nullptr || !cJSON_IsNumber(subNode)) { 6922736c2fSopenharmony_ci IMSA_HILOGD("%{public}s not number!", name.c_str()); 7022736c2fSopenharmony_ci return false; 7122736c2fSopenharmony_ci } 7222736c2fSopenharmony_ci value = subNode->valueint; 7322736c2fSopenharmony_ci return true; 7422736c2fSopenharmony_ci} 7522736c2fSopenharmony_ci 7622736c2fSopenharmony_cibool Serializable::GetValue(cJSON *node, const std::string &name, uint32_t &value) 7722736c2fSopenharmony_ci{ 7822736c2fSopenharmony_ci auto subNode = GetSubNode(node, name); 7922736c2fSopenharmony_ci if (!cJSON_IsNumber(subNode)) { 8022736c2fSopenharmony_ci IMSA_HILOGD("%{public}s not number", name.c_str()); 8122736c2fSopenharmony_ci return false; 8222736c2fSopenharmony_ci } 8322736c2fSopenharmony_ci // Make sure it's not negative 8422736c2fSopenharmony_ci if (subNode->valueint < 0) { 8522736c2fSopenharmony_ci IMSA_HILOGD("%{public}s is negative", name.c_str()); 8622736c2fSopenharmony_ci return false; 8722736c2fSopenharmony_ci } 8822736c2fSopenharmony_ci value = static_cast<uint32_t>(subNode->valueint); 8922736c2fSopenharmony_ci return true; 9022736c2fSopenharmony_ci} 9122736c2fSopenharmony_ci 9222736c2fSopenharmony_cibool Serializable::GetValue(cJSON *node, const std::string &name, bool &value) 9322736c2fSopenharmony_ci{ 9422736c2fSopenharmony_ci auto subNode = GetSubNode(node, name); 9522736c2fSopenharmony_ci if (subNode == nullptr || !cJSON_IsBool(subNode)) { 9622736c2fSopenharmony_ci IMSA_HILOGD("%{public}s not bool", name.c_str()); 9722736c2fSopenharmony_ci return false; 9822736c2fSopenharmony_ci } 9922736c2fSopenharmony_ci value = subNode->type == cJSON_True; 10022736c2fSopenharmony_ci return true; 10122736c2fSopenharmony_ci} 10222736c2fSopenharmony_ci 10322736c2fSopenharmony_cibool Serializable::GetValue(cJSON *node, const std::string &name, Serializable &value) 10422736c2fSopenharmony_ci{ 10522736c2fSopenharmony_ci auto object = GetSubNode(node, name); 10622736c2fSopenharmony_ci if (object == nullptr || !cJSON_IsObject(object)) { 10722736c2fSopenharmony_ci IMSA_HILOGD("%{public}s not object", name.c_str()); 10822736c2fSopenharmony_ci return false; 10922736c2fSopenharmony_ci } 11022736c2fSopenharmony_ci return value.Unmarshal(object); 11122736c2fSopenharmony_ci} 11222736c2fSopenharmony_ci 11322736c2fSopenharmony_cibool Serializable::SetValue(cJSON *node, const std::string &name, const std::string &value) 11422736c2fSopenharmony_ci{ 11522736c2fSopenharmony_ci auto item = cJSON_AddStringToObject(node, name.c_str(), value.c_str()); 11622736c2fSopenharmony_ci return item != NULL; 11722736c2fSopenharmony_ci} 11822736c2fSopenharmony_ci 11922736c2fSopenharmony_cibool Serializable::SetValue(cJSON *node, const std::string &name, const int32_t &value) 12022736c2fSopenharmony_ci{ 12122736c2fSopenharmony_ci auto item = cJSON_AddNumberToObject(node, name.c_str(), value); 12222736c2fSopenharmony_ci return item != NULL; 12322736c2fSopenharmony_ci} 12422736c2fSopenharmony_ci 12522736c2fSopenharmony_cicJSON *Serializable::GetSubNode(cJSON *node, const std::string &name) 12622736c2fSopenharmony_ci{ 12722736c2fSopenharmony_ci if (name.empty()) { 12822736c2fSopenharmony_ci IMSA_HILOGD("end node."); 12922736c2fSopenharmony_ci return node; 13022736c2fSopenharmony_ci } 13122736c2fSopenharmony_ci if (!cJSON_IsObject(node)) { 13222736c2fSopenharmony_ci IMSA_HILOGD("not object, name:%{public}s", name.c_str()); 13322736c2fSopenharmony_ci return nullptr; 13422736c2fSopenharmony_ci } 13522736c2fSopenharmony_ci if (!cJSON_HasObjectItem(node, name.c_str())) { 13622736c2fSopenharmony_ci IMSA_HILOGD("subNode: %{public}s not contain.", name.c_str()); 13722736c2fSopenharmony_ci return nullptr; 13822736c2fSopenharmony_ci } 13922736c2fSopenharmony_ci return cJSON_GetObjectItem(node, name.c_str()); 14022736c2fSopenharmony_ci} 14122736c2fSopenharmony_ci} // namespace MiscServices 14222736c2fSopenharmony_ci} // namespace OHOS