1bb6268f046f355e1b6cd1bad6707288180a4bac4Sam Juddpackage com.bumptech.glide.load.resource.file; 20db3c45b412be1a5bfcb1da046836e89d3ffd0b4Sam Judd 30db3c45b412be1a5bfcb1da046836e89d3ffd0b4Sam Juddimport com.bumptech.glide.load.ResourceDecoder; 40db3c45b412be1a5bfcb1da046836e89d3ffd0b4Sam Juddimport com.bumptech.glide.load.engine.Resource; 50db3c45b412be1a5bfcb1da046836e89d3ffd0b4Sam Judd 60db3c45b412be1a5bfcb1da046836e89d3ffd0b4Sam Juddimport java.io.File; 70db3c45b412be1a5bfcb1da046836e89d3ffd0b4Sam Juddimport java.io.FileInputStream; 80db3c45b412be1a5bfcb1da046836e89d3ffd0b4Sam Juddimport java.io.FileNotFoundException; 90db3c45b412be1a5bfcb1da046836e89d3ffd0b4Sam Juddimport java.io.IOException; 100db3c45b412be1a5bfcb1da046836e89d3ffd0b4Sam Juddimport java.io.InputStream; 110db3c45b412be1a5bfcb1da046836e89d3ffd0b4Sam Judd 120db3c45b412be1a5bfcb1da046836e89d3ffd0b4Sam Judd/** 135f4610b54d517be58105bcf73ce3291ba79f9f40Sam Judd * A decoder that wraps an {@link InputStream} decoder to allow it to decode from a file. 145f4610b54d517be58105bcf73ce3291ba79f9f40Sam Judd * 150db3c45b412be1a5bfcb1da046836e89d3ffd0b4Sam Judd * @param <T> The type of resource that the wrapped InputStream decoder decodes. 160db3c45b412be1a5bfcb1da046836e89d3ffd0b4Sam Judd */ 170db3c45b412be1a5bfcb1da046836e89d3ffd0b4Sam Juddpublic class FileToStreamDecoder<T> implements ResourceDecoder<File, T> { 185ba19a0e69ad3a651b8f13ba45de48a56b56ce36Sam Judd private static final FileOpener DEFAULT_FILE_OPENER = new FileOpener(); 190db3c45b412be1a5bfcb1da046836e89d3ffd0b4Sam Judd 200db3c45b412be1a5bfcb1da046836e89d3ffd0b4Sam Judd private ResourceDecoder<InputStream, T> streamDecoder; 210db3c45b412be1a5bfcb1da046836e89d3ffd0b4Sam Judd private final FileOpener fileOpener; 220db3c45b412be1a5bfcb1da046836e89d3ffd0b4Sam Judd 230db3c45b412be1a5bfcb1da046836e89d3ffd0b4Sam Judd public FileToStreamDecoder(ResourceDecoder<InputStream, T> streamDecoder) { 240db3c45b412be1a5bfcb1da046836e89d3ffd0b4Sam Judd this(streamDecoder, DEFAULT_FILE_OPENER); 250db3c45b412be1a5bfcb1da046836e89d3ffd0b4Sam Judd } 260db3c45b412be1a5bfcb1da046836e89d3ffd0b4Sam Judd 270db3c45b412be1a5bfcb1da046836e89d3ffd0b4Sam Judd // Exposed for testing. 280db3c45b412be1a5bfcb1da046836e89d3ffd0b4Sam Judd FileToStreamDecoder(ResourceDecoder<InputStream, T> streamDecoder, FileOpener fileOpener) { 290db3c45b412be1a5bfcb1da046836e89d3ffd0b4Sam Judd this.streamDecoder = streamDecoder; 300db3c45b412be1a5bfcb1da046836e89d3ffd0b4Sam Judd this.fileOpener = fileOpener; 310db3c45b412be1a5bfcb1da046836e89d3ffd0b4Sam Judd } 320db3c45b412be1a5bfcb1da046836e89d3ffd0b4Sam Judd 330db3c45b412be1a5bfcb1da046836e89d3ffd0b4Sam Judd @Override 340db3c45b412be1a5bfcb1da046836e89d3ffd0b4Sam Judd public Resource<T> decode(File source, int width, int height) throws IOException { 350db3c45b412be1a5bfcb1da046836e89d3ffd0b4Sam Judd InputStream is = null; 360db3c45b412be1a5bfcb1da046836e89d3ffd0b4Sam Judd Resource<T> result = null; 370db3c45b412be1a5bfcb1da046836e89d3ffd0b4Sam Judd try { 380db3c45b412be1a5bfcb1da046836e89d3ffd0b4Sam Judd is = fileOpener.open(source); 390db3c45b412be1a5bfcb1da046836e89d3ffd0b4Sam Judd result = streamDecoder.decode(is, width, height); 400db3c45b412be1a5bfcb1da046836e89d3ffd0b4Sam Judd } finally { 410db3c45b412be1a5bfcb1da046836e89d3ffd0b4Sam Judd if (is != null) { 420db3c45b412be1a5bfcb1da046836e89d3ffd0b4Sam Judd try { 430db3c45b412be1a5bfcb1da046836e89d3ffd0b4Sam Judd is.close(); 440db3c45b412be1a5bfcb1da046836e89d3ffd0b4Sam Judd } catch (IOException e) { 450db3c45b412be1a5bfcb1da046836e89d3ffd0b4Sam Judd // Do nothing. 460db3c45b412be1a5bfcb1da046836e89d3ffd0b4Sam Judd } 470db3c45b412be1a5bfcb1da046836e89d3ffd0b4Sam Judd } 480db3c45b412be1a5bfcb1da046836e89d3ffd0b4Sam Judd } 490db3c45b412be1a5bfcb1da046836e89d3ffd0b4Sam Judd return result; 500db3c45b412be1a5bfcb1da046836e89d3ffd0b4Sam Judd } 510db3c45b412be1a5bfcb1da046836e89d3ffd0b4Sam Judd 520db3c45b412be1a5bfcb1da046836e89d3ffd0b4Sam Judd @Override 530db3c45b412be1a5bfcb1da046836e89d3ffd0b4Sam Judd public String getId() { 540db3c45b412be1a5bfcb1da046836e89d3ffd0b4Sam Judd return ""; 550db3c45b412be1a5bfcb1da046836e89d3ffd0b4Sam Judd } 560db3c45b412be1a5bfcb1da046836e89d3ffd0b4Sam Judd 575ba19a0e69ad3a651b8f13ba45de48a56b56ce36Sam Judd // Visible for testing. 585ba19a0e69ad3a651b8f13ba45de48a56b56ce36Sam Judd static class FileOpener { 590db3c45b412be1a5bfcb1da046836e89d3ffd0b4Sam Judd public InputStream open(File file) throws FileNotFoundException { 600db3c45b412be1a5bfcb1da046836e89d3ffd0b4Sam Judd return new FileInputStream(file); 610db3c45b412be1a5bfcb1da046836e89d3ffd0b4Sam Judd } 620db3c45b412be1a5bfcb1da046836e89d3ffd0b4Sam Judd } 630db3c45b412be1a5bfcb1da046836e89d3ffd0b4Sam Judd} 64