Skip to content
项目
群组
代码片段
帮助
正在加载...
登录
切换导航
F
freeswitch
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
分枝图
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
分枝图
统计图
创建新议题
作业
提交
议题看板
打开侧边栏
张华
freeswitch
Commits
49ac70de
提交
49ac70de
authored
2月 25, 2011
作者:
David Yat Sin
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
freetdm: User variables now stored in ftdm_usrmsg_t
上级
7860db01
全部展开
隐藏空白字符变更
内嵌
并排
正在显示
16 个修改的文件
包含
398 行增加
和
283 行删除
+398
-283
variables.txt
libs/freetdm/docs/variables.txt
+49
-63
mod_freetdm.c
libs/freetdm/mod_freetdm/mod_freetdm.c
+7
-8
ftdm_io.c
libs/freetdm/src/ftdm_io.c
+150
-96
ftdm_state.c
libs/freetdm/src/ftdm_state.c
+9
-6
ftdm_variables.c
libs/freetdm/src/ftdm_variables.c
+33
-9
ftmod_isdn.c
libs/freetdm/src/ftmod/ftmod_isdn/ftmod_isdn.c
+1
-3
ftmod_libpri.c
libs/freetdm/src/ftmod/ftmod_libpri/ftmod_libpri.c
+1
-3
ftmod_sangoma_isdn.c
...freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn.c
+10
-11
ftmod_sangoma_isdn_stack_hndl.c
.../ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_stack_hndl.c
+3
-1
ftmod_sangoma_isdn_stack_out.c
...c/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_stack_out.c
+1
-1
ftmod_sangoma_isdn_support.c
...src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_support.c
+12
-13
ftmod_sangoma_isdn_trace.c
...m/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_trace.c
+0
-2
freetdm.h
libs/freetdm/src/include/freetdm.h
+75
-57
ftdm_declare.h
libs/freetdm/src/include/ftdm_declare.h
+1
-0
ftdm_core.h
libs/freetdm/src/include/private/ftdm_core.h
+44
-8
ftdm_state.h
libs/freetdm/src/include/private/ftdm_state.h
+2
-2
没有找到文件。
libs/freetdm/docs/variables.txt
浏览文件 @
49ac70de
Using FreeTDM Variables
1. User application sending variables or raw buffer to FreeTDM
==============================================================
The User can
attach a ftdm_sigmsg_t to ftdm_caller_data
_t before sending an event to freetdm.
The User can
include a ftdm_usrmsg
_t before sending an event to freetdm.
example #1 - Adding a variable:
-------------------------------
example #1a - Making an outbound call:
--------------------------------------
To make an outbound call:
ftdm_usrmsg_t usrmsg;
/* Attach variable to usrmsg */
ftdm_usrmsg_add_var(&usrmsg, "isdn.prog_ind.descr", "inband-info-available");
/* Request FreeTDM to send a PROCEED msg */
ftdm_channel_call_place_ex(ftdmchan, &usrmsg);
example #1b - Adding a variable:
--------------------------------
When using ftmod_sangoma_isdn, user want to specify progress indicator inside PROCEED message.
ftdm_caller_data_t *caller_data;
ftdm_sigmsg_t sigmsg;
ftdm_usrmsg_t usrmsg;
/* Attach variable to sigmsg */
ftdm_event_add_var(&sigmsg, "isdn.prog_ind.descr", "inband-info-available");
/* Attach variable to usrmsg */
ftdm_usrmsg_add_var(&usrmsg, "isdn.prog_ind.descr", "inband-info-available");
/* Attach sigmsg to channel's caller_data */
caller_data = ftdm_channel_get_caller_data(ftdmchan);
caller_data->sigmsg = &sigmsg;
/* Request FreeTDM to send a PROCEED msg */
ftdm_channel_call_indicate(ftdmchan, FTDM_CHANNEL_INDICATE_PROCEED);
Note:
1.When ftdm_channel_call_indicate returns, caller_data->sigmsg will be NULL.
ftdm_channel_call_indicate_ex(ftdmchan, FTDM_CHANNEL_INDICATE_PROCEED, &usrmsg);
example #2
a - Setting raw data without autofree feature
:
example #2
- Setting raw data
:
--------------------------------------------------------
When using ftmod_sangoma_isdn, user wants to transmit a custom Facility IE, inside a FACILITY message.
ftdm_
caller_data_t *caller_data
;
ftdm_
usrmsg_t usrmsg
;
ftdm_sigmsg_t sigmsg;
uint8_t my_facility_ie [200];
unsigned my_facility_ie_len = 0;
/* Fill my_facility_ie with custom data here */
my_facility_ie[my_facility_ie_len++] = 0x1C; /* Q.931 Facility IE ID */
my_facility_ie[my_facility_ie_len++] = 0x03; /* Length of facility IE */
my_facility_ie[my_facility_ie_len++] = 0x01;
my_facility_ie[my_facility_ie_len++] = 0x02;
my_facility_ie[my_facility_ie_len++] = 0x03;
sigmsg.raw.data = my_facility_ie;
sigmsg.raw.len = my_facility_ie_len;
sigmsg.raw.autofree = 0;
/* Attach sigmsg to channel's caller_data */
caller_data = ftdm_channel_get_caller_data(ftdmchan);
caller_data->sigmsg = &sigmsg;
sigmsg.event_id = FTDM_SIGEVENT_FACILITY;
ftdm_channel_call_send_msg(ftdmchan, sigmsg);
example #2b - Setting raw data with autofree feature:
-----------------------------------------------------
ftdm_caller_data_t *caller_data;
ftdm_sigmsg_t sigmsg;
uint8_t *my_facility_ie = ftdm_calloc(1, 200);
uint8_t *my_facility_ie = ftdm_calloc(1, 200); /*memory has to be allocated using ftdm_calloc !! */
unsigned my_facility_ie_len = 0;
/* Fill my_facility_ie with custom data here */
...
...
@@ -74,19 +48,12 @@ example #2b - Setting raw data with autofree feature:
my_facility_ie[my_facility_ie_len++] = 0x01;
my_facility_ie[my_facility_ie_len++] = 0x02;
my_facility_ie[my_facility_ie_len++] = 0x03;
sigmsg.raw.data = my_facility_ie;
sigmsg.raw.len = my_facility_ie_len;
sigmsg.raw.autofree = 1;
/* Attach sigmsg to channel's caller_data */
caller_data = ftdm_channel_get_caller_data(ftdmchan);
caller_data->sigmsg = &sigmsg;
ftdm_usrmsg_set_raw_data(&usrmsg, my_facility_ie, my_facility_ie_len);
sigmsg.event_id = FTDM_SIGEVENT_FACILITY;
ftdm_channel_call_send_msg(ftdmchan, sigmsg);
ftdm_channel_call_send_msg(ftdmchan, sigmsg
, usrmsg
);
/* FreeTDM will automatically free my_facility_ie */
...
...
@@ -104,7 +71,7 @@ example #1 - print all variables received from FreeTDM
const char *var_value = NULL;
/* Read all variables attached to this event */
iter = ftdm_
event
_get_var_iterator(sigmsg, iter);
iter = ftdm_
sigmsg
_get_var_iterator(sigmsg, iter);
for (curr = iter ; curr; curr = ftdm_iterator_next(curr)) {
ftdm_get_current_var(curr, &var_name, &var_value);
fprintf("Call Variable: %s=%s\n", var_name, var_value);
...
...
@@ -117,20 +84,39 @@ example #2 - accessing a specific variable
/* Inside event call-back function */
char *string = NULL;
string = ftdm_
event
_get_var(sigmsg, "isdn.prog_ind.descr");
string = ftdm_
sigmsg
_get_var(sigmsg, "isdn.prog_ind.descr");
if (string && *string) {
fprintf("Progress indicator:%s\n", string);
}
example #3 - accessing raw data
example #3
a
- accessing raw data
-------------------------------
/* Inside event call-back function */
ftdm_size_t len;
uint8_t *mydata;
if (ftdm_
event
_get_raw_data(sigmsg, (void**)&mydata, &len) == FTDM_SUCCESS) {
if (ftdm_
sig
_get_raw_data(sigmsg, (void**)&mydata, &len) == FTDM_SUCCESS) {
/* raw data is available, do something with mydata here */
}
/* Once this function returns, raw data will be free'd inside FreeTDM */
example #3b - accessing raw data
-------------------------------
/* Inside event call-back function */
ftdm_size_t len;
uint8_t *mydata;
if (ftdm_sig_get_raw_data_detached(sigmsg, (void**)&mydata, &len) == FTDM_SUCCESS) {
/* raw data is available, do something with mydata here */
}
:
:
:
/* User owns raw data and is responsible for free'ing it*/
ftdm_safe_free(mydata);
libs/freetdm/mod_freetdm/mod_freetdm.c
浏览文件 @
49ac70de
...
...
@@ -1152,10 +1152,10 @@ static switch_call_cause_t channel_outgoing_channel(switch_core_session_t *sessi
int
argc
=
0
;
const
char
*
var
;
const
char
*
dest_num
=
NULL
,
*
callerid_num
=
NULL
;
ftdm_hunting_scheme_t
hunting
;
ftdm_
sigmsg_t
sig
msg
;
ftdm_hunting_scheme_t
hunting
;
ftdm_
usrmsg_t
usr
msg
;
memset
(
&
sigmsg
,
0
,
sizeof
(
ftdm_sig
msg_t
));
memset
(
&
usrmsg
,
0
,
sizeof
(
ftdm_usr
msg_t
));
if
(
!
outbound_profile
)
{
switch_log_printf
(
SWITCH_CHANNEL_LOG
,
SWITCH_LOG_ERROR
,
"Missing caller profile
\n
"
);
...
...
@@ -1384,7 +1384,7 @@ static switch_call_cause_t channel_outgoing_channel(switch_core_session_t *sessi
char
*
v
=
h
->
name
+
FREETDM_VAR_PREFIX_LEN
;
if
(
!
zstr
(
v
))
{
switch_log_printf
(
SWITCH_CHANNEL_LOG
,
SWITCH_LOG_DEBUG
,
"Adding outbound freetdm variable %s=%s to channel %d:%d
\n
"
,
v
,
h
->
value
,
span_id
,
chan_id
);
ftdm_
event_add_var
(
&
sig
msg
,
v
,
h
->
value
);
ftdm_
usrmsg_add_var
(
&
usr
msg
,
v
,
h
->
value
);
}
}
}
...
...
@@ -1411,9 +1411,8 @@ static switch_call_cause_t channel_outgoing_channel(switch_core_session_t *sessi
hunt_data
.
caller_profile
=
caller_profile
;
hunt_data
.
tech_pvt
=
tech_pvt
;
caller_data
.
priv
=
&
hunt_data
;
caller_data
.
sigmsg
=
&
sigmsg
;
if
((
status
=
ftdm_call_place
(
&
caller_data
,
&
huntin
g
))
!=
FTDM_SUCCESS
)
{
if
((
status
=
ftdm_call_place
_ex
(
&
caller_data
,
&
hunting
,
&
usrms
g
))
!=
FTDM_SUCCESS
)
{
if
(
tech_pvt
->
read_codec
.
implementation
)
{
switch_core_codec_destroy
(
&
tech_pvt
->
read_codec
);
}
...
...
@@ -1579,9 +1578,9 @@ ftdm_status_t ftdm_channel_from_event(ftdm_sigmsg_t *sigmsg, switch_core_session
}
/* Add any call variable to the dial plan */
iter
=
ftdm_
event
_get_var_iterator
(
sigmsg
,
iter
);
iter
=
ftdm_
sigmsg
_get_var_iterator
(
sigmsg
,
iter
);
for
(
curr
=
iter
;
curr
;
curr
=
ftdm_iterator_next
(
curr
))
{
ftdm_
event_
get_current_var
(
curr
,
&
var_name
,
&
var_value
);
ftdm_get_current_var
(
curr
,
&
var_name
,
&
var_value
);
snprintf
(
name
,
sizeof
(
name
),
FREETDM_VAR_PREFIX
"%s"
,
var_name
);
switch_channel_set_variable_printf
(
channel
,
name
,
"%s"
,
var_value
);
switch_log_printf
(
SWITCH_CHANNEL_LOG
,
SWITCH_LOG_DEBUG
,
"Call Variable: %s=%s
\n
"
,
name
,
var_value
);
...
...
libs/freetdm/src/ftdm_io.c
浏览文件 @
49ac70de
差异被折叠。
点击展开。
libs/freetdm/src/ftdm_state.c
浏览文件 @
49ac70de
...
...
@@ -68,6 +68,8 @@ FT_DECLARE(ftdm_status_t) _ftdm_channel_complete_state(const char *file, const c
return
FTDM_SUCCESS
;
}
ftdm_usrmsg_free
(
&
fchan
->
usrmsg
);
ftdm_clear_flag
(
fchan
,
FTDM_CHANNEL_STATE_CHANGE
);
if
(
state
==
FTDM_CHANNEL_STATE_PROGRESS
)
{
...
...
@@ -226,12 +228,14 @@ FT_DECLARE(ftdm_status_t) ftdm_channel_cancel_state(const char *file, const char
}
FT_DECLARE
(
ftdm_status_t
)
ftdm_channel_set_state
(
const
char
*
file
,
const
char
*
func
,
int
line
,
ftdm_channel_t
*
ftdmchan
,
ftdm_channel_state_t
state
,
int
waitrq
)
FT_DECLARE
(
ftdm_status_t
)
ftdm_channel_set_state
(
const
char
*
file
,
const
char
*
func
,
int
line
,
ftdm_channel_t
*
ftdmchan
,
ftdm_channel_state_t
state
,
int
waitrq
,
ftdm_usrmsg_t
*
usrmsg
)
{
if
(
ftdm_channel_save_event_data
(
ftdmchan
)
==
FTDM_SUCCESS
)
{
return
ftdm_core_set_state
(
file
,
func
,
line
,
ftdmchan
,
state
,
waitrq
);
ftdm_channel_save_usrmsg
(
ftdmchan
,
usrmsg
);
if
(
ftdm_core_set_state
(
file
,
func
,
line
,
ftdmchan
,
state
,
waitrq
)
!=
FTDM_SUCCESS
)
{
ftdm_usrmsg_free
(
&
ftdmchan
->
usrmsg
);
}
return
FTDM_
FAIL
;
return
FTDM_
SUCCESS
;
}
/* this function MUST be called with the channel lock held. If waitrq == 1, the channel will be unlocked/locked (never call it with waitrq == 1 with an lock recursivity > 1) */
...
...
@@ -524,8 +528,7 @@ FT_DECLARE(ftdm_status_t) ftdm_channel_advance_states(ftdm_channel_t *fchan)
* already completed implicitly by the state_processor() function via some internal
* call to ftdm_set_state() */
fchan
->
state_status
=
FTDM_STATE_STATUS_PROCESSED
;
}
ftdm_channel_clear_event_data
(
fchan
);
}
}
return
FTDM_SUCCESS
;
...
...
libs/freetdm/src/ftdm_variables.c
浏览文件 @
49ac70de
...
...
@@ -39,7 +39,7 @@
#include "private/ftdm_core.h"
FT_DECLARE
(
ftdm_status_t
)
ftdm_
event
_add_var
(
ftdm_sigmsg_t
*
sigmsg
,
const
char
*
var_name
,
const
char
*
value
)
FT_DECLARE
(
ftdm_status_t
)
ftdm_
sigmsg
_add_var
(
ftdm_sigmsg_t
*
sigmsg
,
const
char
*
var_name
,
const
char
*
value
)
{
char
*
t_name
=
0
,
*
t_val
=
0
;
...
...
@@ -59,7 +59,7 @@ FT_DECLARE(ftdm_status_t) ftdm_event_add_var(ftdm_sigmsg_t *sigmsg, const char *
return
FTDM_SUCCESS
;
}
FT_DECLARE
(
ftdm_status_t
)
ftdm_
event
_remove_var
(
ftdm_sigmsg_t
*
sigmsg
,
const
char
*
var_name
)
FT_DECLARE
(
ftdm_status_t
)
ftdm_
sigmsg
_remove_var
(
ftdm_sigmsg_t
*
sigmsg
,
const
char
*
var_name
)
{
if
(
sigmsg
&&
sigmsg
->
variables
)
{
hashtable_remove
(
sigmsg
->
variables
,
(
void
*
)
var_name
);
...
...
@@ -67,7 +67,7 @@ FT_DECLARE(ftdm_status_t) ftdm_event_remove_var(ftdm_sigmsg_t *sigmsg, const cha
return
FTDM_SUCCESS
;
}
FT_DECLARE
(
const
char
*
)
ftdm_
event
_get_var
(
ftdm_sigmsg_t
*
sigmsg
,
const
char
*
var_name
)
FT_DECLARE
(
const
char
*
)
ftdm_
sigmsg
_get_var
(
ftdm_sigmsg_t
*
sigmsg
,
const
char
*
var_name
)
{
const
char
*
var
=
NULL
;
...
...
@@ -79,7 +79,7 @@ FT_DECLARE(const char *) ftdm_event_get_var(ftdm_sigmsg_t *sigmsg, const char *v
return
var
;
}
FT_DECLARE
(
ftdm_iterator_t
*
)
ftdm_
event
_get_var_iterator
(
const
ftdm_sigmsg_t
*
sigmsg
,
ftdm_iterator_t
*
iter
)
FT_DECLARE
(
ftdm_iterator_t
*
)
ftdm_
sigmsg
_get_var_iterator
(
const
ftdm_sigmsg_t
*
sigmsg
,
ftdm_iterator_t
*
iter
)
{
ftdm_hash_iterator_t
*
hashiter
=
NULL
;
if
(
!
sigmsg
)
{
...
...
@@ -99,7 +99,7 @@ FT_DECLARE(ftdm_iterator_t *) ftdm_event_get_var_iterator(const ftdm_sigmsg_t *s
return
iter
;
}
FT_DECLARE
(
ftdm_status_t
)
ftdm_
event_
get_current_var
(
ftdm_iterator_t
*
iter
,
const
char
**
var_name
,
const
char
**
var_val
)
FT_DECLARE
(
ftdm_status_t
)
ftdm_get_current_var
(
ftdm_iterator_t
*
iter
,
const
char
**
var_name
,
const
char
**
var_val
)
{
const
void
*
key
=
NULL
;
void
*
val
=
NULL
;
...
...
@@ -117,11 +117,35 @@ FT_DECLARE(ftdm_status_t) ftdm_event_get_current_var(ftdm_iterator_t *iter, cons
return
FTDM_SUCCESS
;
}
FT_DECLARE
(
ftdm_status_t
)
ftdm_event_clear_vars
(
ftdm_sigmsg_t
*
sigmsg
)
FT_DECLARE
(
ftdm_status_t
)
ftdm_usrmsg_add_var
(
ftdm_usrmsg_t
*
usrmsg
,
const
char
*
var_name
,
const
char
*
value
)
{
if
(
sigmsg
->
variables
)
{
hashtable_destroy
(
sigmsg
->
variables
);
sigmsg
->
variables
=
NULL
;
char
*
t_name
=
0
,
*
t_val
=
0
;
if
(
!
usrmsg
||
!
var_name
||
!
value
)
{
return
FTDM_FAIL
;
}
if
(
!
usrmsg
->
variables
)
{
/* initialize on first use */
usrmsg
->
variables
=
create_hashtable
(
16
,
ftdm_hash_hashfromstring
,
ftdm_hash_equalkeys
);
ftdm_assert_return
(
usrmsg
->
variables
,
FTDM_FAIL
,
"Failed to create hash table
\n
"
);
}
t_name
=
ftdm_strdup
(
var_name
);
t_val
=
ftdm_strdup
(
value
);
hashtable_insert
(
usrmsg
->
variables
,
t_name
,
t_val
,
HASHTABLE_FLAG_FREE_KEY
|
HASHTABLE_FLAG_FREE_VALUE
);
return
FTDM_SUCCESS
;
}
FT_DECLARE
(
const
char
*
)
ftdm_usrmsg_get_var
(
ftdm_usrmsg_t
*
usrmsg
,
const
char
*
var_name
)
{
const
char
*
var
=
NULL
;
if
(
!
usrmsg
||
!
usrmsg
->
variables
||
!
var_name
)
{
return
NULL
;
}
var
=
(
const
char
*
)
hashtable_search
(((
struct
hashtable
*
)
usrmsg
->
variables
),
(
void
*
)
var_name
);
return
var
;
}
libs/freetdm/src/ftmod/ftmod_isdn/ftmod_isdn.c
浏览文件 @
49ac70de
...
...
@@ -285,9 +285,7 @@ static FIO_SPAN_GET_SIG_STATUS_FUNCTION(isdn_get_span_sig_status)
*/
static
FIO_CHANNEL_OUTGOING_CALL_FUNCTION
(
isdn_outgoing_call
)
{
ftdm_status_t
status
=
FTDM_SUCCESS
;
ftdm_set_flag
(
ftdmchan
,
FTDM_CHANNEL_OUTBOUND
);
return
status
;
return
FTDM_SUCCESS
;
}
/**
...
...
libs/freetdm/src/ftmod/ftmod_libpri/ftmod_libpri.c
浏览文件 @
49ac70de
...
...
@@ -93,9 +93,7 @@ static FIO_SPAN_GET_SIG_STATUS_FUNCTION(isdn_get_span_sig_status)
*/
static
FIO_CHANNEL_OUTGOING_CALL_FUNCTION
(
isdn_outgoing_call
)
{
ftdm_status_t
status
=
FTDM_SUCCESS
;
ftdm_set_flag
(
ftdmchan
,
FTDM_CHANNEL_OUTBOUND
);
return
status
;
return
FTDM_SUCCESS
;
}
/**
...
...
libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn.c
浏览文件 @
49ac70de
...
...
@@ -610,9 +610,6 @@ static ftdm_status_t ftdm_sangoma_isdn_process_state_change(ftdm_channel_t *ftdm
sigev
.
span_id
=
ftdmchan
->
span_id
;
sigev
.
channel
=
ftdmchan
;
/* Acknowledge the state change */
ftdm_channel_complete_state
(
ftdmchan
);
#ifdef FTDM_DEBUG_CHAN_MEMORY
if
(
ftdmchan
->
state
==
FTDM_CHANNEL_STATE_DIALING
)
{
ftdm_assert
(
mprotect
(
ftdmchan
,
sizeof
(
*
ftdmchan
),
PROT_READ
)
==
0
,
"Failed to mprotect"
);
...
...
@@ -876,15 +873,18 @@ static ftdm_status_t ftdm_sangoma_isdn_process_state_change(ftdm_channel_t *ftdm
break
;
}
/* Acknowledge the state change */
ftdm_channel_complete_state
(
ftdmchan
);
/* If sngisdn_info->variables is not NULL, it means did not send any
* sigevent to the user, therefore we have to free that
sigmsg
*/
* sigevent to the user, therefore we have to free that
hashtable
*/
if
(
sngisdn_info
->
variables
)
{
hashtable_destroy
(
sngisdn_info
->
variables
);
sngisdn_info
->
variables
=
NULL
;
}
/* If sngisdn_info->raw_data is not NULL, it means did not send any
* sigevent to the user, therefore we have to free that
sigmsg
*/
* sigevent to the user, therefore we have to free that
raw data
*/
if
(
sngisdn_info
->
raw_data
)
{
ftdm_safe_free
(
sngisdn_info
->
raw_data
);
sngisdn_info
->
raw_data
=
NULL
;
...
...
@@ -902,18 +902,17 @@ static ftdm_status_t ftdm_sangoma_isdn_process_state_change(ftdm_channel_t *ftdm
return
FTDM_SUCCESS
;
}
static
FIO_CHANNEL_
SEND_MSG_FUNCTION
(
ftdm_sangoma_isdn_send_msg
)
static
FIO_CHANNEL_
INDICATE_FUNCTION
(
ftdm_sangoma_isdn_indicate
)
{
ftdm_status_t
status
=
FTDM_FAIL
;
switch
(
sigmsg
->
event_id
)
{
case
FTDM_
SIGEVENT
_FACILITY
:
switch
(
indication
)
{
case
FTDM_
CHANNEL_INDICATE
_FACILITY
:
sngisdn_snd_fac_req
(
ftdmchan
);
status
=
FTDM_SUCCESS
;
break
;
default:
ftdm_log_chan_msg
(
ftdmchan
,
FTDM_LOG_WARNING
,
"Unsupported signalling msg requested
\n
"
);
status
=
FTDM_BREAK
;
status
=
FTDM_NOTIMPL
;
}
return
status
;
}
...
...
@@ -1092,7 +1091,7 @@ static FIO_CONFIGURE_SPAN_SIGNALING_FUNCTION(ftdm_sangoma_isdn_span_config)
span
->
stop
=
ftdm_sangoma_isdn_stop
;
span
->
signal_type
=
FTDM_SIGTYPE_ISDN
;
span
->
outgoing_call
=
ftdm_sangoma_isdn_outgoing_call
;
span
->
send_msg
=
ftdm_sangoma_isdn_send_msg
;
span
->
indicate
=
ftdm_sangoma_isdn_indicate
;
span
->
channel_request
=
NULL
;
span
->
signal_cb
=
sig_cb
;
span
->
get_channel_sig_status
=
ftdm_sangoma_isdn_get_chan_sig_status
;
...
...
libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_stack_hndl.c
浏览文件 @
49ac70de
...
...
@@ -160,7 +160,8 @@ void sngisdn_process_con_ind (sngisdn_event_data_t *sngisdn_event)
}
}
/* this should be in get_facility_ie function, fix this later */
#if 1
/* this section will not be needed once asn decoding function with key-value pairs is implemented */
if
(
signal_data
->
facility
==
SNGISDN_OPT_TRUE
&&
conEvnt
->
facilityStr
.
eh
.
pres
)
{
/* Verify whether the Caller Name will come in a subsequent FACILITY message */
uint16_t
ret_val
;
...
...
@@ -187,6 +188,7 @@ void sngisdn_process_con_ind (sngisdn_event_data_t *sngisdn_event)
strcpy
(
ftdmchan
->
caller_data
.
cid_name
,
retrieved_str
);
}
}
#endif
if
(
signal_data
->
overlap_dial
==
SNGISDN_OPT_TRUE
&&
!
conEvnt
->
sndCmplt
.
eh
.
pres
)
{
ftdm_set_state
(
ftdmchan
,
FTDM_CHANNEL_STATE_COLLECT
);
...
...
libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_stack_out.c
浏览文件 @
49ac70de
...
...
@@ -273,7 +273,7 @@ void sngisdn_snd_fac_req(ftdm_channel_t *ftdmchan)
facEvnt
.
facElmt
.
facStr
.
val
[
0
]
=
0x1C
;
facEvnt
.
facElmt
.
facStr
.
val
[
1
]
=
(
uint8_t
)
facEvnt
.
facElmt
.
facStr
.
len
;
facEvnt
.
facElmt
.
facStr
.
len
+=
2
;
/* Need to include the size of identifier + len */
ftdm_log_chan
(
ftdmchan
,
FTDM_LOG_INFO
,
"Sending FACILITY (suId:%d suInstId:%u spInstId:%u dchan:%d ces:%d)
\n
"
,
signal_data
->
cc_id
,
sngisdn_info
->
suInstId
,
sngisdn_info
->
spInstId
,
signal_data
->
dchan_id
,
sngisdn_info
->
ces
);
if
(
sng_isdn_facility_request
(
signal_data
->
cc_id
,
sngisdn_info
->
suInstId
,
sngisdn_info
->
spInstId
,
&
facEvnt
,
MI_FACIL
,
signal_data
->
dchan_id
,
sngisdn_info
->
ces
))
{
...
...
libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_support.c
浏览文件 @
49ac70de
...
...
@@ -253,6 +253,7 @@ ftdm_status_t get_calling_num2(ftdm_channel_t *ftdmchan, CgPtyNmb *cgPtyNmb)
ftdm_status_t
get_called_num
(
ftdm_channel_t
*
ftdmchan
,
CdPtyNmb
*
cdPtyNmb
)
{
ftdm_caller_data_t
*
caller_data
=
&
ftdmchan
->
caller_data
;
if
(
cdPtyNmb
->
eh
.
pres
!=
PRSNT_NODEF
)
{
return
FTDM_FAIL
;
}
...
...
@@ -369,7 +370,6 @@ ftdm_status_t get_facility_ie_str(ftdm_channel_t *ftdmchan, uint8_t *data, uint8
my_data
[
1
]
=
data_len
;
memcpy
(
&
my_data
[
2
],
data
,
data_len
);
sngisdn_add_raw_data
((
sngisdn_chan_data_t
*
)
ftdmchan
->
call_data
,
data
,
data_len
+
2
);
ftdm_log_chan_msg
(
ftdmchan
,
FTDM_LOG_DEBUG
,
"Raw Facility IE copied available
\n
"
);
...
...
@@ -381,7 +381,7 @@ ftdm_status_t get_facility_ie_str(ftdm_channel_t *ftdmchan, uint8_t *data, uint8
ftdm_status_t
get_prog_ind_ie
(
ftdm_channel_t
*
ftdmchan
,
ProgInd
*
progInd
)
{
uint8_t
val
;
uint8_t
val
;
if
(
!
progInd
->
eh
.
pres
)
{
return
FTDM_FAIL
;
}
...
...
@@ -492,7 +492,7 @@ ftdm_status_t set_calling_num2(ftdm_channel_t *ftdmchan, CgPtyNmb *cgPtyNmb)
uint8_t
len
,
val
;
ftdm_caller_data_t
*
caller_data
=
&
ftdmchan
->
caller_data
;
string
=
ftdm_
event_get_var
(
ftdmchan
->
sig
msg
,
"isdn.cg_pty2.digits"
);
string
=
ftdm_
usrmsg_get_var
(
ftdmchan
->
usr
msg
,
"isdn.cg_pty2.digits"
);
if
((
string
==
NULL
)
||
!
(
*
string
))
{
return
FTDM_FAIL
;
}
...
...
@@ -509,7 +509,7 @@ ftdm_status_t set_calling_num2(ftdm_channel_t *ftdmchan, CgPtyNmb *cgPtyNmb)
cgPtyNmb
->
screenInd
.
pres
=
PRSNT_NODEF
;
val
=
FTDM_SCREENING_INVALID
;
string
=
ftdm_
event_get_var
(
ftdmchan
->
sig
msg
,
"isdn.cg_pty2.screening_ind"
);
string
=
ftdm_
usrmsg_get_var
(
ftdmchan
->
usr
msg
,
"isdn.cg_pty2.screening_ind"
);
if
((
string
!=
NULL
)
&&
(
*
string
))
{
val
=
ftdm_str2ftdm_screening
(
string
);
}
...
...
@@ -526,7 +526,7 @@ ftdm_status_t set_calling_num2(ftdm_channel_t *ftdmchan, CgPtyNmb *cgPtyNmb)
cgPtyNmb
->
presInd0
.
pres
=
PRSNT_NODEF
;
val
=
FTDM_PRES_INVALID
;
string
=
ftdm_
event_get_var
(
ftdmchan
->
sig
msg
,
"isdn.cg_pty2.presentation_ind"
);
string
=
ftdm_
usrmsg_get_var
(
ftdmchan
->
usr
msg
,
"isdn.cg_pty2.presentation_ind"
);
if
((
string
!=
NULL
)
&&
(
*
string
))
{
val
=
ftdm_str2ftdm_presentation
(
string
);
}
...
...
@@ -541,7 +541,7 @@ ftdm_status_t set_calling_num2(ftdm_channel_t *ftdmchan, CgPtyNmb *cgPtyNmb)
cgPtyNmb
->
nmbPlanId
.
pres
=
PRSNT_NODEF
;
val
=
FTDM_NPI_INVALID
;
string
=
ftdm_
event_get_var
(
ftdmchan
->
sig
msg
,
"isdn.cg_pty2.npi"
);
string
=
ftdm_
usrmsg_get_var
(
ftdmchan
->
usr
msg
,
"isdn.cg_pty2.npi"
);
if
((
string
!=
NULL
)
&&
(
*
string
))
{
val
=
ftdm_str2ftdm_npi
(
string
);
}
...
...
@@ -556,7 +556,7 @@ ftdm_status_t set_calling_num2(ftdm_channel_t *ftdmchan, CgPtyNmb *cgPtyNmb)
/* Type of Number */
val
=
FTDM_TON_INVALID
;
string
=
ftdm_
event_get_var
(
ftdmchan
->
sig
msg
,
"isdn.cg_pty2.ton"
);
string
=
ftdm_
usrmsg_get_var
(
ftdmchan
->
usr
msg
,
"isdn.cg_pty2.ton"
);
if
((
string
!=
NULL
)
&&
(
*
string
))
{
val
=
ftdm_str2ftdm_ton
(
string
);
}
...
...
@@ -690,7 +690,7 @@ ftdm_status_t set_calling_name(ftdm_channel_t *ftdmchan, ConEvnt *conEvnt)
ftdm_status_t
set_calling_subaddr
(
ftdm_channel_t
*
ftdmchan
,
CgPtySad
*
cgPtySad
)
{
const
char
*
clg_subaddr
=
NULL
;
clg_subaddr
=
ftdm_
event_get_var
(
ftdmchan
->
sig
msg
,
"isdn.calling_subaddr"
);
clg_subaddr
=
ftdm_
usrmsg_get_var
(
ftdmchan
->
usr
msg
,
"isdn.calling_subaddr"
);
if
((
clg_subaddr
!=
NULL
)
&&
(
*
clg_subaddr
))
{
unsigned
len
=
strlen
(
clg_subaddr
);
cgPtySad
->
eh
.
pres
=
PRSNT_NODEF
;
...
...
@@ -723,7 +723,7 @@ ftdm_status_t set_facility_ie_str(ftdm_channel_t *ftdmchan, uint8_t *data, uint8
ftdm_size_t
len
;
uint8_t
*
mydata
;
if
(
ftdm_
event_get_raw_data
(
ftdmchan
->
sig
msg
,
(
void
**
)
&
mydata
,
&
len
)
==
FTDM_SUCCESS
)
{
if
(
ftdm_
usrmsg_get_raw_data
(
ftdmchan
->
usr
msg
,
(
void
**
)
&
mydata
,
&
len
)
==
FTDM_SUCCESS
)
{
if
(
len
>
2
&&
mydata
[
0
]
==
SNGISDN_Q931_FACILITY_IE_ID
)
{
len
=
mydata
[
1
];
memcpy
(
data
,
&
mydata
[
2
],
len
);
...
...
@@ -740,7 +740,7 @@ ftdm_status_t set_prog_ind_ie(ftdm_channel_t *ftdmchan, ProgInd *progInd, ftdm_s
int
descr
=
prog_ind
.
descr
;
int
loc
=
prog_ind
.
loc
;
str
=
ftdm_
event_get_var
(
ftdmchan
->
sig
msg
,
"isdn.prog_ind.descr"
);
str
=
ftdm_
usrmsg_get_var
(
ftdmchan
->
usr
msg
,
"isdn.prog_ind.descr"
);
if
(
str
&&
*
str
)
{
/* User wants to override progress indicator */
descr
=
ftdm_str2ftdm_sngisdn_progind_descr
(
str
);
...
...
@@ -751,7 +751,7 @@ ftdm_status_t set_prog_ind_ie(ftdm_channel_t *ftdmchan, ProgInd *progInd, ftdm_s
return
FTDM_SUCCESS
;
}
str
=
ftdm_
event_get_var
(
ftdmchan
->
sig
msg
,
"isdn.prog_ind.loc"
);
str
=
ftdm_
usrmsg_get_var
(
ftdmchan
->
usr
msg
,
"isdn.prog_ind.loc"
);
if
(
str
&&
*
str
)
{
loc
=
ftdm_str2ftdm_sngisdn_progind_loc
(
str
);
}
...
...
@@ -1219,7 +1219,7 @@ ftdm_status_t sngisdn_add_raw_data(sngisdn_chan_data_t *sngisdn_info, uint8_t* d
sngisdn_info
->
raw_data
=
ftdm_calloc
(
1
,
data_len
);
ftdm_assert_return
(
sngisdn_info
->
raw_data
,
FTDM_FAIL
,
"Failed to allocate raw data
\n
"
);
memcpy
(
sngisdn_info
->
raw_data
,
data
,
data_len
);
sngisdn_info
->
raw_data_len
=
data_len
;
return
FTDM_SUCCESS
;
...
...
@@ -1256,7 +1256,6 @@ void sngisdn_send_signal(sngisdn_chan_data_t *sngisdn_info, ftdm_signal_event_t
sigev
.
raw
.
data
=
sngisdn_info
->
raw_data
;
sigev
.
raw
.
len
=
sngisdn_info
->
raw_data_len
;
sigev
.
raw
.
autofree
=
1
;
sngisdn_info
->
raw_data
=
NULL
;
sngisdn_info
->
raw_data_len
=
0
;
...
...
libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_trace.c
浏览文件 @
49ac70de
...
...
@@ -139,7 +139,6 @@ void sngisdn_trace_raw_q921(sngisdn_span_data_t *signal_data, ftdm_trace_dir_t d
memcpy
(
raw_data
,
data
,
data_len
);
sigev
.
raw
.
data
=
raw_data
;
sigev
.
raw
.
len
=
data_len
;
sigev
.
raw
.
autofree
=
1
;
ftdm_span_send_signal
(
signal_data
->
ftdm_span
,
&
sigev
);
}
...
...
@@ -253,7 +252,6 @@ void sngisdn_trace_raw_q931(sngisdn_span_data_t *signal_data, ftdm_trace_dir_t d
memcpy
(
raw_data
,
data
,
data_len
);
sigev
.
raw
.
data
=
raw_data
;
sigev
.
raw
.
len
=
data_len
;
sigev
.
raw
.
autofree
=
1
;
ftdm_span_send_signal
(
signal_data
->
ftdm_span
,
&
sigev
);
}
}
...
...
libs/freetdm/src/include/freetdm.h
浏览文件 @
49ac70de
差异被折叠。
点击展开。
libs/freetdm/src/include/ftdm_declare.h
浏览文件 @
49ac70de
...
...
@@ -223,6 +223,7 @@ typedef struct ftdm_conf_node ftdm_conf_node_t;
typedef
struct
ftdm_group
ftdm_group_t
;
typedef
size_t
ftdm_size_t
;
typedef
struct
ftdm_sigmsg
ftdm_sigmsg_t
;
typedef
struct
ftdm_usrmsg
ftdm_usrmsg_t
;
typedef
struct
ftdm_io_interface
ftdm_io_interface_t
;
typedef
struct
ftdm_stream_handle
ftdm_stream_handle_t
;
typedef
struct
ftdm_queue
ftdm_queue_t
;
...
...
libs/freetdm/src/include/private/ftdm_core.h
浏览文件 @
49ac70de
...
...
@@ -468,7 +468,7 @@ struct ftdm_channel {
ftdm_interrupt_t
*
state_completed_interrupt
;
/*!< Notify when a state change is completed */
int32_t
txdrops
;
int32_t
rxdrops
;
ftdm_
sigmsg_t
*
sig
msg
;
ftdm_
usrmsg_t
*
usr
msg
;
};
struct
ftdm_span
{
...
...
@@ -494,7 +494,7 @@ struct ftdm_span {
teletone_multi_tone_t
tone_finder
[
FTDM_TONEMAP_INVALID
+
1
];
ftdm_channel_t
*
channels
[
FTDM_MAX_CHANNELS_SPAN
+
1
];
fio_channel_outgoing_call_t
outgoing_call
;
fio_channel_
send_msg_t
send_msg
;
fio_channel_
indicate_t
indicate
;
fio_channel_set_sig_status_t
set_channel_sig_status
;
fio_channel_get_sig_status_t
get_channel_sig_status
;
fio_span_set_sig_status_t
set_span_sig_status
;
...
...
@@ -636,14 +636,50 @@ FT_DECLARE(void) ftdm_set_echocancel_call_begin(ftdm_channel_t *chan);
/*! \brief adjust echocanceller for end of call */
FT_DECLARE
(
void
)
ftdm_set_echocancel_call_end
(
ftdm_channel_t
*
chan
);
/*! \brief clear variables hashtable inside sigmsg */
FT_DECLARE
(
ftdm_status_t
)
ftdm_event_clear_vars
(
ftdm_sigmsg_t
*
sigmsg
);
/*! \brief save data from user
(ftdmchan->caller_data.sigmsg) into internal copy (ftdmchan->sigmsg)
*/
FT_DECLARE
(
ftdm_status_t
)
ftdm_channel_save_
event_data
(
ftdm_channel_t
*
ftdmchan
);
/*! \brief save data from user */
FT_DECLARE
(
ftdm_status_t
)
ftdm_channel_save_
usrmsg
(
ftdm_channel_t
*
ftdmchan
,
ftdm_usrmsg_t
*
usrmsg
);
/*! \brief free data from internal copy (ftdmchan->sigmsg) */
FT_DECLARE
(
ftdm_status_t
)
ftdm_channel_clear_event_data
(
ftdm_channel_t
*
ftdmchan
);
/*! \brief free usrmsg and variables/raw data attached to it */
FT_DECLARE
(
ftdm_status_t
)
ftdm_usrmsg_free
(
ftdm_usrmsg_t
**
usrmsg
);
/*! \brief Get a custom variable from the user message
* \note The variable pointer returned is only valid while the before the event is processed and it'll be destroyed once the event is processed. */
FT_DECLARE
(
const
char
*
)
ftdm_usrmsg_get_var
(
ftdm_usrmsg_t
*
usrmsg
,
const
char
*
var_name
);
/*! \brief Get raw data from user message
* \param usrmsg The message structure containing the variables
* \param data data will point to available data pointer if available
* \param datalen datalen will be set to length of data available
* \retval FTDM_SUCCESS data is available
* \retval FTDM_FAIL no data available
* \note data is only valid within the duration of the callback, to receive a data pointer that does not get
* \note destroyed when callback returns, see ftdm_sigmsg_get_raw_data_detached
*/
FT_DECLARE
(
ftdm_status_t
)
ftdm_usrmsg_get_raw_data
(
ftdm_usrmsg_t
*
usrmsg
,
void
**
data
,
ftdm_size_t
*
datalen
);
/*! \brief free sigmsg and variables/raw data attached to it */
FT_DECLARE
(
ftdm_status_t
)
ftdm_sigmsg_free
(
ftdm_sigmsg_t
**
sigmsg
);
/*! \brief Add a custom variable to the event
* \note This variables may be used by signaling modules to override signaling parameters
* \todo Document which signaling variables are available
* */
FT_DECLARE
(
ftdm_status_t
)
ftdm_sigmsg_add_var
(
ftdm_sigmsg_t
*
sigmsg
,
const
char
*
var_name
,
const
char
*
value
);
/*! \brief Remove a custom variable from the event
* \note The variable pointer returned is only valid while the before the event is processed and it'll be destroyed once the event is processed. */
FT_DECLARE
(
ftdm_status_t
)
ftdm_sigmsg_remove_var
(
ftdm_sigmsg_t
*
sigmsg
,
const
char
*
var_name
);
/*! \brief Attach raw data to sigmsg
* \param sigmsg The message structure containing the variables
* \param data pointer to data
* \param datalen datalen length of data
* \retval FTDM_SUCCESS success, data was successfully saved
* \retval FTDM_FAIL failed, event already had data attached to it.
* \note data must have been allocated using ftdm_calloc, FreeTDM will free data once the usrmsg is processed.
*/
FT_DECLARE
(
ftdm_status_t
)
ftdm_sigmsg_set_raw_data
(
ftdm_sigmsg_t
*
sigmsg
,
void
*
data
,
ftdm_size_t
datalen
);
/*!
\brief Assert condition
...
...
libs/freetdm/src/include/private/ftdm_state.h
浏览文件 @
49ac70de
...
...
@@ -188,7 +188,7 @@ FT_DECLARE(ftdm_status_t) ftdm_channel_cancel_state(const char *file, const char
* \note If this function is called with the wait parameter set to a non-zero value, the recursivity
* of the channel lock must be == 1 because the channel will be unlocked/locked when waiting */
FT_DECLARE
(
ftdm_status_t
)
ftdm_channel_set_state
(
const
char
*
file
,
const
char
*
func
,
int
line
,
ftdm_channel_t
*
ftdmchan
,
ftdm_channel_state_t
state
,
int
wait
);
ftdm_channel_t
*
ftdmchan
,
ftdm_channel_state_t
state
,
int
wait
,
ftdm_usrmsg_t
*
usrmsg
);
/*!\brief Set the state of a channel immediately and implicitly complete the previous state if needed
* \note FTDM_SIGEVENT_INDICATION_COMPLETED will be sent if the state change
...
...
@@ -207,7 +207,7 @@ FT_DECLARE(ftdm_status_t) _ftdm_set_state(const char *file, const char *func, in
#define ftdm_set_state_locked(obj, s) \
do { \
ftdm_channel_lock(obj); \
ftdm_channel_set_state(__FILE__, __FUNCTION__, __LINE__, obj, s, 0); \
ftdm_channel_set_state(__FILE__, __FUNCTION__, __LINE__, obj, s, 0
, NULL
); \
ftdm_channel_unlock(obj); \
} while(0);
...
...
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论