/*
 * Copyright (C) 2007 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;

import android.annotation.UnsupportedAppUsage;
import android.telephony.Rlog;

/**
 * {@hide}
 */
public class CommandException extends RuntimeException {
    @UnsupportedAppUsage
    private Error mError;

    public enum Error {
        INVALID_RESPONSE,
        @UnsupportedAppUsage
        RADIO_NOT_AVAILABLE,
        @UnsupportedAppUsage
        GENERIC_FAILURE,
        @UnsupportedAppUsage
        PASSWORD_INCORRECT,
        SIM_PIN2,
        @UnsupportedAppUsage
        SIM_PUK2,
        @UnsupportedAppUsage
        REQUEST_NOT_SUPPORTED,
        OP_NOT_ALLOWED_DURING_VOICE_CALL,
        OP_NOT_ALLOWED_BEFORE_REG_NW,
        @UnsupportedAppUsage
        SMS_FAIL_RETRY,
        SIM_ABSENT,
        SUBSCRIPTION_NOT_AVAILABLE,
        MODE_NOT_SUPPORTED,
        FDN_CHECK_FAILURE,
        ILLEGAL_SIM_OR_ME,
        MISSING_RESOURCE,
        NO_SUCH_ELEMENT,
        SUBSCRIPTION_NOT_SUPPORTED,
        DIAL_MODIFIED_TO_USSD,
        DIAL_MODIFIED_TO_SS,
        DIAL_MODIFIED_TO_DIAL,
        USSD_MODIFIED_TO_DIAL,
        USSD_MODIFIED_TO_SS,
        USSD_MODIFIED_TO_USSD,
        SS_MODIFIED_TO_DIAL,
        SS_MODIFIED_TO_DIAL_VIDEO,
        SS_MODIFIED_TO_USSD,
        SS_MODIFIED_TO_SS,
        SIM_ALREADY_POWERED_OFF,
        SIM_ALREADY_POWERED_ON,
        SIM_DATA_NOT_AVAILABLE,
        SIM_SAP_CONNECT_FAILURE,
        SIM_SAP_MSG_SIZE_TOO_LARGE,
        SIM_SAP_MSG_SIZE_TOO_SMALL,
        SIM_SAP_CONNECT_OK_CALL_ONGOING,
        LCE_NOT_SUPPORTED,
        NO_MEMORY,
        INTERNAL_ERR,
        SYSTEM_ERR,
        MODEM_ERR,
        INVALID_STATE,
        NO_RESOURCES,
        SIM_ERR,
        INVALID_ARGUMENTS,
        INVALID_SIM_STATE,
        INVALID_MODEM_STATE,
        INVALID_CALL_ID,
        NO_SMS_TO_ACK,
        NETWORK_ERR,
        REQUEST_RATE_LIMITED,
        SIM_BUSY,
        SIM_FULL,
        NETWORK_REJECT,
        OPERATION_NOT_ALLOWED,
        EMPTY_RECORD,
        INVALID_SMS_FORMAT,
        ENCODING_ERR,
        INVALID_SMSC_ADDRESS,
        NO_SUCH_ENTRY,
        NETWORK_NOT_READY,
        NOT_PROVISIONED,
        NO_SUBSCRIPTION,
        NO_NETWORK_FOUND,
        DEVICE_IN_USE,
        ABORTED,
        OEM_ERROR_1,
        OEM_ERROR_2,
        OEM_ERROR_3,
        OEM_ERROR_4,
        OEM_ERROR_5,
        OEM_ERROR_6,
        OEM_ERROR_7,
        OEM_ERROR_8,
        OEM_ERROR_9,
        OEM_ERROR_10,
        OEM_ERROR_11,
        OEM_ERROR_12,
        OEM_ERROR_13,
        OEM_ERROR_14,
        OEM_ERROR_15,
        OEM_ERROR_16,
        OEM_ERROR_17,
        OEM_ERROR_18,
        OEM_ERROR_19,
        OEM_ERROR_20,
        OEM_ERROR_21,
        OEM_ERROR_22,
        OEM_ERROR_23,
        OEM_ERROR_24,
        OEM_ERROR_25,
    }

