/* 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 XML_PARSER_DEFINES_H
#define XML_PARSER_DEFINES_H

#include "sll_lite.h"
#include "cc_constants.h"


/**
 * In general, when a parser constructs a xml string,
 * it should translate the enum to cooresponding string
 * value that is defined in the accompanied xsd files.
 */
/**
 * Define the state values
 */
typedef enum {
    XML_STATE_PARTIAL = 0, //Encode as "partial"
    XML_STATE_FULL         //"full"
} xml_state_t;

/**
 * Define the call orientation
 */
typedef enum {
    XML_CALL_ORIENTATION_UNSPECIFIED = 0,
    XML_CALL_ORIENTATION_TO,
    XML_CALL_ORIENTATION_FROM
} xml_call_orientation_t;

/**
 * Define the call lock status
 */
typedef enum {
    XML_CALLLOCK_UNLOCKED = 0,
    XML_CALLLOCK_LOCKED,
    XML_CALLLOCK_REMOTE_LOCKED
} xml_calllock_t;

/**
 * Define the direction values
 */
typedef enum {
    XML_DIRECTION_INITIATOR = 0,
    XML_DIRECTION_RECIPIENT
} xml_direction_t;

/**
 * Define the event values
 */
typedef enum {
    XML_EVENT_CANCELLED = 0,
    XML_EVENT_REJECTED,
    XML_EVENT_REPLACED,
    XML_EVENT_LOCAL_BYE,
    XML_EVENT_REMOTE_BYE,
    XML_EVENT_ERROR,
    XML_EVENT_TIMEOUT
} xml_event_t;

/**
 * Define the yes or no values
 */
typedef enum {
    XML_NO = 0,
    XML_YES,
    XML_NONEAPPLICABLE //"na"
} xml_yes_no_t;

/**
 * Define the on or off value
 */
typedef enum {
    XML_OFF = 0,
    XML_ON
} xml_on_off_t;

/**
 * Define the true or false values
 */
typedef enum {
    XML_FALSE = 0,
    XML_TRUE
} xml_true_false_t;

/**
 * Define the line key events
 */
typedef enum {
    XML_LINE_KEY_EVENT_LINE = 0,
    XML_LINE_KEY_EVENT_SPEEDDIAL
} xml_line_key_event_t;

/**
 * Define the persist types
 */
typedef enum {
    XML_PERSIST_TYPE_ONE_SHOT = 0,
    XML_PERSIST_TYPE_PERSIST,
    XML_PERSIST_TYPE_SINGLE_NOTIFY
} xml_persist_type_t;

/**
 * Define the soft key invoke type
 */
typedef enum {
    XML_SKEY_INVOKE_EXPLICIT = 0,
    XML_SKEY_NVOKE_IMPLICIT
} xml_skey_invoke_t;

/**
 * Define the soft key event data
 */
typedef enum {
    XML_SKEY_EVENT_UNDEFINED = 0,
    XML_SKEY_EVENT_REDIAL,
    XML_SKEY_EVENT_NEWCALL,
    XML_SKEY_EVENT_HOLD,
    XML_SKEY_EVENT_TRANSFER,
    XML_SKEY_EVENT_CFWDALL, //5
    XML_SKEY_EVENT_CFWDBUSY,
    XML_SKEY_EVENT_CFWDNOANSWER,
    XML_SKEY_EVENT_BACKSPACE,
    XML_SKEY_EVENT_ENDCALL,
    XML_SKEY_EVENT_RESUME, //10
    XML_SKEY_EVENT_ANSWER,
    XML_SKEY_EVENT_INFO,
    XML_SKEY_EVENT_CONFERENCE,
    XML_SKEY_EVENT_JION, //15
    XML_SKEY_EVENT_REMVOVE_LAST_CONF_PARTICIPANT,
    XML_SKEY_EVENT_DIRECT_XFER,
    XML_SKEY_EVENT_SELECT, //25
    XML_SKEY_EVENT_TRANSFER_TO_VOICE_MAIL,
    XML_SKEY_EVENT_SAC,
    XML_SKEY_EVENT_UNSELECT, //35
    XML_SKEY_EVENT_CANCEL,
    XML_SKEY_EVENT_COPNFERENCE_DETAILS,//40
    XML_SKEY_EVENT_TRASFMG = 65,
    XML_SKEY_EVENT_INTRCPT,
    XML_SKEY_EVENT_SETWTCH,
    XML_SKEY_EVENT_TRNSFVM,
    XML_SKEY_EVENT_TRNSFAS
} xml_skey_event_code_t;

