File indexing completed on 2024-04-28 08:49:46

0001 /*
0002  * SPDX-FileCopyrightText: 2022 Kai Uwe Broulik <kde@broulik.de>
0003  * SPDX-License-Identifier: GPL-2.0-or-later
0004  */
0005 
0006 #include "afcutils.h"
0007 
0008 #include "afc_debug.h"
0009 
0010 #include <KLocalizedString>
0011 
0012 using namespace KIO;
0013 
0014 WorkerResult AfcUtils::Result::from(const afc_error_t afcError, const QString &errorText)
0015 {
0016     switch (afcError) {
0017     case AFC_E_SUCCESS:
0018     case AFC_E_END_OF_DATA:
0019         return WorkerResult::pass();
0020 
0021     case AFC_E_UNKNOWN_ERROR:
0022         return WorkerResult::fail(ERR_UNKNOWN, errorText);
0023 
0024     case AFC_E_NO_RESOURCES:
0025     case AFC_E_NO_MEM:
0026         return WorkerResult::fail(ERR_OUT_OF_MEMORY, errorText);
0027 
0028     case AFC_E_READ_ERROR:
0029         return WorkerResult::fail(ERR_CANNOT_READ, errorText);
0030     case AFC_E_WRITE_ERROR:
0031         return WorkerResult::fail(ERR_CANNOT_WRITE, errorText);
0032     case AFC_E_OBJECT_NOT_FOUND:
0033         return WorkerResult::fail(ERR_DOES_NOT_EXIST, errorText);
0034     case AFC_E_OBJECT_IS_DIR:
0035         return WorkerResult::fail(ERR_IS_DIRECTORY, errorText);
0036     case AFC_E_PERM_DENIED:
0037         return WorkerResult::fail(ERR_ACCESS_DENIED, errorText);
0038     case AFC_E_SERVICE_NOT_CONNECTED:
0039         return WorkerResult::fail(ERR_CONNECTION_BROKEN, errorText);
0040     case AFC_E_OP_TIMEOUT:
0041         return WorkerResult::fail(ERR_SERVER_TIMEOUT, errorText);
0042     case AFC_E_OP_NOT_SUPPORTED:
0043         return WorkerResult::fail(ERR_UNSUPPORTED_ACTION, errorText);
0044     case AFC_E_OBJECT_EXISTS:
0045         return WorkerResult::fail(ERR_FILE_ALREADY_EXIST, errorText);
0046     case AFC_E_NO_SPACE_LEFT:
0047         return WorkerResult::fail(ERR_DISK_FULL, errorText);
0048     case AFC_E_IO_ERROR:
0049         return WorkerResult::fail(ERR_CONNECTION_BROKEN, errorText);
0050     case AFC_E_INTERNAL_ERROR:
0051         return WorkerResult::fail(ERR_INTERNAL_SERVER, errorText);
0052     case AFC_E_DIR_NOT_EMPTY:
0053         return WorkerResult::fail(ERR_CANNOT_RMDIR, errorText);
0054     case AFC_E_MUX_ERROR:
0055         return WorkerResult::fail(ERR_CANNOT_CONNECT, errorText);
0056         //    case AFC_E_NOT_ENOUGH_DATA:
0057         //        return WorkerResult::fail(ERR_UNKNOWN_INTERRUPT, errorText);
0058     default:
0059         qCWarning(KIO_AFC_LOG) << "Unhandled afc_error_t" << afcError;
0060         return WorkerResult::fail(ERR_INTERNAL, i18n("Unhandled AFC error code '%1'", afcError));
0061     }
0062 }
0063 
0064 WorkerResult AfcUtils::Result::from(const house_arrest_error_t houseArrestError, const QString &errorText)
0065 {
0066     switch (houseArrestError) {
0067     case HOUSE_ARREST_E_SUCCESS:
0068         return WorkerResult::pass();
0069     case HOUSE_ARREST_E_CONN_FAILED:
0070         return WorkerResult::fail(ERR_CANNOT_CONNECT, errorText);
0071     default:
0072         qCWarning(KIO_AFC_LOG) << "Unhandled house_arrest_error_t" << houseArrestError;
0073         return WorkerResult::fail(ERR_INTERNAL, i18n("Unhandled housearrest error code '%1'", houseArrestError));
0074     }
0075 }
0076 
0077 WorkerResult AfcUtils::Result::from(const instproxy_error_t instProxyError, const QString &errorText)
0078 {
0079     switch (instProxyError) {
0080     case INSTPROXY_E_SUCCESS:
0081         return WorkerResult::pass();
0082     case INSTPROXY_E_CONN_FAILED:
0083         return WorkerResult::fail(ERR_CANNOT_CONNECT, errorText);
0084     case INSTPROXY_E_RECEIVE_TIMEOUT:
0085         return WorkerResult::fail(ERR_SERVER_TIMEOUT, errorText);
0086     // We don't actually manage any apps (yet?), so most error codes don't apply to us
0087     default:
0088         qCWarning(KIO_AFC_LOG) << "Unhandled instproxy_error_t" << instProxyError;
0089         return WorkerResult::fail(ERR_INTERNAL, i18n("Unhandled instproxy error code '%1'", instProxyError));
0090     }
0091 }
0092 
0093 WorkerResult AfcUtils::Result::from(const lockdownd_error_t lockdownError, const QString &errorText)
0094 {
0095     switch (lockdownError) {
0096     case LOCKDOWN_E_SUCCESS:
0097         return WorkerResult::pass();
0098     case LOCKDOWN_E_RECEIVE_TIMEOUT:
0099         return WorkerResult::fail(ERR_SERVER_TIMEOUT, errorText);
0100     case LOCKDOWN_E_MUX_ERROR:
0101         return WorkerResult::fail(ERR_CANNOT_CONNECT, errorText);
0102     case LOCKDOWN_E_PASSWORD_PROTECTED: {
0103         QString text = errorText;
0104         if (text.isEmpty()) {
0105             text = i18n("The device is locked. Please enter the passcode on the device and try again.");
0106         }
0107         return WorkerResult::fail(ERR_WORKER_DEFINED, text);
0108     }
0109     case LOCKDOWN_E_USER_DENIED_PAIRING: {
0110         QString text = errorText;
0111         if (text.isEmpty()) {
0112             text = i18n("You have denied this computer access to the device.");
0113         }
0114         return WorkerResult::fail(ERR_WORKER_DEFINED, text);
0115     }
0116     case LOCKDOWN_E_PAIRING_DIALOG_RESPONSE_PENDING: {
0117         QString text = errorText;
0118         if (text.isEmpty()) {
0119             text = i18n("You need to allow this computer to access the device. Please accept the prompt on the device and try again.");
0120         }
0121         return WorkerResult::fail(ERR_WORKER_DEFINED, text);
0122     }
0123     // lockdownd_client_new_with_handshake returns this when pairing failed rather than any of the errors above
0124     case LOCKDOWN_E_INVALID_HOST_ID: {
0125         QString text = errorText;
0126         if (text.isEmpty()) {
0127             text = i18n("Cannot access the device. Make sure it is unlocked and allows this computer to access it.");
0128         }
0129         return WorkerResult::fail(ERR_WORKER_DEFINED, text);
0130     }
0131     // TODO LOCKDOWN_E_SESSION_INACTIVE
0132     default:
0133         qCWarning(KIO_AFC_LOG) << "Unhandled lockdownd_error_t" << lockdownError;
0134         return WorkerResult::fail(ERR_INTERNAL, i18n("Unhandled lockdownd code '%1'", lockdownError));
0135     }
0136 }
0137 
0138 WorkerResult AfcUtils::Result::from(const sbservices_error_t springBoardError, const QString &errorText)
0139 {
0140     switch (springBoardError) {
0141     case SBSERVICES_E_SUCCESS:
0142         return WorkerResult::pass();
0143     case SBSERVICES_E_CONN_FAILED:
0144         return WorkerResult::fail(ERR_CANNOT_CONNECT, errorText);
0145     default:
0146         qCWarning(KIO_AFC_LOG) << "Unhandled sbservices_error_t" << springBoardError;
0147         return WorkerResult::fail(ERR_INTERNAL, i18n("Unhandled sbservices code '%1'", springBoardError));
0148     }
0149 }