File indexing completed on 2024-04-28 03:53:55

0001 /*
0002     SPDX-FileCopyrightText: 2016 Sandro Knauß <sknauss@kde.org>
0003 
0004     SPDX-License-Identifier: LGPL-2.0-or-later
0005 */
0006 
0007 #include "daverror.h"
0008 #include <KLocalizedString>
0009 
0010 #include <KIO/Global>
0011 #include <KIO/Job>
0012 
0013 using namespace KDAV;
0014 
0015 namespace KDAV
0016 {
0017 class ErrorPrivate : public QSharedData
0018 {
0019 public:
0020     ErrorNumber mErrorNumber = NO_ERR;
0021     int mResponseCode = 0;
0022     int mJobErrorCode = 0;
0023     QString mErrorText;
0024 };
0025 }
0026 
0027 Error::Error()
0028     : d(new ErrorPrivate)
0029 {
0030 }
0031 
0032 Error::Error(ErrorNumber errNo, int responseCode, const QString &errorText, int jobErrorCode)
0033     : d(new ErrorPrivate)
0034 {
0035     d->mErrorNumber = errNo;
0036     d->mResponseCode = responseCode;
0037     d->mErrorText = errorText;
0038     d->mJobErrorCode = jobErrorCode;
0039 }
0040 
0041 Error::Error(const Error &) = default;
0042 Error::Error(Error &&) = default;
0043 Error::~Error() = default;
0044 Error &Error::operator=(const Error &) = default;
0045 Error &Error::operator=(Error &&) = default;
0046 
0047 ErrorNumber Error::errorNumber() const
0048 {
0049     return d->mErrorNumber;
0050 }
0051 
0052 QString Error::internalErrorText() const
0053 {
0054     return d->mErrorText;
0055 }
0056 
0057 int Error::jobErrorCode() const
0058 {
0059     return d->mJobErrorCode;
0060 }
0061 
0062 int Error::responseCode() const
0063 {
0064     return d->mResponseCode;
0065 }
0066 
0067 QString KDAV::Error::translatedJobError() const
0068 {
0069     QString err;
0070     if (d->mJobErrorCode > 0 && d->mJobErrorCode != KIO::ERR_WORKER_DEFINED) {
0071         err = KIO::buildErrorString(d->mJobErrorCode, d->mErrorText);
0072     } else {
0073         err = d->mErrorText;
0074     }
0075     return err;
0076 }
0077 
0078 QString Error::errorText() const
0079 {
0080     QString result;
0081 
0082     QString err = translatedJobError();
0083 
0084     switch (d->mErrorNumber) {
0085     case ERR_PROBLEM_WITH_REQUEST:
0086         // User-side error
0087         if (d->mResponseCode == 401) {
0088             err = i18n("Invalid username/password");
0089         } else if (d->mResponseCode == 403) {
0090             err = i18n("Access forbidden");
0091         } else if (d->mResponseCode == 404) {
0092             err = i18n("Resource not found");
0093         } else {
0094             err = i18n("HTTP error");
0095         }
0096         result = i18n("There was a problem with the request.\n%1 (%2).", err, d->mResponseCode);
0097         break;
0098     case ERR_NO_MULTIGET:
0099         result = i18n("Protocol for the collection does not support MULTIGET");
0100         break;
0101     case ERR_SERVER_UNRECOVERABLE:
0102         result = i18n("The server encountered an error that prevented it from completing your request: %1 (%2)", err, d->mResponseCode);
0103         break;
0104     case ERR_COLLECTIONDELETE:
0105         result = i18n("There was a problem with the request. The collection has not been deleted from the server.\n%1 (%2).", err, d->mResponseCode);
0106         break;
0107     case ERR_COLLECTIONFETCH:
0108         result = i18n("Invalid responses from backend");
0109         break;
0110     case ERR_COLLECTIONFETCH_XQUERY_SETFOCUS:
0111         result = i18n("Error setting focus for XQuery");
0112         break;
0113     case ERR_COLLECTIONFETCH_XQUERY_INVALID:
0114         result = i18n("Invalid XQuery submitted by DAV implementation");
0115         break;
0116     case ERR_COLLECTIONMODIFY:
0117         result = i18n(
0118             "There was a problem with the request. The collection has not been modified on the server.\n"
0119             "%1 (%2).",
0120             err,
0121             d->mResponseCode);
0122         break;
0123     case ERR_COLLECTIONMODIFY_NO_PROPERITES:
0124         result = i18n("No properties to change or remove");
0125         break;
0126     case ERR_COLLECTIONMODIFY_RESPONSE:
0127         result = i18n("There was an error when modifying the properties");
0128         if (!d->mErrorText.isEmpty()) {
0129             result.append(i18n("\nThe server returned more information:\n%1", d->mErrorText));
0130         }
0131         break;
0132     case ERR_ITEMCREATE:
0133         result = i18n("There was a problem with the request. The item has not been created on the server.\n%1 (%2).", err, d->mResponseCode);
0134         break;
0135     case ERR_ITEMDELETE:
0136         result = i18n("There was a problem with the request. The item has not been deleted from the server.\n%1 (%2).", err, d->mResponseCode);
0137         break;
0138     case ERR_ITEMMODIFY:
0139         result = i18n("There was a problem with the request. The item was not modified on the server.\n%1 (%2).", err, d->mResponseCode);
0140         break;
0141     case ERR_ITEMLIST: {
0142         result = i18n("There was a problem with the request.");
0143         break;
0144     };
0145     case ERR_ITEMLIST_NOMIMETYPE:
0146         result = i18n("There was a problem with the request. The requested MIME types are not supported.");
0147         break;
0148     case NO_ERR:
0149         break;
0150     }
0151     return result;
0152 }