19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License. 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License. 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.webkit; 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 198af3cfc2a45334bfe936fcfc79c6e1cab06e104bPatrick Scottimport android.net.http.EventHandler; 208af3cfc2a45334bfe936fcfc79c6e1cab06e104bPatrick Scott 218af3cfc2a45334bfe936fcfc79c6e1cab06e104bPatrick Scottimport com.android.internal.R; 228af3cfc2a45334bfe936fcfc79c6e1cab06e104bPatrick Scott 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.ByteArrayInputStream; 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 25a7284f0e72745d66155e1e282fc07113332790faBrian Carlstromimport libcore.io.Base64; 26e82dc4205285a40d6c2227e362c30ce24c96a552Patrick Scott 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This class is a concrete implementation of StreamLoader that uses the 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * content supplied as a URL as the source for the stream. The mimetype 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * optionally provided in the URL is extracted and inserted into the HTTP 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * response headers. 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass DataLoader extends StreamLoader { 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Constructor uses the dataURL as the source for an InputStream 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param dataUrl data: URL string optionally containing a mimetype 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param loadListener LoadListener to pass the content to 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project DataLoader(String dataUrl, LoadListener loadListener) { 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(loadListener); 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String url = dataUrl.substring("data:".length()); 44e82dc4205285a40d6c2227e362c30ce24c96a552Patrick Scott byte[] data = null; 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int commaIndex = url.indexOf(','); 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (commaIndex != -1) { 47e82dc4205285a40d6c2227e362c30ce24c96a552Patrick Scott String contentType = url.substring(0, commaIndex); 48e82dc4205285a40d6c2227e362c30ce24c96a552Patrick Scott data = url.substring(commaIndex + 1).getBytes(); 49e82dc4205285a40d6c2227e362c30ce24c96a552Patrick Scott loadListener.parseContentTypeHeader(contentType); 50aaf0718c589b136aaf3d87f5944dd1028adaf8fdGrace Kloba if ("base64".equals(loadListener.transferEncoding())) { 51e82dc4205285a40d6c2227e362c30ce24c96a552Patrick Scott data = Base64.decode(data); 52e82dc4205285a40d6c2227e362c30ce24c96a552Patrick Scott } 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 54e82dc4205285a40d6c2227e362c30ce24c96a552Patrick Scott data = url.getBytes(); 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 568af3cfc2a45334bfe936fcfc79c6e1cab06e104bPatrick Scott if (data != null) { 578af3cfc2a45334bfe936fcfc79c6e1cab06e104bPatrick Scott mDataStream = new ByteArrayInputStream(data); 588af3cfc2a45334bfe936fcfc79c6e1cab06e104bPatrick Scott mContentLength = data.length; 598af3cfc2a45334bfe936fcfc79c6e1cab06e104bPatrick Scott } 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected boolean setupStreamAndSendStatus() { 648af3cfc2a45334bfe936fcfc79c6e1cab06e104bPatrick Scott if (mDataStream != null) { 65ac75f56600691d318d40301204baaf840c9586f2Grace Kloba mLoadListener.status(1, 1, 200, "OK"); 668af3cfc2a45334bfe936fcfc79c6e1cab06e104bPatrick Scott return true; 678af3cfc2a45334bfe936fcfc79c6e1cab06e104bPatrick Scott } else { 68ac75f56600691d318d40301204baaf840c9586f2Grace Kloba mLoadListener.error(EventHandler.ERROR, 698af3cfc2a45334bfe936fcfc79c6e1cab06e104bPatrick Scott mContext.getString(R.string.httpError)); 708af3cfc2a45334bfe936fcfc79c6e1cab06e104bPatrick Scott return false; 718af3cfc2a45334bfe936fcfc79c6e1cab06e104bPatrick Scott } 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 75e82dc4205285a40d6c2227e362c30ce24c96a552Patrick Scott protected void buildHeaders(android.net.http.Headers h) { 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 78