1 /*
2 * Copyright (c) 2021 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 "js_plugin_want.h"
17
18 #include "array_wrapper.h"
19 #include "bool_wrapper.h"
20 #include "byte_wrapper.h"
21 #include "double_wrapper.h"
22 #include "float_wrapper.h"
23 #include "int_wrapper.h"
24 #include "js_plugin_util.h"
25 #include "long_wrapper.h"
26 #include "short_wrapper.h"
27 #include "string_wrapper.h"
28 #include "want_params_wrapper.h"
29 #include "zchar_wrapper.h"
30
31 #include "base/log/log_wrapper.h"
32
33 namespace OHOS::Ace::Napi {
34 /**
35 * @brief Init param of wantOptions.
36 *
37 * @param flagMap Indicates flag of list in Want .
38 */
AceInnerInitWantOptionsData(std::map<std::string,unsigned int> & flagMap)39 void AceInnerInitWantOptionsData(std::map<std::string, unsigned int>& flagMap)
40 {
41 flagMap.emplace("authReadUriPermission", Want::FLAG_AUTH_READ_URI_PERMISSION);
42 flagMap.emplace("authWriteUriPermission", Want::FLAG_AUTH_WRITE_URI_PERMISSION);
43 flagMap.emplace("abilityForwardResult", Want::FLAG_ABILITY_FORWARD_RESULT);
44 flagMap.emplace("abilityContinuation", Want::FLAG_ABILITY_CONTINUATION);
45 flagMap.emplace("notOhosComponent", Want::FLAG_NOT_OHOS_COMPONENT);
46 flagMap.emplace("abilityFormEnabled", Want::FLAG_ABILITY_FORM_ENABLED);
47 flagMap.emplace("authPersistableUriPermission", Want::FLAG_AUTH_PERSISTABLE_URI_PERMISSION);
48 flagMap.emplace("authPrefixUriPermission", Want::FLAG_AUTH_PREFIX_URI_PERMISSION);
49 flagMap.emplace("abilitySliceMultiDevice", Want::FLAG_ABILITYSLICE_MULTI_DEVICE);
50 flagMap.emplace("startForegroundAbility", Want::FLAG_START_FOREGROUND_ABILITY);
51 flagMap.emplace("installOnDemand", Want::FLAG_INSTALL_ON_DEMAND);
52 flagMap.emplace("abilitySliceForwardResult", Want::FLAG_ABILITYSLICE_FORWARD_RESULT);
53 flagMap.emplace("installWithBackgroundMode", Want::FLAG_INSTALL_WITH_BACKGROUND_MODE);
54 }
55
AceWrapElementName(napi_env env,const ElementName & elementName)56 napi_value AceWrapElementName(napi_env env, const ElementName& elementName)
57 {
58 napi_value jsObject = nullptr;
59 NAPI_CALL(env, napi_create_object(env, &jsObject));
60
61 napi_value jsValue = nullptr;
62 NAPI_CALL(env, napi_create_string_utf8(env, elementName.GetDeviceID().c_str(), NAPI_AUTO_LENGTH, &jsValue));
63 NAPI_CALL(env, napi_set_named_property(env, jsObject, "deviceId", jsValue));
64
65 jsValue = nullptr;
66 NAPI_CALL(env, napi_create_string_utf8(env, elementName.GetBundleName().c_str(), NAPI_AUTO_LENGTH, &jsValue));
67 NAPI_CALL(env, napi_set_named_property(env, jsObject, "bundleName", jsValue));
68
69 jsValue = nullptr;
70 NAPI_CALL(env, napi_create_string_utf8(env, elementName.GetAbilityName().c_str(), NAPI_AUTO_LENGTH, &jsValue));
71 NAPI_CALL(env, napi_set_named_property(env, jsObject, "abilityName", jsValue));
72
73 return jsObject;
74 }
75
AceUnwrapElementName(napi_env env,napi_value param,ElementName & elementName)76 bool AceUnwrapElementName(napi_env env, napi_value param, ElementName& elementName)
77 {
78 std::string natValue("");
79 if (AceUnwrapStringByPropertyName(env, param, "deviceId", natValue)) {
80 elementName.SetDeviceID(natValue);
81 }
82
83 natValue = "";
84 if (AceUnwrapStringByPropertyName(env, param, "bundleName", natValue)) {
85 elementName.SetBundleName(natValue);
86 }
87
88 natValue = "";
89 if (AceUnwrapStringByPropertyName(env, param, "abilityName", natValue)) {
90 elementName.SetAbilityName(natValue);
91 }
92 return true;
93 }
AceInnerWrapWantParamsChar(napi_env env,napi_value jsObject,const std::string & key,const AAFwk::WantParams & wantParams)94 bool AceInnerWrapWantParamsChar(
95 napi_env env, napi_value jsObject, const std::string& key, const AAFwk::WantParams& wantParams)
96 {
97 auto value = wantParams.GetParam(key);
98 AAFwk::IChar* ao = AAFwk::IChar::Query(value);
99 if (ao != nullptr) {
100 std::string natValue(static_cast<Char*>(ao)->ToString());
101 napi_value jsValue = AceWrapStringToJS(env, natValue);
102 if (jsValue != nullptr) {
103 NAPI_CALL_BASE(env, napi_set_named_property(env, jsObject, key.c_str(), jsValue), false);
104 return true;
105 }
106 }
107 return false;
108 }
109
AceInnerWrapWantParamsString(napi_env env,napi_value jsObject,const std::string & key,const AAFwk::WantParams & wantParams)110 bool AceInnerWrapWantParamsString(
111 napi_env env, napi_value jsObject, const std::string& key, const AAFwk::WantParams& wantParams)
112 {
113 auto value = wantParams.GetParam(key);
114 AAFwk::IString* ao = AAFwk::IString::Query(value);
115 if (ao != nullptr) {
116 std::string natValue = AAFwk::String::Unbox(ao);
117 napi_value jsValue = AceWrapStringToJS(env, natValue);
118 if (jsValue != nullptr) {
119 NAPI_CALL_BASE(env, napi_set_named_property(env, jsObject, key.c_str(), jsValue), false);
120 return true;
121 }
122 }
123 return false;
124 }
125
AceInnerWrapWantParamsBool(napi_env env,napi_value jsObject,const std::string & key,const AAFwk::WantParams & wantParams)126 bool AceInnerWrapWantParamsBool(
127 napi_env env, napi_value jsObject, const std::string& key, const AAFwk::WantParams& wantParams)
128 {
129 auto value = wantParams.GetParam(key);
130 AAFwk::IBoolean* bo = AAFwk::IBoolean::Query(value);
131 if (bo != nullptr) {
132 bool natValue = AAFwk::Boolean::Unbox(bo);
133 napi_value jsValue = AceWrapBoolToJS(env, natValue);
134 if (jsValue != nullptr) {
135 NAPI_CALL_BASE(env, napi_set_named_property(env, jsObject, key.c_str(), jsValue), false);
136 return true;
137 }
138 }
139 return false;
140 }
141
AceInnerWrapWantParamsByte(napi_env env,napi_value jsObject,const std::string & key,const AAFwk::WantParams & wantParams)142 bool AceInnerWrapWantParamsByte(
143 napi_env env, napi_value jsObject, const std::string& key, const AAFwk::WantParams& wantParams)
144 {
145 auto value = wantParams.GetParam(key);
146 AAFwk::IByte* bo = AAFwk::IByte::Query(value);
147 if (bo != nullptr) {
148 int32_t intValue = static_cast<int32_t>(AAFwk::Byte::Unbox(bo));
149 napi_value jsValue = AceWrapInt32ToJS(env, intValue);
150 if (jsValue != nullptr) {
151 NAPI_CALL_BASE(env, napi_set_named_property(env, jsObject, key.c_str(), jsValue), false);
152 return true;
153 }
154 }
155 return false;
156 }
157
AceInnerWrapWantParamsShort(napi_env env,napi_value jsObject,const std::string & key,const AAFwk::WantParams & wantParams)158 bool AceInnerWrapWantParamsShort(
159 napi_env env, napi_value jsObject, const std::string& key, const AAFwk::WantParams& wantParams)
160 {
161 auto value = wantParams.GetParam(key);
162 AAFwk::IShort* ao = AAFwk::IShort::Query(value);
163 if (ao != nullptr) {
164 short natValue = AAFwk::Short::Unbox(ao);
165 napi_value jsValue = AceWrapInt32ToJS(env, natValue);
166 if (jsValue != nullptr) {
167 NAPI_CALL_BASE(env, napi_set_named_property(env, jsObject, key.c_str(), jsValue), false);
168 return true;
169 }
170 }
171 return false;
172 }
173
AceInnerWrapWantParamsInt32(napi_env env,napi_value jsObject,const std::string & key,const AAFwk::WantParams & wantParams)174 bool AceInnerWrapWantParamsInt32(
175 napi_env env, napi_value jsObject, const std::string& key, const AAFwk::WantParams& wantParams)
176 {
177 auto value = wantParams.GetParam(key);
178 AAFwk::IInteger* ao = AAFwk::IInteger::Query(value);
179 if (ao != nullptr) {
180 int natValue = AAFwk::Integer::Unbox(ao);
181 napi_value jsValue = AceWrapInt32ToJS(env, natValue);
182 if (jsValue != nullptr) {
183 NAPI_CALL_BASE(env, napi_set_named_property(env, jsObject, key.c_str(), jsValue), false);
184 return true;
185 }
186 }
187 return false;
188 }
189
AceInnerWrapWantParamsInt64(napi_env env,napi_value jsObject,const std::string & key,const AAFwk::WantParams & wantParams)190 bool AceInnerWrapWantParamsInt64(
191 napi_env env, napi_value jsObject, const std::string& key, const AAFwk::WantParams& wantParams)
192 {
193 auto value = wantParams.GetParam(key);
194 AAFwk::ILong* ao = AAFwk::ILong::Query(value);
195 if (ao != nullptr) {
196 int64_t natValue = AAFwk::Long::Unbox(ao);
197 napi_value jsValue = AceWrapInt64ToJS(env, natValue);
198 if (jsValue != nullptr) {
199 NAPI_CALL_BASE(env, napi_set_named_property(env, jsObject, key.c_str(), jsValue), false);
200 return true;
201 }
202 }
203 return false;
204 }
205
AceInnerWrapWantParamsFloat(napi_env env,napi_value jsObject,const std::string & key,const AAFwk::WantParams & wantParams)206 bool AceInnerWrapWantParamsFloat(
207 napi_env env, napi_value jsObject, const std::string& key, const AAFwk::WantParams& wantParams)
208 {
209 auto value = wantParams.GetParam(key);
210 AAFwk::IFloat* ao = AAFwk::IFloat::Query(value);
211 if (ao != nullptr) {
212 float natValue = AAFwk::Float::Unbox(ao);
213 napi_value jsValue = AceWrapDoubleToJS(env, natValue);
214 if (jsValue != nullptr) {
215 NAPI_CALL_BASE(env, napi_set_named_property(env, jsObject, key.c_str(), jsValue), false);
216 return true;
217 }
218 }
219 return false;
220 }
221
AceInnerWrapWantParamsDouble(napi_env env,napi_value jsObject,const std::string & key,const AAFwk::WantParams & wantParams)222 bool AceInnerWrapWantParamsDouble(
223 napi_env env, napi_value jsObject, const std::string& key, const AAFwk::WantParams& wantParams)
224 {
225 auto value = wantParams.GetParam(key);
226 AAFwk::IDouble* ao = AAFwk::IDouble::Query(value);
227 if (ao != nullptr) {
228 double natValue = AAFwk::Double::Unbox(ao);
229 napi_value jsValue = AceWrapDoubleToJS(env, natValue);
230 if (jsValue != nullptr) {
231 NAPI_CALL_BASE(env, napi_set_named_property(env, jsObject, key.c_str(), jsValue), false);
232 return true;
233 }
234 }
235 return false;
236 }
237
AceInnerWrapWantParamsWantParams(napi_env env,napi_value jsObject,const std::string & key,const AAFwk::WantParams & wantParams)238 bool AceInnerWrapWantParamsWantParams(
239 napi_env env, napi_value jsObject, const std::string& key, const AAFwk::WantParams& wantParams)
240 {
241 auto value = wantParams.GetParam(key);
242 AAFwk::IWantParams* o = AAFwk::IWantParams::Query(value);
243 if (o != nullptr) {
244 AAFwk::WantParams wp = AAFwk::WantParamWrapper::Unbox(o);
245 napi_value jsValue = AceWrapWantParams(env, wp);
246 if (jsValue != nullptr) {
247 NAPI_CALL_BASE(env, napi_set_named_property(env, jsObject, key.c_str(), jsValue), false);
248 return true;
249 }
250 }
251 return false;
252 }
AceInnerWrapWantParamsArrayChar(napi_env env,napi_value jsObject,const std::string & key,sptr<AAFwk::IArray> & ao)253 bool AceInnerWrapWantParamsArrayChar(napi_env env, napi_value jsObject, const std::string& key, sptr<AAFwk::IArray>& ao)
254 {
255 long size = 0;
256 if (ao->GetLength(size) != ERR_OK) {
257 return false;
258 }
259
260 std::vector<std::string> natArray;
261 for (int64_t i = 0; i < size; i++) {
262 sptr<AAFwk::IInterface> iface = nullptr;
263 if (ao->Get(i, iface) == ERR_OK) {
264 AAFwk::IChar* iValue = AAFwk::IChar::Query(iface);
265 if (iValue != nullptr) {
266 std::string str(static_cast<Char*>(iValue)->ToString());
267 natArray.push_back(str);
268 }
269 }
270 }
271
272 napi_value jsValue = AceWrapArrayStringToJS(env, natArray);
273 if (jsValue != nullptr) {
274 NAPI_CALL_BASE(env, napi_set_named_property(env, jsObject, key.c_str(), jsValue), false);
275 return true;
276 }
277 return false;
278 }
279
AceInnerWrapWantParamsArrayString(napi_env env,napi_value jsObject,const std::string & key,sptr<AAFwk::IArray> & ao)280 bool AceInnerWrapWantParamsArrayString(
281 napi_env env, napi_value jsObject, const std::string& key, sptr<AAFwk::IArray>& ao)
282 {
283 long size = 0;
284 if (ao->GetLength(size) != ERR_OK) {
285 return false;
286 }
287
288 std::vector<std::string> natArray;
289 for (int64_t i = 0; i < size; i++) {
290 sptr<AAFwk::IInterface> iface = nullptr;
291 if (ao->Get(i, iface) == ERR_OK) {
292 AAFwk::IString* iValue = AAFwk::IString::Query(iface);
293 if (iValue != nullptr) {
294 natArray.push_back(AAFwk::String::Unbox(iValue));
295 }
296 }
297 }
298
299 napi_value jsValue = AceWrapArrayStringToJS(env, natArray);
300 if (jsValue != nullptr) {
301 NAPI_CALL_BASE(env, napi_set_named_property(env, jsObject, key.c_str(), jsValue), false);
302 return true;
303 }
304 return false;
305 }
306
AceInnerWrapWantParamsArrayBool(napi_env env,napi_value jsObject,const std::string & key,sptr<AAFwk::IArray> & ao)307 bool AceInnerWrapWantParamsArrayBool(napi_env env, napi_value jsObject, const std::string& key, sptr<AAFwk::IArray>& ao)
308 {
309 long size = 0;
310 if (ao->GetLength(size) != ERR_OK) {
311 return false;
312 }
313
314 std::vector<bool> natArray;
315 for (int64_t i = 0; i < size; i++) {
316 sptr<AAFwk::IInterface> iface = nullptr;
317 if (ao->Get(i, iface) == ERR_OK) {
318 AAFwk::IBoolean* iValue = AAFwk::IBoolean::Query(iface);
319 if (iValue != nullptr) {
320 natArray.push_back(AAFwk::Boolean::Unbox(iValue));
321 }
322 }
323 }
324
325 napi_value jsValue = AceWrapArrayBoolToJS(env, natArray);
326 if (jsValue != nullptr) {
327 NAPI_CALL_BASE(env, napi_set_named_property(env, jsObject, key.c_str(), jsValue), false);
328 return true;
329 }
330 return false;
331 }
332
AceInnerWrapWantParamsArrayShort(napi_env env,napi_value jsObject,const std::string & key,sptr<AAFwk::IArray> & ao)333 bool AceInnerWrapWantParamsArrayShort(
334 napi_env env, napi_value jsObject, const std::string& key, sptr<AAFwk::IArray>& ao)
335 {
336 long size = 0;
337 if (ao->GetLength(size) != ERR_OK) {
338 return false;
339 }
340
341 std::vector<int> natArray;
342 for (int64_t i = 0; i < size; i++) {
343 sptr<AAFwk::IInterface> iface = nullptr;
344 if (ao->Get(i, iface) == ERR_OK) {
345 AAFwk::IShort* iValue = AAFwk::IShort::Query(iface);
346 if (iValue != nullptr) {
347 natArray.push_back(AAFwk::Short::Unbox(iValue));
348 }
349 }
350 }
351
352 napi_value jsValue = AceWrapArrayInt32ToJS(env, natArray);
353 if (jsValue != nullptr) {
354 NAPI_CALL_BASE(env, napi_set_named_property(env, jsObject, key.c_str(), jsValue), false);
355 return true;
356 }
357 return false;
358 }
AceInnerWrapWantParamsArrayByte(napi_env env,napi_value jsObject,const std::string & key,sptr<AAFwk::IArray> & ao)359 bool AceInnerWrapWantParamsArrayByte(napi_env env, napi_value jsObject, const std::string& key, sptr<AAFwk::IArray>& ao)
360 {
361 long size = 0;
362 if (ao->GetLength(size) != ERR_OK) {
363 return false;
364 }
365
366 std::vector<int> natArray;
367 for (int64_t i = 0; i < size; i++) {
368 sptr<AAFwk::IInterface> iface = nullptr;
369 if (ao->Get(i, iface) == ERR_OK) {
370 AAFwk::IByte* iValue = AAFwk::IByte::Query(iface);
371 if (iValue != nullptr) {
372 int intValue = static_cast<int>(AAFwk::Byte::Unbox(iValue));
373 natArray.push_back(intValue);
374 }
375 }
376 }
377
378 napi_value jsValue = AceWrapArrayInt32ToJS(env, natArray);
379 if (jsValue != nullptr) {
380 NAPI_CALL_BASE(env, napi_set_named_property(env, jsObject, key.c_str(), jsValue), false);
381 return true;
382 }
383 return false;
384 }
385
AceInnerWrapWantParamsArrayInt32(napi_env env,napi_value jsObject,const std::string & key,sptr<AAFwk::IArray> & ao)386 bool AceInnerWrapWantParamsArrayInt32(
387 napi_env env, napi_value jsObject, const std::string& key, sptr<AAFwk::IArray>& ao)
388 {
389 long size = 0;
390 if (ao->GetLength(size) != ERR_OK) {
391 return false;
392 }
393
394 std::vector<int> natArray;
395 for (int64_t i = 0; i < size; i++) {
396 sptr<AAFwk::IInterface> iface = nullptr;
397 if (ao->Get(i, iface) == ERR_OK) {
398 AAFwk::IInteger* iValue = AAFwk::IInteger::Query(iface);
399 if (iValue != nullptr) {
400 natArray.push_back(AAFwk::Integer::Unbox(iValue));
401 }
402 }
403 }
404
405 napi_value jsValue = AceWrapArrayInt32ToJS(env, natArray);
406 if (jsValue != nullptr) {
407 NAPI_CALL_BASE(env, napi_set_named_property(env, jsObject, key.c_str(), jsValue), false);
408 return true;
409 }
410 return false;
411 }
412
AceInnerWrapWantParamsArrayInt64(napi_env env,napi_value jsObject,const std::string & key,sptr<AAFwk::IArray> & ao)413 bool AceInnerWrapWantParamsArrayInt64(
414 napi_env env, napi_value jsObject, const std::string& key, sptr<AAFwk::IArray>& ao)
415 {
416 long size = 0;
417 if (ao->GetLength(size) != ERR_OK) {
418 return false;
419 }
420
421 std::vector<int64_t> natArray;
422 for (int64_t i = 0; i < size; i++) {
423 sptr<AAFwk::IInterface> iface = nullptr;
424 if (ao->Get(i, iface) == ERR_OK) {
425 AAFwk::ILong* iValue = AAFwk::ILong::Query(iface);
426 if (iValue != nullptr) {
427 natArray.push_back(AAFwk::Long::Unbox(iValue));
428 }
429 }
430 }
431
432 napi_value jsValue = AceWrapArrayInt64ToJS(env, natArray);
433 if (jsValue != nullptr) {
434 NAPI_CALL_BASE(env, napi_set_named_property(env, jsObject, key.c_str(), jsValue), false);
435 return true;
436 }
437 return false;
438 }
439
AceInnerWrapWantParamsArrayFloat(napi_env env,napi_value jsObject,const std::string & key,sptr<AAFwk::IArray> & ao)440 bool AceInnerWrapWantParamsArrayFloat(
441 napi_env env, napi_value jsObject, const std::string& key, sptr<AAFwk::IArray>& ao)
442 {
443 long size = 0;
444 if (ao->GetLength(size) != ERR_OK) {
445 return false;
446 }
447
448 std::vector<double> natArray;
449 for (int64_t i = 0; i < size; i++) {
450 sptr<AAFwk::IInterface> iface = nullptr;
451 if (ao->Get(i, iface) == ERR_OK) {
452 AAFwk::IFloat* iValue = AAFwk::IFloat::Query(iface);
453 if (iValue != nullptr) {
454 natArray.push_back(AAFwk::Float::Unbox(iValue));
455 }
456 }
457 }
458
459 napi_value jsValue = AceWrapArrayDoubleToJS(env, natArray);
460 if (jsValue != nullptr) {
461 NAPI_CALL_BASE(env, napi_set_named_property(env, jsObject, key.c_str(), jsValue), false);
462 return true;
463 }
464 return false;
465 }
466
AceInnerWrapWantParamsArrayDouble(napi_env env,napi_value jsObject,const std::string & key,sptr<AAFwk::IArray> & ao)467 bool AceInnerWrapWantParamsArrayDouble(
468 napi_env env, napi_value jsObject, const std::string& key, sptr<AAFwk::IArray>& ao)
469 {
470 long size = 0;
471 if (ao->GetLength(size) != ERR_OK) {
472 return false;
473 }
474
475 std::vector<double> natArray;
476 for (int64_t i = 0; i < size; i++) {
477 sptr<AAFwk::IInterface> iface = nullptr;
478 if (ao->Get(i, iface) == ERR_OK) {
479 AAFwk::IDouble* iValue = AAFwk::IDouble::Query(iface);
480 if (iValue != nullptr) {
481 natArray.push_back(AAFwk::Double::Unbox(iValue));
482 }
483 }
484 }
485
486 napi_value jsValue = AceWrapArrayDoubleToJS(env, natArray);
487 if (jsValue != nullptr) {
488 NAPI_CALL_BASE(env, napi_set_named_property(env, jsObject, key.c_str(), jsValue), false);
489 return true;
490 }
491 return false;
492 }
493
AceInnerWrapWantParamsArray(napi_env env,napi_value jsObject,const std::string & key,sptr<AAFwk::IArray> & ao)494 bool AceInnerWrapWantParamsArray(napi_env env, napi_value jsObject, const std::string& key, sptr<AAFwk::IArray>& ao)
495 {
496 if (AAFwk::Array::IsStringArray(ao)) {
497 return AceInnerWrapWantParamsArrayString(env, jsObject, key, ao);
498 } else if (AAFwk::Array::IsBooleanArray(ao)) {
499 return AceInnerWrapWantParamsArrayBool(env, jsObject, key, ao);
500 } else if (AAFwk::Array::IsShortArray(ao)) {
501 return AceInnerWrapWantParamsArrayShort(env, jsObject, key, ao);
502 } else if (AAFwk::Array::IsIntegerArray(ao)) {
503 return AceInnerWrapWantParamsArrayInt32(env, jsObject, key, ao);
504 } else if (AAFwk::Array::IsLongArray(ao)) {
505 return AceInnerWrapWantParamsArrayInt64(env, jsObject, key, ao);
506 } else if (AAFwk::Array::IsFloatArray(ao)) {
507 return AceInnerWrapWantParamsArrayFloat(env, jsObject, key, ao);
508 } else if (AAFwk::Array::IsByteArray(ao)) {
509 return AceInnerWrapWantParamsArrayByte(env, jsObject, key, ao);
510 } else if (AAFwk::Array::IsCharArray(ao)) {
511 return AceInnerWrapWantParamsArrayChar(env, jsObject, key, ao);
512 } else if (AAFwk::Array::IsDoubleArray(ao)) {
513 return AceInnerWrapWantParamsArrayDouble(env, jsObject, key, ao);
514 } else {
515 return false;
516 }
517 }
518
AceWrapWantParams(napi_env env,const AAFwk::WantParams & wantParams)519 napi_value AceWrapWantParams(napi_env env, const AAFwk::WantParams& wantParams)
520 {
521 napi_value jsObject = nullptr;
522 NAPI_CALL(env, napi_create_object(env, &jsObject));
523
524 napi_value jsValue = nullptr;
525 const std::map<std::string, sptr<AAFwk::IInterface>> paramList = wantParams.GetParams();
526 for (auto iter = paramList.begin(); iter != paramList.end(); iter++) {
527 jsValue = nullptr;
528 if (AAFwk::IString::Query(iter->second) != nullptr) {
529 AceInnerWrapWantParamsString(env, jsObject, iter->first, wantParams);
530 } else if (AAFwk::IBoolean::Query(iter->second) != nullptr) {
531 AceInnerWrapWantParamsBool(env, jsObject, iter->first, wantParams);
532 } else if (AAFwk::IShort::Query(iter->second) != nullptr) {
533 AceInnerWrapWantParamsShort(env, jsObject, iter->first, wantParams);
534 } else if (AAFwk::IInteger::Query(iter->second) != nullptr) {
535 AceInnerWrapWantParamsInt32(env, jsObject, iter->first, wantParams);
536 } else if (AAFwk::ILong::Query(iter->second) != nullptr) {
537 AceInnerWrapWantParamsInt64(env, jsObject, iter->first, wantParams);
538 } else if (AAFwk::IFloat::Query(iter->second) != nullptr) {
539 AceInnerWrapWantParamsFloat(env, jsObject, iter->first, wantParams);
540 } else if (AAFwk::IDouble::Query(iter->second) != nullptr) {
541 AceInnerWrapWantParamsDouble(env, jsObject, iter->first, wantParams);
542 } else if (AAFwk::IChar::Query(iter->second) != nullptr) {
543 AceInnerWrapWantParamsChar(env, jsObject, iter->first, wantParams);
544 } else if (AAFwk::IByte::Query(iter->second) != nullptr) {
545 AceInnerWrapWantParamsByte(env, jsObject, iter->first, wantParams);
546 } else if (AAFwk::IArray::Query(iter->second) != nullptr) {
547 AAFwk::IArray* ao = AAFwk::IArray::Query(iter->second);
548 if (ao != nullptr) {
549 sptr<AAFwk::IArray> array(ao);
550 AceInnerWrapWantParamsArray(env, jsObject, iter->first, array);
551 }
552 } else if (AAFwk::IWantParams::Query(iter->second) != nullptr) {
553 AceInnerWrapWantParamsWantParams(env, jsObject, iter->first, wantParams);
554 }
555 }
556 return jsObject;
557 }
558
AceInnerSetWantParamsArrayString(const std::string & key,const std::vector<std::string> & value,AAFwk::WantParams & wantParams)559 bool AceInnerSetWantParamsArrayString(
560 const std::string& key, const std::vector<std::string>& value, AAFwk::WantParams& wantParams)
561 {
562 size_t size = value.size();
563 sptr<AAFwk::IArray> ao = new (std::nothrow) AAFwk::Array(size, AAFwk::g_IID_IString);
564 if (ao != nullptr) {
565 for (size_t i = 0; i < size; i++) {
566 ao->Set(i, AAFwk::String::Box(value[i]));
567 }
568 wantParams.SetParam(key, ao);
569 return true;
570 } else {
571 return false;
572 }
573 }
574
AceInnerSetWantParamsArrayInt(const std::string & key,const std::vector<int> & value,AAFwk::WantParams & wantParams)575 bool AceInnerSetWantParamsArrayInt(const std::string& key, const std::vector<int>& value, AAFwk::WantParams& wantParams)
576 {
577 size_t size = value.size();
578 sptr<AAFwk::IArray> ao = new (std::nothrow) AAFwk::Array(size, AAFwk::g_IID_IInteger);
579 if (ao != nullptr) {
580 for (size_t i = 0; i < size; i++) {
581 ao->Set(i, AAFwk::Integer::Box(value[i]));
582 }
583 wantParams.SetParam(key, ao);
584 return true;
585 } else {
586 return false;
587 }
588 }
589
AceInnerSetWantParamsArrayLong(const std::string & key,const std::vector<int64_t> & value,AAFwk::WantParams & wantParams)590 bool AceInnerSetWantParamsArrayLong(
591 const std::string& key, const std::vector<int64_t>& value, AAFwk::WantParams& wantParams)
592 {
593 size_t size = value.size();
594 sptr<AAFwk::IArray> ao = new (std::nothrow) AAFwk::Array(size, AAFwk::g_IID_ILong);
595 if (ao != nullptr) {
596 for (size_t i = 0; i < size; i++) {
597 ao->Set(i, AAFwk::Long::Box(value[i]));
598 }
599 wantParams.SetParam(key, ao);
600 return true;
601 } else {
602 return false;
603 }
604 }
605
AceInnerSetWantParamsArrayBool(const std::string & key,const std::vector<bool> & value,AAFwk::WantParams & wantParams)606 bool AceInnerSetWantParamsArrayBool(
607 const std::string& key, const std::vector<bool>& value, AAFwk::WantParams& wantParams)
608 {
609 size_t size = value.size();
610 sptr<AAFwk::IArray> ao = new (std::nothrow) AAFwk::Array(size, AAFwk::g_IID_IBoolean);
611 if (ao != nullptr) {
612 for (size_t i = 0; i < size; i++) {
613 ao->Set(i, AAFwk::Boolean::Box(value[i]));
614 }
615 wantParams.SetParam(key, ao);
616 return true;
617 } else {
618 return false;
619 }
620 }
621
AceInnerSetWantParamsArrayDouble(const std::string & key,const std::vector<double> & value,AAFwk::WantParams & wantParams)622 bool AceInnerSetWantParamsArrayDouble(
623 const std::string& key, const std::vector<double>& value, AAFwk::WantParams& wantParams)
624 {
625 size_t size = value.size();
626 sptr<AAFwk::IArray> ao = new (std::nothrow) AAFwk::Array(size, AAFwk::g_IID_IDouble);
627 if (ao != nullptr) {
628 for (size_t i = 0; i < size; i++) {
629 ao->Set(i, AAFwk::Double::Box(value[i]));
630 }
631 wantParams.SetParam(key, ao);
632 return true;
633 } else {
634 return false;
635 }
636 }
637
AceInnerUnwrapWantParamsArray(napi_env env,const std::string & key,napi_value param,AAFwk::WantParams & wantParams)638 bool AceInnerUnwrapWantParamsArray(
639 napi_env env, const std::string& key, napi_value param, AAFwk::WantParams& wantParams)
640 {
641 ACEComplexArrayData natArrayValue;
642 if (!AceUnwrapArrayComplexFromJS(env, param, natArrayValue)) {
643 return false;
644 }
645
646 if (natArrayValue.stringList.size() > 0) {
647 return AceInnerSetWantParamsArrayString(key, natArrayValue.stringList, wantParams);
648 }
649 if (natArrayValue.intList.size() > 0) {
650 return AceInnerSetWantParamsArrayInt(key, natArrayValue.intList, wantParams);
651 }
652 if (natArrayValue.longList.size() > 0) {
653 return AceInnerSetWantParamsArrayLong(key, natArrayValue.longList, wantParams);
654 }
655 if (natArrayValue.boolList.size() > 0) {
656 return AceInnerSetWantParamsArrayBool(key, natArrayValue.boolList, wantParams);
657 }
658 if (natArrayValue.doubleList.size() > 0) {
659 return AceInnerSetWantParamsArrayDouble(key, natArrayValue.doubleList, wantParams);
660 }
661
662 return false;
663 }
664
AceInnerUnwrapWantParams(napi_env env,const std::string & key,napi_value param,AAFwk::WantParams & wantParams)665 bool AceInnerUnwrapWantParams(napi_env env, const std::string& key, napi_value param, AAFwk::WantParams& wantParams)
666 {
667 AAFwk::WantParams wp;
668
669 if (AceUnwrapWantParams(env, param, wp)) {
670 sptr<AAFwk::IWantParams> pWantParams = AAFwk::WantParamWrapper::Box(wp);
671 if (pWantParams != nullptr) {
672 wantParams.SetParam(key, pWantParams);
673 return true;
674 }
675 }
676 return false;
677 }
678
AceUnwrapParamsNumber(napi_env env,napi_value jsProValue,const std::string & key,AAFwk::WantParams & wantParams)679 void AceUnwrapParamsNumber(napi_env env, napi_value jsProValue, const std::string& key, AAFwk::WantParams& wantParams)
680 {
681 int32_t natValue32 = 0;
682 double natValueDouble = 0.0;
683 bool isReadValue32 = false;
684 bool isReadDouble = false;
685 if (napi_get_value_int32(env, jsProValue, &natValue32) == napi_ok) {
686 isReadValue32 = true;
687 }
688
689 if (napi_get_value_double(env, jsProValue, &natValueDouble) == napi_ok) {
690 isReadDouble = true;
691 }
692
693 if (isReadValue32 && isReadDouble) {
694 if (abs(natValueDouble - natValue32 * 1.0) > 0.0) {
695 wantParams.SetParam(key, AAFwk::Double::Box(natValueDouble));
696 } else {
697 wantParams.SetParam(key, AAFwk::Integer::Box(natValue32));
698 }
699 } else if (isReadValue32) {
700 wantParams.SetParam(key, AAFwk::Integer::Box(natValue32));
701 } else if (isReadDouble) {
702 wantParams.SetParam(key, AAFwk::Double::Box(natValueDouble));
703 }
704 }
705
AceUnwrapWantParams(napi_env env,napi_value param,AAFwk::WantParams & wantParams)706 bool AceUnwrapWantParams(napi_env env, napi_value param, AAFwk::WantParams& wantParams)
707 {
708 if (!AceIsTypeForNapiValue(env, param, napi_object)) {
709 return false;
710 }
711
712 napi_valuetype jsValueType = napi_undefined;
713 napi_value jsProNameList = nullptr;
714 uint32_t jsProCount = 0;
715
716 NAPI_CALL_BASE(env, napi_get_property_names(env, param, &jsProNameList), false);
717 NAPI_CALL_BASE(env, napi_get_array_length(env, jsProNameList, &jsProCount), false);
718
719 napi_value jsProName = nullptr;
720 napi_value jsProValue = nullptr;
721 for (uint32_t index = 0; index < jsProCount; index++) {
722 NAPI_CALL_BASE(env, napi_get_element(env, jsProNameList, index, &jsProName), false);
723
724 std::string strProName = AceUnwrapStringFromJS(env, jsProName);
725 NAPI_CALL_BASE(env, napi_get_named_property(env, param, strProName.c_str(), &jsProValue), false);
726 NAPI_CALL_BASE(env, napi_typeof(env, jsProValue, &jsValueType), false);
727
728 switch (jsValueType) {
729 case napi_string: {
730 std::string natValue = AceUnwrapStringFromJS(env, jsProValue);
731 wantParams.SetParam(strProName, AAFwk::String::Box(natValue));
732 break;
733 }
734 case napi_boolean: {
735 bool natValue = false;
736 NAPI_CALL_BASE(env, napi_get_value_bool(env, jsProValue, &natValue), false);
737 wantParams.SetParam(strProName, AAFwk::Boolean::Box(natValue));
738 break;
739 }
740 case napi_number:
741 AceUnwrapParamsNumber(env, jsProValue, strProName, wantParams);
742 break;
743 case napi_object: {
744 bool isArray = false;
745 if (napi_is_array(env, jsProValue, &isArray) == napi_ok) {
746 isArray ? AceInnerUnwrapWantParamsArray(env, strProName, jsProValue, wantParams)
747 : AceInnerUnwrapWantParams(env, strProName, jsProValue, wantParams);
748 }
749 break;
750 }
751 default:
752 break;
753 }
754 }
755 return true;
756 }
757
AceInnerWrapWantOptions(napi_env env,const Want & want)758 napi_value AceInnerWrapWantOptions(napi_env env, const Want& want)
759 {
760 napi_value jsObject = nullptr;
761 std::map<std::string, unsigned int> flagMap;
762 AceInnerInitWantOptionsData(flagMap);
763 unsigned int flags = want.GetFlags();
764 bool natValue = false;
765 napi_value jsValue = nullptr;
766
767 NAPI_CALL(env, napi_create_object(env, &jsObject));
768 for (auto iter = flagMap.begin(); iter != flagMap.end(); iter++) {
769 jsValue = nullptr;
770 natValue = ((flags & iter->second) == iter->second);
771 if (napi_get_boolean(env, natValue, &jsValue) == napi_ok) {
772 AceSetPropertyValueByPropertyName(env, jsObject, iter->first.c_str(), jsValue);
773 }
774 }
775
776 return jsObject;
777 }
778
AceInnerUnwrapWantOptions(napi_env env,napi_value param,const char * propertyName,Want & want)779 bool AceInnerUnwrapWantOptions(napi_env env, napi_value param, const char* propertyName, Want& want)
780 {
781 napi_value jsValue = AceGetPropertyValueByPropertyName(env, param, propertyName, napi_object);
782 if (jsValue == nullptr) {
783 return false;
784 }
785
786 bool natValue = false;
787 unsigned int flags = 0;
788 std::map<std::string, unsigned int> flagMap;
789 AceInnerInitWantOptionsData(flagMap);
790 for (auto iter = flagMap.begin(); iter != flagMap.end(); iter++) {
791 natValue = false;
792 if (AceUnwrapBooleanByPropertyName(env, jsValue, iter->first.c_str(), natValue)) {
793 if (natValue) {
794 flags |= iter->second;
795 }
796 }
797 }
798
799 want.SetFlags(flags);
800 return true;
801 }
802
AceWrapWant(napi_env env,const Want & want)803 napi_value AceWrapWant(napi_env env, const Want& want)
804 {
805 napi_value jsObject = nullptr;
806 napi_value jsValue = nullptr;
807
808 NAPI_CALL(env, napi_create_object(env, &jsObject));
809
810 napi_value jsElementName = AceWrapElementName(env, want.GetElement());
811 if (jsElementName == nullptr) {
812 return nullptr;
813 }
814
815 jsValue = AceGetPropertyValueByPropertyName(env, jsElementName, "deviceId", napi_string);
816 AceSetPropertyValueByPropertyName(env, jsObject, "deviceId", jsValue);
817
818 jsValue = nullptr;
819 jsValue = AceGetPropertyValueByPropertyName(env, jsElementName, "bundleName", napi_string);
820 AceSetPropertyValueByPropertyName(env, jsObject, "bundleName", jsValue);
821
822 jsValue = nullptr;
823 jsValue = AceGetPropertyValueByPropertyName(env, jsElementName, "abilityName", napi_string);
824 AceSetPropertyValueByPropertyName(env, jsObject, "abilityName", jsValue);
825
826 jsValue = nullptr;
827 jsValue = AceWrapStringToJS(env, want.GetUriString());
828 AceSetPropertyValueByPropertyName(env, jsObject, "uri", jsValue);
829
830 jsValue = nullptr;
831 jsValue = AceWrapStringToJS(env, want.GetType());
832 AceSetPropertyValueByPropertyName(env, jsObject, "type", jsValue);
833
834 jsValue = nullptr;
835 jsValue = AceWrapInt32ToJS(env, want.GetFlags());
836 AceSetPropertyValueByPropertyName(env, jsObject, "flags", jsValue);
837
838 jsValue = nullptr;
839 jsValue = AceWrapStringToJS(env, want.GetAction());
840 AceSetPropertyValueByPropertyName(env, jsObject, "action", jsValue);
841
842 jsValue = nullptr;
843 jsValue = AceWrapWantParams(env, want.GetParams());
844 AceSetPropertyValueByPropertyName(env, jsObject, "parameters", jsValue);
845
846 jsValue = nullptr;
847 jsValue = AceWrapArrayStringToJS(env, want.GetEntities());
848 AceSetPropertyValueByPropertyName(env, jsObject, "entities", jsValue);
849
850 return jsObject;
851 }
852
AceUnwrapWant(napi_env env,napi_value param,Want & want)853 bool AceUnwrapWant(napi_env env, napi_value param, Want& want)
854 {
855 if (!AceIsTypeForNapiValue(env, param, napi_object)) {
856 return false;
857 }
858
859 napi_value jsValue = AceGetPropertyValueByPropertyName(env, param, "parameters", napi_object);
860 if (jsValue != nullptr) {
861 AAFwk::WantParams wantParams;
862 if (AceUnwrapWantParams(env, jsValue, wantParams)) {
863 want.SetParams(wantParams);
864 }
865 }
866
867 std::string natValueString("");
868 if (AceUnwrapStringByPropertyName(env, param, "action", natValueString)) {
869 want.SetAction(natValueString);
870 }
871
872 std::vector<std::string> natValueStringList;
873 if (AceUnwrapStringArrayByPropertyName(env, param, "entities", natValueStringList)) {
874 for (size_t i = 0; i < natValueStringList.size(); i++) {
875 want.AddEntity(natValueStringList[i]);
876 }
877 }
878
879 natValueString = "";
880 if (AceUnwrapStringByPropertyName(env, param, "uri", natValueString)) {
881 want.SetUri(natValueString);
882 }
883
884 int32_t flags = 0;
885 if (AceUnwrapInt32ByPropertyName(env, param, "flags", flags)) {
886 want.SetFlags(flags);
887 }
888
889 ElementName natElementName;
890 AceUnwrapElementName(env, param, natElementName);
891 want.SetElementName(natElementName.GetDeviceID(), natElementName.GetBundleName(), natElementName.GetAbilityName());
892
893 natValueString = "";
894 if (AceUnwrapStringByPropertyName(env, param, "type", natValueString)) {
895 want.SetType(natValueString);
896 }
897
898 return true;
899 }
900 } // namespace OHOS::Ace::Napi
901