CZipString CZipException::GetSystemErrorDescription() { #ifdef WIN32 DWORD x = GetLastError(); if (x) { LPVOID lpMsgBuf; FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM |FORMAT_MESSAGE_IGNORE_INSERTS, NULL, x, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) &lpMsgBuf, 0, NULL); CZipString sz = (LPCTSTR)lpMsgBuf; LocalFree(lpMsgBuf); return sz; } #endif return GetInternalErrorDescription(errno == 0 ? generic : errno, true); }
CZipString CZipException::GetInternalErrorDescription(int iCause, bool bNoLoop) { CZipString sz; switch (iCause) { case EROFS: sz = _T("Read-only file system"); break; case ESPIPE: sz = _T("Illegal seek"); break; case ENOSPC: sz = _T("No space left on device"); break; case EFBIG: sz = _T("File too large"); break; case EMFILE: sz = _T("Too many open files"); break; case ENFILE: sz = _T("File table overflow"); break; case EINVAL: sz = _T("Invalid argument"); break; case EISDIR: sz = _T("Is a directory"); break; case ENOTDIR: sz = _T("Not a directory"); break; case ENODEV: sz = _T("No such device"); break; case EXDEV: sz = _T("Cross-device link"); break; case EEXIST: sz = _T("File exists"); break; case EFAULT: sz = _T("Bad address"); break; case EACCES: sz = _T("Permission denied"); break; case ENOMEM: sz = _T("Not enough space"); break; case EBADF: sz = _T("Bad file number"); break; case ENXIO: sz = _T("No such device or address"); break; case EIO: sz = _T("I/O error"); break; case EINTR: sz = _T("Interrupted system call"); break; case ENOENT: sz = _T("No such file or directory"); break; case EPERM: sz = _T("Not super-user"); break; case badZipFile: sz = _T("Damaged or not a zip file"); break; case badCrc: sz = _T("Crc mismatched"); break; case noCallback: sz = _T("No disk-spanning callback functor set"); break; case aborted: sz = _T("Disk change aborted"); break; case abortedAction: sz = _T("Action aborted"); break; case abortedSafely: sz = _T("Action aborted safely"); break; case nonRemovable: sz = _T("The device selected for the disk spanning archive is non removable"); break; case tooManyVolumes: sz = _T("Limit of the maximum volumes reached (999)"); break; case tooLongFileName: sz = _T("The filename of the file being added to the archive is too long"); break; case badPassword: sz = _T("Incorrect password set for the file being decrypted"); break; case dirWithSize: sz = _T("During testing found the directory with the size greater than 0"); break; case internal: sz = _T("Internal error"); break; case notRemoved: sz.Format(_T("%s (%s)"), _T("Error while removing a file"), (LPCTSTR)GetSystemErrorDescription()); break; case notRenamed: sz.Format(_T("%s (%s)"), _T("Error while renaming a file"), (LPCTSTR)GetSystemErrorDescription()); break; case platfNotSupp: sz = _T("Cannot create the file for the specified platform"); break; case cdirNotFound: sz = _T("The central directory was not found in the archive (or you were trying to open not the last disk of a multi-disk archive)"); break; case streamEnd: sz = _T("Zlib Library error (end of stream)"); break; case errNo: sz = GetInternalErrorDescription(errno != errNo ? errno : generic); break; case streamError: sz = _T("Zlib library error (stream error)"); break; case dataError: sz = _T("Zlib library error (data error)"); break; case memError: sz = _T("Not enough memory"); break; case bufError: sz = _T("Zlib library error (buffer error)"); break; case versionError: sz = _T("Zlib library error (version error)"); break; default: sz = bNoLoop ? _T("Unknown error") :(LPCTSTR) GetSystemErrorDescription(); } return sz; }
CZipString CZipException::GetErrorDescription() { return GetInternalErrorDescription(m_iCause); }