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