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"