1f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin/*
2f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * Copyright (C) 2010 The Android Open Source Project
3f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin *
4f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * Licensed under the Apache License, Version 2.0 (the "License");
5f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * you may not use this file except in compliance with the License.
6f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * You may obtain a copy of the License at
7f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin *
8f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin *      http://www.apache.org/licenses/LICENSE-2.0
9f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin *
10f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * Unless required by applicable law or agreed to in writing, software
11f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * distributed under the License is distributed on an "AS IS" BASIS,
12f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * See the License for the specific language governing permissions and
14f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * limitations under the License.
15f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin */
16f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
17f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linpackage com.android.gallery3d.data;
18f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
19f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.common.Utils;
20f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.util.ThreadPool.CancelListener;
21f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.util.ThreadPool.JobContext;
22f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
23f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport java.io.ByteArrayOutputStream;
24f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport java.io.File;
25f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport java.io.FileOutputStream;
26f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport java.io.IOException;
27f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport java.io.InputStream;
28f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport java.io.InterruptedIOException;
29f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport java.io.OutputStream;
30f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport java.net.URL;
31f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
32f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linpublic class DownloadUtils {
33f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private static final String TAG = "DownloadService";
34f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
35f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public static boolean requestDownload(JobContext jc, URL url, File file) {
36f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        FileOutputStream fos = null;
37f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        try {
38f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            fos = new FileOutputStream(file);
39f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            return download(jc, url, fos);
40f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        } catch (Throwable t) {
41f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            return false;
42f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        } finally {
43f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            Utils.closeSilently(fos);
44f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
45f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
46f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
47f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public static byte[] requestDownload(JobContext jc, URL url) {
48f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        ByteArrayOutputStream baos = null;
49f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        try {
50f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            baos = new ByteArrayOutputStream();
51f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            if (!download(jc, url, baos)) {
52f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                return null;
53f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            }
54f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            return baos.toByteArray();
55f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        } catch (Throwable t) {
56f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            Log.w(TAG, t);
57f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            return null;
58f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        } finally {
59f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            Utils.closeSilently(baos);
60f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
61f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
62f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
63f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public static void dump(JobContext jc, InputStream is, OutputStream os)
64f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            throws IOException {
65f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        byte buffer[] = new byte[4096];
66f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        int rc = is.read(buffer, 0, buffer.length);
67f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        final Thread thread = Thread.currentThread();
68f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        jc.setCancelListener(new CancelListener() {
69f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            public void onCancel() {
70f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                thread.interrupt();
71f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            }
72f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        });
73f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        while (rc > 0) {
74f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            if (jc.isCancelled()) throw new InterruptedIOException();
75f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            os.write(buffer, 0, rc);
76f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            rc = is.read(buffer, 0, buffer.length);
77f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
78f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        jc.setCancelListener(null);
79f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        Thread.interrupted(); // consume the interrupt signal
80f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
81f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
82f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public static boolean download(JobContext jc, URL url, OutputStream output) {
83f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        InputStream input = null;
84f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        try {
85f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            input = url.openStream();
86f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            dump(jc, input, output);
87f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            return true;
88f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        } catch (Throwable t) {
89f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            Log.w(TAG, "fail to download", t);
90f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            return false;
91f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        } finally {
92f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            Utils.closeSilently(input);
93f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
94f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
95f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin}