/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */

#ifndef _CC_CONSTANTS_H_
#define _CC_CONSTANTS_H_
#include "cc_types.h"

#define  PC_HANDLE_SIZE     17 /* 8 random bytes in hex plus null */

/**
 * Max call servers
 */
#define MAX_CALL_SERVERS 4

/**
 * Define notification priority
 */
#define CC_DEF_NOTIFY_PRI    20
#define CC_HR_NOTIFY_PRI     1

#define CC_ALL_LINES          255
#define SID_LINE_SHIFT        16
#define CC_NO_CALL_ID         (0)
#define CC_NO_LINE            (0)
#define CC_NO_CALL_INSTANCE   (0)

#define CC_MAX_LEN_REQ_SUPP_PARAM_CISCO_SISTAG 64

/**
 * Attrib bit in video available direction byte to indicate if the video is over CAST
 */
#define CC_ATTRIB_CAST 0x8

/**
 * Define the line id. The value 0 (CC_NO_LINE) means not set, it will be set by pSipcc system.
 */
typedef unsigned short cc_lineid_t;

/**
 * Define the call id. The value 0 (CC_NO_CALL_ID)  means not set, it will be set by pSipcc system.
 */
typedef unsigned short cc_callid_t;

typedef unsigned short cc_streamid_t;
typedef unsigned short cc_mcapid_t;
typedef unsigned short cc_groupid_t;
typedef unsigned short cc_level_t;

/**
 * Define the call instance id
 */

typedef unsigned short cc_call_instance_t;

/**
 * Define string char
 */
typedef const char *cc_string_t;

/**
 * Define an empty call handle
 */
#define CC_EMPTY_CALL_HANDLE   (0)

/**
 * This will be returned by pSipcc system, a user/application should use the following two methods to get the selected or
 * assinged line id and call id.
 * When a user or an application doesn't select a line (user passes 0 to pSipcc),, the pSipcc will assign it with the first available
 * line to it based on the maximum call per line that is configured.
 */
typedef unsigned int cc_call_handle_t;
#define CC_SID_TYPE_SHIFT 28
#define CC_SID_LINE_SHIFT 16
#define CC_SESSIONTYPE_CALLCONTROL 1
#define GET_LINE_ID(call_handle) (cc_lineid_t)((call_handle & 0xFFF0000) >> CC_SID_LINE_SHIFT )
#define GET_CALL_ID(call_handle) (cc_callid_t)(call_handle & 0xFFFF)
#define CREATE_CALL_HANDLE(line, callid) (cc_call_handle_t)(((line & 0xFFF) << CC_SID_LINE_SHIFT) + (callid & 0xFFFF))
#define CREATE_CALL_HANDLE_FROM_SESSION_ID(session_id) (session_id & 0xFFFFFFF)
#define CREATE_SESSION_ID_FROM_CALL_HANDLE(call_handle) ((CC_SESSIONTYPE_CALLCONTROL << CC_SID_TYPE_SHIFT) + call_handle)

/**
 * Define return codes
 */
typedef enum {
	CC_FAILURE = -1,
	CC_SUCCESS
} cc_return_t;

/**
 * Define valid number digits for SendDigit method
 */
typedef enum {
	KEY_1 = '1',
	KEY_2 = '2',
	KEY_3 = '3',
	KEY_4 = '4',
	KEY_5 = '5',
	KEY_6 = '6',
	KEY_7 = '7',
	KEY_8 = '8',
	KEY_9 = '9',
	KEY_0 = '0',
	KEY_STAR = '*',
	KEY_POUND = '#',
	KEY_A = 'A',
	KEY_B = 'B',
	KEY_C = 'C',
	KEY_D = 'D',
        KEY_PLUS = '+'
} cc_digit_t;


/**
 * Defines cucm mode of the call manager to which device is connected.
 */
typedef enum {
	CC_MODE_INVALID = -1,
	CC_MODE_CCM,
	CC_MODE_NONCCM
} cc_cucm_mode_t;

// Line feature
typedef enum {
	CC_LINE_FEATURE_NONE = 0,
	CC_LINE_FEATURE_REDIAL = 1,
	CC_LINE_FEATURE_SPEEDDIAL = 2,
	CC_LINE_FEATURE_DN = 9,
	CC_LINE_FEATURE_SERVICE = 20,
	CC_LINE_FEATURE_SPEEDDIALBLF = 21,
	CC_LINE_FEATURE_MALICIOUSCALLID = 27,
	CC_LINE_FEATURE_CALLPICKUP = 127,
	CC_LINE_FEATURE_GROUPCALLPICKUP = 128,
	CC_LINE_FEATURE_QUALREPORTTOOL = 133,
	CC_LINE_FEATURE_OTHERPICKUP = 135,
	CC_LINE_FEATURE_ALLCALLS = 140,
	CC_LINE_FEATURE_ANSWEROLDEST = 141,
	CC_LINE_FEATURE_SERVICES = 192,
	CC_LINE_FEATURE_BLF = 255
} cc_line_feature_t;

