28 #include <sys/types.h>
41 #include <QtCore/QTimer>
42 #include <QtCore/QFile>
66 #define MAX_READ_BUF_SIZE (64 * 1024) // 64 KB at a time seems reasonable...
74 #define REPORT_TIMEOUT 200
108 SLOT(slotSpeed(
KJob*,ulong)));
110 if (
ui() && job->
ui()) {
127 qMakePair(
i18nc(
"The source of a file operation",
"Source"), src.
pathOrUrl()),
128 qMakePair(
i18nc(
"The destination of a file operation",
"Destination"), dest.
pathOrUrl()));
134 qMakePair(
i18nc(
"The source of a file operation",
"Source"), src.
pathOrUrl()),
135 qMakePair(
i18nc(
"The destination of a file operation",
"Destination"), dest.
pathOrUrl()));
159 qMakePair(
i18nc(
"The source of a file operation",
"Source"), url.
pathOrUrl()));
165 qMakePair(
i18n(
"Device"), dev),
166 qMakePair(
i18n(
"Mountpoint"), point));
172 qMakePair(
i18n(
"Mountpoint"), point));
179 it->kill( KJob::Quietly );
210 q_func()->emitSpeed( speed );
215 #ifndef KDE_NO_DEPRECATED
238 Q_ASSERT(d->m_parentJob == 0L);
240 d->m_parentJob = job;
245 return d_func()->m_parentJob;
250 return d_func()->m_incomingMetaData;
255 return d_func()->m_incomingMetaData.value(key,
QString());
261 d->m_outgoingMetaData = _metaData;
266 d_func()->m_outgoingMetaData.insert(key, value);
273 for(;it != values.end(); ++it)
274 d->m_outgoingMetaData.insert(it.key(), it.value());
281 for(;it != values.end(); ++it)
283 if ( !d->m_outgoingMetaData.contains( it.key() ) )
284 d->m_outgoingMetaData.insert( it.key(), it.value() );
289 return d_func()->m_outgoingMetaData;
295 d_func()->simpleJobInit();
301 if (!
m_url.isValid())
305 QTimer::singleShot(0, q, SLOT(slotFinished()) );
320 kWarning(7007) <<
this <<
"This is overkill.";
329 d->m_slave->suspend();
337 d->m_slave->resume();
343 return d_func()->m_url;
349 Q_ASSERT( d->m_slave );
355 Q_ASSERT(!d->m_slave);
366 return d_func()->m_redirectionHandlingEnabled;
372 d->m_redirectionHandlingEnabled = handle;
379 if (d->m_schedSerial) {
380 kDebug(7007) <<
"Killing job" <<
this <<
"in destructor!" << kBacktrace();
397 SLOT(slotError(
int,
QString)) );
399 q->connect( slave, SIGNAL(warning(
QString)),
402 q->connect( slave, SIGNAL(infoMessage(
QString)),
405 q->connect( slave, SIGNAL(connected()),
408 q->connect( slave, SIGNAL(finished()),
409 SLOT(slotFinished()) );
419 q->connect( slave, SIGNAL(speed(ulong)),
423 if (
ui() &&
ui()->window())
428 if (
ui() &&
ui()->userTimestamp())
487 QDataStream str( d->m_packedArgs );
513 emit
warning(
this, errorText );
518 emit q_func()->infoMessage( q_func(), msg );
523 emit q_func()->connected( q_func() );
529 if (size != q->totalAmount(KJob::Bytes))
531 q->setTotalAmount(KJob::Bytes, size);
539 q->setProcessedAmount(KJob::Bytes, size);
545 q_func()->emitSpeed( speed );
555 m_url = *redirectionUrl;
556 redirectionUrl->clear();
565 const QString& dontAskAgainName,
572 iconYes, iconNo, dontAskAgainName, sslMetaData);
574 kWarning(7007) <<
"JobUiDelegate not set! Returing -1";
581 QMapIterator<QString,QString> it (_metaData);
582 while (it.hasNext()) {
584 if (it.key().startsWith(QLatin1String(
"{internal~"), Qt::CaseInsensitive))
585 d->m_internalMetaData.insert(it.key(), it.value());
587 d->m_incomingMetaData.insert(it.key(), it.value());
593 if (!d->m_internalMetaData.isEmpty()) {
600 Q_UNUSED(redirectionURL);
608 MkdirJobPrivate(
const KUrl& url,
int command,
const QByteArray &packedArgs)
611 KUrl m_redirectionURL;
612 void slotRedirection(
const KUrl &url);
620 virtual void start(
Slave *slave );
624 static inline
MkdirJob *newJob(const
KUrl& url,
int command, const QByteArray &packedArgs)
626 MkdirJob *job =
new MkdirJob(*
new MkdirJobPrivate(url, command, packedArgs));
644 q->connect( slave, SIGNAL(redirection(
KUrl)),
645 SLOT(slotRedirection(
KUrl)) );
651 void MkdirJobPrivate::slotRedirection(
const KUrl &url)
655 if (!KAuthorized::authorizeUrlAction(
"redirect", m_url, url))
657 kWarning(7007) <<
"Redirection from" << m_url <<
"to" << url <<
"REJECTED!";
659 q->setErrorText( url.pathOrUrl() );
662 m_redirectionURL = url;
664 emit q->redirection(q, m_redirectionURL);
671 if ( !d->m_redirectionURL.isEmpty() && d->m_redirectionURL.isValid() )
677 if ( d->m_redirectionHandlingEnabled )
681 QDataStream istream( d->m_packedArgs );
682 istream >> dummyUrl >> permissions;
684 d->m_packedArgs.truncate(0);
685 QDataStream stream( &d->m_packedArgs, QIODevice::WriteOnly );
686 stream << d->m_redirectionURL << permissions;
688 d->restartAfterRedirection(&d->m_redirectionURL);
753 KIO_ARGS << int(1) << qint8( ro ? 1 : 0 )
754 << QString::fromLatin1(fstype) << dev << point;
779 inline StatJobPrivate(
const KUrl& url,
int command,
const QByteArray &packedArgs)
784 KUrl m_redirectionURL;
788 void slotRedirection(
const KUrl &url);
796 virtual void start(
Slave *slave );
800 static inline
StatJob *newJob(const
KUrl& url,
int command, const QByteArray &packedArgs,
803 StatJob *job =
new StatJob(*
new StatJobPrivate(url, command, packedArgs));
807 emitStating(job, url);
822 #ifndef KDE_NO_DEPRECATED
825 d_func()->m_bSource = source;
836 d_func()->m_details = details;
841 return d_func()->m_statResult;
846 if (!
url().isLocalFile()) {
847 const UDSEntry& udsEntry = d_func()->m_statResult;
858 m_outgoingMetaData.insert(
"statSide", m_bSource ?
"source" :
"dest" );
863 q->connect( slave, SIGNAL(redirection(
KUrl)),
864 SLOT(slotRedirection(
KUrl)) );
869 void StatJobPrivate::slotStatEntry(
const KIO::UDSEntry & entry )
872 m_statResult = entry;
876 void StatJobPrivate::slotRedirection(
const KUrl &url)
879 kDebug(7007) << m_url <<
"->" << url;
880 if (!KAuthorized::authorizeUrlAction(
"redirect", m_url, url))
882 kWarning(7007) <<
"Redirection from " << m_url <<
" to " << url <<
" REJECTED!";
884 q->setErrorText( url.pathOrUrl() );
887 m_redirectionURL = url;
889 emit q->redirection(q, m_redirectionURL);
896 if ( !d->m_redirectionURL.isEmpty() && d->m_redirectionURL.isValid() )
902 if ( d->m_redirectionHandlingEnabled )
904 d->m_packedArgs.truncate(0);
905 QDataStream stream( &d->m_packedArgs, QIODevice::WriteOnly );
906 stream << d->m_redirectionURL;
908 d->restartAfterRedirection(&d->m_redirectionURL);
934 QTimer::singleShot(0, job, SLOT(slotFinished()));
940 #ifndef KDE_NO_DEPRECATED
966 KIO_ARGS << (int)2 << url << no_cache << qlonglong(expireDate);
991 if (d->m_command ==
CMD_GET && !d->m_isMimetypeEmitted) {
992 kWarning(7007) <<
"mimeType() not emitted when sending first data!; job URL ="
993 << d->m_url <<
"data size =" << _data.size();
996 d->m_isMimetypeEmitted =
true;
998 if (d->m_redirectionURL.isEmpty() || !d->m_redirectionURL.isValid() ||
error()) {
999 emit
data(
this, _data);
1005 setTotalAmount(KJob::Bytes, bytes);
1013 if (!KAuthorized::authorizeUrlAction(
"redirect", d->m_url, url))
1015 kWarning(7007) <<
"Redirection from " << d->m_url <<
" to " << url <<
" REJECTED!";
1022 if (d->m_redirectionList.count(url) > 5)
1024 kDebug(7007) <<
"CYCLIC REDIRECTION!";
1030 d->m_redirectionURL =
url;
1031 d->m_redirectionList.append(url);
1032 d->m_outgoingMetaData[
"ssl_was_in_use"] = d->m_incomingMetaData[
"ssl_in_use"];
1042 kDebug(7007) << d->m_url;
1043 if (!d->m_redirectionURL.isEmpty() && d->m_redirectionURL.isValid()) {
1049 if (d->m_redirectionHandlingEnabled) {
1054 d->staticData.truncate(0);
1055 d->m_incomingMetaData.clear();
1058 d->m_internalSuspended =
false;
1062 QDataStream istream( d->m_packedArgs );
1063 switch( d->m_command ) {
1065 d->m_packedArgs.truncate(0);
1066 QDataStream stream( &d->m_packedArgs, QIODevice::WriteOnly );
1067 stream << d->m_redirectionURL;
1072 qint8 iOverwrite, iResume;
1073 istream >> dummyUrl >> iOverwrite >> iResume >> permissions;
1074 d->m_packedArgs.truncate(0);
1075 QDataStream stream( &d->m_packedArgs, QIODevice::WriteOnly );
1076 stream << d->m_redirectionURL << iOverwrite << iResume << permissions;
1081 istream >> specialcmd;
1082 if (specialcmd == 1)
1084 d->m_outgoingMetaData.remove(QLatin1String(
"content-type"));
1086 d->m_packedArgs.truncate(0);
1087 QDataStream stream( &d->m_packedArgs, QIODevice::WriteOnly );
1088 stream << d->m_redirectionURL;
1094 d->restartAfterRedirection(&d->m_redirectionURL);
1108 d->m_extraFlags &= ~
JobPrivate::EF_TransferJobAsync;
1116 d->m_slave->send(
MSG_DATA, dataForSlave );
1124 d->m_extraFlags &= ~
JobPrivate::EF_TransferJobNeedData;
1127 #ifndef KDE_NO_DEPRECATED
1134 d->m_extraFlags &= ~
JobPrivate::EF_TransferJobDataSent;
1138 #ifndef KDE_NO_DEPRECATED
1147 return d_func()->m_mimetype;
1154 QByteArray dataForSlave;
1158 if (!d->staticData.isEmpty())
1160 dataForSlave = d->staticData;
1161 d->staticData.clear();
1165 emit
dataReq(
this, dataForSlave);
1171 static const int max_size = 14 * 1024 * 1024;
1172 if (dataForSlave.size() > max_size)
1174 kDebug(7007) <<
"send " << dataForSlave.size() / 1024 / 1024 <<
"MB of data in TransferJob::dataReq. This needs to be splitted, which requires a copy. Fix the application.\n";
1175 d->staticData = QByteArray(dataForSlave.data() + max_size , dataForSlave.size() - max_size);
1176 dataForSlave.truncate(max_size);
1184 d->internalSuspend();
1185 d->m_subJob->d_func()->internalResume();
1192 d->m_mimetype = type;
1193 if (d->m_command ==
CMD_GET && d->m_isMimetypeEmitted) {
1194 kWarning(7007) <<
"mimetype() emitted again, or after sending first data!; job URL ="
1197 d->m_isMimetypeEmitted =
true;
1221 if ( d->m_internalSuspended )
1222 d->internalSuspend();
1228 return d_func()->m_errorPage;
1236 q->connect( slave, SIGNAL(data(QByteArray)),
1237 SLOT(slotData(QByteArray)) );
1240 q->connect( slave, SIGNAL(dataReq()),
1243 q->connect( slave, SIGNAL(dataReq()),
1244 SLOT(slotDataReq()) );
1246 q->connect( slave, SIGNAL(redirection(
KUrl)),
1247 SLOT(slotRedirection(
KUrl)) );
1249 q->connect( slave, SIGNAL(mimeType(
QString)),
1250 SLOT(slotMimetype(
QString)) );
1252 q->connect( slave, SIGNAL(errorPage()),
1255 q->connect( slave, SIGNAL(needSubUrlData()),
1288 m_subJob->d_func()->internalSuspend();
1307 emit q->canResume(q, offset);
1314 QByteArray dataForSlave;
1321 if (dataForSlave.isEmpty())
1323 emit q->dataReq(q, dataForSlave);
1328 q->sendAsyncData(dataForSlave);
1334 m_subJob->d_func()->internalResume();
1342 Q_ASSERT(job == d->m_subJob);
1346 if (!
error() && job == d->m_subJob)
1349 d->internalResume();
1355 addMetaData(
"modified", mtime.toString( Qt::ISODate ) );
1363 QByteArray(), flags);
1372 StoredTransferJobPrivate(
const KUrl& url,
int command,
1373 const QByteArray &packedArgs,
1374 const QByteArray &_staticData)
1378 StoredTransferJobPrivate(
const KUrl& url,
int command,
1379 const QByteArray &packedArgs,
1388 void slotStoredData(
KIO::Job *job,
const QByteArray &data );
1389 void slotStoredDataReq(
KIO::Job *job, QByteArray &data );
1394 const QByteArray &packedArgs,
1395 const QByteArray &staticData, JobFlags flags)
1398 *
new StoredTransferJobPrivate(url, command, packedArgs, staticData));
1406 const QByteArray &packedArgs,
1410 *
new StoredTransferJobPrivate(url, command, packedArgs, ioDevice));
1412 if (!(flags & HideProgressInfo))
1423 PostErrorJob(
int _error,
const QString& url,
const QByteArray &packedArgs,
const QByteArray &postData)
1427 setErrorText( url );
1430 PostErrorJob(
int _error,
const QString& url,
const QByteArray &packedArgs,
QIODevice* ioDevice)
1434 setErrorText( url );
1444 static const int bad_ports[] = {
1506 if (url.port() != 80)
1508 const int port = url.port();
1509 for (
int cnt=0; bad_ports[cnt] && bad_ports[cnt] <= port; ++cnt)
1510 if (port == bad_ports[cnt])
1519 static bool override_loaded =
false;
1521 if( !override_loaded ) {
1525 override_loaded =
true;
1528 it != overriden_ports->constEnd();
1530 if( overriden_ports->contains( url.port())) {
1540 if (!_error && !KAuthorized::authorizeUrlAction(
"open",
KUrl(), url))
1554 PostErrorJob * job =
new PostErrorJob(_error, url.
pathOrUrl(), packedArgs, ioDevice);
1556 if (!(flags & HideProgressInfo)) {
1574 PostErrorJob * job =
new PostErrorJob(_error, url.
pathOrUrl(), packedArgs, postData);
1576 if (!(flags & HideProgressInfo)) {
1588 bool redirection =
false;
1590 if (_url.
path().isEmpty())
1601 KIO_ARGS << (int)1 << _url << static_cast<qint64>(postData.size());
1605 QTimer::singleShot(0, job, SLOT(slotPostRedirection()) );
1612 bool redirection =
false;
1614 if (_url.
path().isEmpty())
1628 size = ((ioDevice && !ioDevice->isSequential()) ? ioDevice->size() : -1);
1631 KIO_ARGS << (int)1 << _url << size;
1635 QTimer::singleShot(0, job, SLOT(slotPostRedirection()) );
1645 QByteArray(), flags);
1652 if (_url.
path().isEmpty())
1662 KIO_ARGS << (int)1 << _url << static_cast<qint64>(postData.size());
1670 if (_url.
path().isEmpty())
1683 size = ((ioDevice && !ioDevice->isSequential()) ? ioDevice->size() : -1);
1686 KIO_ARGS << (int)1 << _url << size;
1697 kDebug(7007) <<
"TransferJob::slotPostRedirection(" <<
m_url <<
")";
1699 emit q->redirection(q,
m_url);
1715 SLOT(slotStoredData(
KIO::Job*,QByteArray)) );
1717 SLOT(slotStoredDataReq(
KIO::Job*,QByteArray&)) );
1727 Q_ASSERT( d->m_data.isNull() );
1728 Q_ASSERT( d->m_uploadOffset == 0 );
1735 return d_func()->m_data;
1738 void StoredTransferJobPrivate::slotStoredData(
KIO::Job *,
const QByteArray &data )
1741 if ( data.size() == 0 )
1743 unsigned int oldSize = m_data.size();
1744 m_data.resize( oldSize + data.size() );
1745 memcpy( m_data.data() + oldSize, data.data(), data.size() );
1748 void StoredTransferJobPrivate::slotStoredDataReq(
KIO::Job *, QByteArray &data )
1752 const int MAX_CHUNK_SIZE = 64*1024;
1753 int remainingBytes = m_data.size() - m_uploadOffset;
1754 if( remainingBytes > MAX_CHUNK_SIZE ) {
1756 data = QByteArray( m_data.data() + m_uploadOffset, MAX_CHUNK_SIZE );
1757 m_uploadOffset += MAX_CHUNK_SIZE;
1762 data = QByteArray( m_data.data() + m_uploadOffset, remainingBytes );
1763 m_data = QByteArray();
1793 MimetypeJobPrivate(
const KUrl& url,
int command,
const QByteArray &packedArgs)
1799 static inline
MimetypeJob *newJob(const
KUrl& url,
int command, const QByteArray &packedArgs,
1804 if (!(flags & HideProgressInfo)) {
1806 emitStating(job, url);
1830 kDebug(7007) <<
"It is in fact a directory!";
1831 d->m_mimetype = QString::fromLatin1(
"inode/directory");
1836 if ( !d->m_redirectionURL.isEmpty() && d->m_redirectionURL.isValid() && !
error() )
1842 if (d->m_redirectionHandlingEnabled)
1844 d->staticData.truncate(0);
1845 d->m_internalSuspended =
false;
1846 d->m_packedArgs.truncate(0);
1847 QDataStream stream( &d->m_packedArgs, QIODevice::WriteOnly );
1848 stream << d->m_redirectionURL;
1850 d->restartAfterRedirection(&d->m_redirectionURL);
1870 DirectCopyJobPrivate(
const KUrl& url,
int command,
const QByteArray &packedArgs)
1880 virtual void start(
Slave *slave);
1914 FileCopyJobPrivate(
const KUrl& src,
const KUrl& dest,
int permissions,
1915 bool move, JobFlags flags)
1916 : m_sourceSize(
filesize_t(-1)), m_src(src), m_dest(dest), m_moveJob(0), m_copyJob(0), m_delJob(0),
1917 m_chmodJob(0), m_getJob(0), m_putJob(0), m_permissions(permissions),
1918 m_move(move), m_mustChmod(0), m_flags(flags)
1925 QByteArray m_buffer;
1935 bool m_resumeAnswerSent:1;
1939 void startBestCopyMethod();
1940 void startCopyJob();
1941 void startCopyJob(
const KUrl &slave_url);
1942 void startRenameJob(
const KUrl &slave_url);
1943 void startDataPump();
1947 void slotData(
KIO::Job *,
const QByteArray &data);
1948 void slotDataReq(
KIO::Job *, QByteArray &data);
1955 void slotProcessedSize(
KJob *job, qulonglong size );
1961 void slotTotalSize(
KJob *job, qulonglong size );
1967 void slotPercent(
KJob *job,
unsigned long pct );
1982 *
new FileCopyJobPrivate(src, dest, permissions, move, flags));
1983 job->setProperty(
"destUrl", dest.url());
1985 if (!(flags & HideProgressInfo))
2002 QTimer::singleShot(0,
this, SLOT(slotStart()));
2005 void FileCopyJobPrivate::slotStart()
2016 if ((m_src.protocol() == m_dest.protocol()) &&
2017 (m_src.host() == m_dest.host()) &&
2018 (m_src.port() == m_dest.port()) &&
2019 (m_src.user() == m_dest.user()) &&
2020 (m_src.pass() == m_dest.pass()) &&
2021 !m_src.hasSubUrl() && !m_dest.hasSubUrl())
2023 startRenameJob(m_src);
2028 startRenameJob(m_dest);
2033 startRenameJob(m_src);
2038 startBestCopyMethod();
2041 void FileCopyJobPrivate::startBestCopyMethod()
2043 if ((m_src.protocol() == m_dest.protocol()) &&
2044 (m_src.host() == m_dest.host()) &&
2045 (m_src.port() == m_dest.port()) &&
2046 (m_src.user() == m_dest.user()) &&
2047 (m_src.pass() == m_dest.pass()) &&
2048 !m_src.hasSubUrl() && !m_dest.hasSubUrl())
2054 startCopyJob(m_dest);
2059 startCopyJob(m_src);
2074 d->m_sourceSize = size;
2082 d->m_modificationTime = mtime;
2087 return d_func()->m_src;
2092 return d_func()->m_dest;
2095 void FileCopyJobPrivate::startCopyJob()
2097 startCopyJob(m_src);
2100 void FileCopyJobPrivate::startCopyJob(
const KUrl &slave_url)
2106 if (m_modificationTime.isValid()) {
2107 m_copyJob->addMetaData(
"modified", m_modificationTime.toString( Qt::ISODate ) );
2109 q->addSubjob( m_copyJob );
2110 connectSubjob( m_copyJob );
2115 void FileCopyJobPrivate::startRenameJob(
const KUrl &slave_url)
2121 if (m_modificationTime.isValid()) {
2122 m_moveJob->addMetaData(
"modified", m_modificationTime.toString( Qt::ISODate ) );
2124 q->addSubjob( m_moveJob );
2125 connectSubjob( m_moveJob );
2128 void FileCopyJobPrivate::connectSubjob(
SimpleJob * job )
2131 q->connect( job, SIGNAL(totalSize(
KJob*,qulonglong)),
2132 SLOT(slotTotalSize(
KJob*,qulonglong)) );
2134 q->connect( job, SIGNAL(processedSize(
KJob*,qulonglong)),
2135 SLOT(slotProcessedSize(
KJob*,qulonglong)) );
2137 q->connect( job, SIGNAL(percent(
KJob*,ulong)),
2138 SLOT(slotPercent(
KJob*,ulong)) );
2146 d->m_moveJob->suspend();
2149 d->m_copyJob->suspend();
2152 d->m_getJob->suspend();
2155 d->m_putJob->suspend();
2165 d->m_moveJob->resume();
2168 d->m_copyJob->resume();
2171 d->m_getJob->resume();
2174 d->m_putJob->resume();
2180 void FileCopyJobPrivate::slotProcessedSize(
KJob *, qulonglong size )
2183 q->setProcessedAmount(KJob::Bytes, size);
2186 void FileCopyJobPrivate::slotTotalSize(
KJob*, qulonglong size )
2189 if (size != q->totalAmount(KJob::Bytes))
2191 q->setTotalAmount(KJob::Bytes, size);
2195 void FileCopyJobPrivate::slotPercent(
KJob*,
unsigned long pct )
2198 if ( pct > q->percent() ) {
2199 q->setPercent( pct );
2203 void FileCopyJobPrivate::startDataPump()
2208 m_canResume =
false;
2209 m_resumeAnswerSent =
false;
2211 m_putJob =
put( m_dest, m_permissions, (m_flags | HideProgressInfo) );
2213 if ( m_modificationTime.isValid() ) {
2214 m_putJob->setModificationTime( m_modificationTime );
2221 q->connect( m_putJob, SIGNAL(dataReq(
KIO::Job*,QByteArray&)),
2222 SLOT(slotDataReq(
KIO::Job*,QByteArray&)));
2223 q->addSubjob( m_putJob );
2229 if ( job == m_putJob || job == m_copyJob )
2241 res = ui()->askFileRename(
2242 job,
i18n(
"File Already Exists"),
2246 m_sourceSize, offset );
2249 if ( res ==
R_OVERWRITE || (m_flags & Overwrite) )
2253 if ( job == m_putJob ) {
2255 q->removeSubjob(m_putJob);
2259 q->removeSubjob(m_copyJob);
2268 m_resumeAnswerSent =
true;
2270 if ( job == m_putJob )
2274 m_getJob->addMetaData(
"errorPage",
"false" );
2275 m_getJob->addMetaData(
"AllowCompressedPage",
"false" );
2278 m_getJob->setTotalAmount(KJob::Bytes, m_sourceSize);
2284 m_getJob->addMetaData(
"resume",
KIO::number(offset) );
2292 m_putJob->d_func()->internalSuspend();
2293 q->addSubjob( m_getJob );
2294 connectSubjob( m_getJob );
2295 m_getJob->d_func()->internalResume();
2297 q->connect( m_getJob, SIGNAL(data(
KIO::Job*,QByteArray)),
2298 SLOT(slotData(
KIO::Job*,QByteArray)) );
2307 else if ( job == m_getJob )
2316 kWarning(7007) <<
"unknown job=" << job
2317 <<
"m_getJob=" << m_getJob <<
"m_putJob=" << m_putJob;
2320 void FileCopyJobPrivate::slotData(
KIO::Job * ,
const QByteArray &data)
2324 if (!m_putJob)
return;
2325 m_getJob->d_func()->internalSuspend();
2326 m_putJob->d_func()->internalResume();
2331 if (!m_resumeAnswerSent)
2333 m_resumeAnswerSent =
true;
2339 void FileCopyJobPrivate::slotDataReq(
KIO::Job * , QByteArray &data)
2343 if (!m_resumeAnswerSent && !m_getJob) {
2346 q->setErrorText(
"'Put' job did not send canResume or 'Get' job did not send data!" );
2348 q->removeSubjob(m_putJob);
2355 m_getJob->d_func()->internalResume();
2356 m_putJob->d_func()->internalSuspend();
2359 m_buffer = QByteArray();
2362 void FileCopyJobPrivate::slotMimetype(
KIO::Job*,
const QString& type )
2365 emit q->mimetype( q, type );
2379 d->startBestCopyMethod();
2388 else if (job == d->m_getJob)
2397 else if (job == d->m_putJob)
2415 if (d->m_permissions != -1)
2417 d->m_chmodJob =
chmod(d->m_dest, d->m_permissions);
2419 d->m_mustChmod =
false;
2422 if (job == d->m_moveJob)
2427 if (job == d->m_copyJob)
2432 d->m_delJob =
file_delete( d->m_src, HideProgressInfo );
2437 if (job == d->m_getJob)
2442 d->m_putJob->d_func()->internalResume();
2445 if (job == d->m_putJob)
2453 d->m_getJob->d_func()->internalResume();
2457 d->m_delJob =
file_delete( d->m_src, HideProgressInfo );
2462 if (job == d->m_delJob)
2467 if (job == d->m_chmodJob)
2479 return FileCopyJobPrivate::newJob(src, dest, permissions,
false, flags);
2485 FileCopyJob* job = FileCopyJobPrivate::newJob(src, dest, permissions,
true, flags);
2503 ListJobPrivate(
const KUrl& url,
bool _recursive,
2505 bool _includeHidden)
2507 recursive(_recursive), includeHidden(_includeHidden),
2508 m_prefix(prefix), m_displayPrefix(displayPrefix), m_processedEntries(0)
2514 unsigned long m_processedEntries;
2515 KUrl m_redirectionURL;
2523 virtual void start(
Slave *slave );
2526 void slotRedirection(
const KUrl &url );
2531 static inline
ListJob *newJob(const
KUrl& u,
bool _recursive,
2533 bool _includeHidden, JobFlags flags = HideProgressInfo)
2535 ListJob *job =
new ListJob(*
new ListJobPrivate(u, _recursive, prefix, displayPrefix, _includeHidden));
2537 if (!(flags & HideProgressInfo))
2541 static inline ListJob *newJobNoUi(
const KUrl& u,
bool _recursive,
2543 bool _includeHidden)
2545 return new ListJob(*
new ListJobPrivate(u, _recursive, prefix, displayPrefix, _includeHidden));
2555 QDataStream stream( &d->m_packedArgs, QIODevice::WriteOnly );
2567 m_processedEntries += list.count();
2568 slotProcessedSize( m_processedEntries );
2571 UDSEntryList::ConstIterator it = list.begin();
2572 const UDSEntryList::ConstIterator
end = list.end();
2574 for (; it != end; ++it) {
2588 Q_ASSERT(!fileName.isEmpty());
2595 if (displayName.isEmpty())
2596 displayName = filename;
2598 if (filename !=
".." && filename !=
"." && (includeHidden || filename[0] !=
'.')) {
2601 m_prefix + filename +
'/',
2602 m_displayPrefix + displayName +
'/',
2616 if (m_prefix.isNull() && includeHidden) {
2617 emit q->entries(q, list);
2622 UDSEntryList::const_iterator it = list.begin();
2623 const UDSEntryList::const_iterator end = list.end();
2624 for (; it != end; ++it) {
2630 if (displayName.isEmpty())
2631 displayName = filename;
2634 if ( (m_prefix.isNull() || (filename !=
".." && filename !=
".") )
2635 && (includeHidden || (filename[0] !=
'.') ) )
2640 newlist.append(newone);
2644 emit q->entries(q, newlist);
2652 emit q->entries(q, list);
2662 emit
subError(
this, static_cast<KIO::ListJob*>(job));
2669 void ListJobPrivate::slotRedirection(
const KUrl & url )
2672 if (!KAuthorized::authorizeUrlAction(
"redirect", m_url, url))
2674 kWarning(7007) <<
"ListJob: Redirection from " << m_url <<
" to " << url <<
" REJECTED!";
2677 m_redirectionURL = url;
2678 emit q->redirection( q, m_redirectionURL );
2687 KMimeType::Ptr ptr = KMimeType::findByUrl( d->m_url, 0,
true,
true );
2689 QString proto = ptr->property(
"X-KDE-LocalProtocol").toString();
2691 d->m_redirectionURL = d->m_url;
2692 d->m_redirectionURL.setProtocol( proto );
2699 if ( !d->m_redirectionURL.isEmpty() && d->m_redirectionURL.isValid() && !
error() ) {
2705 if ( d->m_redirectionHandlingEnabled ) {
2706 d->m_packedArgs.truncate(0);
2707 QDataStream stream( &d->m_packedArgs, QIODevice::WriteOnly );
2708 stream << d->m_redirectionURL;
2710 d->restartAfterRedirection(&d->m_redirectionURL);
2742 d->m_extraFlags &= ~
JobPrivate::EF_ListJobUnrestricted;
2748 if (!KAuthorized::authorizeUrlAction(
"list", m_url, m_url) &&
2749 !(m_extraFlags & EF_ListJobUnrestricted))
2752 q->setErrorText( m_url.url() );
2753 QTimer::singleShot(0, q, SLOT(slotFinished()) );
2760 q->connect( slave, SIGNAL(redirection(
KUrl)),
2761 SLOT(slotRedirection(
KUrl)) );
2768 return d_func()->m_redirectionURL;
2776 MultiGetJobPrivate(
const KUrl& url)
2781 GetRequest(
long _id,
const KUrl &_url,
const MetaData &_metaData)
2782 : id(_id), url(_url), metaData(_metaData) { }
2787 inline bool operator==(
const GetRequest& req )
const
2788 {
return req.id == id; }
2790 typedef QLinkedList<GetRequest> RequestQueue;
2792 RequestQueue m_waitQueue;
2793 RequestQueue m_activeQueue;
2794 GetRequest m_currentEntry;
2795 bool b_multiGetActive;
2803 virtual void start(
Slave *slave);
2805 bool findCurrentEntry();
2806 void flushQueue(QLinkedList<GetRequest> &queue);
2830 MultiGetJobPrivate::GetRequest entry(
id, url, metaData);
2832 d->m_waitQueue.append(entry);
2835 void MultiGetJobPrivate::flushQueue(RequestQueue &queue)
2839 RequestQueue::iterator wqit = m_waitQueue.begin();
2840 const RequestQueue::iterator wqend = m_waitQueue.end();
2841 while ( wqit != wqend )
2843 const GetRequest& entry = *wqit;
2844 if ((m_url.protocol() == entry.url.protocol()) &&
2845 (m_url.host() == entry.url.host()) &&
2846 (m_url.port() == entry.url.port()) &&
2847 (m_url.user() == entry.url.user()))
2849 queue.append( entry );
2850 wqit = m_waitQueue.erase( wqit );
2859 RequestQueue::const_iterator qit = queue.begin();
2860 const RequestQueue::const_iterator qend = queue.end();
2861 for( ; qit != qend; ++qit )
2863 stream << (*qit).url << (*qit).metaData;
2865 m_packedArgs = packedArgs;
2867 m_outgoingMetaData.clear();
2873 GetRequest entry = m_waitQueue.takeFirst();
2874 m_activeQueue.append(entry);
2878 if (!entry.url.protocol().startsWith(QLatin1String(
"http")))
2882 m_packedArgs = packedArgs;
2883 m_outgoingMetaData = entry.metaData;
2885 b_multiGetActive =
false;
2889 flushQueue(m_activeQueue);
2890 b_multiGetActive =
true;
2896 bool MultiGetJobPrivate::findCurrentEntry()
2898 if (b_multiGetActive)
2900 long id = m_incomingMetaData[
"request-id"].toLong();
2901 RequestQueue::const_iterator qit = m_activeQueue.begin();
2902 const RequestQueue::const_iterator qend = m_activeQueue.end();
2903 for( ; qit != qend; ++qit )
2905 if ((*qit).id ==
id)
2907 m_currentEntry = *qit;
2911 m_currentEntry.id = 0;
2916 if ( m_activeQueue.isEmpty() )
2918 m_currentEntry = m_activeQueue.first();
2926 if (!d->findCurrentEntry())
return;
2927 if (!KAuthorized::authorizeUrlAction(
"redirect", d->m_url, url))
2929 kWarning(7007) <<
"MultiGetJob: Redirection from " << d->m_currentEntry.url <<
" to " << url <<
" REJECTED!";
2932 d->m_redirectionURL =
url;
2933 get(d->m_currentEntry.id, d->m_redirectionURL, d->m_currentEntry.metaData);
2940 if (!d->findCurrentEntry())
return;
2941 if (d->m_redirectionURL.isEmpty())
2944 emit
result(d->m_currentEntry.id);
2946 d->m_redirectionURL =
KUrl();
2948 d->m_incomingMetaData.clear();
2949 d->m_activeQueue.removeAll(d->m_currentEntry);
2950 if (d->m_activeQueue.count() == 0)
2952 if (d->m_waitQueue.count() == 0)
2964 d->m_url = d->m_waitQueue.first().url;
2975 if(d->m_redirectionURL.isEmpty() || !d->m_redirectionURL.isValid() ||
error())
2976 emit
data(d->m_currentEntry.id, _data);
2982 if (d->b_multiGetActive)
2984 MultiGetJobPrivate::RequestQueue newQueue;
2985 d->flushQueue(newQueue);
2986 if (!newQueue.isEmpty())
2988 d->m_activeQueue += newQueue;
2989 d->m_slave->send( d->m_command, d->m_packedArgs );
2992 if (!d->findCurrentEntry())
return;
2993 emit
mimetype(d->m_currentEntry.id, _mimetype);
2999 job->
get(
id, url, metaData);
3005 SpecialJobPrivate(
const KUrl& url,
int command,
3006 const QByteArray &packedArgs,
3007 const QByteArray &_staticData)
3024 d->m_packedArgs =
data;
3029 return d_func()->m_packedArgs;
3034 CacheInfo::CacheInfo(
const KUrl &url)
3039 QString CacheInfo::cachedFileName()
3041 const QChar separator =
'_';
3045 int p = CEF.find(
'/');
3050 p = CEF.find(
'/', p);
3053 QString host = m_url.host().toLower();
3054 CEF = host + CEF +
'_';
3057 if (dir[dir.length()-1] !=
'/')
3060 int l = m_url.host().length();
3061 for(
int i = 0; i < l; i++)
3063 if (host[i].isLetter() && (host[i] !=
'w'))
3069 if (dir[dir.length()-1] ==
'/')
3072 unsigned long hash = 0x00000000;
3073 QString u = m_url.url().toLatin1();
3074 for(
int i = u.length(); i--;)
3076 hash = (hash * 12211 + u[i]) % 2147483563;
3080 hashString.sprintf(
"%08lx", hash);
3082 CEF = CEF + hashString;
3084 CEF = dir +
'/' + CEF;
3089 QFile *CacheInfo::cachedFile()
3092 const char *mode = (readWrite ?
"rb+" :
"rb");
3094 const char *mode = (readWrite ?
"r+" :
"r");
3097 FILE *fs = KDE::fopen(CEF, mode);
3105 if (ok && (!fgets(buffer, 400, fs)))
3111 time_t currentDate = time(0);
3114 if (ok && (!fgets(buffer, 400, fs)))
3118 int l = strlen(buffer);
3121 if (m_.url.url() != buffer)
3128 if (ok && (!fgets(buffer, 400, fs)))
3132 date = (time_t) strtoul(buffer, 0, 10);
3133 if (m_maxCacheAge && (difftime(currentDate, date) > m_maxCacheAge))
3135 m_bMustRevalidate =
true;
3136 m_expireDate = currentDate;
3141 m_cacheExpireDateOffset = KDE_ftell(fs);
3142 if (ok && (!fgets(buffer, 400, fs)))
3148 date = (time_t) strtoul(buffer, 0, 10);
3150 if (!date || difftime(currentDate, date) >= 0)
3151 m_bMustRevalidate =
true;
3152 m_expireDate = date;
3157 if (ok && (!fgets(buffer, 400, fs)))
3161 m_etag =
QString(buffer).trimmed();
3165 if (ok && (!fgets(buffer, 400, fs)))
3169 m_lastModified =
QString(buffer).trimmed();
3177 unlink( QFile::encodeName(CEF) );
3182 void CacheInfo::flush()
3184 cachedFile().remove();
3187 void CacheInfo::touch()
3191 void CacheInfo::setExpireDate(
int);
3192 void CacheInfo::setExpireTimeout(
int);
3195 int CacheInfo::creationDate();
3196 int CacheInfo::expireDate();
3197 int CacheInfo::expireTimeout();
3200 #include "jobclasses.moc"
3201 #include "job_p.moc"