freetdm: fix OPENZAP-125 (Add basic calling party category support into ftmod_r2) (Patched by ric)
This commit is contained in:
parent
668763f490
commit
d349290f7b
|
@ -1278,6 +1278,10 @@ static switch_call_cause_t channel_outgoing_channel(switch_core_session_t *sessi
|
||||||
caller_data.dnis.type = outbound_profile->destination_number_ton;
|
caller_data.dnis.type = outbound_profile->destination_number_ton;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ((var = channel_get_variable(session, var_event, "freetdm_calling_party_category"))) {
|
||||||
|
ftdm_set_calling_party_category(var, (uint8_t *)&caller_data.cpc);
|
||||||
|
}
|
||||||
|
|
||||||
if ((var = channel_get_variable(session, var_event, "freetdm_custom_call_data"))) {
|
if ((var = channel_get_variable(session, var_event, "freetdm_custom_call_data"))) {
|
||||||
ftdm_set_string(caller_data.raw_data, var);
|
ftdm_set_string(caller_data.raw_data, var);
|
||||||
caller_data.raw_data_len = (uint32_t)strlen(var);
|
caller_data.raw_data_len = (uint32_t)strlen(var);
|
||||||
|
|
|
@ -30,6 +30,12 @@
|
||||||
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
* Contributors:
|
||||||
|
*
|
||||||
|
* Moises Silva <moy@sangoma.com>
|
||||||
|
* Ricardo Barroetaveña <rbarroetavena@anura.com.ar>
|
||||||
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "private/ftdm_core.h"
|
#include "private/ftdm_core.h"
|
||||||
|
@ -144,3 +150,20 @@ FT_DECLARE(ftdm_status_t) ftdm_is_number(const char *number)
|
||||||
return FTDM_SUCCESS;
|
return FTDM_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
FT_DECLARE(ftdm_status_t) ftdm_set_calling_party_category(const char *string, uint8_t *target)
|
||||||
|
{
|
||||||
|
uint8_t val;
|
||||||
|
ftdm_status_t status = FTDM_SUCCESS;
|
||||||
|
|
||||||
|
val = ftdm_str2ftdm_calling_party_category(string);
|
||||||
|
if (val == FTDM_CPC_INVALID) {
|
||||||
|
ftdm_log(FTDM_LOG_WARNING, "Invalid category string (%s)\n", string);
|
||||||
|
val = FTDM_CPC_ORDINARY;
|
||||||
|
status = FTDM_FAIL;
|
||||||
|
}
|
||||||
|
|
||||||
|
*target = val;
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -301,6 +301,9 @@ FTDM_STR2ENUM(ftdm_str2ftdm_bearer_cap, ftdm_bearer_cap2str, ftdm_bearer_cap_t,
|
||||||
FTDM_ENUM_NAMES(USER_LAYER1_PROT_NAMES, USER_LAYER1_PROT_STRINGS)
|
FTDM_ENUM_NAMES(USER_LAYER1_PROT_NAMES, USER_LAYER1_PROT_STRINGS)
|
||||||
FTDM_STR2ENUM(ftdm_str2ftdm_usr_layer1_prot, ftdm_user_layer1_prot2str, ftdm_user_layer1_prot_t, USER_LAYER1_PROT_NAMES, FTDM_USER_LAYER1_PROT_INVALID)
|
FTDM_STR2ENUM(ftdm_str2ftdm_usr_layer1_prot, ftdm_user_layer1_prot2str, ftdm_user_layer1_prot_t, USER_LAYER1_PROT_NAMES, FTDM_USER_LAYER1_PROT_INVALID)
|
||||||
|
|
||||||
|
FTDM_ENUM_NAMES(CALLING_PARTY_CATEGORY_NAMES, CALLING_PARTY_CATEGORY_STRINGS)
|
||||||
|
FTDM_STR2ENUM(ftdm_str2ftdm_calling_party_category, ftdm_calling_party_category2str, ftdm_calling_party_category_t, CALLING_PARTY_CATEGORY_NAMES, FTDM_CPC_INVALID)
|
||||||
|
|
||||||
static ftdm_status_t ftdm_group_add_channels(ftdm_span_t* span, int currindex, const char* name);
|
static ftdm_status_t ftdm_group_add_channels(ftdm_span_t* span, int currindex, const char* name);
|
||||||
|
|
||||||
static const char *cut_path(const char *in)
|
static const char *cut_path(const char *in)
|
||||||
|
|
|
@ -380,11 +380,72 @@ static void ft_r2_answer_call(ftdm_channel_t *ftdmchan)
|
||||||
R2CALL(ftdmchan)->answer_pending = 0;
|
R2CALL(ftdmchan)->answer_pending = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static __inline__ ftdm_calling_party_category_t ftdm_openr2_cpc_to_r2_ftdm_cpc(openr2_calling_party_category_t cpc)
|
||||||
|
{
|
||||||
|
switch (cpc) {
|
||||||
|
case OR2_CALLING_PARTY_CATEGORY_UNKNOWN:
|
||||||
|
return FTDM_CPC_UNKNOWN;
|
||||||
|
|
||||||
|
case OR2_CALLING_PARTY_CATEGORY_NATIONAL_SUBSCRIBER:
|
||||||
|
return FTDM_CPC_ORDINARY;
|
||||||
|
|
||||||
|
case OR2_CALLING_PARTY_CATEGORY_NATIONAL_PRIORITY_SUBSCRIBER:
|
||||||
|
return FTDM_CPC_PRIORITY;
|
||||||
|
|
||||||
|
case OR2_CALLING_PARTY_CATEGORY_INTERNATIONAL_SUBSCRIBER:
|
||||||
|
return FTDM_CPC_UNKNOWN;
|
||||||
|
|
||||||
|
case OR2_CALLING_PARTY_CATEGORY_INTERNATIONAL_PRIORITY_SUBSCRIBER:
|
||||||
|
return FTDM_CPC_UNKNOWN;
|
||||||
|
|
||||||
|
case OR2_CALLING_PARTY_CATEGORY_TEST_EQUIPMENT:
|
||||||
|
return FTDM_CPC_TEST;
|
||||||
|
|
||||||
|
case OR2_CALLING_PARTY_CATEGORY_PAY_PHONE:
|
||||||
|
return FTDM_CPC_PAYPHONE;
|
||||||
|
|
||||||
|
case OR2_CALLING_PARTY_CATEGORY_COLLECT_CALL:
|
||||||
|
return FTDM_CPC_OPERATOR;
|
||||||
|
}
|
||||||
|
return FTDM_CPC_INVALID;
|
||||||
|
}
|
||||||
|
|
||||||
|
static __inline openr2_calling_party_category_t ftdm_r2_ftdm_cpc_to_openr2_cpc(ftdm_calling_party_category_t cpc)
|
||||||
|
{
|
||||||
|
switch (cpc) {
|
||||||
|
case FTDM_CPC_UNKNOWN:
|
||||||
|
return OR2_CALLING_PARTY_CATEGORY_UNKNOWN;
|
||||||
|
|
||||||
|
case FTDM_CPC_OPERATOR:
|
||||||
|
return OR2_CALLING_PARTY_CATEGORY_COLLECT_CALL;
|
||||||
|
|
||||||
|
case FTDM_CPC_ORDINARY:
|
||||||
|
return OR2_CALLING_PARTY_CATEGORY_NATIONAL_SUBSCRIBER;
|
||||||
|
|
||||||
|
case FTDM_CPC_PRIORITY:
|
||||||
|
return OR2_CALLING_PARTY_CATEGORY_NATIONAL_PRIORITY_SUBSCRIBER;
|
||||||
|
|
||||||
|
case FTDM_CPC_DATA:
|
||||||
|
return OR2_CALLING_PARTY_CATEGORY_UNKNOWN;
|
||||||
|
|
||||||
|
case FTDM_CPC_TEST:
|
||||||
|
return OR2_CALLING_PARTY_CATEGORY_TEST_EQUIPMENT;
|
||||||
|
|
||||||
|
case FTDM_CPC_PAYPHONE:
|
||||||
|
return OR2_CALLING_PARTY_CATEGORY_PAY_PHONE;
|
||||||
|
|
||||||
|
case FTDM_CPC_INVALID:
|
||||||
|
return OR2_CALLING_PARTY_CATEGORY_UNKNOWN;
|
||||||
|
}
|
||||||
|
return OR2_CALLING_PARTY_CATEGORY_UNKNOWN;
|
||||||
|
}
|
||||||
|
|
||||||
/* this function must be called with the chan mutex held! */
|
/* this function must be called with the chan mutex held! */
|
||||||
static FIO_CHANNEL_OUTGOING_CALL_FUNCTION(r2_outgoing_call)
|
static FIO_CHANNEL_OUTGOING_CALL_FUNCTION(r2_outgoing_call)
|
||||||
{
|
{
|
||||||
openr2_call_status_t callstatus;
|
openr2_call_status_t callstatus;
|
||||||
ftdm_r2_data_t *r2data;
|
ftdm_r2_data_t *r2data;
|
||||||
|
openr2_calling_party_category_t category = OR2_CALLING_PARTY_CATEGORY_NATIONAL_SUBSCRIBER;
|
||||||
|
|
||||||
r2data = ftdmchan->span->signal_data;
|
r2data = ftdmchan->span->signal_data;
|
||||||
|
|
||||||
|
@ -397,6 +458,12 @@ static FIO_CHANNEL_OUTGOING_CALL_FUNCTION(r2_outgoing_call)
|
||||||
|
|
||||||
ft_r2_clean_call(ftdmchan->call_data);
|
ft_r2_clean_call(ftdmchan->call_data);
|
||||||
|
|
||||||
|
if (ftdmchan->caller_data.cpc == FTDM_CPC_INVALID || ftdmchan->caller_data.cpc == FTDM_CPC_UNKNOWN) {
|
||||||
|
category = r2data->category;
|
||||||
|
} else {
|
||||||
|
category = ftdm_r2_ftdm_cpc_to_openr2_cpc(ftdmchan->caller_data.cpc);
|
||||||
|
}
|
||||||
|
|
||||||
/* start io dump */
|
/* start io dump */
|
||||||
if (r2data->mf_dump_size) {
|
if (r2data->mf_dump_size) {
|
||||||
ftdm_channel_command(ftdmchan, FTDM_COMMAND_ENABLE_INPUT_DUMP, &r2data->mf_dump_size);
|
ftdm_channel_command(ftdmchan, FTDM_COMMAND_ENABLE_INPUT_DUMP, &r2data->mf_dump_size);
|
||||||
|
@ -406,7 +473,7 @@ static FIO_CHANNEL_OUTGOING_CALL_FUNCTION(r2_outgoing_call)
|
||||||
callstatus = openr2_chan_make_call(R2CALL(ftdmchan)->r2chan,
|
callstatus = openr2_chan_make_call(R2CALL(ftdmchan)->r2chan,
|
||||||
ftdmchan->caller_data.cid_num.digits,
|
ftdmchan->caller_data.cid_num.digits,
|
||||||
ftdmchan->caller_data.dnis.digits,
|
ftdmchan->caller_data.dnis.digits,
|
||||||
r2data->category);
|
category);
|
||||||
|
|
||||||
if (callstatus) {
|
if (callstatus) {
|
||||||
ftdm_log_chan_msg(ftdmchan, FTDM_LOG_CRIT, "Failed to make call in R2 channel, openr2_chan_make_call failed\n");
|
ftdm_log_chan_msg(ftdmchan, FTDM_LOG_CRIT, "Failed to make call in R2 channel, openr2_chan_make_call failed\n");
|
||||||
|
@ -615,6 +682,7 @@ static void ftdm_r2_on_call_offered(openr2_chan_t *r2chan, const char *ani, cons
|
||||||
} else {
|
} else {
|
||||||
ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_RING);
|
ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_RING);
|
||||||
}
|
}
|
||||||
|
ftdmchan->caller_data.cpc = ftdm_openr2_cpc_to_r2_ftdm_cpc(category);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -265,6 +265,21 @@ typedef enum {
|
||||||
#define USER_LAYER1_PROT_STRINGS "V.110", "u-law", "a-law", "Invalid"
|
#define USER_LAYER1_PROT_STRINGS "V.110", "u-law", "a-law", "Invalid"
|
||||||
FTDM_STR2ENUM_P(ftdm_str2ftdm_usr_layer1_prot, ftdm_user_layer1_prot2str, ftdm_user_layer1_prot_t)
|
FTDM_STR2ENUM_P(ftdm_str2ftdm_usr_layer1_prot, ftdm_user_layer1_prot2str, ftdm_user_layer1_prot_t)
|
||||||
|
|
||||||
|
/*! Calling Party Category */
|
||||||
|
typedef enum {
|
||||||
|
FTDM_CPC_UNKNOWN,
|
||||||
|
FTDM_CPC_OPERATOR,
|
||||||
|
FTDM_CPC_ORDINARY,
|
||||||
|
FTDM_CPC_PRIORITY,
|
||||||
|
FTDM_CPC_DATA,
|
||||||
|
FTDM_CPC_TEST,
|
||||||
|
FTDM_CPC_PAYPHONE,
|
||||||
|
FTDM_CPC_INVALID
|
||||||
|
} ftdm_calling_party_category_t;
|
||||||
|
#define CALLING_PARTY_CATEGORY_STRINGS "unknown", "operator", "ordinary", "priority", "data-call", "test-call", "payphone", "invalid"
|
||||||
|
FTDM_STR2ENUM_P(ftdm_str2ftdm_calling_party_category, ftdm_calling_party_category2str, ftdm_calling_party_category_t)
|
||||||
|
|
||||||
|
|
||||||
/*! \brief Number abstraction */
|
/*! \brief Number abstraction */
|
||||||
typedef struct {
|
typedef struct {
|
||||||
char digits[25];
|
char digits[25];
|
||||||
|
@ -294,7 +309,8 @@ typedef struct ftdm_caller_data {
|
||||||
ftdm_bearer_cap_t bearer_capability;
|
ftdm_bearer_cap_t bearer_capability;
|
||||||
/* user information layer 1 protocol */
|
/* user information layer 1 protocol */
|
||||||
ftdm_user_layer1_prot_t bearer_layer1;
|
ftdm_user_layer1_prot_t bearer_layer1;
|
||||||
ftdm_variable_container_t variables; /*!<variables attached to this call */
|
ftdm_calling_party_category_t cpc; /*!< Calling party category */
|
||||||
|
ftdm_variable_container_t variables; /*!< Variables attached to this call */
|
||||||
/* We need call_id inside caller_data for the user to be able to retrieve
|
/* We need call_id inside caller_data for the user to be able to retrieve
|
||||||
* the call_id when ftdm_channel_call_place is called. This is the only time
|
* the call_id when ftdm_channel_call_place is called. This is the only time
|
||||||
* that the user can use caller_data.call_id to obtain the call_id. The user
|
* that the user can use caller_data.call_id to obtain the call_id. The user
|
||||||
|
|
|
@ -30,6 +30,12 @@
|
||||||
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
* Contributors:
|
||||||
|
*
|
||||||
|
* Moises Silva <moy@sangoma.com>
|
||||||
|
* Ricardo Barroetaveña <rbarroetavena@anura.com.ar>
|
||||||
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef __FTDM_CALL_UTILS_H__
|
#ifndef __FTDM_CALL_UTILS_H__
|
||||||
|
@ -114,5 +120,16 @@ FT_DECLARE(ftdm_status_t) ftdm_set_presentation_ind(const char *string, uint8_t
|
||||||
*/
|
*/
|
||||||
FT_DECLARE(ftdm_status_t) ftdm_is_number(const char *number);
|
FT_DECLARE(ftdm_status_t) ftdm_is_number(const char *number);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* \brief Set the Calling Party Category from an enum
|
||||||
|
*
|
||||||
|
* \param cpc_string string value
|
||||||
|
* \param target the target to set value to
|
||||||
|
*
|
||||||
|
* \retval FTDM_SUCCESS success
|
||||||
|
* \retval FTDM_FAIL failure
|
||||||
|
*/
|
||||||
|
FT_DECLARE(ftdm_status_t) ftdm_set_calling_party_category(const char *string, uint8_t *target);
|
||||||
|
|
||||||
#endif /* __FTDM_CALL_UTILS_H__ */
|
#endif /* __FTDM_CALL_UTILS_H__ */
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue