Files
freeswitch/libs/sipcc/core/sipstack/ccsip_cc.c
T

306 lines
10 KiB
C
Executable File

/* 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/. */
#include "cpr_types.h"
#include "ccapi.h"
#include "string_lib.h"
#include "ccsip_pmh.h"
#include "ccsip_messaging.h"
/*
* Function: sip_cc_mv_msg_body_to_cc_msg
*
* Parameters: cc_msg - pointer to cc_msgbody_info structure to
* move the content from the SIP body msg. to.
* sip_msg - pointer to sipMessage_t structure of the source
* body.
*
* Description: This routine moves the body parts from sipMessage_t to
* CCAPI body msg. Once the content is moved,
* the all pointers from the sipMessage_t structure,
* will be NULL so that they are not own by SIP stack.
* The destination of the msg. needs to free the
* memory for of the parts.
*
* Returns: N/A
*
*/
void sip_cc_mv_msg_body_to_cc_msg (cc_msgbody_info_t *cc_msg,
sipMessage_t *sip_msg)
{
int i;
uint32_t num_parts = 0;
cc_msgbody_t *part;
if (cc_msg == NULL) {
/* destination to move msg. to */
return;
}
if (sip_msg == NULL) {
/* No SIP message to move from, set number of part to zero */
cc_msg->num_parts = 0;
return;
}
part = &cc_msg->parts[0];
for (i = 0; (i < sip_msg->num_body_parts) &&
(i < CC_MAX_BODY_PARTS); i++) {
if ((sip_msg->mesg_body[i].msgBody != NULL) &&
(sip_msg->mesg_body[i].msgLength)) {
/* Body */
part->body = sip_msg->mesg_body[i].msgBody;
part->body_length = sip_msg->mesg_body[i].msgLength;
sip_msg->mesg_body[i].msgBody = NULL;
/* Content type */
part->content_type =
sip2cctype(sip_msg->mesg_body[i].msgContentTypeValue);
/* Disposition */
part->content_disposition.disposition =
sip2ccdisp(sip_msg->mesg_body[i].msgContentDisp);
part->content_disposition.required_handling =
sip_msg->mesg_body[i].msgRequiredHandling;
/* Content ID */
part->content_id = sip_msg->mesg_body[i].msgContentId;
sip_msg->mesg_body[i].msgContentId = NULL;
/* Next part */
part++;
num_parts++;
}
}
/* Set the number of parts */
cc_msg->num_parts = num_parts;
}
/*
* Function: sip_cc_create_cc_msg_body_from_sip_msg
*
* Parameters: cc_msg - pointer to cc_msgbody_info structure to
* store the content of the SIP body msg.
* sip_msg - pointer to sipMessage_t structure of the source
* body.
*
* Description: This routine creates the cc_msgbody_info_t content
* from the SIP message. The original msg. body in the
* SIP message remains in the SIP message.
*
* Returns: TRUE - success
* FALSE - fail.
*
*/
boolean sip_cc_create_cc_msg_body_from_sip_msg (cc_msgbody_info_t *cc_msg,
sipMessage_t *sip_msg)
{
int i, len;
uint32_t num_parts = 0;
cc_msgbody_t *part;
boolean status = TRUE;
if (cc_msg == NULL) {
/* destination to move msg. to */
return (FALSE);
}
if (sip_msg == NULL) {
/* No SIP message to move from, set number of part to zero */
cc_msg->num_parts = 0;
return (FALSE);
}
memset(cc_msg, 0, sizeof(cc_msgbody_info_t));
part = &cc_msg->parts[0];
for (i = 0; (i < sip_msg->num_body_parts) &&
(i < CC_MAX_BODY_PARTS) ; i++) {
if ((sip_msg->mesg_body[i].msgBody != NULL) &&
(sip_msg->mesg_body[i].msgLength)) {
/* Body */
part->body = (char *) cpr_malloc(sip_msg->mesg_body[i].msgLength);
if (part->body != NULL) {
part->body_length = sip_msg->mesg_body[i].msgLength;
memcpy(part->body,
sip_msg->mesg_body[i].msgBody,
sip_msg->mesg_body[i].msgLength);
} else {
/* Unable to allocate memory for msg. body */
status = FALSE;
break;
}
/* Content type */
part->content_type =
sip2cctype(sip_msg->mesg_body[i].msgContentTypeValue);
/* Disposition */
part->content_disposition.disposition =
sip2ccdisp(sip_msg->mesg_body[i].msgContentDisp);
part->content_disposition.required_handling =
sip_msg->mesg_body[i].msgRequiredHandling;
/* Content ID */
if (sip_msg->mesg_body[i].msgContentId != NULL) {
/* Get length of the msgContentID with NULL */
len = strlen(sip_msg->mesg_body[i].msgContentId) + 1;
part->content_id = (char *) cpr_malloc(len);
if (part->content_id != NULL) {
memcpy(part->content_id,
sip_msg->mesg_body[i].msgContentId,
len);
} else {
/* Unable to allocate allocate memory for content ID */
status = FALSE;
break;
}
} else {
/* No content ID */
part->content_id = NULL;
}
/* Next part */
part++;
num_parts++;
}
}
/* Set the number of parts */
cc_msg->num_parts = num_parts;
if (!status) {
/*
* Faied for some reason, free the resources that mighe be
* created before failure
*/
cc_free_msg_body_parts(cc_msg);
}
return (status);
}
void sip_cc_setup (callid_t call_id, line_t line,
string_t calling_name, string_t calling_number, string_t alt_calling_number,
boolean display_calling_number,
string_t called_name, string_t called_number,
boolean display_called_number,
string_t orig_called_name, string_t orig_called_number,
string_t last_redirect_name, string_t last_redirect_number,
cc_call_type_e call_type,
cc_alerting_type alert_info,
vcm_ring_mode_t alerting_ring,
vcm_tones_t alerting_tone, cc_call_info_t *call_info_p,
boolean replaces, string_t recv_info_list, sipMessage_t *sip_msg)
{
cc_caller_id_t caller_id;
cc_msgbody_info_t cc_body_info;
caller_id.calling_name = calling_name;
caller_id.calling_number = calling_number;
caller_id.alt_calling_number = alt_calling_number;
caller_id.display_calling_number = display_calling_number;
caller_id.called_name = called_name;
caller_id.called_number = called_number;
caller_id.display_called_number = display_called_number;
caller_id.last_redirect_name = last_redirect_name;
caller_id.last_redirect_number = last_redirect_number;
caller_id.orig_called_name = orig_called_name;
caller_id.orig_called_number = orig_called_number;
caller_id.orig_rpid_number = strlib_empty();
caller_id.call_type = call_type;
/* Move the SIP body parts to the CCAPI msg. body information block */
sip_cc_mv_msg_body_to_cc_msg(&cc_body_info, sip_msg);
// Check with CraigB
cc_setup(CC_SRC_SIP, call_id, line, &caller_id, alert_info,
alerting_ring, alerting_tone, NULL, call_info_p, replaces,
recv_info_list, &cc_body_info);
}
#ifdef REMOVED_UNUSED_FUNCTION
void sip_cc_setup_ack (callid_t call_id, line_t line,
cc_msgbody_info_t *msg_body)
{
cc_setup_ack(CC_SRC_SIP, call_id, line, NULL, msg_body);
}
#endif
void sip_cc_proceeding (callid_t call_id, line_t line)
{
cc_proceeding(CC_SRC_SIP, call_id, line, NULL);
}
void sip_cc_alerting (callid_t call_id, line_t line,
sipMessage_t *sip_msg, int inband)
{
cc_msgbody_info_t cc_body_info;
/* Move the SIP body parts to the CCAPI msg. body information block */
sip_cc_mv_msg_body_to_cc_msg(&cc_body_info, sip_msg);
cc_alerting(CC_SRC_SIP, call_id, line, NULL, &cc_body_info,
(boolean)inband);
}
void sip_cc_connected (callid_t call_id, line_t line, string_t recv_info_list, sipMessage_t *sip_msg)
{
cc_msgbody_info_t cc_body_info;
/* Move the SIP body parts to the CCAPI msg. body information block */
sip_cc_mv_msg_body_to_cc_msg(&cc_body_info, sip_msg);
cc_connected(CC_SRC_SIP, call_id, line, NULL, recv_info_list, &cc_body_info);
}
void sip_cc_connected_ack (callid_t call_id, line_t line,
sipMessage_t *sip_msg)
{
cc_msgbody_info_t cc_body_info;
/* Move the SIP body parts to the CCAPI msg. body information block */
sip_cc_mv_msg_body_to_cc_msg(&cc_body_info, sip_msg);
cc_connected_ack(CC_SRC_SIP, call_id, line, NULL, &cc_body_info);
}
void sip_cc_release (callid_t call_id, line_t line, cc_causes_t cause,
const char *dialstring)
{
cc_release(CC_SRC_SIP, call_id, line, cause, dialstring, NULL);
}
void sip_cc_release_complete (callid_t call_id, line_t line, cc_causes_t cause)
{
cc_release_complete(CC_SRC_SIP, call_id, line, cause, NULL);
}
void sip_cc_feature (callid_t call_id, line_t line, cc_features_t feature, void *data)
{
cc_feature(CC_SRC_SIP, call_id, line, feature, (cc_feature_data_t *)data);
}
void sip_cc_feature_ack (callid_t call_id, line_t line, cc_features_t feature,
void *data, cc_causes_t cause)
{
cc_feature_ack(CC_SRC_SIP, call_id, line, feature, (cc_feature_data_t *)data, cause);
}
void sip_cc_mwi (callid_t call_id, line_t line, boolean on, int type,
int newCount, int oldCount, int hpNewCount, int hpOldCount)
{
cc_mwi(CC_SRC_SIP, call_id, line, on, type, newCount, oldCount, hpNewCount, hpOldCount);
}
void sip_cc_options (callid_t call_id, line_t line, sipMessage_t *pSipMessage)
{
cc_options_sdp_req(CC_SRC_SIP, call_id, line, pSipMessage);
}
void sip_cc_audit (callid_t call_id, line_t line, boolean apply_ringout)
{
cc_audit_sdp_req(CC_SRC_SIP, call_id, line, apply_ringout);
}