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
GetVectorCapability(const std::string & jsonCapability,std::vector<std::vector<int32_t>> & vectorCapability)74 int32_t JsonUtils::GetVectorCapability(const std::string& jsonCapability,
75 std::vector<std::vector<int32_t>>& vectorCapability)
76 {
77 CHECK_AND_RETURN_RET_LOG(!jsonCapability.empty(), AVSESSION_ERROR, "jsonCapability is empty");
78 json jsonObj = json::parse(jsonCapability, nullptr, false);
79 CHECK_AND_RETURN_RET_LOG(!jsonObj.is_discarded() && !jsonObj.is_null(), AVSESSION_ERROR, "json object is null");
80 int32_t ret = JsonToVector(jsonObj["metaData"], vectorCapability[SESSION_DATA_META]);
81 CHECK_AND_CONTINUE_LOG(ret == AVSESSION_SUCCESS, "Get metaDataCapability error");
82 ret = JsonToVector(jsonObj["playbackState"], vectorCapability[SESSION_DATA_PLAYBACK_STATE]);
83 CHECK_AND_CONTINUE_LOG(ret == AVSESSION_SUCCESS, "Get playbackStateCapability error");
84 ret = JsonToVector(jsonObj["controlCommand"], vectorCapability[SESSION_DATA_CONTROL_COMMAND]);
85 CHECK_AND_CONTINUE_LOG(ret == AVSESSION_SUCCESS, "Get controlCommandCapability error");
86 return AVSESSION_SUCCESS;
87 }
88
GetAllCapability(const std::string & sessionInfo,std::string & jsonCapability)89 int32_t JsonUtils::GetAllCapability(const std::string& sessionInfo, std::string& jsonCapability)
90 {
91 CHECK_AND_RETURN_RET_LOG(!sessionInfo.empty(), AVSESSION_ERROR, "sessionInfo is empty");
92 json jsonSessionInfo = json::parse(sessionInfo, nullptr, false);
93 CHECK_AND_RETURN_RET_LOG(!jsonSessionInfo.is_discarded() && !jsonSessionInfo.is_null(), AVSESSION_ERROR,
94 "json object is null");
95 json compatibility = jsonSessionInfo["compatibility"];
96 CHECK_AND_RETURN_RET_LOG(!compatibility.is_null(), AVSESSION_ERROR, "Getcompatibility error");
97 json capabilitySet = compatibility["capabilitySet"];
98 CHECK_AND_RETURN_RET_LOG(!capabilitySet.is_null(), AVSESSION_ERROR, "GetCapabilitySet error");
99 jsonCapability = capabilitySet.dump();
100 return AVSESSION_SUCCESS;
101 }
102
SetSessionBasicInfo(std::string & sessionInfo,const AVSessionBasicInfo & basicInfo)103 int32_t JsonUtils::SetSessionBasicInfo(std::string& sessionInfo, const AVSessionBasicInfo& basicInfo)
104 {
105 json jsonObj;
106 if (sessionInfo.empty()) {
107 jsonObj = json::parse(R"({})", nullptr, false);
108 CHECK_AND_RETURN_RET_LOG(!jsonObj.is_discarded() && !jsonObj.is_null(), AVSESSION_ERROR, "json object is null");
109 } else {
110 jsonObj = json::parse(sessionInfo, nullptr, false);
111 CHECK_AND_RETURN_RET_LOG(!jsonObj.is_discarded() && !jsonObj.is_null(), AVSESSION_ERROR, "json object is null");
112 }
113 jsonObj["compatibility"]["networkId"] = basicInfo.networkId_;
114 jsonObj["compatibility"]["vendorId"] = basicInfo.vendorId_;
115 jsonObj["compatibility"]["deviceType"] = basicInfo.deviceType_;
116 jsonObj["compatibility"]["systemVersion"] = basicInfo.systemVersion_;
117 jsonObj["compatibility"]["avsessionVersion"] = basicInfo.sessionVersion_;
118 jsonObj["compatibility"]["reserve"] = basicInfo.reserve_;
119 jsonObj["compatibility"]["features"] = basicInfo.feature_;
120 jsonObj["compatibility"]["capabilitySet"]["metaData"] = basicInfo.metaDataCap_;
121 jsonObj["compatibility"]["capabilitySet"]["playbackState"] = basicInfo.playBackStateCap_;
122 jsonObj["compatibility"]["capabilitySet"]["controlCommand"] = basicInfo.controlCommandCap_;
123 jsonObj["compatibility"]["extendCapability"] = basicInfo.extendCapability_;
124 jsonObj["data"]["systemTime"] = basicInfo.systemTime_;
125 jsonObj["data"]["extend"] = basicInfo.extend_;
126 CHECK_AND_RETURN_RET_LOG(!jsonObj.empty(), AVSESSION_ERROR, "SetBasicInfo error");
127 sessionInfo = jsonObj.dump();
128 return AVSESSION_SUCCESS;
129 }
130
GetSessionBasicInfo(const std::string & sessionInfo,AVSessionBasicInfo & basicInfo)131 int32_t JsonUtils::GetSessionBasicInfo(const std::string& sessionInfo, AVSessionBasicInfo& basicInfo)
132 {
133 CHECK_AND_RETURN_RET_LOG(!sessionInfo.empty(), AVSESSION_ERROR, "sessionInfo is empty");
134 json jsonObj = json::parse(sessionInfo, nullptr, false);
135 CHECK_AND_RETURN_RET_LOG(!jsonObj.is_discarded() && !jsonObj.is_null(), AVSESSION_ERROR, "json object is null");
136 json compatibility = jsonObj["compatibility"];
137 CHECK_AND_RETURN_RET_LOG(!compatibility.empty(), AVSESSION_ERROR, "Getcompatibility error");
138 basicInfo.networkId_ = compatibility["networkId"];
139 basicInfo.vendorId_ = compatibility["vendorId"];
140 basicInfo.deviceType_ = compatibility["deviceType"];
141 basicInfo.systemVersion_ = compatibility["systemVersion"];
142 basicInfo.sessionVersion_ = compatibility["avsessionVersion"];
143 int32_t ret = JsonToVector(compatibility["reserve"], basicInfo.reserve_);
144 CHECK_AND_RETURN_RET_LOG(ret == AVSESSION_SUCCESS, AVSESSION_ERROR, "Get reserve error");
145 ret = JsonToVector(compatibility["features"], basicInfo.feature_);
146 CHECK_AND_RETURN_RET_LOG(ret == AVSESSION_SUCCESS, AVSESSION_ERROR, "Get feature error");
147 json capabilitySet = compatibility["capabilitySet"];
148 CHECK_AND_RETURN_RET_LOG(!capabilitySet.empty(), AVSESSION_ERROR, "GetCapabilitySet error");
149 ret = JsonToVector(capabilitySet["metaData"], basicInfo.metaDataCap_);
150 CHECK_AND_RETURN_RET_LOG(ret == AVSESSION_SUCCESS, AVSESSION_ERROR, "Get metaData error");
151 ret = JsonToVector(capabilitySet["playbackState"], basicInfo.playBackStateCap_);
152 CHECK_AND_RETURN_RET_LOG(ret == AVSESSION_SUCCESS, AVSESSION_ERROR, "Get playbackState error");
153 ret = JsonToVector(capabilitySet["controlCommand"], basicInfo.controlCommandCap_);
154 CHECK_AND_RETURN_RET_LOG(ret == AVSESSION_SUCCESS, AVSESSION_ERROR, "Get controlCommand error");
155 ret = JsonToVector(compatibility["extendCapability"], basicInfo.extendCapability_);
156 CHECK_AND_RETURN_RET_LOG(ret == AVSESSION_SUCCESS, AVSESSION_ERROR, "Get extendCapability error");
157 basicInfo.systemTime_ = jsonObj["data"]["systemTime"];
158 ret = JsonToVector(jsonObj["data"]["extend"], basicInfo.extend_);
159 CHECK_AND_RETURN_RET_LOG(ret == AVSESSION_SUCCESS, AVSESSION_ERROR, "Get data extend error");
160 return AVSESSION_SUCCESS;
161 }
162
SetSessionDescriptors(std::string & sessionInfo,const std::vector<AVSessionDescriptor> & descriptors)163 int32_t JsonUtils::SetSessionDescriptors(std::string& sessionInfo, const std::vector<AVSessionDescriptor>& descriptors)
164 {
165 json jsonObj;
166 if (sessionInfo.empty()) {
167 jsonObj = json::parse(R"({})", nullptr, false);
168 CHECK_AND_RETURN_RET_LOG(!jsonObj.is_discarded() && !jsonObj.is_null(), AVSESSION_ERROR, "json object is null");
169 } else {
170 jsonObj = json::parse(sessionInfo, nullptr, false);
171 CHECK_AND_RETURN_RET_LOG(!jsonObj.is_discarded() && !jsonObj.is_null(), AVSESSION_ERROR, "json object is null");
172 }
173 for (uint32_t i = 0; i < descriptors.size(); i++) {
174 jsonObj["data"]["sessionDescriptors"][i]["sessionId"] = descriptors[i].sessionId_;
175 jsonObj["data"]["sessionDescriptors"][i]["type"] = ConvertSessionType(descriptors[i].sessionType_);
176 jsonObj["data"]["sessionDescriptors"][i]["bundleName"] = descriptors[i].elementName_.GetBundleName();
177 jsonObj["data"]["sessionDescriptors"][i]["abilityName"] = descriptors[i].elementName_.GetAbilityName();
178 jsonObj["data"]["sessionDescriptors"][i]["tag"] = descriptors[i].sessionTag_;
179 jsonObj["data"]["sessionDescriptors"][i]["isThirdPartyApp"] = descriptors[i].isThirdPartyApp_;
180 }
181 sessionInfo = jsonObj.dump();
182 return AVSESSION_SUCCESS;
183 }
184
GetSessionDescriptors(const std::string & sessionInfo,std::vector<AVSessionDescriptor> & descriptors)185 int32_t JsonUtils::GetSessionDescriptors(const std::string& sessionInfo, std::vector<AVSessionDescriptor>& descriptors)
186 {
187 CHECK_AND_RETURN_RET_LOG(!sessionInfo.empty(), AVSESSION_ERROR, "sessionInfo is empty");
188 json jsonObj = json::parse(sessionInfo, nullptr, false);
189 CHECK_AND_RETURN_RET_LOG(!jsonObj.is_discarded() && !jsonObj.is_null(), AVSESSION_ERROR, "json object is null");
190 CHECK_AND_RETURN_RET_LOG(jsonObj.contains("data"), AVSESSION_ERROR, "json object data is null");
191 json sessionDescriptors = jsonObj["data"]["sessionDescriptors"];
192 CHECK_AND_RETURN_RET_LOG(!sessionDescriptors.is_null(), AVSESSION_ERROR, "sessionDescriptors is null");
193 CHECK_AND_RETURN_RET_LOG(sessionDescriptors.is_array(), AVSESSION_ERROR, "json sessionDescriptors is not array");
194 for (json::iterator it = sessionDescriptors.begin(); it != sessionDescriptors.end(); ++it) {
195 AVSessionDescriptor descriptor;
196 descriptor.sessionId_ = it.value()["sessionId"];
197 std::string type = it.value()["type"];
198 descriptor.sessionType_ = ConvertSessionType(type);
199 descriptor.elementName_.SetBundleName(it.value()["bundleName"]);
200 descriptor.elementName_.SetAbilityName(it.value()["abilityName"]);
201 descriptor.sessionTag_ = it.value()["tag"];
202 descriptor.isThirdPartyApp_ = it.value()["isThirdPartyApp"];
203 descriptors.push_back(descriptor);
204 }
205 return AVSESSION_SUCCESS;
206 }
207
SetSessionDescriptor(std::string & sessionInfo,const AVSessionDescriptor & descriptor)208 int32_t JsonUtils::SetSessionDescriptor(std::string& sessionInfo, const AVSessionDescriptor& descriptor)
209 {
210 json jsonObj;
211 if (sessionInfo.empty()) {
212 jsonObj = json::parse(R"({})", nullptr, false);
213 CHECK_AND_RETURN_RET_LOG(!jsonObj.is_discarded() && !jsonObj.is_null(), AVSESSION_ERROR, "json object is null");
214 } else {
215 jsonObj = json::parse(sessionInfo, nullptr, false);
216 CHECK_AND_RETURN_RET_LOG(!jsonObj.is_discarded() && !jsonObj.is_null(), AVSESSION_ERROR, "json object is null");
217 }
218 jsonObj["data"]["sessionDescriptor"]["sessionId"] = descriptor.sessionId_;
219 jsonObj["data"]["sessionDescriptor"]["type"] = ConvertSessionType(descriptor.sessionType_);
220 jsonObj["data"]["sessionDescriptor"]["bundleName"] = descriptor.elementName_.GetBundleName();
221 jsonObj["data"]["sessionDescriptor"]["abilityName"] = descriptor.elementName_.GetAbilityName();
222 jsonObj["data"]["sessionDescriptor"]["tag"] = descriptor.sessionTag_;
223 jsonObj["data"]["sessionDescriptor"]["isThirdPartyApp"] = descriptor.isThirdPartyApp_;
224 sessionInfo = jsonObj.dump();
225 return AVSESSION_SUCCESS;
226 }
227
GetSessionDescriptor(const std::string & sessionInfo,AVSessionDescriptor & descriptor)228 int32_t JsonUtils::GetSessionDescriptor(const std::string& sessionInfo, AVSessionDescriptor& descriptor)
229 {
230 CHECK_AND_RETURN_RET_LOG(!sessionInfo.empty(), AVSESSION_ERROR, "sessionInfo is empty");
231 json jsonObj = json::parse(sessionInfo, nullptr, false);
232 CHECK_AND_RETURN_RET_LOG(!jsonObj.is_discarded() && !jsonObj.is_null(), AVSESSION_ERROR, "json object is null");
233 CHECK_AND_RETURN_RET_LOG(jsonObj.contains("data"), AVSESSION_ERROR, "json object data is null");
234 json sessionDescriptor = jsonObj["data"]["sessionDescriptor"];
235 CHECK_AND_RETURN_RET_LOG(!sessionDescriptor.is_null(), AVSESSION_ERROR, "sessionDescriptor is null");
236
237 descriptor.sessionId_ = sessionDescriptor["sessionId"];
238 std::string type = sessionDescriptor["type"];
239 descriptor.sessionType_ = ConvertSessionType(type);
240 descriptor.elementName_.SetBundleName(sessionDescriptor["bundleName"]);
241 descriptor.elementName_.SetAbilityName(sessionDescriptor["abilityName"]);
242 descriptor.sessionTag_ = sessionDescriptor["tag"];
243 descriptor.isThirdPartyApp_ = sessionDescriptor["isThirdPartyApp"];
244 return AVSESSION_SUCCESS;
245 }
246 } // namespace OHOS::AVSession