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

📄 loader.cpp

📁 khtml在gtk上的移植版本
💻 CPP
📖 第 1 页 / 共 4 页
字号:
          }          m_reloadedURLs.append(fullURL.url());          reload = true;       }    }    return reload;}CachedImage *DocLoader::requestImage( const DOM::DOMString &url){    KURL fullURL = m_doc->completeURL( url.string() );    if ( m_part && m_part->onlyLocalReferences() && fullURL.protocol() != "file") return 0;#if APPLE_CHANGES    if (KWQCheckIfReloading(this)) {        setCachePolicy(KIO::CC_Reload);    }#endif    bool reload = needReload(fullURL);#if APPLE_CHANGES    CachedImage *cachedObject = Cache::requestImage(this, fullURL, reload, m_expireDate);    KWQCheckCacheObjectStatus(this, cachedObject);    return cachedObject;#else    return Cache::requestImage(this, fullURL, reload, m_expireDate);#endif}CachedCSSStyleSheet *DocLoader::requestStyleSheet( const DOM::DOMString &url, const QString& charset){    KURL fullURL = m_doc->completeURL( url.string() );    if ( m_part && m_part->onlyLocalReferences() && fullURL.protocol() != "file") return 0;#if APPLE_CHANGES    if (KWQCheckIfReloading(this)) {        setCachePolicy(KIO::CC_Reload);    }#endif    bool reload = needReload(fullURL);#if APPLE_CHANGES    CachedCSSStyleSheet *cachedObject = Cache::requestStyleSheet(this, url, reload, m_expireDate, charset);    KWQCheckCacheObjectStatus(this, cachedObject);    return cachedObject;#else    return Cache::requestStyleSheet(this, url, reload, m_expireDate, charset);#endif}CachedScript *DocLoader::requestScript( const DOM::DOMString &url, const QString& charset){    KURL fullURL = m_doc->completeURL( url.string() );    if ( m_part && m_part->onlyLocalReferences() && fullURL.protocol() != "file") return 0;#if APPLE_CHANGES    if (KWQCheckIfReloading(this)) {        setCachePolicy(KIO::CC_Reload);    }#endif    bool reload = needReload(fullURL);#if APPLE_CHANGES    CachedScript *cachedObject = Cache::requestScript(this, url, reload, m_expireDate, charset);    KWQCheckCacheObjectStatus(this, cachedObject);    return cachedObject;#else    return Cache::requestScript(this, url, reload, m_expireDate, charset);#endif}#ifndef KHTML_NO_XBLCachedXBLDocument* DocLoader::requestXBLDocument(const DOM::DOMString &url){    KURL fullURL = m_doc->completeURL(url.string());        // FIXME: Is this right for XBL?    if (m_part && m_part->onlyLocalReferences() && fullURL.protocol() != "file") return 0;    #if APPLE_CHANGES    if (KWQCheckIfReloading(this)) {        setCachePolicy(KIO::CC_Reload);    }#endif        bool reload = needReload(fullURL);    #if APPLE_CHANGES    CachedXBLDocument *cachedObject = Cache::requestXBLDocument(this, url, reload, m_expireDate);    KWQCheckCacheObjectStatus(this, cachedObject);    return cachedObject;#else    return Cache::requestXBLDocument(this, url, reload, m_expireDate);#endif}#endifvoid DocLoader::setAutoloadImages( bool enable ){    if ( enable == m_bautoloadImages )        return;    m_bautoloadImages = enable;    if ( !m_bautoloadImages ) return;    for ( const CachedObject* co=m_docObjects.first(); co; co=m_docObjects.next() )        if ( co->type() == CachedObject::Image )        {            CachedImage *img = const_cast<CachedImage*>( static_cast<const CachedImage *>( co ) );            CachedObject::Status status = img->status();            if ( status != CachedObject::Unknown )                continue;            Cache::loader()->load(this, img, true);        }}void DocLoader::setCachePolicy( KIO::CacheControl cachePolicy ){    m_cachePolicy = cachePolicy;}void DocLoader::setShowAnimations( KHTMLSettings::KAnimationAdvice showAnimations ){    if ( showAnimations == m_showAnimations ) return;    m_showAnimations = showAnimations;    const CachedObject* co;    for ( co=m_docObjects.first(); co; co=m_docObjects.next() )        if ( co->type() == CachedObject::Image )        {            CachedImage *img = const_cast<CachedImage*>( static_cast<const CachedImage *>( co ) );            img->setShowAnimations( showAnimations );        }}void DocLoader::removeCachedObject( CachedObject* o ) const{    m_docObjects.removeRef( o );}// ------------------------------------------------------------------------------------------Loader::Loader() : QObject(){#if KWIQ    QOBJECT_TYPE(khtml::Loader);#endif    m_requestsPending.setAutoDelete( true );    m_requestsLoading.setAutoDelete( true );#if APPLE_CHANGES    kwq = new KWQLoader(this);#endif}Loader::~Loader(){#if APPLE_CHANGES    delete kwq;#endif}void Loader::load(DocLoader* dl, CachedObject *object, bool incremental){    Request *req = new Request(dl, object, incremental);    m_requestsPending.append(req);    emit requestStarted( req->m_docLoader, req->object );    servePendingRequests();}void Loader::servePendingRequests(){  if ( m_requestsPending.count() == 0 )      return;  // get the first pending request  Request *req = m_requestsPending.take(0);#ifdef CACHE_DEBUG  kdDebug( 6060 ) << "starting Loader url=" << req->object->url().string() << endl;#endif  KURL u(req->object->url().string());  KIO::TransferJob* job = KIO::get( u, false, false /*no GUI*/);  job->addMetaData("cache", getCacheControlString(req->object->cachePolicy()));  if (!req->object->accept().isEmpty())      job->addMetaData("accept", req->object->accept());  if ( req->m_docLoader )  {      KURL r = req->m_docLoader->doc()->URL();      if ( r.protocol().startsWith( "http" ) && r.path().isEmpty() )          r.setPath( "/" );      job->addMetaData("referrer", r.url());      QString domain = r.host();      if (req->m_docLoader->doc()->isHTMLDocument())         domain = static_cast<HTMLDocumentImpl*>(req->m_docLoader->doc())->domain().string();      if (crossDomain(u.host(), domain))         job->addMetaData("cross-domain", "true");  }  connect( job, SIGNAL( result( KIO::Job * ) ), this, SLOT( slotFinished( KIO::Job * ) ) );#if APPLE_CHANGES  connect( job, SIGNAL( data( KIO::Job*, const char *, int)),           SLOT( slotData( KIO::Job*, const char *, int)));  connect( job, SIGNAL( receivedResponse( KIO::Job *, KWIQResponse*)), SLOT( slotReceivedResponse( KIO::Job *, KWIQResponse*)) );  if (KWQServeRequest(this, req, job))      m_requestsLoading.insert(job, req);#else  connect( job, SIGNAL( data( KIO::Job*, const QByteArray &)),           SLOT( slotData( KIO::Job*, const QByteArray &)));  if ( req->object->schedule() )      KIO::Scheduler::scheduleJob( job );  m_requestsLoading.insert(job, req);#endif // APPLE_CHANGES}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())  {      kdDebug(6060) << "Loader::slotFinished, with error. job->error()= " << j->error() << " job->isErrorPage()=" << j->isErrorPage() << endl;      r->object->error( job->error(), job->errorText().ascii() );      emit requestFailed( r->m_docLoader, r->object );  }  else  {      r->object->data(r->m_buffer, true);      emit requestDone( r->m_docLoader, r->object );#if !APPLE_CHANGES      time_t expireDate = j->queryMetaData("expire-date").toLong();kdDebug(6060) << "Loader::slotFinished, url = " << j->url().url() << " expires " << ctime(&expireDate) << endl;      r->object->setExpireDate(expireDate, false);#endif  }#if APPLE_CHANGES  // We don't want to ever finish the load in the case of an error because we don't want them cached.  if (j->error())      Cache::removeCacheEntry( r->object );  else#endif  r->object->finish();#ifdef CACHE_DEBUG  kdDebug( 6060 ) << "Loader:: JOB FINISHED " << r->object << ": " << r->object->url().string() << endl;#endif  delete r;  servePendingRequests();}#if APPLE_CHANGESvoid Loader::slotReceivedResponse(KIO::Job* job, KWIQResponse *response){    Request *r = m_requestsLoading[job];    ASSERT(r);    ASSERT(response);    r->object->setResponse(response);    r->object->setExpireDate(KWQCacheObjectExpiresTime(r->m_docLoader, response), false);}#endif#if APPLE_CHANGESvoid Loader::slotData( KIO::Job*job, const char *data, int size )#elsevoid Loader::slotData( KIO::Job*job, const QByteArray &data )#endif{    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 );#if APPLE_CHANGES    r->m_buffer.writeBlock( data, size );#else    r->m_buffer.writeBlock( data.data(), data.size() );#endif    if(r->incremental)        r->object->data( r->m_buffer, false );}int Loader::numRequests( DocLoader* dl ) const{    int res = 0;    QPtrListIterator<Request> pIt( m_requestsPending );    for (; pIt.current(); ++pIt )        if ( pIt.current()->m_docLoader == dl )            res++;    QPtrDictIterator<Request> lIt( m_requestsLoading );    for (; lIt.current(); ++lIt )        if ( lIt.current()->m_docLoader == dl )            res++;    return res;}void Loader::cancelRequests( DocLoader* dl ){    //kdDebug( 6060 ) << "void Loader::cancelRequests()" << endl;    //kdDebug( 6060 ) << "got " << m_requestsPending.count() << " pending requests" << endl;    QPtrListIterator<Request> pIt( m_requestsPending );    while ( pIt.current() )    {        if ( pIt.current()->m_docLoader == dl )        {            kdDebug( 6060 ) << "cancelling pending request for " << pIt.current()->object->url().string() << endl;            //emit requestFailed( dl, pIt.current()->object );            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_docLoader == dl )        {            //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();            //emit requestFailed( dl, pIt.current()->object );        }        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;}// ----------------------------------------------------------------------------LRUList::LRUList():m_head(0), m_tail(0) {}LRUList::~LRUList(){}QDict<CachedObject> *Cache::cache = 0;QPtrList<DocLoader>* Cache::docloader = 0;Loader *Cache::m_loader = 0;int Cache::maxSize = DEFCACHESIZE;int Cache::flushCount = 0;QPixmap *Cache::nullPixmap = 0;QPixmap *Cache::brokenPixmap = 0;CachedObject *Cache::m_headOfUncacheableList = 0;int Cache::m_totalSizeOfLRULists = 0;int Cache::m_countOfLRUAndUncacheableLists;LRUList *Cache::m_LRULists = 0;void Cache::init(){    if ( !cache )        cache = new QDict<CachedObject>(401, true);    if ( !docloader )        docloader = new QPtrList<DocLoader>;    if ( !nullPixmap )        nullPixmap = new QPixmap;    if ( !brokenPixmap )#if APPLE_CHANGES        brokenPixmap = KWQLoadPixmap("missing_image");#else        brokenPixmap = new QPixmap(KHTMLFactory::instance()->iconLoader()->loadIcon("file_broken", KIcon::Desktop, 16, KIcon::DisabledState));#endif    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 nullPixmap; nullPixmap = 0;    delete brokenPixmap; brokenPixmap = 0;    delete m_loader;   m_loader = 0;    delete docloader; docloader = 0;}CachedImage *Cache::requestImage( DocLoader* dl, const DOMString & url, bool reload, time_t _expireDate ){    // this brings the _url to a standard form...    KURL kurl;    if (dl)        kurl = dl->m_doc->completeURL( url.string() );    else        kurl = url.string();    return requestImage(dl, kurl, reload, _expireDate);}CachedImage *Cache::requestImage( DocLoader* dl, const KURL & url, bool reload, time_t _expireDate ){    KIO::CacheControl cachePolicy;    if (dl)        cachePolicy = dl->cachePolicy();    else        cachePolicy = KIO::CC_Verify;#if APPLE_CHANGES    // Checking if the URL is malformed is lots of extra work for little benefit.#else    if( kurl.isMalformed() )    {#ifdef CACHE_DEBUG      kdDebug( 6060 ) << "Cache: Malformed url: " << url.url() << endl;#endif      return 0;    }#endif#if APPLE_CHANGES    if (!dl->doc()->shouldCreateRenderers()){        return 0;    }#endif    CachedObject *o = 0;    if (!reload){        o = cache->find(url.url());    }    if(!o)    {#ifdef CACHE_DEBUG        kdDebug( 6060 ) << "Cache: new: " << url.url() << endl;#endif        CachedImage *im = new CachedImage(dl, url.url(), cachePolicy, _expireDate);        if ( dl && dl->autoloadImages() ) Cache::loader()->load(dl, im, true);#if APPLE_CHANGES        if (cacheDisabled)            im->setFree(true);        else {#endif        cache->insert( url.url(), im );        moveToHeadOfLRUList(im);#if APPLE_CHANGES        }#endif        o = im;    }#if !APPLE_CHANGES    o->setExpireDate(_expireDate, true);#endif        if(o->type() != CachedObject::Image)    {#ifdef CACHE_DEBUG        kdDebug( 6060 ) << "Cache::Internal Error in requestImage url=" << url.url() << "!" << endl;#endif        return 0;    }#ifdef CACHE_DEBUG    if( o->status() == CachedObject::Pending )        kdDebug( 6060 ) << "Cache: loading in progress: " << url.url() << endl;    else        kdDebug( 6060 ) << "Cache: using cached: " << url.url() << ", status " << o->status() << endl;#endif    moveToHeadOfLRUList(o);    if ( dl ) {        dl->m_docObjects.remove( o );#if APPLE_CHANGES        if (!cacheDisabled)#endif        dl->m_docObjects.append( o );    }    return static_cast<CachedImage *>(o);}CachedCSSStyleSheet *Cache::requestStyleSheet( DocLoader* dl, const DOMString & url, bool reload, time_t _expireDate, const QString& charset){    // this brings the _url to a standard form...    KURL kurl;    KIO::CacheControl cachePolicy;    if ( dl )    {        kurl = dl->m_doc->completeURL( url.string() );        cachePolicy = dl->cachePolicy();    }    else    {        kurl = url.string();        cachePolicy = KIO::CC_Verify;    }#if APPLE_CHANGES    // Checking if the URL is malformed is lots of extra work for little benefit.#else    if( kurl.isMalformed() )    {      kdDebug( 6060 ) << "Cache: Malformed url: " << kurl.url() << endl;      return 0;    }#endif    CachedObject *o = cache->find(kurl.url());    if(!o)    {#ifdef CACHE_DEBUG        kdDebug( 6060 ) << "Cache: new: " << kurl.url() << endl;#endif        CachedCSSStyleSheet *sheet = new CachedCSSStyleSheet(dl, kurl.url(), cachePolicy, _expireDate, charset);#if APPLE_CHANGES        if (cacheDisabled)            sheet->setFree(true);        else {

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -