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

📄 loader.cpp

📁 khtml在gtk上的移植版本
💻 CPP
📖 第 1 页 / 共 4 页
字号:
#endif        cache->insert( kurl.url(), sheet );        moveToHeadOfLRUList(sheet);#if APPLE_CHANGES        }#endif        o = sheet;    }#if !APPLE_CHANGES    o->setExpireDate(_expireDate, true);#endif        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    moveToHeadOfLRUList(o);    if ( dl ) {        dl->m_docObjects.remove( o );#if APPLE_CHANGES        if (!cacheDisabled)#endif        dl->m_docObjects.append( o );    }    return static_cast<CachedCSSStyleSheet *>(o);}void Cache::preloadStyleSheet( const QString &url, const QString &stylesheet_data){    CachedObject *o = cache->find(url);    if(o)        removeCacheEntry(o);    CachedCSSStyleSheet *stylesheet = new CachedCSSStyleSheet(url, stylesheet_data);    cache->insert( url, stylesheet );}CachedScript *Cache::requestScript( DocLoader* dl, const DOM::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        CachedScript *script = new CachedScript(dl, kurl.url(), cachePolicy, _expireDate, charset);#if APPLE_CHANGES        if (cacheDisabled)            script->setFree(true);        else {#endif        cache->insert( kurl.url(), script );        moveToHeadOfLRUList(script);#if APPLE_CHANGES        }#endif        o = script;    }#if !APPLE_CHANGES    o->setExpireDate(_expireDate, true);#endif        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    moveToHeadOfLRUList(o);    if ( dl ) {        dl->m_docObjects.remove( o );#if APPLE_CHANGES        if (!cacheDisabled)#endif        dl->m_docObjects.append( o );    }    return static_cast<CachedScript *>(o);}void Cache::preloadScript( const QString &url, const QString &script_data){    CachedObject *o = cache->find(url);    if(o)        removeCacheEntry(o);    CachedScript *script = new CachedScript(url, script_data);    cache->insert( url, script );}#ifndef KHTML_NO_XBLCachedXBLDocument* Cache::requestXBLDocument(DocLoader* dl, const DOMString & url, bool reload,                                              time_t _expireDate){    // 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        CachedXBLDocument* doc = new CachedXBLDocument(dl, kurl.url(), cachePolicy, _expireDate);#if APPLE_CHANGES        if (cacheDisabled)            doc->setFree(true);        else {#endif            cache->insert(kurl.url(), doc);            moveToHeadOfLRUList(doc);#if APPLE_CHANGES        }#endif        o = doc;    }    #if !APPLE_CHANGES    o->setExpireDate(_expireDate, true);#endif        if(o->type() != CachedObject::XBL)    {#ifdef CACHE_DEBUG        kdDebug( 6060 ) << "Cache::Internal Error in requestXBLDocument 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        moveToHeadOfLRUList(o);    if ( dl ) {        dl->m_docObjects.remove( o );#if APPLE_CHANGES        if (!cacheDisabled)#endif            dl->m_docObjects.append( o );    }    return static_cast<CachedXBLDocument*>(o);}#endifvoid Cache::flush(bool force){    if (force)       flushCount = 0;    // Don't flush for every image.    if (m_countOfLRUAndUncacheableLists < flushCount)       return;    init();#ifdef CACHE_DEBUG    statistics();    kdDebug( 6060 ) << "Cache: flush()" << endl;#endif    while (m_headOfUncacheableList)        removeCacheEntry(m_headOfUncacheableList);        for (int i = MAX_LRU_LISTS-1; i>=0; i--) {        if (m_totalSizeOfLRULists <= maxSize)            break;                    while (m_totalSizeOfLRULists > maxSize && m_LRULists[i].m_tail) {            removeCacheEntry(m_LRULists[i].m_tail);        }    }    flushCount = m_countOfLRUAndUncacheableLists+10; // Flush again when the cache has grown.#ifdef CACHE_DEBUG    //statistics();#endif}#if 0void Cache::checkLRUAndUncacheableListIntegrity(){    int count = 0;        {        int size = 0;        CachedObject *prev = 0;        for (CachedObject *o = m_headOfLRUList; o; o = o->m_nextInLRUList) {            ASSERT(o->allowInLRUList());            ASSERT(o->status() != CachedObject::Uncacheable);            ASSERT(o->m_prevInLRUList == prev);            size += o->size();            prev = o;            ++count;        }        ASSERT(m_tailOfLRUList == prev);        ASSERT(m_totalSizeOfLRUList == size);    }        {        CachedObject *prev = 0;        for (CachedObject *o = m_headOfUncacheableList; o; o = o->m_nextInLRUList) {            ASSERT(o->allowInLRUList());            ASSERT(o->status() == CachedObject::Uncacheable);            ASSERT(o->m_prevInLRUList == prev);            prev = o;            ++count;        }    }        ASSERT(m_countOfLRUAndUncacheableLists == count);}#endifvoid 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  : " << m_countOfLRUAndUncacheableLists << 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;}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 );  removeFromLRUList(object);  const DocLoader* dl;  for ( dl=docloader->first(); dl; dl=docloader->next() )      dl->removeCachedObject( object );  if ( object->canDelete() )     delete object;}#define FAST_LOG2(_log2,_n)   \      unsigned int j_ = (unsigned int)(_n);   \      (_log2) = 0;                    \      if ((j_) & ((j_)-1))            \      (_log2) += 1;               \      if ((j_) >> 16)                 \      (_log2) += 16, (j_) >>= 16; \      if ((j_) >> 8)                  \      (_log2) += 8, (j_) >>= 8;   \      if ((j_) >> 4)                  \      (_log2) += 4, (j_) >>= 4;   \      if ((j_) >> 2)                  \      (_log2) += 2, (j_) >>= 2;   \      if ((j_) >> 1)                  \      (_log2) += 1;int FastLog2(unsigned int i) {    int log2;    FAST_LOG2(log2,i);    return log2;}LRUList* Cache::getLRUListFor(CachedObject* o){    int accessCount = o->accessCount();    int queueIndex;    if (accessCount == 0) {        queueIndex = 0;    } else {        int sizeLog = FastLog2(o->size());        queueIndex = sizeLog/o->accessCount() - 1;        if (queueIndex < 0)            queueIndex = 0;        if (queueIndex >= MAX_LRU_LISTS)            queueIndex = MAX_LRU_LISTS-1;    }    if (m_LRULists == 0) {        m_LRULists = new LRUList [MAX_LRU_LISTS];    }    return &m_LRULists[queueIndex];}void Cache::removeFromLRUList(CachedObject *object){    CachedObject *next = object->m_nextInLRUList;    CachedObject *prev = object->m_prevInLRUList;    bool uncacheable = object->status() == CachedObject::Uncacheable;        LRUList* list = uncacheable ? 0 : getLRUListFor(object);    CachedObject *&head = uncacheable ? m_headOfUncacheableList : list->m_head;        if (next == 0 && prev == 0 && head != object) {        return;    }        object->m_nextInLRUList = 0;    object->m_prevInLRUList = 0;        if (next)        next->m_prevInLRUList = prev;    else if (!uncacheable && list->m_tail == object)        list->m_tail = prev;    if (prev)        prev->m_nextInLRUList = next;    else if (head == object)        head = next;        --m_countOfLRUAndUncacheableLists;        if (!uncacheable)        m_totalSizeOfLRULists -= object->size();}void Cache::moveToHeadOfLRUList(CachedObject *object){    insertInLRUList(object);}void Cache::insertInLRUList(CachedObject *object){    removeFromLRUList(object);        if (!object->allowInLRUList())        return;        LRUList* list = getLRUListFor(object);        bool uncacheable = object->status() == CachedObject::Uncacheable;    CachedObject *&head = uncacheable ? m_headOfUncacheableList : list->m_head;    object->m_nextInLRUList = head;    if (head)        head->m_prevInLRUList = object;    head = object;        if (object->m_nextInLRUList == 0 && !uncacheable)        list->m_tail = object;        ++m_countOfLRUAndUncacheableLists;        if (!uncacheable)        m_totalSizeOfLRULists += object->size();}bool Cache::adjustSize(CachedObject *object, int delta){    if (object->status() == CachedObject::Uncacheable)        return false;    if (object->m_nextInLRUList == 0 && object->m_prevInLRUList == 0 &&        getLRUListFor(object)->m_head != object)        return false;        m_totalSizeOfLRULists += delta;    return delta != 0;}// --------------------------------------CachedObjectClient *CachedObjectClientWalker::next(){    // Only advance if we already returned this item.    // This handles cases where the current item is removed, and prevents us from skipping the next item.    // The iterator automatically gets advanced to the next item, and we make sure we return it.    if (_current == _iterator.current())        ++_iterator;    _current = _iterator.current();    return _current;}// --------------------------------------void CachedObjectClient::setPixmap(const QPixmap &, const QRect&, CachedImage *) {}void CachedObjectClient::setStyleSheet(const DOM::DOMString &/*url*/, const DOM::DOMString &/*sheet*/) {}#ifndef KHTML_NO_XBLvoid CachedObjectClient::setXBLDocument(const DOM::DOMString& url, XBL::XBLDocumentImpl* doc) {}#endifvoid CachedObjectClient::notifyFinished(CachedObject * /*finishedObj*/) {}#include "loader.moc"#if APPLE_CHANGESCache::Statistics Cache::getStatistics(){    Statistics stats;    if (!cache)        return stats;    QDictIterator<CachedObject> i(*cache);    for (i.toFirst(); i.current(); ++i) {        CachedObject *o = i.current();        switch (o->type()) {            case CachedObject::Image:                if (static_cast<CachedImage *>(o)->m) {                    stats.movies.count++;                    stats.movies.size += o->size();                } else {                    stats.images.count++;                    stats.images.size += o->size();                }                break;            case CachedObject::CSSStyleSheet:                stats.styleSheets.count++;                stats.styleSheets.size += o->size();                break;            case CachedObject::Script:                stats.scripts.count++;                stats.scripts.size += o->size();                break;#ifndef KHTML_NO_XBL            case CachedObject::XBL:                stats.xblDocs.count++;                stats.xblDocs.size += o->size();                break;#endif            default:                stats.other.count++;                stats.other.size += o->size();        }    }        return stats;}void Cache::flushAll(){    if (!cache)        return;    for (;;) {        QDictIterator<CachedObject> i(*cache);        CachedObject *o = i.toFirst();        if (!o)            break;        removeCacheEntry(o);    }}void Cache::setCacheDisabled(bool disabled){    cacheDisabled = disabled;    if (disabled)        flushAll();}#endif // APPLE_CHANGES

⌨️ 快捷键说明

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