1 /*
2  * Copyright (c) 2022-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 "quick_fix_error_utils.h"
17 
18 #include <map>
19 
20 namespace OHOS {
21 namespace AAFwk {
22 namespace {
23 const std::map<int32_t, int32_t> INTERNAL_ERR_CODE_MAP = {
24     { QUICK_FIX_OK,                         ERR_OK },
25     { QUICK_FIX_WRITE_PARCEL_FAILED,        ERR_QUICKFIX_INTERNAL_ERROR },
26     { QUICK_FIX_READ_PARCEL_FAILED,         ERR_QUICKFIX_INTERNAL_ERROR },
27     { QUICK_FIX_SEND_REQUEST_FAILED,        ERR_QUICKFIX_INTERNAL_ERROR },
28     { QUICK_FIX_COPY_FILES_FAILED,          ERR_QUICKFIX_HQF_INVALID },
29     { QUICK_FIX_INVALID_PARAM,              ERR_QUICKFIX_PARAM_INVALID },
30     { QUICK_FIX_CONNECT_FAILED,             ERR_QUICKFIX_INTERNAL_ERROR },
31     { QUICK_FIX_VERIFY_PERMISSION_FAILED,   ERR_QUICKFIX_PERMISSION_DENIED },
32     { QUICK_FIX_NOT_SYSTEM_APP,             ERR_QUICKFIX_NOT_SYSTEM_APP },
33     { QUICK_FIX_GET_BUNDLE_INFO_FAILED,     ERR_QUICKFIX_BUNDLE_NAME_INVALID },
34     { QUICK_FIX_DEPLOY_FAILED,              ERR_QUICKFIX_HQF_DEPLOY_FAILED },
35     { QUICK_FIX_SWICH_FAILED,               ERR_QUICKFIX_HQF_SWITCH_FAILED },
36     { QUICK_FIX_DELETE_FAILED,              ERR_QUICKFIX_HQF_DELETE_FAILED },
37     { QUICK_FIX_NOTIFY_LOAD_PATCH_FAILED,   ERR_QUICKFIX_LOAD_PATCH_FAILED },
38     { QUICK_FIX_NOTIFY_RELOAD_PAGE_FAILED,  ERR_QUICKFIX_INTERNAL_ERROR },
39     { QUICK_FIX_REGISTER_OBSERVER_FAILED,   ERR_QUICKFIX_INTERNAL_ERROR },
40     { QUICK_FIX_APPMGR_INVALID,             ERR_QUICKFIX_INTERNAL_ERROR },
41     { QUICK_FIX_BUNDLEMGR_INVALID,          ERR_QUICKFIX_INTERNAL_ERROR },
42     { QUICK_FIX_SET_INFO_FAILED,            ERR_QUICKFIX_INTERNAL_ERROR },
43     { QUICK_FIX_PROCESS_TIMEOUT,            ERR_QUICKFIX_INTERNAL_ERROR },
44     { QUICK_FIX_NOTIFY_UNLOAD_PATCH_FAILED, ERR_QUICKFIX_UNLOAD_PATCH_FAILED },
45     { QUICK_FIX_DEPLOYING_TASK,             ERR_QUICKFIX_DEPLOYING_TASK },
46 };
47 
48 const std::map<int32_t, std::string> INTERNAL_ERR_MSG_MAP = {
49     { QUICK_FIX_WRITE_PARCEL_FAILED,       "Write parcel failed." },
50     { QUICK_FIX_READ_PARCEL_FAILED,        "Read parcel failed." },
51     { QUICK_FIX_SEND_REQUEST_FAILED,       "Send request failed." },
52     { QUICK_FIX_CONNECT_FAILED,            "Connect failed." },
53     { QUICK_FIX_NOTIFY_RELOAD_PAGE_FAILED, "Reload page failed." },
54     { QUICK_FIX_REGISTER_OBSERVER_FAILED,  "Register observer failed." },
55     { QUICK_FIX_APPMGR_INVALID,            "AppMgr invalid." },
56     { QUICK_FIX_BUNDLEMGR_INVALID,         "BundleMgr invalid." },
57     { QUICK_FIX_SET_INFO_FAILED,           "Set quickfix info failed." },
58     { QUICK_FIX_PROCESS_TIMEOUT,           "Process timeout." },
59 };
60 
61 const std::map<int32_t, std::string> EXTERNAL_ERR_MSG_MAP = {
62     { ERR_OK,                           "Success." },
63     { ERR_QUICKFIX_PERMISSION_DENIED,   "The application does not have permission to call the interface." },
64     { ERR_QUICKFIX_NOT_SYSTEM_APP,   "The application is not system-app, can not use system-api." },
65     { ERR_QUICKFIX_PARAM_INVALID,       "Invalid input parameter." },
66     { ERR_QUICKFIX_BUNDLE_NAME_INVALID, "The specified bundleName is invalid." },
67     { ERR_QUICKFIX_HQF_INVALID,         "The specified hqf is invalid. Hqf may not exist or inaccessible." },
68     { ERR_QUICKFIX_HQF_DEPLOY_FAILED,   "Deploy hqf failed." },
69     { ERR_QUICKFIX_HQF_SWITCH_FAILED,   "Switch hqf failed." },
70     { ERR_QUICKFIX_HQF_DELETE_FAILED,   "Delete hqf failed." },
71     { ERR_QUICKFIX_LOAD_PATCH_FAILED,   "Load patch failed." },
72     { ERR_QUICKFIX_UNLOAD_PATCH_FAILED, "Unload patch failed." },
73     { ERR_QUICKFIX_INTERNAL_ERROR,      "Internal error." },
74     { ERR_QUICKFIX_DEPLOYING_TASK,      "The application has a apply quick fix task that is being processed." },
75 };
76 } // namespace
77 
GetErrorCode(int32_t errCode)78 int32_t QuickFixErrorUtil::GetErrorCode(int32_t errCode)
79 {
80     // no need to convert is errCode is external error code.
81     auto iter = EXTERNAL_ERR_MSG_MAP.find(errCode);
82     if (iter != EXTERNAL_ERR_MSG_MAP.end()) {
83         return errCode;
84     }
85 
86     auto iterInternal = INTERNAL_ERR_CODE_MAP.find(errCode);
87     if (iterInternal != INTERNAL_ERR_CODE_MAP.end()) {
88         return iterInternal->second;
89     }
90 
91     return ERR_QUICKFIX_INTERNAL_ERROR;
92 }
93 
GetErrorMessage(int32_t errCode)94 std::string QuickFixErrorUtil::GetErrorMessage(int32_t errCode)
95 {
96     std::string errMsg;
97     auto externalErrCode = GetErrorCode(errCode);
98     auto iter = EXTERNAL_ERR_MSG_MAP.find(externalErrCode);
99     if (iter != EXTERNAL_ERR_MSG_MAP.end()) {
100         errMsg = iter->second;
101     } else {
102         errMsg = EXTERNAL_ERR_MSG_MAP.at(ERR_QUICKFIX_INTERNAL_ERROR);
103     }
104 
105     auto iterInternal = INTERNAL_ERR_MSG_MAP.find(errCode);
106     if (iterInternal != INTERNAL_ERR_MSG_MAP.end()) {
107         errMsg += " " + iterInternal->second;
108     }
109 
110     return errMsg;
111 }
112 } // namespace AAFwk
113 } // namespace OHOS