summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--media/java/android/media/MediaCas.java111
-rw-r--r--media/java/android/media/MediaDescrambler.java20
2 files changed, 92 insertions, 39 deletions
diff --git a/media/java/android/media/MediaCas.java b/media/java/android/media/MediaCas.java
index 61414295e9c4..0704da4fb63d 100644
--- a/media/java/android/media/MediaCas.java
+++ b/media/java/android/media/MediaCas.java
@@ -41,6 +41,7 @@ import android.os.Message;
import android.os.Process;
import android.os.RemoteException;
import android.os.ServiceManager;
+import android.os.ServiceSpecificException;
import android.util.Log;
import android.util.Singleton;
@@ -360,14 +361,14 @@ public final class MediaCas implements AutoCloseable {
@Override
public void handleMessage(Message msg) {
if (msg.what == MSG_CAS_EVENT) {
- mListener.onEvent(MediaCas.this, msg.arg1, msg.arg2,
- toBytes((ArrayList<Byte>) msg.obj));
+ byte[] data = (msg.obj == null) ? new byte[0] : (byte[]) msg.obj;
+ mListener.onEvent(MediaCas.this, msg.arg1, msg.arg2, data);
} else if (msg.what == MSG_CAS_SESSION_EVENT) {
Bundle bundle = msg.getData();
byte[] sessionId = bundle.getByteArray(SESSION_KEY);
- mListener.onSessionEvent(MediaCas.this,
- createFromSessionId(sessionId), msg.arg1, msg.arg2,
- bundle.getByteArray(DATA_KEY));
+ byte[] data = bundle.getByteArray(DATA_KEY);
+ mListener.onSessionEvent(
+ MediaCas.this, createFromSessionId(sessionId), msg.arg1, msg.arg2, data);
} else if (msg.what == MSG_CAS_STATUS_EVENT) {
if ((msg.arg1 == PLUGIN_STATUS_SESSION_NUMBER_CHANGED)
&& (mTunerResourceManager != null)) {
@@ -599,7 +600,11 @@ public final class MediaCas implements AutoCloseable {
try {
if (mICas != null) {
- mICas.setSessionPrivateData(mSessionId, data);
+ try {
+ mICas.setSessionPrivateData(mSessionId, data);
+ } catch (ServiceSpecificException se) {
+ MediaCasException.throwExceptionIfNeeded(se.errorCode);
+ }
} else {
MediaCasException.throwExceptionIfNeeded(
mICasHidl.setSessionPrivateData(
@@ -628,7 +633,12 @@ public final class MediaCas implements AutoCloseable {
try {
if (mICas != null) {
- mICas.processEcm(mSessionId, data);
+ try {
+ mICas.processEcm(
+ mSessionId, Arrays.copyOfRange(data, offset, length + offset));
+ } catch (ServiceSpecificException se) {
+ MediaCasException.throwExceptionIfNeeded(se.errorCode);
+ }
} else {
MediaCasException.throwExceptionIfNeeded(
mICasHidl.processEcm(
@@ -671,23 +681,26 @@ public final class MediaCas implements AutoCloseable {
validateSessionInternalStates();
if (mICas != null) {
try {
+ if (data == null) {
+ data = new byte[0];
+ }
mICas.sendSessionEvent(mSessionId, event, arg, data);
} catch (RemoteException e) {
cleanupAndRethrowIllegalState();
}
- }
-
- if (mICasHidl11 == null) {
- Log.d(TAG, "Send Session Event isn't supported by cas@1.0 interface");
- throw new UnsupportedCasException("Send Session Event is not supported");
- }
+ } else {
+ if (mICasHidl11 == null) {
+ Log.d(TAG, "Send Session Event isn't supported by cas@1.0 interface");
+ throw new UnsupportedCasException("Send Session Event is not supported");
+ }
- try {
- MediaCasException.throwExceptionIfNeeded(
- mICasHidl11.sendSessionEvent(
- toByteArray(mSessionId), event, arg, toByteArray(data)));
- } catch (RemoteException e) {
- cleanupAndRethrowIllegalState();
+ try {
+ MediaCasException.throwExceptionIfNeeded(
+ mICasHidl11.sendSessionEvent(
+ toByteArray(mSessionId), event, arg, toByteArray(data)));
+ } catch (RemoteException e) {
+ cleanupAndRethrowIllegalState();
+ }
}
}
@@ -1038,7 +1051,11 @@ public final class MediaCas implements AutoCloseable {
try {
if (mICas != null) {
- mICas.setPrivateData(data);
+ try {
+ mICas.setPrivateData(data);
+ } catch (ServiceSpecificException se) {
+ MediaCasException.throwExceptionIfNeeded(se.errorCode);
+ }
} else {
MediaCasException.throwExceptionIfNeeded(
mICasHidl.setPrivateData(toByteArray(data, 0, data.length)));
@@ -1127,15 +1144,19 @@ public final class MediaCas implements AutoCloseable {
try {
if (mICas != null) {
- byte[] sessionId = mICas.openSessionDefault();
- Session session = createFromSessionId(sessionId);
- Log.d(TAG, "Write Stats Log for succeed to Open Session.");
- FrameworkStatsLog.write(
- FrameworkStatsLog.TV_CAS_SESSION_OPEN_STATUS,
- mUserId,
- mCasSystemId,
- FrameworkStatsLog.TV_CAS_SESSION_OPEN_STATUS__STATE__SUCCEEDED);
- return session;
+ try {
+ byte[] sessionId = mICas.openSessionDefault();
+ Session session = createFromSessionId(sessionId);
+ Log.d(TAG, "Write Stats Log for succeed to Open Session.");
+ FrameworkStatsLog.write(
+ FrameworkStatsLog.TV_CAS_SESSION_OPEN_STATUS,
+ mUserId,
+ mCasSystemId,
+ FrameworkStatsLog.TV_CAS_SESSION_OPEN_STATUS__STATE__SUCCEEDED);
+ return session;
+ } catch (ServiceSpecificException se) {
+ MediaCasException.throwExceptionIfNeeded(se.errorCode);
+ }
} else if (mICasHidl != null) {
OpenSessionCallback cb = new OpenSessionCallback();
mICasHidl.openSession(cb);
@@ -1193,7 +1214,7 @@ public final class MediaCas implements AutoCloseable {
mCasSystemId,
FrameworkStatsLog.TV_CAS_SESSION_OPEN_STATUS__STATE__SUCCEEDED);
return session;
- } catch (RemoteException e) {
+ } catch (ServiceSpecificException | RemoteException e) {
cleanupAndRethrowIllegalState();
}
}
@@ -1239,7 +1260,11 @@ public final class MediaCas implements AutoCloseable {
try {
if (mICas != null) {
- mICas.processEmm(Arrays.copyOfRange(data, offset, length));
+ try {
+ mICas.processEmm(Arrays.copyOfRange(data, offset, length));
+ } catch (ServiceSpecificException se) {
+ MediaCasException.throwExceptionIfNeeded(se.errorCode);
+ }
} else {
MediaCasException.throwExceptionIfNeeded(
mICasHidl.processEmm(toByteArray(data, offset, length)));
@@ -1282,7 +1307,14 @@ public final class MediaCas implements AutoCloseable {
try {
if (mICas != null) {
- mICas.sendEvent(event, arg, data);
+ try {
+ if (data == null) {
+ data = new byte[0];
+ }
+ mICas.sendEvent(event, arg, data);
+ } catch (ServiceSpecificException se) {
+ MediaCasException.throwExceptionIfNeeded(se.errorCode);
+ }
} else {
MediaCasException.throwExceptionIfNeeded(
mICasHidl.sendEvent(event, arg, toByteArray(data)));
@@ -1308,7 +1340,11 @@ public final class MediaCas implements AutoCloseable {
try {
if (mICas != null) {
- mICas.provision(provisionString);
+ try {
+ mICas.provision(provisionString);
+ } catch (ServiceSpecificException se) {
+ MediaCasException.throwExceptionIfNeeded(se.errorCode);
+ }
} else {
MediaCasException.throwExceptionIfNeeded(mICasHidl.provision(provisionString));
}
@@ -1333,7 +1369,14 @@ public final class MediaCas implements AutoCloseable {
try {
if (mICas != null) {
- mICas.refreshEntitlements(refreshType, refreshData);
+ try {
+ if (refreshData == null) {
+ refreshData = new byte[0];
+ }
+ mICas.refreshEntitlements(refreshType, refreshData);
+ } catch (ServiceSpecificException se) {
+ MediaCasException.throwExceptionIfNeeded(se.errorCode);
+ }
} else {
MediaCasException.throwExceptionIfNeeded(
mICasHidl.refreshEntitlements(refreshType, toByteArray(refreshData)));
diff --git a/media/java/android/media/MediaDescrambler.java b/media/java/android/media/MediaDescrambler.java
index 46c3a1752b3f..15dee8516f0c 100644
--- a/media/java/android/media/MediaDescrambler.java
+++ b/media/java/android/media/MediaDescrambler.java
@@ -66,8 +66,12 @@ public final class MediaDescrambler implements AutoCloseable {
IDescrambler mAidlDescrambler;
- AidlDescrambler(IDescrambler aidlDescrambler) {
- mAidlDescrambler = aidlDescrambler;
+ AidlDescrambler(IDescrambler aidlDescrambler) throws Exception {
+ if (aidlDescrambler != null) {
+ mAidlDescrambler = aidlDescrambler;
+ } else {
+ throw new Exception("Descrambler could not be created");
+ }
}
@Override
@@ -104,9 +108,13 @@ public final class MediaDescrambler implements AutoCloseable {
IDescramblerBase mHidlDescrambler;
- HidlDescrambler(IDescramblerBase hidlDescrambler) {
- mHidlDescrambler = hidlDescrambler;
- native_setup(hidlDescrambler.asBinder());
+ HidlDescrambler(IDescramblerBase hidlDescrambler) throws Exception {
+ if (hidlDescrambler != null) {
+ mHidlDescrambler = hidlDescrambler;
+ native_setup(hidlDescrambler.asBinder());
+ } else {
+ throw new Exception("Descrambler could not be created");
+ }
}
@Override
@@ -199,6 +207,8 @@ public final class MediaDescrambler implements AutoCloseable {
new HidlDescrambler(
MediaCas.getServiceHidl().createDescrambler(CA_system_id));
mIsAidlHal = false;
+ } else {
+ throw new Exception("No CAS service found!");
}
} catch(Exception e) {
Log.e(TAG, "Failed to create descrambler: " + e);