File indexing completed on 2024-10-06 09:39:16
0001 /* 0002 This file is part of the KDE libraries 0003 SPDX-FileCopyrightText: 2006 Allan Sandfeld Jensen <kde@carewolf.com> 0004 0005 SPDX-License-Identifier: LGPL-2.0-only 0006 */ 0007 0008 #include "filejob.h" 0009 0010 #include "slave.h" 0011 0012 #include "job_p.h" 0013 0014 class KIO::FileJobPrivate : public KIO::SimpleJobPrivate 0015 { 0016 public: 0017 FileJobPrivate(const QUrl &url, const QByteArray &packedArgs) 0018 : SimpleJobPrivate(url, CMD_OPEN, packedArgs) 0019 , m_open(false) 0020 , m_size(0) 0021 { 0022 } 0023 0024 bool m_open; 0025 QString m_mimetype; 0026 KIO::filesize_t m_size; 0027 0028 void slotRedirection(const QUrl &url); 0029 void slotData(const QByteArray &data); 0030 void slotMimetype(const QString &mimetype); 0031 void slotOpen(); 0032 void slotWritten(KIO::filesize_t); 0033 void slotFinished(); 0034 void slotPosition(KIO::filesize_t); 0035 void slotTruncated(KIO::filesize_t); 0036 void slotTotalSize(KIO::filesize_t); 0037 0038 /** 0039 * @internal 0040 * Called by the scheduler when a @p slave gets to 0041 * work on this job. 0042 * @param slave the slave that starts working on this job 0043 */ 0044 void start(Slave *slave) override; 0045 0046 Q_DECLARE_PUBLIC(FileJob) 0047 0048 static inline FileJob *newJob(const QUrl &url, const QByteArray &packedArgs) 0049 { 0050 FileJob *job = new FileJob(*new FileJobPrivate(url, packedArgs)); 0051 job->setUiDelegate(KIO::createDefaultJobUiDelegate()); 0052 return job; 0053 } 0054 }; 0055 0056 using namespace KIO; 0057 0058 FileJob::FileJob(FileJobPrivate &dd) 0059 : SimpleJob(dd) 0060 { 0061 } 0062 0063 FileJob::~FileJob() 0064 { 0065 } 0066 0067 void FileJob::read(KIO::filesize_t size) 0068 { 0069 Q_D(FileJob); 0070 if (!d->m_open) { 0071 return; 0072 } 0073 0074 KIO_ARGS << size; 0075 d->m_slave->send(CMD_READ, packedArgs); 0076 } 0077 0078 void FileJob::write(const QByteArray &_data) 0079 { 0080 Q_D(FileJob); 0081 if (!d->m_open) { 0082 return; 0083 } 0084 0085 d->m_slave->send(CMD_WRITE, _data); 0086 } 0087 0088 void FileJob::seek(KIO::filesize_t offset) 0089 { 0090 Q_D(FileJob); 0091 if (!d->m_open) { 0092 return; 0093 } 0094 0095 KIO_ARGS << KIO::filesize_t(offset); 0096 d->m_slave->send(CMD_SEEK, packedArgs); 0097 } 0098 0099 void FileJob::truncate(KIO::filesize_t length) 0100 { 0101 Q_D(FileJob); 0102 if (!d->m_open) { 0103 return; 0104 } 0105 0106 KIO_ARGS << KIO::filesize_t(length); 0107 d->m_slave->send(CMD_TRUNCATE, packedArgs); 0108 } 0109 0110 void FileJob::close() 0111 { 0112 Q_D(FileJob); 0113 if (!d->m_open) { 0114 return; 0115 } 0116 0117 d->m_slave->send(CMD_CLOSE); 0118 // ### close? 0119 } 0120 0121 KIO::filesize_t FileJob::size() 0122 { 0123 Q_D(FileJob); 0124 if (!d->m_open) { 0125 return 0; 0126 } 0127 0128 return d->m_size; 0129 } 0130 0131 // Slave sends data 0132 void FileJobPrivate::slotData(const QByteArray &_data) 0133 { 0134 Q_Q(FileJob); 0135 Q_EMIT q_func()->data(q, _data); 0136 } 0137 0138 void FileJobPrivate::slotRedirection(const QUrl &url) 0139 { 0140 Q_Q(FileJob); 0141 // qDebug() << url; 0142 Q_EMIT q->redirection(q, url); 0143 } 0144 0145 void FileJobPrivate::slotMimetype(const QString &type) 0146 { 0147 Q_Q(FileJob); 0148 m_mimetype = type; 0149 #if KIOCORE_BUILD_DEPRECATED_SINCE(5, 78) 0150 Q_EMIT q->mimetype(q, m_mimetype); 0151 #endif 0152 Q_EMIT q->mimeTypeFound(q, m_mimetype); 0153 } 0154 0155 void FileJobPrivate::slotPosition(KIO::filesize_t pos) 0156 { 0157 Q_Q(FileJob); 0158 Q_EMIT q->position(q, pos); 0159 } 0160 0161 void FileJobPrivate::slotTruncated(KIO::filesize_t length) 0162 { 0163 Q_Q(FileJob); 0164 Q_EMIT q->truncated(q, length); 0165 } 0166 0167 void FileJobPrivate::slotTotalSize(KIO::filesize_t t_size) 0168 { 0169 m_size = t_size; 0170 Q_Q(FileJob); 0171 q->setTotalAmount(KJob::Bytes, m_size); 0172 } 0173 0174 void FileJobPrivate::slotOpen() 0175 { 0176 Q_Q(FileJob); 0177 m_open = true; 0178 Q_EMIT q->open(q); 0179 } 0180 0181 void FileJobPrivate::slotWritten(KIO::filesize_t t_written) 0182 { 0183 Q_Q(FileJob); 0184 Q_EMIT q->written(q, t_written); 0185 } 0186 0187 void FileJobPrivate::slotFinished() 0188 { 0189 Q_Q(FileJob); 0190 // qDebug() << this << m_url; 0191 m_open = false; 0192 0193 #if KIOCORE_BUILD_DEPRECATED_SINCE(5, 79) 0194 Q_EMIT q->close(q); 0195 #endif 0196 Q_EMIT q->fileClosed(q); 0197 0198 // Return slave to the scheduler 0199 slaveDone(); 0200 // Scheduler::doJob(this); 0201 q->emitResult(); 0202 } 0203 0204 void FileJobPrivate::start(Slave *slave) 0205 { 0206 Q_Q(FileJob); 0207 q->connect(slave, &KIO::SlaveInterface::data, q, [this](const QByteArray &ba) { 0208 slotData(ba); 0209 }); 0210 0211 q->connect(slave, &KIO::SlaveInterface::redirection, q, [this](const QUrl &url) { 0212 slotRedirection(url); 0213 }); 0214 0215 q->connect(slave, &KIO::SlaveInterface::mimeType, q, [this](const QString &mimeType) { 0216 slotMimetype(mimeType); 0217 }); 0218 0219 q->connect(slave, &KIO::SlaveInterface::open, q, [this]() { 0220 slotOpen(); 0221 }); 0222 0223 q->connect(slave, &KIO::SlaveInterface::finished, q, [this]() { 0224 slotFinished(); 0225 }); 0226 0227 q->connect(slave, &KIO::SlaveInterface::position, q, [this](KIO::filesize_t pos) { 0228 slotPosition(pos); 0229 }); 0230 0231 q->connect(slave, &KIO::SlaveInterface::truncated, q, [this](KIO::filesize_t length) { 0232 slotTruncated(length); 0233 }); 0234 0235 q->connect(slave, &KIO::SlaveInterface::written, q, [this](KIO::filesize_t dataWritten) { 0236 slotWritten(dataWritten); 0237 }); 0238 0239 q->connect(slave, &KIO::SlaveInterface::totalSize, q, [this](KIO::filesize_t size) { 0240 slotTotalSize(size); 0241 }); 0242 0243 SimpleJobPrivate::start(slave); 0244 } 0245 0246 FileJob *KIO::open(const QUrl &url, QIODevice::OpenMode mode) 0247 { 0248 // Send decoded path and encoded query 0249 KIO_ARGS << url << mode; 0250 return FileJobPrivate::newJob(url, packedArgs); 0251 } 0252 0253 #include "moc_filejob.cpp"