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