📄 loader.cpp
字号:
m_requestsLoading.insert(job, req);}void Loader::slotFinished( KIO::Job* job ){ Request *r = m_requestsLoading.take( job ); KIO::TransferJob* j = static_cast<KIO::TransferJob*>(job); if ( !r ) return; if (j->error() || j->isErrorPage()) { r->object->error( job->error(), job->errorText().ascii() ); emit requestFailed( r->m_baseURL, r->object ); } else { r->object->data(r->m_buffer, true); emit requestDone( r->m_baseURL, r->object ); } r->object->finish();#ifdef CACHE_DEBUG kdDebug( 6060 ) << "Loader:: JOB FINISHED " << r->object << ": " << r->object->url().string() << endl;#endif delete r; servePendingRequests();}void Loader::slotData( KIO::Job*job, const QByteArray &data ){ Request *r = m_requestsLoading[job]; if(!r) { kdDebug( 6060 ) << "got data for unknown request!" << endl; return; } if ( !r->m_buffer.isOpen() ) r->m_buffer.open( IO_WriteOnly ); r->m_buffer.writeBlock( data.data(), data.size() ); if(r->incremental) r->object->data( r->m_buffer, false );}int Loader::numRequests( const DOMString &baseURL ) const{ int res = 0; QListIterator<Request> pIt( m_requestsPending ); for (; pIt.current(); ++pIt ) if ( pIt.current()->m_baseURL == baseURL ) res++; QPtrDictIterator<Request> lIt( m_requestsLoading ); for (; lIt.current(); ++lIt ) if ( lIt.current()->m_baseURL == baseURL ) res++; return res;}int Loader::numRequests( const DOMString &baseURL, CachedObject::Type type ) const{ int res = 0; QListIterator<Request> pIt( m_requestsPending ); for (; pIt.current(); ++pIt ) if ( pIt.current()->m_baseURL == baseURL && pIt.current()->object->type() == type ) res++; QPtrDictIterator<Request> lIt( m_requestsLoading ); for (; lIt.current(); ++lIt ) if ( lIt.current()->m_baseURL == baseURL && pIt.current()->object->type() == type ) res++; return res;}void Loader::cancelRequests( const DOMString &baseURL ){ //kdDebug( 6060 ) << "void Loader::cancelRequests( " << baseURL.string() << " )" << endl; //kdDebug( 6060 ) << "got " << m_requestsPending.count() << " pending requests" << endl; QListIterator<Request> pIt( m_requestsPending ); while ( pIt.current() ) { if ( pIt.current()->m_baseURL == baseURL ) { //kdDebug( 6060 ) << "cancelling pending request for " << pIt.current()->object->url().string() << endl; Cache::removeCacheEntry( pIt.current()->object ); m_requestsPending.remove( pIt ); } else ++pIt; } //kdDebug( 6060 ) << "got " << m_requestsLoading.count() << "loading requests" << endl; QPtrDictIterator<Request> lIt( m_requestsLoading ); while ( lIt.current() ) { if ( lIt.current()->m_baseURL == baseURL ) { //kdDebug( 6060 ) << "cancelling loading request for " << lIt.current()->object->url().string() << endl; KIO::Job *job = static_cast<KIO::Job *>( lIt.currentKey() ); Cache::removeCacheEntry( lIt.current()->object ); m_requestsLoading.remove( lIt.currentKey() ); job->kill(); } else ++lIt; }}KIO::Job *Loader::jobForRequest( const DOM::DOMString &url ) const{ QPtrDictIterator<Request> it( m_requestsLoading ); for (; it.current(); ++it ) { CachedObject *obj = it.current()->object; if ( obj && obj->url() == url ) return static_cast<KIO::Job *>( it.currentKey() ); } return 0;}// ----------------------------------------------------------------------------QDict<CachedObject> *Cache::cache = 0;QList<DocLoader>* Cache::docloader = 0;Cache::LRUList *Cache::lru = 0;Loader *Cache::m_loader = 0;int Cache::maxSize = DEFCACHESIZE;int Cache::flushCount = 0;QPixmap *Cache::nullPixmap = 0;QPixmap *Cache::brokenPixmap = 0;void Cache::init(){ if ( !cache ) cache = new QDict<CachedObject>(401, true); if ( !lru ) lru = new LRUList; if ( !docloader ) docloader = new QList<DocLoader>; if ( !nullPixmap ) nullPixmap = new QPixmap; if ( !brokenPixmap ) brokenPixmap = new QPixmap(KHTMLFactory::instance()->iconLoader()->loadIcon("file_broken", KIcon::FileSystem, 0, KIcon::DisabledState)); if ( !m_loader ) m_loader = new Loader();}void Cache::clear(){ if ( !cache ) return;#ifdef CACHE_DEBUG kdDebug( 6060 ) << "Cache: CLEAR!" << endl; statistics();#endif cache->setAutoDelete( true ); delete cache; cache = 0; delete lru; lru = 0; delete nullPixmap; nullPixmap = 0; delete brokenPixmap; brokenPixmap = 0; delete m_loader; m_loader = 0; delete docloader; docloader = 0;}CachedImage *Cache::requestImage( const DocLoader* dl, const DOMString & url, const DOMString &baseUrl, bool reload, int _expireDate ){ // this brings the _url to a standard form... KURL kurl = completeURL( url, baseUrl ); if( kurl.isMalformed() ) {#ifdef CACHE_DEBUG kdDebug( 6060 ) << "Cache: Malformed url: " << kurl.url() << endl;#endif return 0; } CachedObject *o = 0; if (!reload) o = cache->find(kurl.url()); if(!o) {#ifdef CACHE_DEBUG kdDebug( 6060 ) << "Cache: new: " << kurl.url() << endl;#endif CachedImage *im = new CachedImage(kurl.url(), baseUrl, reload, _expireDate); if ( dl && dl->autoloadImages() ) Cache::loader()->load(im, im->baseURL(), true); cache->insert( kurl.url(), im ); lru->append( kurl.url() ); flush(); o = im; } o->setExpireDate(_expireDate); if(!o->type() == CachedObject::Image) {#ifdef CACHE_DEBUG kdDebug( 6060 ) << "Cache::Internal Error in requestImage url=" << kurl.url() << "!" << endl;#endif return 0; }#ifdef CACHE_DEBUG if( o->status() == CachedObject::Pending ) kdDebug( 6060 ) << "Cache: loading in progress: " << kurl.url() << endl; else kdDebug( 6060 ) << "Cache: using cached: " << kurl.url() << ", status " << o->status() << endl;#endif lru->touch( kurl.url() ); if ( dl ) { dl->m_docObjects.remove( o ); dl->m_docObjects.append( o ); } return static_cast<CachedImage *>(o);}CachedCSSStyleSheet *Cache::requestStyleSheet( const DocLoader* dl, const DOMString & url, const DOMString &baseUrl, bool reload, int _expireDate, const QString& charset){ // this brings the _url to a standard form... KURL kurl = completeURL( url, baseUrl ); if( kurl.isMalformed() ) { kdDebug( 6060 ) << "Cache: Malformed url: " << kurl.url() << endl; return 0; } CachedObject *o = cache->find(kurl.url()); if(!o) {#ifdef CACHE_DEBUG kdDebug( 6060 ) << "Cache: new: " << kurl.url() << endl;#endif CachedCSSStyleSheet *sheet = new CachedCSSStyleSheet(kurl.url(), baseUrl, reload, _expireDate, charset); cache->insert( kurl.url(), sheet ); lru->append( kurl.url() ); flush(); o = sheet; } o->setExpireDate(_expireDate); if(!o->type() == CachedObject::CSSStyleSheet) {#ifdef CACHE_DEBUG kdDebug( 6060 ) << "Cache::Internal Error in requestStyleSheet url=" << kurl.url() << "!" << endl;#endif return 0; }#ifdef CACHE_DEBUG if( o->status() == CachedObject::Pending ) kdDebug( 6060 ) << "Cache: loading in progress: " << kurl.url() << endl; else kdDebug( 6060 ) << "Cache: using cached: " << kurl.url() << endl;#endif lru->touch( kurl.url() ); if ( dl ) { dl->m_docObjects.remove( o ); dl->m_docObjects.append( o ); } return static_cast<CachedCSSStyleSheet *>(o);}CachedScript *Cache::requestScript( const DocLoader* dl, const DOM::DOMString &url, const DOM::DOMString &baseUrl, bool reload, int _expireDate, const QString& charset){ // this brings the _url to a standard form... KURL kurl = completeURL( url, baseUrl ); if( kurl.isMalformed() ) { kdDebug( 6060 ) << "Cache: Malformed url: " << kurl.url() << endl; return 0; } CachedObject *o = cache->find(kurl.url()); if(!o) {#ifdef CACHE_DEBUG kdDebug( 6060 ) << "Cache: new: " << kurl.url() << endl;#endif CachedScript *script = new CachedScript(kurl.url(), baseUrl, reload, _expireDate, charset); cache->insert( kurl.url(), script ); lru->append( kurl.url() ); flush(); o = script; } o->setExpireDate(_expireDate); if(!o->type() == CachedObject::Script) {#ifdef CACHE_DEBUG kdDebug( 6060 ) << "Cache::Internal Error in requestScript url=" << kurl.url() << "!" << endl;#endif return 0; }#ifdef CACHE_DEBUG if( o->status() == CachedObject::Pending ) kdDebug( 6060 ) << "Cache: loading in progress: " << kurl.url() << endl; else kdDebug( 6060 ) << "Cache: using cached: " << kurl.url() << endl;#endif lru->touch( kurl.url() ); if ( dl ) { dl->m_docObjects.remove( o ); dl->m_docObjects.append( o ); } return static_cast<CachedScript *>(o);}void Cache::flush(bool force){ if (force) flushCount = 0; // Don't flush for every image. if (!lru || (lru->count() < (uint) flushCount)) return; init();#ifdef CACHE_DEBUG //statistics(); kdDebug( 6060 ) << "Cache: flush()" << endl;#endif int cacheSize = 0; for ( QStringList::Iterator it = lru->fromLast(); it != lru->end(); ) { QString url = *it; --it; // Update iterator, we might delete the current entry later on. CachedObject *o = cache->find( url ); if( !o->canDelete() || o->status() == CachedObject::Persistent ) { continue; // image is still used or cached permanently // in this case don't count it for the size of the cache. } if( o->status() != CachedObject::Uncacheable ) { cacheSize += o->size(); if( cacheSize < maxSize ) continue; } removeCacheEntry( o ); } flushCount = lru->count()+10; // Flush again when the cache has grown.#ifdef CACHE_DEBUG //statistics();#endif}void Cache::setSize( int bytes ){ maxSize = bytes; // may be we need to clear parts of the cache flushCount = 0; flush(true);}void Cache::statistics(){ CachedObject *o; // this function is for debugging purposes only init(); int size = 0; int msize = 0; int movie = 0; int stylesheets = 0; QDictIterator<CachedObject> it(*cache); for(it.toFirst(); it.current(); ++it) { o = it.current(); if(o->type() == CachedObject::Image) { CachedImage *im = static_cast<CachedImage *>(o); if(im->m != 0) { movie++; msize += im->size(); } } else { if(o->type() == CachedObject::CSSStyleSheet) stylesheets++; } size += o->size(); } size /= 1024; kdDebug( 6060 ) << "------------------------- image cache statistics -------------------" << endl; kdDebug( 6060 ) << "Number of items in cache: " << cache->count() << endl; kdDebug( 6060 ) << "Number of items in lru : " << lru->count() << endl; kdDebug( 6060 ) << "Number of cached images: " << cache->count()-movie << endl; kdDebug( 6060 ) << "Number of cached movies: " << movie << endl; kdDebug( 6060 ) << "Number of cached stylesheets: " << stylesheets << endl; kdDebug( 6060 ) << "pixmaps: allocated space approx. " << size << " kB" << endl; kdDebug( 6060 ) << "movies : allocated space approx. " << msize/1024 << " kB" << endl; kdDebug( 6060 ) << "--------------------------------------------------------------------" << endl;}KURL Cache::completeURL( const DOMString &_url, const DOMString &_baseUrl ){ QString url = _url.string(); QString baseUrl = _baseUrl.string(); KURL orig(baseUrl); KURL u( orig, url ); return u;}void Cache::removeCacheEntry( CachedObject *object ){ QString key = object->url().string(); // this indicates the deref() method of CachedObject to delete itself when the reference counter // drops down to zero object->setFree( true ); cache->remove( key ); lru->remove( key ); const DocLoader* dl; for ( dl=docloader->first(); dl; dl=docloader->next() ) dl->removeCachedObject( object ); if ( object->canDelete() ) delete object;}#include "loader.moc"
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -