• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021-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_want.h"
17 
18 #include "napi_common_util.h"
19 #include "array_wrapper.h"
20 #include "bool_wrapper.h"
21 #include "byte_wrapper.h"
22 #include "double_wrapper.h"
23 #include "float_wrapper.h"
24 #include "hilog_tag_wrapper.h"
25 #include "int_wrapper.h"
26 #include "ipc_skeleton.h"
27 #include "js_runtime_utils.h"
28 #include "long_wrapper.h"
29 #include "napi_remote_object.h"
30 #include "remote_object_wrapper.h"
31 #include "short_wrapper.h"
32 #include "string_wrapper.h"
33 #include "tokenid_kit.h"
34 #include "want_params_wrapper.h"
35 #include "zchar_wrapper.h"
36 
37 namespace OHOS {
38 namespace AppExecFwk {
39 using namespace OHOS::AbilityRuntime;
40 const int PROPERTIES_SIZE = 2;
41 /**
42  * @brief Init param of wantOptions.
43  *
44  * @param flagMap Indicates flag of list in Want .
45  */
InnerInitWantOptionsData(std::map<std::string,unsigned int> & flagMap)46 void InnerInitWantOptionsData(std::map<std::string, unsigned int> &flagMap)
47 {
48     flagMap.emplace("authReadUriPermission", Want::FLAG_AUTH_READ_URI_PERMISSION);
49     flagMap.emplace("authWriteUriPermission", Want::FLAG_AUTH_WRITE_URI_PERMISSION);
50     flagMap.emplace("abilityForwardResult", Want::FLAG_ABILITY_FORWARD_RESULT);
51     flagMap.emplace("abilityContinuation", Want::FLAG_ABILITY_CONTINUATION);
52     flagMap.emplace("notOhosComponent", Want::FLAG_NOT_OHOS_COMPONENT);
53     flagMap.emplace("abilityFormEnabled", Want::FLAG_ABILITY_FORM_ENABLED);
54     flagMap.emplace("authPersistableUriPermission", Want::FLAG_AUTH_PERSISTABLE_URI_PERMISSION);
55     flagMap.emplace("authPrefixUriPermission", Want::FLAG_AUTH_PREFIX_URI_PERMISSION);
56     flagMap.emplace("abilitySliceMultiDevice", Want::FLAG_ABILITYSLICE_MULTI_DEVICE);
57     flagMap.emplace("startForegroundAbility", Want::FLAG_START_FOREGROUND_ABILITY);
58     flagMap.emplace("installOnDemand", Want::FLAG_INSTALL_ON_DEMAND);
59     flagMap.emplace("abilitySliceForwardResult", Want::FLAG_ABILITYSLICE_FORWARD_RESULT);
60     flagMap.emplace("installWithBackgroundMode", Want::FLAG_INSTALL_WITH_BACKGROUND_MODE);
61     flagMap.emplace("abilityContinuationReversible", Want::FLAG_ABILITY_CONTINUATION_REVERSIBLE);
62     flagMap.emplace("abilityClearMission", Want::FLAG_ABILITY_CLEAR_MISSION);
63     flagMap.emplace("abilityNewMission", Want::FLAG_ABILITY_NEW_MISSION);
64     flagMap.emplace("abilityMissionTop", Want::FLAG_ABILITY_MISSION_TOP);
65     flagMap.emplace("abilityOnCollaborate", Want::FLAG_ABILITY_ON_COLLABORATE);
66 }
67 
WrapElementName(napi_env env,const ElementName & elementName)68 napi_value WrapElementName(napi_env env, const ElementName &elementName)
69 {
70     napi_value jsObject = nullptr;
71     NAPI_CALL(env, napi_create_object(env, &jsObject));
72 
73     napi_value jsValue = nullptr;
74     NAPI_CALL(env, napi_create_string_utf8(env, elementName.GetDeviceID().c_str(), NAPI_AUTO_LENGTH, &jsValue));
75     NAPI_CALL(env, napi_set_named_property(env, jsObject, "deviceId", jsValue));
76 
77     jsValue = nullptr;
78     NAPI_CALL(env, napi_create_string_utf8(env, elementName.GetBundleName().c_str(), NAPI_AUTO_LENGTH, &jsValue));
79     NAPI_CALL(env, napi_set_named_property(env, jsObject, "bundleName", jsValue));
80 
81     jsValue = nullptr;
82     NAPI_CALL(env, napi_create_string_utf8(env, elementName.GetAbilityName().c_str(), NAPI_AUTO_LENGTH, &jsValue));
83     NAPI_CALL(env, napi_set_named_property(env, jsObject, "abilityName", jsValue));
84 
85     jsValue = nullptr;
86     NAPI_CALL(env, napi_create_string_utf8(env, elementName.GetModuleName().c_str(), NAPI_AUTO_LENGTH, &jsValue));
87     NAPI_CALL(env, napi_set_named_property(env, jsObject, "moduleName", jsValue));
88 
89     return jsObject;
90 }
91 
UnwrapElementName(napi_env env,napi_value param,ElementName & elementName)92 bool UnwrapElementName(napi_env env, napi_value param, ElementName &elementName)
93 {
94     std::string natValue("");
95     if (UnwrapStringByPropertyName(env, param, "deviceId", natValue)) {
96         elementName.SetDeviceID(natValue);
97     }
98 
99     natValue = "";
100     if (UnwrapStringByPropertyName(env, param, "bundleName", natValue)) {
101         elementName.SetBundleName(natValue);
102     }
103 
104     natValue = "";
105     if (UnwrapStringByPropertyName(env, param, "abilityName", natValue)) {
106         elementName.SetAbilityName(natValue);
107     }
108 
109     natValue = "";
110     if (UnwrapStringByPropertyName(env, param, "moduleName", natValue)) {
111         elementName.SetModuleName(natValue);
112     }
113     return true;
114 }
115 
InnerWrapWantParamsChar(napi_env env,napi_value jsObject,const std::string & key,const AAFwk::WantParams & wantParams)116 bool InnerWrapWantParamsChar(
117     napi_env env, napi_value jsObject, const std::string &key, const AAFwk::WantParams &wantParams)
118 {
119     auto value = wantParams.GetParam(key);
120     AAFwk::IChar *ao = AAFwk::IChar::Query(value);
121     if (ao == nullptr) {
122         return false;
123     }
124 
125     std::string natValue(static_cast<Char *>(ao)->ToString());
126     napi_value jsValue = WrapStringToJS(env, natValue);
127     if (jsValue == nullptr) {
128         return false;
129     }
130 
131     NAPI_CALL_BASE(env, napi_set_named_property(env, jsObject, key.c_str(), jsValue), false);
132     return true;
133 }
134 
InnerWrapWantParamsString(napi_env env,napi_value jsObject,const std::string & key,const AAFwk::WantParams & wantParams)135 bool InnerWrapWantParamsString(
136     napi_env env, napi_value jsObject, const std::string &key, const AAFwk::WantParams &wantParams)
137 {
138     auto value = wantParams.GetParam(key);
139     AAFwk::IString *ao = AAFwk::IString::Query(value);
140     if (ao == nullptr) {
141         return false;
142     }
143 
144     std::string natValue = AAFwk::String::Unbox(ao);
145     napi_value jsValue = WrapStringToJS(env, natValue);
146     if (jsValue == nullptr) {
147         return false;
148     }
149 
150     NAPI_CALL_BASE(env, napi_set_named_property(env, jsObject, key.c_str(), jsValue), false);
151     return true;
152 }
153 
InnerWrapWantParamsBool(napi_env env,napi_value jsObject,const std::string & key,const AAFwk::WantParams & wantParams)154 bool InnerWrapWantParamsBool(
155     napi_env env, napi_value jsObject, const std::string &key, const AAFwk::WantParams &wantParams)
156 {
157     auto value = wantParams.GetParam(key);
158     AAFwk::IBoolean *bo = AAFwk::IBoolean::Query(value);
159     if (bo == nullptr) {
160         return false;
161     }
162 
163     bool natValue = AAFwk::Boolean::Unbox(bo);
164     napi_value jsValue = WrapBoolToJS(env, natValue);
165     if (jsValue == nullptr) {
166         return false;
167     }
168 
169     NAPI_CALL_BASE(env, napi_set_named_property(env, jsObject, key.c_str(), jsValue), false);
170     return true;
171 }
172 
InnerWrapWantParamsByte(napi_env env,napi_value jsObject,const std::string & key,const AAFwk::WantParams & wantParams)173 bool InnerWrapWantParamsByte(
174     napi_env env, napi_value jsObject, const std::string &key, const AAFwk::WantParams &wantParams)
175 {
176     auto value = wantParams.GetParam(key);
177     AAFwk::IByte *bo = AAFwk::IByte::Query(value);
178     if (bo == nullptr) {
179         return false;
180     }
181 
182     int intValue = (int)AAFwk::Byte::Unbox(bo);
183     napi_value jsValue = WrapInt32ToJS(env, intValue);
184     if (jsValue == nullptr) {
185         return false;
186     }
187 
188     NAPI_CALL_BASE(env, napi_set_named_property(env, jsObject, key.c_str(), jsValue), false);
189     return true;
190 }
191 
InnerWrapWantParamsShort(napi_env env,napi_value jsObject,const std::string & key,const AAFwk::WantParams & wantParams)192 bool InnerWrapWantParamsShort(
193     napi_env env, napi_value jsObject, const std::string &key, const AAFwk::WantParams &wantParams)
194 {
195     auto value = wantParams.GetParam(key);
196     AAFwk::IShort *ao = AAFwk::IShort::Query(value);
197     if (ao == nullptr) {
198         return false;
199     }
200 
201     short natValue = AAFwk::Short::Unbox(ao);
202     napi_value jsValue = WrapInt32ToJS(env, natValue);
203     if (jsValue == nullptr) {
204         return false;
205     }
206 
207     NAPI_CALL_BASE(env, napi_set_named_property(env, jsObject, key.c_str(), jsValue), false);
208     return true;
209 }
210 
InnerWrapWantParamsInt32(napi_env env,napi_value jsObject,const std::string & key,const AAFwk::WantParams & wantParams)211 bool InnerWrapWantParamsInt32(
212     napi_env env, napi_value jsObject, const std::string &key, const AAFwk::WantParams &wantParams)
213 {
214     auto value = wantParams.GetParam(key);
215     AAFwk::IInteger *ao = AAFwk::IInteger::Query(value);
216     if (ao == nullptr) {
217         return false;
218     }
219 
220     int natValue = AAFwk::Integer::Unbox(ao);
221     napi_value jsValue = WrapInt32ToJS(env, natValue);
222     if (jsValue == nullptr) {
223         return false;
224     }
225 
226     NAPI_CALL_BASE(env, napi_set_named_property(env, jsObject, key.c_str(), jsValue), false);
227     return true;
228 }
229 
InnerWrapWantParamsInt64(napi_env env,napi_value jsObject,const std::string & key,const AAFwk::WantParams & wantParams)230 bool InnerWrapWantParamsInt64(
231     napi_env env, napi_value jsObject, const std::string &key, const AAFwk::WantParams &wantParams)
232 {
233     auto value = wantParams.GetParam(key);
234     AAFwk::ILong *ao = AAFwk::ILong::Query(value);
235     if (ao == nullptr) {
236         return false;
237     }
238 
239     int64_t natValue = AAFwk::Long::Unbox(ao);
240     napi_value jsValue = WrapInt64ToJS(env, natValue);
241     if (jsValue == nullptr) {
242         return false;
243     }
244 
245     NAPI_CALL_BASE(env, napi_set_named_property(env, jsObject, key.c_str(), jsValue), false);
246     return true;
247 }
248 
InnerWrapWantParamsFloat(napi_env env,napi_value jsObject,const std::string & key,const AAFwk::WantParams & wantParams)249 bool InnerWrapWantParamsFloat(
250     napi_env env, napi_value jsObject, const std::string &key, const AAFwk::WantParams &wantParams)
251 {
252     auto value = wantParams.GetParam(key);
253     AAFwk::IFloat *ao = AAFwk::IFloat::Query(value);
254     if (ao == nullptr) {
255         return false;
256     }
257 
258     float natValue = AAFwk::Float::Unbox(ao);
259     napi_value jsValue = WrapDoubleToJS(env, natValue);
260     if (jsValue == nullptr) {
261         return false;
262     }
263 
264     NAPI_CALL_BASE(env, napi_set_named_property(env, jsObject, key.c_str(), jsValue), false);
265     return true;
266 }
267 
InnerWrapWantParamsDouble(napi_env env,napi_value jsObject,const std::string & key,const AAFwk::WantParams & wantParams)268 bool InnerWrapWantParamsDouble(
269     napi_env env, napi_value jsObject, const std::string &key, const AAFwk::WantParams &wantParams)
270 {
271     TAG_LOGD(AAFwkTag::JSNAPI, "called");
272     auto value = wantParams.GetParam(key);
273     AAFwk::IDouble *ao = AAFwk::IDouble::Query(value);
274     if (ao == nullptr) {
275         return false;
276     }
277 
278     double natValue = AAFwk::Double::Unbox(ao);
279     napi_value jsValue = WrapDoubleToJS(env, natValue);
280     if (jsValue == nullptr) {
281         return false;
282     }
283 
284     NAPI_CALL_BASE(env, napi_set_named_property(env, jsObject, key.c_str(), jsValue), false);
285     return true;
286 }
287 
InnerWrapWantParamsWantParams(napi_env env,napi_value jsObject,const std::string & key,const AAFwk::WantParams & wantParams)288 bool InnerWrapWantParamsWantParams(
289     napi_env env, napi_value jsObject, const std::string &key, const AAFwk::WantParams &wantParams)
290 {
291     TAG_LOGD(AAFwkTag::JSNAPI, "key=%{public}s", key.c_str());
292     auto value = wantParams.GetParam(key);
293     AAFwk::IWantParams *o = AAFwk::IWantParams::Query(value);
294     if (o == nullptr) {
295         return false;
296     }
297 
298     AAFwk::WantParams wp = AAFwk::WantParamWrapper::Unbox(o);
299     napi_value jsValue = WrapWantParams(env, wp);
300     if (jsValue == nullptr) {
301         return false;
302     }
303 
304     NAPI_CALL_BASE(env, napi_set_named_property(env, jsObject, key.c_str(), jsValue), false);
305     return true;
306 }
307 
InnerWrapWantParamsRemoteObject(napi_env env,napi_value jsObject,const std::string & key,const AAFwk::WantParams & wantParams)308 bool InnerWrapWantParamsRemoteObject(
309     napi_env env, napi_value jsObject, const std::string &key, const AAFwk::WantParams &wantParams)
310 {
311     TAG_LOGD(AAFwkTag::JSNAPI, "key=%{public}s", key.c_str());
312     auto value = wantParams.GetParam(key);
313     AAFwk::IRemoteObjectWrap *remoteObjectIWrap = AAFwk::IRemoteObjectWrap::Query(value);
314     if (remoteObjectIWrap == nullptr) {
315         TAG_LOGE(AAFwkTag::JSNAPI, "null remoteObjectIWrap");
316         return false;
317     }
318     auto remoteObject = AAFwk::RemoteObjectWrap::UnBox(remoteObjectIWrap);
319     auto jsValue = NAPI_ohos_rpc_CreateJsRemoteObject(env, remoteObject);
320     if (jsValue == nullptr) {
321         TAG_LOGE(AAFwkTag::JSNAPI, "null jsValue");
322         return false;
323     }
324 
325     NAPI_CALL_BASE(env, napi_set_named_property(env, jsObject, key.c_str(), jsValue), false);
326     return true;
327 }
328 
InnerWrapWantParamsArrayChar(napi_env env,napi_value jsObject,const std::string & key,sptr<AAFwk::IArray> & ao)329 bool InnerWrapWantParamsArrayChar(napi_env env, napi_value jsObject, const std::string &key, sptr<AAFwk::IArray> &ao)
330 {
331     TAG_LOGD(AAFwkTag::JSNAPI, "called");
332     long size = 0;
333     if (ao->GetLength(size) != ERR_OK) {
334         return false;
335     }
336 
337     std::vector<std::string> natArray;
338     for (long i = 0; i < size; i++) {
339         sptr<AAFwk::IInterface> iface = nullptr;
340         if (ao->Get(i, iface) == ERR_OK) {
341             AAFwk::IChar *iValue = AAFwk::IChar::Query(iface);
342             if (iValue != nullptr) {
343                 std::string str(static_cast<Char *>(iValue)->ToString());
344                 natArray.push_back(str);
345             }
346         }
347     }
348 
349     napi_value jsValue = WrapArrayStringToJS(env, natArray);
350     if (jsValue != nullptr) {
351         NAPI_CALL_BASE(env, napi_set_named_property(env, jsObject, key.c_str(), jsValue), false);
352         return true;
353     }
354     return false;
355 }
356 
InnerWrapWantParamsArrayString(napi_env env,napi_value jsObject,const std::string & key,sptr<AAFwk::IArray> & ao)357 bool InnerWrapWantParamsArrayString(napi_env env, napi_value jsObject, const std::string &key, sptr<AAFwk::IArray> &ao)
358 {
359     long size = 0;
360     if (ao->GetLength(size) != ERR_OK) {
361         return false;
362     }
363 
364     std::vector<std::string> natArray;
365     for (long i = 0; i < size; i++) {
366         sptr<AAFwk::IInterface> iface = nullptr;
367         if (ao->Get(i, iface) == ERR_OK) {
368             AAFwk::IString *iValue = AAFwk::IString::Query(iface);
369             if (iValue != nullptr) {
370                 natArray.push_back(AAFwk::String::Unbox(iValue));
371             }
372         }
373     }
374 
375     napi_value jsValue = WrapArrayStringToJS(env, natArray);
376     if (jsValue != nullptr) {
377         NAPI_CALL_BASE(env, napi_set_named_property(env, jsObject, key.c_str(), jsValue), false);
378         return true;
379     }
380     return false;
381 }
382 
InnerWrapWantParamsArrayBool(napi_env env,napi_value jsObject,const std::string & key,sptr<AAFwk::IArray> & ao)383 bool InnerWrapWantParamsArrayBool(napi_env env, napi_value jsObject, const std::string &key, sptr<AAFwk::IArray> &ao)
384 {
385     long size = 0;
386     if (ao->GetLength(size) != ERR_OK) {
387         return false;
388     }
389 
390     std::vector<bool> natArray;
391     for (long i = 0; i < size; i++) {
392         sptr<AAFwk::IInterface> iface = nullptr;
393         if (ao->Get(i, iface) == ERR_OK) {
394             AAFwk::IBoolean *iValue = AAFwk::IBoolean::Query(iface);
395             if (iValue != nullptr) {
396                 natArray.push_back(AAFwk::Boolean::Unbox(iValue));
397             }
398         }
399     }
400 
401     napi_value jsValue = WrapArrayBoolToJS(env, natArray);
402     if (jsValue != nullptr) {
403         NAPI_CALL_BASE(env, napi_set_named_property(env, jsObject, key.c_str(), jsValue), false);
404         return true;
405     }
406     return false;
407 }
408 
InnerWrapWantParamsArrayShort(napi_env env,napi_value jsObject,const std::string & key,sptr<AAFwk::IArray> & ao)409 bool InnerWrapWantParamsArrayShort(napi_env env, napi_value jsObject, const std::string &key, sptr<AAFwk::IArray> &ao)
410 {
411     long size = 0;
412     if (ao->GetLength(size) != ERR_OK) {
413         return false;
414     }
415 
416     std::vector<int> natArray;
417     for (long i = 0; i < size; i++) {
418         sptr<AAFwk::IInterface> iface = nullptr;
419         if (ao->Get(i, iface) == ERR_OK) {
420             AAFwk::IShort *iValue = AAFwk::IShort::Query(iface);
421             if (iValue != nullptr) {
422                 natArray.push_back(AAFwk::Short::Unbox(iValue));
423             }
424         }
425     }
426 
427     napi_value jsValue = WrapArrayInt32ToJS(env, natArray);
428     if (jsValue != nullptr) {
429         NAPI_CALL_BASE(env, napi_set_named_property(env, jsObject, key.c_str(), jsValue), false);
430         return true;
431     }
432     return false;
433 }
InnerWrapWantParamsArrayByte(napi_env env,napi_value jsObject,const std::string & key,sptr<AAFwk::IArray> & ao)434 bool InnerWrapWantParamsArrayByte(napi_env env, napi_value jsObject, const std::string &key, sptr<AAFwk::IArray> &ao)
435 {
436     long size = 0;
437     if (ao->GetLength(size) != ERR_OK) {
438         return false;
439     }
440 
441     std::vector<int> natArray;
442     for (long i = 0; i < size; i++) {
443         sptr<AAFwk::IInterface> iface = nullptr;
444         if (ao->Get(i, iface) == ERR_OK) {
445             AAFwk::IByte *iValue = AAFwk::IByte::Query(iface);
446             if (iValue != nullptr) {
447                 int intValue = (int)AAFwk::Byte::Unbox(iValue);
448                 natArray.push_back(intValue);
449             }
450         }
451     }
452 
453     napi_value jsValue = WrapArrayInt32ToJS(env, natArray);
454     if (jsValue != nullptr) {
455         NAPI_CALL_BASE(env, napi_set_named_property(env, jsObject, key.c_str(), jsValue), false);
456         return true;
457     }
458     return false;
459 }
460 
InnerWrapWantParamsArrayInt32(napi_env env,napi_value jsObject,const std::string & key,sptr<AAFwk::IArray> & ao)461 bool InnerWrapWantParamsArrayInt32(napi_env env, napi_value jsObject, const std::string &key, sptr<AAFwk::IArray> &ao)
462 {
463     long size = 0;
464     if (ao->GetLength(size) != ERR_OK) {
465         return false;
466     }
467 
468     std::vector<int> natArray;
469     for (long i = 0; i < size; i++) {
470         sptr<AAFwk::IInterface> iface = nullptr;
471         if (ao->Get(i, iface) == ERR_OK) {
472             AAFwk::IInteger *iValue = AAFwk::IInteger::Query(iface);
473             if (iValue != nullptr) {
474                 natArray.push_back(AAFwk::Integer::Unbox(iValue));
475             }
476         }
477     }
478 
479     napi_value jsValue = WrapArrayInt32ToJS(env, natArray);
480     if (jsValue != nullptr) {
481         NAPI_CALL_BASE(env, napi_set_named_property(env, jsObject, key.c_str(), jsValue), false);
482         return true;
483     }
484     return false;
485 }
486 
InnerWrapWantParamsArrayInt64(napi_env env,napi_value jsObject,const std::string & key,sptr<AAFwk::IArray> & ao)487 bool InnerWrapWantParamsArrayInt64(napi_env env, napi_value jsObject, const std::string &key, sptr<AAFwk::IArray> &ao)
488 {
489     long size = 0;
490     if (ao->GetLength(size) != ERR_OK) {
491         return false;
492     }
493 
494     std::vector<int64_t> natArray;
495     for (long i = 0; i < size; i++) {
496         sptr<AAFwk::IInterface> iface = nullptr;
497         if (ao->Get(i, iface) == ERR_OK) {
498             AAFwk::ILong *iValue = AAFwk::ILong::Query(iface);
499             if (iValue != nullptr) {
500                 natArray.push_back(AAFwk::Long::Unbox(iValue));
501             }
502         }
503     }
504 
505     napi_value jsValue = WrapArrayInt64ToJS(env, natArray);
506     if (jsValue != nullptr) {
507         NAPI_CALL_BASE(env, napi_set_named_property(env, jsObject, key.c_str(), jsValue), false);
508         return true;
509     }
510     return false;
511 }
512 
InnerWrapWantParamsArrayFloat(napi_env env,napi_value jsObject,const std::string & key,sptr<AAFwk::IArray> & ao)513 bool InnerWrapWantParamsArrayFloat(napi_env env, napi_value jsObject, const std::string &key, sptr<AAFwk::IArray> &ao)
514 {
515     long size = 0;
516     if (ao->GetLength(size) != ERR_OK) {
517         return false;
518     }
519 
520     std::vector<double> natArray;
521     for (long i = 0; i < size; i++) {
522         sptr<AAFwk::IInterface> iface = nullptr;
523         if (ao->Get(i, iface) == ERR_OK) {
524             AAFwk::IFloat *iValue = AAFwk::IFloat::Query(iface);
525             if (iValue != nullptr) {
526                 natArray.push_back(AAFwk::Float::Unbox(iValue));
527             }
528         }
529     }
530 
531     napi_value jsValue = WrapArrayDoubleToJS(env, natArray);
532     if (jsValue != nullptr) {
533         NAPI_CALL_BASE(env, napi_set_named_property(env, jsObject, key.c_str(), jsValue), false);
534         return true;
535     }
536     return false;
537 }
538 
WrapArrayWantParamsToJS(napi_env env,const std::vector<WantParams> & value)539 napi_value WrapArrayWantParamsToJS(napi_env env, const std::vector<WantParams> &value)
540 {
541     napi_value jsArray = nullptr;
542     napi_value jsValue = nullptr;
543     uint32_t index = 0;
544 
545     NAPI_CALL(env, napi_create_array(env, &jsArray));
546     for (uint32_t i = 0; i < value.size(); i++) {
547         jsValue = WrapWantParams(env, value[i]);
548         if (jsValue != nullptr) {
549             if (napi_set_element(env, jsArray, index, jsValue) == napi_ok) {
550                 index++;
551             }
552         }
553     }
554     return jsArray;
555 }
556 
InnerWrapWantParamsArrayDouble(napi_env env,napi_value jsObject,const std::string & key,sptr<AAFwk::IArray> & ao)557 bool InnerWrapWantParamsArrayDouble(napi_env env, napi_value jsObject, const std::string &key, sptr<AAFwk::IArray> &ao)
558 {
559     long size = 0;
560     if (ao->GetLength(size) != ERR_OK) {
561         return false;
562     }
563 
564     std::vector<double> natArray;
565     for (long i = 0; i < size; i++) {
566         sptr<AAFwk::IInterface> iface = nullptr;
567         if (ao->Get(i, iface) == ERR_OK) {
568             AAFwk::IDouble *iValue = AAFwk::IDouble::Query(iface);
569             if (iValue != nullptr) {
570                 natArray.push_back(AAFwk::Double::Unbox(iValue));
571             }
572         }
573     }
574 
575     napi_value jsValue = WrapArrayDoubleToJS(env, natArray);
576     if (jsValue != nullptr) {
577         NAPI_CALL_BASE(env, napi_set_named_property(env, jsObject, key.c_str(), jsValue), false);
578         return true;
579     }
580     return false;
581 }
582 
InnerWrapWantParamsArrayWantParams(napi_env env,napi_value jsObject,const std::string & key,sptr<AAFwk::IArray> & ao)583 bool InnerWrapWantParamsArrayWantParams(napi_env env, napi_value jsObject,
584     const std::string &key, sptr<AAFwk::IArray> &ao)
585 {
586     long size = 0;
587     if (ao->GetLength(size) != ERR_OK) {
588         return false;
589     }
590 
591     std::vector<WantParams> natArray;
592     for (long i = 0; i < size; i++) {
593         sptr<AAFwk::IInterface> iface = nullptr;
594         if (ao->Get(i, iface) == ERR_OK) {
595             AAFwk::IWantParams *iValue = AAFwk::IWantParams::Query(iface);
596             if (iValue != nullptr) {
597                 natArray.push_back(AAFwk::WantParamWrapper::Unbox(iValue));
598             }
599         }
600     }
601 
602     napi_value jsValue = WrapArrayWantParamsToJS(env, natArray);
603     if (jsValue != nullptr) {
604         NAPI_CALL_BASE(env, napi_set_named_property(env, jsObject, key.c_str(), jsValue), false);
605         return true;
606     }
607     return false;
608 }
609 
InnerWrapWantParamsArray(napi_env env,napi_value jsObject,const std::string & key,sptr<AAFwk::IArray> & ao)610 bool InnerWrapWantParamsArray(napi_env env, napi_value jsObject, const std::string &key, sptr<AAFwk::IArray> &ao)
611 {
612     TAG_LOGD(AAFwkTag::JSNAPI, "key=%{public}s", key.c_str());
613     if (AAFwk::Array::IsStringArray(ao)) {
614         return InnerWrapWantParamsArrayString(env, jsObject, key, ao);
615     } else if (AAFwk::Array::IsBooleanArray(ao)) {
616         return InnerWrapWantParamsArrayBool(env, jsObject, key, ao);
617     } else if (AAFwk::Array::IsShortArray(ao)) {
618         return InnerWrapWantParamsArrayShort(env, jsObject, key, ao);
619     } else if (AAFwk::Array::IsIntegerArray(ao)) {
620         return InnerWrapWantParamsArrayInt32(env, jsObject, key, ao);
621     } else if (AAFwk::Array::IsLongArray(ao)) {
622         return InnerWrapWantParamsArrayInt64(env, jsObject, key, ao);
623     } else if (AAFwk::Array::IsFloatArray(ao)) {
624         return InnerWrapWantParamsArrayFloat(env, jsObject, key, ao);
625     } else if (AAFwk::Array::IsByteArray(ao)) {
626         return InnerWrapWantParamsArrayByte(env, jsObject, key, ao);
627     } else if (AAFwk::Array::IsCharArray(ao)) {
628         return InnerWrapWantParamsArrayChar(env, jsObject, key, ao);
629     } else if (AAFwk::Array::IsDoubleArray(ao)) {
630         return InnerWrapWantParamsArrayDouble(env, jsObject, key, ao);
631     } else if (AAFwk::Array::IsWantParamsArray(ao)) {
632         return InnerWrapWantParamsArrayWantParams(env, jsObject, key, ao);
633     } else {
634         return false;
635     }
636 }
637 
WrapWantParams(napi_env env,const AAFwk::WantParams & wantParams)638 napi_value WrapWantParams(napi_env env, const AAFwk::WantParams &wantParams)
639 {
640     napi_value jsObject = nullptr;
641     NAPI_CALL(env, napi_create_object(env, &jsObject));
642 
643     napi_value jsValue = nullptr;
644     const std::map<std::string, sptr<AAFwk::IInterface>> paramList = wantParams.GetParams();
645     for (auto iter = paramList.begin(); iter != paramList.end(); iter++) {
646         jsValue = nullptr;
647         if (AAFwk::IString::Query(iter->second) != nullptr) {
648             InnerWrapWantParamsString(env, jsObject, iter->first, wantParams);
649         } else if (AAFwk::IBoolean::Query(iter->second) != nullptr) {
650             InnerWrapWantParamsBool(env, jsObject, iter->first, wantParams);
651         } else if (AAFwk::IShort::Query(iter->second) != nullptr) {
652             InnerWrapWantParamsShort(env, jsObject, iter->first, wantParams);
653         } else if (AAFwk::IInteger::Query(iter->second) != nullptr) {
654             InnerWrapWantParamsInt32(env, jsObject, iter->first, wantParams);
655         } else if (AAFwk::ILong::Query(iter->second) != nullptr) {
656             InnerWrapWantParamsInt64(env, jsObject, iter->first, wantParams);
657         } else if (AAFwk::IFloat::Query(iter->second) != nullptr) {
658             InnerWrapWantParamsFloat(env, jsObject, iter->first, wantParams);
659         } else if (AAFwk::IDouble::Query(iter->second) != nullptr) {
660             InnerWrapWantParamsDouble(env, jsObject, iter->first, wantParams);
661         } else if (AAFwk::IChar::Query(iter->second) != nullptr) {
662             InnerWrapWantParamsChar(env, jsObject, iter->first, wantParams);
663         } else if (AAFwk::IByte::Query(iter->second) != nullptr) {
664             InnerWrapWantParamsByte(env, jsObject, iter->first, wantParams);
665         } else if (AAFwk::IArray::Query(iter->second) != nullptr) {
666             AAFwk::IArray *ao = AAFwk::IArray::Query(iter->second);
667             if (ao != nullptr) {
668                 sptr<AAFwk::IArray> array(ao);
669                 InnerWrapWantParamsArray(env, jsObject, iter->first, array);
670             }
671         } else if (AAFwk::IWantParams::Query(iter->second) != nullptr) {
672             InnerWrapWantParamsWantParams(env, jsObject, iter->first, wantParams);
673         } else if (AAFwk::IRemoteObjectWrap::Query(iter->second) != nullptr) {
674             InnerWrapWantParamsRemoteObject(env, jsObject, iter->first, wantParams);
675         }
676     }
677     return jsObject;
678 }
679 
InnerSetWantParamsArrayObject(napi_env env,const std::string & key,const std::vector<napi_value> & value,AAFwk::WantParams & wantParams)680 bool InnerSetWantParamsArrayObject(napi_env env, const std::string &key,
681     const std::vector<napi_value> &value, AAFwk::WantParams &wantParams)
682 {
683     size_t size = value.size();
684     sptr<AAFwk::IArray> ao = new (std::nothrow) AAFwk::Array(size, AAFwk::g_IID_IWantParams);
685     if (ao != nullptr) {
686         for (size_t i = 0; i < size; i++) {
687             AAFwk::WantParams wp;
688             UnwrapWantParams(env, value[i], wp);
689             ao->Set(i, AAFwk::WantParamWrapper::Box(wp));
690         }
691         wantParams.SetParam(key, ao);
692         return true;
693     } else {
694         return false;
695     }
696 }
697 
InnerSetWantParamsArrayString(const std::string & key,const std::vector<std::string> & value,AAFwk::WantParams & wantParams)698 bool InnerSetWantParamsArrayString(
699     const std::string &key, const std::vector<std::string> &value, AAFwk::WantParams &wantParams)
700 {
701     TAG_LOGD(AAFwkTag::JSNAPI, "called");
702     size_t size = value.size();
703     sptr<AAFwk::IArray> ao = new (std::nothrow) AAFwk::Array(size, AAFwk::g_IID_IString);
704     if (ao != nullptr) {
705         for (size_t i = 0; i < size; i++) {
706             ao->Set(i, AAFwk::String::Box(value[i]));
707         }
708         wantParams.SetParam(key, ao);
709         return true;
710     } else {
711         return false;
712     }
713 }
714 
InnerSetWantParamsArrayInt(const std::string & key,const std::vector<int> & value,AAFwk::WantParams & wantParams)715 bool InnerSetWantParamsArrayInt(const std::string &key, const std::vector<int> &value, AAFwk::WantParams &wantParams)
716 {
717     size_t size = value.size();
718     sptr<AAFwk::IArray> ao = new (std::nothrow) AAFwk::Array(size, AAFwk::g_IID_IInteger);
719     if (ao != nullptr) {
720         for (size_t i = 0; i < size; i++) {
721             ao->Set(i, AAFwk::Integer::Box(value[i]));
722         }
723         wantParams.SetParam(key, ao);
724         return true;
725     } else {
726         return false;
727     }
728 }
729 
InnerSetWantParamsArrayLong(const std::string & key,const std::vector<long> & value,AAFwk::WantParams & wantParams)730 bool InnerSetWantParamsArrayLong(const std::string &key, const std::vector<long> &value, AAFwk::WantParams &wantParams)
731 {
732     size_t size = value.size();
733     sptr<AAFwk::IArray> ao = new (std::nothrow) AAFwk::Array(size, AAFwk::g_IID_ILong);
734     if (ao != nullptr) {
735         for (size_t i = 0; i < size; i++) {
736             ao->Set(i, AAFwk::Long::Box(value[i]));
737         }
738         wantParams.SetParam(key, ao);
739         return true;
740     } else {
741         return false;
742     }
743 }
744 
InnerSetWantParamsArrayBool(const std::string & key,const std::vector<bool> & value,AAFwk::WantParams & wantParams)745 bool InnerSetWantParamsArrayBool(const std::string &key, const std::vector<bool> &value, AAFwk::WantParams &wantParams)
746 {
747     size_t size = value.size();
748     sptr<AAFwk::IArray> ao = new (std::nothrow) AAFwk::Array(size, AAFwk::g_IID_IBoolean);
749     if (ao != nullptr) {
750         for (size_t i = 0; i < size; i++) {
751             ao->Set(i, AAFwk::Boolean::Box(value[i]));
752         }
753         wantParams.SetParam(key, ao);
754         return true;
755     } else {
756         return false;
757     }
758 }
759 
InnerSetWantParamsArrayDouble(const std::string & key,const std::vector<double> & value,AAFwk::WantParams & wantParams)760 bool InnerSetWantParamsArrayDouble(
761     const std::string &key, const std::vector<double> &value, AAFwk::WantParams &wantParams)
762 {
763     size_t size = value.size();
764     sptr<AAFwk::IArray> ao = new (std::nothrow) AAFwk::Array(size, AAFwk::g_IID_IDouble);
765     if (ao != nullptr) {
766         for (size_t i = 0; i < size; i++) {
767             ao->Set(i, AAFwk::Double::Box(value[i]));
768         }
769         wantParams.SetParam(key, ao);
770         return true;
771     } else {
772         return false;
773     }
774 }
775 
InnerUnwrapWantParamsArray(napi_env env,const std::string & key,napi_value param,AAFwk::WantParams & wantParams)776 bool InnerUnwrapWantParamsArray(napi_env env, const std::string &key, napi_value param, AAFwk::WantParams &wantParams)
777 {
778     TAG_LOGD(AAFwkTag::JSNAPI, "called");
779     ComplexArrayData natArrayValue;
780     if (!UnwrapArrayComplexFromJS(env, param, natArrayValue)) {
781         return false;
782     }
783     if (natArrayValue.objectList.size() > 0) {
784         return InnerSetWantParamsArrayObject(env, key, natArrayValue.objectList, wantParams);
785     }
786     if (natArrayValue.stringList.size() > 0) {
787         return InnerSetWantParamsArrayString(key, natArrayValue.stringList, wantParams);
788     }
789     if (natArrayValue.intList.size() > 0) {
790         return InnerSetWantParamsArrayInt(key, natArrayValue.intList, wantParams);
791     }
792     if (natArrayValue.longList.size() > 0) {
793         return InnerSetWantParamsArrayLong(key, natArrayValue.longList, wantParams);
794     }
795     if (natArrayValue.boolList.size() > 0) {
796         return InnerSetWantParamsArrayBool(key, natArrayValue.boolList, wantParams);
797     }
798     if (natArrayValue.doubleList.size() > 0) {
799         return InnerSetWantParamsArrayDouble(key, natArrayValue.doubleList, wantParams);
800     }
801 
802     return false;
803 }
804 
InnerUnwrapWantParams(napi_env env,const std::string & key,napi_value param,AAFwk::WantParams & wantParams)805 bool InnerUnwrapWantParams(napi_env env, const std::string &key, napi_value param, AAFwk::WantParams &wantParams)
806 {
807     TAG_LOGD(AAFwkTag::JSNAPI, "called");
808     AAFwk::WantParams wp;
809 
810     if (UnwrapWantParams(env, param, wp)) {
811         sptr<AAFwk::IWantParams> pWantParams = AAFwk::WantParamWrapper::Box(wp);
812         if (pWantParams != nullptr) {
813             wantParams.SetParam(key, pWantParams);
814             return true;
815         }
816     }
817     return false;
818 }
819 
InnerUnwrapWantParamsNumber(napi_env env,const std::string & key,napi_value param,AAFwk::WantParams & wantParams)820 void InnerUnwrapWantParamsNumber(napi_env env, const std::string &key, napi_value param, AAFwk::WantParams &wantParams)
821 {
822     int32_t natValue32 = 0;
823     double natValueDouble = 0.0;
824     bool isReadValue32 = false;
825     bool isReadDouble = false;
826     if (napi_get_value_int32(env, param, &natValue32) == napi_ok) {
827         isReadValue32 = true;
828     }
829 
830     if (napi_get_value_double(env, param, &natValueDouble) == napi_ok) {
831         isReadDouble = true;
832     }
833 
834     if (isReadValue32 && isReadDouble) {
835         if (abs(natValueDouble - natValue32 * 1.0) > 0.0) {
836             wantParams.SetParam(key, AAFwk::Double::Box(natValueDouble));
837         } else {
838             wantParams.SetParam(key, AAFwk::Integer::Box(natValue32));
839         }
840     } else if (isReadValue32) {
841         wantParams.SetParam(key, AAFwk::Integer::Box(natValue32));
842     } else if (isReadDouble) {
843         wantParams.SetParam(key, AAFwk::Double::Box(natValueDouble));
844     }
845 }
846 
BlackListFilter(const std::string & strProName,const std::string & proNameNotFilter)847 bool BlackListFilter(const std::string &strProName, const std::string &proNameNotFilter)
848 {
849     if (strProName == proNameNotFilter) {
850         return false;
851     }
852     if (strProName == Want::PARAM_RESV_WINDOW_MODE) {
853         return true;
854     }
855     if (strProName == Want::PARAM_RESV_DISPLAY_ID) {
856         return true;
857     }
858     return false;
859 }
860 
UnwrapWantParams(napi_env env,napi_value param,AAFwk::WantParams & wantParams)861 bool UnwrapWantParams(napi_env env, napi_value param, AAFwk::WantParams &wantParams)
862 {
863     return UnwrapWantParams(env, param, wantParams, "");
864 }
865 
UnwrapWantParams(napi_env env,napi_value param,AAFwk::WantParams & wantParams,const std::string & proNameNotFilter)866 bool UnwrapWantParams(napi_env env, napi_value param, AAFwk::WantParams &wantParams,
867     const std::string &proNameNotFilter)
868 {
869     if (!IsTypeForNapiValue(env, param, napi_object)) {
870         return false;
871     }
872 
873     napi_valuetype jsValueType = napi_undefined;
874     napi_value jsProNameList = nullptr;
875     uint32_t jsProCount = 0;
876 
877     NAPI_CALL_BASE(env, napi_get_property_names(env, param, &jsProNameList), false);
878     NAPI_CALL_BASE(env, napi_get_array_length(env, jsProNameList, &jsProCount), false);
879 
880     napi_value jsProName = nullptr;
881     napi_value jsProValue = nullptr;
882     for (uint32_t index = 0; index < jsProCount; index++) {
883         NAPI_CALL_BASE(env, napi_get_element(env, jsProNameList, index, &jsProName), false);
884 
885         std::string strProName = UnwrapStringFromJS(env, jsProName);
886         /* skip reserved param */
887         if (BlackListFilter(strProName, proNameNotFilter)) {
888             TAG_LOGD(AAFwkTag::JSNAPI, "%{public}s is filtered.", strProName.c_str());
889             continue;
890         }
891         TAG_LOGD(AAFwkTag::JSNAPI, "property name=%{public}s", strProName.c_str());
892         NAPI_CALL_BASE(env, napi_get_named_property(env, param, strProName.c_str(), &jsProValue), false);
893         NAPI_CALL_BASE(env, napi_typeof(env, jsProValue, &jsValueType), false);
894 
895         switch (jsValueType) {
896             case napi_string: {
897                 std::string natValue = UnwrapStringFromJS(env, jsProValue);
898                 wantParams.SetParam(strProName, AAFwk::String::Box(natValue));
899                 break;
900             }
901             case napi_boolean: {
902                 bool natValue = false;
903                 NAPI_CALL_BASE(env, napi_get_value_bool(env, jsProValue, &natValue), false);
904                 wantParams.SetParam(strProName, AAFwk::Boolean::Box(natValue));
905                 break;
906             }
907             case napi_number: {
908                 InnerUnwrapWantParamsNumber(env, strProName, jsProValue, wantParams);
909                 break;
910             }
911             case napi_object: {
912                 HandleNapiObject(env, param, jsProValue, strProName, wantParams);
913                 break;
914             }
915             default:
916                 break;
917         }
918     }
919 
920     return true;
921 }
922 
HandleNapiObject(napi_env env,napi_value param,napi_value jsProValue,std::string & strProName,AAFwk::WantParams & wantParams)923 void HandleNapiObject(napi_env env, napi_value param, napi_value jsProValue, std::string &strProName,
924     AAFwk::WantParams &wantParams)
925 {
926     if (IsSpecialObject(env, param, strProName, FD, napi_number)) {
927         HandleFdObject(env, param, strProName, wantParams);
928     } else if (IsSpecialObject(env, param, strProName, REMOTE_OBJECT, napi_object)) {
929         auto selfToken = IPCSkeleton::GetSelfTokenID();
930         if (Security::AccessToken::TokenIdKit::IsSystemAppByFullTokenID(selfToken)) {
931             HandleRemoteObject(env, param, strProName, wantParams);
932         } else {
933             TAG_LOGW(AAFwkTag::JSNAPI, "not system app");
934         }
935     } else {
936         bool isArray = false;
937         if (napi_is_array(env, jsProValue, &isArray) == napi_ok) {
938             if (isArray) {
939                 InnerUnwrapWantParamsArray(env, strProName, jsProValue, wantParams);
940             } else {
941                 InnerUnwrapWantParams(env, strProName, jsProValue, wantParams);
942             }
943         }
944     }
945 }
946 
IsSpecialObject(napi_env env,napi_value param,std::string & strProName,std::string type,napi_valuetype jsValueProType)947 bool IsSpecialObject(napi_env env, napi_value param, std::string &strProName, std::string type,
948     napi_valuetype jsValueProType)
949 {
950     napi_value jsWantParamProValue = nullptr;
951     NAPI_CALL_BASE(env, napi_get_named_property(env, param, strProName.c_str(), &jsWantParamProValue), false);
952 
953     napi_valuetype jsValueType = napi_undefined;
954     napi_value jsProValue = nullptr;
955     NAPI_CALL_BASE(env, napi_get_named_property(env, jsWantParamProValue, TYPE_PROPERTY, &jsProValue), false);
956     NAPI_CALL_BASE(env, napi_typeof(env, jsProValue, &jsValueType), false);
957     if (jsValueType != napi_string) {
958         return false;
959     }
960     std::string natValue = UnwrapStringFromJS(env, jsProValue);
961     if (natValue != type) {
962         return false;
963     }
964     napi_value jsProNameList = nullptr;
965     uint32_t jsProCount = 0;
966 
967     NAPI_CALL_BASE(env, napi_get_property_names(env, jsWantParamProValue, &jsProNameList), false);
968     NAPI_CALL_BASE(env, napi_get_array_length(env, jsProNameList, &jsProCount), false);
969 
970     if (jsProCount != PROPERTIES_SIZE) {
971         TAG_LOGE(AAFwkTag::JSNAPI, "invalid size, not fd object");
972         return false;
973     }
974 
975     jsValueType = napi_undefined;
976     jsProValue = nullptr;
977     NAPI_CALL_BASE(env, napi_get_named_property(env, jsWantParamProValue, VALUE_PROPERTY, &jsProValue),
978         false);
979     NAPI_CALL_BASE(env, napi_typeof(env, jsProValue, &jsValueType), false);
980     if (jsValueType != jsValueProType) {
981         TAG_LOGE(AAFwkTag::JSNAPI, "invalid value property, not fd object");
982         return false;
983     }
984 
985     return true;
986 }
987 
HandleFdObject(napi_env env,napi_value param,std::string & strProName,AAFwk::WantParams & wantParams)988 bool HandleFdObject(napi_env env, napi_value param, std::string &strProName, AAFwk::WantParams &wantParams)
989 {
990     napi_value jsWantParamProValue = nullptr;
991     NAPI_CALL_BASE(env, napi_get_named_property(env, param, strProName.c_str(), &jsWantParamProValue), false);
992     napi_value jsProValue = nullptr;
993     NAPI_CALL_BASE(env, napi_get_named_property(env, jsWantParamProValue, VALUE_PROPERTY, &jsProValue),
994         false);
995 
996     int32_t natValue32 = 0;
997     napi_get_value_int32(env, jsProValue, &natValue32);
998     TAG_LOGI(AAFwkTag::JSNAPI, "fd:%{public}d", natValue32);
999     WantParams wp;
1000     wp.SetParam(TYPE_PROPERTY, String::Box(FD));
1001     wp.SetParam(VALUE_PROPERTY, Integer::Box(natValue32));
1002     sptr<AAFwk::IWantParams> pWantParams = AAFwk::WantParamWrapper::Box(wp);
1003     wantParams.SetParam(strProName, pWantParams);
1004     return true;
1005 }
1006 
HandleRemoteObject(napi_env env,napi_value param,std::string & strProName,AAFwk::WantParams & wantParams)1007 bool HandleRemoteObject(napi_env env, napi_value param, std::string &strProName, AAFwk::WantParams &wantParams)
1008 {
1009     napi_value jsWantParamProValue = nullptr;
1010     NAPI_CALL_BASE(env, napi_get_named_property(env, param, strProName.c_str(), &jsWantParamProValue), false);
1011     napi_value jsProValue = nullptr;
1012     NAPI_CALL_BASE(env, napi_get_named_property(env, jsWantParamProValue, VALUE_PROPERTY, &jsProValue),
1013         false);
1014 
1015     sptr<IRemoteObject> remoteObject = NAPI_ohos_rpc_getNativeRemoteObject(env, jsProValue);
1016     if (remoteObject == nullptr) {
1017         TAG_LOGE(AAFwkTag::JSNAPI, "null remoteObject");
1018         return false;
1019     }
1020 
1021     WantParams wp;
1022     wp.SetParam(TYPE_PROPERTY, String::Box(REMOTE_OBJECT));
1023     wp.SetParam(VALUE_PROPERTY, AAFwk::RemoteObjectWrap::Box(remoteObject));
1024     sptr<AAFwk::IWantParams> pWantParams = AAFwk::WantParamWrapper::Box(wp);
1025     wantParams.SetParam(strProName, pWantParams);
1026     return true;
1027 }
1028 
InnerWrapWantOptions(napi_env env,const Want & want)1029 napi_value InnerWrapWantOptions(napi_env env, const Want &want)
1030 {
1031     napi_value jsObject = nullptr;
1032     std::map<std::string, unsigned int> flagMap;
1033     InnerInitWantOptionsData(flagMap);
1034     unsigned int flags = want.GetFlags();
1035     bool natValue = false;
1036     napi_value jsValue = nullptr;
1037 
1038     NAPI_CALL(env, napi_create_object(env, &jsObject));
1039     for (auto iter = flagMap.begin(); iter != flagMap.end(); iter++) {
1040         jsValue = nullptr;
1041         natValue = ((flags & iter->second) == iter->second);
1042         if (napi_get_boolean(env, natValue, &jsValue) == napi_ok) {
1043             SetPropertyValueByPropertyName(env, jsObject, iter->first.c_str(), jsValue);
1044         }
1045     }
1046 
1047     return jsObject;
1048 }
1049 
InnerUnwrapWantOptions(napi_env env,napi_value param,const char * propertyName,Want & want)1050 bool InnerUnwrapWantOptions(napi_env env, napi_value param, const char *propertyName, Want &want)
1051 {
1052     napi_value jsValue = GetPropertyValueByPropertyName(env, param, propertyName, napi_object);
1053     if (jsValue == nullptr) {
1054         return false;
1055     }
1056 
1057     bool natValue = false;
1058     unsigned int flags = 0;
1059     std::map<std::string, unsigned int> flagMap;
1060     InnerInitWantOptionsData(flagMap);
1061     for (auto iter = flagMap.begin(); iter != flagMap.end(); iter++) {
1062         natValue = false;
1063         if (UnwrapBooleanByPropertyName(env, jsValue, iter->first.c_str(), natValue)) {
1064             if (natValue) {
1065                 flags |= iter->second;
1066             }
1067         }
1068     }
1069 
1070     want.SetFlags(flags);
1071     return true;
1072 }
1073 
WrapWant(napi_env env,const Want & want)1074 napi_value WrapWant(napi_env env, const Want &want)
1075 {
1076     napi_value jsObject = nullptr;
1077     napi_value jsValue = nullptr;
1078 
1079     NAPI_CALL(env, napi_create_object(env, &jsObject));
1080 
1081     napi_value jsElementName = WrapElementName(env, want.GetElement());
1082     if (jsElementName == nullptr) {
1083         TAG_LOGI(AAFwkTag::JSNAPI, "null jsElementName");
1084         return nullptr;
1085     }
1086 
1087     jsValue = GetPropertyValueByPropertyName(env, jsElementName, "deviceId", napi_string);
1088     SetPropertyValueByPropertyName(env, jsObject, "deviceId", jsValue);
1089 
1090     jsValue = nullptr;
1091     jsValue = GetPropertyValueByPropertyName(env, jsElementName, "bundleName", napi_string);
1092     SetPropertyValueByPropertyName(env, jsObject, "bundleName", jsValue);
1093 
1094     jsValue = nullptr;
1095     jsValue = GetPropertyValueByPropertyName(env, jsElementName, "abilityName", napi_string);
1096     SetPropertyValueByPropertyName(env, jsObject, "abilityName", jsValue);
1097 
1098     jsValue = nullptr;
1099     jsValue = GetPropertyValueByPropertyName(env, jsElementName, "moduleName", napi_string);
1100     SetPropertyValueByPropertyName(env, jsObject, "moduleName", jsValue);
1101 
1102     jsValue = nullptr;
1103     jsValue = WrapStringToJS(env, want.GetUriString());
1104     SetPropertyValueByPropertyName(env, jsObject, "uri", jsValue);
1105 
1106     jsValue = nullptr;
1107     jsValue = WrapStringToJS(env, want.GetType());
1108     SetPropertyValueByPropertyName(env, jsObject, "type", jsValue);
1109 
1110     jsValue = nullptr;
1111     jsValue = WrapInt32ToJS(env, want.GetFlags());
1112     SetPropertyValueByPropertyName(env, jsObject, "flags", jsValue);
1113 
1114     jsValue = nullptr;
1115     jsValue = WrapStringToJS(env, want.GetAction());
1116     SetPropertyValueByPropertyName(env, jsObject, "action", jsValue);
1117 
1118     jsValue = nullptr;
1119     jsValue = WrapWantParams(env, want.GetParams());
1120     SetPropertyValueByPropertyName(env, jsObject, "parameters", jsValue);
1121 
1122     jsValue = nullptr;
1123     jsValue = WrapWantParamsFD(env, want.GetParams());
1124     SetPropertyValueByPropertyName(env, jsObject, "fds", jsValue);
1125 
1126     jsValue = nullptr;
1127     jsValue = WrapArrayStringToJS(env, want.GetEntities());
1128     SetPropertyValueByPropertyName(env, jsObject, "entities", jsValue);
1129 
1130     return jsObject;
1131 }
1132 
WrapWantParamsFD(napi_env env,const AAFwk::WantParams & wantParams)1133 napi_value WrapWantParamsFD(napi_env env, const AAFwk::WantParams &wantParams)
1134 {
1135     napi_value jsObject = nullptr;
1136     NAPI_CALL(env, napi_create_object(env, &jsObject));
1137     auto paramList = wantParams.GetParams();
1138     WantParams fds;
1139     for (auto it = paramList.begin(); it != paramList.end(); it++) {
1140         if (AAFwk::IWantParams::Query(it->second) == nullptr) {
1141             TAG_LOGD(AAFwkTag::JSNAPI, "not wantpram");
1142             continue;
1143         }
1144         auto value = wantParams.GetParam(it->first);
1145         AAFwk::IWantParams *o = AAFwk::IWantParams::Query(value);
1146         if (o == nullptr) {
1147             return jsObject;
1148         }
1149         AAFwk::WantParams wp = AAFwk::WantParamWrapper::Unbox(o);
1150         auto valueMap = wp.GetParams();
1151         if (valueMap.size() != PROPERTIES_SIZE) {
1152             TAG_LOGD(AAFwkTag::JSNAPI, "not fd");
1153             return jsObject;
1154         }
1155 
1156         //type
1157         auto typeIt = valueMap.find(TYPE_PROPERTY);
1158         if (typeIt == valueMap.end()) {
1159             return jsObject;
1160         }
1161         AAFwk::IString *strValue = AAFwk::IString::Query(typeIt->second);
1162         if (strValue == nullptr) {
1163             return jsObject;
1164         }
1165         std::string typeString = AAFwk::String::Unbox(strValue);
1166         if (typeString != FD) {
1167             TAG_LOGD(AAFwkTag::JSNAPI, "not fd");
1168             return jsObject;
1169         }
1170 
1171         // value
1172         auto valueIt = valueMap.find(VALUE_PROPERTY);
1173         if (valueIt == valueMap.end()) {
1174             return jsObject;
1175         }
1176         AAFwk::IInteger *intValue = AAFwk::IInteger::Query(valueIt->second);
1177         if (intValue == nullptr) {
1178             return jsObject;
1179         }
1180         fds.SetParam(it->first, intValue);
1181     }
1182     return WrapWantParams(env, fds);
1183 }
1184 
UnwrapWant(napi_env env,napi_value param,Want & want)1185 bool UnwrapWant(napi_env env, napi_value param, Want &want)
1186 {
1187     return UnwrapWant(env, param, want, "");
1188 }
1189 
UnwrapWant(napi_env env,napi_value param,Want & want,const std::string & proNameNotFilter)1190 bool UnwrapWant(napi_env env, napi_value param, Want &want, const std::string &proNameNotFilter)
1191 {
1192     if (!IsTypeForNapiValue(env, param, napi_object)) {
1193         TAG_LOGI(AAFwkTag::JSNAPI, "not napi_object");
1194         return false;
1195     }
1196 
1197     napi_value jsValue = GetPropertyValueByPropertyName(env, param, "parameters", napi_object);
1198     if (jsValue != nullptr) {
1199         AAFwk::WantParams wantParams;
1200         if (UnwrapWantParams(env, jsValue, wantParams, proNameNotFilter)) {
1201             want.SetParams(wantParams);
1202         }
1203     }
1204 
1205     std::string natValueString("");
1206     if (UnwrapStringByPropertyName(env, param, "action", natValueString)) {
1207         want.SetAction(natValueString);
1208     }
1209 
1210     std::vector<std::string> natValueStringList;
1211     if (UnwrapStringArrayByPropertyName(env, param, "entities", natValueStringList)) {
1212         for (size_t i = 0; i < natValueStringList.size(); i++) {
1213             want.AddEntity(natValueStringList[i]);
1214         }
1215     }
1216 
1217     natValueString = "";
1218     if (UnwrapStringByPropertyName(env, param, "uri", natValueString)) {
1219         want.SetUri(natValueString);
1220     }
1221 
1222     int32_t flags = 0;
1223     if (UnwrapInt32ByPropertyName(env, param, "flags", flags)) {
1224         want.SetFlags(flags);
1225     }
1226 
1227     ElementName natElementName;
1228     UnwrapElementName(env, param, natElementName);
1229     want.SetElementName(natElementName.GetDeviceID(), natElementName.GetBundleName(),
1230         natElementName.GetAbilityName(), natElementName.GetModuleName());
1231 
1232     natValueString = "";
1233     if (UnwrapStringByPropertyName(env, param, "type", natValueString)) {
1234         want.SetType(natValueString);
1235     }
1236 
1237     return true;
1238 }
1239 
WrapAbilityResult(napi_env env,const int & resultCode,const AAFwk::Want & want)1240 napi_value WrapAbilityResult(napi_env env, const int &resultCode, const AAFwk::Want &want)
1241 {
1242     napi_value jsObject = nullptr;
1243     napi_value jsValue = nullptr;
1244 
1245     NAPI_CALL(env, napi_create_object(env, &jsObject));
1246 
1247     jsValue = WrapInt32ToJS(env, resultCode);
1248     SetPropertyValueByPropertyName(env, jsObject, "resultCode", jsValue);
1249 
1250     jsValue = nullptr;
1251     jsValue = WrapWant(env, want);
1252     SetPropertyValueByPropertyName(env, jsObject, "want", jsValue);
1253 
1254     return jsObject;
1255 }
1256 
UnWrapAbilityResult(napi_env env,napi_value param,int & resultCode,AAFwk::Want & want)1257 bool UnWrapAbilityResult(napi_env env, napi_value param, int &resultCode, AAFwk::Want &want)
1258 {
1259     if (!IsTypeForNapiValue(env, param, napi_object)) {
1260         return false;
1261     }
1262 
1263     if (!UnwrapInt32ByPropertyName(env, param, "resultCode", resultCode)) {
1264         return false;
1265     }
1266 
1267     if (IsExistsByPropertyName(env, param, "want")) {
1268         napi_value jsWant = nullptr;
1269         if (napi_get_named_property(env, param, "want", &jsWant) != napi_ok) {
1270             return false;
1271         }
1272         if (IsTypeForNapiValue(env, jsWant, napi_undefined)) {
1273             return true;
1274         }
1275         if (!UnwrapWant(env, jsWant, want)) {
1276             return false;
1277         }
1278     }
1279     return true;
1280 }
1281 
CreateJsWant(napi_env env,const Want & want)1282 napi_value CreateJsWant(napi_env env, const Want &want)
1283 {
1284     napi_value object = nullptr;
1285     napi_create_object(env, &object);
1286 
1287     napi_set_named_property(env, object, "deviceId", CreateJsValue(env, want.GetElement().GetDeviceID()));
1288     napi_set_named_property(env, object, "bundleName", CreateJsValue(env, want.GetElement().GetBundleName()));
1289     napi_set_named_property(env, object, "abilityName", CreateJsValue(env, want.GetElement().GetAbilityName()));
1290     napi_set_named_property(env, object, "moduleName", CreateJsValue(env, want.GetElement().GetModuleName()));
1291     napi_set_named_property(env, object, "uri", CreateJsValue(env, want.GetUriString()));
1292     napi_set_named_property(env, object, "type", CreateJsValue(env, want.GetType()));
1293     napi_set_named_property(env, object, "flags", CreateJsValue(env, static_cast<int32_t>(want.GetFlags())));
1294     napi_set_named_property(env, object, "action", CreateJsValue(env, want.GetAction()));
1295     napi_set_named_property(env, object, "parameters", CreateJsWantParams(env, want.GetParams()));
1296     napi_set_named_property(env, object, "entities", CreateNativeArray(env, want.GetEntities()));
1297     return object;
1298 }
1299 
CreateJsWantParams(napi_env env,const AAFwk::WantParams & wantParams)1300 napi_value CreateJsWantParams(napi_env env, const AAFwk::WantParams &wantParams)
1301 {
1302     napi_value object = nullptr;
1303     napi_create_object(env, &object);
1304 
1305     const std::map<std::string, sptr<AAFwk::IInterface>> paramList = wantParams.GetParams();
1306     for (auto iter = paramList.begin(); iter != paramList.end(); iter++) {
1307         if (AAFwk::IString::Query(iter->second) != nullptr) {
1308             InnerWrapJsWantParams<AAFwk::IString, AAFwk::String, std::string>(
1309                 env, object, iter->first, wantParams);
1310         } else if (AAFwk::IBoolean::Query(iter->second) != nullptr) {
1311             InnerWrapJsWantParams<AAFwk::IBoolean, AAFwk::Boolean, bool>(
1312                 env, object, iter->first, wantParams);
1313         } else if (AAFwk::IShort::Query(iter->second) != nullptr) {
1314             InnerWrapJsWantParams<AAFwk::IShort, AAFwk::Short, short>(
1315                 env, object, iter->first, wantParams);
1316         } else if (AAFwk::IInteger::Query(iter->second) != nullptr) {
1317             InnerWrapJsWantParams<AAFwk::IInteger, AAFwk::Integer, int>(
1318                 env, object, iter->first, wantParams);
1319         } else if (AAFwk::ILong::Query(iter->second) != nullptr) {
1320             InnerWrapJsWantParams<AAFwk::ILong, AAFwk::Long, int64_t>(
1321                 env, object, iter->first, wantParams);
1322         } else if (AAFwk::IFloat::Query(iter->second) != nullptr) {
1323             InnerWrapJsWantParams<AAFwk::IFloat, AAFwk::Float, float>(
1324                 env, object, iter->first, wantParams);
1325         } else if (AAFwk::IDouble::Query(iter->second) != nullptr) {
1326             InnerWrapJsWantParams<AAFwk::IDouble, AAFwk::Double, double>(
1327                 env, object, iter->first, wantParams);
1328         } else if (AAFwk::IChar::Query(iter->second) != nullptr) {
1329             InnerWrapJsWantParams<AAFwk::IChar, AAFwk::Char, char>(
1330                 env, object, iter->first, wantParams);
1331         } else if (AAFwk::IByte::Query(iter->second) != nullptr) {
1332             InnerWrapJsWantParams<AAFwk::IByte, AAFwk::Byte, int>(
1333                 env, object, iter->first, wantParams);
1334         } else if (AAFwk::IArray::Query(iter->second) != nullptr) {
1335             AAFwk::IArray *ao = AAFwk::IArray::Query(iter->second);
1336             if (ao != nullptr) {
1337                 sptr<AAFwk::IArray> array(ao);
1338                 WrapJsWantParamsArray(env, object, iter->first, array);
1339             }
1340         } else if (AAFwk::IWantParams::Query(iter->second) != nullptr) {
1341             InnerWrapJsWantParamsWantParams(env, object, iter->first, wantParams);
1342         }
1343     }
1344     return object;
1345 }
1346 
InnerWrapJsWantParamsWantParams(napi_env env,napi_value object,const std::string & key,const AAFwk::WantParams & wantParams)1347 bool InnerWrapJsWantParamsWantParams(
1348     napi_env env, napi_value object, const std::string &key, const AAFwk::WantParams &wantParams)
1349 {
1350     auto value = wantParams.GetParam(key);
1351     AAFwk::IWantParams *o = AAFwk::IWantParams::Query(value);
1352     if (o != nullptr) {
1353         AAFwk::WantParams wp = AAFwk::WantParamWrapper::Unbox(o);
1354         napi_value propertyValue = CreateJsWantParams(env, wp);
1355         napi_set_named_property(env, object, key.c_str(), propertyValue);
1356         return true;
1357     }
1358     return false;
1359 }
1360 
WrapJsWantParamsArray(napi_env env,napi_value object,const std::string & key,sptr<AAFwk::IArray> & ao)1361 bool WrapJsWantParamsArray(napi_env env, napi_value object, const std::string &key, sptr<AAFwk::IArray> &ao)
1362 {
1363     TAG_LOGI(AAFwkTag::JSNAPI, "key=%{public}s", key.c_str());
1364     if (AAFwk::Array::IsStringArray(ao)) {
1365         return InnerWrapWantParamsArray<AAFwk::IString, AAFwk::String, std::string>(
1366             env, object, key, ao);
1367     } else if (AAFwk::Array::IsBooleanArray(ao)) {
1368         return InnerWrapWantParamsArray<AAFwk::IBoolean, AAFwk::Boolean, bool>(
1369             env, object, key, ao);
1370     } else if (AAFwk::Array::IsShortArray(ao)) {
1371         return InnerWrapWantParamsArray<AAFwk::IShort, AAFwk::Short, short>(
1372             env, object, key, ao);
1373     } else if (AAFwk::Array::IsIntegerArray(ao)) {
1374         return InnerWrapWantParamsArray<AAFwk::IInteger, AAFwk::Integer, int>(
1375             env, object, key, ao);
1376     } else if (AAFwk::Array::IsLongArray(ao)) {
1377         return InnerWrapWantParamsArray<AAFwk::ILong, AAFwk::Long, int64_t>(
1378             env, object, key, ao);
1379     } else if (AAFwk::Array::IsFloatArray(ao)) {
1380         return InnerWrapWantParamsArray<AAFwk::IFloat, AAFwk::Float, float>(
1381             env, object, key, ao);
1382     } else if (AAFwk::Array::IsByteArray(ao)) {
1383         return InnerWrapWantParamsArray<AAFwk::IByte, AAFwk::Byte, int>(
1384             env, object, key, ao);
1385     } else if (AAFwk::Array::IsCharArray(ao)) {
1386         return InnerWrapWantParamsArray<AAFwk::IChar, AAFwk::Char, char>(
1387             env, object, key, ao);
1388     } else if (AAFwk::Array::IsDoubleArray(ao)) {
1389         return InnerWrapWantParamsArray<AAFwk::IDouble, AAFwk::Double, double>(
1390             env, object, key, ao);
1391     } else if (AAFwk::Array::IsWantParamsArray(ao)) {
1392         TAG_LOGD(AAFwkTag::JSNAPI, "Array type is WantParams");
1393         return InnerWrapWantParamsArrayWantParams(env, object, key, ao);
1394     } else {
1395         TAG_LOGE(AAFwkTag::JSNAPI, "Array type unknown");
1396         return false;
1397     }
1398 }
1399 
1400 template<class TBase, class T, class NativeT>
InnerWrapWantParamsArray(napi_env env,napi_value object,const std::string & key,sptr<AAFwk::IArray> & ao)1401 bool InnerWrapWantParamsArray(napi_env env, napi_value object, const std::string &key, sptr<AAFwk::IArray> &ao)
1402 {
1403     if (ao == nullptr) {
1404         return false;
1405     }
1406     long size = 0;
1407     if (ao->GetLength(size) != ERR_OK) {
1408         return false;
1409     }
1410     std::vector<NativeT> natArray;
1411     for (long i = 0; i < size; i++) {
1412         sptr<AAFwk::IInterface> iface = nullptr;
1413         if (ao->Get(i, iface) == ERR_OK) {
1414             TBase *iValue = TBase::Query(iface);
1415             if (iValue != nullptr) {
1416                 natArray.push_back(T::Unbox(iValue));
1417             }
1418         }
1419     }
1420     napi_set_named_property(env, object, key.c_str(), OHOS::AbilityRuntime::CreateNativeArray(env, natArray));
1421     return true;
1422 }
1423 
1424 template<class TBase, class T, class NativeT>
InnerWrapJsWantParams(napi_env env,napi_value object,const std::string & key,const AAFwk::WantParams & wantParams)1425 bool InnerWrapJsWantParams(napi_env env, napi_value object, const std::string &key, const AAFwk::WantParams &wantParams)
1426 {
1427     auto value = wantParams.GetParam(key);
1428     TBase *ao = TBase::Query(value);
1429     if (ao != nullptr) {
1430         NativeT natValue = T::Unbox(ao);
1431         napi_value propertyValue = OHOS::AbilityRuntime::CreateJsValue(env, natValue);
1432         napi_set_named_property(env, object, key.c_str(), propertyValue);
1433         return true;
1434     }
1435     return false;
1436 }
1437 }  // namespace AppExecFwk
1438 }  // namespace OHOS
1439