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 }