1 /*
2 * Copyright (c) 2021-2023 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 "form_errors.h"
17 #include "appexecfwk_errors.h"
18 #include "form_mgr_errors.h"
19
20 namespace OHOS {
21 namespace AppExecFwk {
22 namespace {
23 const std::map<int32_t, int32_t> ERROR_CODE_MAP_EXTERNAL = {
24 { ERR_OK, ERR_OK },
25 { ERR_APPEXECFWK_FORM_COMMON_CODE, ERR_FORM_EXTERNAL_FUNCTIONAL_ERROR },
26 { ERR_APPEXECFWK_FORM_PERMISSION_DENY, ERR_FORM_EXTERNAL_PERMISSION_DENIED },
27 { ERR_APPEXECFWK_FORM_PERMISSION_DENY_BUNDLE, ERR_FORM_EXTERNAL_PERMISSION_DENIED },
28 { ERR_APPEXECFWK_FORM_PERMISSION_DENY_SYS, ERR_FORM_EXTERNAL_NOT_SYSTEM_APP },
29 { ERR_APPEXECFWK_FORM_GET_INFO_FAILED, ERR_FORM_EXTERNAL_GET_INFO_FAILED },
30 { ERR_APPEXECFWK_FORM_GET_BUNDLE_FAILED, ERR_FORM_EXTERNAL_GET_INFO_FAILED },
31 { ERR_APPEXECFWK_FORM_INVALID_PARAM, ERR_FORM_EXTERNAL_PARAM_INVALID },
32 { ERR_APPEXECFWK_FORM_INVALID_FORM_ID, ERR_FORM_EXTERNAL_PARAM_INVALID },
33 { ERR_APPEXECFWK_FORM_FORM_ID_NUM_ERR, ERR_FORM_EXTERNAL_PARAM_INVALID },
34 { ERR_APPEXECFWK_FORM_FORM_ARRAY_ERR, ERR_FORM_EXTERNAL_PARAM_INVALID },
35 { ERR_APPEXECFWK_FORM_RELEASE_FLG_ERR, ERR_FORM_EXTERNAL_FUNCTIONAL_ERROR },
36 { ERR_APPEXECFWK_FORM_REFRESH_TIME_NUM_ERR, ERR_FORM_EXTERNAL_FUNCTIONAL_ERROR },
37 { ERR_APPEXECFWK_FORM_INVALID_BUNDLENAME, ERR_FORM_EXTERNAL_PARAM_INVALID },
38 { ERR_APPEXECFWK_FORM_INVALID_MODULENAME, ERR_FORM_EXTERNAL_PARAM_INVALID },
39 { ERR_APPEXECFWK_FORM_INVALID_PROVIDER_DATA, ERR_FORM_EXTERNAL_PARAM_INVALID },
40 { ERR_APPEXECFWK_FORM_INVALID_REFRESH_TIME, ERR_FORM_EXTERNAL_PARAM_INVALID },
41 { ERR_APPEXECFWK_FORM_FORM_ID_ARRAY_ERR, ERR_FORM_EXTERNAL_PARAM_INVALID },
42 { ERR_APPEXECFWK_FORM_SERVER_STATUS_ERR, ERR_FORM_EXTERNAL_SERVICE_CONNECTION_ERROR },
43 { ERR_APPEXECFWK_FORM_CFG_NOT_MATCH_ID, ERR_FORM_EXTERNAL_FORM_ID_NOT_EXIST },
44 { ERR_APPEXECFWK_FORM_NOT_EXIST_ID, ERR_FORM_EXTERNAL_FORM_ID_NOT_EXIST },
45 { ERR_APPEXECFWK_FORM_PROVIDER_DATA_EMPTY, ERR_FORM_EXTERNAL_PARAM_INVALID },
46 { ERR_APPEXECFWK_FORM_BIND_PROVIDER_FAILED, ERR_FORM_EXTERNAL_FUNCTIONAL_ERROR },
47 { ERR_APPEXECFWK_FORM_MAX_SYSTEM_FORMS, ERR_FORM_EXTERNAL_FORM_NUM_EXCEEDS_UPPER_BOUND },
48 { ERR_APPEXECFWK_FORM_EXCEED_INSTANCES_PER_FORM, ERR_FORM_EXTERNAL_FORM_NUM_EXCEEDS_UPPER_BOUND },
49 { ERR_APPEXECFWK_FORM_OPERATION_NOT_SELF, ERR_FORM_EXTERNAL_OPERATION_FORM_NOT_SELF },
50 { ERR_APPEXECFWK_FORM_PROVIDER_DEL_FAIL, ERR_FORM_EXTERNAL_FUNCTIONAL_ERROR },
51 { ERR_APPEXECFWK_FORM_MAX_FORMS_PER_CLIENT, ERR_FORM_EXTERNAL_FORM_NUM_EXCEEDS_UPPER_BOUND },
52 { ERR_APPEXECFWK_FORM_MAX_SYSTEM_TEMP_FORMS, ERR_FORM_EXTERNAL_FORM_NUM_EXCEEDS_UPPER_BOUND },
53 { ERR_APPEXECFWK_FORM_NO_SUCH_MODULE, ERR_FORM_EXTERNAL_PARAM_INVALID },
54 { ERR_APPEXECFWK_FORM_NO_SUCH_ABILITY, ERR_FORM_EXTERNAL_PARAM_INVALID },
55 { ERR_APPEXECFWK_FORM_NO_SUCH_DIMENSION, ERR_FORM_EXTERNAL_PARAM_INVALID },
56 { ERR_APPEXECFWK_FORM_FA_NOT_INSTALLED, ERR_FORM_EXTERNAL_ABILITY_NOT_INSTALLED },
57 { ERR_APPEXECFWK_FORM_MAX_REQUEST, ERR_FORM_EXTERNAL_FORM_NUM_EXCEEDS_UPPER_BOUND },
58 { ERR_APPEXECFWK_FORM_MAX_REFRESH, ERR_FORM_EXTERNAL_FORM_NUM_EXCEEDS_UPPER_BOUND },
59 { ERR_APPEXECFWK_FORM_GET_BMS_FAILED, ERR_FORM_EXTERNAL_FUNCTIONAL_ERROR },
60 { ERR_APPEXECFWK_FORM_GET_HOST_FAILED, ERR_FORM_EXTERNAL_FUNCTIONAL_ERROR },
61 { ERR_APPEXECFWK_FORM_GET_FMS_FAILED, ERR_FORM_EXTERNAL_FUNCTIONAL_ERROR },
62 { ERR_APPEXECFWK_FORM_SEND_FMS_MSG, ERR_FORM_EXTERNAL_FUNCTIONAL_ERROR },
63 { ERR_APPEXECFWK_FORM_FORM_DUPLICATE_ADDED, ERR_FORM_EXTERNAL_FUNCTIONAL_ERROR },
64 { ERR_APPEXECFWK_FORM_IN_RECOVER, ERR_FORM_EXTERNAL_SERVICE_CONNECTION_ERROR },
65 { ERR_APPEXECFWK_FORM_DISTRIBUTED_SCHEDULE_FAILED, ERR_FORM_EXTERNAL_FUNCTIONAL_ERROR },
66 { ERR_APPEXECFWK_FORM_GET_SYSMGR_FAILED, ERR_FORM_EXTERNAL_IPC_ERROR },
67 { ERR_APPEXECFWK_FORM_CONNECT_FORM_RENDER_FAILED, ERR_FORM_EXTERNAL_CONNECT_RENDER_FAILED },
68 { ERR_APPEXECFWK_FORM_RENDER_SERVICE_DIED, ERR_FORM_EXTERNAL_RENDER_DIED },
69 { ERR_APPEXECFWK_FORM_NOT_TRUST, ERR_FORM_EXTERNAL_FORM_NOT_TRUST },
70 };
71
72 const std::map<int32_t, std::string> ERR_MSG_MAP_EXTERNAL = {
73 { ERR_OK, "success" },
74 { ERR_FORM_EXTERNAL_PERMISSION_DENIED, "Permissions denied." },
75 { ERR_FORM_EXTERNAL_PARAM_INVALID, "Parameter error." },
76 { ERR_FORM_EXTERNAL_SYSTEMCAP_ERROR, "The specified SystemCapability names was not found." },
77 { ERR_FORM_EXTERNAL_KERNEL_ERROR, "A generic kernel error occurred." },
78 { ERR_FORM_EXTERNAL_KERNEL_MALLOC_ERROR, "Failed to alloc." },
79 { ERR_FORM_EXTERNAL_IPC_ERROR, "An IPC connection error happened." },
80 { ERR_FORM_EXTERNAL_SERVICE_CONNECTION_ERROR, "A service connection error happened, please try again later." },
81 { ERR_FORM_EXTERNAL_GET_INFO_FAILED, "Failed to obtain the configuration information." },
82 { ERR_FORM_EXTERNAL_NOT_SYSTEM_APP, "The application is not a system application." },
83 { ERR_FORM_EXTERNAL_FUNCTIONAL_ERROR, "An internal functional error occurred." },
84 { ERR_FORM_EXTERNAL_FORM_NUM_EXCEEDS_UPPER_BOUND, "The number of forms exceeds upper bound." },
85 { ERR_FORM_EXTERNAL_FORM_ID_NOT_EXIST, "The ID of the form to be operated does not exist" },
86 { ERR_FORM_EXTERNAL_OPERATION_FORM_NOT_SELF, "The form can not be operated by the current application" },
87 { ERR_FORM_EXTERNAL_ABILITY_NOT_INSTALLED, "The ability is not installed" },
88 { ERR_FORM_EXTERNAL_CONNECT_RENDER_FAILED, "Connect FormRenderService failed, please try again later." },
89 { ERR_FORM_EXTERNAL_RENDER_DIED, "FormRenderService is dead, please reconnect." },
90 { ERR_FORM_EXTERNAL_FORM_NOT_TRUST, "Form is not trust." },
91 };
92
93 const std::map<int32_t, std::string> ERR_MSG_MAP_INTERNAL = {
94 { ERR_APPEXECFWK_FORM_INVALID_PARAM, "" },
95 { ERR_APPEXECFWK_FORM_INVALID_FORM_ID, "The formId is invalid." },
96 };
97 }
FormErrors()98 FormErrors::FormErrors()
99 {
100 InitErrorMessageMap();
101 }
~FormErrors()102 FormErrors::~FormErrors()
103 {
104 }
105
106 /**
107 * @brief Get the error message content.
108 *
109 * @param errCode Error code.
110 * @return Message content.
111 */
GetErrorMessage(int errCode)112 std::string FormErrors::GetErrorMessage(int errCode)
113 {
114 if (errorMessageMap_.find(errCode) != errorMessageMap_.end()) {
115 return errorMessageMap_[errCode];
116 } else {
117 return errorMessageMap_[ERR_APPEXECFWK_FORM_COMMON_CODE];
118 }
119 }
120
QueryExternalErrorCode(int32_t internalErrorCode)121 int32_t FormErrors::QueryExternalErrorCode(int32_t internalErrorCode)
122 {
123 auto iter = ERROR_CODE_MAP_EXTERNAL.find(internalErrorCode);
124 if (iter != ERROR_CODE_MAP_EXTERNAL.end()) {
125 return iter->second;
126 }
127 return ERR_FORM_EXTERNAL_FUNCTIONAL_ERROR;
128 }
129
QueryExternalErrorMessage(int32_t internalErrorCode,int32_t externalErrorCode)130 std::string FormErrors::QueryExternalErrorMessage(int32_t internalErrorCode, int32_t externalErrorCode)
131 {
132 std::string errorMessage = GetErrorMsgByExternalErrorCode(externalErrorCode);
133
134 auto iterInternal = ERR_MSG_MAP_INTERNAL.find(internalErrorCode);
135 if (iterInternal == ERR_MSG_MAP_INTERNAL.end() || iterInternal->second.empty()) {
136 return errorMessage;
137 }
138 errorMessage += " " + iterInternal->second;
139 return errorMessage;
140 }
141
GetErrorMsgByExternalErrorCode(int32_t externalErrorCode)142 std::string FormErrors::GetErrorMsgByExternalErrorCode(int32_t externalErrorCode)
143 {
144 auto iter = ERR_MSG_MAP_EXTERNAL.find(externalErrorCode);
145 std::string errorMessage;
146 if (iter != ERR_MSG_MAP_EXTERNAL.end()) {
147 errorMessage = iter->second;
148 } else {
149 errorMessage = ERR_MSG_MAP_EXTERNAL.at(ERR_FORM_EXTERNAL_FUNCTIONAL_ERROR);
150 }
151 return errorMessage;
152 }
153
154 /**
155 * @brief Init error message map object.
156 *
157 */
InitErrorMessageMap()158 void FormErrors::InitErrorMessageMap()
159 {
160 errorMessageMap_ = { // error + message
161 {
162 ERR_APPEXECFWK_FORM_COMMON_CODE, "some internal server error occurs.",
163 },
164 {
165 ERR_APPEXECFWK_FORM_PERMISSION_DENY,
166 "check permission deny, need to request ohos.permission.REQUIRE_FORM"
167 " or ohos.permission.INTERACT_ACROSS_LOCAL_ACCOUNTS.",
168 },
169 {
170 ERR_APPEXECFWK_FORM_PERMISSION_DENY_BUNDLE,
171 "check permission deny, need to request ohos.permission.GET_BUNDLE_INFO_PRIVILEGED.",
172 },
173 {
174 ERR_APPEXECFWK_FORM_PERMISSION_DENY_SYS,
175 "check permission deny, need system permission.",
176 },
177 {
178 ERR_APPEXECFWK_FORM_GET_INFO_FAILED, "can't get form info by the formName.",
179 },
180 {
181 ERR_APPEXECFWK_FORM_GET_BUNDLE_FAILED, "the requested bundle name does not exist.",
182 },
183 {
184 ERR_APPEXECFWK_FORM_INVALID_PARAM, "invalid params received on operating form.",
185 },
186 {
187 ERR_APPEXECFWK_FORM_INVALID_FORM_ID, "formId must be a string.",
188 },
189 {
190 ERR_APPEXECFWK_FORM_FORM_ID_NUM_ERR, "formId must be a numeric string.",
191 },
192 {
193 ERR_APPEXECFWK_FORM_FORM_ARRAY_ERR, "formIds must be a array.",
194 },
195 {
196 ERR_APPEXECFWK_FORM_RELEASE_FLG_ERR, "release cache flag must be a boolean.",
197 },
198 {
199 ERR_APPEXECFWK_FORM_REFRESH_TIME_NUM_ERR, "refresh time must be a number.",
200 },
201 {
202 ERR_APPEXECFWK_FORM_FORM_ID_ARRAY_ERR, "formId array is empty.",
203 },
204 {
205 ERR_APPEXECFWK_FORM_INVALID_BUNDLENAME, "bundleName is not available.",
206 },
207 {
208 ERR_APPEXECFWK_FORM_INVALID_MODULENAME, "moduleName is not available.",
209 },
210 {
211 ERR_APPEXECFWK_FORM_INVALID_PROVIDER_DATA, "moduleName is not available.",
212 },
213 {
214 ERR_APPEXECFWK_FORM_INVALID_REFRESH_TIME, "refresh time is not available.",
215 },
216 {
217 ERR_APPEXECFWK_FORM_SERVER_STATUS_ERR, "form server error.",
218 },
219 {
220 ERR_APPEXECFWK_FORM_CFG_NOT_MATCH_ID, "the form id and form config are not matched.",
221 },
222 {
223 ERR_APPEXECFWK_FORM_NOT_EXIST_ID, "the requested form id is not existed on fms.",
224 },
225 {
226 ERR_APPEXECFWK_FORM_BIND_PROVIDER_FAILED, "fms bind provider failed.",
227 },
228 {
229 ERR_APPEXECFWK_FORM_MAX_SYSTEM_FORMS, "exceed max forms in system",
230 },
231 {
232 ERR_APPEXECFWK_FORM_EXCEED_INSTANCES_PER_FORM, "exceed max instances per form, limit is 32.",
233 },
234 {
235 ERR_APPEXECFWK_FORM_OPERATION_NOT_SELF,
236 "the form to be operated is not self-owned or has been deleted already.",
237 },
238 {
239 ERR_APPEXECFWK_FORM_PROVIDER_DEL_FAIL, "fms notify provider to delete failed.",
240 },
241 {
242 ERR_APPEXECFWK_FORM_MAX_FORMS_PER_CLIENT, "exceed max forms per client",
243 },
244 {
245 ERR_APPEXECFWK_FORM_MAX_SYSTEM_TEMP_FORMS, "exceed max temp forms in system",
246 },
247 {
248 ERR_APPEXECFWK_FORM_NO_SUCH_MODULE, "the module not exist in the bundle.",
249 },
250 {
251 ERR_APPEXECFWK_FORM_NO_SUCH_ABILITY, "the ability not exist in the module.",
252 },
253 {
254 ERR_APPEXECFWK_FORM_NO_SUCH_DIMENSION, "the dimension not exist in the form.",
255 },
256 {
257 ERR_APPEXECFWK_FORM_FA_NOT_INSTALLED, "the ability not installed,need install first.",
258 },
259 {
260 ERR_APPEXECFWK_FORM_MAX_REQUEST, "too many request,try again later.",
261 },
262 {
263 ERR_APPEXECFWK_FORM_MAX_REFRESH, "already refresh 50 times.",
264 },
265 {
266 ERR_APPEXECFWK_FORM_GET_BMS_FAILED, "get bms rpc failed.",
267 },
268 {
269 ERR_APPEXECFWK_FORM_GET_FMS_FAILED, "get fms rpc failed.",
270 },
271 {
272 ERR_APPEXECFWK_FORM_SEND_FMS_MSG, "send request to fms failed.",
273 },
274 {
275 ERR_APPEXECFWK_FORM_FORM_DUPLICATE_ADDED, "form do not support acquire same id twice.",
276 },
277 {
278 ERR_APPEXECFWK_FORM_IN_RECOVER, "form is in recover status, can't do action on form.",
279 },
280 {
281 ERR_APPEXECFWK_FORM_GET_SYSMGR_FAILED, "get system manager failed.",
282 },
283 {
284 ERR_APPEXECFWK_PARCEL_ERROR, "read parcelable info failed.",
285 },
286 {
287 ERR_APPEXECFWK_FORM_CONNECT_FORM_RENDER_FAILED, "Connect FormRenderService failed.",
288 },
289 {
290 ERR_APPEXECFWK_FORM_RENDER_SERVICE_DIED, "FormRenderService is dead.",
291 },
292 };
293 }
294 } // namespace AppExecFwk
295 } // namespace OHOS
296