File indexing completed on 2024-05-05 16:13:28

0001 /*
0002     SPDX-License-Identifier: LGPL-2.0-or-later
0003     SPDX-FileCopyrightText: 2000 Waldo Bastian <bastian@kde.org>
0004     SPDX-FileCopyrightText: 2000 David Faure <faure@kde.org>
0005     SPDX-FileCopyrightText: 2000 Stephan Kulow <coolo@kde.org>
0006     SPDX-FileCopyrightText: 2007 Thiago Macieira <thiago@kde.org>
0007     SPDX-FileCopyrightText: 2019-2022 Harald Sitter <sitter@kde.org>
0008 */
0009 
0010 #include "workerbase.h"
0011 #include "workerbase_p.h"
0012 
0013 #include <commands_p.h>
0014 
0015 namespace KIO
0016 {
0017 
0018 WorkerBase::WorkerBase(const QByteArray &protocol, const QByteArray &poolSocket, const QByteArray &appSocket)
0019     : d(new WorkerBasePrivate(protocol, poolSocket, appSocket, this))
0020 {
0021 }
0022 
0023 WorkerBase::~WorkerBase() = default;
0024 
0025 void WorkerBase::dispatchLoop()
0026 {
0027     d->bridge.dispatchLoop();
0028 }
0029 
0030 void WorkerBase::connectWorker(const QString &address)
0031 {
0032     d->bridge.connectSlave(address);
0033 }
0034 
0035 void WorkerBase::disconnectWorker()
0036 {
0037     d->bridge.disconnectSlave();
0038 }
0039 
0040 void WorkerBase::setMetaData(const QString &key, const QString &value)
0041 {
0042     d->bridge.setMetaData(key, value);
0043 }
0044 
0045 QString WorkerBase::metaData(const QString &key) const
0046 {
0047     return d->bridge.metaData(key);
0048 }
0049 
0050 MetaData WorkerBase::allMetaData() const
0051 {
0052     return d->bridge.allMetaData();
0053 }
0054 
0055 bool WorkerBase::hasMetaData(const QString &key) const
0056 {
0057     return d->bridge.hasMetaData(key);
0058 }
0059 
0060 QMap<QString, QVariant> WorkerBase::mapConfig() const
0061 {
0062     return d->bridge.mapConfig();
0063 }
0064 
0065 bool WorkerBase::configValue(const QString &key, bool defaultValue) const
0066 {
0067     return d->bridge.configValue(key, defaultValue);
0068 }
0069 
0070 int WorkerBase::configValue(const QString &key, int defaultValue) const
0071 {
0072     return d->bridge.configValue(key, defaultValue);
0073 }
0074 
0075 QString WorkerBase::configValue(const QString &key, const QString &defaultValue) const
0076 {
0077     return d->bridge.configValue(key, defaultValue);
0078 }
0079 
0080 KConfigGroup *WorkerBase::config()
0081 {
0082     return d->bridge.config();
0083 }
0084 
0085 void WorkerBase::sendMetaData()
0086 {
0087     d->bridge.sendMetaData();
0088 }
0089 
0090 void WorkerBase::sendAndKeepMetaData()
0091 {
0092     d->bridge.sendAndKeepMetaData();
0093 }
0094 
0095 KRemoteEncoding *WorkerBase::remoteEncoding()
0096 {
0097     return d->bridge.remoteEncoding();
0098 }
0099 
0100 void WorkerBase::data(const QByteArray &data)
0101 {
0102     d->bridge.data(data);
0103 }
0104 
0105 void WorkerBase::dataReq()
0106 {
0107     d->bridge.dataReq();
0108 }
0109 
0110 #if KIOCORE_BUILD_DEPRECATED_SINCE(5, 103)
0111 void WorkerBase::needSubUrlData()
0112 {
0113     d->bridge.needSubUrlData();
0114 }
0115 #endif
0116 
0117 void WorkerBase::workerStatus(const QString &host, bool connected)
0118 {
0119     d->bridge.slaveStatus(host, connected);
0120 }
0121 
0122 void WorkerBase::canResume()
0123 {
0124     d->bridge.canResume();
0125 }
0126 
0127 void WorkerBase::totalSize(KIO::filesize_t _bytes)
0128 {
0129     d->bridge.totalSize(_bytes);
0130 }
0131 
0132 void WorkerBase::processedSize(KIO::filesize_t _bytes)
0133 {
0134     d->bridge.processedSize(_bytes);
0135 }
0136 
0137 void WorkerBase::written(KIO::filesize_t _bytes)
0138 {
0139     d->bridge.written(_bytes);
0140 }
0141 
0142 void WorkerBase::position(KIO::filesize_t _pos)
0143 {
0144     d->bridge.position(_pos);
0145 }
0146 
0147 void WorkerBase::truncated(KIO::filesize_t _length)
0148 {
0149     d->bridge.truncated(_length);
0150 }
0151 
0152 void WorkerBase::speed(unsigned long _bytes_per_second)
0153 {
0154     d->bridge.speed(_bytes_per_second);
0155 }
0156 
0157 void WorkerBase::redirection(const QUrl &_url)
0158 {
0159     d->bridge.redirection(_url);
0160 }
0161 
0162 void WorkerBase::errorPage()
0163 {
0164     d->bridge.errorPage();
0165 }
0166 
0167 void WorkerBase::mimeType(const QString &_type)
0168 {
0169     d->bridge.mimeType(_type);
0170 }
0171 
0172 void WorkerBase::exit()
0173 {
0174     d->bridge.exit();
0175 }
0176 
0177 void WorkerBase::warning(const QString &_msg)
0178 {
0179     d->bridge.warning(_msg);
0180 }
0181 
0182 void WorkerBase::infoMessage(const QString &_msg)
0183 {
0184     d->bridge.infoMessage(_msg);
0185 }
0186 
0187 void WorkerBase::statEntry(const UDSEntry &entry)
0188 {
0189     d->bridge.statEntry(entry);
0190 }
0191 
0192 void WorkerBase::listEntry(const UDSEntry &entry)
0193 {
0194     d->bridge.listEntry(entry);
0195 }
0196 
0197 void WorkerBase::listEntries(const UDSEntryList &list)
0198 {
0199     d->bridge.listEntries(list);
0200 }
0201 
0202 void WorkerBase::appConnectionMade()
0203 {
0204 } // No response!
0205 
0206 void WorkerBase::setHost(QString const &, quint16, QString const &, QString const &)
0207 {
0208 } // No response!
0209 
0210 WorkerResult WorkerBase::openConnection()
0211 {
0212     return WorkerResult::fail(ERR_UNSUPPORTED_ACTION, unsupportedActionErrorString(d->protocolName(), CMD_CONNECT));
0213 }
0214 
0215 void WorkerBase::closeConnection()
0216 {
0217 } // No response!
0218 
0219 WorkerResult WorkerBase::stat(QUrl const &)
0220 {
0221     return WorkerResult::fail(ERR_UNSUPPORTED_ACTION, unsupportedActionErrorString(d->protocolName(), CMD_STAT));
0222 }
0223 
0224 WorkerResult WorkerBase::put(QUrl const &, int, JobFlags)
0225 {
0226     return WorkerResult::fail(ERR_UNSUPPORTED_ACTION, unsupportedActionErrorString(d->protocolName(), CMD_PUT));
0227 }
0228 
0229 WorkerResult WorkerBase::special(const QByteArray &)
0230 {
0231     return WorkerResult::fail(ERR_UNSUPPORTED_ACTION, unsupportedActionErrorString(d->protocolName(), CMD_SPECIAL));
0232 }
0233 
0234 WorkerResult WorkerBase::listDir(QUrl const &)
0235 {
0236     return WorkerResult::fail(ERR_UNSUPPORTED_ACTION, unsupportedActionErrorString(d->protocolName(), CMD_LISTDIR));
0237 }
0238 
0239 WorkerResult WorkerBase::get(QUrl const &)
0240 {
0241     return WorkerResult::fail(ERR_UNSUPPORTED_ACTION, unsupportedActionErrorString(d->protocolName(), CMD_GET));
0242 }
0243 
0244 WorkerResult WorkerBase::open(QUrl const &, QIODevice::OpenMode)
0245 {
0246     return WorkerResult::fail(ERR_UNSUPPORTED_ACTION, unsupportedActionErrorString(d->protocolName(), CMD_OPEN));
0247 }
0248 
0249 WorkerResult WorkerBase::read(KIO::filesize_t)
0250 {
0251     return WorkerResult::fail(ERR_UNSUPPORTED_ACTION, unsupportedActionErrorString(d->protocolName(), CMD_READ));
0252 }
0253 
0254 WorkerResult WorkerBase::write(const QByteArray &)
0255 {
0256     return WorkerResult::fail(ERR_UNSUPPORTED_ACTION, unsupportedActionErrorString(d->protocolName(), CMD_WRITE));
0257 }
0258 
0259 WorkerResult WorkerBase::seek(KIO::filesize_t)
0260 {
0261     return WorkerResult::fail(ERR_UNSUPPORTED_ACTION, unsupportedActionErrorString(d->protocolName(), CMD_SEEK));
0262 }
0263 
0264 WorkerResult WorkerBase::truncate(KIO::filesize_t)
0265 {
0266     return WorkerResult::fail(ERR_UNSUPPORTED_ACTION, unsupportedActionErrorString(d->protocolName(), CMD_TRUNCATE));
0267 }
0268 
0269 WorkerResult WorkerBase::close()
0270 {
0271     return WorkerResult::fail(ERR_UNSUPPORTED_ACTION, unsupportedActionErrorString(d->protocolName(), CMD_CLOSE));
0272 }
0273 
0274 WorkerResult WorkerBase::mimetype(QUrl const &url)
0275 {
0276     return get(url);
0277 }
0278 
0279 WorkerResult WorkerBase::rename(QUrl const &, QUrl const &, JobFlags)
0280 {
0281     return WorkerResult::fail(ERR_UNSUPPORTED_ACTION, unsupportedActionErrorString(d->protocolName(), CMD_RENAME));
0282 }
0283 
0284 WorkerResult WorkerBase::symlink(QString const &, QUrl const &, JobFlags)
0285 {
0286     return WorkerResult::fail(ERR_UNSUPPORTED_ACTION, unsupportedActionErrorString(d->protocolName(), CMD_SYMLINK));
0287 }
0288 
0289 WorkerResult WorkerBase::copy(QUrl const &, QUrl const &, int, JobFlags)
0290 {
0291     return WorkerResult::fail(ERR_UNSUPPORTED_ACTION, unsupportedActionErrorString(d->protocolName(), CMD_COPY));
0292 }
0293 
0294 WorkerResult WorkerBase::del(QUrl const &, bool)
0295 {
0296     return WorkerResult::fail(ERR_UNSUPPORTED_ACTION, unsupportedActionErrorString(d->protocolName(), CMD_DEL));
0297 }
0298 
0299 WorkerResult WorkerBase::mkdir(QUrl const &, int)
0300 {
0301     return WorkerResult::fail(ERR_UNSUPPORTED_ACTION, unsupportedActionErrorString(d->protocolName(), CMD_MKDIR));
0302 }
0303 
0304 WorkerResult WorkerBase::chmod(QUrl const &, int)
0305 {
0306     return WorkerResult::fail(ERR_UNSUPPORTED_ACTION, unsupportedActionErrorString(d->protocolName(), CMD_CHMOD));
0307 }
0308 
0309 WorkerResult WorkerBase::setModificationTime(QUrl const &, const QDateTime &)
0310 {
0311     return WorkerResult::fail(ERR_UNSUPPORTED_ACTION, unsupportedActionErrorString(d->protocolName(), CMD_SETMODIFICATIONTIME));
0312 }
0313 
0314 WorkerResult WorkerBase::chown(QUrl const &, const QString &, const QString &)
0315 {
0316     return WorkerResult::fail(ERR_UNSUPPORTED_ACTION, unsupportedActionErrorString(d->protocolName(), CMD_CHOWN));
0317 }
0318 
0319 WorkerResult WorkerBase::multiGet(const QByteArray &)
0320 {
0321     return WorkerResult::fail(ERR_UNSUPPORTED_ACTION, unsupportedActionErrorString(d->protocolName(), CMD_MULTI_GET));
0322 }
0323 
0324 WorkerResult WorkerBase::fileSystemFreeSpace(const QUrl &)
0325 {
0326     return WorkerResult::fail(ERR_UNSUPPORTED_ACTION, unsupportedActionErrorString(d->protocolName(), CMD_FILESYSTEMFREESPACE));
0327 }
0328 
0329 void WorkerBase::worker_status()
0330 {
0331     workerStatus(QString(), false);
0332 }
0333 
0334 void WorkerBase::reparseConfiguration()
0335 {
0336     // base implementation called by bridge
0337 }
0338 
0339 int WorkerBase::openPasswordDialog(AuthInfo &info, const QString &errorMsg)
0340 {
0341     return d->bridge.openPasswordDialogV2(info, errorMsg);
0342 }
0343 
0344 int WorkerBase::messageBox(MessageBoxType type, const QString &text, const QString &title, const QString &primaryActionText, const QString &secondaryActionText)
0345 {
0346     return messageBox(text, type, title, primaryActionText, secondaryActionText, QString());
0347 }
0348 
0349 int WorkerBase::messageBox(const QString &text,
0350                            MessageBoxType type,
0351                            const QString &title,
0352                            const QString &primaryActionText,
0353                            const QString &secondaryActionText,
0354                            const QString &dontAskAgainName)
0355 {
0356     return d->bridge.messageBox(text, static_cast<SlaveBase::MessageBoxType>(type), title, primaryActionText, secondaryActionText, dontAskAgainName);
0357 }
0358 
0359 bool WorkerBase::canResume(KIO::filesize_t offset)
0360 {
0361     return d->bridge.canResume(offset);
0362 }
0363 
0364 int WorkerBase::waitForAnswer(int expected1, int expected2, QByteArray &data, int *pCmd)
0365 {
0366     return d->bridge.waitForAnswer(expected1, expected2, data, pCmd);
0367 }
0368 
0369 int WorkerBase::readData(QByteArray &buffer)
0370 {
0371     return d->bridge.readData(buffer);
0372 }
0373 
0374 void WorkerBase::setTimeoutSpecialCommand(int timeout, const QByteArray &data)
0375 {
0376     d->bridge.setTimeoutSpecialCommand(timeout, data);
0377 }
0378 
0379 bool WorkerBase::checkCachedAuthentication(AuthInfo &info)
0380 {
0381     return d->bridge.checkCachedAuthentication(info);
0382 }
0383 
0384 bool WorkerBase::cacheAuthentication(const AuthInfo &info)
0385 {
0386     return d->bridge.cacheAuthentication(info);
0387 }
0388 
0389 int WorkerBase::connectTimeout()
0390 {
0391     return d->bridge.connectTimeout();
0392 }
0393 
0394 int WorkerBase::proxyConnectTimeout()
0395 {
0396     return d->bridge.proxyConnectTimeout();
0397 }
0398 
0399 int WorkerBase::responseTimeout()
0400 {
0401     return d->bridge.responseTimeout();
0402 }
0403 
0404 int WorkerBase::readTimeout()
0405 {
0406     return d->bridge.readTimeout();
0407 }
0408 
0409 bool WorkerBase::wasKilled() const
0410 {
0411     return d->bridge.wasKilled();
0412 }
0413 
0414 void WorkerBase::lookupHost(const QString &host)
0415 {
0416     return d->bridge.lookupHost(host);
0417 }
0418 
0419 int WorkerBase::waitForHostInfo(QHostInfo &info)
0420 {
0421     return d->bridge.waitForHostInfo(info);
0422 }
0423 
0424 PrivilegeOperationStatus WorkerBase::requestPrivilegeOperation(const QString &operationDetails)
0425 {
0426     return d->bridge.requestPrivilegeOperation(operationDetails);
0427 }
0428 
0429 void WorkerBase::addTemporaryAuthorization(const QString &action)
0430 {
0431     d->bridge.addTemporaryAuthorization(action);
0432 }
0433 
0434 class WorkerResultPrivate
0435 {
0436 public:
0437     bool success;
0438     int error;
0439     QString errorString;
0440 };
0441 
0442 WorkerResult::~WorkerResult() = default;
0443 
0444 WorkerResult::WorkerResult(const WorkerResult &rhs)
0445     : d(std::make_unique<WorkerResultPrivate>(*rhs.d))
0446 {
0447 }
0448 
0449 WorkerResult &WorkerResult::operator=(const WorkerResult &rhs)
0450 {
0451     if (this == &rhs) {
0452         return *this;
0453     }
0454     d = std::make_unique<WorkerResultPrivate>(*rhs.d);
0455     return *this;
0456 }
0457 
0458 WorkerResult::WorkerResult(WorkerResult &&) noexcept = default;
0459 WorkerResult &WorkerResult::operator=(WorkerResult &&) noexcept = default;
0460 
0461 bool WorkerResult::success() const
0462 {
0463     return d->success;
0464 }
0465 
0466 int WorkerResult::error() const
0467 {
0468     return d->error;
0469 }
0470 
0471 QString WorkerResult::errorString() const
0472 {
0473     return d->errorString;
0474 }
0475 
0476 Q_REQUIRED_RESULT WorkerResult WorkerResult::fail(int _error, const QString &_errorString)
0477 {
0478     return WorkerResult(std::make_unique<WorkerResultPrivate>(WorkerResultPrivate{false, _error, _errorString}));
0479 }
0480 
0481 Q_REQUIRED_RESULT WorkerResult WorkerResult::pass()
0482 {
0483     return WorkerResult(std::make_unique<WorkerResultPrivate>(WorkerResultPrivate{true, 0, QString()}));
0484 }
0485 
0486 WorkerResult::WorkerResult(std::unique_ptr<WorkerResultPrivate> &&dptr)
0487     : d(std::move(dptr))
0488 {
0489 }
0490 
0491 void WorkerBase::setIncomingMetaData(const KIO::MetaData &metaData)
0492 {
0493     d->bridge.setIncomingMetaData(metaData);
0494 }
0495 } // namespace KIO