1eace7efcSopenharmony_ci/*
2eace7efcSopenharmony_ci * Copyright (c) 2021-2024 Huawei Device Co., Ltd.
3eace7efcSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4eace7efcSopenharmony_ci * you may not use this file except in compliance with the License.
5eace7efcSopenharmony_ci * You may obtain a copy of the License at
6eace7efcSopenharmony_ci *
7eace7efcSopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8eace7efcSopenharmony_ci *
9eace7efcSopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10eace7efcSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11eace7efcSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12eace7efcSopenharmony_ci * See the License for the specific language governing permissions and
13eace7efcSopenharmony_ci * limitations under the License.
14eace7efcSopenharmony_ci */
15eace7efcSopenharmony_ci
16eace7efcSopenharmony_ci#include "inner_mission_info.h"
17eace7efcSopenharmony_ci
18eace7efcSopenharmony_ci#include "hilog_tag_wrapper.h"
19eace7efcSopenharmony_ci
20eace7efcSopenharmony_cinamespace OHOS {
21eace7efcSopenharmony_cinamespace AAFwk {
22eace7efcSopenharmony_cinamespace {
23eace7efcSopenharmony_ciconst std::string KEY_MISSION_NAME = "MissionName";
24eace7efcSopenharmony_ciconst std::string KEY_LAUNCH_MODE = "LaunchMode";
25eace7efcSopenharmony_ciconst std::string KEY_MISSION_ID = "MissionId";
26eace7efcSopenharmony_ciconst std::string KEY_RUNNING_STATE = "RunningState";
27eace7efcSopenharmony_ciconst std::string KEY_LOCKED_STATE = "LockedState";
28eace7efcSopenharmony_ciconst std::string KEY_CONTINUABLE = "Continuable";
29eace7efcSopenharmony_ciconst std::string KEY_TIME = "Time";
30eace7efcSopenharmony_ciconst std::string KEY_LABEL = "Label";
31eace7efcSopenharmony_ciconst std::string KEY_ICON_PATH = "IconPath";
32eace7efcSopenharmony_ciconst std::string KEY_WANT = "Want";
33eace7efcSopenharmony_ciconst std::string KEY_START_METHOD = "StartMethod";
34eace7efcSopenharmony_ciconst std::string KEY_BUNDLE_NAME = "BundleName";
35eace7efcSopenharmony_ciconst std::string KEY_UID = "Uid";
36eace7efcSopenharmony_ciconst std::string KEY_IS_TEMPORARY = "IsTemporary";
37eace7efcSopenharmony_ciconst std::string KEY_SPEC_FLAG = "SpecFlag";
38eace7efcSopenharmony_ciconst std::string KEY_HAS_RECONER_INFO = "hasRecoverInfo";
39eace7efcSopenharmony_ci}
40eace7efcSopenharmony_cistd::string InnerMissionInfo::ToJsonStr() const
41eace7efcSopenharmony_ci{
42eace7efcSopenharmony_ci    nlohmann::json value;
43eace7efcSopenharmony_ci    value[KEY_MISSION_NAME] = missionName;
44eace7efcSopenharmony_ci    value[KEY_LAUNCH_MODE] = launchMode;
45eace7efcSopenharmony_ci    value[KEY_IS_TEMPORARY] = isTemporary;
46eace7efcSopenharmony_ci    value[KEY_BUNDLE_NAME] = bundleName;
47eace7efcSopenharmony_ci    value[KEY_START_METHOD] = startMethod;
48eace7efcSopenharmony_ci    value[KEY_UID] = uid;
49eace7efcSopenharmony_ci    value[KEY_SPEC_FLAG] = specifiedFlag;
50eace7efcSopenharmony_ci    value[KEY_MISSION_ID] = missionInfo.id;
51eace7efcSopenharmony_ci    value[KEY_RUNNING_STATE] = missionInfo.runningState;
52eace7efcSopenharmony_ci    value[KEY_LOCKED_STATE] = missionInfo.lockedState;
53eace7efcSopenharmony_ci    value[KEY_CONTINUABLE] = missionInfo.continuable;
54eace7efcSopenharmony_ci    value[KEY_TIME] = missionInfo.time;
55eace7efcSopenharmony_ci    value[KEY_LABEL] = missionInfo.label;
56eace7efcSopenharmony_ci    value[KEY_ICON_PATH] = missionInfo.iconPath;
57eace7efcSopenharmony_ci    value[KEY_WANT] = missionInfo.want.ToUri();
58eace7efcSopenharmony_ci    value[KEY_HAS_RECONER_INFO] = hasRecoverInfo;
59eace7efcSopenharmony_ci
60eace7efcSopenharmony_ci    return value.dump();
61eace7efcSopenharmony_ci}
62eace7efcSopenharmony_ci
63eace7efcSopenharmony_cibool InnerMissionInfo::FromJsonStr(const std::string &jsonStr)
64eace7efcSopenharmony_ci{
65eace7efcSopenharmony_ci    // Do not throw exceptions in nlohmann::json::parse
66eace7efcSopenharmony_ci    if (jsonStr.empty()) {
67eace7efcSopenharmony_ci        return false;
68eace7efcSopenharmony_ci    }
69eace7efcSopenharmony_ci    nlohmann::json value = nlohmann::json::parse(jsonStr, nullptr, false);
70eace7efcSopenharmony_ci    if (value.is_discarded()) {
71eace7efcSopenharmony_ci        TAG_LOGE(AAFwkTag::ABILITYMGR, "json failed: %{private}s", jsonStr.c_str());
72eace7efcSopenharmony_ci        return false;
73eace7efcSopenharmony_ci    }
74eace7efcSopenharmony_ci
75eace7efcSopenharmony_ci    if (!CheckJsonNode(value, KEY_MISSION_NAME, JsonType::STRING)) {
76eace7efcSopenharmony_ci        return false;
77eace7efcSopenharmony_ci    }
78eace7efcSopenharmony_ci    missionName = value[KEY_MISSION_NAME].get<std::string>();
79eace7efcSopenharmony_ci
80eace7efcSopenharmony_ci    if (!CheckJsonNode(value, KEY_LAUNCH_MODE, JsonType::NUMBER)) {
81eace7efcSopenharmony_ci        return false;
82eace7efcSopenharmony_ci    }
83eace7efcSopenharmony_ci    launchMode = value[KEY_LAUNCH_MODE].get<int32_t>();
84eace7efcSopenharmony_ci    if (!CheckJsonNode(value, KEY_IS_TEMPORARY, JsonType::BOOLEAN)) {
85eace7efcSopenharmony_ci        return false;
86eace7efcSopenharmony_ci    }
87eace7efcSopenharmony_ci    isTemporary = value[KEY_IS_TEMPORARY].get<bool>();
88eace7efcSopenharmony_ci    if (!CheckJsonNode(value, KEY_START_METHOD, JsonType::NUMBER)) {
89eace7efcSopenharmony_ci        return false;
90eace7efcSopenharmony_ci    }
91eace7efcSopenharmony_ci    startMethod = value[KEY_START_METHOD].get<int32_t>();
92eace7efcSopenharmony_ci    if (!CheckJsonNode(value, KEY_BUNDLE_NAME, JsonType::STRING)) {
93eace7efcSopenharmony_ci        return false;
94eace7efcSopenharmony_ci    }
95eace7efcSopenharmony_ci    bundleName = value[KEY_BUNDLE_NAME].get<std::string>();
96eace7efcSopenharmony_ci    if (!CheckJsonNode(value, KEY_UID, JsonType::NUMBER)) {
97eace7efcSopenharmony_ci        return false;
98eace7efcSopenharmony_ci    }
99eace7efcSopenharmony_ci    uid = value[KEY_UID].get<int32_t>();
100eace7efcSopenharmony_ci    if (!CheckJsonNode(value, KEY_SPEC_FLAG, JsonType::STRING)) {
101eace7efcSopenharmony_ci        return false;
102eace7efcSopenharmony_ci    }
103eace7efcSopenharmony_ci    specifiedFlag = value[KEY_SPEC_FLAG].get<std::string>();
104eace7efcSopenharmony_ci    if (!CheckJsonNode(value, KEY_MISSION_ID, JsonType::NUMBER)) {
105eace7efcSopenharmony_ci        return false;
106eace7efcSopenharmony_ci    }
107eace7efcSopenharmony_ci    missionInfo.id = value[KEY_MISSION_ID].get<int32_t>();
108eace7efcSopenharmony_ci    if (!CheckJsonNode(value, KEY_RUNNING_STATE, JsonType::NUMBER)) {
109eace7efcSopenharmony_ci        return false;
110eace7efcSopenharmony_ci    }
111eace7efcSopenharmony_ci    missionInfo.runningState = value[KEY_RUNNING_STATE].get<int32_t>();
112eace7efcSopenharmony_ci    if (!CheckJsonNode(value, KEY_LOCKED_STATE, JsonType::BOOLEAN)) {
113eace7efcSopenharmony_ci        return false;
114eace7efcSopenharmony_ci    }
115eace7efcSopenharmony_ci    missionInfo.lockedState = value[KEY_LOCKED_STATE].get<bool>();
116eace7efcSopenharmony_ci    if (!CheckJsonNode(value, KEY_CONTINUABLE, JsonType::BOOLEAN)) {
117eace7efcSopenharmony_ci        return false;
118eace7efcSopenharmony_ci    }
119eace7efcSopenharmony_ci    missionInfo.continuable = value[KEY_CONTINUABLE].get<bool>();
120eace7efcSopenharmony_ci    if (!CheckJsonNode(value, KEY_TIME, JsonType::STRING)) {
121eace7efcSopenharmony_ci        return false;
122eace7efcSopenharmony_ci    }
123eace7efcSopenharmony_ci    missionInfo.time = value[KEY_TIME].get<std::string>();
124eace7efcSopenharmony_ci    if (!CheckJsonNode(value, KEY_LABEL, JsonType::STRING)) {
125eace7efcSopenharmony_ci        return false;
126eace7efcSopenharmony_ci    }
127eace7efcSopenharmony_ci    missionInfo.label = value[KEY_LABEL].get<std::string>();
128eace7efcSopenharmony_ci    if (!CheckJsonNode(value, KEY_ICON_PATH, JsonType::STRING)) {
129eace7efcSopenharmony_ci        return false;
130eace7efcSopenharmony_ci    }
131eace7efcSopenharmony_ci    missionInfo.iconPath = value[KEY_ICON_PATH].get<std::string>();
132eace7efcSopenharmony_ci    if (!CheckJsonNode(value, KEY_WANT, JsonType::STRING)) {
133eace7efcSopenharmony_ci        return false;
134eace7efcSopenharmony_ci    }
135eace7efcSopenharmony_ci    if (!CheckJsonNode(value, KEY_HAS_RECONER_INFO, JsonType::BOOLEAN)) {
136eace7efcSopenharmony_ci        return false;
137eace7efcSopenharmony_ci    }
138eace7efcSopenharmony_ci    hasRecoverInfo = value[KEY_HAS_RECONER_INFO].get<bool>();
139eace7efcSopenharmony_ci    Want* want = Want::ParseUri(value[KEY_WANT].get<std::string>());
140eace7efcSopenharmony_ci    if (want) {
141eace7efcSopenharmony_ci        missionInfo.want = *want;
142eace7efcSopenharmony_ci    }
143eace7efcSopenharmony_ci    return true;
144eace7efcSopenharmony_ci}
145eace7efcSopenharmony_ci
146eace7efcSopenharmony_civoid InnerMissionInfo::Dump(std::vector<std::string> &info) const
147eace7efcSopenharmony_ci{
148eace7efcSopenharmony_ci    std::string dumpInfo = "      Mission ID #" + std::to_string(missionInfo.id);
149eace7efcSopenharmony_ci    info.push_back(dumpInfo);
150eace7efcSopenharmony_ci    dumpInfo = "        mission name [" + missionName + "]";
151eace7efcSopenharmony_ci    info.push_back(dumpInfo);
152eace7efcSopenharmony_ci    dumpInfo = "        runningState [" + std::to_string(missionInfo.runningState) + "]";
153eace7efcSopenharmony_ci    info.push_back(dumpInfo);
154eace7efcSopenharmony_ci    dumpInfo = "        lockedState [" + std::to_string(missionInfo.lockedState) + "]";
155eace7efcSopenharmony_ci    info.push_back(dumpInfo);
156eace7efcSopenharmony_ci    dumpInfo = "        continuable [" + std::to_string(missionInfo.continuable) + "]";
157eace7efcSopenharmony_ci    info.push_back(dumpInfo);
158eace7efcSopenharmony_ci    dumpInfo = "        timeStamp [" + missionInfo.time + "]";
159eace7efcSopenharmony_ci    info.push_back(dumpInfo);
160eace7efcSopenharmony_ci    dumpInfo = "        label [" + missionInfo.label + "]";
161eace7efcSopenharmony_ci    info.push_back(dumpInfo);
162eace7efcSopenharmony_ci    dumpInfo = "        iconPath [" + missionInfo.iconPath + "]";
163eace7efcSopenharmony_ci    info.push_back(dumpInfo);
164eace7efcSopenharmony_ci    dumpInfo = "        want [" + missionInfo.want.ToUri() + "]";
165eace7efcSopenharmony_ci    info.push_back(dumpInfo);
166eace7efcSopenharmony_ci}
167eace7efcSopenharmony_ci
168eace7efcSopenharmony_cibool InnerMissionInfo::CheckJsonNode(nlohmann::json &value, const std::string &node, JsonType jsonType)
169eace7efcSopenharmony_ci{
170eace7efcSopenharmony_ci    if (value.find(node) == value.end()) {
171eace7efcSopenharmony_ci        TAG_LOGE(AAFwkTag::ABILITYMGR, "node %{private}s null", node.c_str());
172eace7efcSopenharmony_ci        return false;
173eace7efcSopenharmony_ci    }
174eace7efcSopenharmony_ci
175eace7efcSopenharmony_ci    if (jsonType == JsonType::NUMBER) {
176eace7efcSopenharmony_ci        return value[node].is_number();
177eace7efcSopenharmony_ci    }
178eace7efcSopenharmony_ci    if (jsonType == JsonType::STRING) {
179eace7efcSopenharmony_ci        return value[node].is_string();
180eace7efcSopenharmony_ci    }
181eace7efcSopenharmony_ci    if (jsonType == JsonType::BOOLEAN) {
182eace7efcSopenharmony_ci        return value[node].is_boolean();
183eace7efcSopenharmony_ci    }
184eace7efcSopenharmony_ci    return false;
185eace7efcSopenharmony_ci}
186eace7efcSopenharmony_ci}  // namespace AAFwk
187eace7efcSopenharmony_ci}  // namespace OHOS
188