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