02a67357a0df3323d28aa9b7aed2e58471f00e5c
[WebKit-https.git] / WebCore / khtml / misc / CachedObject.cpp
1 /*
2     This file is part of the KDE libraries
3
4     Copyright (C) 1998 Lars Knoll (knoll@mpi-hd.mpg.de)
5     Copyright (C) 2001 Dirk Mueller (mueller@kde.org)
6     Copyright (C) 2002 Waldo Bastian (bastian@kde.org)
7     Copyright (C) 2004, 2005, 2006 Apple Computer, Inc.
8
9     This library is free software; you can redistribute it and/or
10     modify it under the terms of the GNU Library General Public
11     License as published by the Free Software Foundation; either
12     version 2 of the License, or (at your option) any later version.
13
14     This library is distributed in the hope that it will be useful,
15     but WITHOUT ANY WARRANTY; without even the implied warranty of
16     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
17     Library General Public License for more details.
18
19     You should have received a copy of the GNU Library General Public License
20     along with this library; see the file COPYING.LIB.  If not, write to
21     the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
22     Boston, MA 02111-1307, USA.
23
24     This class provides all functionality needed for loading images, style sheets and html
25     pages from the web. It has a memory cache for these objects.
26 */
27
28 #include "config.h"
29
30 #include "CachedObject.h"
31 #include "Cache.h"
32
33 #include <qasyncio.h>
34 #include <kio/job.h>
35 #include <kio/jobclasses.h>
36 #include <kcharsets.h>
37 #include <kdebug.h>
38 #include "decoder.h"
39
40 #include <kxmlcore/Assertions.h>
41
42 using namespace DOM;
43
44 namespace khtml {
45
46 CachedObject::~CachedObject()
47 {
48     if(m_deleted) abort();
49     Cache::removeFromLRUList(this);
50     m_deleted = true;
51     setResponse(0);
52     setAllData(0);
53 }
54
55 void CachedObject::finish()
56 {
57     if (m_size > Cache::maxCacheableObjectSize())
58         m_status = Uncacheable;
59     else
60         m_status = Cached;
61     KURL url(m_url.qstring());
62     if (m_expireDateChanged && url.protocol().startsWith("http"))
63         m_expireDateChanged = false;
64 }
65
66 void CachedObject::setExpireDate(time_t _expireDate, bool changeHttpCache)
67 {
68     if ( _expireDate == m_expireDate)
69         return;
70
71     if (m_status == Uncacheable || m_status == Cached)
72     {
73         finish();
74     }
75     m_expireDate = _expireDate;
76     if (changeHttpCache && m_expireDate)
77        m_expireDateChanged = true;
78 }
79
80 bool CachedObject::isExpired() const
81 {
82     if (!m_expireDate) return false;
83     time_t now = time(0);
84     return (difftime(now, m_expireDate) >= 0);
85 }
86
87 void CachedObject::setRequest(Request *_request)
88 {
89     if ( _request && !m_request )
90         m_status = Pending;
91     m_request = _request;
92     if (canDelete() && m_free)
93         delete this;
94     else if (allowInLRUList())
95         Cache::insertInLRUList(this);
96 }
97
98 void CachedObject::ref(CachedObjectClient *c)
99 {
100     m_clients.insert(c, c);
101     Cache::removeFromLRUList(this);
102     increaseAccessCount();
103 }
104
105 void CachedObject::deref(CachedObjectClient *c)
106 {
107     m_clients.remove(c);
108     if (allowInLRUList())
109         Cache::insertInLRUList(this);
110 }
111
112 void CachedObject::setSize(int size)
113 {
114     bool sizeChanged = Cache::adjustSize(this, size - m_size);
115
116     // The object must now be moved to a different queue, since its size has been changed.
117     if (sizeChanged && allowInLRUList())
118         Cache::removeFromLRUList(this);
119
120     m_size = size;
121     
122     if (sizeChanged && allowInLRUList())
123         Cache::insertInLRUList(this);
124 }
125
126 };