/**
 * Define feature option mask
 */
typedef enum {
	CC_FEATUREOPTIONMASK_NONE,
	CC_FEATUREOPTIONMASK_BLF_PICKUP
} cc_feature_option_mask_t;

/**
 * Defines cucm secure levels
 */
typedef enum {
    CC_CUCM_NONSECURE,
    CC_CUCM_AUTHENTICATED,
    CC_CUCM_ENCRYPTED,
    CC_CUCM_NOT_IN_CTL
} cc_cucm_sec_level_t;

/**
 * Defines cc events causing registration state change
 */
typedef enum {
	CC_CAUSE_NONE,
	CC_CAUSE_FAILOVER,
	CC_CAUSE_FALLBACK,
	CC_CAUSE_REG_ALL_FAILED,
	CC_CAUSE_SHUTDOWN,
	CC_CAUSE_UNREG_ALL,
	CC_CAUSE_LOGOUT_RESET
} cc_service_cause_t;

/**
 * Defines cc service state
 */
typedef enum {
    CC_STATE_IDLE = 0,
    CC_STATE_INS,
    CC_STATE_OOS,
    CC_STATE_PRO_BASE
} cc_service_state_t;

/**
 * Define cucm connection status.
 */
typedef enum {
    CC_CCM_STATUS_NONE = 0,
    CC_CCM_STATUS_STANDBY,
    CC_CCM_STATUS_ACTIVE
} cc_ccm_status_t;

/**
 * Define line registration state
 */
typedef enum {
    CC_UNREGISTERED,
    CC_REGISTERED
}cc_line_reg_state_t;

/**
 * Defines pSipcc shutdown reason code
 */
typedef enum {
    CC_SHUTDOWN_NORMAL,
    CC_SHUTDOWN_UNSPECIFIED,
    CC_SHUTDOWN_VERMISMATCH
} cc_shutdown_reason_t;

/**
 * Defines kpml value
 */
typedef enum {
    CC_KPML_NONE = 0x0,
    CC_KPML_SIGNAL_ONLY = 0x1,
    CC_KPML_DTMF_ONLY = 0x2,
    CC_KPML_BOTH = 0x3
} cc_kpml_config_t;

/**
 * Defines whether to upgrade now or later to recently download firmware image
 */
typedef enum {
	CC_UPGRADE_NONE = 0,
	CC_UPGRADE_NOW,
	CC_UPGRADE_LATER
} cc_upgrade_t;

/* Media flow direction */
typedef enum {
    CC_SDP_DIRECTION_INACTIVE,
    CC_SDP_DIRECTION_SENDONLY,
    CC_SDP_DIRECTION_RECVONLY,
    CC_SDP_DIRECTION_SENDRECV,
    CC_SDP_MAX_QOS_DIRECTIONS
} cc_sdp_direction_t;

/**
 * Defines BLF state
 */
typedef enum {
	CC_SIP_BLF_UNKNOWN,
	CC_SIP_BLF_IDLE,
	CC_SIP_BLF_INUSE,
	CC_SIP_BLF_EXPIRED,
	CC_SIP_BLF_REJECTED,
	CC_SIP_BLF_ALERTING
} cc_blf_state_t;

/**
 * Defines BLF feature mask
 */
typedef enum {
    CC_BLF_FEATURE_MASK_NONE = 0,
    CC_BLF_FEATURE_MASK_PICKUP
} cc_blf_feature_mask_t;

/**
 * Defines call state
 */
typedef enum {
	OFFHOOK,
	ONHOOK,
	RINGOUT,
	RINGIN,
	PROCEED,
	CONNECTED,
	HOLD,
	REMHOLD,
	RESUME,
	BUSY,
	REORDER,
	CONFERENCE,
	DIALING,
	REMINUSE,
	HOLDREVERT,
	WHISPER,
    PRESERVATION,
	WAITINGFORDIGITS = 21,
	CREATEOFFER,
	CREATEANSWER,
	CREATEOFFERERROR,
	CREATEANSWERERROR,
	SETLOCALDESC,
	SETREMOTEDESC,
	SETLOCALDESCERROR,
	SETREMOTEDESCERROR,
	REMOTESTREAMADD,
    MAX_CALL_STATES
} cc_call_state_t;

