xref: /aosp_15_r20/external/ot-br-posix/src/rest/json.cpp (revision 4a64e381480ef79f0532b2421e44e6ee336b8e0d)
1*4a64e381SAndroid Build Coastguard Worker /*
2*4a64e381SAndroid Build Coastguard Worker  *  Copyright (c) 2020, The OpenThread Authors.
3*4a64e381SAndroid Build Coastguard Worker  *  All rights reserved.
4*4a64e381SAndroid Build Coastguard Worker  *
5*4a64e381SAndroid Build Coastguard Worker  *  Redistribution and use in source and binary forms, with or without
6*4a64e381SAndroid Build Coastguard Worker  *  modification, are permitted provided that the following conditions are met:
7*4a64e381SAndroid Build Coastguard Worker  *  1. Redistributions of source code must retain the above copyright
8*4a64e381SAndroid Build Coastguard Worker  *     notice, this list of conditions and the following disclaimer.
9*4a64e381SAndroid Build Coastguard Worker  *  2. Redistributions in binary form must reproduce the above copyright
10*4a64e381SAndroid Build Coastguard Worker  *     notice, this list of conditions and the following disclaimer in the
11*4a64e381SAndroid Build Coastguard Worker  *     documentation and/or other materials provided with the distribution.
12*4a64e381SAndroid Build Coastguard Worker  *  3. Neither the name of the copyright holder nor the
13*4a64e381SAndroid Build Coastguard Worker  *     names of its contributors may be used to endorse or promote products
14*4a64e381SAndroid Build Coastguard Worker  *     derived from this software without specific prior written permission.
15*4a64e381SAndroid Build Coastguard Worker  *
16*4a64e381SAndroid Build Coastguard Worker  *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
17*4a64e381SAndroid Build Coastguard Worker  *  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18*4a64e381SAndroid Build Coastguard Worker  *  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19*4a64e381SAndroid Build Coastguard Worker  *  ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
20*4a64e381SAndroid Build Coastguard Worker  *  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21*4a64e381SAndroid Build Coastguard Worker  *  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22*4a64e381SAndroid Build Coastguard Worker  *  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23*4a64e381SAndroid Build Coastguard Worker  *  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24*4a64e381SAndroid Build Coastguard Worker  *  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25*4a64e381SAndroid Build Coastguard Worker  *  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26*4a64e381SAndroid Build Coastguard Worker  *  POSSIBILITY OF SUCH DAMAGE.
27*4a64e381SAndroid Build Coastguard Worker  */
28*4a64e381SAndroid Build Coastguard Worker 
29*4a64e381SAndroid Build Coastguard Worker #include "rest/json.hpp"
30*4a64e381SAndroid Build Coastguard Worker #include <sstream>
31*4a64e381SAndroid Build Coastguard Worker 
32*4a64e381SAndroid Build Coastguard Worker #include "common/code_utils.hpp"
33*4a64e381SAndroid Build Coastguard Worker #include "common/types.hpp"
34*4a64e381SAndroid Build Coastguard Worker 
35*4a64e381SAndroid Build Coastguard Worker extern "C" {
36*4a64e381SAndroid Build Coastguard Worker #include <cJSON.h>
37*4a64e381SAndroid Build Coastguard Worker }
38*4a64e381SAndroid Build Coastguard Worker 
39*4a64e381SAndroid Build Coastguard Worker namespace otbr {
40*4a64e381SAndroid Build Coastguard Worker namespace rest {
41*4a64e381SAndroid Build Coastguard Worker namespace Json {
42*4a64e381SAndroid Build Coastguard Worker 
Bytes2HexJson(const uint8_t * aBytes,uint8_t aLength)43*4a64e381SAndroid Build Coastguard Worker static cJSON *Bytes2HexJson(const uint8_t *aBytes, uint8_t aLength)
44*4a64e381SAndroid Build Coastguard Worker {
45*4a64e381SAndroid Build Coastguard Worker     char hex[2 * aLength + 1];
46*4a64e381SAndroid Build Coastguard Worker 
47*4a64e381SAndroid Build Coastguard Worker     otbr::Utils::Bytes2Hex(aBytes, aLength, hex);
48*4a64e381SAndroid Build Coastguard Worker     hex[2 * aLength] = '\0';
49*4a64e381SAndroid Build Coastguard Worker 
50*4a64e381SAndroid Build Coastguard Worker     return cJSON_CreateString(hex);
51*4a64e381SAndroid Build Coastguard Worker }
52*4a64e381SAndroid Build Coastguard Worker 
String2JsonString(const std::string & aString)53*4a64e381SAndroid Build Coastguard Worker std::string String2JsonString(const std::string &aString)
54*4a64e381SAndroid Build Coastguard Worker {
55*4a64e381SAndroid Build Coastguard Worker     std::string ret;
56*4a64e381SAndroid Build Coastguard Worker     cJSON      *json    = nullptr;
57*4a64e381SAndroid Build Coastguard Worker     char       *jsonOut = nullptr;
58*4a64e381SAndroid Build Coastguard Worker 
59*4a64e381SAndroid Build Coastguard Worker     VerifyOrExit(aString.size() > 0);
60*4a64e381SAndroid Build Coastguard Worker 
61*4a64e381SAndroid Build Coastguard Worker     json    = cJSON_CreateString(aString.c_str());
62*4a64e381SAndroid Build Coastguard Worker     jsonOut = cJSON_Print(json);
63*4a64e381SAndroid Build Coastguard Worker     ret     = jsonOut;
64*4a64e381SAndroid Build Coastguard Worker     if (jsonOut != nullptr)
65*4a64e381SAndroid Build Coastguard Worker     {
66*4a64e381SAndroid Build Coastguard Worker         cJSON_free(jsonOut);
67*4a64e381SAndroid Build Coastguard Worker         jsonOut = nullptr;
68*4a64e381SAndroid Build Coastguard Worker     }
69*4a64e381SAndroid Build Coastguard Worker 
70*4a64e381SAndroid Build Coastguard Worker     cJSON_Delete(json);
71*4a64e381SAndroid Build Coastguard Worker 
72*4a64e381SAndroid Build Coastguard Worker exit:
73*4a64e381SAndroid Build Coastguard Worker     return ret;
74*4a64e381SAndroid Build Coastguard Worker }
75*4a64e381SAndroid Build Coastguard Worker 
JsonString2String(const std::string & aJsonString,std::string & aString)76*4a64e381SAndroid Build Coastguard Worker bool JsonString2String(const std::string &aJsonString, std::string &aString)
77*4a64e381SAndroid Build Coastguard Worker {
78*4a64e381SAndroid Build Coastguard Worker     cJSON *jsonString;
79*4a64e381SAndroid Build Coastguard Worker     bool   ret = true;
80*4a64e381SAndroid Build Coastguard Worker 
81*4a64e381SAndroid Build Coastguard Worker     VerifyOrExit((jsonString = cJSON_Parse(aJsonString.c_str())) != nullptr, ret = false);
82*4a64e381SAndroid Build Coastguard Worker     VerifyOrExit(cJSON_IsString(jsonString), ret = false);
83*4a64e381SAndroid Build Coastguard Worker 
84*4a64e381SAndroid Build Coastguard Worker     aString = std::string(jsonString->valuestring);
85*4a64e381SAndroid Build Coastguard Worker 
86*4a64e381SAndroid Build Coastguard Worker exit:
87*4a64e381SAndroid Build Coastguard Worker     cJSON_Delete(jsonString);
88*4a64e381SAndroid Build Coastguard Worker 
89*4a64e381SAndroid Build Coastguard Worker     return ret;
90*4a64e381SAndroid Build Coastguard Worker }
91*4a64e381SAndroid Build Coastguard Worker 
Json2String(const cJSON * aJson)92*4a64e381SAndroid Build Coastguard Worker std::string Json2String(const cJSON *aJson)
93*4a64e381SAndroid Build Coastguard Worker {
94*4a64e381SAndroid Build Coastguard Worker     std::string ret;
95*4a64e381SAndroid Build Coastguard Worker     char       *jsonOut = nullptr;
96*4a64e381SAndroid Build Coastguard Worker 
97*4a64e381SAndroid Build Coastguard Worker     VerifyOrExit(aJson != nullptr);
98*4a64e381SAndroid Build Coastguard Worker 
99*4a64e381SAndroid Build Coastguard Worker     jsonOut = cJSON_Print(aJson);
100*4a64e381SAndroid Build Coastguard Worker     ret     = jsonOut;
101*4a64e381SAndroid Build Coastguard Worker     if (jsonOut != nullptr)
102*4a64e381SAndroid Build Coastguard Worker     {
103*4a64e381SAndroid Build Coastguard Worker         cJSON_free(jsonOut);
104*4a64e381SAndroid Build Coastguard Worker         jsonOut = nullptr;
105*4a64e381SAndroid Build Coastguard Worker     }
106*4a64e381SAndroid Build Coastguard Worker 
107*4a64e381SAndroid Build Coastguard Worker exit:
108*4a64e381SAndroid Build Coastguard Worker     return ret;
109*4a64e381SAndroid Build Coastguard Worker }
110*4a64e381SAndroid Build Coastguard Worker 
CString2Json(const char * aString)111*4a64e381SAndroid Build Coastguard Worker static cJSON *CString2Json(const char *aString)
112*4a64e381SAndroid Build Coastguard Worker {
113*4a64e381SAndroid Build Coastguard Worker     return cJSON_CreateString(aString);
114*4a64e381SAndroid Build Coastguard Worker }
115*4a64e381SAndroid Build Coastguard Worker 
Mode2Json(const otLinkModeConfig & aMode)116*4a64e381SAndroid Build Coastguard Worker static cJSON *Mode2Json(const otLinkModeConfig &aMode)
117*4a64e381SAndroid Build Coastguard Worker {
118*4a64e381SAndroid Build Coastguard Worker     cJSON *mode = cJSON_CreateObject();
119*4a64e381SAndroid Build Coastguard Worker 
120*4a64e381SAndroid Build Coastguard Worker     cJSON_AddItemToObject(mode, "RxOnWhenIdle", cJSON_CreateNumber(aMode.mRxOnWhenIdle));
121*4a64e381SAndroid Build Coastguard Worker     cJSON_AddItemToObject(mode, "DeviceType", cJSON_CreateNumber(aMode.mDeviceType));
122*4a64e381SAndroid Build Coastguard Worker     cJSON_AddItemToObject(mode, "NetworkData", cJSON_CreateNumber(aMode.mNetworkData));
123*4a64e381SAndroid Build Coastguard Worker 
124*4a64e381SAndroid Build Coastguard Worker     return mode;
125*4a64e381SAndroid Build Coastguard Worker }
126*4a64e381SAndroid Build Coastguard Worker 
IpAddr2Json(const otIp6Address & aAddress)127*4a64e381SAndroid Build Coastguard Worker static cJSON *IpAddr2Json(const otIp6Address &aAddress)
128*4a64e381SAndroid Build Coastguard Worker {
129*4a64e381SAndroid Build Coastguard Worker     Ip6Address addr(aAddress.mFields.m8);
130*4a64e381SAndroid Build Coastguard Worker 
131*4a64e381SAndroid Build Coastguard Worker     return cJSON_CreateString(addr.ToString().c_str());
132*4a64e381SAndroid Build Coastguard Worker }
133*4a64e381SAndroid Build Coastguard Worker 
IpPrefix2Json(const otIp6NetworkPrefix & aAddress)134*4a64e381SAndroid Build Coastguard Worker static cJSON *IpPrefix2Json(const otIp6NetworkPrefix &aAddress)
135*4a64e381SAndroid Build Coastguard Worker {
136*4a64e381SAndroid Build Coastguard Worker     std::stringstream ss;
137*4a64e381SAndroid Build Coastguard Worker     otIp6Address      address = {};
138*4a64e381SAndroid Build Coastguard Worker 
139*4a64e381SAndroid Build Coastguard Worker     address.mFields.mComponents.mNetworkPrefix = aAddress;
140*4a64e381SAndroid Build Coastguard Worker     Ip6Address addr(address.mFields.m8);
141*4a64e381SAndroid Build Coastguard Worker 
142*4a64e381SAndroid Build Coastguard Worker     ss << addr.ToString() << "/" << OT_IP6_PREFIX_BITSIZE;
143*4a64e381SAndroid Build Coastguard Worker 
144*4a64e381SAndroid Build Coastguard Worker     return cJSON_CreateString(ss.str().c_str());
145*4a64e381SAndroid Build Coastguard Worker }
146*4a64e381SAndroid Build Coastguard Worker 
Json2IpPrefix(const cJSON * aJson,otIp6NetworkPrefix & aIpPrefix)147*4a64e381SAndroid Build Coastguard Worker otbrError Json2IpPrefix(const cJSON *aJson, otIp6NetworkPrefix &aIpPrefix)
148*4a64e381SAndroid Build Coastguard Worker {
149*4a64e381SAndroid Build Coastguard Worker     otbrError          error = OTBR_ERROR_NONE;
150*4a64e381SAndroid Build Coastguard Worker     std::istringstream ipPrefixStr(std::string(aJson->valuestring));
151*4a64e381SAndroid Build Coastguard Worker     std::string        tmp;
152*4a64e381SAndroid Build Coastguard Worker     Ip6Address         addr;
153*4a64e381SAndroid Build Coastguard Worker 
154*4a64e381SAndroid Build Coastguard Worker     VerifyOrExit(std::getline(ipPrefixStr, tmp, '/'), error = OTBR_ERROR_INVALID_ARGS);
155*4a64e381SAndroid Build Coastguard Worker     VerifyOrExit((error = addr.FromString(tmp.c_str(), addr)) == OTBR_ERROR_NONE);
156*4a64e381SAndroid Build Coastguard Worker 
157*4a64e381SAndroid Build Coastguard Worker     memcpy(aIpPrefix.m8, addr.m8, OT_IP6_PREFIX_SIZE);
158*4a64e381SAndroid Build Coastguard Worker exit:
159*4a64e381SAndroid Build Coastguard Worker     return error;
160*4a64e381SAndroid Build Coastguard Worker }
161*4a64e381SAndroid Build Coastguard Worker 
Timestamp2Json(const otTimestamp & aTimestamp)162*4a64e381SAndroid Build Coastguard Worker static cJSON *Timestamp2Json(const otTimestamp &aTimestamp)
163*4a64e381SAndroid Build Coastguard Worker {
164*4a64e381SAndroid Build Coastguard Worker     cJSON *timestamp = cJSON_CreateObject();
165*4a64e381SAndroid Build Coastguard Worker 
166*4a64e381SAndroid Build Coastguard Worker     cJSON_AddItemToObject(timestamp, "Seconds", cJSON_CreateNumber(aTimestamp.mSeconds));
167*4a64e381SAndroid Build Coastguard Worker     cJSON_AddItemToObject(timestamp, "Ticks", cJSON_CreateNumber(aTimestamp.mTicks));
168*4a64e381SAndroid Build Coastguard Worker     cJSON_AddItemToObject(timestamp, "Authoritative", cJSON_CreateBool(aTimestamp.mAuthoritative));
169*4a64e381SAndroid Build Coastguard Worker 
170*4a64e381SAndroid Build Coastguard Worker     return timestamp;
171*4a64e381SAndroid Build Coastguard Worker }
172*4a64e381SAndroid Build Coastguard Worker 
Json2Timestamp(const cJSON * jsonTimestamp,otTimestamp & aTimestamp)173*4a64e381SAndroid Build Coastguard Worker bool Json2Timestamp(const cJSON *jsonTimestamp, otTimestamp &aTimestamp)
174*4a64e381SAndroid Build Coastguard Worker {
175*4a64e381SAndroid Build Coastguard Worker     cJSON *value;
176*4a64e381SAndroid Build Coastguard Worker 
177*4a64e381SAndroid Build Coastguard Worker     value = cJSON_GetObjectItemCaseSensitive(jsonTimestamp, "Seconds");
178*4a64e381SAndroid Build Coastguard Worker     if (cJSON_IsNumber(value))
179*4a64e381SAndroid Build Coastguard Worker     {
180*4a64e381SAndroid Build Coastguard Worker         aTimestamp.mSeconds = static_cast<uint64_t>(value->valuedouble);
181*4a64e381SAndroid Build Coastguard Worker     }
182*4a64e381SAndroid Build Coastguard Worker     else if (value != nullptr)
183*4a64e381SAndroid Build Coastguard Worker     {
184*4a64e381SAndroid Build Coastguard Worker         return false;
185*4a64e381SAndroid Build Coastguard Worker     }
186*4a64e381SAndroid Build Coastguard Worker 
187*4a64e381SAndroid Build Coastguard Worker     value = cJSON_GetObjectItemCaseSensitive(jsonTimestamp, "Ticks");
188*4a64e381SAndroid Build Coastguard Worker     if (cJSON_IsNumber(value))
189*4a64e381SAndroid Build Coastguard Worker     {
190*4a64e381SAndroid Build Coastguard Worker         aTimestamp.mTicks = static_cast<uint16_t>(value->valueint);
191*4a64e381SAndroid Build Coastguard Worker     }
192*4a64e381SAndroid Build Coastguard Worker     else if (value != nullptr)
193*4a64e381SAndroid Build Coastguard Worker     {
194*4a64e381SAndroid Build Coastguard Worker         return false;
195*4a64e381SAndroid Build Coastguard Worker     }
196*4a64e381SAndroid Build Coastguard Worker 
197*4a64e381SAndroid Build Coastguard Worker     value                     = cJSON_GetObjectItemCaseSensitive(jsonTimestamp, "Authoritative");
198*4a64e381SAndroid Build Coastguard Worker     aTimestamp.mAuthoritative = cJSON_IsTrue(value);
199*4a64e381SAndroid Build Coastguard Worker 
200*4a64e381SAndroid Build Coastguard Worker     return true;
201*4a64e381SAndroid Build Coastguard Worker }
202*4a64e381SAndroid Build Coastguard Worker 
SecurityPolicy2Json(const otSecurityPolicy & aSecurityPolicy)203*4a64e381SAndroid Build Coastguard Worker static cJSON *SecurityPolicy2Json(const otSecurityPolicy &aSecurityPolicy)
204*4a64e381SAndroid Build Coastguard Worker {
205*4a64e381SAndroid Build Coastguard Worker     cJSON *securityPolicy = cJSON_CreateObject();
206*4a64e381SAndroid Build Coastguard Worker 
207*4a64e381SAndroid Build Coastguard Worker     cJSON_AddItemToObject(securityPolicy, "RotationTime", cJSON_CreateNumber(aSecurityPolicy.mRotationTime));
208*4a64e381SAndroid Build Coastguard Worker     cJSON_AddItemToObject(securityPolicy, "ObtainNetworkKey",
209*4a64e381SAndroid Build Coastguard Worker                           cJSON_CreateBool(aSecurityPolicy.mObtainNetworkKeyEnabled));
210*4a64e381SAndroid Build Coastguard Worker     cJSON_AddItemToObject(securityPolicy, "NativeCommissioning",
211*4a64e381SAndroid Build Coastguard Worker                           cJSON_CreateBool(aSecurityPolicy.mNativeCommissioningEnabled));
212*4a64e381SAndroid Build Coastguard Worker     cJSON_AddItemToObject(securityPolicy, "Routers", cJSON_CreateBool(aSecurityPolicy.mRoutersEnabled));
213*4a64e381SAndroid Build Coastguard Worker     cJSON_AddItemToObject(securityPolicy, "ExternalCommissioning",
214*4a64e381SAndroid Build Coastguard Worker                           cJSON_CreateBool(aSecurityPolicy.mExternalCommissioningEnabled));
215*4a64e381SAndroid Build Coastguard Worker     cJSON_AddItemToObject(securityPolicy, "CommercialCommissioning",
216*4a64e381SAndroid Build Coastguard Worker                           cJSON_CreateBool(aSecurityPolicy.mCommercialCommissioningEnabled));
217*4a64e381SAndroid Build Coastguard Worker     cJSON_AddItemToObject(securityPolicy, "AutonomousEnrollment",
218*4a64e381SAndroid Build Coastguard Worker                           cJSON_CreateBool(aSecurityPolicy.mAutonomousEnrollmentEnabled));
219*4a64e381SAndroid Build Coastguard Worker     cJSON_AddItemToObject(securityPolicy, "NetworkKeyProvisioning",
220*4a64e381SAndroid Build Coastguard Worker                           cJSON_CreateBool(aSecurityPolicy.mNetworkKeyProvisioningEnabled));
221*4a64e381SAndroid Build Coastguard Worker     cJSON_AddItemToObject(securityPolicy, "TobleLink", cJSON_CreateBool(aSecurityPolicy.mTobleLinkEnabled));
222*4a64e381SAndroid Build Coastguard Worker     cJSON_AddItemToObject(securityPolicy, "NonCcmRouters", cJSON_CreateBool(aSecurityPolicy.mNonCcmRoutersEnabled));
223*4a64e381SAndroid Build Coastguard Worker 
224*4a64e381SAndroid Build Coastguard Worker     return securityPolicy;
225*4a64e381SAndroid Build Coastguard Worker }
226*4a64e381SAndroid Build Coastguard Worker 
Json2SecurityPolicy(const cJSON * jsonSecurityPolicy,otSecurityPolicy & aSecurityPolicy)227*4a64e381SAndroid Build Coastguard Worker bool Json2SecurityPolicy(const cJSON *jsonSecurityPolicy, otSecurityPolicy &aSecurityPolicy)
228*4a64e381SAndroid Build Coastguard Worker {
229*4a64e381SAndroid Build Coastguard Worker     cJSON *value;
230*4a64e381SAndroid Build Coastguard Worker 
231*4a64e381SAndroid Build Coastguard Worker     value = cJSON_GetObjectItemCaseSensitive(jsonSecurityPolicy, "RotationTime");
232*4a64e381SAndroid Build Coastguard Worker     if (cJSON_IsNumber(value))
233*4a64e381SAndroid Build Coastguard Worker     {
234*4a64e381SAndroid Build Coastguard Worker         aSecurityPolicy.mRotationTime = static_cast<uint16_t>(value->valueint);
235*4a64e381SAndroid Build Coastguard Worker     }
236*4a64e381SAndroid Build Coastguard Worker 
237*4a64e381SAndroid Build Coastguard Worker     value                                    = cJSON_GetObjectItemCaseSensitive(jsonSecurityPolicy, "ObtainNetworkKey");
238*4a64e381SAndroid Build Coastguard Worker     aSecurityPolicy.mObtainNetworkKeyEnabled = cJSON_IsTrue(value);
239*4a64e381SAndroid Build Coastguard Worker     value = cJSON_GetObjectItemCaseSensitive(jsonSecurityPolicy, "NativeCommissioning");
240*4a64e381SAndroid Build Coastguard Worker     aSecurityPolicy.mNativeCommissioningEnabled = cJSON_IsTrue(value);
241*4a64e381SAndroid Build Coastguard Worker     value                                       = cJSON_GetObjectItemCaseSensitive(jsonSecurityPolicy, "Routers");
242*4a64e381SAndroid Build Coastguard Worker     aSecurityPolicy.mRoutersEnabled             = cJSON_IsTrue(value);
243*4a64e381SAndroid Build Coastguard Worker     value = cJSON_GetObjectItemCaseSensitive(jsonSecurityPolicy, "ExternalCommissioning");
244*4a64e381SAndroid Build Coastguard Worker     aSecurityPolicy.mExternalCommissioningEnabled = cJSON_IsTrue(value);
245*4a64e381SAndroid Build Coastguard Worker     value = cJSON_GetObjectItemCaseSensitive(jsonSecurityPolicy, "CommercialCommissioning");
246*4a64e381SAndroid Build Coastguard Worker     aSecurityPolicy.mCommercialCommissioningEnabled = cJSON_IsTrue(value);
247*4a64e381SAndroid Build Coastguard Worker     value = cJSON_GetObjectItemCaseSensitive(jsonSecurityPolicy, "AutonomousEnrollment");
248*4a64e381SAndroid Build Coastguard Worker     aSecurityPolicy.mAutonomousEnrollmentEnabled = cJSON_IsTrue(value);
249*4a64e381SAndroid Build Coastguard Worker     value = cJSON_GetObjectItemCaseSensitive(jsonSecurityPolicy, "NetworkKeyProvisioning");
250*4a64e381SAndroid Build Coastguard Worker     aSecurityPolicy.mNetworkKeyProvisioningEnabled = cJSON_IsTrue(value);
251*4a64e381SAndroid Build Coastguard Worker     value                                          = cJSON_GetObjectItemCaseSensitive(jsonSecurityPolicy, "TobleLink");
252*4a64e381SAndroid Build Coastguard Worker     aSecurityPolicy.mTobleLinkEnabled              = cJSON_IsTrue(value);
253*4a64e381SAndroid Build Coastguard Worker     value                                 = cJSON_GetObjectItemCaseSensitive(jsonSecurityPolicy, "NonCcmRouters");
254*4a64e381SAndroid Build Coastguard Worker     aSecurityPolicy.mNonCcmRoutersEnabled = cJSON_IsTrue(value);
255*4a64e381SAndroid Build Coastguard Worker 
256*4a64e381SAndroid Build Coastguard Worker     return true;
257*4a64e381SAndroid Build Coastguard Worker }
258*4a64e381SAndroid Build Coastguard Worker 
ChildTableEntry2Json(const otNetworkDiagChildEntry & aChildEntry)259*4a64e381SAndroid Build Coastguard Worker static cJSON *ChildTableEntry2Json(const otNetworkDiagChildEntry &aChildEntry)
260*4a64e381SAndroid Build Coastguard Worker {
261*4a64e381SAndroid Build Coastguard Worker     cJSON *childEntry = cJSON_CreateObject();
262*4a64e381SAndroid Build Coastguard Worker 
263*4a64e381SAndroid Build Coastguard Worker     cJSON_AddItemToObject(childEntry, "ChildId", cJSON_CreateNumber(aChildEntry.mChildId));
264*4a64e381SAndroid Build Coastguard Worker     cJSON_AddItemToObject(childEntry, "Timeout", cJSON_CreateNumber(aChildEntry.mTimeout));
265*4a64e381SAndroid Build Coastguard Worker 
266*4a64e381SAndroid Build Coastguard Worker     cJSON *mode = Mode2Json(aChildEntry.mMode);
267*4a64e381SAndroid Build Coastguard Worker     cJSON_AddItemToObject(childEntry, "Mode", mode);
268*4a64e381SAndroid Build Coastguard Worker 
269*4a64e381SAndroid Build Coastguard Worker     return childEntry;
270*4a64e381SAndroid Build Coastguard Worker }
271*4a64e381SAndroid Build Coastguard Worker 
MacCounters2Json(const otNetworkDiagMacCounters & aMacCounters)272*4a64e381SAndroid Build Coastguard Worker static cJSON *MacCounters2Json(const otNetworkDiagMacCounters &aMacCounters)
273*4a64e381SAndroid Build Coastguard Worker {
274*4a64e381SAndroid Build Coastguard Worker     cJSON *macCounters = cJSON_CreateObject();
275*4a64e381SAndroid Build Coastguard Worker 
276*4a64e381SAndroid Build Coastguard Worker     cJSON_AddItemToObject(macCounters, "IfInUnknownProtos", cJSON_CreateNumber(aMacCounters.mIfInUnknownProtos));
277*4a64e381SAndroid Build Coastguard Worker     cJSON_AddItemToObject(macCounters, "IfInErrors", cJSON_CreateNumber(aMacCounters.mIfInErrors));
278*4a64e381SAndroid Build Coastguard Worker     cJSON_AddItemToObject(macCounters, "IfOutErrors", cJSON_CreateNumber(aMacCounters.mIfOutErrors));
279*4a64e381SAndroid Build Coastguard Worker     cJSON_AddItemToObject(macCounters, "IfInUcastPkts", cJSON_CreateNumber(aMacCounters.mIfInUcastPkts));
280*4a64e381SAndroid Build Coastguard Worker     cJSON_AddItemToObject(macCounters, "IfInBroadcastPkts", cJSON_CreateNumber(aMacCounters.mIfInBroadcastPkts));
281*4a64e381SAndroid Build Coastguard Worker     cJSON_AddItemToObject(macCounters, "IfInDiscards", cJSON_CreateNumber(aMacCounters.mIfInDiscards));
282*4a64e381SAndroid Build Coastguard Worker     cJSON_AddItemToObject(macCounters, "IfOutUcastPkts", cJSON_CreateNumber(aMacCounters.mIfOutUcastPkts));
283*4a64e381SAndroid Build Coastguard Worker     cJSON_AddItemToObject(macCounters, "IfOutBroadcastPkts", cJSON_CreateNumber(aMacCounters.mIfOutBroadcastPkts));
284*4a64e381SAndroid Build Coastguard Worker     cJSON_AddItemToObject(macCounters, "IfOutDiscards", cJSON_CreateNumber(aMacCounters.mIfOutDiscards));
285*4a64e381SAndroid Build Coastguard Worker 
286*4a64e381SAndroid Build Coastguard Worker     return macCounters;
287*4a64e381SAndroid Build Coastguard Worker }
288*4a64e381SAndroid Build Coastguard Worker 
Connectivity2Json(const otNetworkDiagConnectivity & aConnectivity)289*4a64e381SAndroid Build Coastguard Worker static cJSON *Connectivity2Json(const otNetworkDiagConnectivity &aConnectivity)
290*4a64e381SAndroid Build Coastguard Worker {
291*4a64e381SAndroid Build Coastguard Worker     cJSON *connectivity = cJSON_CreateObject();
292*4a64e381SAndroid Build Coastguard Worker 
293*4a64e381SAndroid Build Coastguard Worker     cJSON_AddItemToObject(connectivity, "ParentPriority", cJSON_CreateNumber(aConnectivity.mParentPriority));
294*4a64e381SAndroid Build Coastguard Worker     cJSON_AddItemToObject(connectivity, "LinkQuality3", cJSON_CreateNumber(aConnectivity.mLinkQuality3));
295*4a64e381SAndroid Build Coastguard Worker     cJSON_AddItemToObject(connectivity, "LinkQuality2", cJSON_CreateNumber(aConnectivity.mLinkQuality2));
296*4a64e381SAndroid Build Coastguard Worker     cJSON_AddItemToObject(connectivity, "LinkQuality1", cJSON_CreateNumber(aConnectivity.mLinkQuality1));
297*4a64e381SAndroid Build Coastguard Worker     cJSON_AddItemToObject(connectivity, "LeaderCost", cJSON_CreateNumber(aConnectivity.mLeaderCost));
298*4a64e381SAndroid Build Coastguard Worker     cJSON_AddItemToObject(connectivity, "IdSequence", cJSON_CreateNumber(aConnectivity.mIdSequence));
299*4a64e381SAndroid Build Coastguard Worker     cJSON_AddItemToObject(connectivity, "ActiveRouters", cJSON_CreateNumber(aConnectivity.mActiveRouters));
300*4a64e381SAndroid Build Coastguard Worker     cJSON_AddItemToObject(connectivity, "SedBufferSize", cJSON_CreateNumber(aConnectivity.mSedBufferSize));
301*4a64e381SAndroid Build Coastguard Worker     cJSON_AddItemToObject(connectivity, "SedDatagramCount", cJSON_CreateNumber(aConnectivity.mSedDatagramCount));
302*4a64e381SAndroid Build Coastguard Worker 
303*4a64e381SAndroid Build Coastguard Worker     return connectivity;
304*4a64e381SAndroid Build Coastguard Worker }
305*4a64e381SAndroid Build Coastguard Worker 
RouteData2Json(const otNetworkDiagRouteData & aRouteData)306*4a64e381SAndroid Build Coastguard Worker static cJSON *RouteData2Json(const otNetworkDiagRouteData &aRouteData)
307*4a64e381SAndroid Build Coastguard Worker {
308*4a64e381SAndroid Build Coastguard Worker     cJSON *routeData = cJSON_CreateObject();
309*4a64e381SAndroid Build Coastguard Worker 
310*4a64e381SAndroid Build Coastguard Worker     cJSON_AddItemToObject(routeData, "RouteId", cJSON_CreateNumber(aRouteData.mRouterId));
311*4a64e381SAndroid Build Coastguard Worker     cJSON_AddItemToObject(routeData, "LinkQualityOut", cJSON_CreateNumber(aRouteData.mLinkQualityOut));
312*4a64e381SAndroid Build Coastguard Worker     cJSON_AddItemToObject(routeData, "LinkQualityIn", cJSON_CreateNumber(aRouteData.mLinkQualityIn));
313*4a64e381SAndroid Build Coastguard Worker     cJSON_AddItemToObject(routeData, "RouteCost", cJSON_CreateNumber(aRouteData.mRouteCost));
314*4a64e381SAndroid Build Coastguard Worker 
315*4a64e381SAndroid Build Coastguard Worker     return routeData;
316*4a64e381SAndroid Build Coastguard Worker }
317*4a64e381SAndroid Build Coastguard Worker 
Route2Json(const otNetworkDiagRoute & aRoute)318*4a64e381SAndroid Build Coastguard Worker static cJSON *Route2Json(const otNetworkDiagRoute &aRoute)
319*4a64e381SAndroid Build Coastguard Worker {
320*4a64e381SAndroid Build Coastguard Worker     cJSON *route = cJSON_CreateObject();
321*4a64e381SAndroid Build Coastguard Worker 
322*4a64e381SAndroid Build Coastguard Worker     cJSON_AddItemToObject(route, "IdSequence", cJSON_CreateNumber(aRoute.mIdSequence));
323*4a64e381SAndroid Build Coastguard Worker 
324*4a64e381SAndroid Build Coastguard Worker     cJSON *RouteData = cJSON_CreateArray();
325*4a64e381SAndroid Build Coastguard Worker     for (uint16_t i = 0; i < aRoute.mRouteCount; ++i)
326*4a64e381SAndroid Build Coastguard Worker     {
327*4a64e381SAndroid Build Coastguard Worker         cJSON *RouteDatavalue = RouteData2Json(aRoute.mRouteData[i]);
328*4a64e381SAndroid Build Coastguard Worker         cJSON_AddItemToArray(RouteData, RouteDatavalue);
329*4a64e381SAndroid Build Coastguard Worker     }
330*4a64e381SAndroid Build Coastguard Worker 
331*4a64e381SAndroid Build Coastguard Worker     cJSON_AddItemToObject(route, "RouteData", RouteData);
332*4a64e381SAndroid Build Coastguard Worker 
333*4a64e381SAndroid Build Coastguard Worker     return route;
334*4a64e381SAndroid Build Coastguard Worker }
335*4a64e381SAndroid Build Coastguard Worker 
LeaderData2Json(const otLeaderData & aLeaderData)336*4a64e381SAndroid Build Coastguard Worker static cJSON *LeaderData2Json(const otLeaderData &aLeaderData)
337*4a64e381SAndroid Build Coastguard Worker {
338*4a64e381SAndroid Build Coastguard Worker     cJSON *leaderData = cJSON_CreateObject();
339*4a64e381SAndroid Build Coastguard Worker 
340*4a64e381SAndroid Build Coastguard Worker     cJSON_AddItemToObject(leaderData, "PartitionId", cJSON_CreateNumber(aLeaderData.mPartitionId));
341*4a64e381SAndroid Build Coastguard Worker     cJSON_AddItemToObject(leaderData, "Weighting", cJSON_CreateNumber(aLeaderData.mWeighting));
342*4a64e381SAndroid Build Coastguard Worker     cJSON_AddItemToObject(leaderData, "DataVersion", cJSON_CreateNumber(aLeaderData.mDataVersion));
343*4a64e381SAndroid Build Coastguard Worker     cJSON_AddItemToObject(leaderData, "StableDataVersion", cJSON_CreateNumber(aLeaderData.mStableDataVersion));
344*4a64e381SAndroid Build Coastguard Worker     cJSON_AddItemToObject(leaderData, "LeaderRouterId", cJSON_CreateNumber(aLeaderData.mLeaderRouterId));
345*4a64e381SAndroid Build Coastguard Worker 
346*4a64e381SAndroid Build Coastguard Worker     return leaderData;
347*4a64e381SAndroid Build Coastguard Worker }
348*4a64e381SAndroid Build Coastguard Worker 
IpAddr2JsonString(const otIp6Address & aAddress)349*4a64e381SAndroid Build Coastguard Worker std::string IpAddr2JsonString(const otIp6Address &aAddress)
350*4a64e381SAndroid Build Coastguard Worker {
351*4a64e381SAndroid Build Coastguard Worker     std::string ret;
352*4a64e381SAndroid Build Coastguard Worker     cJSON      *ipAddr = IpAddr2Json(aAddress);
353*4a64e381SAndroid Build Coastguard Worker 
354*4a64e381SAndroid Build Coastguard Worker     ret = Json2String(ipAddr);
355*4a64e381SAndroid Build Coastguard Worker     cJSON_Delete(ipAddr);
356*4a64e381SAndroid Build Coastguard Worker 
357*4a64e381SAndroid Build Coastguard Worker     return ret;
358*4a64e381SAndroid Build Coastguard Worker }
359*4a64e381SAndroid Build Coastguard Worker 
Node2JsonString(const NodeInfo & aNode)360*4a64e381SAndroid Build Coastguard Worker std::string Node2JsonString(const NodeInfo &aNode)
361*4a64e381SAndroid Build Coastguard Worker {
362*4a64e381SAndroid Build Coastguard Worker     cJSON      *node = cJSON_CreateObject();
363*4a64e381SAndroid Build Coastguard Worker     std::string ret;
364*4a64e381SAndroid Build Coastguard Worker 
365*4a64e381SAndroid Build Coastguard Worker     cJSON_AddItemToObject(node, "BaId", Bytes2HexJson(aNode.mBaId.mId, sizeof(aNode.mBaId)));
366*4a64e381SAndroid Build Coastguard Worker     cJSON_AddItemToObject(node, "State", cJSON_CreateString(aNode.mRole.c_str()));
367*4a64e381SAndroid Build Coastguard Worker     cJSON_AddItemToObject(node, "NumOfRouter", cJSON_CreateNumber(aNode.mNumOfRouter));
368*4a64e381SAndroid Build Coastguard Worker     cJSON_AddItemToObject(node, "RlocAddress", IpAddr2Json(aNode.mRlocAddress));
369*4a64e381SAndroid Build Coastguard Worker     cJSON_AddItemToObject(node, "ExtAddress", Bytes2HexJson(aNode.mExtAddress, OT_EXT_ADDRESS_SIZE));
370*4a64e381SAndroid Build Coastguard Worker     cJSON_AddItemToObject(node, "NetworkName", cJSON_CreateString(aNode.mNetworkName.c_str()));
371*4a64e381SAndroid Build Coastguard Worker     cJSON_AddItemToObject(node, "Rloc16", cJSON_CreateNumber(aNode.mRloc16));
372*4a64e381SAndroid Build Coastguard Worker     cJSON_AddItemToObject(node, "LeaderData", LeaderData2Json(aNode.mLeaderData));
373*4a64e381SAndroid Build Coastguard Worker     cJSON_AddItemToObject(node, "ExtPanId", Bytes2HexJson(aNode.mExtPanId, OT_EXT_PAN_ID_SIZE));
374*4a64e381SAndroid Build Coastguard Worker 
375*4a64e381SAndroid Build Coastguard Worker     ret = Json2String(node);
376*4a64e381SAndroid Build Coastguard Worker     cJSON_Delete(node);
377*4a64e381SAndroid Build Coastguard Worker 
378*4a64e381SAndroid Build Coastguard Worker     return ret;
379*4a64e381SAndroid Build Coastguard Worker }
380*4a64e381SAndroid Build Coastguard Worker 
Diag2JsonString(const std::vector<std::vector<otNetworkDiagTlv>> & aDiagSet)381*4a64e381SAndroid Build Coastguard Worker std::string Diag2JsonString(const std::vector<std::vector<otNetworkDiagTlv>> &aDiagSet)
382*4a64e381SAndroid Build Coastguard Worker {
383*4a64e381SAndroid Build Coastguard Worker     cJSON      *diagInfo          = cJSON_CreateArray();
384*4a64e381SAndroid Build Coastguard Worker     cJSON      *diagInfoOfOneNode = nullptr;
385*4a64e381SAndroid Build Coastguard Worker     cJSON      *addrList          = nullptr;
386*4a64e381SAndroid Build Coastguard Worker     cJSON      *tableList         = nullptr;
387*4a64e381SAndroid Build Coastguard Worker     std::string ret;
388*4a64e381SAndroid Build Coastguard Worker     uint64_t    timeout;
389*4a64e381SAndroid Build Coastguard Worker 
390*4a64e381SAndroid Build Coastguard Worker     for (auto diagItem : aDiagSet)
391*4a64e381SAndroid Build Coastguard Worker     {
392*4a64e381SAndroid Build Coastguard Worker         diagInfoOfOneNode = cJSON_CreateObject();
393*4a64e381SAndroid Build Coastguard Worker         for (auto diagTlv : diagItem)
394*4a64e381SAndroid Build Coastguard Worker         {
395*4a64e381SAndroid Build Coastguard Worker             switch (diagTlv.mType)
396*4a64e381SAndroid Build Coastguard Worker             {
397*4a64e381SAndroid Build Coastguard Worker             case OT_NETWORK_DIAGNOSTIC_TLV_EXT_ADDRESS:
398*4a64e381SAndroid Build Coastguard Worker 
399*4a64e381SAndroid Build Coastguard Worker                 cJSON_AddItemToObject(diagInfoOfOneNode, "ExtAddress",
400*4a64e381SAndroid Build Coastguard Worker                                       Bytes2HexJson(diagTlv.mData.mExtAddress.m8, OT_EXT_ADDRESS_SIZE));
401*4a64e381SAndroid Build Coastguard Worker 
402*4a64e381SAndroid Build Coastguard Worker                 break;
403*4a64e381SAndroid Build Coastguard Worker             case OT_NETWORK_DIAGNOSTIC_TLV_SHORT_ADDRESS:
404*4a64e381SAndroid Build Coastguard Worker 
405*4a64e381SAndroid Build Coastguard Worker                 cJSON_AddItemToObject(diagInfoOfOneNode, "Rloc16", cJSON_CreateNumber(diagTlv.mData.mAddr16));
406*4a64e381SAndroid Build Coastguard Worker 
407*4a64e381SAndroid Build Coastguard Worker                 break;
408*4a64e381SAndroid Build Coastguard Worker             case OT_NETWORK_DIAGNOSTIC_TLV_MODE:
409*4a64e381SAndroid Build Coastguard Worker 
410*4a64e381SAndroid Build Coastguard Worker                 cJSON_AddItemToObject(diagInfoOfOneNode, "Mode", Mode2Json(diagTlv.mData.mMode));
411*4a64e381SAndroid Build Coastguard Worker 
412*4a64e381SAndroid Build Coastguard Worker                 break;
413*4a64e381SAndroid Build Coastguard Worker             case OT_NETWORK_DIAGNOSTIC_TLV_TIMEOUT:
414*4a64e381SAndroid Build Coastguard Worker 
415*4a64e381SAndroid Build Coastguard Worker                 timeout = static_cast<uint64_t>(diagTlv.mData.mTimeout);
416*4a64e381SAndroid Build Coastguard Worker                 cJSON_AddItemToObject(diagInfoOfOneNode, "Timeout", cJSON_CreateNumber(timeout));
417*4a64e381SAndroid Build Coastguard Worker 
418*4a64e381SAndroid Build Coastguard Worker                 break;
419*4a64e381SAndroid Build Coastguard Worker             case OT_NETWORK_DIAGNOSTIC_TLV_CONNECTIVITY:
420*4a64e381SAndroid Build Coastguard Worker 
421*4a64e381SAndroid Build Coastguard Worker                 cJSON_AddItemToObject(diagInfoOfOneNode, "Connectivity",
422*4a64e381SAndroid Build Coastguard Worker                                       Connectivity2Json(diagTlv.mData.mConnectivity));
423*4a64e381SAndroid Build Coastguard Worker 
424*4a64e381SAndroid Build Coastguard Worker                 break;
425*4a64e381SAndroid Build Coastguard Worker             case OT_NETWORK_DIAGNOSTIC_TLV_ROUTE:
426*4a64e381SAndroid Build Coastguard Worker 
427*4a64e381SAndroid Build Coastguard Worker                 cJSON_AddItemToObject(diagInfoOfOneNode, "Route", Route2Json(diagTlv.mData.mRoute));
428*4a64e381SAndroid Build Coastguard Worker 
429*4a64e381SAndroid Build Coastguard Worker                 break;
430*4a64e381SAndroid Build Coastguard Worker             case OT_NETWORK_DIAGNOSTIC_TLV_LEADER_DATA:
431*4a64e381SAndroid Build Coastguard Worker 
432*4a64e381SAndroid Build Coastguard Worker                 cJSON_AddItemToObject(diagInfoOfOneNode, "LeaderData", LeaderData2Json(diagTlv.mData.mLeaderData));
433*4a64e381SAndroid Build Coastguard Worker 
434*4a64e381SAndroid Build Coastguard Worker                 break;
435*4a64e381SAndroid Build Coastguard Worker             case OT_NETWORK_DIAGNOSTIC_TLV_NETWORK_DATA:
436*4a64e381SAndroid Build Coastguard Worker 
437*4a64e381SAndroid Build Coastguard Worker                 cJSON_AddItemToObject(diagInfoOfOneNode, "NetworkData",
438*4a64e381SAndroid Build Coastguard Worker                                       Bytes2HexJson(diagTlv.mData.mNetworkData.m8, diagTlv.mData.mNetworkData.mCount));
439*4a64e381SAndroid Build Coastguard Worker 
440*4a64e381SAndroid Build Coastguard Worker                 break;
441*4a64e381SAndroid Build Coastguard Worker             case OT_NETWORK_DIAGNOSTIC_TLV_IP6_ADDR_LIST:
442*4a64e381SAndroid Build Coastguard Worker 
443*4a64e381SAndroid Build Coastguard Worker                 addrList = cJSON_CreateArray();
444*4a64e381SAndroid Build Coastguard Worker 
445*4a64e381SAndroid Build Coastguard Worker                 for (uint16_t i = 0; i < diagTlv.mData.mIp6AddrList.mCount; ++i)
446*4a64e381SAndroid Build Coastguard Worker                 {
447*4a64e381SAndroid Build Coastguard Worker                     cJSON_AddItemToArray(addrList, IpAddr2Json(diagTlv.mData.mIp6AddrList.mList[i]));
448*4a64e381SAndroid Build Coastguard Worker                 }
449*4a64e381SAndroid Build Coastguard Worker                 cJSON_AddItemToObject(diagInfoOfOneNode, "IP6AddressList", addrList);
450*4a64e381SAndroid Build Coastguard Worker 
451*4a64e381SAndroid Build Coastguard Worker                 break;
452*4a64e381SAndroid Build Coastguard Worker             case OT_NETWORK_DIAGNOSTIC_TLV_MAC_COUNTERS:
453*4a64e381SAndroid Build Coastguard Worker 
454*4a64e381SAndroid Build Coastguard Worker                 cJSON_AddItemToObject(diagInfoOfOneNode, "MACCounters", MacCounters2Json(diagTlv.mData.mMacCounters));
455*4a64e381SAndroid Build Coastguard Worker 
456*4a64e381SAndroid Build Coastguard Worker                 break;
457*4a64e381SAndroid Build Coastguard Worker             case OT_NETWORK_DIAGNOSTIC_TLV_BATTERY_LEVEL:
458*4a64e381SAndroid Build Coastguard Worker 
459*4a64e381SAndroid Build Coastguard Worker                 cJSON_AddItemToObject(diagInfoOfOneNode, "BatteryLevel",
460*4a64e381SAndroid Build Coastguard Worker                                       cJSON_CreateNumber(diagTlv.mData.mBatteryLevel));
461*4a64e381SAndroid Build Coastguard Worker 
462*4a64e381SAndroid Build Coastguard Worker                 break;
463*4a64e381SAndroid Build Coastguard Worker             case OT_NETWORK_DIAGNOSTIC_TLV_SUPPLY_VOLTAGE:
464*4a64e381SAndroid Build Coastguard Worker 
465*4a64e381SAndroid Build Coastguard Worker                 cJSON_AddItemToObject(diagInfoOfOneNode, "SupplyVoltage",
466*4a64e381SAndroid Build Coastguard Worker                                       cJSON_CreateNumber(diagTlv.mData.mSupplyVoltage));
467*4a64e381SAndroid Build Coastguard Worker 
468*4a64e381SAndroid Build Coastguard Worker                 break;
469*4a64e381SAndroid Build Coastguard Worker             case OT_NETWORK_DIAGNOSTIC_TLV_CHILD_TABLE:
470*4a64e381SAndroid Build Coastguard Worker 
471*4a64e381SAndroid Build Coastguard Worker                 tableList = cJSON_CreateArray();
472*4a64e381SAndroid Build Coastguard Worker 
473*4a64e381SAndroid Build Coastguard Worker                 for (uint16_t i = 0; i < diagTlv.mData.mChildTable.mCount; ++i)
474*4a64e381SAndroid Build Coastguard Worker                 {
475*4a64e381SAndroid Build Coastguard Worker                     cJSON_AddItemToArray(tableList, ChildTableEntry2Json(diagTlv.mData.mChildTable.mTable[i]));
476*4a64e381SAndroid Build Coastguard Worker                 }
477*4a64e381SAndroid Build Coastguard Worker 
478*4a64e381SAndroid Build Coastguard Worker                 cJSON_AddItemToObject(diagInfoOfOneNode, "ChildTable", tableList);
479*4a64e381SAndroid Build Coastguard Worker 
480*4a64e381SAndroid Build Coastguard Worker                 break;
481*4a64e381SAndroid Build Coastguard Worker             case OT_NETWORK_DIAGNOSTIC_TLV_CHANNEL_PAGES:
482*4a64e381SAndroid Build Coastguard Worker 
483*4a64e381SAndroid Build Coastguard Worker                 cJSON_AddItemToObject(
484*4a64e381SAndroid Build Coastguard Worker                     diagInfoOfOneNode, "ChannelPages",
485*4a64e381SAndroid Build Coastguard Worker                     Bytes2HexJson(diagTlv.mData.mChannelPages.m8, diagTlv.mData.mChannelPages.mCount));
486*4a64e381SAndroid Build Coastguard Worker 
487*4a64e381SAndroid Build Coastguard Worker                 break;
488*4a64e381SAndroid Build Coastguard Worker             case OT_NETWORK_DIAGNOSTIC_TLV_MAX_CHILD_TIMEOUT:
489*4a64e381SAndroid Build Coastguard Worker 
490*4a64e381SAndroid Build Coastguard Worker                 cJSON_AddItemToObject(diagInfoOfOneNode, "MaxChildTimeout",
491*4a64e381SAndroid Build Coastguard Worker                                       cJSON_CreateNumber(diagTlv.mData.mMaxChildTimeout));
492*4a64e381SAndroid Build Coastguard Worker 
493*4a64e381SAndroid Build Coastguard Worker                 break;
494*4a64e381SAndroid Build Coastguard Worker             default:
495*4a64e381SAndroid Build Coastguard Worker                 break;
496*4a64e381SAndroid Build Coastguard Worker             }
497*4a64e381SAndroid Build Coastguard Worker         }
498*4a64e381SAndroid Build Coastguard Worker         cJSON_AddItemToArray(diagInfo, diagInfoOfOneNode);
499*4a64e381SAndroid Build Coastguard Worker     }
500*4a64e381SAndroid Build Coastguard Worker 
501*4a64e381SAndroid Build Coastguard Worker     ret = Json2String(diagInfo);
502*4a64e381SAndroid Build Coastguard Worker 
503*4a64e381SAndroid Build Coastguard Worker     cJSON_Delete(diagInfo);
504*4a64e381SAndroid Build Coastguard Worker 
505*4a64e381SAndroid Build Coastguard Worker     return ret;
506*4a64e381SAndroid Build Coastguard Worker }
507*4a64e381SAndroid Build Coastguard Worker 
Bytes2HexJsonString(const uint8_t * aBytes,uint8_t aLength)508*4a64e381SAndroid Build Coastguard Worker std::string Bytes2HexJsonString(const uint8_t *aBytes, uint8_t aLength)
509*4a64e381SAndroid Build Coastguard Worker {
510*4a64e381SAndroid Build Coastguard Worker     cJSON      *hex = Bytes2HexJson(aBytes, aLength);
511*4a64e381SAndroid Build Coastguard Worker     std::string ret = Json2String(hex);
512*4a64e381SAndroid Build Coastguard Worker 
513*4a64e381SAndroid Build Coastguard Worker     cJSON_Delete(hex);
514*4a64e381SAndroid Build Coastguard Worker 
515*4a64e381SAndroid Build Coastguard Worker     return ret;
516*4a64e381SAndroid Build Coastguard Worker }
517*4a64e381SAndroid Build Coastguard Worker 
Hex2BytesJsonString(const std::string & aHexString,uint8_t * aBytes,uint8_t aMaxLength)518*4a64e381SAndroid Build Coastguard Worker int Hex2BytesJsonString(const std::string &aHexString, uint8_t *aBytes, uint8_t aMaxLength)
519*4a64e381SAndroid Build Coastguard Worker {
520*4a64e381SAndroid Build Coastguard Worker     return otbr::Utils::Hex2Bytes(aHexString.c_str(), aBytes, aMaxLength);
521*4a64e381SAndroid Build Coastguard Worker }
522*4a64e381SAndroid Build Coastguard Worker 
Number2JsonString(const uint32_t & aNumber)523*4a64e381SAndroid Build Coastguard Worker std::string Number2JsonString(const uint32_t &aNumber)
524*4a64e381SAndroid Build Coastguard Worker {
525*4a64e381SAndroid Build Coastguard Worker     cJSON      *number = cJSON_CreateNumber(aNumber);
526*4a64e381SAndroid Build Coastguard Worker     std::string ret    = Json2String(number);
527*4a64e381SAndroid Build Coastguard Worker 
528*4a64e381SAndroid Build Coastguard Worker     cJSON_Delete(number);
529*4a64e381SAndroid Build Coastguard Worker 
530*4a64e381SAndroid Build Coastguard Worker     return ret;
531*4a64e381SAndroid Build Coastguard Worker }
532*4a64e381SAndroid Build Coastguard Worker 
Mode2JsonString(const otLinkModeConfig & aMode)533*4a64e381SAndroid Build Coastguard Worker std::string Mode2JsonString(const otLinkModeConfig &aMode)
534*4a64e381SAndroid Build Coastguard Worker {
535*4a64e381SAndroid Build Coastguard Worker     cJSON      *mode = Mode2Json(aMode);
536*4a64e381SAndroid Build Coastguard Worker     std::string ret  = Json2String(mode);
537*4a64e381SAndroid Build Coastguard Worker 
538*4a64e381SAndroid Build Coastguard Worker     cJSON_Delete(mode);
539*4a64e381SAndroid Build Coastguard Worker 
540*4a64e381SAndroid Build Coastguard Worker     return ret;
541*4a64e381SAndroid Build Coastguard Worker }
542*4a64e381SAndroid Build Coastguard Worker 
Connectivity2JsonString(const otNetworkDiagConnectivity & aConnectivity)543*4a64e381SAndroid Build Coastguard Worker std::string Connectivity2JsonString(const otNetworkDiagConnectivity &aConnectivity)
544*4a64e381SAndroid Build Coastguard Worker {
545*4a64e381SAndroid Build Coastguard Worker     cJSON      *connectivity = Connectivity2Json(aConnectivity);
546*4a64e381SAndroid Build Coastguard Worker     std::string ret          = Json2String(connectivity);
547*4a64e381SAndroid Build Coastguard Worker 
548*4a64e381SAndroid Build Coastguard Worker     cJSON_Delete(connectivity);
549*4a64e381SAndroid Build Coastguard Worker 
550*4a64e381SAndroid Build Coastguard Worker     return ret;
551*4a64e381SAndroid Build Coastguard Worker }
552*4a64e381SAndroid Build Coastguard Worker 
RouteData2JsonString(const otNetworkDiagRouteData & aRouteData)553*4a64e381SAndroid Build Coastguard Worker std::string RouteData2JsonString(const otNetworkDiagRouteData &aRouteData)
554*4a64e381SAndroid Build Coastguard Worker {
555*4a64e381SAndroid Build Coastguard Worker     cJSON      *routeData = RouteData2Json(aRouteData);
556*4a64e381SAndroid Build Coastguard Worker     std::string ret       = Json2String(routeData);
557*4a64e381SAndroid Build Coastguard Worker 
558*4a64e381SAndroid Build Coastguard Worker     cJSON_Delete(routeData);
559*4a64e381SAndroid Build Coastguard Worker 
560*4a64e381SAndroid Build Coastguard Worker     return ret;
561*4a64e381SAndroid Build Coastguard Worker }
562*4a64e381SAndroid Build Coastguard Worker 
Route2JsonString(const otNetworkDiagRoute & aRoute)563*4a64e381SAndroid Build Coastguard Worker std::string Route2JsonString(const otNetworkDiagRoute &aRoute)
564*4a64e381SAndroid Build Coastguard Worker {
565*4a64e381SAndroid Build Coastguard Worker     cJSON      *route = Route2Json(aRoute);
566*4a64e381SAndroid Build Coastguard Worker     std::string ret   = Json2String(route);
567*4a64e381SAndroid Build Coastguard Worker 
568*4a64e381SAndroid Build Coastguard Worker     cJSON_Delete(route);
569*4a64e381SAndroid Build Coastguard Worker 
570*4a64e381SAndroid Build Coastguard Worker     return ret;
571*4a64e381SAndroid Build Coastguard Worker }
572*4a64e381SAndroid Build Coastguard Worker 
LeaderData2JsonString(const otLeaderData & aLeaderData)573*4a64e381SAndroid Build Coastguard Worker std::string LeaderData2JsonString(const otLeaderData &aLeaderData)
574*4a64e381SAndroid Build Coastguard Worker {
575*4a64e381SAndroid Build Coastguard Worker     cJSON      *leaderData = LeaderData2Json(aLeaderData);
576*4a64e381SAndroid Build Coastguard Worker     std::string ret        = Json2String(leaderData);
577*4a64e381SAndroid Build Coastguard Worker 
578*4a64e381SAndroid Build Coastguard Worker     cJSON_Delete(leaderData);
579*4a64e381SAndroid Build Coastguard Worker 
580*4a64e381SAndroid Build Coastguard Worker     return ret;
581*4a64e381SAndroid Build Coastguard Worker }
582*4a64e381SAndroid Build Coastguard Worker 
MacCounters2JsonString(const otNetworkDiagMacCounters & aMacCounters)583*4a64e381SAndroid Build Coastguard Worker std::string MacCounters2JsonString(const otNetworkDiagMacCounters &aMacCounters)
584*4a64e381SAndroid Build Coastguard Worker {
585*4a64e381SAndroid Build Coastguard Worker     cJSON      *macCounters = MacCounters2Json(aMacCounters);
586*4a64e381SAndroid Build Coastguard Worker     std::string ret         = Json2String(macCounters);
587*4a64e381SAndroid Build Coastguard Worker 
588*4a64e381SAndroid Build Coastguard Worker     cJSON_Delete(macCounters);
589*4a64e381SAndroid Build Coastguard Worker 
590*4a64e381SAndroid Build Coastguard Worker     return ret;
591*4a64e381SAndroid Build Coastguard Worker }
592*4a64e381SAndroid Build Coastguard Worker 
ChildTableEntry2JsonString(const otNetworkDiagChildEntry & aChildEntry)593*4a64e381SAndroid Build Coastguard Worker std::string ChildTableEntry2JsonString(const otNetworkDiagChildEntry &aChildEntry)
594*4a64e381SAndroid Build Coastguard Worker {
595*4a64e381SAndroid Build Coastguard Worker     cJSON      *childEntry = ChildTableEntry2Json(aChildEntry);
596*4a64e381SAndroid Build Coastguard Worker     std::string ret        = Json2String(childEntry);
597*4a64e381SAndroid Build Coastguard Worker 
598*4a64e381SAndroid Build Coastguard Worker     cJSON_Delete(childEntry);
599*4a64e381SAndroid Build Coastguard Worker 
600*4a64e381SAndroid Build Coastguard Worker     return ret;
601*4a64e381SAndroid Build Coastguard Worker }
602*4a64e381SAndroid Build Coastguard Worker 
CString2JsonString(const char * aCString)603*4a64e381SAndroid Build Coastguard Worker std::string CString2JsonString(const char *aCString)
604*4a64e381SAndroid Build Coastguard Worker {
605*4a64e381SAndroid Build Coastguard Worker     cJSON      *cString = CString2Json(aCString);
606*4a64e381SAndroid Build Coastguard Worker     std::string ret     = Json2String(cString);
607*4a64e381SAndroid Build Coastguard Worker 
608*4a64e381SAndroid Build Coastguard Worker     cJSON_Delete(cString);
609*4a64e381SAndroid Build Coastguard Worker 
610*4a64e381SAndroid Build Coastguard Worker     return ret;
611*4a64e381SAndroid Build Coastguard Worker }
612*4a64e381SAndroid Build Coastguard Worker 
Error2JsonString(HttpStatusCode aErrorCode,std::string aErrorMessage)613*4a64e381SAndroid Build Coastguard Worker std::string Error2JsonString(HttpStatusCode aErrorCode, std::string aErrorMessage)
614*4a64e381SAndroid Build Coastguard Worker {
615*4a64e381SAndroid Build Coastguard Worker     std::string ret;
616*4a64e381SAndroid Build Coastguard Worker     cJSON      *error = cJSON_CreateObject();
617*4a64e381SAndroid Build Coastguard Worker 
618*4a64e381SAndroid Build Coastguard Worker     cJSON_AddItemToObject(error, "ErrorCode", cJSON_CreateNumber(static_cast<int16_t>(aErrorCode)));
619*4a64e381SAndroid Build Coastguard Worker     cJSON_AddItemToObject(error, "ErrorMessage", cJSON_CreateString(aErrorMessage.c_str()));
620*4a64e381SAndroid Build Coastguard Worker 
621*4a64e381SAndroid Build Coastguard Worker     ret = Json2String(error);
622*4a64e381SAndroid Build Coastguard Worker 
623*4a64e381SAndroid Build Coastguard Worker     cJSON_Delete(error);
624*4a64e381SAndroid Build Coastguard Worker 
625*4a64e381SAndroid Build Coastguard Worker     return ret;
626*4a64e381SAndroid Build Coastguard Worker }
627*4a64e381SAndroid Build Coastguard Worker 
ActiveDataset2Json(const otOperationalDataset & aActiveDataset)628*4a64e381SAndroid Build Coastguard Worker cJSON *ActiveDataset2Json(const otOperationalDataset &aActiveDataset)
629*4a64e381SAndroid Build Coastguard Worker {
630*4a64e381SAndroid Build Coastguard Worker     cJSON *node = cJSON_CreateObject();
631*4a64e381SAndroid Build Coastguard Worker 
632*4a64e381SAndroid Build Coastguard Worker     if (aActiveDataset.mComponents.mIsActiveTimestampPresent)
633*4a64e381SAndroid Build Coastguard Worker     {
634*4a64e381SAndroid Build Coastguard Worker         cJSON_AddItemToObject(node, "ActiveTimestamp", Timestamp2Json(aActiveDataset.mActiveTimestamp));
635*4a64e381SAndroid Build Coastguard Worker     }
636*4a64e381SAndroid Build Coastguard Worker     if (aActiveDataset.mComponents.mIsNetworkKeyPresent)
637*4a64e381SAndroid Build Coastguard Worker     {
638*4a64e381SAndroid Build Coastguard Worker         cJSON_AddItemToObject(node, "NetworkKey", Bytes2HexJson(aActiveDataset.mNetworkKey.m8, OT_NETWORK_KEY_SIZE));
639*4a64e381SAndroid Build Coastguard Worker     }
640*4a64e381SAndroid Build Coastguard Worker     if (aActiveDataset.mComponents.mIsNetworkNamePresent)
641*4a64e381SAndroid Build Coastguard Worker     {
642*4a64e381SAndroid Build Coastguard Worker         cJSON_AddItemToObject(node, "NetworkName", cJSON_CreateString(aActiveDataset.mNetworkName.m8));
643*4a64e381SAndroid Build Coastguard Worker     }
644*4a64e381SAndroid Build Coastguard Worker     if (aActiveDataset.mComponents.mIsExtendedPanIdPresent)
645*4a64e381SAndroid Build Coastguard Worker     {
646*4a64e381SAndroid Build Coastguard Worker         cJSON_AddItemToObject(node, "ExtPanId", Bytes2HexJson(aActiveDataset.mExtendedPanId.m8, OT_EXT_PAN_ID_SIZE));
647*4a64e381SAndroid Build Coastguard Worker     }
648*4a64e381SAndroid Build Coastguard Worker     if (aActiveDataset.mComponents.mIsMeshLocalPrefixPresent)
649*4a64e381SAndroid Build Coastguard Worker     {
650*4a64e381SAndroid Build Coastguard Worker         cJSON_AddItemToObject(node, "MeshLocalPrefix", IpPrefix2Json(aActiveDataset.mMeshLocalPrefix));
651*4a64e381SAndroid Build Coastguard Worker     }
652*4a64e381SAndroid Build Coastguard Worker     if (aActiveDataset.mComponents.mIsPanIdPresent)
653*4a64e381SAndroid Build Coastguard Worker     {
654*4a64e381SAndroid Build Coastguard Worker         cJSON_AddItemToObject(node, "PanId", cJSON_CreateNumber(aActiveDataset.mPanId));
655*4a64e381SAndroid Build Coastguard Worker     }
656*4a64e381SAndroid Build Coastguard Worker     if (aActiveDataset.mComponents.mIsChannelPresent)
657*4a64e381SAndroid Build Coastguard Worker     {
658*4a64e381SAndroid Build Coastguard Worker         cJSON_AddItemToObject(node, "Channel", cJSON_CreateNumber(aActiveDataset.mChannel));
659*4a64e381SAndroid Build Coastguard Worker     }
660*4a64e381SAndroid Build Coastguard Worker     if (aActiveDataset.mComponents.mIsPskcPresent)
661*4a64e381SAndroid Build Coastguard Worker     {
662*4a64e381SAndroid Build Coastguard Worker         cJSON_AddItemToObject(node, "PSKc", Bytes2HexJson(aActiveDataset.mPskc.m8, OT_PSKC_MAX_SIZE));
663*4a64e381SAndroid Build Coastguard Worker     }
664*4a64e381SAndroid Build Coastguard Worker     if (aActiveDataset.mComponents.mIsSecurityPolicyPresent)
665*4a64e381SAndroid Build Coastguard Worker     {
666*4a64e381SAndroid Build Coastguard Worker         cJSON_AddItemToObject(node, "SecurityPolicy", SecurityPolicy2Json(aActiveDataset.mSecurityPolicy));
667*4a64e381SAndroid Build Coastguard Worker     }
668*4a64e381SAndroid Build Coastguard Worker     if (aActiveDataset.mComponents.mIsChannelMaskPresent)
669*4a64e381SAndroid Build Coastguard Worker     {
670*4a64e381SAndroid Build Coastguard Worker         cJSON_AddItemToObject(node, "ChannelMask", cJSON_CreateNumber(aActiveDataset.mChannelMask));
671*4a64e381SAndroid Build Coastguard Worker     }
672*4a64e381SAndroid Build Coastguard Worker 
673*4a64e381SAndroid Build Coastguard Worker     return node;
674*4a64e381SAndroid Build Coastguard Worker }
675*4a64e381SAndroid Build Coastguard Worker 
ActiveDataset2JsonString(const otOperationalDataset & aActiveDataset)676*4a64e381SAndroid Build Coastguard Worker std::string ActiveDataset2JsonString(const otOperationalDataset &aActiveDataset)
677*4a64e381SAndroid Build Coastguard Worker {
678*4a64e381SAndroid Build Coastguard Worker     cJSON      *node;
679*4a64e381SAndroid Build Coastguard Worker     std::string ret;
680*4a64e381SAndroid Build Coastguard Worker 
681*4a64e381SAndroid Build Coastguard Worker     node = ActiveDataset2Json(aActiveDataset);
682*4a64e381SAndroid Build Coastguard Worker     ret  = Json2String(node);
683*4a64e381SAndroid Build Coastguard Worker     cJSON_Delete(node);
684*4a64e381SAndroid Build Coastguard Worker 
685*4a64e381SAndroid Build Coastguard Worker     return ret;
686*4a64e381SAndroid Build Coastguard Worker }
687*4a64e381SAndroid Build Coastguard Worker 
PendingDataset2JsonString(const otOperationalDataset & aPendingDataset)688*4a64e381SAndroid Build Coastguard Worker std::string PendingDataset2JsonString(const otOperationalDataset &aPendingDataset)
689*4a64e381SAndroid Build Coastguard Worker {
690*4a64e381SAndroid Build Coastguard Worker     cJSON      *nodeActiveDataset;
691*4a64e381SAndroid Build Coastguard Worker     cJSON      *node = cJSON_CreateObject();
692*4a64e381SAndroid Build Coastguard Worker     std::string ret;
693*4a64e381SAndroid Build Coastguard Worker 
694*4a64e381SAndroid Build Coastguard Worker     nodeActiveDataset = ActiveDataset2Json(aPendingDataset);
695*4a64e381SAndroid Build Coastguard Worker     cJSON_AddItemToObject(node, "ActiveDataset", nodeActiveDataset);
696*4a64e381SAndroid Build Coastguard Worker     if (aPendingDataset.mComponents.mIsPendingTimestampPresent)
697*4a64e381SAndroid Build Coastguard Worker     {
698*4a64e381SAndroid Build Coastguard Worker         cJSON_AddItemToObject(node, "PendingTimestamp", Timestamp2Json(aPendingDataset.mPendingTimestamp));
699*4a64e381SAndroid Build Coastguard Worker     }
700*4a64e381SAndroid Build Coastguard Worker     if (aPendingDataset.mComponents.mIsDelayPresent)
701*4a64e381SAndroid Build Coastguard Worker     {
702*4a64e381SAndroid Build Coastguard Worker         cJSON_AddItemToObject(node, "Delay", cJSON_CreateNumber(aPendingDataset.mDelay));
703*4a64e381SAndroid Build Coastguard Worker     }
704*4a64e381SAndroid Build Coastguard Worker 
705*4a64e381SAndroid Build Coastguard Worker     ret = Json2String(node);
706*4a64e381SAndroid Build Coastguard Worker     cJSON_Delete(node);
707*4a64e381SAndroid Build Coastguard Worker 
708*4a64e381SAndroid Build Coastguard Worker     return ret;
709*4a64e381SAndroid Build Coastguard Worker }
710*4a64e381SAndroid Build Coastguard Worker 
JsonActiveDataset2Dataset(const cJSON * jsonActiveDataset,otOperationalDataset & aDataset)711*4a64e381SAndroid Build Coastguard Worker bool JsonActiveDataset2Dataset(const cJSON *jsonActiveDataset, otOperationalDataset &aDataset)
712*4a64e381SAndroid Build Coastguard Worker {
713*4a64e381SAndroid Build Coastguard Worker     cJSON      *value;
714*4a64e381SAndroid Build Coastguard Worker     otTimestamp timestamp;
715*4a64e381SAndroid Build Coastguard Worker     bool        ret = true;
716*4a64e381SAndroid Build Coastguard Worker 
717*4a64e381SAndroid Build Coastguard Worker     value = cJSON_GetObjectItemCaseSensitive(jsonActiveDataset, "ActiveTimestamp");
718*4a64e381SAndroid Build Coastguard Worker     if (cJSON_IsObject(value))
719*4a64e381SAndroid Build Coastguard Worker     {
720*4a64e381SAndroid Build Coastguard Worker         VerifyOrExit(Json2Timestamp(value, timestamp), ret = false);
721*4a64e381SAndroid Build Coastguard Worker         aDataset.mActiveTimestamp                      = timestamp;
722*4a64e381SAndroid Build Coastguard Worker         aDataset.mComponents.mIsActiveTimestampPresent = true;
723*4a64e381SAndroid Build Coastguard Worker     }
724*4a64e381SAndroid Build Coastguard Worker     else if (cJSON_IsNull(value))
725*4a64e381SAndroid Build Coastguard Worker     {
726*4a64e381SAndroid Build Coastguard Worker         aDataset.mComponents.mIsActiveTimestampPresent = false;
727*4a64e381SAndroid Build Coastguard Worker     }
728*4a64e381SAndroid Build Coastguard Worker     else if (value != nullptr)
729*4a64e381SAndroid Build Coastguard Worker     {
730*4a64e381SAndroid Build Coastguard Worker         ExitNow(ret = false);
731*4a64e381SAndroid Build Coastguard Worker     }
732*4a64e381SAndroid Build Coastguard Worker 
733*4a64e381SAndroid Build Coastguard Worker     value = cJSON_GetObjectItemCaseSensitive(jsonActiveDataset, "NetworkKey");
734*4a64e381SAndroid Build Coastguard Worker     if (cJSON_IsString(value))
735*4a64e381SAndroid Build Coastguard Worker     {
736*4a64e381SAndroid Build Coastguard Worker         VerifyOrExit(value->valuestring != nullptr, ret = false);
737*4a64e381SAndroid Build Coastguard Worker         VerifyOrExit(Hex2BytesJsonString(std::string(value->valuestring), aDataset.mNetworkKey.m8,
738*4a64e381SAndroid Build Coastguard Worker                                          OT_NETWORK_KEY_SIZE) == OT_NETWORK_KEY_SIZE,
739*4a64e381SAndroid Build Coastguard Worker                      ret = false);
740*4a64e381SAndroid Build Coastguard Worker         aDataset.mComponents.mIsNetworkKeyPresent = true;
741*4a64e381SAndroid Build Coastguard Worker     }
742*4a64e381SAndroid Build Coastguard Worker     else if (cJSON_IsNull(value))
743*4a64e381SAndroid Build Coastguard Worker     {
744*4a64e381SAndroid Build Coastguard Worker         aDataset.mComponents.mIsNetworkKeyPresent = false;
745*4a64e381SAndroid Build Coastguard Worker     }
746*4a64e381SAndroid Build Coastguard Worker 
747*4a64e381SAndroid Build Coastguard Worker     value = cJSON_GetObjectItemCaseSensitive(jsonActiveDataset, "NetworkName");
748*4a64e381SAndroid Build Coastguard Worker     if (cJSON_IsString(value))
749*4a64e381SAndroid Build Coastguard Worker     {
750*4a64e381SAndroid Build Coastguard Worker         VerifyOrExit(value->valuestring != nullptr, ret = false);
751*4a64e381SAndroid Build Coastguard Worker         VerifyOrExit(strlen(value->valuestring) <= OT_NETWORK_NAME_MAX_SIZE, ret = false);
752*4a64e381SAndroid Build Coastguard Worker         strncpy(aDataset.mNetworkName.m8, value->valuestring, OT_NETWORK_NAME_MAX_SIZE);
753*4a64e381SAndroid Build Coastguard Worker         aDataset.mComponents.mIsNetworkNamePresent = true;
754*4a64e381SAndroid Build Coastguard Worker     }
755*4a64e381SAndroid Build Coastguard Worker     else if (cJSON_IsNull(value))
756*4a64e381SAndroid Build Coastguard Worker     {
757*4a64e381SAndroid Build Coastguard Worker         aDataset.mComponents.mIsNetworkNamePresent = false;
758*4a64e381SAndroid Build Coastguard Worker     }
759*4a64e381SAndroid Build Coastguard Worker 
760*4a64e381SAndroid Build Coastguard Worker     value = cJSON_GetObjectItemCaseSensitive(jsonActiveDataset, "ExtPanId");
761*4a64e381SAndroid Build Coastguard Worker     if (cJSON_IsString(value))
762*4a64e381SAndroid Build Coastguard Worker     {
763*4a64e381SAndroid Build Coastguard Worker         VerifyOrExit(value->valuestring != nullptr, ret = false);
764*4a64e381SAndroid Build Coastguard Worker         VerifyOrExit(Hex2BytesJsonString(std::string(value->valuestring), aDataset.mExtendedPanId.m8,
765*4a64e381SAndroid Build Coastguard Worker                                          OT_EXT_PAN_ID_SIZE) == OT_EXT_PAN_ID_SIZE,
766*4a64e381SAndroid Build Coastguard Worker                      ret = false);
767*4a64e381SAndroid Build Coastguard Worker         aDataset.mComponents.mIsExtendedPanIdPresent = true;
768*4a64e381SAndroid Build Coastguard Worker     }
769*4a64e381SAndroid Build Coastguard Worker     else if (cJSON_IsNull(value))
770*4a64e381SAndroid Build Coastguard Worker     {
771*4a64e381SAndroid Build Coastguard Worker         aDataset.mComponents.mIsExtendedPanIdPresent = false;
772*4a64e381SAndroid Build Coastguard Worker     }
773*4a64e381SAndroid Build Coastguard Worker 
774*4a64e381SAndroid Build Coastguard Worker     value = cJSON_GetObjectItemCaseSensitive(jsonActiveDataset, "MeshLocalPrefix");
775*4a64e381SAndroid Build Coastguard Worker     if (cJSON_IsString(value))
776*4a64e381SAndroid Build Coastguard Worker     {
777*4a64e381SAndroid Build Coastguard Worker         VerifyOrExit(value->valuestring != nullptr, ret = false);
778*4a64e381SAndroid Build Coastguard Worker         VerifyOrExit(Json2IpPrefix(value, aDataset.mMeshLocalPrefix) == OTBR_ERROR_NONE, ret = false);
779*4a64e381SAndroid Build Coastguard Worker         aDataset.mComponents.mIsMeshLocalPrefixPresent = true;
780*4a64e381SAndroid Build Coastguard Worker     }
781*4a64e381SAndroid Build Coastguard Worker     else if (cJSON_IsNull(value))
782*4a64e381SAndroid Build Coastguard Worker     {
783*4a64e381SAndroid Build Coastguard Worker         aDataset.mComponents.mIsMeshLocalPrefixPresent = false;
784*4a64e381SAndroid Build Coastguard Worker     }
785*4a64e381SAndroid Build Coastguard Worker 
786*4a64e381SAndroid Build Coastguard Worker     value = cJSON_GetObjectItemCaseSensitive(jsonActiveDataset, "PanId");
787*4a64e381SAndroid Build Coastguard Worker     if (cJSON_IsNumber(value))
788*4a64e381SAndroid Build Coastguard Worker     {
789*4a64e381SAndroid Build Coastguard Worker         aDataset.mPanId                      = static_cast<otPanId>(value->valueint);
790*4a64e381SAndroid Build Coastguard Worker         aDataset.mComponents.mIsPanIdPresent = true;
791*4a64e381SAndroid Build Coastguard Worker     }
792*4a64e381SAndroid Build Coastguard Worker     else if (cJSON_IsNull(value))
793*4a64e381SAndroid Build Coastguard Worker     {
794*4a64e381SAndroid Build Coastguard Worker         aDataset.mComponents.mIsPanIdPresent = false;
795*4a64e381SAndroid Build Coastguard Worker     }
796*4a64e381SAndroid Build Coastguard Worker 
797*4a64e381SAndroid Build Coastguard Worker     value = cJSON_GetObjectItemCaseSensitive(jsonActiveDataset, "Channel");
798*4a64e381SAndroid Build Coastguard Worker     if (cJSON_IsNumber(value))
799*4a64e381SAndroid Build Coastguard Worker     {
800*4a64e381SAndroid Build Coastguard Worker         aDataset.mChannel                      = static_cast<uint16_t>(value->valueint);
801*4a64e381SAndroid Build Coastguard Worker         aDataset.mComponents.mIsChannelPresent = true;
802*4a64e381SAndroid Build Coastguard Worker     }
803*4a64e381SAndroid Build Coastguard Worker     else if (cJSON_IsNull(value))
804*4a64e381SAndroid Build Coastguard Worker     {
805*4a64e381SAndroid Build Coastguard Worker         aDataset.mComponents.mIsChannelPresent = false;
806*4a64e381SAndroid Build Coastguard Worker     }
807*4a64e381SAndroid Build Coastguard Worker 
808*4a64e381SAndroid Build Coastguard Worker     value = cJSON_GetObjectItemCaseSensitive(jsonActiveDataset, "PSKc");
809*4a64e381SAndroid Build Coastguard Worker     if (cJSON_IsString(value))
810*4a64e381SAndroid Build Coastguard Worker     {
811*4a64e381SAndroid Build Coastguard Worker         VerifyOrExit(value->valuestring != nullptr, ret = false);
812*4a64e381SAndroid Build Coastguard Worker         VerifyOrExit(Hex2BytesJsonString(std::string(value->valuestring), aDataset.mPskc.m8, OT_PSKC_MAX_SIZE) ==
813*4a64e381SAndroid Build Coastguard Worker                          OT_PSKC_MAX_SIZE,
814*4a64e381SAndroid Build Coastguard Worker                      ret = false);
815*4a64e381SAndroid Build Coastguard Worker         aDataset.mComponents.mIsPskcPresent = true;
816*4a64e381SAndroid Build Coastguard Worker     }
817*4a64e381SAndroid Build Coastguard Worker     else if (cJSON_IsNull(value))
818*4a64e381SAndroid Build Coastguard Worker     {
819*4a64e381SAndroid Build Coastguard Worker         aDataset.mComponents.mIsPskcPresent = false;
820*4a64e381SAndroid Build Coastguard Worker     }
821*4a64e381SAndroid Build Coastguard Worker 
822*4a64e381SAndroid Build Coastguard Worker     value = cJSON_GetObjectItemCaseSensitive(jsonActiveDataset, "SecurityPolicy");
823*4a64e381SAndroid Build Coastguard Worker     if (cJSON_IsObject(value))
824*4a64e381SAndroid Build Coastguard Worker     {
825*4a64e381SAndroid Build Coastguard Worker         VerifyOrExit(Json2SecurityPolicy(value, aDataset.mSecurityPolicy), ret = false);
826*4a64e381SAndroid Build Coastguard Worker         aDataset.mComponents.mIsSecurityPolicyPresent = true;
827*4a64e381SAndroid Build Coastguard Worker     }
828*4a64e381SAndroid Build Coastguard Worker     else if (cJSON_IsNull(value))
829*4a64e381SAndroid Build Coastguard Worker     {
830*4a64e381SAndroid Build Coastguard Worker         aDataset.mComponents.mIsSecurityPolicyPresent = false;
831*4a64e381SAndroid Build Coastguard Worker     }
832*4a64e381SAndroid Build Coastguard Worker 
833*4a64e381SAndroid Build Coastguard Worker     value = cJSON_GetObjectItemCaseSensitive(jsonActiveDataset, "ChannelMask");
834*4a64e381SAndroid Build Coastguard Worker     if (cJSON_IsNumber(value))
835*4a64e381SAndroid Build Coastguard Worker     {
836*4a64e381SAndroid Build Coastguard Worker         aDataset.mChannelMask                      = value->valueint;
837*4a64e381SAndroid Build Coastguard Worker         aDataset.mComponents.mIsChannelMaskPresent = true;
838*4a64e381SAndroid Build Coastguard Worker     }
839*4a64e381SAndroid Build Coastguard Worker     else if (cJSON_IsNull(value))
840*4a64e381SAndroid Build Coastguard Worker     {
841*4a64e381SAndroid Build Coastguard Worker         aDataset.mComponents.mIsChannelMaskPresent = false;
842*4a64e381SAndroid Build Coastguard Worker     }
843*4a64e381SAndroid Build Coastguard Worker 
844*4a64e381SAndroid Build Coastguard Worker exit:
845*4a64e381SAndroid Build Coastguard Worker     return ret;
846*4a64e381SAndroid Build Coastguard Worker }
847*4a64e381SAndroid Build Coastguard Worker 
JsonActiveDatasetString2Dataset(const std::string & aJsonActiveDataset,otOperationalDataset & aDataset)848*4a64e381SAndroid Build Coastguard Worker bool JsonActiveDatasetString2Dataset(const std::string &aJsonActiveDataset, otOperationalDataset &aDataset)
849*4a64e381SAndroid Build Coastguard Worker {
850*4a64e381SAndroid Build Coastguard Worker     cJSON *jsonActiveDataset;
851*4a64e381SAndroid Build Coastguard Worker     bool   ret = true;
852*4a64e381SAndroid Build Coastguard Worker 
853*4a64e381SAndroid Build Coastguard Worker     VerifyOrExit((jsonActiveDataset = cJSON_Parse(aJsonActiveDataset.c_str())) != nullptr, ret = false);
854*4a64e381SAndroid Build Coastguard Worker     VerifyOrExit(cJSON_IsObject(jsonActiveDataset), ret = false);
855*4a64e381SAndroid Build Coastguard Worker 
856*4a64e381SAndroid Build Coastguard Worker     ret = JsonActiveDataset2Dataset(jsonActiveDataset, aDataset);
857*4a64e381SAndroid Build Coastguard Worker 
858*4a64e381SAndroid Build Coastguard Worker exit:
859*4a64e381SAndroid Build Coastguard Worker     cJSON_Delete(jsonActiveDataset);
860*4a64e381SAndroid Build Coastguard Worker 
861*4a64e381SAndroid Build Coastguard Worker     return ret;
862*4a64e381SAndroid Build Coastguard Worker }
863*4a64e381SAndroid Build Coastguard Worker 
JsonPendingDatasetString2Dataset(const std::string & aJsonPendingDataset,otOperationalDataset & aDataset)864*4a64e381SAndroid Build Coastguard Worker bool JsonPendingDatasetString2Dataset(const std::string &aJsonPendingDataset, otOperationalDataset &aDataset)
865*4a64e381SAndroid Build Coastguard Worker {
866*4a64e381SAndroid Build Coastguard Worker     cJSON      *value;
867*4a64e381SAndroid Build Coastguard Worker     cJSON      *jsonDataset;
868*4a64e381SAndroid Build Coastguard Worker     otTimestamp timestamp;
869*4a64e381SAndroid Build Coastguard Worker     bool        ret = true;
870*4a64e381SAndroid Build Coastguard Worker 
871*4a64e381SAndroid Build Coastguard Worker     VerifyOrExit((jsonDataset = cJSON_Parse(aJsonPendingDataset.c_str())) != nullptr, ret = false);
872*4a64e381SAndroid Build Coastguard Worker     VerifyOrExit(cJSON_IsObject(jsonDataset), ret = false);
873*4a64e381SAndroid Build Coastguard Worker 
874*4a64e381SAndroid Build Coastguard Worker     value = cJSON_GetObjectItemCaseSensitive(jsonDataset, "ActiveDataset");
875*4a64e381SAndroid Build Coastguard Worker     if (cJSON_IsObject(value))
876*4a64e381SAndroid Build Coastguard Worker     {
877*4a64e381SAndroid Build Coastguard Worker         VerifyOrExit(JsonActiveDataset2Dataset(value, aDataset), ret = false);
878*4a64e381SAndroid Build Coastguard Worker     }
879*4a64e381SAndroid Build Coastguard Worker     else if (cJSON_IsString(value))
880*4a64e381SAndroid Build Coastguard Worker     {
881*4a64e381SAndroid Build Coastguard Worker         otOperationalDatasetTlvs datasetTlvs;
882*4a64e381SAndroid Build Coastguard Worker         int                      len;
883*4a64e381SAndroid Build Coastguard Worker 
884*4a64e381SAndroid Build Coastguard Worker         len =
885*4a64e381SAndroid Build Coastguard Worker             Hex2BytesJsonString(std::string(value->valuestring), datasetTlvs.mTlvs, OT_OPERATIONAL_DATASET_MAX_LENGTH);
886*4a64e381SAndroid Build Coastguard Worker         VerifyOrExit(len > 0, ret = false);
887*4a64e381SAndroid Build Coastguard Worker         datasetTlvs.mLength = len;
888*4a64e381SAndroid Build Coastguard Worker 
889*4a64e381SAndroid Build Coastguard Worker         VerifyOrExit(otDatasetParseTlvs(&datasetTlvs, &aDataset) == OT_ERROR_NONE, ret = false);
890*4a64e381SAndroid Build Coastguard Worker     }
891*4a64e381SAndroid Build Coastguard Worker     else
892*4a64e381SAndroid Build Coastguard Worker     {
893*4a64e381SAndroid Build Coastguard Worker         ExitNow(ret = false);
894*4a64e381SAndroid Build Coastguard Worker     }
895*4a64e381SAndroid Build Coastguard Worker 
896*4a64e381SAndroid Build Coastguard Worker     value = cJSON_GetObjectItemCaseSensitive(jsonDataset, "PendingTimestamp");
897*4a64e381SAndroid Build Coastguard Worker     if (cJSON_IsObject(value))
898*4a64e381SAndroid Build Coastguard Worker     {
899*4a64e381SAndroid Build Coastguard Worker         VerifyOrExit(Json2Timestamp(value, timestamp), ret = false);
900*4a64e381SAndroid Build Coastguard Worker         aDataset.mPendingTimestamp                      = timestamp;
901*4a64e381SAndroid Build Coastguard Worker         aDataset.mComponents.mIsPendingTimestampPresent = true;
902*4a64e381SAndroid Build Coastguard Worker     }
903*4a64e381SAndroid Build Coastguard Worker     else if (cJSON_IsNull(value))
904*4a64e381SAndroid Build Coastguard Worker     {
905*4a64e381SAndroid Build Coastguard Worker         aDataset.mComponents.mIsPendingTimestampPresent = false;
906*4a64e381SAndroid Build Coastguard Worker     }
907*4a64e381SAndroid Build Coastguard Worker     else if (value != nullptr)
908*4a64e381SAndroid Build Coastguard Worker     {
909*4a64e381SAndroid Build Coastguard Worker         ExitNow(ret = false);
910*4a64e381SAndroid Build Coastguard Worker     }
911*4a64e381SAndroid Build Coastguard Worker 
912*4a64e381SAndroid Build Coastguard Worker     value = cJSON_GetObjectItemCaseSensitive(jsonDataset, "Delay");
913*4a64e381SAndroid Build Coastguard Worker     if (cJSON_IsNumber(value))
914*4a64e381SAndroid Build Coastguard Worker     {
915*4a64e381SAndroid Build Coastguard Worker         aDataset.mDelay                      = value->valueint;
916*4a64e381SAndroid Build Coastguard Worker         aDataset.mComponents.mIsDelayPresent = true;
917*4a64e381SAndroid Build Coastguard Worker     }
918*4a64e381SAndroid Build Coastguard Worker     else if (cJSON_IsNull(value))
919*4a64e381SAndroid Build Coastguard Worker     {
920*4a64e381SAndroid Build Coastguard Worker         aDataset.mComponents.mIsDelayPresent = false;
921*4a64e381SAndroid Build Coastguard Worker     }
922*4a64e381SAndroid Build Coastguard Worker 
923*4a64e381SAndroid Build Coastguard Worker exit:
924*4a64e381SAndroid Build Coastguard Worker     cJSON_Delete(jsonDataset);
925*4a64e381SAndroid Build Coastguard Worker 
926*4a64e381SAndroid Build Coastguard Worker     return ret;
927*4a64e381SAndroid Build Coastguard Worker }
928*4a64e381SAndroid Build Coastguard Worker 
929*4a64e381SAndroid Build Coastguard Worker } // namespace Json
930*4a64e381SAndroid Build Coastguard Worker } // namespace rest
931*4a64e381SAndroid Build Coastguard Worker } // namespace otbr
932