    @UnsupportedAppUsage
    public CommandException(Error e) {
        super(e.toString());
        mError = e;
    }

    public CommandException(Error e, String errString) {
        super(errString);
        mError = e;
    }

    @UnsupportedAppUsage
    public static CommandException
    fromRilErrno(int ril_errno) {
        switch(ril_errno) {
            case RILConstants.SUCCESS:                       return null;
            case RILConstants.RIL_ERRNO_INVALID_RESPONSE:
                return new CommandException(Error.INVALID_RESPONSE);
            case RILConstants.RADIO_NOT_AVAILABLE:
                return new CommandException(Error.RADIO_NOT_AVAILABLE);
            case RILConstants.GENERIC_FAILURE:
                return new CommandException(Error.GENERIC_FAILURE);
            case RILConstants.PASSWORD_INCORRECT:
                return new CommandException(Error.PASSWORD_INCORRECT);
            case RILConstants.SIM_PIN2:
                return new CommandException(Error.SIM_PIN2);
            case RILConstants.SIM_PUK2:
                return new CommandException(Error.SIM_PUK2);
            case RILConstants.REQUEST_NOT_SUPPORTED:
                return new CommandException(Error.REQUEST_NOT_SUPPORTED);
            case RILConstants.OP_NOT_ALLOWED_DURING_VOICE_CALL:
                return new CommandException(Error.OP_NOT_ALLOWED_DURING_VOICE_CALL);
            case RILConstants.OP_NOT_ALLOWED_BEFORE_REG_NW:
                return new CommandException(Error.OP_NOT_ALLOWED_BEFORE_REG_NW);
            case RILConstants.SMS_SEND_FAIL_RETRY:
                return new CommandException(Error.SMS_FAIL_RETRY);
            case RILConstants.SIM_ABSENT:
                return new CommandException(Error.SIM_ABSENT);
            case RILConstants.SUBSCRIPTION_NOT_AVAILABLE:
                return new CommandException(Error.SUBSCRIPTION_NOT_AVAILABLE);
            case RILConstants.MODE_NOT_SUPPORTED:
                return new CommandException(Error.MODE_NOT_SUPPORTED);
            case RILConstants.FDN_CHECK_FAILURE:
                return new CommandException(Error.FDN_CHECK_FAILURE);
            case RILConstants.ILLEGAL_SIM_OR_ME:
                return new CommandException(Error.ILLEGAL_SIM_OR_ME);
            case RILConstants.MISSING_RESOURCE:
                return new CommandException(Error.MISSING_RESOURCE);
            case RILConstants.NO_SUCH_ELEMENT:
                return new CommandException(Error.NO_SUCH_ELEMENT);
            case RILConstants.SUBSCRIPTION_NOT_SUPPORTED:
                return new CommandException(Error.SUBSCRIPTION_NOT_SUPPORTED);
            case RILConstants.DIAL_MODIFIED_TO_USSD:
                return new CommandException(Error.DIAL_MODIFIED_TO_USSD);
            case RILConstants.DIAL_MODIFIED_TO_SS:
                return new CommandException(Error.DIAL_MODIFIED_TO_SS);
            case RILConstants.DIAL_MODIFIED_TO_DIAL:
                return new CommandException(Error.DIAL_MODIFIED_TO_DIAL);
            case RILConstants.USSD_MODIFIED_TO_DIAL:
                return new CommandException(Error.USSD_MODIFIED_TO_DIAL);
            case RILConstants.USSD_MODIFIED_TO_SS:
                return new CommandException(Error.USSD_MODIFIED_TO_SS);
            case RILConstants.USSD_MODIFIED_TO_USSD:
                return new CommandException(Error.USSD_MODIFIED_TO_USSD);
            case RILConstants.SS_MODIFIED_TO_DIAL:
                return new CommandException(Error.SS_MODIFIED_TO_DIAL);
            case RILConstants.SS_MODIFIED_TO_USSD:
                return new CommandException(Error.SS_MODIFIED_TO_USSD);
            case RILConstants.SS_MODIFIED_TO_SS:
                return new CommandException(Error.SS_MODIFIED_TO_SS);
            case RILConstants.SIM_ALREADY_POWERED_OFF:
                return new CommandException(Error.SIM_ALREADY_POWERED_OFF);
            case RILConstants.SIM_ALREADY_POWERED_ON:
                return new CommandException(Error.SIM_ALREADY_POWERED_ON);
            case RILConstants.SIM_DATA_NOT_AVAILABLE:
                return new CommandException(Error.SIM_DATA_NOT_AVAILABLE);
            case RILConstants.SIM_SAP_CONNECT_FAILURE:
                return new CommandException(Error.SIM_SAP_CONNECT_FAILURE);
            case RILConstants.SIM_SAP_MSG_SIZE_TOO_LARGE:
                return new CommandException(Error.SIM_SAP_MSG_SIZE_TOO_LARGE);
            case RILConstants.SIM_SAP_MSG_SIZE_TOO_SMALL:
                return new CommandException(Error.SIM_SAP_MSG_SIZE_TOO_SMALL);
            case RILConstants.SIM_SAP_CONNECT_OK_CALL_ONGOING:
                return new CommandException(Error.SIM_SAP_CONNECT_OK_CALL_ONGOING);
            case RILConstants.LCE_NOT_SUPPORTED:
                return new CommandException(Error.LCE_NOT_SUPPORTED);
            case RILConstants.NO_MEMORY:
                return new CommandException(Error.NO_MEMORY);
            case RILConstants.INTERNAL_ERR:
                return new CommandException(Error.INTERNAL_ERR);
            case RILConstants.SYSTEM_ERR:
                return new CommandException(Error.SYSTEM_ERR);
            case RILConstants.MODEM_ERR:
                return new CommandException(Error.MODEM_ERR);
            case RILConstants.INVALID_STATE:
                return new CommandException(Error.INVALID_STATE);
            case RILConstants.NO_RESOURCES:
                return new CommandException(Error.NO_RESOURCES);
            case RILConstants.SIM_ERR:
                return new CommandException(Error.SIM_ERR);
            case RILConstants.INVALID_ARGUMENTS:
                return new CommandException(Error.INVALID_ARGUMENTS);
            case RILConstants.INVALID_SIM_STATE:
                return new CommandException(Error.INVALID_SIM_STATE);
            case RILConstants.INVALID_MODEM_STATE:
                return new CommandException(Error.INVALID_MODEM_STATE);
            case RILConstants.INVALID_CALL_ID:
                return new CommandException(Error.INVALID_CALL_ID);
            case RILConstants.NO_SMS_TO_ACK:
                return new CommandException(Error.NO_SMS_TO_ACK);
            case RILConstants.NETWORK_ERR:
                return new CommandException(Error.NETWORK_ERR);
            case RILConstants.REQUEST_RATE_LIMITED:
                return new CommandException(Error.REQUEST_RATE_LIMITED);
            case RILConstants.SIM_BUSY:
                return new CommandException(Error.SIM_BUSY);
            case RILConstants.SIM_FULL:
                return new CommandException(Error.SIM_FULL);
            case RILConstants.NETWORK_REJECT:
                return new CommandException(Error.NETWORK_REJECT);
            case RILConstants.OPERATION_NOT_ALLOWED:
                return new CommandException(Error.OPERATION_NOT_ALLOWED);
            case RILConstants.EMPTY_RECORD:
                return new CommandException(Error.EMPTY_RECORD);
            case RILConstants.INVALID_SMS_FORMAT:
                return new CommandException(Error.INVALID_SMS_FORMAT);
            case RILConstants.ENCODING_ERR:
                return new CommandException(Error.ENCODING_ERR);
            case RILConstants.INVALID_SMSC_ADDRESS:
                return new CommandException(Error.INVALID_SMSC_ADDRESS);
            case RILConstants.NO_SUCH_ENTRY:
                return new CommandException(Error.NO_SUCH_ENTRY);
            case RILConstants.NETWORK_NOT_READY:
                return new CommandException(Error.NETWORK_NOT_READY);
            case RILConstants.NOT_PROVISIONED:
                return new CommandException(Error.NOT_PROVISIONED);
            case RILConstants.NO_SUBSCRIPTION:
                return new CommandException(Error.NO_SUBSCRIPTION);
            case RILConstants.NO_NETWORK_FOUND:
                return new CommandException(Error.NO_NETWORK_FOUND);
            case RILConstants.DEVICE_IN_USE:
                return new CommandException(Error.DEVICE_IN_USE);
            case RILConstants.ABORTED:
                return new CommandException(Error.ABORTED);
            case RILConstants.INVALID_RESPONSE:
                return new CommandException(Error.INVALID_RESPONSE);
            case RILConstants.OEM_ERROR_1:
                return new CommandException(Error.OEM_ERROR_1);
            case RILConstants.OEM_ERROR_2:
                return new CommandException(Error.OEM_ERROR_2);
            case RILConstants.OEM_ERROR_3:
                return new CommandException(Error.OEM_ERROR_3);
            case RILConstants.OEM_ERROR_4:
                return new CommandException(Error.OEM_ERROR_4);
            case RILConstants.OEM_ERROR_5:
                return new CommandException(Error.OEM_ERROR_5);
            case RILConstants.OEM_ERROR_6:
                return new CommandException(Error.OEM_ERROR_6);
            case RILConstants.OEM_ERROR_7:
                return new CommandException(Error.OEM_ERROR_7);
            case RILConstants.OEM_ERROR_8:
                return new CommandException(Error.OEM_ERROR_8);
            case RILConstants.OEM_ERROR_9:
                return new CommandException(Error.OEM_ERROR_9);
            case RILConstants.OEM_ERROR_10:
                return new CommandException(Error.OEM_ERROR_10);
            case RILConstants.OEM_ERROR_11:
                return new CommandException(Error.OEM_ERROR_11);
            case RILConstants.OEM_ERROR_12:
                return new CommandException(Error.OEM_ERROR_12);
            case RILConstants.OEM_ERROR_13:
                return new CommandException(Error.OEM_ERROR_13);
            case RILConstants.OEM_ERROR_14:
                return new CommandException(Error.OEM_ERROR_14);
            case RILConstants.OEM_ERROR_15:
                return new CommandException(Error.OEM_ERROR_15);
            case RILConstants.OEM_ERROR_16:
                return new CommandException(Error.OEM_ERROR_16);
            case RILConstants.OEM_ERROR_17:
                return new CommandException(Error.OEM_ERROR_17);
            case RILConstants.OEM_ERROR_18:
                return new CommandException(Error.OEM_ERROR_18);
            case RILConstants.OEM_ERROR_19:
                return new CommandException(Error.OEM_ERROR_19);
            case RILConstants.OEM_ERROR_20:
                return new CommandException(Error.OEM_ERROR_20);
            case RILConstants.OEM_ERROR_21:
                return new CommandException(Error.OEM_ERROR_21);
            case RILConstants.OEM_ERROR_22:
                return new CommandException(Error.OEM_ERROR_22);
            case RILConstants.OEM_ERROR_23:
                return new CommandException(Error.OEM_ERROR_23);
            case RILConstants.OEM_ERROR_24:
                return new CommandException(Error.OEM_ERROR_24);
            case RILConstants.OEM_ERROR_25:
                return new CommandException(Error.OEM_ERROR_25);

            default:
                Rlog.e("GSM", "Unrecognized RIL errno " + ril_errno);
                return new CommandException(Error.INVALID_RESPONSE);
        }
    }

    @UnsupportedAppUsage
    public Error getCommandError() {
        return mError;
    }



}
