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