Not reviewed, fix for accidental commit.
[WebKit-https.git] / WebCore / loader / CachedResource.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) 2006 Samuel Weinig (sam.weinig@gmail.com)
8     Copyright (C) 2004, 2005, 2006 Apple Computer, Inc.
9
10     This library is free software; you can redistribute it and/or
11     modify it under the terms of the GNU Library General Public
12     License as published by the Free Software Foundation; either
13     version 2 of the License, or (at your option) any later version.
14
15     This library is distributed in the hope that it will be useful,
16     but WITHOUT ANY WARRANTY; without even the implied warranty of
17     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
18     Library General Public License for more details.
19
20     You should have received a copy of the GNU Library General Public License
21     along with this library; see the file COPYING.LIB.  If not, write to
22     the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
23     Boston, MA 02111-1307, USA.
24
25     This class provides all functionality needed for loading images, style sheets and html
26     pages from the web. It has a memory cache for these objects.
27 */
28
29 #include "config.h"
30 #include "CachedResource.h"
31
32 #include "Cache.h"
33 #include "Request.h"
34 #include <KURL.h>
35 #include <wtf/Vector.h>
36
37 #if PLATFORM(MAC)
38 #include <CoreFoundation/CoreFoundation.h>
39 #endif
40
41 namespace WebCore {
42
43 CachedResource::CachedResource(const String& URL, Type type, CachePolicy cachePolicy, time_t expireDate, unsigned size)
44 {
45     m_url = URL;
46     m_type = type;
47     m_status = Pending;
48     m_size = size;
49     m_inCache = false;
50     m_cachePolicy = cachePolicy;
51     m_request = 0;
52     m_response = 0;
53     m_allData = 0;
54     m_expireDate = expireDate;
55     m_expireDateChanged = false;
56     m_accessCount = 0;
57     m_nextInLRUList = 0;
58     m_prevInLRUList = 0;
59 #ifndef NDEBUG
60     m_deleted = false;
61     m_lruIndex = 0;
62 #endif
63 }
64
65 CachedResource::~CachedResource()
66 {
67     ASSERT(!inCache());
68     ASSERT(!m_deleted);
69 #ifndef NDEBUG
70     m_deleted = true;
71 #endif
72     setResponse(0);
73     setAllData(0);
74 }
75
76 Vector<char>& CachedResource::bufferData(const char* bytes, int addedSize, Request* request)
77 {
78     // Add new bytes to the buffer in the Request object.
79     Vector<char>& buffer = request->buffer();
80
81     unsigned oldSize = buffer.size();
82     buffer.resize(oldSize + addedSize);
83     memcpy(buffer.data() + oldSize, bytes, addedSize);
84     
85     return buffer;
86 }
87
88 void CachedResource::finish()
89 {
90     m_status = Cached;
91     KURL url(m_url.deprecatedString());
92     if (m_expireDateChanged && url.protocol().startsWith("http"))
93         m_expireDateChanged = false;
94 }
95
96 void CachedResource::setExpireDate(time_t expireDate, bool changeHttpCache)
97 {
98     if (expireDate == m_expireDate)
99         return;
100
101     if (m_status == Cached)
102         finish();
103
104     m_expireDate = expireDate;
105     if (changeHttpCache && m_expireDate)
106        m_expireDateChanged = true;
107 }
108
109 bool CachedResource::isExpired() const
110 {
111     if (!m_expireDate)
112         return false;
113     time_t now = time(0);
114     return (difftime(now, m_expireDate) >= 0);
115 }
116
117 void CachedResource::setRequest(Request* request)
118 {
119     if (request && !m_request)
120         m_status = Pending;
121     m_request = request;
122     if (canDelete() && !inCache())
123         delete this;
124 }
125
126 void CachedResource::ref(CachedResourceClient *c)
127 {
128     if (!referenced() && inCache())
129         cache()->addToLiveObjectSize(size());
130     m_clients.add(c);
131 }
132
133 void CachedResource::deref(CachedResourceClient *c)
134 {
135     m_clients.remove(c);
136     if (canDelete() && !inCache())
137         delete this;
138     else if (!referenced() && inCache()) {
139         cache()->removeFromLiveObjectSize(size());
140         cache()->prune();
141     }
142 }
143
144 void CachedResource::setSize(unsigned size)
145 {
146     if (size == m_size)
147         return;
148
149     unsigned oldSize = m_size;
150
151     // The object must now be moved to a different queue, since its size has been changed.
152     // We have to remove explicitly before updating m_size, so that we find the correct previous
153     // queue.
154     if (inCache())
155         cache()->removeFromLRUList(this);
156     
157     m_size = size;
158    
159     if (inCache()) { 
160         // Now insert into the new LRU list.
161         cache()->insertInLRUList(this);
162         
163         // Update the cache's size totals.
164         cache()->adjustSize(referenced(), oldSize, size);
165     }
166 }
167
168 }