/**
 * Define the map for station sequence mapping
 */
typedef enum {
    XML_STATION_SEQ_FIRST = 0,
    XML_STATION_SEQ_MORE,
    XML_STATION_SEQ_LAST
} xml_stataionseq_t;

/**
 * Define the hold reasons
 */
typedef enum {
    XML_HOLD_REASON_NONE = 0,
    XML_HOLD_REASON_TRANSFER,
    XML_HOLD_REASON_CONFERENCE,
    XML_HOLD_REASON_INTERNAL
} xml_hold_reason_t;

/**
 * Define the lamp status
 */
typedef enum {
    XML_LAMP_STATE_OFF = 0,
    XML_LAMP_STATE_ON,
    XML_LAMP_STATE_BLINK,
    XML_LAMP_STATE_FLASH
} xml_lamp_state_t;

/**
 * Define the lamp type
 */
typedef enum {
    XML_LAMP_TYPE_LINE = 1,
    XML_LAMP_TYPE_VOICE_MAIL
} xml_lamp_type_t;

/**
 * Define the image down load method
 */
typedef enum {
    XML_IMAGE_DOWNLOAD_METHOD_TFTP = 1,
    XML_IMAGE_DOWNLAOD_METHOD_HTTP,
    XML_IMAGE_DOWNLOAD_METHOD_PPID
} xml_image_dl_method_t;

/**
 * Define the image download failure reason
 */
typedef enum {
    XML_IMAGE_DOWNLOAD_FAILURE_REASON_DISKFULL = 1,
    XML_IMAGE_DOWNLOAD_FAILURE_REASON_IMAGE_NOT_AVAILABLE,
    XML_IMAGE_DOWNLOAD_FAILURE_REASON_ACCESS_VIOLATION
} xml_image_dl_failure_reason_t;

typedef signed long         xml_signed32;
typedef unsigned long       xml_unsigned32;
typedef unsigned short      xml_unsigned16;
typedef unsigned char       xml_unsigned8;

// start of copy from ccsip_eventbodies.h
typedef struct State {
	xml_signed32		event;
	xml_signed32		code;
	xml_signed32		state;
} State;

typedef struct Replaces {
	char			call_id[128];
	char			local_tag[64];
	char			remote_tag[64];
} Replaces;

typedef struct RefferedBy {
	char			display_name[64];
	char			uri[64];
} RefferedBy;

typedef struct RouteSet {
	char			hop[5][16];
} RouteSet;

typedef struct Identity {
	char			display_name[64];
	char			uri[64];
} Identity;

typedef struct Param {
	char			pname[32];
	char			pval[32];
} Param;

typedef struct Target {
	Param	param[4];
	char			uri[64];
} Target;

typedef struct SessionDescription {
	char			type[32];
} SessionDescription;

typedef struct Participant {
	Identity	identity;
	Target	target;
	SessionDescription	session_description;
	xml_unsigned16		cseq;
} Participant;

typedef struct primCall {
	char			call_id[128];
	char			local_tag[64];
	char			remote_tag[64];
	xml_signed32		h_reason;
} primCall;

typedef struct callFeature {
    char            cfwdall_set[128];
    char            cfwdall_clear[128];
} callFeature;

typedef struct Stream {
	char			reverse[16];
} Stream;

typedef struct Regex {
	char			regexData[32];
	char			tag[32];
	char			pre[32];
} Regex;

typedef struct Pattern {
	xml_signed32		flush;
	Regex	regex;
	xml_signed32		persist;
	xml_unsigned32		interdigittimer;
	xml_unsigned32		criticaldigittimer;
	xml_unsigned32		extradigittimer;
	xml_unsigned16		longhold;
	xml_unsigned8		longrepeat;
	xml_unsigned8		nopartial;
	char			enterkey[8];
} Pattern;

typedef struct KPMLRequest {
	Stream	stream;
	Pattern	pattern;
	char			version[16];
} KPMLRequest;

typedef struct KPMLResponse {
	char			version[16];
	char			code[16];
	char			text[16];
	xml_unsigned8		suppressed;
	char			forced_flush[16];
	char			digits[16];
	char			tag[16];
} KPMLResponse;

typedef struct dialogID {
	char			callid[128];
	char			localtag[64];
	char			remotetag[64];
} dialogID;

typedef struct consultDialogID {
	char			callid[128];
	char			localtag[64];
	char			remotetag[64];
} consultDialogID;

typedef struct joindialogID {
	char			callid[128];
	char			localtag[64];
	char			remotetag[64];
} joindialogID;

