2016-12-11 13:37:27 -08:00
|
|
|
package org.thoughtcrime.securesms.video;
|
|
|
|
|
|
|
|
|
2016-12-18 18:43:05 -08:00
|
|
|
import android.annotation.TargetApi;
|
2016-12-11 13:37:27 -08:00
|
|
|
import android.media.MediaDataSource;
|
|
|
|
import android.os.Build;
|
|
|
|
|
|
|
|
import org.thoughtcrime.securesms.crypto.DecryptingPartInputStream;
|
|
|
|
import org.thoughtcrime.securesms.crypto.MasterSecret;
|
|
|
|
import org.thoughtcrime.securesms.util.Util;
|
|
|
|
|
|
|
|
import java.io.File;
|
|
|
|
import java.io.IOException;
|
2017-03-28 12:05:30 -07:00
|
|
|
import java.io.InputStream;
|
2016-12-11 13:37:27 -08:00
|
|
|
|
2016-12-18 18:43:05 -08:00
|
|
|
@TargetApi(Build.VERSION_CODES.M)
|
2016-12-11 13:37:27 -08:00
|
|
|
public class EncryptedMediaDataSource extends MediaDataSource {
|
|
|
|
|
|
|
|
private final File mediaFile;
|
|
|
|
private final MasterSecret masterSecret;
|
|
|
|
|
|
|
|
public EncryptedMediaDataSource(MasterSecret masterSecret, File mediaFile) {
|
|
|
|
this.mediaFile = mediaFile;
|
|
|
|
this.masterSecret = masterSecret;
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public int readAt(long position, byte[] bytes, int offset, int length) throws IOException {
|
2017-03-28 12:05:30 -07:00
|
|
|
InputStream inputStream = DecryptingPartInputStream.createFor(masterSecret, mediaFile);
|
|
|
|
byte[] buffer = new byte[4096];
|
|
|
|
long headerRemaining = position;
|
2016-12-11 13:37:27 -08:00
|
|
|
|
|
|
|
while (headerRemaining > 0) {
|
|
|
|
int read = inputStream.read(buffer, 0, Util.toIntExact(Math.min((long)buffer.length, headerRemaining)));
|
|
|
|
|
|
|
|
if (read == -1) return -1;
|
|
|
|
|
|
|
|
headerRemaining -= read;
|
|
|
|
}
|
|
|
|
|
|
|
|
int returnValue = inputStream.read(bytes, offset, length);
|
|
|
|
inputStream.close();
|
|
|
|
return returnValue;
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public long getSize() throws IOException {
|
2017-03-28 12:05:30 -07:00
|
|
|
InputStream inputStream = DecryptingPartInputStream.createFor(masterSecret, mediaFile);
|
|
|
|
byte[] buffer = new byte[4096];
|
|
|
|
long size = 0;
|
2016-12-11 13:37:27 -08:00
|
|
|
|
|
|
|
int read;
|
|
|
|
|
|
|
|
while ((read = inputStream.read(buffer)) != -1) {
|
|
|
|
size += read;
|
|
|
|
}
|
|
|
|
|
|
|
|
return size;
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void close() throws IOException {
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|