1 /*
2 * Copyright (c) 2023 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 "recoverable_application_info.h"
17
18 #include "app_log_wrapper.h"
19 #include "json_util.h"
20 #include "nlohmann/json.hpp"
21 #include "parcel_macro.h"
22 #include "string_ex.h"
23
24 namespace OHOS {
25 namespace AppExecFwk {
26 namespace {
27 const char* JSON_KEY_BUNDLE_NAME = "bundleName";
28 const char* JSON_KEY_MODULE_NAME = "moduleName";
29 const char* JSON_KEY_LABEL_ID = "labelId";
30 const char* JSON_KEY_ICON_ID = "iconId";
31 const char* JSON_KEY_SYSTEM_APP = "systemApp";
32 const char* JSON_KEY_BUNDLE_TYPE = "bundleType";
33 const char* JSON_KEY_CODE_PATHS = "codePaths";
34 }
35
ReadFromParcel(Parcel & parcel)36 bool RecoverableApplicationInfo::ReadFromParcel(Parcel &parcel)
37 {
38 bundleName = Str16ToStr8(parcel.ReadString16());
39 moduleName = Str16ToStr8(parcel.ReadString16());
40 labelId = parcel.ReadUint32();
41 iconId = parcel.ReadUint32();
42 systemApp = parcel.ReadBool();
43 bundleType = static_cast<BundleType>(parcel.ReadInt32());
44 int32_t codePathsSize;
45 READ_PARCEL_AND_RETURN_FALSE_IF_FAIL(Int32, parcel, codePathsSize);
46 CONTAINER_SECURITY_VERIFY(parcel, codePathsSize, &codePaths);
47 for (auto i = 0; i < codePathsSize; i++) {
48 codePaths.emplace_back(Str16ToStr8(parcel.ReadString16()));
49 }
50 return true;
51 }
52
Marshalling(Parcel & parcel) const53 bool RecoverableApplicationInfo::Marshalling(Parcel &parcel) const
54 {
55 WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(String16, parcel, Str8ToStr16(bundleName));
56 WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(String16, parcel, Str8ToStr16(moduleName));
57 WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(Uint32, parcel, labelId);
58 WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(Uint32, parcel, iconId);
59 WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(Bool, parcel, systemApp);
60 WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(Int32, parcel, static_cast<int32_t>(bundleType));
61 WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(Int32, parcel, codePaths.size());
62 for (auto &codePath : codePaths) {
63 WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(String16, parcel, Str8ToStr16(codePath));
64 }
65 return true;
66 }
67
Unmarshalling(Parcel & parcel)68 RecoverableApplicationInfo *RecoverableApplicationInfo::Unmarshalling(Parcel &parcel)
69 {
70 RecoverableApplicationInfo *info = new (std::nothrow) RecoverableApplicationInfo();
71 if (info && !info->ReadFromParcel(parcel)) {
72 APP_LOGW("read from parcel failed");
73 delete info;
74 info = nullptr;
75 }
76 return info;
77 }
78
to_json(nlohmann::json & jsonObject,const RecoverableApplicationInfo & recoverableApplicationInfo)79 void to_json(nlohmann::json &jsonObject, const RecoverableApplicationInfo &recoverableApplicationInfo)
80 {
81 jsonObject = nlohmann::json {
82 {JSON_KEY_BUNDLE_NAME, recoverableApplicationInfo.bundleName},
83 {JSON_KEY_MODULE_NAME, recoverableApplicationInfo.moduleName},
84 {JSON_KEY_LABEL_ID, recoverableApplicationInfo.labelId},
85 {JSON_KEY_ICON_ID, recoverableApplicationInfo.iconId},
86 {JSON_KEY_SYSTEM_APP, recoverableApplicationInfo.systemApp},
87 {JSON_KEY_BUNDLE_TYPE, recoverableApplicationInfo.bundleType},
88 {JSON_KEY_CODE_PATHS, recoverableApplicationInfo.codePaths},
89 };
90 }
91
from_json(const nlohmann::json & jsonObject,RecoverableApplicationInfo & recoverableApplicationInfo)92 void from_json(const nlohmann::json &jsonObject, RecoverableApplicationInfo &recoverableApplicationInfo)
93 {
94 const auto &jsonObjectEnd = jsonObject.end();
95 int32_t parseResult = ERR_OK;
96 GetValueIfFindKey<std::string>(jsonObject, jsonObjectEnd, JSON_KEY_BUNDLE_NAME,
97 recoverableApplicationInfo.bundleName, JsonType::STRING, false, parseResult, ArrayType::NOT_ARRAY);
98 GetValueIfFindKey<std::string>(jsonObject, jsonObjectEnd, JSON_KEY_MODULE_NAME,
99 recoverableApplicationInfo.moduleName, JsonType::STRING, false, parseResult, ArrayType::NOT_ARRAY);
100 GetValueIfFindKey<uint32_t>(jsonObject, jsonObjectEnd, JSON_KEY_LABEL_ID,
101 recoverableApplicationInfo.labelId, JsonType::NUMBER, false, parseResult, ArrayType::NOT_ARRAY);
102 GetValueIfFindKey<uint32_t>(jsonObject, jsonObjectEnd, JSON_KEY_ICON_ID,
103 recoverableApplicationInfo.iconId, JsonType::NUMBER, false, parseResult, ArrayType::NOT_ARRAY);
104 GetValueIfFindKey<bool>(jsonObject, jsonObjectEnd, JSON_KEY_SYSTEM_APP,
105 recoverableApplicationInfo.systemApp, JsonType::BOOLEAN, false, parseResult, ArrayType::NOT_ARRAY);
106 GetValueIfFindKey<BundleType>(jsonObject, jsonObjectEnd, JSON_KEY_BUNDLE_TYPE,
107 recoverableApplicationInfo.bundleType, JsonType::NUMBER, false, parseResult, ArrayType::NOT_ARRAY);
108 GetValueIfFindKey<std::vector<std::string>>(jsonObject, jsonObjectEnd, JSON_KEY_CODE_PATHS,
109 recoverableApplicationInfo.codePaths, JsonType::ARRAY, false, parseResult, ArrayType::STRING);
110 if (parseResult != ERR_OK) {
111 APP_LOGE("read RecoverableApplicationInfo error, error code : %{public}d", parseResult);
112 }
113 }
114 } // AppExecFwk
115 } // OHOS