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