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