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 #ifndef FRAMEWORKS_BRIDGE_DECLARATIVE_FRONTEND_ENGINE_JSI_JSI_VALUE_CONVERSIONS_H
17 #define FRAMEWORKS_BRIDGE_DECLARATIVE_FRONTEND_ENGINE_JSI_JSI_VALUE_CONVERSIONS_H
18
19 #include "ecmascript/napi/include/jsnapi.h"
20
21 #include "base/log/log.h"
22 #include "frameworks/bridge/js_frontend/engine/jsi/ark_js_runtime.h"
23 #include "frameworks/bridge/declarative_frontend/engine/jsi/jsi_declarative_engine.h"
24
25 namespace OHOS::Ace::Framework {
26 namespace JsiValueConvertor {
27
28 template<typename T>
Validate(panda::Local<panda::JSValueRef> val)29 bool Validate(panda::Local<panda::JSValueRef> val)
30 {
31 if constexpr (std::is_integral<T>::value && std::is_signed<T>::value && !std::is_same<T, bool>::value) {
32 return val->IsInt();
33 } else if constexpr (std::is_unsigned_v<T>) {
34 return val->WithinInt32();
35 } else if constexpr (std::is_floating_point_v<T>) {
36 return val->IsNumber();
37 } else if constexpr (std::is_same_v<T, std::string>) {
38 return val->IsString();
39 } else {
40 LOGD("Unhandled type");
41 return false;
42 }
43 }
44
45 template<typename T>
fromJsiValue(const EcmaVM * vm,Local<panda::JSValueRef> val)46 T fromJsiValue(const EcmaVM* vm, Local<panda::JSValueRef> val)
47 {
48 static_assert(!std::is_const_v<T> && !std::is_reference_v<T>, //
49 "Cannot convert values to reference or cv-qualified types!");
50
51 if constexpr (std::is_integral<T>::value && std::is_signed<T>::value && !std::is_same<T, bool>::value) {
52 return val->Int32Value(vm);
53 } else if constexpr (std::is_unsigned_v<T>) {
54 return val->Uint32Value(vm);
55 } else if constexpr (std::is_floating_point_v<T>) {
56 return val->ToNumber(vm)->Value();
57 } else if constexpr (std::is_same_v<T, std::string>) {
58 return val->ToString(vm)->ToString();
59 } else {
60 LOGW("Conversion failure for javascript type.");
61 }
62
63 return T();
64 }
65
66 template<typename T>
toJsiValueWithVM(const EcmaVM * vm,T val)67 panda::Local<panda::JSValueRef> toJsiValueWithVM(const EcmaVM* vm, T val)
68 {
69 if constexpr (std::is_same_v<T, bool>) {
70 return panda::BooleanRef::New(vm, val);
71 } else if constexpr (std::is_same_v<T, int64_t>) {
72 return panda::NumberRef::New(vm, val);
73 } else if constexpr (std::is_integral<T>::value && std::is_signed<T>::value) {
74 return panda::IntegerRef::New(vm, val);
75 } else if constexpr (std::is_unsigned_v<T>) {
76 return panda::IntegerRef::NewFromUnsigned(vm, val);
77 } else if constexpr (std::is_floating_point_v<T>) {
78 return panda::NumberRef::New(vm, val);
79 } else if constexpr (std::is_same_v<T, std::string>) {
80 return panda::StringRef::NewFromUtf8(vm, val.c_str());
81 } else if constexpr (std::is_same_v<T, const char*>) {
82 return panda::StringRef::NewFromUtf8(vm, val);
83 }
84
85 return panda::JSValueRef::Undefined(vm);
86 }
87
88 template<typename T>
toJsiValue(T val)89 panda::Local<panda::JSValueRef> toJsiValue(T val)
90 {
91 auto runtime = std::static_pointer_cast<ArkJSRuntime>(JsiDeclarativeEngineInstance::GetCurrentRuntime());
92 auto vm = runtime->GetEcmaVm();
93 return toJsiValueWithVM(vm, val);
94 }
95
96 } // namespace JsiValueConvertor
97 } // namespace OHOS::Ace::Framework
98
99 #endif // FRAMEWORKS_BRIDGE_DECLARATIVE_FRONTEND_ENGINE_JSI_JSI_VALUE_CONVERSIONS_H
100