1 /*
2  * Copyright (C) 2006 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package android.webkit;
18 
19 import java.io.File;
20 import java.io.IOException;
21 import java.io.InputStream;
22 import java.io.OutputStream;
23 import java.util.Map;
24 
25 
26 /**
27  * Manages the HTTP cache used by an application's {@link WebView} instances.
28  * @deprecated Access to the HTTP cache will be removed in a future release.
29  * @hide Since {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR1}
30  */
31 // The class CacheManager provides the persistent cache of content that is
32 // received over the network. The component handles parsing of HTTP headers and
33 // utilizes the relevant cache headers to determine if the content should be
34 // stored and if so, how long it is valid for. Network requests are provided to
35 // this component and if they can not be resolved by the cache, the HTTP headers
36 // are attached, as appropriate, to the request for revalidation of content. The
37 // class also manages the cache size.
38 //
39 // CacheManager may only be used if your activity contains a WebView.
40 @Deprecated
41 public final class CacheManager {
42     /**
43      * Represents a resource stored in the HTTP cache. Instances of this class
44      * can be obtained by calling
45      * {@link CacheManager#getCacheFile CacheManager.getCacheFile(String, Map<String, String>))}.
46      *
47      * @deprecated Access to the HTTP cache will be removed in a future release.
48      */
49     @Deprecated
50     public static class CacheResult {
51         // these fields are saved to the database
52         int httpStatusCode;
53         long contentLength;
54         long expires;
55         String expiresString;
56         String localPath;
57         String lastModified;
58         String etag;
59         String mimeType;
60         String location;
61         String encoding;
62         String contentdisposition;
63         String crossDomain;
64 
65         // these fields are NOT saved to the database
66         InputStream inStream;
67         OutputStream outStream;
68         File outFile;
69 
70         /**
71          * Gets the status code of this cache entry.
72          *
73          * @return the status code of this cache entry
74          */
getHttpStatusCode()75         public int getHttpStatusCode() {
76             return httpStatusCode;
77         }
78 
79         /**
80          * Gets the content length of this cache entry.
81          *
82          * @return the content length of this cache entry
83          */
getContentLength()84         public long getContentLength() {
85             return contentLength;
86         }
87 
88         /**
89          * Gets the path of the file used to store the content of this cache
90          * entry, relative to the base directory of the cache. See
91          * {@link CacheManager#getCacheFileBaseDir CacheManager.getCacheFileBaseDir()}.
92          *
93          * @return the path of the file used to store this cache entry
94          */
getLocalPath()95         public String getLocalPath() {
96             return localPath;
97         }
98 
99         /**
100          * Gets the expiry date of this cache entry, expressed in milliseconds
101          * since midnight, January 1, 1970 UTC.
102          *
103          * @return the expiry date of this cache entry
104          */
getExpires()105         public long getExpires() {
106             return expires;
107         }
108 
109         /**
110          * Gets the expiry date of this cache entry, expressed as a string.
111          *
112          * @return the expiry date of this cache entry
113          *
114          */
getExpiresString()115         public String getExpiresString() {
116             return expiresString;
117         }
118 
119         /**
120          * Gets the date at which this cache entry was last modified, expressed
121          * as a string.
122          *
123          * @return the date at which this cache entry was last modified
124          */
getLastModified()125         public String getLastModified() {
126             return lastModified;
127         }
128 
129         /**
130          * Gets the entity tag of this cache entry.
131          *
132          * @return the entity tag of this cache entry
133          */
getETag()134         public String getETag() {
135             return etag;
136         }
137 
138         /**
139          * Gets the MIME type of this cache entry.
140          *
141          * @return the MIME type of this cache entry
142          */
getMimeType()143         public String getMimeType() {
144             return mimeType;
145         }
146 
147         /**
148          * Gets the value of the HTTP 'Location' header with which this cache
149          * entry was received.
150          *
151          * @return the HTTP 'Location' header for this cache entry
152          */
getLocation()153         public String getLocation() {
154             return location;
155         }
156 
157         /**
158          * Gets the encoding of this cache entry.
159          *
160          * @return the encoding of this cache entry
161          */
getEncoding()162         public String getEncoding() {
163             return encoding;
164         }
165 
166         /**
167          * Gets the value of the HTTP 'Content-Disposition' header with which
168          * this cache entry was received.
169          *
170          * @return the HTTP 'Content-Disposition' header for this cache entry
171          *
172          */
getContentDisposition()173         public String getContentDisposition() {
174             return contentdisposition;
175         }
176 
177         /**
178          * Gets the input stream to the content of this cache entry, to allow
179          * content to be read. See
180          * {@link CacheManager#getCacheFile CacheManager.getCacheFile(String, Map<String, String>)}.
181          *
182          * @return an input stream to the content of this cache entry
183          */
getInputStream()184         public InputStream getInputStream() {
185             return inStream;
186         }
187 
188         /**
189          * Gets an output stream to the content of this cache entry, to allow
190          * content to be written. See
191          * {@link CacheManager#saveCacheFile CacheManager.saveCacheFile(String, CacheResult)}.
192          *
193          * @return an output stream to the content of this cache entry
194          */
195         // Note that this is always null for objects returned by getCacheFile()!
getOutputStream()196         public OutputStream getOutputStream() {
197             return outStream;
198         }
199 
200 
201         /**
202          * Sets an input stream to the content of this cache entry.
203          *
204          * @param stream an input stream to the content of this cache entry
205          */
setInputStream(InputStream stream)206         public void setInputStream(InputStream stream) {
207             this.inStream = stream;
208         }
209 
210         /**
211          * Sets the encoding of this cache entry.
212          *
213          * @param encoding the encoding of this cache entry
214          */
setEncoding(String encoding)215         public void setEncoding(String encoding) {
216             this.encoding = encoding;
217         }
218 
219         /**
220          * @hide
221          */
setContentLength(long contentLength)222         public void setContentLength(long contentLength) {
223             this.contentLength = contentLength;
224         }
225     }
226 
227     /**
228      * Gets the base directory in which the files used to store the contents of
229      * cache entries are placed. See
230      * {@link CacheManager.CacheResult#getLocalPath CacheManager.CacheResult.getLocalPath()}.
231      *
232      * @return the base directory of the cache
233      * @deprecated This method no longer has any effect and always returns null.
234      */
235     @Deprecated
getCacheFileBaseDir()236     public static File getCacheFileBaseDir() {
237         return null;
238     }
239 
240     /**
241      * Gets whether the HTTP cache is disabled.
242      *
243      * @return true if the HTTP cache is disabled
244      * @deprecated This method no longer has any effect and always returns false.
245      */
246     @Deprecated
cacheDisabled()247     public static boolean cacheDisabled() {
248         return false;
249     }
250 
251     /**
252      * Starts a cache transaction. Returns true if this is the only running
253      * transaction. Otherwise, this transaction is nested inside currently
254      * running transactions and false is returned.
255      *
256      * @return true if this is the only running transaction
257      * @deprecated This method no longer has any effect and always returns false.
258      */
259     @Deprecated
startCacheTransaction()260     public static boolean startCacheTransaction() {
261         return false;
262     }
263 
264     /**
265      * Ends the innermost cache transaction and returns whether this was the
266      * only running transaction.
267      *
268      * @return true if this was the only running transaction
269      * @deprecated This method no longer has any effect and always returns false.
270      */
271     @Deprecated
endCacheTransaction()272     public static boolean endCacheTransaction() {
273         return false;
274     }
275 
276     /**
277      * Gets the cache entry for the specified URL, or null if none is found.
278      * If a non-null value is provided for the HTTP headers map, and the cache
279      * entry needs validation, appropriate headers will be added to the map.
280      * The input stream of the CacheEntry object should be closed by the caller
281      * when access to the underlying file is no longer required.
282      *
283      * @param url the URL for which a cache entry is requested
284      * @param headers a map from HTTP header name to value, to be populated
285      *                for the returned cache entry
286      * @return the cache entry for the specified URL
287      * @deprecated This method no longer has any effect and always returns null.
288      */
289     @Deprecated
getCacheFile(String url, Map<String, String> headers)290     public static CacheResult getCacheFile(String url,
291             Map<String, String> headers) {
292         return null;
293     }
294 
295     /**
296      * Adds a cache entry to the HTTP cache for the specicifed URL. Also closes
297      * the cache entry's output stream.
298      *
299      * @param url the URL for which the cache entry should be added
300      * @param cacheResult the cache entry to add
301      * @deprecated Access to the HTTP cache will be removed in a future release.
302      */
303     @Deprecated
saveCacheFile(String url, CacheResult cacheResult)304     public static void saveCacheFile(String url, CacheResult cacheResult) {
305         saveCacheFile(url, 0, cacheResult);
306     }
307 
saveCacheFile(String url, long postIdentifier, CacheResult cacheRet)308     static void saveCacheFile(String url, long postIdentifier,
309             CacheResult cacheRet) {
310         try {
311             cacheRet.outStream.close();
312         } catch (IOException e) {
313             return;
314         }
315 
316         // This method is exposed in the public API but the API provides no
317         // way to obtain a new CacheResult object with a non-null output
318         // stream ...
319         // - CacheResult objects returned by getCacheFile() have a null
320         //   output stream.
321         // - new CacheResult objects have a null output stream and no
322         //   setter is provided.
323         // Since this method throws a null pointer exception in this case,
324         // it is effectively useless from the point of view of the public
325         // API.
326         //
327         // With the Chromium HTTP stack we continue to throw the same
328         // exception for 'backwards compatibility' with the Android HTTP
329         // stack.
330         //
331         // This method is not used from within this package, and for public API
332         // use, we should already have thrown an exception above.
333         assert false;
334     }
335 }
336