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