1 /*
2 * Copyright (c) 2025 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 #include <taihe/runtime.hpp>
16
17 #include <iostream>
18
19 namespace taihe {
20 ani_vm *global_vm = nullptr;
21
set_vm(ani_vm * vm)22 void set_vm(ani_vm *vm)
23 {
24 global_vm = vm;
25 }
26
get_vm()27 ani_vm *get_vm()
28 {
29 return global_vm;
30 }
31
create_ani_error(ani_env * env,taihe::string_view msg)32 static ani_error create_ani_error(ani_env *env, taihe::string_view msg)
33 {
34 ani_class errCls;
35 char const *className = "Lescompat/Error;";
36 if (ANI_OK != env->FindClass(className, &errCls)) {
37 std::cerr << "Not found '" << className << std::endl;
38 return nullptr;
39 }
40
41 ani_method errCtor;
42 if (ANI_OK != env->Class_FindMethod(errCls, "<ctor>", "Lstd/core/String;Lescompat/ErrorOptions;:V", &errCtor)) {
43 std::cerr << "get errCtor Failed'" << className << "'" << std::endl;
44 return nullptr;
45 }
46
47 ani_string result_string {};
48 env->String_NewUTF8(msg.c_str(), msg.size(), &result_string);
49
50 ani_ref undefined;
51 env->GetUndefined(&undefined);
52
53 ani_error errObj;
54 if (ANI_OK != env->Object_New(errCls, errCtor, reinterpret_cast<ani_object *>(&errObj), result_string, undefined)) {
55 std::cerr << "Create Object Failed'" << className << "'" << std::endl;
56 return nullptr;
57 }
58 return errObj;
59 }
60
create_ani_business_error(ani_env * env,int32_t err_code,taihe::string_view msg)61 static ani_error create_ani_business_error(ani_env *env, int32_t err_code, taihe::string_view msg)
62 {
63 ani_error errObj = create_ani_error(env, msg);
64
65 ani_class errCls;
66 char const *className = "L@ohos/base/BusinessError;";
67 if (ANI_OK != env->FindClass(className, &errCls)) {
68 std::cerr << "Not found '" << className << std::endl;
69 return nullptr;
70 }
71
72 ani_method errCtor;
73 if (ANI_OK != env->Class_FindMethod(errCls, "<ctor>", "DLescompat/Error;:V", &errCtor)) {
74 std::cerr << "get errCtor Failed'" << className << "'" << std::endl;
75 return nullptr;
76 }
77
78 ani_error businessErrObj;
79 if (ANI_OK != env->Object_New(errCls, errCtor, reinterpret_cast<ani_object *>(&businessErrObj),
80 static_cast<ani_double>(err_code), errObj)) {
81 std::cerr << "Create Object Failed'" << className << "'" << std::endl;
82 return nullptr;
83 }
84 return businessErrObj;
85 }
86
ani_set_error(ani_env * env,taihe::string_view msg)87 void ani_set_error(ani_env *env, taihe::string_view msg)
88 {
89 ani_error errObj = create_ani_error(env, msg);
90 env->ThrowError(errObj);
91 }
92
ani_set_business_error(ani_env * env,int32_t err_code,taihe::string_view msg)93 void ani_set_business_error(ani_env *env, int32_t err_code, taihe::string_view msg)
94 {
95 ani_error businessErrObj = create_ani_business_error(env, err_code, msg);
96 env->ThrowError(businessErrObj);
97 }
98
ani_reset_error(ani_env * env)99 void ani_reset_error(ani_env *env)
100 {
101 env->ResetError();
102 }
103
ani_has_error(ani_env * env)104 bool ani_has_error(ani_env *env)
105 {
106 ani_boolean res;
107 env->ExistUnhandledError(&res);
108 return res;
109 }
110
set_error(taihe::string_view msg)111 void set_error(taihe::string_view msg)
112 {
113 ani_env *env = get_env();
114 ani_set_error(env, msg);
115 }
116
set_business_error(int32_t err_code,taihe::string_view msg)117 void set_business_error(int32_t err_code, taihe::string_view msg)
118 {
119 ani_env *env = get_env();
120 ani_set_business_error(env, err_code, msg);
121 }
122
reset_error()123 void reset_error()
124 {
125 ani_env *env = get_env();
126 ani_reset_error(env);
127 }
128
has_error()129 bool has_error()
130 {
131 ani_env *env = get_env();
132 return ani_has_error(env);
133 }
134 } // namespace taihe