kio: drop multi-get support

Signed-off-by: Ivailo Monev <xakepa10@gmail.com>
This commit is contained in:
Ivailo Monev 2022-05-14 04:25:15 +03:00
parent 2f217c0823
commit 300458f720
11 changed files with 243 additions and 563 deletions

View file

@ -423,7 +423,6 @@ install(
KIO/ListJob
KIO/MetaData
KIO/MimetypeJob
KIO/MultiGetJob
KIO/NetAccess
KIO/NetRC
KIO/PreviewJob

View file

@ -1 +0,0 @@
#include "../../kio/jobclasses.h"

View file

@ -49,8 +49,6 @@ Charsets string Charset(s) send in the "Accept-Charset:" HTTP Re
Languages string Language(s) send in the "Accept-Language:" HTTP Request Header.
request-id number Sequence number to identify requests in a MultiGet command.
no-auth bool Flag that indicates that no authentication (neither WWW nor proxy)
attempts should be made.
no-www-auth bool Flag that indicates that no HTTP WWW authentication attempts should

View file

@ -378,8 +378,6 @@ KIO_EXPORT QString KIO::unsupportedActionErrorString(const QString &protocol, in
return i18n("Changing the ownership of files is not supported with protocol %1.", protocol);
case CMD_SUBURL:
return i18n("Using sub-URLs with %1 is not supported.", protocol);
case CMD_MULTI_GET:
return i18n("Multiple get is not supported with protocol %1.", protocol);
case CMD_OPEN:
return i18n("Opening files is not supported with protocol %1.", protocol);
default:

View file

@ -163,14 +163,13 @@ namespace KIO
CMD_MESSAGEBOXANSWER = 'S', // 83
CMD_RESUMEANSWER = 'T', // 84
CMD_CONFIG = 'U', // 85
CMD_MULTI_GET = 'V', // 86
CMD_SETLINKDEST = 'W', // 87
CMD_OPEN = 'X', // 88
CMD_CHOWN = 'Y', // 89
CMD_READ = 'Z', // 90
CMD_WRITE = 91,
CMD_SEEK = 92,
CMD_CLOSE = 93
CMD_SETLINKDEST = 'V', // 86
CMD_OPEN = 'W', // 87
CMD_CHOWN = 'X', // 88
CMD_READ = 'Y', // 89
CMD_WRITE = 'Z',
CMD_SEEK = 91,
CMD_CLOSE = 92
// Add new ones here once a release is done, to avoid breaking binary compatibility.
// Note that protocol-specific commands shouldn't be added here, but should use special.
};

View file

@ -582,12 +582,6 @@ void SimpleJob::slotMetaData( const KIO::MetaData &_metaData )
}
}
void SimpleJob::storeSSLSessionFromJob(const KUrl &redirectionURL)
{
Q_UNUSED(redirectionURL);
}
//////////
class KIO::MkdirJobPrivate: public SimpleJobPrivate
{
@ -893,7 +887,6 @@ void StatJob::slotMetaData( const KIO::MetaData &_metaData)
{
Q_D(StatJob);
SimpleJob::slotMetaData(_metaData);
storeSSLSessionFromJob(d->m_redirectionURL);
}
StatJob *KIO::stat(const KUrl& url, JobFlags flags)
@ -1224,7 +1217,6 @@ void TransferJob::slotMetaData( const KIO::MetaData &_metaData)
{
Q_D(TransferJob);
SimpleJob::slotMetaData(_metaData);
storeSSLSessionFromJob(d->m_redirectionURL);
}
void TransferJobPrivate::slotCanResume( KIO::filesize_t offset )
@ -2349,7 +2341,6 @@ void ListJob::slotMetaData( const KIO::MetaData &_metaData)
{
Q_D(ListJob);
SimpleJob::slotMetaData(_metaData);
storeSSLSessionFromJob(d->m_redirectionURL);
}
ListJob *KIO::listDir( const KUrl& url, JobFlags flags, bool includeHidden )
@ -2397,237 +2388,7 @@ const KUrl& ListJob::redirectionUrl() const
return d_func()->m_redirectionURL;
}
////
class KIO::MultiGetJobPrivate: public KIO::TransferJobPrivate
{
public:
MultiGetJobPrivate(const KUrl& url)
: TransferJobPrivate(url, 0, QByteArray(), QByteArray()),
m_currentEntry( 0, KUrl(), MetaData() )
{}
struct GetRequest {
GetRequest(long _id, const KUrl &_url, const MetaData &_metaData)
: id(_id), url(_url), metaData(_metaData) { }
long id;
KUrl url;
MetaData metaData;
inline bool operator==( const GetRequest& req ) const
{ return req.id == id; }
};
typedef QList<GetRequest> RequestQueue;
RequestQueue m_waitQueue;
RequestQueue m_activeQueue;
GetRequest m_currentEntry;
bool b_multiGetActive;
/**
* @internal
* Called by the scheduler when a @p slave gets to
* work on this job.
* @param slave the slave that starts working on this job
*/
virtual void start(Slave *slave);
bool findCurrentEntry();
void flushQueue(QList<GetRequest> &queue);
Q_DECLARE_PUBLIC(MultiGetJob)
static inline MultiGetJob *newJob(const KUrl &url)
{
MultiGetJob *job = new MultiGetJob(*new MultiGetJobPrivate(url));
job->setUiDelegate(new JobUiDelegate);
return job;
}
};
MultiGetJob::MultiGetJob(MultiGetJobPrivate &dd)
: TransferJob(dd)
{
}
MultiGetJob::~MultiGetJob()
{
}
void MultiGetJob::get(long id, const KUrl &url, const MetaData &metaData)
{
Q_D(MultiGetJob);
MultiGetJobPrivate::GetRequest entry(id, url, metaData);
entry.metaData["request-id"] = QString::number(id);
d->m_waitQueue.append(entry);
}
void MultiGetJobPrivate::flushQueue(RequestQueue &queue)
{
// Use multi-get
// Scan all jobs in m_waitQueue
RequestQueue::iterator wqit = m_waitQueue.begin();
const RequestQueue::iterator wqend = m_waitQueue.end();
while ( wqit != wqend )
{
const GetRequest& entry = *wqit;
if ((m_url.protocol() == entry.url.protocol()) &&
(m_url.host() == entry.url.host()) &&
(m_url.port() == entry.url.port()) &&
(m_url.user() == entry.url.user()))
{
queue.append( entry );
wqit = m_waitQueue.erase( wqit );
}
else
{
++wqit;
}
}
// Send number of URLs, (URL, metadata)*
KIO_ARGS << (qint32) queue.count();
RequestQueue::const_iterator qit = queue.begin();
const RequestQueue::const_iterator qend = queue.end();
for( ; qit != qend; ++qit )
{
stream << (*qit).url << (*qit).metaData;
}
m_packedArgs = packedArgs;
m_command = CMD_MULTI_GET;
m_outgoingMetaData.clear();
}
void MultiGetJobPrivate::start(Slave *slave)
{
// Add first job from m_waitQueue and add it to m_activeQueue
GetRequest entry = m_waitQueue.takeFirst();
m_activeQueue.append(entry);
m_url = entry.url;
if (!entry.url.protocol().startsWith(QLatin1String("http")))
{
// Use normal get
KIO_ARGS << entry.url;
m_packedArgs = packedArgs;
m_outgoingMetaData = entry.metaData;
m_command = CMD_GET;
b_multiGetActive = false;
}
else
{
flushQueue(m_activeQueue);
b_multiGetActive = true;
}
TransferJobPrivate::start(slave); // Anything else to do??
}
bool MultiGetJobPrivate::findCurrentEntry()
{
if (b_multiGetActive)
{
long id = m_incomingMetaData["request-id"].toLong();
RequestQueue::const_iterator qit = m_activeQueue.begin();
const RequestQueue::const_iterator qend = m_activeQueue.end();
for( ; qit != qend; ++qit )
{
if ((*qit).id == id)
{
m_currentEntry = *qit;
return true;
}
}
m_currentEntry.id = 0;
return false;
}
else
{
if ( m_activeQueue.isEmpty() )
return false;
m_currentEntry = m_activeQueue.first();
return true;
}
}
void MultiGetJob::slotRedirection( const KUrl &url)
{
Q_D(MultiGetJob);
if (!d->findCurrentEntry()) return; // Error
if (!KAuthorized::authorizeUrlAction("redirect", d->m_url, url))
{
kWarning(7007) << "MultiGetJob: Redirection from " << d->m_currentEntry.url << " to " << url << " REJECTED!";
return;
}
d->m_redirectionURL = url;
get(d->m_currentEntry.id, d->m_redirectionURL, d->m_currentEntry.metaData); // Try again
}
void MultiGetJob::slotFinished()
{
Q_D(MultiGetJob);
if (!d->findCurrentEntry()) return;
if (d->m_redirectionURL.isEmpty())
{
// No redirection, tell the world that we are finished.
emit result(d->m_currentEntry.id);
}
d->m_redirectionURL = KUrl();
setError( 0 );
d->m_incomingMetaData.clear();
d->m_activeQueue.removeAll(d->m_currentEntry);
if (d->m_activeQueue.count() == 0)
{
if (d->m_waitQueue.count() == 0)
{
// All done
TransferJob::slotFinished();
}
else
{
// return slave to pool
// fetch new slave for first entry in d->m_waitQueue and call start
// again.
d->slaveDone();
d->m_url = d->m_waitQueue.first().url;
if ((d->m_extraFlags & JobPrivate::EF_KillCalled) == 0) {
Scheduler::doJob(this);
}
}
}
}
void MultiGetJob::slotData( const QByteArray &_data)
{
Q_D(MultiGetJob);
if(d->m_redirectionURL.isEmpty() || !d->m_redirectionURL.isValid() || error())
emit data(d->m_currentEntry.id, _data);
}
void MultiGetJob::slotMimetype( const QString &_mimetype )
{
Q_D(MultiGetJob);
if (d->b_multiGetActive)
{
MultiGetJobPrivate::RequestQueue newQueue;
d->flushQueue(newQueue);
if (!newQueue.isEmpty())
{
d->m_activeQueue += newQueue;
d->m_slave->send( d->m_command, d->m_packedArgs );
}
}
if (!d->findCurrentEntry()) return; // Error, unknown request!
emit mimetype(d->m_currentEntry.id, _mimetype);
}
MultiGetJob *KIO::multi_get(long id, const KUrl &url, const MetaData &metaData)
{
MultiGetJob * job = MultiGetJobPrivate::newJob(url);
job->get(id, url, metaData);
return job;
}
//
class KIO::SpecialJobPrivate: public TransferJobPrivate
{

View file

@ -231,7 +231,7 @@ namespace KIO {
* @param flags Can be HideProgressInfo, Overwrite and Resume here. WARNING:
* Setting Resume means that the data will be appended to @p dest if @p dest exists.
* @return the job handling the operation.
* @see multi_get()
* @see get()
*/
KIO_EXPORT TransferJob *put( const KUrl& url, int permissions,
JobFlags flags = DefaultFlags );
@ -261,18 +261,6 @@ namespace KIO {
KIO_EXPORT StoredTransferJob *storedPut( const QByteArray& arr, const KUrl& url, int permissions,
JobFlags flags = DefaultFlags );
/**
* Creates a new multiple get job.
*
* @param id the id of the get operation
* @param url the URL of the file
* @param metaData the MetaData associated with the file
*
* @return the job handling the operation.
* @see get()
*/
KIO_EXPORT MultiGetJob *multi_get( long id, const KUrl &url, const MetaData &metaData);
/**
* Find mimetype for one file or directory.
*

View file

@ -390,15 +390,6 @@ namespace KIO {
virtual void slotMetaData( const KIO::MetaData &_metaData);
protected:
/*
* Allow jobs that inherit SimpleJob and are aware
* of redirections to store the SSL session used.
* Retrieval is handled by SimpleJob::start
* @param m_redirectionURL Reference to redirection URL,
* used instead of m_url if not empty
*/
void storeSSLSessionFromJob(const KUrl &m_redirectionURL);
/**
* Creates a new simple job. You don't need to use this constructor,
* unless you create a new job that inherits from SimpleJob.
@ -695,65 +686,6 @@ namespace KIO {
Q_DECLARE_PRIVATE(StoredTransferJob)
};
class MultiGetJobPrivate;
/**
* The MultiGetJob is a TransferJob that allows you to get
* several files from a single server. Don't create directly,
* but use KIO::multi_get() instead.
* @see KIO::multi_get()
*/
class KIO_EXPORT MultiGetJob : public TransferJob {
Q_OBJECT
public:
virtual ~MultiGetJob();
/**
* Get an additional file.
*
* @param id the id of the file
* @param url the url of the file to get
* @param metaData the meta data for this request
*/
void get(long id, const KUrl &url, const MetaData &metaData);
Q_SIGNALS:
/**
* Data from the slave has arrived.
* @param id the id of the request
* @param data data received from the slave.
* End of data (EOD) has been reached if data.size() == 0
*/
void data( long id, const QByteArray &data);
/**
* Mimetype determined
* @param id the id of the request
* @param type the mime type
*/
void mimetype( long id, const QString &type );
/**
* File transfer completed.
*
* When all files have been processed, result(KJob *) gets
* emitted.
* @param id the id of the request
*/
void result( long id);
protected Q_SLOTS:
virtual void slotRedirection( const KUrl &url);
virtual void slotFinished();
virtual void slotData( const QByteArray &data);
virtual void slotMimetype( const QString &mimetype );
protected:
MultiGetJob(MultiGetJobPrivate &dd);
private:
Q_DECLARE_PRIVATE(MultiGetJob)
};
class MimetypeJobPrivate;
/**
* A MimetypeJob is a TransferJob that allows you to get

View file

@ -979,9 +979,6 @@ static bool mayReturnContent(int cmd, const QString& protocol)
if (cmd == CMD_GET)
return true;
if (cmd == CMD_MULTI_GET)
return true;
if (cmd == CMD_SPECIAL && protocol.startsWith(QLatin1String("http"), Qt::CaseInsensitive))
return true;
@ -1219,7 +1216,7 @@ Slave *SchedulerPrivate::heldSlaveForJob(SimpleJob *job)
if (!slave && m_slaveOnHold) {
// Make sure that the job wants to do a GET or a POST, and with no offset
const int cmd = jobPriv->m_command;
bool canJobReuse = (cmd == CMD_GET || cmd == CMD_MULTI_GET);
bool canJobReuse = (cmd == CMD_GET);
if (KIO::TransferJob *tJob = qobject_cast<KIO::TransferJob *>(job)) {
canJobReuse = ( canJobReuse || cmd == CMD_SPECIAL );

View file

@ -601,8 +601,7 @@ static bool isSubCommand(int cmd)
(cmd == CMD_SUBURL) ||
(cmd == CMD_SLAVE_STATUS) ||
(cmd == CMD_SLAVE_CONNECT) ||
(cmd == CMD_SLAVE_HOLD) ||
(cmd == CMD_MULTI_GET));
(cmd == CMD_SLAVE_HOLD));
}
void SlaveBase::mimeType( const QString &_type)
@ -820,8 +819,6 @@ void SlaveBase::chown(KUrl const &, const QString &, const QString &)
{ error( ERR_UNSUPPORTED_ACTION, unsupportedActionErrorString(mProtocol, CMD_CHOWN)); }
void SlaveBase::setSubUrl(KUrl const &)
{ error( ERR_UNSUPPORTED_ACTION, unsupportedActionErrorString(mProtocol, CMD_SUBURL)); }
void SlaveBase::multiGet(const QByteArray &)
{ error( ERR_UNSUPPORTED_ACTION, unsupportedActionErrorString(mProtocol, CMD_MULTI_GET)); }
void SlaveBase::slave_status()
@ -1026,221 +1023,242 @@ void SlaveBase::dispatch( int command, const QByteArray &data )
int i;
switch( command ) {
case CMD_HOST: {
QString passwd;
QString host, user;
quint16 port;
stream >> host >> port >> user >> passwd;
d->m_state = d->InsideMethod;
setHost( host, port, user, passwd );
d->verifyErrorFinishedNotCalled("setHost()");
d->m_state = d->Idle;
} break;
case CMD_CONNECT: {
openConnection( );
} break;
case CMD_DISCONNECT: {
closeConnection( );
} break;
case CMD_SLAVE_STATUS: {
d->m_state = d->InsideMethod;
slave_status();
// TODO verify that the slave has called slaveStatus()?
d->verifyErrorFinishedNotCalled("slave_status()");
d->m_state = d->Idle;
} break;
case CMD_SLAVE_CONNECT: {
d->onHold = false;
QString app_socket;
QDataStream stream( data );
stream >> app_socket;
d->appConnection.send( MSG_SLAVE_ACK );
disconnectSlave();
d->isConnectedToApp = true;
connectSlave(app_socket);
} break;
case CMD_SLAVE_HOLD: {
KUrl url;
QDataStream stream( data );
stream >> url;
d->onHoldUrl = url;
d->onHold = true;
disconnectSlave();
d->isConnectedToApp = false;
// Do not close connection!
connectSlave(d->poolSocket);
} break;
case CMD_REPARSECONFIGURATION: {
d->m_state = d->InsideMethod;
reparseConfiguration();
d->verifyErrorFinishedNotCalled("reparseConfiguration()");
d->m_state = d->Idle;
} break;
case CMD_CONFIG: {
stream >> d->configData;
d->rebuildConfig();
case CMD_HOST: {
QString passwd;
QString host, user;
quint16 port;
stream >> host >> port >> user >> passwd;
d->m_state = d->InsideMethod;
setHost( host, port, user, passwd );
d->verifyErrorFinishedNotCalled("setHost()");
d->m_state = d->Idle;
break;
}
case CMD_CONNECT: {
openConnection( );
break;
}
case CMD_DISCONNECT: {
closeConnection( );
break;
}
case CMD_SLAVE_STATUS: {
d->m_state = d->InsideMethod;
slave_status();
// TODO verify that the slave has called slaveStatus()?
d->verifyErrorFinishedNotCalled("slave_status()");
d->m_state = d->Idle;
break;
}
case CMD_SLAVE_CONNECT: {
d->onHold = false;
QString app_socket;
QDataStream stream( data );
stream >> app_socket;
d->appConnection.send( MSG_SLAVE_ACK );
disconnectSlave();
d->isConnectedToApp = true;
connectSlave(app_socket);
break;
}
case CMD_SLAVE_HOLD: {
KUrl url;
QDataStream stream( data );
stream >> url;
d->onHoldUrl = url;
d->onHold = true;
disconnectSlave();
d->isConnectedToApp = false;
// Do not close connection!
connectSlave(d->poolSocket);
break;
}
case CMD_REPARSECONFIGURATION: {
d->m_state = d->InsideMethod;
reparseConfiguration();
d->verifyErrorFinishedNotCalled("reparseConfiguration()");
d->m_state = d->Idle;
break;
}
case CMD_CONFIG: {
stream >> d->configData;
d->rebuildConfig();
#if 0 //TODO: decide what to do in KDE 4.1
KSocks::setConfig(d->configGroup);
KSocks::setConfig(d->configGroup);
#endif
delete d->remotefile;
d->remotefile = 0;
} break;
case CMD_GET: {
stream >> url;
d->m_state = d->InsideMethod;
get( url );
d->verifyState("get()");
d->m_state = d->Idle;
} break;
case CMD_OPEN: {
stream >> url >> i;
QIODevice::OpenMode mode = QFlag(i);
d->m_state = d->InsideMethod;
open(url, mode); //krazy:exclude=syscalls
d->m_state = d->Idle;
} break;
case CMD_PUT: {
int permissions;
qint8 iOverwrite, iResume;
stream >> url >> iOverwrite >> iResume >> permissions;
JobFlags flags;
if ( iOverwrite != 0 ) flags |= Overwrite;
if ( iResume != 0 ) flags |= Resume;
delete d->remotefile;
d->remotefile = 0;
break;
}
case CMD_GET: {
stream >> url;
d->m_state = d->InsideMethod;
get( url );
d->verifyState("get()");
d->m_state = d->Idle;
break;
}
case CMD_OPEN: {
stream >> url >> i;
QIODevice::OpenMode mode = QFlag(i);
d->m_state = d->InsideMethod;
open(url, mode); //krazy:exclude=syscalls
d->m_state = d->Idle;
break;
}
case CMD_PUT: {
int permissions;
qint8 iOverwrite, iResume;
stream >> url >> iOverwrite >> iResume >> permissions;
JobFlags flags;
if ( iOverwrite != 0 ) flags |= Overwrite;
if ( iResume != 0 ) flags |= Resume;
// Remember that we need to send canResume(), TransferJob is expecting
// it. Well, in theory this shouldn't be done if resume is true.
// (the resume bool is currently unused)
d->needSendCanResume = true /* !resume */;
// Remember that we need to send canResume(), TransferJob is expecting
// it. Well, in theory this shouldn't be done if resume is true.
// (the resume bool is currently unused)
d->needSendCanResume = true /* !resume */;
d->m_state = d->InsideMethod;
put( url, permissions, flags);
d->verifyState("put()");
d->m_state = d->Idle;
} break;
case CMD_STAT: {
stream >> url;
d->m_state = d->InsideMethod;
stat( url ); //krazy:exclude=syscalls
d->verifyState("stat()");
d->m_state = d->Idle;
} break;
case CMD_MIMETYPE: {
stream >> url;
d->m_state = d->InsideMethod;
mimetype( url );
d->verifyState("mimetype()");
d->m_state = d->Idle;
} break;
case CMD_LISTDIR: {
stream >> url;
d->m_state = d->InsideMethod;
listDir( url );
d->verifyState("listDir()");
d->m_state = d->Idle;
} break;
case CMD_MKDIR: {
stream >> url >> i;
d->m_state = d->InsideMethod;
mkdir( url, i ); //krazy:exclude=syscalls
d->verifyState("mkdir()");
d->m_state = d->Idle;
} break;
case CMD_RENAME: {
qint8 iOverwrite;
KUrl url2;
stream >> url >> url2 >> iOverwrite;
JobFlags flags;
if ( iOverwrite != 0 ) flags |= Overwrite;
d->m_state = d->InsideMethod;
rename( url, url2, flags ); //krazy:exclude=syscalls
d->verifyState("rename()");
d->m_state = d->Idle;
} break;
case CMD_SYMLINK: {
qint8 iOverwrite;
QString target;
stream >> target >> url >> iOverwrite;
JobFlags flags;
if ( iOverwrite != 0 ) flags |= Overwrite;
d->m_state = d->InsideMethod;
symlink( target, url, flags );
d->verifyState("symlink()");
d->m_state = d->Idle;
} break;
case CMD_COPY: {
int permissions;
qint8 iOverwrite;
KUrl url2;
stream >> url >> url2 >> permissions >> iOverwrite;
JobFlags flags;
if ( iOverwrite != 0 ) flags |= Overwrite;
d->m_state = d->InsideMethod;
copy( url, url2, permissions, flags );
d->verifyState("copy()");
d->m_state = d->Idle;
} break;
case CMD_DEL: {
qint8 isFile;
stream >> url >> isFile;
d->m_state = d->InsideMethod;
del( url, isFile != 0);
d->verifyState("del()");
d->m_state = d->Idle;
} break;
case CMD_CHMOD: {
stream >> url >> i;
d->m_state = d->InsideMethod;
chmod( url, i);
d->verifyState("chmod()");
d->m_state = d->Idle;
} break;
case CMD_CHOWN: {
QString owner, group;
stream >> url >> owner >> group;
d->m_state = d->InsideMethod;
chown(url, owner, group);
d->verifyState("chown()");
d->m_state = d->Idle;
} break;
case CMD_SETMODIFICATIONTIME: {
QDateTime dt;
stream >> url >> dt;
d->m_state = d->InsideMethod;
setModificationTime(url, dt);
d->verifyState("setModificationTime()");
d->m_state = d->Idle;
} break;
case CMD_SPECIAL: {
d->m_state = d->InsideMethod;
special( data );
d->verifyState("special()");
d->m_state = d->Idle;
} break;
case CMD_META_DATA: {
//kDebug(7019) << "(" << getpid() << ") Incoming meta-data...";
stream >> mIncomingMetaData;
d->rebuildConfig();
} break;
case CMD_SUBURL: {
stream >> url;
d->m_state = d->InsideMethod;
setSubUrl(url);
d->verifyErrorFinishedNotCalled("setSubUrl()");
d->m_state = d->Idle;
} break;
case CMD_NONE: {
kWarning(7019) << "Got unexpected CMD_NONE!";
} break;
case CMD_MULTI_GET: {
d->m_state = d->InsideMethod;
multiGet( data );
d->verifyState("multiGet()");
d->m_state = d->Idle;
} break;
default: {
// Some command we don't understand.
// Just ignore it, it may come from some future version of KDE.
} break;
d->m_state = d->InsideMethod;
put( url, permissions, flags);
d->verifyState("put()");
d->m_state = d->Idle;
break;
}
case CMD_STAT: {
stream >> url;
d->m_state = d->InsideMethod;
stat( url ); //krazy:exclude=syscalls
d->verifyState("stat()");
d->m_state = d->Idle;
break;
}
case CMD_MIMETYPE: {
stream >> url;
d->m_state = d->InsideMethod;
mimetype( url );
d->verifyState("mimetype()");
d->m_state = d->Idle;
break;
}
case CMD_LISTDIR: {
stream >> url;
d->m_state = d->InsideMethod;
listDir( url );
d->verifyState("listDir()");
d->m_state = d->Idle;
break;
}
case CMD_MKDIR: {
stream >> url >> i;
d->m_state = d->InsideMethod;
mkdir( url, i ); //krazy:exclude=syscalls
d->verifyState("mkdir()");
d->m_state = d->Idle;
break;
}
case CMD_RENAME: {
qint8 iOverwrite;
KUrl url2;
stream >> url >> url2 >> iOverwrite;
JobFlags flags;
if ( iOverwrite != 0 ) flags |= Overwrite;
d->m_state = d->InsideMethod;
rename( url, url2, flags ); //krazy:exclude=syscalls
d->verifyState("rename()");
d->m_state = d->Idle;
break;
}
case CMD_SYMLINK: {
qint8 iOverwrite;
QString target;
stream >> target >> url >> iOverwrite;
JobFlags flags;
if ( iOverwrite != 0 ) flags |= Overwrite;
d->m_state = d->InsideMethod;
symlink( target, url, flags );
d->verifyState("symlink()");
d->m_state = d->Idle;
break;
}
case CMD_COPY: {
int permissions;
qint8 iOverwrite;
KUrl url2;
stream >> url >> url2 >> permissions >> iOverwrite;
JobFlags flags;
if ( iOverwrite != 0 ) flags |= Overwrite;
d->m_state = d->InsideMethod;
copy( url, url2, permissions, flags );
d->verifyState("copy()");
d->m_state = d->Idle;
break;
}
case CMD_DEL: {
qint8 isFile;
stream >> url >> isFile;
d->m_state = d->InsideMethod;
del( url, isFile != 0);
d->verifyState("del()");
d->m_state = d->Idle;
break;
}
case CMD_CHMOD: {
stream >> url >> i;
d->m_state = d->InsideMethod;
chmod( url, i);
d->verifyState("chmod()");
d->m_state = d->Idle;
break;
}
case CMD_CHOWN: {
QString owner, group;
stream >> url >> owner >> group;
d->m_state = d->InsideMethod;
chown(url, owner, group);
d->verifyState("chown()");
d->m_state = d->Idle;
break;
}
case CMD_SETMODIFICATIONTIME: {
QDateTime dt;
stream >> url >> dt;
d->m_state = d->InsideMethod;
setModificationTime(url, dt);
d->verifyState("setModificationTime()");
d->m_state = d->Idle;
break;
}
case CMD_SPECIAL: {
d->m_state = d->InsideMethod;
special( data );
d->verifyState("special()");
d->m_state = d->Idle;
break;
}
case CMD_META_DATA: {
//kDebug(7019) << "(" << getpid() << ") Incoming meta-data...";
stream >> mIncomingMetaData;
d->rebuildConfig();
break;
}
case CMD_SUBURL: {
stream >> url;
d->m_state = d->InsideMethod;
setSubUrl(url);
d->verifyErrorFinishedNotCalled("setSubUrl()");
d->m_state = d->Idle;
break;
}
case CMD_NONE: {
kWarning(7019) << "Got unexpected CMD_NONE!";
break;
}
default: {
// Some command we don't understand.
// Just ignore it, it may come from some future version of KDE.
break;
}
}
}

View file

@ -562,15 +562,6 @@ public:
*/
virtual void special( const QByteArray & data );
/**
* Used for multiple get. Currently only used foir HTTP pielining
* support.
*
* @param data packed data; Contains number of URLs to fetch, and for
* each URL the URL itself and its associated MetaData.
*/
virtual void multiGet( const QByteArray & data );
/**
* Called to get the status of the slave. Slave should respond
* by calling slaveStatus(...)