• 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 
16 #include "ets_error_utils.h"
17 
18 #include "hilog_tag_wrapper.h"
19 
20 namespace OHOS {
21 namespace AbilityRuntime {
22 namespace {
23 constexpr const char *ERR_MSG_TOO_FEW_PARAM = "Parameter error. Too few parameters.";
24 constexpr const char *ERR_MSG_NOT_MAINTHREAD = "Caller error. Caller from non-main thread.";
25 constexpr const char *ERR_MSG_INVALID_NUM_PARAMS = "Parameter error. The number of parameters is invalid.";
26 constexpr const char *NOT_SYSTEM_APP = "The application is not system-app, can not use system-api.";
27 constexpr const char *BUSINESS_ERROR_CLASS = "L@ohos/base/BusinessError;";
28 constexpr const char *ERROR_CLASS_NAME = "Lescompat/Error;";
29 constexpr const char* ERROR_MSG_TRANSFER_CLASS_NOT_FOUND = "Unable to find the class for transferring.";
30 constexpr int32_t ERROR_CODE_TRANSFER_CLASS_NOT_FOUND = 10200067;
31 } // namespace
32 
ThrowError(ani_env * env,ani_object err)33 void EtsErrorUtil::ThrowError(ani_env *env, ani_object err)
34 {
35     if (env == nullptr) {
36         TAG_LOGE(AAFwkTag::ANI, "null env");
37         return;
38     }
39     env->ThrowError(static_cast<ani_error>(err));
40 }
41 
ThrowError(ani_env * env,int32_t errCode,const std::string & errorMsg)42 void EtsErrorUtil::ThrowError(ani_env *env, int32_t errCode, const std::string &errorMsg)
43 {
44     if (env == nullptr) {
45         TAG_LOGE(AAFwkTag::ANI, "null env");
46         return;
47     }
48     EtsErrorUtil::ThrowError(env, EtsErrorUtil::CreateError(env, errCode, errorMsg));
49 }
50 
ThrowError(ani_env * env,const AbilityErrorCode & err)51 void EtsErrorUtil::ThrowError(ani_env *env, const AbilityErrorCode &err)
52 {
53     if (env == nullptr) {
54         TAG_LOGE(AAFwkTag::ANI, "null env");
55         return;
56     }
57     EtsErrorUtil::ThrowError(env, EtsErrorUtil::CreateError(env, static_cast<int32_t>(err), GetErrorMsg(err)));
58 }
59 
ThrowInvalidCallerError(ani_env * env)60 void EtsErrorUtil::ThrowInvalidCallerError(ani_env *env)
61 {
62     if (env == nullptr) {
63         TAG_LOGE(AAFwkTag::ANI, "null env");
64         return;
65     }
66     EtsErrorUtil::ThrowError(env, EtsErrorUtil::CreateError(
67         env, static_cast<int32_t>(AbilityErrorCode::ERROR_CODE_INVALID_CALLER), ERR_MSG_NOT_MAINTHREAD));
68 }
69 
ThrowTooFewParametersError(ani_env * env)70 void EtsErrorUtil::ThrowTooFewParametersError(ani_env *env)
71 {
72     if (env == nullptr) {
73         TAG_LOGE(AAFwkTag::ANI, "null env");
74         return;
75     }
76     EtsErrorUtil::ThrowError(env, EtsErrorUtil::CreateError(
77         env, static_cast<int32_t>(AbilityErrorCode::ERROR_CODE_INVALID_PARAM), ERR_MSG_TOO_FEW_PARAM));
78 }
79 
ThrowInvalidNumParametersError(ani_env * env)80 void EtsErrorUtil::ThrowInvalidNumParametersError(ani_env *env)
81 {
82     if (env == nullptr) {
83         TAG_LOGE(AAFwkTag::ANI, "null env");
84         return;
85     }
86     EtsErrorUtil::ThrowError(env, EtsErrorUtil::CreateError(
87         env, static_cast<int32_t>(AbilityErrorCode::ERROR_CODE_INVALID_PARAM), ERR_MSG_INVALID_NUM_PARAMS));
88 }
89 
ThrowNoPermissionError(ani_env * env,const std::string & permission)90 void EtsErrorUtil::ThrowNoPermissionError(ani_env *env, const std::string &permission)
91 {
92     if (env == nullptr) {
93         TAG_LOGE(AAFwkTag::ANI, "null env");
94         return;
95     }
96     EtsErrorUtil::ThrowError(
97         env, EtsErrorUtil::CreateError(env, static_cast<int32_t>(AbilityErrorCode::ERROR_CODE_PERMISSION_DENIED),
98         GetNoPermissionErrorMsg(permission)));
99 }
100 
ThrowNotSystemAppError(ani_env * env)101 void EtsErrorUtil::ThrowNotSystemAppError(ani_env *env)
102 {
103     if (env == nullptr) {
104         TAG_LOGE(AAFwkTag::ANI, "null env");
105         return;
106     }
107     EtsErrorUtil::ThrowError(env, EtsErrorUtil::CreateError(
108         env, static_cast<int32_t>(AbilityErrorCode::ERROR_CODE_NOT_SYSTEM_APP), NOT_SYSTEM_APP));
109 }
110 
ThrowEtsTransferClassError(ani_env * env)111 void EtsErrorUtil::ThrowEtsTransferClassError(ani_env *env)
112 {
113     EtsErrorUtil::ThrowError(env, EtsErrorUtil::CreateError(
114         env, static_cast<int32_t>(ERROR_CODE_TRANSFER_CLASS_NOT_FOUND), ERROR_MSG_TRANSFER_CLASS_NOT_FOUND));
115 }
116 
ThrowInvalidParamError(ani_env * env,const std::string & message)117 void EtsErrorUtil::ThrowInvalidParamError(ani_env *env, const std::string &message)
118 {
119     if (env == nullptr) {
120         TAG_LOGE(AAFwkTag::ANI, "null env");
121         return;
122     }
123     EtsErrorUtil::ThrowError(env, EtsErrorUtil::CreateInvalidParamError(env, message));
124 }
125 
ThrowErrorByNativeErr(ani_env * env,int32_t err)126 void EtsErrorUtil::ThrowErrorByNativeErr(ani_env *env, int32_t err)
127 {
128     if (env == nullptr) {
129         TAG_LOGE(AAFwkTag::ANI, "null env");
130         return;
131     }
132     EtsErrorUtil::ThrowError(env, EtsErrorUtil::CreateErrorByNativeErr(env, err));
133 }
134 
CreateError(ani_env * env,const AbilityErrorCode & err)135 ani_object EtsErrorUtil::CreateError(ani_env *env, const AbilityErrorCode &err)
136 {
137     if (env == nullptr) {
138         TAG_LOGE(AAFwkTag::ANI, "null env");
139         return nullptr;
140     }
141     return EtsErrorUtil::CreateError(env, static_cast<int32_t>(err), GetErrorMsg(err));
142 }
143 
CreateInvalidParamError(ani_env * env,const std::string & message)144 ani_object EtsErrorUtil::CreateInvalidParamError(ani_env *env, const std::string &message)
145 {
146     if (env == nullptr) {
147         TAG_LOGE(AAFwkTag::ANI, "null env");
148         return nullptr;
149     }
150     return EtsErrorUtil::CreateError(env, static_cast<int32_t>(AbilityErrorCode::ERROR_CODE_INVALID_PARAM), message);
151 }
152 
CreateNoPermissionError(ani_env * env,const std::string & permission)153 ani_object EtsErrorUtil::CreateNoPermissionError(ani_env *env, const std::string &permission)
154 {
155     if (env == nullptr) {
156         TAG_LOGE(AAFwkTag::ANI, "null env");
157         return nullptr;
158     }
159     return EtsErrorUtil::CreateError(
160         env, static_cast<int32_t>(AbilityErrorCode::ERROR_CODE_PERMISSION_DENIED), GetNoPermissionErrorMsg(permission));
161 }
162 
CreateErrorByNativeErr(ani_env * env,int32_t err,const std::string & permission)163 ani_object EtsErrorUtil::CreateErrorByNativeErr(ani_env *env, int32_t err, const std::string &permission)
164 {
165     if (env == nullptr) {
166         TAG_LOGE(AAFwkTag::ANI, "null env");
167         return nullptr;
168     }
169     auto errCode = GetJsErrorCodeByNativeError(err);
170     auto errMsg = (errCode == AbilityErrorCode::ERROR_CODE_PERMISSION_DENIED && !permission.empty())
171                       ? GetNoPermissionErrorMsg(permission)
172                       : GetErrorMsg(errCode);
173     return EtsErrorUtil::CreateError(env, static_cast<int32_t>(errCode), errMsg);
174 }
175 
WrapError(ani_env * env,const std::string & msg)176 ani_object EtsErrorUtil::WrapError(ani_env *env, const std::string &msg)
177 {
178     if (env == nullptr) {
179         TAG_LOGE(AAFwkTag::ANI, "null env");
180         return nullptr;
181     }
182     ani_status status = ANI_ERROR;
183     ani_string aniMsg = nullptr;
184     if ((status = env->String_NewUTF8(msg.c_str(), msg.size(), &aniMsg)) != ANI_OK) {
185         TAG_LOGE(AAFwkTag::ANI, "String_NewUTF8 failed %{public}d", status);
186         return nullptr;
187     }
188     ani_ref undefRef;
189     if ((status = env->GetUndefined(&undefRef)) != ANI_OK) {
190         TAG_LOGE(AAFwkTag::ANI, "GetUndefined failed %{public}d", status);
191         return nullptr;
192     }
193     ani_class cls = nullptr;
194     if ((status = env->FindClass(ERROR_CLASS_NAME, &cls)) != ANI_OK) {
195         TAG_LOGE(AAFwkTag::ANI, "FindClass failed %{public}d", status);
196         return nullptr;
197     }
198     ani_method method = nullptr;
199     if ((status = env->Class_FindMethod(cls, "<ctor>", "Lstd/core/String;Lescompat/ErrorOptions;:V", &method)) !=
200         ANI_OK) {
201         TAG_LOGE(AAFwkTag::ANI, "Class_FindMethod failed %{public}d", status);
202         return nullptr;
203     }
204     ani_object obj = nullptr;
205     if ((status = env->Object_New(cls, method, &obj, aniMsg, undefRef)) != ANI_OK) {
206         TAG_LOGE(AAFwkTag::ANI, "Object_New failed %{public}d", status);
207         return nullptr;
208     }
209     return obj;
210 }
211 
CreateError(ani_env * env,ani_int code,const std::string & msg)212 ani_object EtsErrorUtil::CreateError(ani_env *env, ani_int code, const std::string &msg)
213 {
214     if (env == nullptr) {
215         TAG_LOGE(AAFwkTag::ANI, "null env");
216         return nullptr;
217     }
218     ani_status status = ANI_ERROR;
219     ani_class cls = nullptr;
220     if ((status = env->FindClass(BUSINESS_ERROR_CLASS, &cls)) != ANI_OK) {
221         TAG_LOGE(AAFwkTag::ANI, "FindClass failed %{public}d", status);
222         return nullptr;
223     }
224     ani_method method = nullptr;
225     if ((status = env->Class_FindMethod(cls, "<ctor>", "DLescompat/Error;:V", &method)) != ANI_OK) {
226         TAG_LOGE(AAFwkTag::ANI, "Class_FindMethod failed %{public}d", status);
227         return nullptr;
228     }
229     ani_object error = EtsErrorUtil::WrapError(env, msg);
230     if (error == nullptr) {
231         TAG_LOGE(AAFwkTag::ANI, "error nulll");
232         return nullptr;
233     }
234     ani_object obj = nullptr;
235     ani_double dCode(code);
236     if ((status = env->Object_New(cls, method, &obj, dCode, error)) != ANI_OK) {
237         TAG_LOGE(AAFwkTag::ANI, "Object_New failed %{public}d", status);
238         return nullptr;
239     }
240     return obj;
241 }
242 } // namespace AbilityRuntime
243 } // namespace OHOS