• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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