📄 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) 2004 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_CHANGES
class KWQLoader;
#if __OBJC__
@class NSData;
@class NSURLResponse;
#else
class NSData;
class NSURLResponse;
#endif
#endif
namespace 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
OOM_MODIFIED
{
public:
enum Type {
Image,
CSSStyleSheet,
Script
#ifdef KHTML_XSLT
, XSLStyleSheet
#endif
#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;
#if !NOKIA_CHANGES
m_allData = 0;
#endif
#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 NOKIA_CHANGES
MWebCoreUrlResponseHeaderInfo *response() const { return m_response; }
void setResponse(MWebCoreUrlResponseHeaderInfo *response);
#else
#if APPLE_CHANGES
NSURLResponse *response() const { return m_response; }
void setResponse(NSURLResponse *response);
NSData *allData() const { return m_allData; }
void setAllData (NSData *data);
#endif
#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 NOKIA_CHANGES
MWebCoreUrlResponseHeaderInfo *m_response;
#else
#if APPLE_CHANGES
NSURLResponse *m_response;
NSData *m_allData;
#endif
#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();
#if NOKIA_CHANGES
const DOM::DOMString sheet() const;
#else
const DOM::DOMString &sheet() const { return m_sheet; }
#endif
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:
#if NOKIA_CHANGES
QString m_stringData;
QByteArray m_data;
#else
DOM::DOMString m_sheet;
#endif
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();
#if NOKIA_CHANGES
const DOM::DOMString script() const;
#else
const DOM::DOMString &script() const { return m_script; }
#endif
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:
#if NOKIA_CHANGES
QString m_stringData;
QByteArray m_data;
#else
DOM::DOMString m_script;
#endif
QTextCodec* m_codec;
};
class ImageSource;
#if APPLE_CHANGES
class CachedImage;
class CachedImageCallback
{
public:
CachedImageCallback (CachedImage *c) : cachedImage(c), refCount(1), headerReceived(false) {};
void ref() { refCount++; }
void deref() { if (--refCount == 0) delete this; }
void notifyUpdate();
void notifyFinished();
void notifyDecodingError();
void clear();
void handleError();
private:
CachedImage *cachedImage;
uint refCount;
bool headerReceived;
};
#endif
/**
* 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; }
#if NOKIA_CHANGES
bool isErrorImage() const { return errorOccured || (!p && !m_loading); }
#else
bool isErrorImage() const { return errorOccured; }
#endif
void setShowAnimations( KHTMLSettings::KAnimationAdvice );
virtual bool schedule() const { return true; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -