Search in sources :

Example 1 with CacheException

use of com.google.android.exoplayer2.upstream.cache.Cache.CacheException in project ExoPlayer by google.

the class CacheDataSourceTest2 method buildCacheDataSource.

private static CacheDataSource buildCacheDataSource(Context context, DataSource upstreamSource, boolean useAesEncryption) throws CacheException {
    File cacheDir = context.getExternalCacheDir();
    Cache cache = new SimpleCache(new File(cacheDir, EXO_CACHE_DIR), new NoOpCacheEvictor());
    emptyCache(cache);
    // Source and cipher
    final String secretKey = "testKey:12345678";
    DataSource file = new FileDataSource();
    DataSource cacheReadDataSource = useAesEncryption ? new AesCipherDataSource(Util.getUtf8Bytes(secretKey), file) : file;
    // Sink and cipher
    CacheDataSink cacheSink = new CacheDataSink(cache, EXO_CACHE_MAX_FILESIZE);
    byte[] scratch = new byte[3897];
    DataSink cacheWriteDataSink = useAesEncryption ? new AesCipherDataSink(Util.getUtf8Bytes(secretKey), cacheSink, scratch) : cacheSink;
    return new CacheDataSource(cache, upstreamSource, cacheReadDataSource, cacheWriteDataSink, CacheDataSource.FLAG_BLOCK_ON_CACHE, // eventListener
    null);
}
Also used : AesCipherDataSink(com.google.android.exoplayer2.upstream.crypto.AesCipherDataSink) DataSink(com.google.android.exoplayer2.upstream.DataSink) FileDataSource(com.google.android.exoplayer2.upstream.FileDataSource) AesCipherDataSource(com.google.android.exoplayer2.upstream.crypto.AesCipherDataSource) DataSource(com.google.android.exoplayer2.upstream.DataSource) FakeDataSource(com.google.android.exoplayer2.testutil.FakeDataSource) AesCipherDataSink(com.google.android.exoplayer2.upstream.crypto.AesCipherDataSink) FileDataSource(com.google.android.exoplayer2.upstream.FileDataSource) AesCipherDataSource(com.google.android.exoplayer2.upstream.crypto.AesCipherDataSource) File(java.io.File)

Example 2 with CacheException

use of com.google.android.exoplayer2.upstream.cache.Cache.CacheException in project ExoPlayer by google.

the class CachedContentIndex method writeFile.

private void writeFile() throws CacheException {
    DataOutputStream output = null;
    try {
        OutputStream outputStream = atomicFile.startWrite();
        if (bufferedOutputStream == null) {
            bufferedOutputStream = new ReusableBufferedOutputStream(outputStream);
        } else {
            bufferedOutputStream.reset(outputStream);
        }
        output = new DataOutputStream(bufferedOutputStream);
        output.writeInt(VERSION);
        int flags = cipher != null ? FLAG_ENCRYPTED_INDEX : 0;
        output.writeInt(flags);
        if (cipher != null) {
            byte[] initializationVector = new byte[16];
            new Random().nextBytes(initializationVector);
            output.write(initializationVector);
            IvParameterSpec ivParameterSpec = new IvParameterSpec(initializationVector);
            try {
                cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec, ivParameterSpec);
            } catch (InvalidKeyException | InvalidAlgorithmParameterException e) {
                // Should never happen.
                throw new IllegalStateException(e);
            }
            output.flush();
            output = new DataOutputStream(new CipherOutputStream(bufferedOutputStream, cipher));
        }
        output.writeInt(keyToContent.size());
        int hashCode = 0;
        for (CachedContent cachedContent : keyToContent.values()) {
            cachedContent.writeToStream(output);
            hashCode += cachedContent.headerHashCode();
        }
        output.writeInt(hashCode);
        atomicFile.endWrite(output);
        // Avoid calling close twice. Duplicate CipherOutputStream.close calls did
        // not used to be no-ops: https://android-review.googlesource.com/#/c/272799/
        output = null;
    } catch (IOException e) {
        throw new CacheException(e);
    } finally {
        Util.closeQuietly(output);
    }
}
Also used : ReusableBufferedOutputStream(com.google.android.exoplayer2.util.ReusableBufferedOutputStream) CipherOutputStream(javax.crypto.CipherOutputStream) InvalidAlgorithmParameterException(java.security.InvalidAlgorithmParameterException) CacheException(com.google.android.exoplayer2.upstream.cache.Cache.CacheException) DataOutputStream(java.io.DataOutputStream) ReusableBufferedOutputStream(com.google.android.exoplayer2.util.ReusableBufferedOutputStream) DataOutputStream(java.io.DataOutputStream) CipherOutputStream(javax.crypto.CipherOutputStream) OutputStream(java.io.OutputStream) IOException(java.io.IOException) InvalidKeyException(java.security.InvalidKeyException) Random(java.util.Random) IvParameterSpec(javax.crypto.spec.IvParameterSpec)

Aggregations

FakeDataSource (com.google.android.exoplayer2.testutil.FakeDataSource)1 DataSink (com.google.android.exoplayer2.upstream.DataSink)1 DataSource (com.google.android.exoplayer2.upstream.DataSource)1 FileDataSource (com.google.android.exoplayer2.upstream.FileDataSource)1 CacheException (com.google.android.exoplayer2.upstream.cache.Cache.CacheException)1 AesCipherDataSink (com.google.android.exoplayer2.upstream.crypto.AesCipherDataSink)1 AesCipherDataSource (com.google.android.exoplayer2.upstream.crypto.AesCipherDataSource)1 ReusableBufferedOutputStream (com.google.android.exoplayer2.util.ReusableBufferedOutputStream)1 DataOutputStream (java.io.DataOutputStream)1 File (java.io.File)1 IOException (java.io.IOException)1 OutputStream (java.io.OutputStream)1 InvalidAlgorithmParameterException (java.security.InvalidAlgorithmParameterException)1 InvalidKeyException (java.security.InvalidKeyException)1 Random (java.util.Random)1 CipherOutputStream (javax.crypto.CipherOutputStream)1 IvParameterSpec (javax.crypto.spec.IvParameterSpec)1