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}