Home | History | Annotate | Download | only in webkit
      1 /*
      2  * Copyright (C) 2008 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 android.net.http.EventHandler;
     20 import android.net.http.Headers;
     21 import android.net.Uri;
     22 
     23 /**
     24  * This class is a concrete implementation of StreamLoader that loads
     25  * "content:" URIs
     26  */
     27 class ContentLoader extends StreamLoader {
     28 
     29     private String mUrl;
     30     private String mContentType;
     31 
     32     /**
     33      * Construct a ContentLoader with the specified content URI
     34      *
     35      * @param rawUrl "content:" url pointing to content to be loaded. This url
     36      *               is the same url passed in to the WebView.
     37      * @param loadListener LoadListener to pass the content to
     38      */
     39     ContentLoader(String rawUrl, LoadListener loadListener) {
     40         super(loadListener);
     41 
     42         /* strip off mimetype */
     43         int mimeIndex = rawUrl.lastIndexOf('?');
     44         if (mimeIndex != -1) {
     45             mUrl = rawUrl.substring(0, mimeIndex);
     46             mContentType = rawUrl.substring(mimeIndex + 1);
     47         } else {
     48             mUrl = rawUrl;
     49         }
     50 
     51     }
     52 
     53     private String errString(Exception ex) {
     54         String exMessage = ex.getMessage();
     55         String errString = mContext.getString(
     56                 com.android.internal.R.string.httpErrorFileNotFound);
     57         if (exMessage != null) {
     58             errString += " " + exMessage;
     59         }
     60         return errString;
     61     }
     62 
     63     @Override
     64     protected boolean setupStreamAndSendStatus() {
     65         Uri uri = Uri.parse(mUrl);
     66         if (uri == null) {
     67             mLoadListener.error(
     68                     EventHandler.FILE_NOT_FOUND_ERROR,
     69                     mContext.getString(
     70                             com.android.internal.R.string.httpErrorBadUrl) +
     71                     " " + mUrl);
     72             return false;
     73         }
     74 
     75         try {
     76             mDataStream = mContext.getContentResolver().openInputStream(uri);
     77             mLoadListener.status(1, 1, 200, "OK");
     78         } catch (java.io.FileNotFoundException ex) {
     79             mLoadListener.error(EventHandler.FILE_NOT_FOUND_ERROR, errString(ex));
     80             return false;
     81         } catch (RuntimeException ex) {
     82             // readExceptionWithFileNotFoundExceptionFromParcel in DatabaseUtils
     83             // can throw a serial of RuntimeException. Catch them all here.
     84             mLoadListener.error(EventHandler.FILE_ERROR, errString(ex));
     85             return false;
     86         }
     87         return true;
     88     }
     89 
     90     @Override
     91     protected void buildHeaders(Headers headers) {
     92         if (mContentType != null) {
     93             headers.setContentType("text/html");
     94         }
     95         // content can change, we don't want WebKit to cache it
     96         headers.setCacheControl("no-store, no-cache");
     97     }
     98 }
     99