• 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 #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