mirror of
https://github.com/signalwire/freeswitch.git
synced 2026-10-17 08:44:13 +00:00
306 lines
10 KiB
C
Executable File
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);
|
|
}
|