/* $Id$
 *
 * Copyright (C) 2006-2007 VozTelecom Sistemas S.L
 *
 * This file is part of Kamailio, a free SIP server.
 *
 * Kamailio is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version
 *
 * Kamailio is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
 */


#include "seas.h" /*as_p*/

#define REPLY_PROV 1
#define REPLY_FIN 2
#define REPLY_FIN_DLG 3
#define UAC_REQ 4
#define AC_RES_FAIL 5
#define SL_MSG 6
#define AC_CANCEL 7
#define JAIN_PONG 8


#define AC_FAIL_UNKNOWN 0x01

#define FAKED_REPLY_FLAG 0x02

struct as_uac_param
{
	struct as_entry *who;
	int uac_id;
	unsigned int label;
	char processor_id;
	char destroy_cb_set;
	struct cell *inviteT;
};


/**
 * ACTION processing functions
 */
int ac_reply(as_p the_as, unsigned char processor_id, unsigned int flags,
		char *action, int len);
int ac_sl_msg(as_p the_as, unsigned char processor_id, unsigned int flags,
		char *action, int len);
int ac_uac_req(as_p the_as, unsigned char processor_id, unsigned int flags,
		char *action, int len);
int ac_encode_msg(as_p the_as, unsigned char processor_id, unsigned int flags,
		char *action, int len);
int ac_cancel(as_p the_as, unsigned char processor_id, unsigned int flags,
		char *action, int len);

/**
 * Utility functions
 */
int forward_sl_request(struct sip_msg *msg, str *uri, int proto);
int extract_allowed_headers(struct sip_msg *my_msg, int allow_vias,
		int allow_Rroutes, hdr_flags_t forbidden_hdrs, char *headers,
		int headers_len);

/**
 * Action Dispatcher process functions
 */
int dispatch_actions(void);
int process_action(as_p my_as);

/**
 * Callback Functions
 */
void uac_cb(struct cell *t, int type, struct tmcb_params *);
void uac_cleanup_cb(struct cell *t, int type, struct tmcb_params *);

/**
 * Event creating functions
 */
int as_action_fail_resp(int uac_id, int sip_error, char *err_buf, int err_len);
char *create_as_action_reply(struct cell *c, struct tmcb_params *params,
		int uac_id, char processor_id, int *evt_len);
