⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 loader.cpp

📁 将konqueror浏览器移植到ARM9 2410中
💻 CPP
📖 第 1 页 / 共 3 页
字号:
  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 + -