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