1 /*
2 * Copyright (c) 2022 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include "json_utils.h"
17 #include "avsession_log.h"
18 #include "av_session.h"
19
20 namespace OHOS::AVSession {
ConvertSessionType(const std::string & typeString)21 int32_t JsonUtils::ConvertSessionType(const std::string& typeString)
22 {
23 int32_t type = AVSession::SESSION_TYPE_INVALID;
24 if (typeString == "audio") {
25 type = AVSession::SESSION_TYPE_AUDIO;
26 } else if (typeString == "video") {
27 type = AVSession::SESSION_TYPE_VIDEO;
28 }
29 return type;
30 }
31
ConvertSessionType(int32_t type)32 std::string JsonUtils::ConvertSessionType(int32_t type)
33 {
34 if (type == AVSession::SESSION_TYPE_AUDIO) {
35 return "audio";
36 } else if (type == AVSession::SESSION_TYPE_VIDEO) {
37 return "video";
38 } else {
39 return "";
40 }
41 }
42
JsonToVector(json object,std::vector<int32_t> & out)43 int32_t JsonUtils::JsonToVector(json object, std::vector<int32_t>& out)
44 {
45 CHECK_AND_RETURN_RET_LOG(!object.is_null(), AVSESSION_ERROR, "json object is null");
46 CHECK_AND_RETURN_RET_LOG(object.is_array(), AVSESSION_ERROR, "json object is not array");
47 for (json::iterator it = object.begin(); it != object.end(); ++it) {
48 out.push_back(it.value());
49 }
50 return AVSESSION_SUCCESS;
51 }
52
GetJsonCapability(const std::vector<std::vector<int32_t>> & capability,std::string & jsonCapability)53 int32_t JsonUtils::GetJsonCapability(const std::vector<std::vector<int32_t>>& capability, std::string& jsonCapability)
54 {
55 json jsonObject;
56 for (uint32_t i = 0; i < capability.size(); i++) {
57 if (i == SESSION_DATA_META) {
58 jsonObject["metaData"] = capability[i];
59 continue;
60 }
61 if (i == SESSION_DATA_PLAYBACK_STATE) {
62 jsonObject["playbackState"] = capability[i];
63 continue;
64 }
65 if (i == SESSION_DATA_CONTROL_COMMAND) {
66 jsonObject["controlCommand"] = capability[i];
67 continue;
68 }
69 }
70 jsonCapability = jsonObject.dump();
71 return AVSESSION_SUCCESS;
72 }
73
IsInt32(const json & jsonObj,const std::string & key)74 bool JsonUtils::IsInt32(const json& jsonObj, const std::string& key)
75 {
76 bool res = jsonObj.contains(key) && jsonObj[key].is_number_integer()
77 && INT32_MIN <= jsonObj[key] && jsonObj[key] <= INT32_MAX;
78 if (!res) {
79 SLOGE("The key %{public}s of jsonObj is invalid", key.c_str());
80 }
81 return res;
82 }
83
IsString(const json & jsonObj,const std::string & key)84 bool JsonUtils::IsString(const json& jsonObj, const std::string& key)
85 {
86 bool res = jsonObj.contains(key) && jsonObj[key].is_string();
87 if (!res) {
88 SLOGE("The key %{public}s of jsonObj is invalid", key.c_str());
89 }
90 return res;
91 }
92
GetVectorCapability(const std::string & jsonCapability,std::vector<std::vector<int32_t>> & vectorCapability)93 int32_t JsonUtils::GetVectorCapability(const std::string& jsonCapability,
94 std::vector<std::vector<int32_t>>& vectorCapability)
95 {
96 CHECK_AND_RETURN_RET_LOG(!jsonCapability.empty(), AVSESSION_ERROR, "jsonCapability is empty");
97 json jsonObj = json::parse(jsonCapability, nullptr, false);
98 CHECK_AND_RETURN_RET_LOG(!jsonObj.is_discarded() && !jsonObj.is_null(), AVSESSION_ERROR, "json object is null");
99 int32_t ret = JsonToVector(jsonObj["metaData"], vectorCapability[SESSION_DATA_META]);
100 CHECK_AND_CONTINUE_LOG(ret == AVSESSION_SUCCESS, "Get metaDataCapability error");
101 ret = JsonToVector(jsonObj["playbackState"], vectorCapability[SESSION_DATA_PLAYBACK_STATE]);
102 CHECK_AND_CONTINUE_LOG(ret == AVSESSION_SUCCESS, "Get playbackStateCapability error");
103 ret = JsonToVector(jsonObj["controlCommand"], vectorCapability[SESSION_DATA_CONTROL_COMMAND]);
104 CHECK_AND_CONTINUE_LOG(ret == AVSESSION_SUCCESS, "Get controlCommandCapability error");
105 return AVSESSION_SUCCESS;
106 }
107
GetAllCapability(const std::string & sessionInfo,std::string & jsonCapability)108 int32_t JsonUtils::GetAllCapability(const std::string& sessionInfo, std::string& jsonCapability)
109 {
110 CHECK_AND_RETURN_RET_LOG(!sessionInfo.empty(), AVSESSION_ERROR, "sessionInfo is empty");
111 json jsonSessionInfo = json::parse(sessionInfo, nullptr, false);
112 CHECK_AND_RETURN_RET_LOG(!jsonSessionInfo.is_discarded() && !jsonSessionInfo.is_null(), AVSESSION_ERROR,
113 "json object is null");
114 CHECK_AND_RETURN_RET_LOG(jsonSessionInfo.contains("compatibility"), AVSESSION_ERROR,
115 "The key of jsonObj is invalid");
116 json compatibility = jsonSessionInfo["compatibility"];
117 CHECK_AND_RETURN_RET_LOG(!compatibility.is_null(), AVSESSION_ERROR, "Getcompatibility error");
118 CHECK_AND_RETURN_RET_LOG(compatibility.contains("capabilitySet"), AVSESSION_ERROR,
119 "The key of compatibility is invalid");
120 json capabilitySet = compatibility["capabilitySet"];
121 CHECK_AND_RETURN_RET_LOG(!capabilitySet.is_null(), AVSESSION_ERROR, "GetCapabilitySet error");
122 jsonCapability = capabilitySet.dump();
123 return AVSESSION_SUCCESS;
124 }
125
SetSessionBasicInfo(std::string & sessionInfo,const AVSessionBasicInfo & basicInfo)126 int32_t JsonUtils::SetSessionBasicInfo(std::string& sessionInfo, const AVSessionBasicInfo& basicInfo)
127 {
128 json jsonObj;
129 if (sessionInfo.empty()) {
130 jsonObj = json::parse(R"({})", nullptr, false);
131 CHECK_AND_RETURN_RET_LOG(!jsonObj.is_discarded() && !jsonObj.is_null(), AVSESSION_ERROR, "json object is null");
132 } else {
133 jsonObj = json::parse(sessionInfo, nullptr, false);
134 CHECK_AND_RETURN_RET_LOG(!jsonObj.is_discarded() && !jsonObj.is_null(), AVSESSION_ERROR, "json object is null");
135 }
136 jsonObj["compatibility"]["networkId"] = basicInfo.networkId_;
137 jsonObj["compatibility"]["vendorId"] = basicInfo.vendorId_;
138 jsonObj["compatibility"]["deviceType"] = basicInfo.deviceType_;
139 jsonObj["compatibility"]["systemVersion"] = basicInfo.systemVersion_;
140 jsonObj["compatibility"]["avsessionVersion"] = basicInfo.sessionVersion_;
141 jsonObj["compatibility"]["reserve"] = basicInfo.reserve_;
142 jsonObj["compatibility"]["features"] = basicInfo.feature_;
143 jsonObj["compatibility"]["capabilitySet"]["metaData"] = basicInfo.metaDataCap_;
144 jsonObj["compatibility"]["capabilitySet"]["playbackState"] = basicInfo.playBackStateCap_;
145 jsonObj["compatibility"]["capabilitySet"]["controlCommand"] = basicInfo.controlCommandCap_;
146 jsonObj["compatibility"]["extendCapability"] = basicInfo.extendCapability_;
147 jsonObj["data"]["systemTime"] = basicInfo.systemTime_;
148 jsonObj["data"]["extend"] = basicInfo.extend_;
149 CHECK_AND_RETURN_RET_LOG(!jsonObj.empty(), AVSESSION_ERROR, "SetBasicInfo error");
150 sessionInfo = jsonObj.dump();
151 return AVSESSION_SUCCESS;
152 }
153
GetSessionBasicInfo(const std::string & sessionInfo,AVSessionBasicInfo & basicInfo)154 int32_t JsonUtils::GetSessionBasicInfo(const std::string& sessionInfo, AVSessionBasicInfo& basicInfo)
155 {
156 CHECK_AND_RETURN_RET_LOG(!sessionInfo.empty(), AVSESSION_ERROR, "sessionInfo is empty");
157 json jsonObj = json::parse(sessionInfo, nullptr, false);
158 CHECK_AND_RETURN_RET_LOG(!jsonObj.is_discarded() && !jsonObj.is_null(), AVSESSION_ERROR, "json object is null");
159 CHECK_AND_RETURN_RET_LOG(jsonObj.contains("compatibility") && jsonObj.contains("data"), AVSESSION_ERROR,
160 "The key of jsonObj is invalid");
161 json compatibility = jsonObj["compatibility"];
162 CHECK_AND_RETURN_RET_LOG(!compatibility.empty(), AVSESSION_ERROR, "Getcompatibility error");
163 CHECK_AND_RETURN_RET_LOG(IsString(compatibility, "networkId") && IsString(compatibility, "vendorId")
164 && IsString(compatibility, "deviceType") && IsString(compatibility, "systemVersion")
165 && IsInt32(compatibility, "avsessionVersion") && IsInt32(jsonObj["data"], "systemTime")
166 && compatibility.contains("reserve") && compatibility.contains("features")
167 && compatibility.contains("extendCapability") && IsInt32(jsonObj["data"], "extend"), AVSESSION_ERROR,
168 "The key of jsonObj is invalid");
169 basicInfo.networkId_ = compatibility["networkId"];
170 basicInfo.vendorId_ = compatibility["vendorId"];
171 basicInfo.deviceType_ = compatibility["deviceType"];
172 basicInfo.systemVersion_ = compatibility["systemVersion"];
173 basicInfo.sessionVersion_ = compatibility["avsessionVersion"];
174 int32_t ret = JsonToVector(compatibility["reserve"], basicInfo.reserve_);
175 CHECK_AND_RETURN_RET_LOG(ret == AVSESSION_SUCCESS, AVSESSION_ERROR, "Get reserve error");
176 ret = JsonToVector(compatibility["features"], basicInfo.feature_);
177 CHECK_AND_RETURN_RET_LOG(ret == AVSESSION_SUCCESS, AVSESSION_ERROR, "Get feature error");
178 CHECK_AND_RETURN_RET_LOG(compatibility.contains("capabilitySet"), AVSESSION_ERROR,
179 "The key of jsonObj is invalid");
180 json capabilitySet = compatibility["capabilitySet"];
181 CHECK_AND_RETURN_RET_LOG(!capabilitySet.empty(), AVSESSION_ERROR, "GetCapabilitySet error");
182 CHECK_AND_RETURN_RET_LOG(capabilitySet.contains("metaData") && capabilitySet.contains("playbackState")
183 && capabilitySet.contains("controlCommand"), AVSESSION_ERROR, "The key of jsonObj is invalid");
184 ret = JsonToVector(capabilitySet["metaData"], basicInfo.metaDataCap_);
185 CHECK_AND_RETURN_RET_LOG(ret == AVSESSION_SUCCESS, AVSESSION_ERROR, "Get metaData error");
186 ret = JsonToVector(capabilitySet["playbackState"], basicInfo.playBackStateCap_);
187 CHECK_AND_RETURN_RET_LOG(ret == AVSESSION_SUCCESS, AVSESSION_ERROR, "Get playbackState error");
188 ret = JsonToVector(capabilitySet["controlCommand"], basicInfo.controlCommandCap_);
189 CHECK_AND_RETURN_RET_LOG(ret == AVSESSION_SUCCESS, AVSESSION_ERROR, "Get controlCommand error");
190 ret = JsonToVector(compatibility["extendCapability"], basicInfo.extendCapability_);
191 CHECK_AND_RETURN_RET_LOG(ret == AVSESSION_SUCCESS, AVSESSION_ERROR, "Get extendCapability error");
192 basicInfo.systemTime_ = jsonObj["data"]["systemTime"];
193 ret = JsonToVector(jsonObj["data"]["extend"], basicInfo.extend_);
194 CHECK_AND_RETURN_RET_LOG(ret == AVSESSION_SUCCESS, AVSESSION_ERROR, "Get data extend error");
195 return AVSESSION_SUCCESS;
196 }
197
SetSessionDescriptors(std::string & sessionInfo,const std::vector<AVSessionDescriptor> & descriptors)198 int32_t JsonUtils::SetSessionDescriptors(std::string& sessionInfo, const std::vector<AVSessionDescriptor>& descriptors)
199 {
200 json jsonObj;
201 if (sessionInfo.empty()) {
202 jsonObj = json::parse(R"({})", nullptr, false);
203 CHECK_AND_RETURN_RET_LOG(!jsonObj.is_discarded() && !jsonObj.is_null(), AVSESSION_ERROR, "json object is null");
204 } else {
205 jsonObj = json::parse(sessionInfo, nullptr, false);
206 CHECK_AND_RETURN_RET_LOG(!jsonObj.is_discarded() && !jsonObj.is_null(), AVSESSION_ERROR, "json object is null");
207 }
208 for (uint32_t i = 0; i < descriptors.size(); i++) {
209 jsonObj["data"]["sessionDescriptors"][i]["sessionId"] = descriptors[i].sessionId_;
210 jsonObj["data"]["sessionDescriptors"][i]["type"] = ConvertSessionType(descriptors[i].sessionType_);
211 jsonObj["data"]["sessionDescriptors"][i]["bundleName"] = descriptors[i].elementName_.GetBundleName();
212 jsonObj["data"]["sessionDescriptors"][i]["abilityName"] = descriptors[i].elementName_.GetAbilityName();
213 jsonObj["data"]["sessionDescriptors"][i]["tag"] = descriptors[i].sessionTag_;
214 jsonObj["data"]["sessionDescriptors"][i]["isThirdPartyApp"] = descriptors[i].isThirdPartyApp_;
215 }
216 sessionInfo = jsonObj.dump();
217 return AVSESSION_SUCCESS;
218 }
219
GetSessionDescriptors(const std::string & sessionInfo,std::vector<AVSessionDescriptor> & descriptors)220 int32_t JsonUtils::GetSessionDescriptors(const std::string& sessionInfo, std::vector<AVSessionDescriptor>& descriptors)
221 {
222 CHECK_AND_RETURN_RET_LOG(!sessionInfo.empty(), AVSESSION_ERROR, "sessionInfo is empty");
223 json jsonObj = json::parse(sessionInfo, nullptr, false);
224 CHECK_AND_RETURN_RET_LOG(!jsonObj.is_discarded() && !jsonObj.is_null(), AVSESSION_ERROR, "json object is null");
225 CHECK_AND_RETURN_RET_LOG(jsonObj.contains("data"), AVSESSION_ERROR, "json object data is null");
226 CHECK_AND_RETURN_RET_LOG(jsonObj["data"].contains("sessionDescriptors"), AVSESSION_ERROR,
227 "The key of jsonObj is invalid");
228 json sessionDescriptors = jsonObj["data"]["sessionDescriptors"];
229 CHECK_AND_RETURN_RET_LOG(!sessionDescriptors.is_null(), AVSESSION_ERROR, "sessionDescriptors is null");
230 CHECK_AND_RETURN_RET_LOG(sessionDescriptors.is_array(), AVSESSION_ERROR, "json sessionDescriptors is not array");
231 for (json::iterator it = sessionDescriptors.begin(); it != sessionDescriptors.end(); ++it) {
232 AVSessionDescriptor descriptor;
233 descriptor.sessionId_ = it.value()["sessionId"];
234 std::string type = it.value()["type"];
235 descriptor.sessionType_ = ConvertSessionType(type);
236 descriptor.elementName_.SetBundleName(it.value()["bundleName"]);
237 descriptor.elementName_.SetAbilityName(it.value()["abilityName"]);
238 descriptor.sessionTag_ = it.value()["tag"];
239 descriptor.isThirdPartyApp_ = it.value()["isThirdPartyApp"];
240 descriptors.push_back(descriptor);
241 }
242 return AVSESSION_SUCCESS;
243 }
244
SetSessionDescriptor(std::string & sessionInfo,const AVSessionDescriptor & descriptor)245 int32_t JsonUtils::SetSessionDescriptor(std::string& sessionInfo, const AVSessionDescriptor& descriptor)
246 {
247 json jsonObj;
248 if (sessionInfo.empty()) {
249 jsonObj = json::parse(R"({})", nullptr, false);
250 CHECK_AND_RETURN_RET_LOG(!jsonObj.is_discarded() && !jsonObj.is_null(), AVSESSION_ERROR, "json object is null");
251 } else {
252 jsonObj = json::parse(sessionInfo, nullptr, false);
253 CHECK_AND_RETURN_RET_LOG(!jsonObj.is_discarded() && !jsonObj.is_null(), AVSESSION_ERROR, "json object is null");
254 }
255 jsonObj["data"]["sessionDescriptor"]["sessionId"] = descriptor.sessionId_;
256 jsonObj["data"]["sessionDescriptor"]["type"] = ConvertSessionType(descriptor.sessionType_);
257 jsonObj["data"]["sessionDescriptor"]["bundleName"] = descriptor.elementName_.GetBundleName();
258 jsonObj["data"]["sessionDescriptor"]["abilityName"] = descriptor.elementName_.GetAbilityName();
259 jsonObj["data"]["sessionDescriptor"]["tag"] = descriptor.sessionTag_;
260 jsonObj["data"]["sessionDescriptor"]["isThirdPartyApp"] = descriptor.isThirdPartyApp_;
261 sessionInfo = jsonObj.dump();
262 return AVSESSION_SUCCESS;
263 }
264
GetSessionDescriptor(const std::string & sessionInfo,AVSessionDescriptor & descriptor)265 int32_t JsonUtils::GetSessionDescriptor(const std::string& sessionInfo, AVSessionDescriptor& descriptor)
266 {
267 CHECK_AND_RETURN_RET_LOG(!sessionInfo.empty(), AVSESSION_ERROR, "sessionInfo is empty");
268 json jsonObj = json::parse(sessionInfo, nullptr, false);
269 CHECK_AND_RETURN_RET_LOG(!jsonObj.is_discarded() && !jsonObj.is_null(), AVSESSION_ERROR, "json object is null");
270 CHECK_AND_RETURN_RET_LOG(jsonObj.contains("data"), AVSESSION_ERROR, "json object data is null");
271 CHECK_AND_RETURN_RET_LOG(jsonObj["data"].contains("sessionDescriptor"), AVSESSION_ERROR,
272 "The key of jsonObj is invalid");
273 json sessionDescriptor = jsonObj["data"]["sessionDescriptor"];
274 CHECK_AND_RETURN_RET_LOG(!sessionDescriptor.is_null(), AVSESSION_ERROR, "sessionDescriptor is null");
275
276 descriptor.sessionId_ = sessionDescriptor["sessionId"];
277 std::string type = sessionDescriptor["type"];
278 descriptor.sessionType_ = ConvertSessionType(type);
279 descriptor.elementName_.SetBundleName(sessionDescriptor["bundleName"]);
280 descriptor.elementName_.SetAbilityName(sessionDescriptor["abilityName"]);
281 descriptor.sessionTag_ = sessionDescriptor["tag"];
282 descriptor.isThirdPartyApp_ = sessionDescriptor["isThirdPartyApp"];
283 return AVSESSION_SUCCESS;
284 }
285 } // namespace OHOS::AVSession