freeswitch/libs/sipcc/core/gsm/subapi.c

270 lines
7.4 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 "cpr_stdio.h"
#include "cpr_string.h"
#include "cpr_memory.h"
#include "cpr_stdlib.h"
#include "ccapi.h"
#include "ccsip_task.h"
#include "debug.h"
#include "phone_debug.h"
#include "phntask.h"
#include "phone.h"
#include "text_strings.h"
#include "string_lib.h"
#include "gsm.h"
#include "vcm.h"
#include "subapi.h"
#include "misc_apps_task.h"
static void
sub_print_msg (char *pData, int len)
{
int ix;
int msg_id = *((int *)pData);
buginf("\nCCAPI: cc_msg= %s, 0x=", cc_msg_name((cc_msgs_t)msg_id));
for (ix = 0; ix < len; ix++) {
if ((ix % 8 == 0) && ix) {
buginf(" ");
}
if (ix % 24 == 0) {
buginf("\n");
}
buginf("%02x ", *pData++);
}
buginf("\n");
}
cc_rcs_t
sub_send_msg (cprBuffer_t buf, uint32_t cmd, uint16_t len, cc_srcs_t dst_id)
{
cpr_status_e rc;
CC_DEBUG_MSG sub_print_msg((char *)buf, len);
switch (dst_id) {
case CC_SRC_GSM:
rc = gsm_send_msg(cmd, buf, len);
if (rc == CPR_FAILURE) {
cpr_free(buf);
}
break;
case CC_SRC_SIP:
rc = SIPTaskSendMsg(cmd, buf, len, NULL);
if (rc == CPR_FAILURE) {
cpr_free(buf);
}
break;
case CC_SRC_MISC_APP:
rc = MiscAppTaskSendMsg(cmd, buf, len);
if (rc == CPR_FAILURE) {
cpr_free(buf);
}
break;
default:
rc = CPR_FAILURE;
break;
}
return (rc == CPR_SUCCESS) ? CC_RC_SUCCESS : CC_RC_ERROR;
}
cc_rcs_t
sub_int_subnot_register (cc_srcs_t src_id, cc_srcs_t dst_id,
cc_subscriptions_t evt_pkg, void *callback_fun,
cc_srcs_t dest_task, int msg_id, void *term_callback,
int term_msg_id, long min_duration, long max_duration)
{
sipspi_msg_t *pmsg;
pmsg = (sipspi_msg_t *) cc_get_msg_buf(sizeof(*pmsg));
if (!pmsg) {
return CC_RC_ERROR;
}
pmsg->msg.subs_reg.eventPackage = evt_pkg;
pmsg->msg.subs_reg.max_duration = max_duration;
pmsg->msg.subs_reg.min_duration = min_duration;
pmsg->msg.subs_reg.subsIndCallback = (ccsipSubsIndCallbackFn_t)
callback_fun;
pmsg->msg.subs_reg.subsIndCallbackMsgID = msg_id;
pmsg->msg.subs_reg.subsIndCallbackTask = dest_task;
pmsg->msg.subs_reg.subsTermCallback = (ccsipSubsTerminateCallbackFn_t)
term_callback;
pmsg->msg.subs_reg.subsTermCallbackMsgID = term_msg_id;
return sub_send_msg((cprBuffer_t)pmsg, SIPSPI_EV_CC_SUBSCRIBE_REGISTER,
sizeof(*pmsg), dst_id);
}
/*
* Function: sub_int_subscribe()
*
* Parameters: msg_p - pointer to sipspi_msg_t (input parameter)
*
* Description: posts SIPSPI_EV_CC_SUBSCRIBE to SIP task message queue.
*
* Returns: CC_RC_ERROR - failed to post msg.
* CC_RC_SUCCESS - successful posted msg.
*/
cc_rcs_t
sub_int_subscribe (sipspi_msg_t *msg_p)
{
sipspi_msg_t *pmsg;
pmsg = (sipspi_msg_t *) cc_get_msg_buf(sizeof(*pmsg));
if (!pmsg) {
return CC_RC_ERROR;
}
memcpy(pmsg, msg_p, sizeof(sipspi_msg_t));
return sub_send_msg((cprBuffer_t)pmsg, SIPSPI_EV_CC_SUBSCRIBE,
sizeof(*pmsg), CC_SRC_SIP);
}
cc_rcs_t
sub_int_subscribe_ack (cc_srcs_t src_id, cc_srcs_t dst_id, sub_id_t sub_id,
uint16_t response_code, int duration)
{
sipspi_msg_t *pmsg;
pmsg = (sipspi_msg_t *) cc_get_msg_buf(sizeof(*pmsg));
if (!pmsg) {
return CC_RC_ERROR;
}
pmsg->msg.subscribe_resp.response_code = response_code;
pmsg->msg.subscribe_resp.sub_id = sub_id;
pmsg->msg.subscribe_resp.duration = duration;
return sub_send_msg((cprBuffer_t)pmsg, SIPSPI_EV_CC_SUBSCRIBE_RESPONSE,
sizeof(*pmsg), dst_id);
}
cc_rcs_t
sub_int_notify (cc_srcs_t src_id, cc_srcs_t dst_id, sub_id_t sub_id,
ccsipNotifyResultCallbackFn_t notifyResultCallback,
int subsNotResCallbackMsgID, ccsip_event_data_t * eventData,
subscriptionState subState)
{
sipspi_msg_t *pmsg;
pmsg = (sipspi_msg_t *) cc_get_msg_buf(sizeof(*pmsg));
if (!pmsg) {
return CC_RC_ERROR;
}
pmsg->msg.notify.eventData = eventData;
pmsg->msg.notify.notifyResultCallback = notifyResultCallback;
pmsg->msg.notify.sub_id = sub_id;
pmsg->msg.notify.subsNotResCallbackMsgID = subsNotResCallbackMsgID;
pmsg->msg.notify.subState = subState;
return sub_send_msg((cprBuffer_t) pmsg, SIPSPI_EV_CC_NOTIFY,
sizeof(*pmsg), dst_id);
}
/*
* Function: sub_int_notify_ack()
*
* Parameters: sub_id - subcription id for sip stack to track the subscription.
* response_code - response code to be sent in response to NOTIFY.
* cseq : CSeq for which response is being sent.
*
* Description: posts SIPSPI_EV_CC_NOTIFY_RESPONSE to SIP task message queue.
*
* Returns: CC_RC_ERROR - failed to post msg.
* CC_RC_SUCCESS - successful posted msg.
*/
cc_rcs_t
sub_int_notify_ack (sub_id_t sub_id, uint16_t response_code, uint32_t cseq)
{
sipspi_msg_t *pmsg;
pmsg = (sipspi_msg_t *) cc_get_msg_buf(sizeof(*pmsg));
if (!pmsg) {
return CC_RC_ERROR;
}
pmsg->msg.notify_resp.sub_id = sub_id;
pmsg->msg.notify_resp.response_code = response_code;
pmsg->msg.notify_resp.cseq = cseq;
return sub_send_msg((cprBuffer_t)pmsg, SIPSPI_EV_CC_NOTIFY_RESPONSE,
sizeof(*pmsg), CC_SRC_SIP);
}
/*
* Function: sub_int_subscribe_term()
*
* Parameters: sub_id - subcription id for sip stack to track the subscription.
* immediate - boolean flag to indicate if the termination be immediate.
* request_id - request id significant for out going subscriptions
* event_package - event package type
*
* Description: posts SIPSPI_EV_CC_SUBSCRIPTION_TERMINATED to SIP task message queue.
*
* Returns: CC_RC_ERROR - failed to post msg.
* CC_RC_SUCCESS - successful posted msg.
*/
cc_rcs_t
sub_int_subscribe_term (sub_id_t sub_id, boolean immediate, int request_id,
cc_subscriptions_t event_package)
{
sipspi_msg_t *pmsg;
pmsg = (sipspi_msg_t *) cc_get_msg_buf(sizeof(*pmsg));
if (!pmsg) {
return CC_RC_ERROR;
}
pmsg->msg.subs_term.immediate = immediate;
pmsg->msg.subs_term.sub_id = sub_id;
pmsg->msg.subs_term.request_id = request_id;
pmsg->msg.subs_term.eventPackage = event_package;
return sub_send_msg((cprBuffer_t)pmsg, SIPSPI_EV_CC_SUBSCRIPTION_TERMINATED,
sizeof(*pmsg), CC_SRC_SIP);
}
cc_rcs_t
sip_send_message (ccsip_sub_not_data_t * msg_data, cc_srcs_t dest_id, int msg_id)
{
ccsip_sub_not_data_t *pmsg;
pmsg = (ccsip_sub_not_data_t *) cc_get_msg_buf(sizeof(*pmsg));
if (!pmsg) {
return CC_RC_ERROR;
}
memcpy(pmsg, msg_data, sizeof(*pmsg));
return sub_send_msg((cprBuffer_t)pmsg, msg_id, sizeof(*pmsg), dest_id);
}
cc_rcs_t
app_send_message (void *msg_data, int msg_len, cc_srcs_t dest_id, int msg_id)
{
void *pmsg;
pmsg = (void *) cc_get_msg_buf(msg_len);
if (!pmsg) {
return CC_RC_ERROR;
}
memcpy(pmsg, msg_data, msg_len);
return sub_send_msg((cprBuffer_t)pmsg, msg_id, (uint16_t)msg_len, dest_id);
}