typedef struct reg_contact_t {
	char			Register[16];
	char			Unregister[16];
	xml_unsigned32		line;
	xml_unsigned32		low;
	xml_unsigned32		high;
	xml_signed32		all;
} reg_contact_t;


typedef struct remotecc {
	char			status[16];
} remotecc;

typedef struct combine {
	xml_unsigned16		max_bodies;
	remotecc	remotecc;
	char			service_control[16];
} combine;

typedef struct dialog {
	char			usage[64];
	char			unot[16];
	char			sub[16];
} dialog;

typedef struct presence {
	char			usage[64];
	char			unot[16];
	char			sub[16];
} presence;

typedef struct voice_msg_t {
	xml_signed32		newCount;
	xml_signed32		oldCount;
} voice_msg_t;

typedef struct voice_msg_hp_t {
	xml_signed32		newCount;
	xml_signed32		oldCount;
} voice_msg_hp_t;

typedef struct fax_msg_t {
	xml_signed32		newCount;
	xml_signed32		oldCount;
} fax_msg_t;

typedef struct fax_msg_hp_t {
	xml_signed32		newCount;
	xml_signed32		oldCount;
} fax_msg_hp_t;

typedef struct emwi_t {
	voice_msg_t	voice_msg;
	voice_msg_hp_t	voice_msg_hp;
	fax_msg_t	fax_msg;
	fax_msg_hp_t	fax_msg_hp;
} emwi_t;

typedef struct cfwdallupdate {
	char			fwdAddress[256];
} cfwdallupdate;

typedef struct Contact_t {
	xml_unsigned32		line;
	xml_unsigned32		high;
	xml_unsigned32		low;
	xml_signed32		all;
	xml_signed32		mwi;
	emwi_t	emwi;
	cfwdallupdate	cfwdallupdate;
} Contact_t;

typedef struct dialog_t {
	char			usage[64];
	char			unot[12];
	char			sub[12];
} dialog_t;

typedef struct presence_t {
	char			usage[64];
	char			unot[12];
	char			sub[12];
} presence_t;

typedef struct options_ans_t {
	combine	combine;
	dialog_t	dialog;
	presence_t	presence;
} options_ans_t;

typedef struct PersonStatusStruct {
	char			basic[32];
} PersonStatusStruct;

typedef struct ActivitiesStruct {
	char			alerting[12];
	char			onThePhone[12];
	char			busy[12];
	char			away[12];
	char			meeting[12];
} ActivitiesStruct;

typedef struct PersonStruct {
	char			id[256];
	PersonStatusStruct	personStatus;
	ActivitiesStruct	activities;
} PersonStruct;

typedef struct StatusStruct {
	char			basic[32];
	ActivitiesStruct	activities;
} StatusStruct;

typedef struct TupleStruct {
	char			id[256];
	StatusStruct	status;
	char			contact[1][256];
	char			note[1][1024];
} TupleStruct;

typedef struct PresenceRPIDStruct {
	char			entity[256];
	PersonStruct	person;
	TupleStruct	tuple[1];
	char			note[5][1024];
} PresenceRPIDStruct;

typedef struct sipProfile {
	xml_unsigned16		kpml_val;
} sipProfile;

typedef struct ConfigApp_req_data_t {
	sipProfile	sip_profile;
} ConfigApp_req_data_t;

typedef struct to_encoder_t {
	xml_unsigned32		picture_fast_update;
} to_encoder_t;

typedef struct vc_primivite_t {
	to_encoder_t	to_encoder;
	char			stream_id[128];
} vc_primivite_t;

typedef struct Media_Control_t {
	vc_primivite_t	vc_primitive;
	char			general_error[128];
} Media_Control_t;

// end of copy from ccsip_eventbodies.h

typedef struct Presence_ext_t_ {
    PresenceRPIDStruct presence_body;
/*
 * Some of the tags' mere presence in the rpid document has a meaning. These tags
 * may not contain any value between starting and ending tag. So we need a way to
 * indicate the presence of a tag. We will use the following boolean memeber fields.
 */
    boolean onThePhone;
    boolean busy;
    boolean away;
    boolean meeting;
    boolean alerting;
} Presence_ext_t;


typedef enum {
    EVENT_DATA_INVALID = 0,
    EVENT_DATA_KPML_REQUEST,
    EVENT_DATA_KPML_RESPONSE,
    EVENT_DATA_REMOTECC_REQUEST,
    EVENT_DATA_PRESENCE,
    EVENT_DATA_DIALOG,
    EVENT_DATA_RAW,
    EVENT_DATA_CONFIGAPP_REQUEST,
    EVENT_DATA_MEDIA_INFO
} ccsip_event_data_type_e;

