📄 loader.h
字号:
/* This file is part of the KDE libraries Copyright (C) 1998 Lars Knoll (knoll@mpi-hd.mpg.de) Copyright (C) 2001 Dirk Mueller <mueller@kde.org> Copyright (C) 2003 Apple Computer, Inc. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. This class provides all functionality needed for loading images, style sheets and html pages from the web. It has a memory cache for these objects.*/#ifndef _khtml_loader_h#define _khtml_loader_h#ifdef HAVE_CONFIG_H#include <config.h>#endif#include <time.h>#include "loader_client.h"#ifdef HAVE_LIBJPEG#include "loader_jpeg.h"#endif#include <stdlib.h>#include <qptrlist.h>#include <qobject.h>#include <qptrdict.h>#include <qdict.h>#include <qpixmap.h>#include <qbuffer.h>#include <qstringlist.h>#include <qtextcodec.h>#include <kurl.h>#include <kio/global.h>#include <khtml_settings.h>#include <dom/dom_string.h>class QMovie;class KHTMLPart;namespace KIO { class Job; class TransferJob;}namespace DOM{ class CSSStyleSheetImpl; class DocumentImpl;};#if APPLE_CHANGESclass KWQLoader;#endifnamespace khtml{ class CachedObject; class Request; class DocLoader; #define MAX_LRU_LISTS 20 struct LRUList { CachedObject* m_head; CachedObject* m_tail; LRUList(); ~LRUList(); }; /** * @internal * * A cached object. Classes who want to use this object should derive * from CachedObjectClient, to get the function calls in case the requested data has arrived. * * This class also does the actual communication with kio and loads the file. */ class CachedObject { public: enum Type { Image, CSSStyleSheet, Script,#ifndef KHTML_NO_XBL XBL#endif }; enum Status { NotCached, // this URL is not cached Unknown, // let imagecache decide what to do with it New, // inserting new image Pending, // only partially loaded Persistent, // never delete this pixmap Cached, // regular case Uncacheable // too big to be cached, }; // will be destroyed as soon as possible CachedObject(const DOM::DOMString &url, Type type, KIO::CacheControl _cachePolicy, time_t _expireDate, int size = 0) { m_url = url; m_type = type; m_status = Pending; m_size = size; m_free = false; m_cachePolicy = _cachePolicy; m_request = 0;#if APPLE_CHANGES m_response = 0;#endif m_expireDate = _expireDate; m_deleted = false; m_expireDateChanged = false; m_accessCount = 0; m_nextInLRUList = 0; m_prevInLRUList = 0; } virtual ~CachedObject(); virtual void data( QBuffer &buffer, bool eof) = 0; virtual void error( int err, const char *text ) = 0; const DOM::DOMString &url() const { return m_url; } Type type() const { return m_type; } virtual void ref(CachedObjectClient *consumer); virtual void deref(CachedObjectClient *consumer); int count() const { return m_clients.count(); } Status status() const { return m_status; } int size() const { return m_size; } int accessCount() const { return m_accessCount; } void increaseAccessCount() { m_accessCount++; } /** * computes the status of an object after loading. * the result depends on the objects size and the size of the cache * also updates the expire date on the cache entry file */ void finish(); /** * Called by the cache if the object has been removed from the cache dict * while still being referenced. This means the object should kill itself * if its reference counter drops down to zero. */ void setFree( bool b ) { m_free = b; } KIO::CacheControl cachePolicy() const { return m_cachePolicy; } void setRequest(Request *_request);#if APPLE_CHANGES KWIQResponse *response() { return m_response; } void setResponse (KWIQResponse *response);#endif bool canDelete() const { return (m_clients.count() == 0 && !m_request); } void setExpireDate(time_t _expireDate, bool changeHttpCache); bool isExpired() const; virtual bool schedule() const { return false; } /** * List of acceptable mimetypes seperated by ",". A mimetype may contain a wildcard. */ // e.g. "text/*" QString accept() const { return m_accept; } void setAccept(const QString &_accept) { m_accept = _accept; } protected: void setSize(int size); QPtrDict<CachedObjectClient> m_clients; DOM::DOMString m_url; QString m_accept; Request *m_request;#if APPLE_CHANGES KWIQResponse *m_response;#endif Type m_type; Status m_status; private: int m_size; int m_accessCount; protected: time_t m_expireDate; KIO::CacheControl m_cachePolicy; bool m_free : 1; bool m_deleted : 1; bool m_loading : 1; bool m_expireDateChanged : 1; private: bool allowInLRUList() { return canDelete() && status() != Persistent; } CachedObject *m_nextInLRUList; CachedObject *m_prevInLRUList; friend class Cache; }; /** * a cached style sheet */ class CachedCSSStyleSheet : public CachedObject { public: CachedCSSStyleSheet(DocLoader* dl, const DOM::DOMString &url, KIO::CacheControl cachePolicy, time_t _expireDate, const QString& charset); CachedCSSStyleSheet(const DOM::DOMString &url, const QString &stylesheet_data); virtual ~CachedCSSStyleSheet(); const DOM::DOMString &sheet() const { return m_sheet; } virtual void ref(CachedObjectClient *consumer); virtual void deref(CachedObjectClient *consumer); virtual void data( QBuffer &buffer, bool eof ); virtual void error( int err, const char *text ); virtual bool schedule() const { return true; } void checkNotify(); protected: DOM::DOMString m_sheet; QTextCodec* m_codec; }; /** * a cached script */ class CachedScript : public CachedObject { public: CachedScript(DocLoader* dl, const DOM::DOMString &url, KIO::CacheControl cachePolicy, time_t _expireDate, const QString& charset); CachedScript(const DOM::DOMString &url, const QString &script_data); virtual ~CachedScript(); const DOM::DOMString &script() const { return m_script; } virtual void ref(CachedObjectClient *consumer); virtual void deref(CachedObjectClient *consumer); virtual void data( QBuffer &buffer, bool eof ); virtual void error( int err, const char *text ); virtual bool schedule() const { return false; } void checkNotify(); bool isLoaded() const { return !m_loading; } protected: DOM::DOMString m_script; QTextCodec* m_codec; }; class ImageSource; /** * a cached image */ class CachedImage : public QObject, public CachedObject { Q_OBJECT public: CachedImage(DocLoader* dl, const DOM::DOMString &url, KIO::CacheControl cachePolicy, time_t _expireDate); virtual ~CachedImage(); const QPixmap &pixmap() const; const QPixmap &tiled_pixmap(const QColor& bg); QSize pixmap_size() const; // returns the size of the complete (i.e. when finished) loading QRect valid_rect() const; // returns the rectangle of pixmap that has been loaded already void ref(CachedObjectClient *consumer); virtual void deref(CachedObjectClient *consumer); virtual void data( QBuffer &buffer, bool eof ); virtual void error( int err, const char *text ); bool isTransparent() const { return isFullyTransparent; } bool isErrorImage() const { return errorOccured; } void setShowAnimations( KHTMLSettings::KAnimationAdvice ); virtual bool schedule() const { return true; } void checkNotify(); protected:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -