Reviewed by Adele.
[WebKit-https.git] / WebCore / loader / CachedResource.h
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) 2006 Samuel Weinig (sam.weinig@gmail.com)
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 #ifndef CachedResource_h
29 #define CachedResource_h
30
31 #include "CachePolicy.h"
32 #include "PlatformString.h"
33 #include "ResourceHandleClient.h" // defines PlatformResponse and PlatformData
34 #include "ResourceResponse.h"
35 #include <wtf/HashSet.h>
36 #include <wtf/Vector.h>
37 #include <time.h>
38
39 #if PLATFORM(MAC)
40 #include "RetainPtr.h"
41
42 #ifdef __OBJC__
43 @class NSURLRequest;
44 #else
45 class NSURLRequest;
46 #endif
47
48 #endif // PLATFORM(MAC)
49
50 namespace WebCore {
51
52 class Cache;
53 class CachedResourceClient;
54 class Request;
55
56 // A resource that is held in the cache. Classes who want to use this object should derive
57 // from CachedResourceClient, to get the function calls in case the requested data has arrived.
58 // This class also does the actual communication with the loader to obtain the resource from the network.
59 class CachedResource {
60 public:
61     enum Type {
62         ImageResource,
63         CSSStyleSheet,
64         Script
65 #ifdef XSLT_SUPPORT
66         , XSLStyleSheet
67 #endif
68 #ifdef XBL_SUPPORT
69         , XBL
70 #endif
71     };
72
73     enum Status {
74         NotCached,    // this URL is not cached
75         Unknown,      // let cache decide what to do with it
76         New,          // inserting new item
77         Pending,      // only partially loaded
78         Cached       // regular case
79     };
80
81     CachedResource(const String& URL, Type type, CachePolicy cachePolicy, unsigned size = 0);
82     virtual ~CachedResource();
83
84     virtual void setEncoding(const String&) { }
85     virtual Vector<char>& bufferData(const char* bytes, int addedSize, Request*);
86     virtual void data(Vector<char>&, bool allDataReceived) = 0;
87     virtual void error() = 0;
88
89     const String &url() const { return m_url; }
90     Type type() const { return m_type; }
91
92     virtual void ref(CachedResourceClient*);
93     void deref(CachedResourceClient*);
94     bool referenced() const { return !m_clients.isEmpty(); }
95
96     unsigned count() const { return m_clients.size(); }
97
98     Status status() const { return m_status; }
99
100     unsigned size() const { return m_size; }
101
102     bool isLoaded() const { return !m_loading; }
103     void setLoading(bool b) { m_loading = b; }
104
105     virtual bool isImage() const { return false; }
106
107     unsigned accessCount() const { return m_accessCount; }
108     void increaseAccessCount() { m_accessCount++; }
109
110     // Computes the status of an object after loading.  
111     // Updates the expire date on the cache entry file
112     void finish();
113
114     // Called by the cache if the object has been removed from the cache
115     // while still being referenced. This means the object should delete itself
116     // if the number of clients observing it ever drops to 0.
117     void setInCache(bool b) { m_inCache = b; }
118     bool inCache() const { return m_inCache; }
119     
120     CachePolicy cachePolicy() const { return m_cachePolicy; }
121
122     void setRequest(Request*);
123
124     PlatformResponse platformResponse() const { return m_platformResponse; }
125     void setPlatformResponse(PlatformResponse);
126     PlatformData allData() const { return m_allData; }
127     void setAllData(PlatformData);
128
129     void setResponse(const ResourceResponse& response) { m_response = response; }
130
131     bool canDelete() const { return !referenced() && !m_request; }
132
133     bool isExpired() const;
134
135     virtual bool schedule() const { return false; }
136
137     // List of acceptable MIME types seperated by ",".
138     // A MIME type may contain a wildcard, e.g. "text/*".
139     String accept() const { return m_accept; }
140     void setAccept(const String& accept) { m_accept = accept; }
141
142 #if PLATFORM(MAC)
143     NSURLRequest* getNSURLRequest();
144 #endif
145
146 protected:
147     void setSize(unsigned size);
148
149     HashSet<CachedResourceClient*> m_clients;
150
151     String m_url;
152     String m_accept;
153     Request* m_request;
154
155 #if PLATFORM(MAC)
156     RetainPtr<NSURLRequest> m_nsURLRequest;
157 #endif
158
159     ResourceResponse m_response;
160     PlatformResponse m_platformResponse;
161     PlatformData m_allData;
162
163     Type m_type;
164     Status m_status;
165
166 private:
167     unsigned m_size;
168     unsigned m_accessCount;
169
170 protected:
171     CachePolicy m_cachePolicy;
172     bool m_inCache;
173     bool m_loading;
174     bool m_expireDateChanged;
175 #ifndef NDEBUG
176     bool m_deleted;
177     unsigned m_lruIndex;
178 #endif
179
180 private:
181     CachedResource* m_nextInLRUList;
182     CachedResource* m_prevInLRUList;
183     friend class Cache;
184 };
185
186 }
187
188 #endif