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