typedef struct {
    char    *data;
    uint32_t length;
} raw_data_t;

typedef struct {
    Media_Control_t media_control;
    uint32_t   picture_fast_update;
} media_control_ext_t;

#define TAG_LENGTH  16
typedef struct {
    char current_method[TAG_LENGTH];
    char hookstate[TAG_LENGTH];
    char presence[TAG_LENGTH];
} Options_ind_t;



typedef struct rcc_response_t {
       xml_unsigned16          code;
       char                    reason[128];
       xml_unsigned32          applicationid;
       xml_unsigned32          transactionid;
       xml_signed32            stationsequence;
       xml_unsigned16          displaypriority;
       xml_unsigned16          appinstance;
       xml_unsigned16          linenumber;
       xml_unsigned32          routingid;
       xml_unsigned32          confid;
       char                    callID[128];
       options_ans_t   options_ind;
} rcc_response_t;

typedef enum {
    RCC_NULL_REQ = 0,
    RCC_INITCALL_REQ = 1,
    RCC_MONITORCALL_REQ,
    RCC_DIALCALL_REQ,
    RCC_DIALDTMF_REQ,
    RCC_ANSCALL_REQ,
    RCC_DISCCALL_REQ,
    RCC_XFERSETUP_REQ,
    RCC_XFERCOMPLETE_REQ,
    RCC_CONFSETUP_REQ,
    RCC_CONFCOMPLETE_REQ,
    RCC_HOLD_REQ,
    RCC_HOLDRETRIEVE_REQ,
    RCC_DATAPASSTHROUGH_REQ,
    RCC_CFWDALL_REQ,
    RCC_LINEKEY_EVT,
    RCC_STATUS_UPDATE_REQ,
    RCC_SET_IDLE_STATUS_PROMPT_REQ,
    RCC_PLAY_TONE_REQ,
    RCC_STOP_TONE_REQ,
    RCC_CALL_SELECT_REQ,
    RCC_SOFTKEY_EVT,
    RCC_LINE_RINGER_SET_REQ,
    RCC_HOLD_REVERSION_REQ,
    RCC_LAMP_CONTROL_REQ,
    RCC_LINEKEY_UPDATE,
    RCC_BULKREGISTER_REQ,
    RCC_OPTIONS_IND,
    RCC_BULK_UPDATE,
    RCC_CALL_JOIN_REQ,
    RCC_NOTIFY_REQ,
    RCC_MONITOR_UPDATE_REQ,
    RCC_MAX_REQ
} rcc_request_type_t;

typedef struct rcc_softkey_event_msg_t {
	xml_signed32		softkeyevent;
	dialogID	dialogid;
	xml_unsigned16		linenumber;
	xml_unsigned16		participantnum;
	dialogID	consultdialogid;
	xml_unsigned8		state;
	dialogID	joindialogid;
	//eventData	eventdata;
	char			userdata[32];
	xml_unsigned16		soktkeyid;
	xml_unsigned16		applicationid;
} rcc_softkey_event_msg_t;


typedef struct RCC_req_data {
	rcc_softkey_event_msg_t	rcc_softkey_event_msg;
} RCC_req_data;

typedef struct rcc_int_t_ {
    RCC_req_data rcc_int;
    // User added fields
    xml_unsigned8 iterations;
    cc_lineid_t line;
    cc_callid_t gsm_id;
    cc_callid_t consult_gsm_id;
    cc_callid_t join_gsm_id;
    rcc_request_type_t rcc_request_type;
} RCC_data;


// Data for event generation
typedef struct ccsip_event_data_t_ {
    struct ccsip_event_data_t_ *next;
    ccsip_event_data_type_e type;
    union {
        KPMLResponse   kpml_response;
        KPMLRequest    kpml_request;
        RCC_data       remotecc_data;
        rcc_response_t remotecc_data_response;
        Options_ind_t  options_ind;
        Presence_ext_t presence_rpid;
        raw_data_t     raw_data; // used for cmxml and other body types
        ConfigApp_req_data_t configapp_data;
        media_control_ext_t  media_control_data;
    } u;
} ccsip_event_data_t;


/**
 * Request to allocate memory for external xml parser
 * @param [in] size ofrequested memory
 * @return pointer to memory allocated.
 */
void *ccAllocXML(cc_size_t size);

/**
 * Free xml memory
 * @param [in] mem - memory to free
 * @return void
 */
void ccFreeXML(void *mem);
#endif