| /* |
| * Copyright (C) 2018 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 com.android.internal.telephony.uicc.euicc; |
| |
| import android.annotation.IntDef; |
| import android.annotation.Nullable; |
| |
| import com.android.internal.telephony.uicc.asn1.Asn1Node; |
| import com.android.internal.telephony.uicc.euicc.apdu.ApduSender; |
| |
| import java.lang.annotation.Retention; |
| import java.lang.annotation.RetentionPolicy; |
| |
| /** |
| * The exception which is thrown when an error is returned in a successfully executed APDU command |
| * sent to eUICC. This exception means the response status is no-error |
| * ({@link ApduSender#STATUS_NO_ERROR}), but the action is failed due to eUICC specific logic. |
| */ |
| public class EuiccCardErrorException extends EuiccCardException { |
| /** Operations */ |
| @Retention(RetentionPolicy.SOURCE) |
| @IntDef(prefix = "OPERATION_", value = { |
| OPERATION_UNKNOWN, |
| OPERATION_GET_PROFILE, |
| OPERATION_PREPARE_DOWNLOAD, |
| OPERATION_AUTHENTICATE_SERVER, |
| OPERATION_CANCEL_SESSION, |
| OPERATION_LOAD_BOUND_PROFILE_PACKAGE, |
| OPERATION_LIST_NOTIFICATIONS, |
| OPERATION_SET_NICKNAME, |
| OPERATION_RETRIEVE_NOTIFICATION, |
| OPERATION_REMOVE_NOTIFICATION_FROM_LIST, |
| OPERATION_SWITCH_TO_PROFILE, |
| OPERATION_DISABLE_PROFILE, |
| OPERATION_DELETE_PROFILE, |
| OPERATION_RESET_MEMORY, |
| OPERATION_SET_DEFAULT_SMDP_ADDRESS, |
| }) |
| public @interface OperationCode {} |
| |
| public static final int OPERATION_UNKNOWN = 0; |
| public static final int OPERATION_GET_PROFILE = 1; |
| public static final int OPERATION_PREPARE_DOWNLOAD = 2; |
| public static final int OPERATION_AUTHENTICATE_SERVER = 3; |
| public static final int OPERATION_CANCEL_SESSION = 4; |
| public static final int OPERATION_LOAD_BOUND_PROFILE_PACKAGE = 5; |
| public static final int OPERATION_LIST_NOTIFICATIONS = 6; |
| public static final int OPERATION_SET_NICKNAME = 7; |
| public static final int OPERATION_RETRIEVE_NOTIFICATION = 8; |
| public static final int OPERATION_REMOVE_NOTIFICATION_FROM_LIST = 9; |
| public static final int OPERATION_SWITCH_TO_PROFILE = 10; |
| public static final int OPERATION_DISABLE_PROFILE = 11; |
| public static final int OPERATION_DELETE_PROFILE = 12; |
| public static final int OPERATION_RESET_MEMORY = 13; |
| public static final int OPERATION_SET_DEFAULT_SMDP_ADDRESS = 14; |
| |
| private final @OperationCode int mOperationCode; |
| private final int mErrorCode; |
| private final @Nullable Asn1Node mErrorDetails; |
| |
| /** |
| * Creates an exception with an error code in the response of an APDU command. |
| * |
| * @param errorCode The meaning of the code depends on each APDU command. It should always be |
| * non-negative. |
| */ |
| public EuiccCardErrorException(@OperationCode int operationCode, int errorCode) { |
| mOperationCode = operationCode; |
| mErrorCode = errorCode; |
| mErrorDetails = null; |
| } |
| |
| /** |
| * Creates an exception with an error code and the error details in the response of an APDU |
| * command. |
| * |
| * @param errorCode The meaning of the code depends on each APDU command. It should always be |
| * non-negative. |
| * @param errorDetails The content of the details depends on each APDU command. |
| */ |
| public EuiccCardErrorException(@OperationCode int operationCode, int errorCode, |
| @Nullable Asn1Node errorDetails) { |
| mOperationCode = operationCode; |
| mErrorCode = errorCode; |
| mErrorDetails = errorDetails; |
| } |
| |
| /** @return The error code. The meaning of the code depends on each APDU command. */ |
| public int getErrorCode() { |
| return mErrorCode; |
| } |
| |
| /** @return The operation code. */ |
| public int getOperationCode() { |
| return mOperationCode; |
| } |
| |
| /** @return The error details. The meaning of the details depends on each APDU command. */ |
| @Nullable |
| public Asn1Node getErrorDetails() { |
| return mErrorDetails; |
| } |
| |
| @Override |
| public String getMessage() { |
| return "EuiccCardError: mOperatorCode=" + mOperationCode + ", mErrorCode=" + mErrorCode |
| + ", errorDetails=" + (mErrorDetails == null ? "null" : mErrorDetails.toHex()); |
| } |
| } |