• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 /*
17  * 本部件处理错误的原则:
18  *     原则1:使用异常表示错误,但只有无法处理的问题才算得上是错误,否则只是普通的边界分支;
19  *     原则2:仅在模块内部使用异常,而在界面层Catch所有异常,从而防止异常扩散;
20  *     原则3:在注释里通过throw关键字注明可能抛出的异常,通报使用风险。
21  */
22 #ifndef OHOS_FILEMGMT_BACKUP_B_ERROR_H
23 #define OHOS_FILEMGMT_BACKUP_B_ERROR_H
24 
25 #include <errors.h>
26 #include <functional>
27 #include <map>
28 #include <string>
29 #include <string_view>
30 #include <system_error>
31 #include <vector>
32 
33 #if __has_builtin(__builtin_FILE) && __has_builtin(__builtin_LINE) && __has_builtin(__builtin_FUNCTION)
34 #define DEFINE_SOURCE_LOCATION                                              \
35     int lineNo = __builtin_LINE(), const char *fileName = __builtin_FILE(), \
36         const char *functionName = __builtin_FUNCTION()
37 #else
38 #define DEFINE_SOURCE_LOCATION int lineNo = -1, const char *fileName = "NA", const char *functionName = "NA"
39 #endif
40 
41 namespace OHOS::FileManagement::Backup {
42 using ErrCode = int;
43 using ErrParam = std::function<std::tuple<uint32_t, std::string>()>;
44 
45 class BError : public std::exception {
46 public:
47     /**
48      * @brief 错误码,新增错误码时需要同步补充默认错误信息
49      *
50      */
51     enum class Codes : ErrCode {
52         // 0 无错误
53         OK = 0x0,
54 
55         // 1~999 标准平台错误
56 
57         // 0x1000~0x1999 backup_utils错误
58         UTILS_INVAL_JSON_ENTITY = 0x1000,
59         UTILS_INVAL_FILE_HANDLE = 0x1001,
60         UTILS_INVAL_TARBALL_ARG = 0x1002,
61         UTILS_INVAL_PROCESS_ARG = 0x1003,
62         UTILS_INTERRUPTED_PROCESS = 0x1004,
63 
64         // 0x2000~0x2999 backup_tool错误
65         TOOL_INVAL_ARG = 0x2000,
66 
67         // 0x3000~0x3999 backup_sa错误
68         SA_INVAL_ARG = 0x3000,
69         SA_BROKEN_IPC = 0x3001,
70         SA_REFUSED_ACT = 0x3002,
71         SA_BROKEN_ROOT_DIR = 0x3003,
72         SA_FORBID_BACKUP_RESTORE = 0x3004,
73         SA_BOOT_EXT_TIMEOUT = 0x3005,
74         SA_BUNDLE_INFO_EMPTY = 0x3006,
75         SA_BOOT_EXT_FAIL = 0x3007,
76         SA_SESSION_CONFLICT = 0x3008,
77 
78         // 0x4000~0x4999 backup_SDK错误
79         SDK_INVAL_ARG = 0x4000,
80         SDK_BROKEN_IPC = 0x4001,
81         SDK_MIXED_SCENARIO = 0x4002,
82 
83         // 0x5000~0x5999 backup_ext错误
84         EXT_INVAL_ARG = 0x5000,
85         EXT_BROKEN_FRAMEWORK = 0x5001,
86         EXT_BROKEN_BACKUP_SA = 0x5002,
87         EXT_BROKEN_IPC = 0x5003,
88         EXT_ABILITY_DIED = 0x5004,
89         EXT_ABILITY_TIMEOUT = 0x5005,
90         EXT_FORBID_BACKUP_RESTORE = 0x5006,
91         EXT_BACKUP_PACKET_ERROR = 0x5007,
92         EXT_METHOD_NOT_EXIST = 0x5008,
93         EXT_THROW_EXCEPTION = 0x5009,
94         EXT_BACKUP_UNPACKET_ERROR = 0x5010,
95         EXT_TIMER_ERROR = 0x5011,
96         EXT_CREATE_DIR_ERROR = 0x5012,
97 
98         // 0x6000~0x6999 sa_ext错误
99         SA_EXT_ERR_CALL = 0x6000,
100         SA_EXT_ERR_SAMGR = 0x6001,
101         SA_EXT_RELOAD_FAIL = 0x6002,
102     };
103 
104     enum BackupErrorCode {
105         E_IPCSS = 13600001,
106         E_PERM = 13900001,
107         E_NOTEXIST = 13900002,
108         E_IO = 13900005,
109         E_NOMEM = 13900011,
110         E_INVAL = 13900020,
111         E_NOSPC = 13900025,
112         E_UKERR = 13900042,
113         E_FORBID = 13500001,
114         E_BTO = 13500002,
115         E_ETO = 13500003,
116         E_DIED = 13500004,
117         E_EMPTY = 13500005,
118         E_PACKET = 13500006,
119         E_EXCEPTION = 13500007,
120         E_UNPACKET = 13500008,
121         E_BEF = 13500009,
122         E_TASKFAIL = 13500010,
123         E_CANCEL_UNSTARTED_TASK = 13500011,
124         E_CANCEL_NO_TASK = 13500012,
125         E_CONFLICT = 13500013,
126         E_INCOMPATIBLE = 13500014,
127         E_FORCE_TIMEOUT = 13500015,
128     };
129 
130 public:
131     /**
132      * @brief 返回OHOS标准错误码
133      *
134      * @return int 标注错误码
135      */
136     int GetCode() const;
137 
138     /**
139      * @brief 根据系统的errno返回OHOS标准错误码
140      *
141      * @return int 标注错误码
142      */
143     static int32_t GetCodeByErrno(int32_t errnoSys);
144 
145     /**
146      * @brief 返回原始错误码
147      *
148      * @return Codes 原始错误码
149      */
GetRawCode()150     Codes GetRawCode() const
151     {
152         return code_;
153     }
154 
155     /**
156      * @brief 返回错误信息
157      *
158      * @return const char* 错误信息
159      */
what()160     const char *what() const noexcept override
161     {
162         return msg_.c_str();
163     }
164 
165     /**
166      * @brief 归一返回备份恢复错误码
167      *
168      * @return ErrCode 备份恢复错误码
169      */
170     static ErrCode GetBackupCodeByErrno(ErrCode err);
171 
172     /**
173      * @brief 归一返回备份恢复错误信息
174      *
175      * @return string 备份恢复错误信息
176      */
177     static std::string GetBackupMsgByErrno(ErrCode err);
178 public:
179     /**
180      * @brief 重载bool操作符,判断当前错误是否是错误
181      *
182      * @return true 是错误
183      * @return false 不是错误
184      */
185     explicit operator bool() const
186     {
187         return code_ != Codes::OK;
188     }
189 
190     /**
191      * @brief 返回OHOS标准错误码
192      *
193      * @return int 标准错误码
194      */
195     operator int() const
196     {
197         return GetCode();
198     }
199 
200 public:
201     /**
202      * @brief 构造错误对象
203      *
204      * @param code 备份系统标准错误码,取自本类中的Codes
205      * @param lineNo 构造错误对象的行号(不要自己填写)
206      * @param fileName 构造错误对象的文件(不要自己填写)
207      * @param functionName 构造错误对象的函数(不要自己填写)
208      */
code_(code)209     explicit BError(Codes code = Codes::OK, DEFINE_SOURCE_LOCATION) : code_(code)
210     {
211         msg_ = WrapMessageWithExtraInfos(fileName, lineNo, functionName, code_, {mpErrToMsg_.at(code_)});
212     }
213 
214     /**
215      * @brief 构造错误对象
216      *
217      * @param code 备份系统标准错误码,取自本类中的Codes
218      * @param extraMsg 追加的详细错误信息
219      * @param lineNo 构造错误对象的行号(不要自己填写)
220      * @param fileName 构造错误对象的文件(不要自己填写)
221      * @param functionName 构造错误对象的函数(不要自己填写)
222      */
BError(Codes code,const std::string_view & extraMsg,DEFINE_SOURCE_LOCATION)223     BError(Codes code, const std::string_view &extraMsg, DEFINE_SOURCE_LOCATION) : code_(code)
224     {
225         msg_ = WrapMessageWithExtraInfos(fileName, lineNo, functionName, code_, {mpErrToMsg_.at(code_), extraMsg});
226     }
227 
228     /**
229      * @brief 构造错误对象
230      *
231      * @param stdErrno 失败的LIBC调用通过errno返回的错误码
232      * @param lineNo 构造错误对象的行号(不要自己填写)
233      * @param fileName 构造错误对象的文件(不要自己填写)
234      * @param functionName 构造错误对象的函数(不要自己填写)
235      */
BError(int stdErrno,DEFINE_SOURCE_LOCATION)236     explicit BError(int stdErrno, DEFINE_SOURCE_LOCATION) : code_ {stdErrno}
237     {
238         std::string rawMsg = std::generic_category().message(stdErrno);
239         msg_ = WrapMessageWithExtraInfos(fileName, lineNo, functionName, code_, {rawMsg});
240     }
241 
242 private:
243     static inline const std::map<Codes, std::string_view> mpErrToMsg_ = {
244         {Codes::OK, "No error"},
245         {Codes::UTILS_INVAL_JSON_ENTITY, "Json utils operated on an invalid file"},
246         {Codes::UTILS_INVAL_FILE_HANDLE, "File utils received an invalid file handle"},
247         {Codes::UTILS_INVAL_TARBALL_ARG, "Tarball utils received an invalid argument"},
248         {Codes::UTILS_INVAL_PROCESS_ARG, "Process utils received an invalid argument"},
249         {Codes::UTILS_INTERRUPTED_PROCESS, "Can't launch a process or the process was corrupted"},
250         {Codes::TOOL_INVAL_ARG, "TOOL received invalid arguments"},
251         {Codes::SA_INVAL_ARG, "SA received invalid arguments"},
252         {Codes::SA_BROKEN_IPC, "SA failed to issue a IPC"},
253         {Codes::SA_REFUSED_ACT, "SA refuse to act"},
254         {Codes::SA_BROKEN_ROOT_DIR, "SA failed to operate on the given root dir"},
255         {Codes::SA_FORBID_BACKUP_RESTORE, "SA forbid backup or restore"},
256         {Codes::SA_BOOT_EXT_TIMEOUT, "SA boot application extension time out"},
257         {Codes::SA_BUNDLE_INFO_EMPTY, "SA the bundle info for backup/restore is empty"},
258         {Codes::SA_BOOT_EXT_FAIL, "SA failed to boot application extension"},
259         {Codes::SDK_INVAL_ARG, "SDK received invalid arguments"},
260         {Codes::SDK_BROKEN_IPC, "SDK failed to do IPC"},
261         {Codes::SDK_MIXED_SCENARIO, "SDK involed backup/restore when doing the contrary"},
262         {Codes::EXT_INVAL_ARG, "Extension received an invalid argument"},
263         {Codes::EXT_BROKEN_FRAMEWORK, "Extension found the appex framework is broken"},
264         {Codes::EXT_BROKEN_BACKUP_SA, "Extension found the backup SA died"},
265         {Codes::EXT_BROKEN_IPC, "Extension failed to do IPC"},
266         {Codes::EXT_ABILITY_TIMEOUT, "Extension process timeout"},
267         {Codes::EXT_ABILITY_DIED, "Extension process died"},
268         {Codes::EXT_FORBID_BACKUP_RESTORE, "forbid backup or restore"},
269         {Codes::EXT_BACKUP_PACKET_ERROR, "Backup packet error"},
270         {Codes::EXT_METHOD_NOT_EXIST, "Extension method not exist"},
271         {Codes::EXT_THROW_EXCEPTION, "Extension throw exception"},
272         {Codes::EXT_BACKUP_UNPACKET_ERROR, "Backup unpacket error"},
273         {Codes::SA_EXT_ERR_CALL, "SA Extension received invalid arguments"},
274         {Codes::SA_EXT_ERR_SAMGR, "SA Extension get samgr failed"},
275         {Codes::SA_EXT_RELOAD_FAIL, "SA Extension reload failed"},
276         {Codes::SA_SESSION_CONFLICT, "Session Conflict"},
277     };
278 
279     static inline const std::map<int, int> errCodeTable_ {
280         {static_cast<int>(Codes::OK), static_cast<int>(Codes::OK)},
281         {static_cast<int>(Codes::UTILS_INVAL_JSON_ENTITY), BackupErrorCode::E_INVAL},
282         {static_cast<int>(Codes::UTILS_INVAL_FILE_HANDLE), BackupErrorCode::E_INVAL},
283         {static_cast<int>(Codes::UTILS_INVAL_TARBALL_ARG), BackupErrorCode::E_UKERR},
284         {static_cast<int>(Codes::UTILS_INVAL_PROCESS_ARG), BackupErrorCode::E_UKERR},
285         {static_cast<int>(Codes::UTILS_INTERRUPTED_PROCESS), BackupErrorCode::E_UKERR},
286         {static_cast<int>(Codes::TOOL_INVAL_ARG), BackupErrorCode::E_UKERR},
287         {static_cast<int>(Codes::SA_INVAL_ARG), BackupErrorCode::E_INVAL},
288         {static_cast<int>(Codes::SA_BROKEN_IPC), BackupErrorCode::E_IPCSS},
289         {static_cast<int>(Codes::SA_REFUSED_ACT), BackupErrorCode::E_PERM},
290         {static_cast<int>(Codes::SA_BROKEN_ROOT_DIR), BackupErrorCode::E_UKERR},
291         {static_cast<int>(Codes::SA_FORBID_BACKUP_RESTORE), BackupErrorCode::E_FORBID},
292         {static_cast<int>(Codes::SA_BOOT_EXT_TIMEOUT), BackupErrorCode::E_BTO},
293         {static_cast<int>(Codes::SA_BUNDLE_INFO_EMPTY), BackupErrorCode::E_EMPTY},
294         {static_cast<int>(Codes::SA_BOOT_EXT_FAIL), BackupErrorCode::E_BEF},
295         {static_cast<int>(Codes::SDK_INVAL_ARG), BackupErrorCode::E_INVAL},
296         {static_cast<int>(Codes::SDK_BROKEN_IPC), BackupErrorCode::E_IPCSS},
297         {static_cast<int>(Codes::SDK_MIXED_SCENARIO), BackupErrorCode::E_INVAL},
298         {static_cast<int>(Codes::EXT_INVAL_ARG), BackupErrorCode::E_INVAL},
299         {static_cast<int>(Codes::EXT_BROKEN_FRAMEWORK), BackupErrorCode::E_UKERR},
300         {static_cast<int>(Codes::EXT_BROKEN_BACKUP_SA), BackupErrorCode::E_IPCSS},
301         {static_cast<int>(Codes::EXT_BROKEN_IPC), BackupErrorCode::E_IPCSS},
302         {static_cast<int>(Codes::EXT_ABILITY_DIED), BackupErrorCode::E_DIED},
303         {static_cast<int>(Codes::EXT_ABILITY_TIMEOUT), BackupErrorCode::E_ETO},
304         {static_cast<int>(Codes::EXT_FORBID_BACKUP_RESTORE), BackupErrorCode::E_FORBID},
305         {static_cast<int>(Codes::EXT_BACKUP_PACKET_ERROR), BackupErrorCode::E_PACKET},
306         {static_cast<int>(Codes::EXT_METHOD_NOT_EXIST), BackupErrorCode::E_INVAL},
307         {static_cast<int>(Codes::EXT_THROW_EXCEPTION), BackupErrorCode::E_EXCEPTION},
308         {static_cast<int>(Codes::EXT_BACKUP_UNPACKET_ERROR), BackupErrorCode::E_UNPACKET},
309         {static_cast<int>(Codes::SA_EXT_ERR_CALL), BackupErrorCode::E_INVAL},
310         {static_cast<int>(Codes::SA_EXT_ERR_SAMGR), BackupErrorCode::E_IPCSS},
311         {static_cast<int>(Codes::SA_EXT_RELOAD_FAIL), BackupErrorCode::E_BEF},
312         {static_cast<int>(Codes::SA_SESSION_CONFLICT), BackupErrorCode::E_CONFLICT},
313         {BackupErrorCode::E_IPCSS, BackupErrorCode::E_IPCSS},
314         {BackupErrorCode::E_INVAL, BackupErrorCode::E_INVAL},
315         {BackupErrorCode::E_NOTEXIST, BackupErrorCode::E_NOTEXIST},
316         {BackupErrorCode::E_UKERR, BackupErrorCode::E_UKERR},
317         {BackupErrorCode::E_PERM, BackupErrorCode::E_PERM},
318         {BackupErrorCode::E_NOMEM, BackupErrorCode::E_NOMEM},
319         {BackupErrorCode::E_NOSPC, BackupErrorCode::E_NOSPC},
320         {BackupErrorCode::E_IO, BackupErrorCode::E_IO},
321         {BackupErrorCode::E_FORBID, BackupErrorCode::E_FORBID},
322         {BackupErrorCode::E_BTO, BackupErrorCode::E_BTO},
323         {BackupErrorCode::E_ETO, BackupErrorCode::E_ETO},
324         {BackupErrorCode::E_DIED, BackupErrorCode::E_DIED},
325         {BackupErrorCode::E_EMPTY, BackupErrorCode::E_EMPTY},
326         {BackupErrorCode::E_PACKET, BackupErrorCode::E_PACKET},
327         {BackupErrorCode::E_EXCEPTION, BackupErrorCode::E_EXCEPTION},
328         {BackupErrorCode::E_UNPACKET, BackupErrorCode::E_UNPACKET},
329         {BackupErrorCode::E_BEF, BackupErrorCode::E_BEF},
330         {BackupErrorCode::E_CANCEL_UNSTARTED_TASK, BackupErrorCode::E_CANCEL_UNSTARTED_TASK},
331         {BackupErrorCode::E_CANCEL_NO_TASK, BackupErrorCode::E_CANCEL_NO_TASK},
332         {BackupErrorCode::E_CONFLICT, BackupErrorCode::E_CONFLICT},
333         {BackupErrorCode::E_FORCE_TIMEOUT, BackupErrorCode::E_FORCE_TIMEOUT},
334         {BackupErrorCode::E_INCOMPATIBLE, BackupErrorCode::E_INCOMPATIBLE},
335     };
336 
337     static inline const std::map<int, int> sysErrnoCodeTable_ {
338         {EPERM, BackupErrorCode::E_PERM},
339         {EIO, BackupErrorCode::E_IO},
340         {EBADF, BackupErrorCode::E_IO},
341         {EACCES, BackupErrorCode::E_IO},
342         {EFBIG, BackupErrorCode::E_IO},
343         {ENOMEM, BackupErrorCode::E_NOMEM},
344         {EMFILE, BackupErrorCode::E_NOMEM},
345         {ENOENT, BackupErrorCode::E_INVAL},
346         {ENOTDIR, BackupErrorCode::E_INVAL},
347         {EISDIR, BackupErrorCode::E_INVAL},
348         {ENAMETOOLONG, BackupErrorCode::E_INVAL},
349         {ENOSPC, BackupErrorCode::E_NOSPC},
350     };
351 
352     static inline const std::map<int, std::string> backupErrorMsgTable_ {
353         {BackupErrorCode::E_IPCSS, "IPC error"},
354         {BackupErrorCode::E_INVAL, "Invalid argument"},
355         {BackupErrorCode::E_NOTEXIST, "Method not exist"},
356         {BackupErrorCode::E_UKERR, "Unknown error"},
357         {BackupErrorCode::E_PERM, "Operation not permitted"},
358         {BackupErrorCode::E_NOMEM, "Out of memory"},
359         {BackupErrorCode::E_NOSPC, "No space left on device"},
360         {BackupErrorCode::E_IO, "I/O error"},
361         {BackupErrorCode::E_FORBID, "Not support backup/restore"},
362         {BackupErrorCode::E_BTO, "SA boot extension timeout"},
363         {BackupErrorCode::E_ETO, "Extension process timeout"},
364         {BackupErrorCode::E_DIED, "Extension process died"},
365         {BackupErrorCode::E_EMPTY, "SA the bundle info for backup/restore is empty"},
366         {BackupErrorCode::E_PACKET, "Tar failed"},
367         {BackupErrorCode::E_EXCEPTION, "Extension throw exception"},
368         {BackupErrorCode::E_UNPACKET, "Untar failed"},
369         {BackupErrorCode::E_BEF, "SA failed to boot application extension"},
370         {BackupErrorCode::E_CANCEL_UNSTARTED_TASK, "Cancel unstarted backup or restore task "},
371         {BackupErrorCode::E_CANCEL_NO_TASK, "Cancel a backup or restore task that does not exist"},
372         {BackupErrorCode::E_CONFLICT, "Session Conflict"},
373         {BackupErrorCode::E_INCOMPATIBLE, "Not compatible"},
374         {BackupErrorCode::E_FORCE_TIMEOUT, "Exit actively"}
375     };
376 
377 private:
378     Codes code_ {Codes::OK};
379     std::string msg_;
380 
381 private:
382     /**
383      * @brief 生成如下格式的打印信息 → [文件名:行号->函数名] 默认错误信息. 补充错误信息
384      *
385      * @param fileName 构造错误对象的文件
386      * @param lineNo 构造错误对象的行号
387      * @param functionName 构造错误对象的函数
388      * @param msgs 所有待追加的错误信息
389      * @return std::string 打印信息
390      */
391     std::string WrapMessageWithExtraInfos(const char *fileName,
392                                           int lineNo,
393                                           const char *functionName,
394                                           Codes code,
395                                           const std::vector<std::string_view> &msgs) const;
396 };
397 } // namespace OHOS::FileManagement::Backup
398 
399 #endif // OHOS_FILEMGMT_BACKUP_B_ERROR_H