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