File indexing completed on 2024-05-12 16:01:48
0001 /* 0002 * SPDX-FileCopyrightText: 2019 Agata Cacko <cacko.azh@gmail.com> 0003 * 0004 * SPDX-License-Identifier: GPL-2.0-or-later 0005 */ 0006 0007 #include "KisImportExportErrorCode.h" 0008 #include <KLocalizedString> 0009 #include <kis_assert.h> 0010 0011 0012 0013 KisImportExportComplexError::KisImportExportComplexError(QFileDevice::FileError error) : m_error(error) { } 0014 0015 0016 QString KisImportExportComplexError::qtErrorMessage() const 0017 { 0018 // Error descriptions in most cases taken from https://doc.qt.io/qt-5/qfiledevice.html 0019 QString unspecifiedError = i18n("An unspecified error occurred."); 0020 switch (m_error) { 0021 case QFileDevice::FileError::NoError : 0022 // Returning this file error may mean that something is wrong in our code. 0023 // Successful operation should return ImportExportCodes::OK instead. 0024 return i18n("The action has been completed successfully."); 0025 case QFileDevice::FileError::ReadError : 0026 return i18n("An error occurred when reading from the file."); 0027 case QFileDevice::FileError::WriteError : 0028 return i18n("An error occurred when writing to the file."); 0029 case QFileDevice::FileError::FatalError : 0030 return i18n("A fatal error occurred."); 0031 case QFileDevice::FileError::ResourceError : 0032 return i18n("Out of resources (e.g. out of memory)."); 0033 case QFileDevice::FileError::OpenError : 0034 return i18n("The file could not be opened."); 0035 case QFileDevice::FileError::AbortError : 0036 return i18n("The operation was aborted."); 0037 case QFileDevice::FileError::TimeOutError : 0038 return i18n("A timeout occurred."); 0039 case QFileDevice::FileError::UnspecifiedError : 0040 return unspecifiedError; 0041 case QFileDevice::FileError::RemoveError : 0042 return i18n("The file could not be removed."); 0043 case QFileDevice::FileError::RenameError : 0044 return i18n("The file could not be renamed."); 0045 case QFileDevice::FileError::PositionError : 0046 return i18n("The position in the file could not be changed."); 0047 case QFileDevice::FileError::ResizeError : 0048 return i18n("The file could not be resized."); 0049 case QFileDevice::FileError::PermissionsError : 0050 return i18n("Permission denied. Krita is not allowed to read or write to the file."); 0051 case QFileDevice::FileError::CopyError : 0052 return i18n("The file could not be copied."); 0053 } 0054 return unspecifiedError; 0055 } 0056 0057 KisImportExportErrorCannotRead::KisImportExportErrorCannotRead() : KisImportExportComplexError(QFileDevice::FileError()) { } 0058 0059 KisImportExportErrorCannotRead::KisImportExportErrorCannotRead(QFileDevice::FileError error) : KisImportExportComplexError(error) { 0060 KIS_ASSERT_RECOVER_NOOP(error != QFileDevice::NoError); 0061 } 0062 0063 QString KisImportExportErrorCannotRead::errorMessage() const 0064 { 0065 return i18n("Cannot open file for reading. Reason: %1", qtErrorMessage()); 0066 } 0067 0068 bool KisImportExportErrorCannotRead::operator==(KisImportExportErrorCannotRead other) 0069 { 0070 return other.m_error == m_error; 0071 } 0072 0073 KisImportExportErrorCannotWrite::KisImportExportErrorCannotWrite() : KisImportExportComplexError(QFileDevice::FileError()) { } 0074 0075 KisImportExportErrorCannotWrite::KisImportExportErrorCannotWrite(QFileDevice::FileError error) : KisImportExportComplexError(error) { 0076 KIS_ASSERT_RECOVER_NOOP(error != QFileDevice::NoError); 0077 } 0078 0079 QString KisImportExportErrorCannotWrite::errorMessage() const 0080 { 0081 return i18n("Cannot open file for writing. Reason: %1", qtErrorMessage()); 0082 } 0083 0084 bool KisImportExportErrorCannotWrite::operator==(KisImportExportErrorCannotWrite other) 0085 { 0086 return other.m_error == m_error; 0087 } 0088 0089 0090 0091 0092 0093 KisImportExportErrorCode::KisImportExportErrorCode() 0094 : errorFieldUsed(None) 0095 , cannotRead() 0096 , cannotWrite() 0097 { } 0098 0099 KisImportExportErrorCode::KisImportExportErrorCode(ImportExportCodes::ErrorCodeID id) 0100 : errorFieldUsed(CodeId) 0101 , codeId(id) 0102 , cannotRead() 0103 , cannotWrite() 0104 { } 0105 0106 KisImportExportErrorCode::KisImportExportErrorCode(KisImportExportErrorCannotRead error) 0107 : errorFieldUsed(CannotRead) 0108 , codeId(ImportExportCodes::Failure) 0109 , cannotRead(error) 0110 , cannotWrite() 0111 { } 0112 0113 KisImportExportErrorCode::KisImportExportErrorCode(KisImportExportErrorCannotWrite error) 0114 : errorFieldUsed(CannotWrite) 0115 , codeId(ImportExportCodes::Failure) 0116 , cannotRead() 0117 , cannotWrite(error) 0118 { } 0119 0120 0121 bool KisImportExportErrorCode::isOk() const 0122 { 0123 // if cannotRead or cannotWrite is "NoError", it means that something is wrong in our code 0124 return errorFieldUsed == CodeId && codeId == ImportExportCodes::OK; 0125 } 0126 0127 bool KisImportExportErrorCode::isCancelled() const 0128 { 0129 return errorFieldUsed == CodeId && codeId == ImportExportCodes::Cancelled; 0130 } 0131 0132 bool KisImportExportErrorCode::isInternalError() const 0133 { 0134 return errorFieldUsed == CodeId && codeId == ImportExportCodes::InternalError; 0135 } 0136 0137 QString KisImportExportErrorCode::errorMessage() const 0138 { 0139 QString internal = i18n("Unexpected error. Please contact developers."); 0140 if (errorFieldUsed == CannotRead) { 0141 return cannotRead.errorMessage(); 0142 } else if (errorFieldUsed == CannotWrite) { 0143 return cannotWrite.errorMessage(); 0144 } else if (errorFieldUsed == CodeId) { 0145 switch (codeId) { 0146 // Reading 0147 case ImportExportCodes::FileNotExist: 0148 return i18n("The file doesn't exist."); 0149 case ImportExportCodes::NoAccessToRead: 0150 return i18n("Permission denied: Krita is not allowed to read the file."); 0151 case ImportExportCodes::FileFormatIncorrect: 0152 return i18n("The file format cannot be parsed."); 0153 case ImportExportCodes::FormatFeaturesUnsupported: 0154 return i18n("The file format contains unsupported features."); 0155 case ImportExportCodes::FormatColorSpaceUnsupported: 0156 return i18n("The file format contains unsupported color space."); 0157 case ImportExportCodes::ErrorWhileReading: 0158 return i18n("Error occurred while reading from the file."); 0159 0160 // Writing 0161 case ImportExportCodes::CannotCreateFile: 0162 return i18n("The file cannot be created."); 0163 case ImportExportCodes::NoAccessToWrite: 0164 return i18n("Permission denied: Krita is not allowed to write to the file."); 0165 case ImportExportCodes::InsufficientMemory: 0166 return i18n("There is not enough disk space left to save the file."); 0167 case ImportExportCodes::ErrorWhileWriting: 0168 return i18n("Error occurred while writing to the file."); 0169 case ImportExportCodes::FileFormatNotSupported: 0170 return i18n("Krita does not support this file format."); 0171 0172 // Both 0173 case ImportExportCodes::Cancelled: 0174 return i18n("The action was cancelled by the user."); 0175 0176 // Other 0177 case ImportExportCodes::Failure: 0178 return i18n("Unknown error."); 0179 case ImportExportCodes::InternalError: 0180 return internal; 0181 case ImportExportCodes::Busy: 0182 return i18n("Image is busy."); 0183 // OK 0184 case ImportExportCodes::OK: 0185 return i18n("The action has been completed successfully."); 0186 default: 0187 return internal; 0188 0189 } 0190 } 0191 return internal; // errorFieldUsed = None 0192 } 0193 0194 0195 0196 bool KisImportExportErrorCode::operator==(KisImportExportErrorCode errorCode) 0197 { 0198 if (errorFieldUsed != errorCode.errorFieldUsed) { 0199 return false; 0200 } 0201 if (errorFieldUsed == CodeId) { 0202 return codeId == errorCode.codeId; 0203 } 0204 if (errorFieldUsed == CannotRead) { 0205 return cannotRead == errorCode.cannotRead; 0206 } 0207 return cannotWrite == errorCode.cannotWrite; 0208 }