| /* |
| * Copyright (C) 2017 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.media; |
| |
| import android.annotation.NonNull; |
| import android.annotation.Nullable; |
| |
| import android.hardware.cas.V1_0.Status; |
| |
| /** |
| * Base class for MediaCas runtime exceptions |
| */ |
| public class MediaCasStateException extends IllegalStateException { |
| private final int mErrorCode; |
| private final String mDiagnosticInfo; |
| |
| private MediaCasStateException(int err, @Nullable String msg, @Nullable String diagnosticInfo) { |
| super(msg); |
| mErrorCode = err; |
| mDiagnosticInfo = diagnosticInfo; |
| } |
| |
| static void throwExceptionIfNeeded(int err) { |
| throwExceptionIfNeeded(err, null /* msg */); |
| } |
| |
| static void throwExceptionIfNeeded(int err, @Nullable String msg) { |
| if (err == Status.OK) { |
| return; |
| } |
| if (err == Status.BAD_VALUE) { |
| throw new IllegalArgumentException(); |
| } |
| |
| String diagnosticInfo = ""; |
| switch (err) { |
| case Status.ERROR_CAS_UNKNOWN: |
| diagnosticInfo = "General CAS error"; |
| break; |
| case Status.ERROR_CAS_NO_LICENSE: |
| diagnosticInfo = "No license"; |
| break; |
| case Status.ERROR_CAS_LICENSE_EXPIRED: |
| diagnosticInfo = "License expired"; |
| break; |
| case Status.ERROR_CAS_SESSION_NOT_OPENED: |
| diagnosticInfo = "Session not opened"; |
| break; |
| case Status.ERROR_CAS_CANNOT_HANDLE: |
| diagnosticInfo = "Unsupported scheme or data format"; |
| break; |
| case Status.ERROR_CAS_INVALID_STATE: |
| diagnosticInfo = "Invalid CAS state"; |
| break; |
| case Status.ERROR_CAS_INSUFFICIENT_OUTPUT_PROTECTION: |
| diagnosticInfo = "Insufficient output protection"; |
| break; |
| case Status.ERROR_CAS_TAMPER_DETECTED: |
| diagnosticInfo = "Tamper detected"; |
| break; |
| case Status.ERROR_CAS_DECRYPT_UNIT_NOT_INITIALIZED: |
| diagnosticInfo = "Not initialized"; |
| break; |
| case Status.ERROR_CAS_DECRYPT: |
| diagnosticInfo = "Decrypt error"; |
| break; |
| default: |
| diagnosticInfo = "Unknown CAS state exception"; |
| break; |
| } |
| throw new MediaCasStateException(err, msg, |
| String.format("%s (err=%d)", diagnosticInfo, err)); |
| } |
| |
| /** |
| * Retrieve the associated error code |
| * |
| * @hide |
| */ |
| public int getErrorCode() { |
| return mErrorCode; |
| } |
| |
| /** |
| * Retrieve a developer-readable diagnostic information string |
| * associated with the exception. Do not show this to end-users, |
| * since this string will not be localized or generally comprehensible |
| * to end-users. |
| */ |
| @NonNull |
| public String getDiagnosticInfo() { |
| return mDiagnosticInfo; |
| } |
| } |