diff options
| -rw-r--r-- | media/java/android/media/MediaCas.java | 111 | ||||
| -rw-r--r-- | media/java/android/media/MediaDescrambler.java | 20 |
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); |