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