summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drm/java/android/drm/DrmOutputStream.java67
1 files changed, 34 insertions, 33 deletions
diff --git a/drm/java/android/drm/DrmOutputStream.java b/drm/java/android/drm/DrmOutputStream.java
index 2e1b756..87677b8 100644
--- a/drm/java/android/drm/DrmOutputStream.java
+++ b/drm/java/android/drm/DrmOutputStream.java
@@ -17,8 +17,10 @@
package android.drm;
import static android.drm.DrmConvertedStatus.STATUS_OK;
+import static android.drm.DrmManagerClient.INVALID_SESSION;
+
+import android.util.Log;
-import java.io.File;
import java.io.FilterOutputStream;
import java.io.IOException;
import java.io.OutputStream;
@@ -26,8 +28,7 @@ import java.io.RandomAccessFile;
import java.net.UnknownServiceException;
import java.util.Arrays;
-import libcore.io.IoUtils;
-import libcore.util.SneakyThrow;
+import libcore.io.Streams;
/**
* Stream that applies a {@link DrmManagerClient} transformation to data before
@@ -36,45 +37,45 @@ import libcore.util.SneakyThrow;
* @hide
*/
public class DrmOutputStream extends OutputStream {
+ private static final String TAG = "DrmOutputStream";
private final DrmManagerClient mClient;
+ private final RandomAccessFile mFile;
- private int mSessionId;
- private RandomAccessFile mOutput;
+ private int mSessionId = INVALID_SESSION;
- public DrmOutputStream(DrmManagerClient client, File file, String mimeType) throws IOException {
+ /**
+ * @param file Opened with "rw" mode.
+ */
+ public DrmOutputStream(DrmManagerClient client, RandomAccessFile file, String mimeType)
+ throws IOException {
mClient = client;
- mOutput = new RandomAccessFile(file, "rw");
-
- try {
- mSessionId = mClient.openConvertSession(mimeType);
- if (mSessionId == DrmManagerClient.INVALID_SESSION) {
- throw new UnknownServiceException("Failed to open DRM session for " + mimeType);
- }
- } catch (Throwable thrown) {
- IoUtils.closeQuietly(mOutput);
- SneakyThrow.sneakyThrow(thrown);
+ mFile = file;
+
+ mSessionId = mClient.openConvertSession(mimeType);
+ if (mSessionId == INVALID_SESSION) {
+ throw new UnknownServiceException("Failed to open DRM session for " + mimeType);
+ }
+ }
+
+ public void finish() throws IOException {
+ final DrmConvertedStatus status = mClient.closeConvertSession(mSessionId);
+ if (status.statusCode == STATUS_OK) {
+ mFile.seek(status.offset);
+ mFile.write(status.convertedData);
+ mSessionId = INVALID_SESSION;
+ } else {
+ throw new IOException("Unexpected DRM status: " + status.statusCode);
}
}
@Override
public void close() throws IOException {
- try {
- final DrmConvertedStatus status = mClient.closeConvertSession(mSessionId);
- if (status.statusCode == STATUS_OK) {
- mOutput.seek(status.offset);
- mOutput.write(status.convertedData);
- } else {
- throw new IOException("Unexpected DRM status: " + status.statusCode);
- }
- } finally {
- try {
- mOutput.getFD().sync();
- } finally {
- mOutput.close();
- mOutput = null;
- }
+ if (mSessionId == INVALID_SESSION) {
+ Log.w(TAG, "Closing stream without finishing");
}
+
+ mFile.close();
}
@Override
@@ -91,7 +92,7 @@ public class DrmOutputStream extends OutputStream {
final DrmConvertedStatus status = mClient.convertData(mSessionId, exactBuffer);
if (status.statusCode == STATUS_OK) {
- mOutput.write(status.convertedData);
+ mFile.write(status.convertedData);
} else {
throw new IOException("Unexpected DRM status: " + status.statusCode);
}
@@ -99,6 +100,6 @@ public class DrmOutputStream extends OutputStream {
@Override
public void write(int oneByte) throws IOException {
- write(new byte[] { (byte) oneByte });
+ Streams.writeSingleByte(this, oneByte);
}
}