2010-12-13 08:22:49 +00:00
/*****************************************************************************\
* * * *
* * LCR * *
* * * *
* * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - * *
* * Copyright : Andreas Eversberg * *
* * * *
* * mISDN remote * *
* * * *
\ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
# include "main.h"
2011-08-11 13:23:23 +00:00
unsigned int new_remote = 1000 ;
2010-12-13 08:22:49 +00:00
/*
* constructor
*/
2012-08-19 07:42:43 +00:00
Premote : : Premote ( int type , char * portname , struct port_settings * settings , struct interface * interface , int remote_id ) : Port ( type , portname , settings , interface )
2010-12-13 08:22:49 +00:00
{
union parameter param ;
2012-07-27 15:20:43 +00:00
p_callerinfo . itype = ( interface - > extension ) ? INFO_ITYPE_ISDN_EXTENSION : INFO_ITYPE_ISDN ;
p_r_ref = new_remote + + ;
SCPY ( p_r_remote_app , interface - > remote_app ) ;
p_r_tones = ( interface - > is_tones = = IS_YES ) ;
2012-12-04 14:41:23 +00:00
p_r_earlyb = ( interface - > is_earlyb = = IS_YES ) ;
2010-12-13 08:22:49 +00:00
/* send new ref to remote socket */
memset ( & param , 0 , sizeof ( union parameter ) ) ;
if ( type = = PORT_TYPE_REMOTE_OUT )
param . newref . direction = 1 ; /* new ref from lcr */
2012-07-27 15:20:43 +00:00
p_r_remote_id = remote_id ;
if ( admin_message_from_lcr ( p_r_remote_id , p_r_ref , MESSAGE_NEWREF , & param ) < 0 )
FATAL ( " No socket with remote application '%s' found, this shall not happen. because we already created one. \n " , p_r_remote_app ) ;
2010-12-13 08:22:49 +00:00
2012-07-27 15:20:43 +00:00
PDEBUG ( DEBUG_PORT , " Created new RemotePort(%s). \n " , portname ) ;
2010-12-13 08:22:49 +00:00
}
/*
* destructor
*/
Premote : : ~ Premote ( )
{
2012-07-27 15:20:43 +00:00
PDEBUG ( DEBUG_PORT , " Destroyed Remote process(%s). \n " , p_name ) ;
2010-12-13 08:22:49 +00:00
}
/*
* endpoint sends messages to the port
*/
int Premote : : message_epoint ( unsigned int epoint_id , int message_type , union parameter * param )
{
struct epoint_list * epointlist ;
2012-07-27 15:20:43 +00:00
if ( Port : : message_epoint ( epoint_id , message_type , param ) )
2010-12-13 08:22:49 +00:00
return 1 ;
2012-07-29 10:39:09 +00:00
switch ( message_type ) {
case MESSAGE_SETUP :
2012-07-27 15:20:43 +00:00
struct interface * interface ;
2012-08-19 07:42:43 +00:00
interface = getinterfacebyname ( p_interface_name ) ;
2012-07-27 15:20:43 +00:00
if ( ! interface ) {
2012-08-19 07:42:43 +00:00
PERROR ( " Cannot find interface %s. \n " , p_interface_name ) ;
2010-12-13 08:22:49 +00:00
return 0 ;
}
/* attach only if not already */
epointlist = p_epointlist ;
while ( epointlist ) {
if ( epointlist - > epoint_id = = epoint_id )
break ;
epointlist = epointlist - > next ;
}
if ( ! epointlist )
epointlist_new ( epoint_id ) ;
/* set context to pbx */
2012-07-27 15:20:43 +00:00
if ( ! param - > setup . dialinginfo . context [ 0 ] ) {
if ( interface - > remote_context [ 0 ] )
SCPY ( param - > setup . dialinginfo . context , interface - > remote_context ) ;
else
SCPY ( param - > setup . dialinginfo . context , " lcr " ) ;
}
2012-08-21 06:36:33 +00:00
memcpy ( & p_dialinginfo , & param - > setup . dialinginfo , sizeof ( p_dialinginfo ) ) ;
memcpy ( & p_capainfo , & param - > setup . capainfo , sizeof ( p_capainfo ) ) ;
2012-08-19 08:24:39 +00:00
memcpy ( & p_callerinfo , & param - > setup . callerinfo , sizeof ( p_callerinfo ) ) ;
memcpy ( & p_redirinfo , & param - > setup . redirinfo , sizeof ( p_redirinfo ) ) ;
2012-08-21 06:36:33 +00:00
/* screen */
2012-08-19 08:24:39 +00:00
do_screen ( 1 , p_callerinfo . id , sizeof ( p_callerinfo . id ) , & p_callerinfo . ntype , & p_callerinfo . present , p_interface_name ) ;
do_screen ( 1 , p_callerinfo . id2 , sizeof ( p_callerinfo . id2 ) , & p_callerinfo . ntype2 , & p_callerinfo . present2 , p_interface_name ) ;
do_screen ( 1 , p_redirinfo . id , sizeof ( p_redirinfo . id ) , & p_redirinfo . ntype , & p_redirinfo . present , p_interface_name ) ;
memcpy ( & param - > setup . callerinfo , & p_callerinfo , sizeof ( p_callerinfo ) ) ;
memcpy ( & param - > setup . redirinfo , & p_redirinfo , sizeof ( p_redirinfo ) ) ;
2012-07-27 15:20:43 +00:00
2012-07-29 10:39:09 +00:00
new_state ( PORT_STATE_OUT_SETUP ) ;
break ;
case MESSAGE_PROCEEDING :
new_state ( PORT_STATE_IN_PROCEEDING ) ;
break ;
case MESSAGE_ALERTING :
new_state ( PORT_STATE_IN_ALERTING ) ;
break ;
case MESSAGE_CONNECT :
2012-08-21 06:36:33 +00:00
memcpy ( & p_connectinfo , & param - > connectinfo , sizeof ( p_connectinfo ) ) ;
2012-07-29 10:39:09 +00:00
new_state ( PORT_STATE_CONNECT ) ;
break ;
case MESSAGE_DISCONNECT :
new_state ( PORT_STATE_OUT_DISCONNECT ) ;
break ;
case MESSAGE_RELEASE :
new_state ( PORT_STATE_RELEASE ) ;
break ;
2010-12-13 08:22:49 +00:00
}
/* look for Remote's interface */
2012-07-27 15:20:43 +00:00
if ( admin_message_from_lcr ( p_r_remote_id , p_r_ref , message_type , param ) < 0 ) {
PERROR ( " No socket with remote application '%s' found, this shall not happen. Closing socket shall cause release of all remote ports. \n " , p_r_remote_app ) ;
2010-12-13 08:22:49 +00:00
return 0 ;
}
if ( message_type = = MESSAGE_RELEASE ) {
new_state ( PORT_STATE_RELEASE ) ;
delete this ;
return 0 ;
}
return 0 ;
}
void Premote : : message_remote ( int message_type , union parameter * param )
{
class Endpoint * epoint ;
struct lcr_msg * message ;
2012-07-27 15:20:43 +00:00
struct interface * interface ;
switch ( message_type ) {
case MESSAGE_TRAFFIC :
2014-06-28 07:24:14 +00:00
if ( p_dov_rx )
dov_rx ( param - > traffic . data , param - > traffic . len ) ;
2012-08-21 08:34:15 +00:00
/* record audio */
if ( p_record )
record ( param - > traffic . data , param - > traffic . len , 0 ) ; // from down
if ( p_tap )
tap ( param - > traffic . data , param - > traffic . len , 0 ) ; // from down
2012-07-27 15:20:43 +00:00
bridge_tx ( param - > traffic . data , param - > traffic . len ) ;
2012-08-19 09:11:59 +00:00
if ( p_tone_name [ 0 ] ) {
read_audio ( param - > traffic . data , param - > traffic . len ) ;
2012-08-21 08:34:15 +00:00
/* record audio */
if ( p_record )
record ( param - > traffic . data , param - > traffic . len , 1 ) ; // from up
if ( p_tap )
tap ( param - > traffic . data , param - > traffic . len , 1 ) ; // from up
2012-08-19 09:11:59 +00:00
admin_message_from_lcr ( p_r_remote_id , p_r_ref , MESSAGE_TRAFFIC , param ) ;
2014-06-28 07:24:14 +00:00
} else if ( p_dov_tx ) {
/* use receeived traffic to trigger sending DOV */
dov_tx ( param - > traffic . data , param - > traffic . len ) ;
admin_message_from_lcr ( p_r_remote_id , p_r_ref , MESSAGE_TRAFFIC , param ) ;
2012-08-19 09:11:59 +00:00
}
2012-08-21 06:50:35 +00:00
return ;
2012-07-27 15:20:43 +00:00
case MESSAGE_SETUP :
2012-08-19 07:42:43 +00:00
interface = getinterfacebyname ( p_interface_name ) ;
2012-07-27 15:20:43 +00:00
if ( ! interface ) {
2012-08-19 07:42:43 +00:00
PERROR ( " Cannot find interface %s. \n " , p_interface_name ) ;
2012-07-27 15:20:43 +00:00
return ;
}
2010-12-13 08:22:49 +00:00
/* enable audio path */
2012-07-27 15:20:43 +00:00
if ( interface - > is_tones = = IS_YES ) {
union parameter newparam ;
memset ( & newparam , 0 , sizeof ( union parameter ) ) ;
admin_message_from_lcr ( p_r_remote_id , p_r_ref , MESSAGE_PATTERN , & newparam ) ;
newparam . audiopath = 1 ;
admin_message_from_lcr ( p_r_remote_id , p_r_ref , MESSAGE_AUDIOPATH , & newparam ) ;
}
2010-12-13 08:22:49 +00:00
/* set source interface */
param - > setup . callerinfo . itype = p_callerinfo . itype ;
2012-07-27 15:20:43 +00:00
SCPY ( param - > setup . callerinfo . interface , interface - > name ) ;
2010-12-13 08:22:49 +00:00
/* create endpoint */
if ( p_epointlist )
FATAL ( " Incoming call but already got an endpoint. \n " ) ;
if ( ! ( epoint = new Endpoint ( p_serial , 0 ) ) )
FATAL ( " No memory for Endpoint instance \n " ) ;
2012-07-27 15:20:43 +00:00
epoint - > ep_app = new_endpointapp ( epoint , 0 , interface - > app ) ; //incoming
2010-12-13 08:22:49 +00:00
epointlist_new ( epoint - > ep_serial ) ;
2012-07-29 10:39:09 +00:00
2012-08-21 06:36:33 +00:00
memcpy ( & p_dialinginfo , & param - > setup . dialinginfo , sizeof ( p_dialinginfo ) ) ;
memcpy ( & p_capainfo , & param - > setup . capainfo , sizeof ( p_capainfo ) ) ;
memcpy ( & p_callerinfo , & param - > setup . callerinfo , sizeof ( p_callerinfo ) ) ;
memcpy ( & p_redirinfo , & param - > setup . redirinfo , sizeof ( p_redirinfo ) ) ;
2012-07-29 10:39:09 +00:00
new_state ( PORT_STATE_IN_SETUP ) ;
break ;
case MESSAGE_PROCEEDING :
new_state ( PORT_STATE_OUT_PROCEEDING ) ;
break ;
case MESSAGE_ALERTING :
new_state ( PORT_STATE_OUT_ALERTING ) ;
break ;
case MESSAGE_CONNECT :
2012-08-21 06:36:33 +00:00
memcpy ( & p_connectinfo , & param - > connectinfo , sizeof ( p_connectinfo ) ) ;
2012-07-29 10:39:09 +00:00
new_state ( PORT_STATE_CONNECT ) ;
break ;
case MESSAGE_DISCONNECT :
new_state ( PORT_STATE_IN_DISCONNECT ) ;
break ;
case MESSAGE_RELEASE :
new_state ( PORT_STATE_RELEASE ) ;
break ;
}
/* cannot just forward, because param is not of container "struct lcr_msg" */
message = message_create ( p_serial , ACTIVE_EPOINT ( p_epointlist ) , PORT_TO_EPOINT , message_type ) ;
memcpy ( & message - > param , param , sizeof ( message - > param ) ) ;
message_put ( message ) ;
if ( message_type = = MESSAGE_RELEASE ) {
new_state ( PORT_STATE_RELEASE ) ;
delete this ;
return ;
2010-12-13 08:22:49 +00:00
}
}
2012-07-27 15:20:43 +00:00
/* receive from remote Port instance */
int Premote : : bridge_rx ( unsigned char * data , int len )
2010-12-13 08:22:49 +00:00
{
2012-07-27 15:20:43 +00:00
union parameter newparam ;
int l ;
2012-12-23 05:45:43 +00:00
int ret ;
if ( ( ret = Port : : bridge_rx ( data , len ) ) )
return ret ;
2012-07-27 15:20:43 +00:00
2012-12-04 14:41:23 +00:00
/* send tones, if connected, or if early audio is enabled in proceeding/alerting state */
if ( p_state ! = PORT_STATE_CONNECT
& & ! ( p_r_earlyb
& & ( p_state = = PORT_STATE_OUT_PROCEEDING
| | p_state = = PORT_STATE_OUT_ALERTING ) )
& & ! ( p_r_tones
& & ( p_state = = PORT_STATE_IN_PROCEEDING
| | p_state = = PORT_STATE_IN_ALERTING ) ) )
2012-07-27 15:20:43 +00:00
return 0 ;
2012-08-19 09:11:59 +00:00
if ( p_tone_name [ 0 ] )
return 0 ;
2012-07-27 15:20:43 +00:00
memset ( & newparam , 0 , sizeof ( union parameter ) ) ;
/* split, if exeeds data size */
while ( len ) {
l = ( len > ( int ) sizeof ( newparam . traffic . data ) ) ? sizeof ( newparam . traffic . data ) : len ;
newparam . traffic . len = l ;
len - = l ;
memcpy ( newparam . traffic . data , data , l ) ;
data + = l ;
2012-08-21 08:34:15 +00:00
/* record audio */
if ( p_record )
record ( data , len , 1 ) ; // from up
if ( p_tap )
tap ( data , len , 1 ) ; // from up
2012-07-27 15:20:43 +00:00
admin_message_from_lcr ( p_r_remote_id , p_r_ref , MESSAGE_TRAFFIC , & newparam ) ;
}
2010-12-13 08:22:49 +00:00
2012-07-27 15:20:43 +00:00
return 0 ;
}
2010-12-13 08:22:49 +00:00