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