1 /*
2 * Copyright (c) 2024 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 "napi_common_child_process_param.h"
17
18 #include "hilog_tag_wrapper.h"
19 #include "napi_common_util.h"
20
21 namespace OHOS {
22 namespace AppExecFwk {
UnwrapChildProcessArgs(napi_env env,napi_value jsValue,AppExecFwk::ChildProcessArgs & args,std::string & errorMsg)23 bool UnwrapChildProcessArgs(napi_env env, napi_value jsValue, AppExecFwk::ChildProcessArgs &args,
24 std::string &errorMsg)
25 {
26 if (!IsTypeForNapiValue(env, jsValue, napi_object)) {
27 TAG_LOGE(AAFwkTag::PROCESSMGR, "Parameter error. The type of args must be ProcessArgs.");
28 errorMsg = "Parameter error. The type of args must be ProcessArgs.";
29 return false;
30 }
31
32 if (IsExistsByPropertyName(env, jsValue, "entryParams") &&
33 !UnwrapStringByPropertyName(env, jsValue, "entryParams", args.entryParams)) {
34 TAG_LOGE(AAFwkTag::PROCESSMGR, "Parameter error. The type of args.entryParams must be string.");
35 errorMsg = "Parameter error. The type of args.entryParams must be string.";
36 return false;
37 }
38
39 if (IsExistsByPropertyName(env, jsValue, "fds")) {
40 napi_value jsFds = GetPropertyValueByPropertyName(env, jsValue, "fds", napi_object);
41 if (jsFds == nullptr) {
42 TAG_LOGE(AAFwkTag::PROCESSMGR, "The type of args.fds must be Record<string, number>.");
43 errorMsg = "The type of args.fds must be Record<string, number>.";
44 return false;
45 }
46 if (!UnwrapChildProcessFds(env, jsFds, args.fds, errorMsg)) {
47 return false;
48 }
49 }
50
51 return true;
52 }
53
UnwrapChildProcessFds(napi_env env,napi_value param,std::map<std::string,int32_t> & map,std::string & errorMsg)54 bool UnwrapChildProcessFds(napi_env env, napi_value param, std::map<std::string, int32_t> &map, std::string &errorMsg)
55 {
56 napi_value jsKeyList = nullptr;
57 uint32_t keyCount = 0;
58 NAPI_CALL_BASE(env, napi_get_property_names(env, param, &jsKeyList), false);
59 NAPI_CALL_BASE(env, napi_get_array_length(env, jsKeyList, &keyCount), false);
60 if (keyCount > CHILD_PROCESS_ARGS_FDS_MAX_COUNT) {
61 TAG_LOGE(AAFwkTag::PROCESSMGR, "fds count must <= %{public}d.", CHILD_PROCESS_ARGS_FDS_MAX_COUNT);
62 errorMsg = "fds count must <= " + std::to_string(CHILD_PROCESS_ARGS_FDS_MAX_COUNT);
63 return false;
64 }
65
66 napi_value jsKey = nullptr;
67 for (uint32_t index = 0; index < keyCount; index++) {
68 NAPI_CALL_BASE(env, napi_get_element(env, jsKeyList, index, &jsKey), false);
69 std::string key;
70 if (!UnwrapStringFromJS2(env, jsKey, key)) {
71 TAG_LOGE(AAFwkTag::PROCESSMGR, "The type of args.fds must be Record<string, number>.");
72 errorMsg = "The type of args.fds must be Record<string, number>.";
73 return false;
74 }
75 if (!ChildProcessArgs::CheckFdKeyLength(key)) {
76 errorMsg = "fd key length must <= " + std::to_string(CHILD_PROCESS_ARGS_FD_KEY_MAX_LENGTH);
77 return false;
78 }
79
80 int32_t value;
81 if (!UnwrapInt32ByPropertyName(env, param, key.c_str(), value)) {
82 TAG_LOGE(AAFwkTag::PROCESSMGR, "The type of args.fds must be Record<string, number>.");
83 errorMsg = "The type of args.fds must be Record<string, number>.";
84 return false;
85 }
86 map.emplace(key, value);
87 }
88 return true;
89 }
90
UnwrapChildProcessOptions(napi_env env,napi_value jsValue,AppExecFwk::ChildProcessOptions & options,std::string & errorMsg)91 bool UnwrapChildProcessOptions(napi_env env, napi_value jsValue, AppExecFwk::ChildProcessOptions &options,
92 std::string &errorMsg)
93 {
94 if (!IsTypeForNapiValue(env, jsValue, napi_object)) {
95 TAG_LOGE(AAFwkTag::PROCESSMGR, "Parameter error. The type of options must be ProcessOptions.");
96 errorMsg = "Parameter error. The type of options must be ProcessOptions.";
97 return false;
98 }
99
100 if (IsExistsByPropertyName(env, jsValue, "isolationMode") &&
101 !UnwrapBooleanByPropertyName(env, jsValue, "isolationMode", options.isolationMode)) {
102 TAG_LOGE(AAFwkTag::PROCESSMGR, "Parameter error. The type of options.isolationMode must be boolean.");
103 errorMsg = "Parameter error. The type of options.isolationMode must be boolean.";
104 return false;
105 }
106 return true;
107 }
108
WrapChildProcessArgs(napi_env env,AppExecFwk::ChildProcessArgs & args)109 napi_value WrapChildProcessArgs(napi_env env, AppExecFwk::ChildProcessArgs &args)
110 {
111 napi_value jsArgs = nullptr;
112 NAPI_CALL(env, napi_create_object(env, &jsArgs));
113
114 napi_value jsEntryParams = WrapStringToJS(env, args.entryParams);
115 SetPropertyValueByPropertyName(env, jsArgs, "entryParams", jsEntryParams);
116
117 napi_value jsFds = nullptr;
118 NAPI_CALL(env, napi_create_object(env, &jsFds));
119 if (!args.CheckFdsSize()) {
120 return jsArgs;
121 }
122 auto &fds = args.fds;
123 for (auto iter = fds.begin(); iter != fds.end(); iter++) {
124 std::string key = iter->first;
125 napi_value jsValue = WrapInt32ToJS(env, iter->second);
126 SetPropertyValueByPropertyName(env, jsFds, key.c_str(), jsValue);
127 }
128
129 SetPropertyValueByPropertyName(env, jsArgs, "fds", jsFds);
130 return jsArgs;
131 }
132 } // namespace AppExecFwk
133 } // namespace OHOS
134