• 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 #ifndef FILEMGMT_LIBN_N_ERROR_H
17 #define FILEMGMT_LIBN_N_ERROR_H
18 
19 #include <functional>
20 #include <string>
21 #include <tuple>
22 #include <unordered_map>
23 
24 #include "n_napi.h"
25 
26 namespace OHOS {
27 namespace FileManagement {
28 namespace LibN {
29 
30 constexpr int UNKROWN_ERR = -1;
31 constexpr int ERRNO_NOERR = 0;
32 constexpr int STORAGE_SERVICE_SYS_CAP_TAG = 13600000;
33 constexpr int FILEIO_SYS_CAP_TAG = 13900000;
34 constexpr int USER_FILE_MANAGER_SYS_CAP_TAG = 14000000;
35 constexpr int USER_FILE_SERVICE_SYS_CAP_TAG = 14300000;
36 const std::string FILEIO_TAG_ERR_CODE = "code";
37 
38 enum ErrCodeSuffixOfFileIO {
39     E_PERM = 1,
40     E_NOENT,
41     E_SRCH,
42     E_INTR,
43     E_IO,
44     E_NXIO,
45     E_2BIG,
46     E_BADF,
47     E_CHILD,
48     E_AGAIN,
49     E_NOMEM,
50     E_ACCES,
51     E_FAULT,
52     E_BUSY,
53     E_EXIST,
54     E_XDEV,
55     E_NODEV,
56     E_NOTDIR,
57     E_ISDIR,
58     E_INVAL,
59     E_NFILE,
60     E_MFILE,
61     E_TXTBSY,
62     E_FBIG,
63     E_NOSPC,
64     E_SPIPE,
65     E_ROFS,
66     E_MLINK,
67     E_DEADLK,
68     E_NAMETOOLONG,
69     E_NOSYS,
70     E_NOTEMPTY,
71     E_LOOP,
72     E_WOULDBLOCK,
73     E_BADR,
74     E_NOSTR,
75     E_NODATA,
76     E_OVERFLOW,
77     E_BADFD,
78     E_RESTART,
79     E_DQUOT,
80     E_UKERR,
81     E_NOLCK
82 };
83 
84 enum ErrCodeSuffixOfUserFileManager {
85     E_DISPLAYNAME = 1,
86     E_URIM,
87     E_SUFFIX,
88     E_TRASH,
89     E_OPEN_MODE,
90     E_NOT_ALBUM,
91     E_ROOT_DIR,
92     E_MOVE_DENIED,
93     E_RENAME_DENIED,
94     E_RELATIVEPATH,
95     E_INNER_FAIL,
96     E_FILE_TYPE,
97     E_FILE_KEY,
98     E_INPUT
99 };
100 
101 enum ErrCodeSuffixOfStorageService {
102     E_IPCSS = 1,
103     E_NOTSUPPORTEDFS,
104     E_MOUNT,
105     E_UNMOUNT,
106     E_VOLUMESTATE,
107     E_PREPARE,
108     E_DELETE,
109     E_NOOBJECT,
110     E_OUTOFRANGE
111 };
112 
113 enum ErrCodeSuffixOfUserFileService {
114     E_IPCS = 1,
115     E_URIS,
116     E_GETINFO,
117     E_GETRESULT,
118     E_REGISTER,
119     E_REMOVE,
120     E_INIT,
121     E_NOTIFY,
122     E_CONNECT
123 };
124 
125 enum CommonErrCode {
126     E_PERMISSION = 201,
127     E_PERMISSION_SYS = 202,
128     E_PARAMS = 401,
129     E_DEVICENOTSUPPORT = 801,
130     E_OSNOTSUPPORT = 901
131 };
132 
133 const std::unordered_map<int, std::pair<int32_t, std::string>> errCodeTable {
134     { ERRNO_NOERR, { ERRNO_NOERR, "No error imformation" } },
135     { EPERM, { FILEIO_SYS_CAP_TAG + E_PERM, "Operation not permitted" } },
136     { ENOENT, { FILEIO_SYS_CAP_TAG + E_NOENT, "No such file or directory" } },
137     { ESRCH, { FILEIO_SYS_CAP_TAG + E_SRCH, "No such process" } },
138     { EINTR, { FILEIO_SYS_CAP_TAG + E_INTR, "Interrupted system call" } },
139     { EIO, { FILEIO_SYS_CAP_TAG + E_IO, "I/O error" } },
140     { ENXIO, { FILEIO_SYS_CAP_TAG + E_NXIO, "No such device or address" } },
141     { E2BIG, { FILEIO_SYS_CAP_TAG + E_2BIG, "Arg list too long" } },
142     { EBADF, { FILEIO_SYS_CAP_TAG + E_BADF, "Bad file descriptor" } },
143     { ECHILD, { FILEIO_SYS_CAP_TAG + E_CHILD, "No child processes" } },
144     { EAGAIN, { FILEIO_SYS_CAP_TAG + E_AGAIN, "Try again" } },
145     { ENOMEM, { FILEIO_SYS_CAP_TAG + E_NOMEM, "Out of memory" } },
146     { EACCES, { FILEIO_SYS_CAP_TAG + E_ACCES, "Permission denied" } },
147     { EFAULT, { FILEIO_SYS_CAP_TAG + E_FAULT, "Bad address" } },
148     { EBUSY, { FILEIO_SYS_CAP_TAG + E_BUSY, "Device or resource busy" } },
149     { EEXIST, { FILEIO_SYS_CAP_TAG + E_EXIST, "File exists" } },
150     { EXDEV, { FILEIO_SYS_CAP_TAG + E_XDEV, "Cross-device link" } },
151     { ENODEV, { FILEIO_SYS_CAP_TAG + E_NODEV, "No such device" } },
152     { ENOTDIR, { FILEIO_SYS_CAP_TAG + E_NOTDIR, "Not a directory" } },
153     { EISDIR, { FILEIO_SYS_CAP_TAG + E_ISDIR, "Is a directory" } },
154     { EINVAL, { FILEIO_SYS_CAP_TAG + E_INVAL, "Invalid argument" } },
155     { ENFILE, { FILEIO_SYS_CAP_TAG + E_NFILE, "File table overflow" } },
156     { EMFILE, { FILEIO_SYS_CAP_TAG + E_MFILE, "Too many open files" } },
157     { ETXTBSY, { FILEIO_SYS_CAP_TAG + E_TXTBSY, "Text file busy" } },
158     { EFBIG, { FILEIO_SYS_CAP_TAG + E_FBIG, "File too large" } },
159     { ENOSPC, { FILEIO_SYS_CAP_TAG + E_NOSPC, "No space left on device" } },
160     { ESPIPE, { FILEIO_SYS_CAP_TAG + E_SPIPE, "Illegal seek" } },
161     { EROFS, { FILEIO_SYS_CAP_TAG + E_ROFS, "Read-only file system" } },
162     { EMLINK, { FILEIO_SYS_CAP_TAG + E_MLINK, "Too many links" } },
163     { EDEADLK, { FILEIO_SYS_CAP_TAG + E_DEADLK, "Resource deadlock would occur" } },
164     { ENAMETOOLONG, { FILEIO_SYS_CAP_TAG + E_NAMETOOLONG, "File name too long" } },
165     { ENOSYS, { FILEIO_SYS_CAP_TAG + E_NOSYS, "Function not implemented" } },
166     { ENOTEMPTY, { FILEIO_SYS_CAP_TAG + E_NOTEMPTY, "Directory not empty" } },
167     { ELOOP, { FILEIO_SYS_CAP_TAG + E_LOOP, "Too many symbolic links encountered" } },
168     { EWOULDBLOCK, { FILEIO_SYS_CAP_TAG + E_WOULDBLOCK, "Operation would block" } },
169     { EBADR, { FILEIO_SYS_CAP_TAG + E_BADR, "Invalid request descriptor" } },
170     { ENOSTR, { FILEIO_SYS_CAP_TAG + E_NOSTR, "Device not a stream" } },
171     { ENODATA, { FILEIO_SYS_CAP_TAG + E_NODATA, "No data available" } },
172     { EOVERFLOW, { FILEIO_SYS_CAP_TAG + E_OVERFLOW, "Value too large for defined data type" } },
173     { EBADFD, { FILEIO_SYS_CAP_TAG + E_BADFD, "File descriptor in bad state" } },
174     { ERESTART, { FILEIO_SYS_CAP_TAG + E_RESTART, "Interrupted system call should be restarted" } },
175     { EDQUOT, { FILEIO_SYS_CAP_TAG + E_DQUOT, "Quota exceeded" } },
176     { UNKROWN_ERR, { FILEIO_SYS_CAP_TAG + E_UKERR, "Unknown error" } },
177     { ENOLCK, { FILEIO_SYS_CAP_TAG + E_NOLCK, "No record locks available" } },
178     { FILEIO_SYS_CAP_TAG + E_PERM, { FILEIO_SYS_CAP_TAG + E_PERM, "Operation not permitted" } },
179     { FILEIO_SYS_CAP_TAG + E_NOENT, { FILEIO_SYS_CAP_TAG + E_NOENT, "No such file or directory" } },
180     { FILEIO_SYS_CAP_TAG + E_SRCH, { FILEIO_SYS_CAP_TAG + E_SRCH, "No such process" } },
181     { FILEIO_SYS_CAP_TAG + E_INTR, { FILEIO_SYS_CAP_TAG + E_INTR, "Interrupted system call" } },
182     { FILEIO_SYS_CAP_TAG + E_IO, { FILEIO_SYS_CAP_TAG + E_IO, "I/O error" } },
183     { FILEIO_SYS_CAP_TAG + E_NXIO, { FILEIO_SYS_CAP_TAG + E_NXIO, "No such device or address" } },
184     { FILEIO_SYS_CAP_TAG + E_2BIG, { FILEIO_SYS_CAP_TAG + E_2BIG, "Arg list too long" } },
185     { FILEIO_SYS_CAP_TAG + E_BADF, { FILEIO_SYS_CAP_TAG + E_BADF, "Bad file descriptor" } },
186     { FILEIO_SYS_CAP_TAG + E_CHILD, { FILEIO_SYS_CAP_TAG + E_CHILD, "No child processes" } },
187     { FILEIO_SYS_CAP_TAG + E_AGAIN, { FILEIO_SYS_CAP_TAG + E_AGAIN, "Try again" } },
188     { FILEIO_SYS_CAP_TAG + E_NOMEM, { FILEIO_SYS_CAP_TAG + E_NOMEM, "Out of memory" } },
189     { FILEIO_SYS_CAP_TAG + E_ACCES, { FILEIO_SYS_CAP_TAG + E_ACCES, "Permission denied" } },
190     { FILEIO_SYS_CAP_TAG + E_FAULT, { FILEIO_SYS_CAP_TAG + E_FAULT, "Bad address" } },
191     { FILEIO_SYS_CAP_TAG + E_BUSY, { FILEIO_SYS_CAP_TAG + E_BUSY, "Device or resource busy" } },
192     { FILEIO_SYS_CAP_TAG + E_EXIST, { FILEIO_SYS_CAP_TAG + E_EXIST, "File exists" } },
193     { FILEIO_SYS_CAP_TAG + E_XDEV, { FILEIO_SYS_CAP_TAG + E_XDEV, "Cross-device link" } },
194     { FILEIO_SYS_CAP_TAG + E_NODEV, { FILEIO_SYS_CAP_TAG + E_NODEV, "No such device" } },
195     { FILEIO_SYS_CAP_TAG + E_NOTDIR, { FILEIO_SYS_CAP_TAG + E_NOTDIR, "Not a directory" } },
196     { FILEIO_SYS_CAP_TAG + E_ISDIR, { FILEIO_SYS_CAP_TAG + E_ISDIR, "Is a directory" } },
197     { FILEIO_SYS_CAP_TAG + E_INVAL, { FILEIO_SYS_CAP_TAG + E_INVAL, "Invalid argument" } },
198     { FILEIO_SYS_CAP_TAG + E_NFILE, { FILEIO_SYS_CAP_TAG + E_NFILE, "File table overflow" } },
199     { FILEIO_SYS_CAP_TAG + E_MFILE, { FILEIO_SYS_CAP_TAG + E_MFILE, "Too many open files" } },
200     { FILEIO_SYS_CAP_TAG + E_TXTBSY, { FILEIO_SYS_CAP_TAG + E_TXTBSY, "Text file busy" } },
201     { FILEIO_SYS_CAP_TAG + E_FBIG, { FILEIO_SYS_CAP_TAG + E_FBIG, "File too large" } },
202     { FILEIO_SYS_CAP_TAG + E_NOSPC, { FILEIO_SYS_CAP_TAG + E_NOSPC, "No space left on device" } },
203     { FILEIO_SYS_CAP_TAG + E_SPIPE, { FILEIO_SYS_CAP_TAG + E_SPIPE, "Illegal seek" } },
204     { FILEIO_SYS_CAP_TAG + E_ROFS, { FILEIO_SYS_CAP_TAG + E_ROFS, "Read-only file system" } },
205     { FILEIO_SYS_CAP_TAG + E_MLINK, { FILEIO_SYS_CAP_TAG + E_MLINK, "Too many links" } },
206     { FILEIO_SYS_CAP_TAG + E_DEADLK, { FILEIO_SYS_CAP_TAG + E_DEADLK, "Resource deadlock would occur" } },
207     { FILEIO_SYS_CAP_TAG + E_NAMETOOLONG, { FILEIO_SYS_CAP_TAG + E_NAMETOOLONG, "File name too long" } },
208     { FILEIO_SYS_CAP_TAG + E_NOSYS, { FILEIO_SYS_CAP_TAG + E_NOSYS, "Function not implemented" } },
209     { FILEIO_SYS_CAP_TAG + E_NOTEMPTY, { FILEIO_SYS_CAP_TAG + E_NOTEMPTY, "Directory not empty" } },
210     { FILEIO_SYS_CAP_TAG + E_LOOP, { FILEIO_SYS_CAP_TAG + E_LOOP, "Too many symbolic links encountered" } },
211     { FILEIO_SYS_CAP_TAG + E_WOULDBLOCK, { FILEIO_SYS_CAP_TAG + E_WOULDBLOCK, "Operation would block" } },
212     { FILEIO_SYS_CAP_TAG + E_BADR, { FILEIO_SYS_CAP_TAG + E_BADR, "Invalid request descriptor" } },
213     { FILEIO_SYS_CAP_TAG + E_NOSTR, { FILEIO_SYS_CAP_TAG + E_NOSTR, "Device not a stream" } },
214     { FILEIO_SYS_CAP_TAG + E_NODATA, { FILEIO_SYS_CAP_TAG + E_NODATA, "No data available" } },
215     { FILEIO_SYS_CAP_TAG + E_OVERFLOW, { FILEIO_SYS_CAP_TAG + E_OVERFLOW, "Value too large for defined data type" } },
216     { FILEIO_SYS_CAP_TAG + E_BADFD, { FILEIO_SYS_CAP_TAG + E_BADFD, "File descriptor in bad state" } },
217     { FILEIO_SYS_CAP_TAG + E_RESTART, { FILEIO_SYS_CAP_TAG + E_RESTART,
218         "Interrupted system call should be restarted" } },
219     { FILEIO_SYS_CAP_TAG + E_DQUOT, { FILEIO_SYS_CAP_TAG + E_DQUOT, "Quota exceeded" } },
220     { FILEIO_SYS_CAP_TAG + E_UKERR, { FILEIO_SYS_CAP_TAG + E_UKERR, "Unknown error" } },
221     { FILEIO_SYS_CAP_TAG + E_NOLCK, { FILEIO_SYS_CAP_TAG + E_NOLCK, "No record locks available" } },
222     { USER_FILE_MANAGER_SYS_CAP_TAG + E_DISPLAYNAME, { USER_FILE_MANAGER_SYS_CAP_TAG + E_DISPLAYNAME,
223         "Invalid display name" } },
224     { USER_FILE_MANAGER_SYS_CAP_TAG + E_URIM, { USER_FILE_MANAGER_SYS_CAP_TAG + E_URIM, "Invalid uri" } },
225     { USER_FILE_MANAGER_SYS_CAP_TAG + E_SUFFIX, { USER_FILE_MANAGER_SYS_CAP_TAG + E_SUFFIX,
226         "Invalid file extension" } },
227     { USER_FILE_MANAGER_SYS_CAP_TAG + E_TRASH, { USER_FILE_MANAGER_SYS_CAP_TAG + E_TRASH,
228         "File has been put into trash bin" } },
229     { USER_FILE_MANAGER_SYS_CAP_TAG + E_OPEN_MODE, { USER_FILE_MANAGER_SYS_CAP_TAG + E_OPEN_MODE,
230         "Invalid open mode" } },
231     { USER_FILE_MANAGER_SYS_CAP_TAG + E_NOT_ALBUM, { USER_FILE_MANAGER_SYS_CAP_TAG + E_NOT_ALBUM,
232         "The uri is not album" } },
233     { USER_FILE_MANAGER_SYS_CAP_TAG + E_ROOT_DIR, { USER_FILE_MANAGER_SYS_CAP_TAG + E_ROOT_DIR,
234         "Invalid root dir" } },
235     { USER_FILE_MANAGER_SYS_CAP_TAG + E_MOVE_DENIED, { USER_FILE_MANAGER_SYS_CAP_TAG + E_MOVE_DENIED,
236         "Failed to move as dir check failed" } },
237     { USER_FILE_MANAGER_SYS_CAP_TAG + E_RENAME_DENIED, { USER_FILE_MANAGER_SYS_CAP_TAG + E_RENAME_DENIED,
238         "Failed to rename as dir check failed" } },
239     { USER_FILE_MANAGER_SYS_CAP_TAG + E_RELATIVEPATH, { USER_FILE_MANAGER_SYS_CAP_TAG + E_RELATIVEPATH,
240         "Relative path not exist or invalid" } },
241     { USER_FILE_MANAGER_SYS_CAP_TAG + E_INNER_FAIL, { USER_FILE_MANAGER_SYS_CAP_TAG + E_INNER_FAIL,
242         "MediaLibrary inner fail" } },
243     { USER_FILE_MANAGER_SYS_CAP_TAG + E_FILE_TYPE, { USER_FILE_MANAGER_SYS_CAP_TAG + E_FILE_TYPE,
244         "File type is not allow in the directory" } },
245     { USER_FILE_MANAGER_SYS_CAP_TAG + E_FILE_KEY, { USER_FILE_MANAGER_SYS_CAP_TAG + E_FILE_KEY,
246         "Member not exist" } },
247     { USER_FILE_MANAGER_SYS_CAP_TAG + E_INPUT, { USER_FILE_MANAGER_SYS_CAP_TAG + E_INPUT,
248         "Wrong input parameter" } },
249     { STORAGE_SERVICE_SYS_CAP_TAG + E_IPCSS, { STORAGE_SERVICE_SYS_CAP_TAG + E_IPCSS, "IPC error" } },
250     { STORAGE_SERVICE_SYS_CAP_TAG + E_NOTSUPPORTEDFS, { STORAGE_SERVICE_SYS_CAP_TAG + E_NOTSUPPORTEDFS,
251         "Not supported filesystem" } },
252     { STORAGE_SERVICE_SYS_CAP_TAG + E_MOUNT, { STORAGE_SERVICE_SYS_CAP_TAG + E_MOUNT, "Failed to mount" } },
253     { STORAGE_SERVICE_SYS_CAP_TAG + E_UNMOUNT, { STORAGE_SERVICE_SYS_CAP_TAG + E_UNMOUNT, "Failed to unmount" } },
254     { STORAGE_SERVICE_SYS_CAP_TAG + E_VOLUMESTATE, { STORAGE_SERVICE_SYS_CAP_TAG + E_VOLUMESTATE,
255         "Incorrect volume state" } },
256     { STORAGE_SERVICE_SYS_CAP_TAG + E_PREPARE, { STORAGE_SERVICE_SYS_CAP_TAG + E_PREPARE,
257         "Prepare directory or node error" } },
258     { STORAGE_SERVICE_SYS_CAP_TAG + E_DELETE, { STORAGE_SERVICE_SYS_CAP_TAG + E_DELETE,
259         "Delete directory or node error" } },
260     { STORAGE_SERVICE_SYS_CAP_TAG + E_NOOBJECT, { STORAGE_SERVICE_SYS_CAP_TAG + E_NOOBJECT, "No such object" } },
261     { STORAGE_SERVICE_SYS_CAP_TAG + E_OUTOFRANGE, { STORAGE_SERVICE_SYS_CAP_TAG + E_OUTOFRANGE,
262         "User id out of range" } },
263     { STORAGE_SERVICE_SYS_CAP_TAG + E_NOOBJECT, { STORAGE_SERVICE_SYS_CAP_TAG + E_NOOBJECT, "No such object" } },
264     { USER_FILE_SERVICE_SYS_CAP_TAG + E_IPCS, { USER_FILE_SERVICE_SYS_CAP_TAG + E_IPCS, "IPC error" } },
265     { USER_FILE_SERVICE_SYS_CAP_TAG + E_URIS, { USER_FILE_SERVICE_SYS_CAP_TAG + E_URIS, "Invalid uri" } },
266     { USER_FILE_SERVICE_SYS_CAP_TAG + E_GETINFO, { USER_FILE_SERVICE_SYS_CAP_TAG + E_GETINFO,
267         "Fail to get fileextension info" } },
268     { USER_FILE_SERVICE_SYS_CAP_TAG + E_GETRESULT, { USER_FILE_SERVICE_SYS_CAP_TAG + E_GETRESULT,
269         "Get wrong result" } },
270     { USER_FILE_SERVICE_SYS_CAP_TAG + E_REGISTER, { USER_FILE_SERVICE_SYS_CAP_TAG + E_REGISTER,
271         "Fail to register notification" } },
272     { USER_FILE_SERVICE_SYS_CAP_TAG + E_REMOVE, { USER_FILE_SERVICE_SYS_CAP_TAG + E_REMOVE,
273         "Fail to remove notification" } },
274     { USER_FILE_SERVICE_SYS_CAP_TAG + E_INIT, { USER_FILE_SERVICE_SYS_CAP_TAG + E_INIT,
275         "Fail to init notification agent" } },
276     { USER_FILE_SERVICE_SYS_CAP_TAG + E_NOTIFY, { USER_FILE_SERVICE_SYS_CAP_TAG + E_NOTIFY, "Fail to notify agent" } },
277     { USER_FILE_SERVICE_SYS_CAP_TAG + E_CONNECT, { USER_FILE_SERVICE_SYS_CAP_TAG + E_CONNECT,
278         "Fail to connect file access extension ability" } },
279     { E_PERMISSION, { E_PERMISSION, "Permission verification failed" } },
280     { E_PERMISSION_SYS, { E_PERMISSION_SYS, "The caller is not a system application" } },
281     { E_PARAMS, { E_PARAMS, "The input parameter is invalid" } },
282     { E_DEVICENOTSUPPORT, { E_DEVICENOTSUPPORT, "The device doesn't support this api" } },
283     { E_OSNOTSUPPORT, { E_OSNOTSUPPORT, "The os doesn't support this api" } },
284 };
285 
286 class NError {
287 public:
288     NError();
289     NError(int ePosix);
290     NError(std::function<std::tuple<uint32_t, std::string>()> errGen);
291     ~NError() = default;
292     explicit operator bool() const;
293     napi_value GetNapiErr(napi_env env);
294     napi_value GetNapiErr(napi_env env, int code);
295     void ThrowErr(napi_env env);
296     void ThrowErr(napi_env env, int code);
297     void ThrowErr(napi_env env, std::string errMsg);
298 
299 private:
300     int errno_ = ERRNO_NOERR;
301     std::string errMsg_;
302 };
303 } // namespace LibN
304 } // namespace FileManagement
305 } // namespace OHOS
306 
307 #endif // FILEMGMT_LIBN_N_ERROR_H