15eeae806b364ab1b54ad6b3f6348ee36c40ce0d
[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, 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_platformResponse = 0;
53     m_allData = 0;
54     m_expireDateChanged = false;
55     m_accessCount = 0;
56     m_nextInLRUList = 0;
57     m_prevInLRUList = 0;
58 #ifndef NDEBUG
59     m_deleted = false;
60     m_lruIndex = 0;
61 #endif
62 }
63
64 CachedResource::~CachedResource()
65 {
66     ASSERT(!inCache());
67     ASSERT(!m_deleted);
68 #ifndef NDEBUG
69     m_deleted = true;
70 #endif
71     setPlatformResponse(0);
72     setAllData(0);
73 }
74
75 Vector<char>& CachedResource::bufferData(const char* bytes, int addedSize, Request* request)
76 {
77     // Add new bytes to the buffer in the Request object.
78     Vector<char>& buffer = request->buffer();
79
80     unsigned oldSize = buffer.size();
81     buffer.resize(oldSize + addedSize);
82     memcpy(buffer.data() + oldSize, bytes, addedSize);
83     
84     return buffer;
85 }
86
87 void CachedResource::finish()
88 {
89     m_status = Cached;
90     KURL url(m_url.deprecatedString());
91     if (m_expireDateChanged && url.protocol().startsWith("http"))
92         m_expireDateChanged = false;
93 }
94
95 bool CachedResource::isExpired() const
96 {
97     if (!m_response.expirationDate())
98         return false;
99     time_t now = time(0);
100     return (difftime(now, m_response.expirationDate()) >= 0);
101 }
102
103 void CachedResource::setRequest(Request* request)
104 {
105     if (request && !m_request)
106         m_status = Pending;
107     m_request = request;
108     if (canDelete() && !inCache())
109         delete this;
110 }
111
112 void CachedResource::ref(CachedResourceClient *c)
113 {
114     if (!referenced() && inCache())
115         cache()->addToLiveObjectSize(size());
116     m_clients.add(c);
117 }
118
119 void CachedResource::deref(CachedResourceClient *c)
120 {
121     m_clients.remove(c);
122     if (canDelete() && !inCache())
123         delete this;
124     else if (!referenced() && inCache()) {
125         cache()->removeFromLiveObjectSize(size());
126         cache()->prune();
127     }
128 }
129
130 void CachedResource::setSize(unsigned size)
131 {
132     if (size == m_size)
133         return;
134
135     unsigned oldSize = m_size;
136
137     // The object must now be moved to a different queue, since its size has been changed.
138     // We have to remove explicitly before updating m_size, so that we find the correct previous
139     // queue.
140     if (inCache())
141         cache()->removeFromLRUList(this);
142     
143     m_size = size;
144    
145     if (inCache()) { 
146         // Now insert into the new LRU list.
147         cache()->insertInLRUList(this);
148         
149         // Update the cache's size totals.
150         cache()->adjustSize(referenced(), oldSize, size);
151     }
152 }
153
154 }