File indexing completed on 2023-10-03 03:19:55
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