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