summaryrefslogtreecommitdiffstats
path: root/drm/java/android/drm/DrmOutputStream.java
diff options
context:
space:
mode:
authorJeff Sharkey <jsharkey@android.com>2012-12-13 08:55:59 -0800
committerJeff Sharkey <jsharkey@android.com>2012-12-13 13:51:40 -0800
commitf67c8a9685e0f20d5ffb9de95f6d1ce47f052141 (patch)
tree30aa3e2376095dee656ac963632d080abb728b4a /drm/java/android/drm/DrmOutputStream.java
parentfdb9138c401558e109ecdadc7acbc88b75634202 (diff)
downloadframeworks_base-f67c8a9685e0f20d5ffb9de95f6d1ce47f052141.zip
frameworks_base-f67c8a9685e0f20d5ffb9de95f6d1ce47f052141.tar.gz
frameworks_base-f67c8a9685e0f20d5ffb9de95f6d1ce47f052141.tar.bz2
Move DRM to CloseGuard, add DrmOutputStream.
Switch DrmManagerClient to using CloseGuard to better track leaked resources. Add DrmOutputStream which applies DRM transformation as data is written, similar to FilterOutputStream. Also writes DRM headers before closing. Change-Id: Ic106a3e6f6ff666e4dda484fbd234a0849eec8c0
Diffstat (limited to 'drm/java/android/drm/DrmOutputStream.java')
-rw-r--r--drm/java/android/drm/DrmOutputStream.java104
1 files changed, 104 insertions, 0 deletions
diff --git a/drm/java/android/drm/DrmOutputStream.java b/drm/java/android/drm/DrmOutputStream.java
new file mode 100644
index 0000000..2e1b756
--- /dev/null
+++ b/drm/java/android/drm/DrmOutputStream.java
@@ -0,0 +1,104 @@
+/*
+ * Copyright (C) 2012 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.drm;
+
+import static android.drm.DrmConvertedStatus.STATUS_OK;
+
+import java.io.File;
+import java.io.FilterOutputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.io.RandomAccessFile;
+import java.net.UnknownServiceException;
+import java.util.Arrays;
+
+import libcore.io.IoUtils;
+import libcore.util.SneakyThrow;
+
+/**
+ * Stream that applies a {@link DrmManagerClient} transformation to data before
+ * writing to disk, similar to a {@link FilterOutputStream}.
+ *
+ * @hide
+ */
+public class DrmOutputStream extends OutputStream {
+
+ private final DrmManagerClient mClient;
+
+ private int mSessionId;
+ private RandomAccessFile mOutput;
+
+ public DrmOutputStream(DrmManagerClient client, File 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);
+ }
+ }
+
+ @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;
+ }
+ }
+ }
+
+ @Override
+ public void write(byte[] buffer, int offset, int count) throws IOException {
+ Arrays.checkOffsetAndCount(buffer.length, offset, count);
+
+ final byte[] exactBuffer;
+ if (count == buffer.length) {
+ exactBuffer = buffer;
+ } else {
+ exactBuffer = new byte[count];
+ System.arraycopy(buffer, offset, exactBuffer, 0, count);
+ }
+
+ final DrmConvertedStatus status = mClient.convertData(mSessionId, exactBuffer);
+ if (status.statusCode == STATUS_OK) {
+ mOutput.write(status.convertedData);
+ } else {
+ throw new IOException("Unexpected DRM status: " + status.statusCode);
+ }
+ }
+
+ @Override
+ public void write(int oneByte) throws IOException {
+ write(new byte[] { (byte) oneByte });
+ }
+}