1 /*
2 * Copyright (c) 2025 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 "plugin_module_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
25 namespace OHOS {
26 namespace AppExecFwk {
27 namespace {
28 const char* PLUGIN_MODULE_INFO_MODULENAME = "moduleName";
29 const char* PLUGIN_MODULE_INFO_DESCRIPTION = "description";
30 const char* PLUGIN_MODULE_INFO_DESCRIPTION_ID = "descriptionId";
31 const char* PLUGIN_MODULE_INFO_HAP_PATH = "hapPath";
32 const char* PLUGIN_MODULE_INFO_CPU_ABI = "cpuAbi";
33 const char* PLUGIN_MODULE_INFO_NATIVE_LIBRARY_PATH = "nativeLibraryPath";
34 const char* PLUGIN_MODULE_INFO_NATIVE_LIBRARY_FILE_NAMES = "nativeLibraryFileNames";
35 const char* PLUGIN_MODULE_INFO_COMPRESS_NATIVE_LIBS = "compressNativeLibs";
36 const char* PLUGIN_MODULE_INFO_IS_LIB_ISOLATED = "isLibIsolated";
37 const char* PLUGIN_MODULE_INFO_PACKAGE_NAME = "packageName";
38 const char* PLUGIN_MODULE_INFO_COMPILE_MODE = "compileMode";
39 }
40
ReadFromParcel(Parcel & parcel)41 bool PluginModuleInfo::ReadFromParcel(Parcel &parcel)
42 {
43 compressNativeLibs = parcel.ReadBool();
44 isLibIsolated = parcel.ReadBool();
45 descriptionId = parcel.ReadUint32();
46 moduleName = parcel.ReadString();
47 description = parcel.ReadString();
48 hapPath = parcel.ReadString();
49 cpuAbi = parcel.ReadString();
50 nativeLibraryPath = parcel.ReadString();
51 packageName = parcel.ReadString();
52 compileMode = parcel.ReadString();
53 int32_t nativeLibraryFileNamesSize;
54 READ_PARCEL_AND_RETURN_FALSE_IF_FAIL(Int32, parcel, nativeLibraryFileNamesSize);
55 CONTAINER_SECURITY_VERIFY(parcel, nativeLibraryFileNamesSize, &nativeLibraryFileNames);
56 for (int32_t i = 0; i < nativeLibraryFileNamesSize; ++i) {
57 nativeLibraryFileNames.emplace_back(parcel.ReadString());
58 }
59 return true;
60 }
61
Marshalling(Parcel & parcel) const62 bool PluginModuleInfo::Marshalling(Parcel &parcel) const
63 {
64 WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(Bool, parcel, compressNativeLibs);
65 WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(Bool, parcel, isLibIsolated);
66 WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(Uint32, parcel, descriptionId);
67 WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(String, parcel, moduleName);
68 WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(String, parcel, description);
69 WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(String, parcel, hapPath);
70 WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(String, parcel, cpuAbi);
71 WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(String, parcel, nativeLibraryPath);
72 WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(String, parcel, packageName);
73 WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(String, parcel, compileMode);
74 WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(Int32, parcel, nativeLibraryFileNames.size());
75 for (auto &fileName : nativeLibraryFileNames) {
76 WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(String, parcel, fileName);
77 }
78 return true;
79 }
80
Unmarshalling(Parcel & parcel)81 PluginModuleInfo *PluginModuleInfo::Unmarshalling(Parcel &parcel)
82 {
83 PluginModuleInfo *info = new (std::nothrow) PluginModuleInfo();
84 if (info && !info->ReadFromParcel(parcel)) {
85 APP_LOGW("read from parcel failed");
86 delete info;
87 info = nullptr;
88 }
89 return info;
90 }
91
to_json(nlohmann::json & jsonObject,const PluginModuleInfo & pluginModuleInfo)92 void to_json(nlohmann::json &jsonObject, const PluginModuleInfo &pluginModuleInfo)
93 {
94 jsonObject = nlohmann::json {
95 {PLUGIN_MODULE_INFO_MODULENAME, pluginModuleInfo.moduleName},
96 {PLUGIN_MODULE_INFO_DESCRIPTION, pluginModuleInfo.description},
97 {PLUGIN_MODULE_INFO_DESCRIPTION_ID, pluginModuleInfo.descriptionId},
98 {PLUGIN_MODULE_INFO_HAP_PATH, pluginModuleInfo.hapPath},
99 {PLUGIN_MODULE_INFO_CPU_ABI, pluginModuleInfo.cpuAbi},
100 {PLUGIN_MODULE_INFO_NATIVE_LIBRARY_PATH, pluginModuleInfo.nativeLibraryPath},
101 {PLUGIN_MODULE_INFO_NATIVE_LIBRARY_FILE_NAMES, pluginModuleInfo.nativeLibraryFileNames},
102 {PLUGIN_MODULE_INFO_COMPRESS_NATIVE_LIBS, pluginModuleInfo.compressNativeLibs},
103 {PLUGIN_MODULE_INFO_IS_LIB_ISOLATED, pluginModuleInfo.isLibIsolated},
104 {PLUGIN_MODULE_INFO_PACKAGE_NAME, pluginModuleInfo.packageName},
105 {PLUGIN_MODULE_INFO_COMPILE_MODE, pluginModuleInfo.compileMode}
106 };
107 }
108
from_json(const nlohmann::json & jsonObject,PluginModuleInfo & pluginModuleInfo)109 void from_json(const nlohmann::json &jsonObject, PluginModuleInfo &pluginModuleInfo)
110 {
111 const auto &jsonObjectEnd = jsonObject.end();
112 int32_t parseResult = ERR_OK;
113 BMSJsonUtil::GetStrValueIfFindKey(jsonObject, jsonObjectEnd,
114 PLUGIN_MODULE_INFO_MODULENAME,
115 pluginModuleInfo.moduleName, false, parseResult);
116 BMSJsonUtil::GetStrValueIfFindKey(jsonObject, jsonObjectEnd,
117 PLUGIN_MODULE_INFO_DESCRIPTION,
118 pluginModuleInfo.description, false, parseResult);
119 GetValueIfFindKey<uint32_t>(jsonObject, jsonObjectEnd,
120 PLUGIN_MODULE_INFO_DESCRIPTION_ID,
121 pluginModuleInfo.descriptionId, JsonType::NUMBER, false, parseResult,
122 ArrayType::NOT_ARRAY);
123 BMSJsonUtil::GetStrValueIfFindKey(jsonObject, jsonObjectEnd,
124 PLUGIN_MODULE_INFO_HAP_PATH,
125 pluginModuleInfo.hapPath, false, parseResult);
126 BMSJsonUtil::GetStrValueIfFindKey(jsonObject, jsonObjectEnd,
127 PLUGIN_MODULE_INFO_CPU_ABI,
128 pluginModuleInfo.cpuAbi, false, parseResult);
129 BMSJsonUtil::GetStrValueIfFindKey(jsonObject, jsonObjectEnd,
130 PLUGIN_MODULE_INFO_NATIVE_LIBRARY_PATH,
131 pluginModuleInfo.nativeLibraryPath, false, parseResult);
132 GetValueIfFindKey<std::vector<std::string>>(jsonObject, jsonObjectEnd,
133 PLUGIN_MODULE_INFO_NATIVE_LIBRARY_FILE_NAMES,
134 pluginModuleInfo.nativeLibraryFileNames, JsonType::ARRAY, false, parseResult,
135 ArrayType::STRING);
136 BMSJsonUtil::GetBoolValueIfFindKey(jsonObject, jsonObjectEnd,
137 PLUGIN_MODULE_INFO_COMPRESS_NATIVE_LIBS,
138 pluginModuleInfo.compressNativeLibs, false, parseResult);
139 BMSJsonUtil::GetBoolValueIfFindKey(jsonObject, jsonObjectEnd,
140 PLUGIN_MODULE_INFO_IS_LIB_ISOLATED,
141 pluginModuleInfo.isLibIsolated, false, parseResult);
142 BMSJsonUtil::GetStrValueIfFindKey(jsonObject, jsonObjectEnd,
143 PLUGIN_MODULE_INFO_PACKAGE_NAME,
144 pluginModuleInfo.packageName, false, parseResult);
145 BMSJsonUtil::GetStrValueIfFindKey(jsonObject, jsonObjectEnd,
146 PLUGIN_MODULE_INFO_COMPILE_MODE,
147 pluginModuleInfo.compileMode, false, parseResult);
148 if (parseResult != ERR_OK) {
149 APP_LOGE("read pluginModuleInfo error : %{public}d", parseResult);
150 }
151 }
152 } // AppExecFwk
153 } // OHOS
154