/**
 * Defines call attribute
 */
typedef enum {
	CC_ATTR_NOT_DEFINED = -1,
	CC_ATTR_NORMAL,
	CC_ATTR_XFR_CONSULT,
	CC_ATTR_CONF_CONSULT,
	CC_ATTR_BARGING,
	CC_ATTR_RIUHELD_LOCKED,
	CC_ATTR_LOCAL_CONF_CONSULT,
	CC_ATTR_LOCAL_XFER_CONSULT,
	CC_ATTR_CFWDALL,
	CC_ATTR_GRP_CALL_PICKUP,
	CC_ATTR_CFWD_ALL,
	CC_ATTR_MAX
} cc_call_attr_t;

/**
 * Defines the hold reason
 */
typedef enum {
   CC_HOLD_REASON_NONE,
   CC_HOLD_REASON_XFER,
   CC_HOLD_REASON_CONF,
   CC_HOLD_REASON_SWAP,
   CC_HOLD_REASON_INTERNAL
} cc_hold_reason_t;

/**
 * Defines call type
 */
typedef enum {
	CC_CALL_TYPE_NONE,
	CC_CALL_TYPE_INCOMING,
	CC_CALL_TYPE_OUTGOING,
	CC_CALL_TYPE_FORWARDED
} cc_call_type_t;

/**
 * Defines call security
 */
typedef enum {
	CC_SECURITY_NONE,
	CC_SECURITY_UNKNOWN,
	CC_SECURITY_AUTHENTICATED,
	CC_SECURITY_NOT_AUTHENTICATED,
	CC_SECURITY_ENCRYPTED
} cc_call_security_t;

/**
 * Defines call policy
 */
typedef enum {
	/* Call Policy */
	CC_POLICY_NONE,
	CC_POLICY_UNKNOWN,
	CC_POLICY_CHAPERONE
} cc_call_policy_t;

/**
 * Defines Log disposition
 */
typedef enum {
	CC_LOGD_MISSED,
	CC_LOGD_RCVD,
	CC_LOGD_SENT,
	CC_LOGD_UNKNWN,
	CC_LOGD_DELETE
} cc_log_disposition_t;

/**
 * Defines call priority
 */
typedef enum{
	CC_PRIORITY_NORMAL,
	CC_PRIORITY_URGENT
} cc_call_priority_t;

/**
 * Defines call selection
 */
typedef enum {
	CC_CALL_SELECT_NONE,
	CC_CALL_SELECT_LOCKED,
	CC_CALL_SELECT_UNLOCKED,
	CC_CALL_SELECT_REMOTE_LOCKED
} cc_call_selection_t;

/**
 * Defines service control request
 */
typedef enum {
	CC_DEVICE_RESET = 1,
	CC_DEVICE_RESTART,
    CC_DEVICE_ICMP_UNREACHABLE = 5
} cc_srv_ctrl_req_t;

/**
 * Defines service control command
 */
typedef enum {
	CC_ACTION_RESET = 1,
	CC_ACTION_RESTART
} cc_srv_ctrl_cmd_t;

/**
 * Defines messaging type
 */
typedef enum {
	CC_VOICE_MESSAGE = 1,
	CC_TEXT_MESSAGE
} cc_message_type_t;

/**
 * Defines handset lamp state
 */
typedef enum {
	CC_LAMP_NONE = 0,
	CC_LAMP_ON,
	CC_LAMP_BLINK,
	CC_LAMP_FRESH
} cc_lamp_state_t;

/**
 * defines call cause
 * Important: when update this enum, please update the cc_cause_name accordingly.
 */
