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