File indexing completed on 2024-04-28 15:26:19

0001 /*
0002     This file is part of the KDE libraries
0003     SPDX-FileCopyrightText: 1999 Waldo Bastian <bastian@kde.org>
0004     SPDX-FileCopyrightText: 2013 David Faure <faure@kde.org>
0005 
0006     SPDX-License-Identifier: LGPL-2.0-only
0007 */
0008 
0009 #include "idleslave.h"
0010 #include "commands_p.h" // CMD_*
0011 #include "connection_p.h"
0012 #include "slaveinterface.h" // MSG_*
0013 
0014 #include <QDataStream>
0015 
0016 #if KIOCORE_BUILD_DEPRECATED_SINCE(5, 101)
0017 
0018 using namespace KIO;
0019 
0020 class KIO::IdleSlavePrivate
0021 {
0022 public:
0023     KIO::Connection mConn;
0024     QString mProtocol;
0025     QString mHost;
0026     bool mConnected;
0027     qint64 mPid;
0028     QDateTime mBirthDate;
0029     bool mOnHold;
0030     QUrl mUrl;
0031     bool mHasTempAuth;
0032 };
0033 
0034 IdleSlave::IdleSlave(QObject *parent)
0035     : QObject(parent)
0036     , d(new IdleSlavePrivate)
0037 {
0038     QObject::connect(&d->mConn, &Connection::readyRead, this, &IdleSlave::gotInput);
0039     // Send it a SLAVE_STATUS command.
0040     d->mConn.send(CMD_SLAVE_STATUS);
0041     d->mPid = 0;
0042     d->mBirthDate = QDateTime::currentDateTime();
0043     d->mOnHold = false;
0044     d->mHasTempAuth = false;
0045 }
0046 
0047 IdleSlave::~IdleSlave()
0048 {
0049 }
0050 
0051 void IdleSlave::gotInput()
0052 {
0053     int cmd;
0054     QByteArray data;
0055     if (d->mConn.read(&cmd, data) == -1) {
0056         // Communication problem with slave.
0057         // qCritical() << "No communication with KIO slave.";
0058         deleteLater();
0059     } else if (cmd == MSG_SLAVE_ACK) {
0060         deleteLater();
0061     } else if (cmd != MSG_SLAVE_STATUS_V2
0062 #if KIOCORE_BUILD_DEPRECATED_SINCE(5, 45)
0063                && cmd != MSG_SLAVE_STATUS
0064 #endif
0065     ) {
0066         qCritical() << "Unexpected data from KIO worker.";
0067         deleteLater();
0068     } else {
0069         QDataStream stream(data);
0070         qint64 pid;
0071         QByteArray protocol;
0072         QString host;
0073         qint8 b;
0074         // Overload with (bool) onHold, (QUrl) url.
0075         stream >> pid >> protocol >> host >> b;
0076         if (cmd == MSG_SLAVE_STATUS_V2) {
0077             QUrl url;
0078             bool onHold;
0079             bool tempAuth;
0080             stream >> onHold >> url >> tempAuth;
0081             d->mHasTempAuth = tempAuth;
0082             if (onHold) {
0083                 d->mOnHold = onHold;
0084                 d->mUrl = url;
0085             }
0086         } else { // compat code for KF < 5.45. TODO KF6: remove
0087             if (!stream.atEnd()) {
0088                 QUrl url;
0089                 stream >> url;
0090                 d->mOnHold = true;
0091                 d->mUrl = url;
0092             }
0093         }
0094         d->mPid = pid;
0095         d->mConnected = (b != 0);
0096         d->mProtocol = QString::fromLatin1(protocol);
0097         d->mHost = host;
0098         Q_EMIT statusUpdate(this);
0099     }
0100 }
0101 
0102 void IdleSlave::connect(const QString &app_socket)
0103 {
0104     QByteArray data;
0105     QDataStream stream(&data, QIODevice::WriteOnly);
0106     stream << app_socket;
0107     d->mConn.send(CMD_SLAVE_CONNECT, data);
0108     // Timeout!
0109 }
0110 
0111 qint64 IdleSlave::pid() const
0112 {
0113     return d->mPid;
0114 }
0115 
0116 void IdleSlave::reparseConfiguration()
0117 {
0118     d->mConn.send(CMD_REPARSECONFIGURATION);
0119 }
0120 
0121 bool IdleSlave::match(const QString &protocol, const QString &host, bool needConnected) const
0122 {
0123     if (d->mOnHold || protocol != d->mProtocol) {
0124         return false;
0125     }
0126     if (host.isEmpty()) {
0127         return true;
0128     }
0129     return (host == d->mHost) && (!needConnected || d->mConnected);
0130 }
0131 
0132 bool IdleSlave::onHold(const QUrl &url) const
0133 {
0134     if (!d->mOnHold) {
0135         return false;
0136     }
0137     return (url == d->mUrl);
0138 }
0139 
0140 int IdleSlave::age(const QDateTime &now) const
0141 {
0142     return d->mBirthDate.secsTo(now);
0143 }
0144 
0145 QString IdleSlave::protocol() const
0146 {
0147     return d->mProtocol;
0148 }
0149 
0150 Connection *IdleSlave::connection() const
0151 {
0152     return &d->mConn;
0153 }
0154 
0155 bool IdleSlave::hasTempAuthorization() const
0156 {
0157     return d->mHasTempAuth;
0158 }
0159 
0160 #include "moc_idleslave.cpp"
0161 
0162 #endif