• 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 
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