blob: 4984485c1976c92071362844ee6c62725318b44d [file] [log] [blame]
/*
* 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());
}
}