typedef enum {
	CC_CAUSE_MIN = -1,
	CC_CAUSE_BASE = -1,
	CC_CAUSE_OK,
	CC_CAUSE_ERROR,
	CC_CAUSE_UNASSIGNED_NUM,
	CC_CAUSE_NO_RESOURCE,
	CC_CAUSE_NO_ROUTE,
	CC_CAUSE_NORMAL,
	CC_CAUSE_BUSY,
	CC_CAUSE_NO_USER_RESP,
	CC_CAUSE_NO_USER_ANS,
	CC_CAUSE_REJECT,
	CC_CAUSE_INVALID_NUMBER,
	CC_CAUSE_FACILITY_REJECTED,
	CC_CAUSE_CALL_ID_IN_USE,
	CC_CAUSE_XFER_LOCAL,
	CC_CAUSE_XFER_REMOTE,
	CC_CAUSE_XFER_BY_REMOTE,
	CC_CAUSE_XFER_CNF,
	CC_CAUSE_CONGESTION,
	CC_CAUSE_ANONYMOUS,
	CC_CAUSE_REDIRECT,
	CC_CAUSE_PAYLOAD_MISMATCH,
	CC_CAUSE_CONF,
	CC_CAUSE_REPLACE,
	CC_CAUSE_NO_REPLACE_CALL,
	CC_CAUSE_NO_RESUME,
	CC_CAUSE_NO_MEDIA,
	CC_CAUSE_REQUEST_PENDING,
	CC_CAUSE_INVALID_PARTICIPANT,
	CC_CAUSE_NO_CNF_BRIDE,
	CC_MAXIMUM_PARTICIPANT,
	CC_KEY_NOT_ACTIVE,
	CC_TEMP_NOT_AVAILABLE,
	CC_CAUSE_REMOTE_SERVER_ERROR,
	CC_CAUSE_BARGE,
	CC_CAUSE_CBARGE,
	CC_CAUSE_NOT_FOUND,
	CC_CAUSE_SECURITY_FAILURE,
	CC_CAUSE_MONITOR,
	CC_CAUSE_UI_STATE_BUSY,
	CC_SIP_CAUSE_ANSWERED_ELSEWHERE,
	CC_CAUSE_RETRIEVED,
	CC_CAUSE_FORWARDED,
	CC_CAUSE_ABANDONED,
	CC_CAUSE_XFER_LOCAL_WITH_DIALSTRING,
	CC_CAUSE_BW_OK,
	CC_CAUSE_XFER_COMPLETE,
	CC_CAUSE_RESP_TIMEOUT,
	CC_CAUSE_SERV_ERR_UNAVAIL,
    CC_CAUSE_REMOTE_DISCONN_REQ_PLAYTONE,
    CC_CAUSE_OUT_OF_MEM,
    CC_CAUSE_VALUE_NOT_FOUND,
	CC_CAUSE_MAX
} cc_cause_t;

/**
 * defines subscription event type
 */
typedef enum {
	CC_SUBSCRIPTIONS_DIALOG_EXT = 2,
    CC_SUBSCRIPTIONS_KPML_EXT = 4,
    CC_SUBSCRIPTIONS_PRESENCE_EXT = 5,
    CC_SUBSCRIPTIONS_REMOTECC_EXT = 6,
    CC_SUBSCRIPTIONS_REMOTECC_OPTIONSIND_EXT = 7,
    CC_SUBSCRIPTIONS_CONFIGAPP_EXT = 8,
    CC_SUBSCRIPTIONS_MEDIA_INFO_EXT = 10
} cc_subscriptions_ext_t;

typedef enum {
    APPLY_DYNAMICALLY=0,
    RESTART_NEEDED,
    APPLY_CONFIG_NONE
} cc_apply_config_result_t;


/**
 * defines ID of cucm
 */

typedef enum {
    PRIMARY_CCM = 0,
    SECONDARY_CCM,
    TERTIARY_CCM,
    MAX_CCM,
    UNUSED_PARAM
} CCM_ID;

typedef enum {
    CC_SIS_B2B_CONF = 0,
    CC_SIS_SWAP,
    CC_SIS_CFWD_ANY_LINE
} cc_sis_feature_id_e;

/**
 * enum for conference participant status
 */

typedef enum {
   CCAPI_CONFPARTICIPANT_UNKNOWN,
   CCAPI_CONFPARTICIPANT_DIALING_OUT,
   CCAPI_CONFPARTICIPANT_ALERTING,
   CCAPI_CONFPARTICIPANT_CONNECTED,
   CCAPI_CONFPARTICIPANT_ON_HOLD,
   CCAPI_CONFPARTICIPANT_DISCONNECTED
} cc_conf_participant_status_t;


typedef enum {
  JSEP_NO_ACTION = -1,
  JSEP_OFFER,
  JSEP_ANSWER,
  JSEP_PRANSWER
} cc_jsep_action_t;


typedef cc_string_t cc_peerconnection_t;

typedef unsigned int cc_media_stream_id_t;

typedef unsigned int cc_media_track_id_t;


typedef enum {
  NO_STREAM = -1,
  AUDIO,
  VIDEO,
  TYPE_MAX
} cc_media_type_t;


typedef struct {
  char        *name;
  char        *value;
  cc_boolean   mandatory;
} cc_media_constraint_t;

typedef struct {
  cc_media_constraint_t**  constraints;
  cc_uint16_t              constraint_count;
} cc_media_constraints_t;

#endif /* _CC_CONSTANTS_H_ */