📄 jobclasses.cpp
字号:
m_mimetype = ""; m_firstdata = true; KIO_ARGS << m_outgoingMetaData; m_slave->send( CMD_META_DATA, packedArgs ); SimpleJob::start( slave );}void TransferJob::kill(){// hmmm, disabled this check for now. it breaks 'stop'// (Simon)// if ( m_detached )// return; SimpleJob::kill();}void TransferJob::detach( const QByteArray &cachedData ){ assert( !m_detached ); m_detached = true; if ( !s_detachedJobs ) s_detachedJobs = new QPtrList<TransferJob>; assert( s_detachedJobs->findRef( this ) == -1 ); s_detachedJobs->append( this ); m_cachedData.clear(); m_cachedData << cachedData;}void TransferJob::attach(){ assert( s_detachedJobs ); assert( m_detached ); assert( s_detachedJobs->findRef( this ) != -1 ); m_detached = false; s_detachedJobs->removeRef( this ); QTimer::singleShot( 0, this, SLOT( slotEmitCachedData() ) ); m_cachedDataEmitted = false;}void TransferJob::slotEmitCachedData(){ // ### re-check this while ( m_cachedData.count() > 0 ) { QByteArray stuff = *m_cachedData.begin(); m_cachedData.remove( m_cachedData.begin() ); // ### do we need to check for redirection and the like, like in receiveData() ?? recurseEnter(); emit data( this, stuff ); if ( recurseExit() ) return; } m_cachedDataEmitted = true; if ( m_finishAfterCacheEmit ) // we are done { // peri, QTimer::singleShot( 0, this, SLOT( slaveFinished() ) ); // it is not required, here we are it means, slaveFinsihed is called // code copied from the 'slaveFinished' if ( m_redirectionURL.isEmpty() || !m_redirectionURL.isValid() || m_error ) SimpleJob::slaveFinished(); else { kdDebug() << "performing redirection" << endl; m_staticData.truncate( 0 ); m_url = m_redirectionURL; m_redirectionURL = KURL(); KURL dummyURL; QString dummyString; switch ( m_command ) { case CMD_GET: { kdDebug() << "CMD_GET redirection" << endl; m_packedArgs.truncate( 0 ); QDataStream stream( m_packedArgs, IO_WriteOnly ); stream << m_url; } break; case CMD_SPECIAL: { kdDebug() << "HTTP_POST redirection" << endl; int specialcmd; QDataStream istream( m_packedArgs, IO_ReadOnly ); istream >> specialcmd; assert( specialcmd == 1 ); addMetaData( "cache", "reload" ); m_packedArgs.truncate( 0 ); QDataStream stream( m_packedArgs, IO_WriteOnly ); stream << m_url; m_command = CMD_GET; } break; default: assert( 0 ); } QTimer::singleShot( 0, this, SLOT( slotRedirectDelayed() ) ); } return; } }TransferJob *TransferJob::findDetachedJobForURL( const KURL &url ){ if ( !s_detachedJobs ) return 0; QPtrListIterator<TransferJob> it( *s_detachedJobs ); for ( ; it.current(); ++it ) if ( it.current()->url() == url && !it.current()->isDestructing() ) return it.current(); return 0;}void TransferJob::dataReq(){ m_slave->send( MSG_DATA, m_staticData ); m_staticData = QByteArray();}void TransferJob::slaveRedirection( const KURL &url ){ if ( m_redirectionList.contains( url ) > 5 ) { m_error = ERR_CYCLIC_LINK; m_errorText = url.prettyURL(); } else { kdDebug() << "redirection #1 : " << url.prettyURL() << endl; m_redirectionURL = url; m_redirectionList.append( url ); emit redirection( this, url ); }}void TransferJob::slaveFinished(){ m_slave->disconnect( this ); // if we are detached then don't kill us. // also it could happen that the SST for the re-mission of the // cached data is pending and right before that we get called // here. so we need to sort that out here. if ( m_detached || m_cachedData.count() > 0 ) { Scheduler::self()->releaseJob( this ); m_finishAfterCacheEmit = true; return; } kdDebug() << "_finished" << endl; if ( m_redirectionURL.isEmpty() || !m_redirectionURL.isValid() || m_error ) SimpleJob::slaveFinished(); else { kdDebug() << "performing redirection" << endl; m_staticData.truncate( 0 ); m_url = m_redirectionURL; m_redirectionURL = KURL(); KURL dummyURL; QString dummyString; switch ( m_command ) { case CMD_GET: { kdDebug() << "CMD_GET redirection" << endl; m_packedArgs.truncate( 0 ); QDataStream stream( m_packedArgs, IO_WriteOnly ); stream << m_url; } break; case CMD_SPECIAL: { kdDebug() << "HTTP_POST redirection" << endl; int specialcmd; QDataStream istream( m_packedArgs, IO_ReadOnly ); istream >> specialcmd; assert( specialcmd == 1 ); addMetaData( "cache", "reload" ); m_packedArgs.truncate( 0 ); QDataStream stream( m_packedArgs, IO_WriteOnly ); stream << m_url; m_command = CMD_GET; } break; default: assert( 0 ); } QTimer::singleShot( 0, this, SLOT( slotRedirectDelayed() ) ); }}void TransferJob::slotRedirectDelayed(){ kdDebug() << "slotRedirectDelayed()" << endl; // ### optimize this Scheduler::self()->releaseJob( this ); Scheduler::self()->doJob( this );}void TransferJob::filteredData( const QByteArray &dat ){ if ( m_redirectionURL.isEmpty() || !m_redirectionURL.isValid() || m_error ) { if ( m_detached ) m_cachedData << dat; else { // do we have data pending? if yes, then just append ;) if ( m_cachedData.count() > 0 && !m_cachedDataEmitted ) m_cachedData << dat; else emit data( this, dat ); } }}void TransferJob::receiveData( const QByteArray &dat ){ if ( m_firstdata ) { m_firstdata = false; if ( m_mimetype.isEmpty() ) { // Try cheapest solution first const MimeHandler* mime = MimeHandler::Find( m_url ); if ( !mime ) mime = MimeHandler::Find( dat ); if ( mime ) { mimeRules( mime ); if ( m_mimetype.isEmpty() ) m_mimetype = mime->Preferred(); recurseEnter(); emit mimetype( this, m_mimetype ); if ( recurseExit() ) return; } } } recurseEnter(); if ( m_filter ) m_filter->dataInput( dat ); else filteredData( dat ); recurseExit();}void TransferJob::mimeRules( const MimeHandler* mime ){ if ( mime ) { if ( mime->isFilter() ) AddFilter( mime->isFilter() ); else if ( mime->isAlias() ) m_mimetype = mime->isAlias()->outputType(); }}bool TransferJob::AddFilter( const MimeFilter* filter ){ if ( m_filter ) return false; m_filter = filter->createFilter( m_mimetype, m_url ); if ( m_filter ) { m_mimetype = m_filter->outputType(); if ( m_mimetype.isEmpty() ) m_mimetype = filter->outputType(); QObject::connect( m_filter, SIGNAL( dataOutput( const QByteArray & ) ), this, SLOT( filteredData( const QByteArray & ) ) ); return true; } return false;}StatJob::StatJob(const KURL &url, int command, const QByteArray &packedArgs, bool showProgressInfo) : TransferJob(url, command, packedArgs, QByteArray(), showProgressInfo){}#include "jobclasses.moc"/* vim: et sw=4 */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -