• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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