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