@ -35,6 +35,7 @@
# include "asterisk/utils.h"
# include "asterisk/utils.h"
# include "asterisk/options.h"
# include "asterisk/options.h"
# include "asterisk/pbx.h"
# include "asterisk/pbx.h"
# include "asterisk/app.h"
# include "asterisk/file.h"
# include "asterisk/file.h"
# include "asterisk/callerid.h"
# include "asterisk/callerid.h"
# include "asterisk/say.h"
# include "asterisk/say.h"
@ -3267,38 +3268,22 @@ void sig_pri_extract_called_num_subaddr(struct sig_pri_chan *p, const char *rdes
char * dial ;
char * dial ;
char * number ;
char * number ;
char * subaddr ;
char * subaddr ;
AST_DECLARE_APP_ARGS ( args ,
/* Get private copy of dial string. */
AST_APP_ARG ( group ) ; /* channel/group token */
AST_APP_ARG ( ext ) ; /* extension token */
//AST_APP_ARG(opts); /* options token */
AST_APP_ARG ( other ) ; /* Any remining unused arguments */
) ;
/* Get private copy of dial string and break it up. */
dial = ast_strdupa ( rdest ) ;
dial = ast_strdupa ( rdest ) ;
AST_NONSTANDARD_APP_ARGS ( args , dial , ' / ' ) ;
/* Skip channel selection section. */
number = args . ext ;
number = strchr ( dial , ' / ' ) ;
if ( ! number ) {
if ( number ) {
+ + number ;
} else {
number = " " ;
number = " " ;
}
}
# if defined(HAVE_PRI_SETUP_KEYPAD)
/*
* v - - - number points here
* / [ K < keypad - digits > / ] extension
*/
if ( number [ 0 ] = = ' K ' ) {
/* Skip the keypad facility digits. */
number = strchr ( number + 1 , ' / ' ) ;
if ( number ) {
+ + number ;
} else {
number = " " ;
}
}
/*
* v - - - number points here
* / extension
*/
# endif /* defined(HAVE_PRI_SETUP_KEYPAD) */
/* Find and extract dialed_subaddress */
/* Find and extract dialed_subaddress */
subaddr = strchr ( number , ' : ' ) ;
subaddr = strchr ( number , ' : ' ) ;
if ( subaddr ) {
if ( subaddr ) {
@ -3337,6 +3322,22 @@ void sig_pri_extract_called_num_subaddr(struct sig_pri_chan *p, const char *rdes
}
}
}
}
enum SIG_PRI_CALL_OPT_FLAGS {
OPT_KEYPAD = ( 1 < < 0 ) ,
OPT_REVERSE_CHARGE = ( 1 < < 1 ) , /* Collect call */
} ;
enum SIG_PRI_CALL_OPT_ARGS {
OPT_ARG_KEYPAD = 0 ,
/* note: this entry _MUST_ be the last one in the enum */
OPT_ARG_ARRAY_SIZE ,
} ;
AST_APP_OPTIONS ( sig_pri_call_opts , BEGIN_OPTIONS
AST_APP_OPTION_ARG ( ' K ' , OPT_KEYPAD , OPT_ARG_KEYPAD ) ,
AST_APP_OPTION ( ' R ' , OPT_REVERSE_CHARGE ) ,
END_OPTIONS ) ;
/*! \note Parsing must remain in sync with sig_pri_extract_called_num_subaddr(). */
/*! \note Parsing must remain in sync with sig_pri_extract_called_num_subaddr(). */
int sig_pri_call ( struct sig_pri_chan * p , struct ast_channel * ast , char * rdest , int timeout , int layer1 )
int sig_pri_call ( struct sig_pri_chan * p , struct ast_channel * ast , char * rdest , int timeout , int layer1 )
{
{
@ -3355,6 +3356,14 @@ int sig_pri_call(struct sig_pri_chan *p, struct ast_channel *ast, char *rdest, i
# if defined(HAVE_PRI_SETUP_KEYPAD)
# if defined(HAVE_PRI_SETUP_KEYPAD)
const char * keypad ;
const char * keypad ;
# endif /* defined(HAVE_PRI_SETUP_KEYPAD) */
# endif /* defined(HAVE_PRI_SETUP_KEYPAD) */
AST_DECLARE_APP_ARGS ( args ,
AST_APP_ARG ( group ) ; /* channel/group token */
AST_APP_ARG ( ext ) ; /* extension token */
AST_APP_ARG ( opts ) ; /* options token */
AST_APP_ARG ( other ) ; /* Any remining unused arguments */
) ;
struct ast_flags opts ;
char * opt_args [ OPT_ARG_ARRAY_SIZE ] ;
ast_log ( LOG_DEBUG , " CALLING CID_NAME: %s CID_NUM:: %s \n " , ast - > cid . cid_name , ast - > cid . cid_num ) ;
ast_log ( LOG_DEBUG , " CALLING CID_NAME: %s CID_NUM:: %s \n " , ast - > cid . cid_name , ast - > cid . cid_num ) ;
@ -3368,45 +3377,20 @@ int sig_pri_call(struct sig_pri_chan *p, struct ast_channel *ast, char *rdest, i
return - 1 ;
return - 1 ;
}
}
ast_copy_string ( dest , rdest , sizeof ( dest ) ) ;
p - > dialdest [ 0 ] = ' \0 ' ;
p - > dialdest [ 0 ] = ' \0 ' ;
p - > outgoing = 1 ;
p - > outgoing = 1 ;
c = strchr ( dest , ' / ' ) ;
ast_copy_string ( dest , rdest , sizeof ( dest ) ) ;
if ( c ) {
AST_NONSTANDARD_APP_ARGS ( args , dest , ' / ' ) ;
c + + ;
if ( ast_app_parse_options ( sig_pri_call_opts , & opts , opt_args , args . opts ) ) {
} else {
/* General invalid option syntax. */
c = " " ;
return - 1 ;
}
}
# if defined(HAVE_PRI_SETUP_KEYPAD)
c = args . ext ;
/*
if ( ! c ) {
* v - - - c points here
* / [ K < keypad - digits > / ] extension
*/
if ( c [ 0 ] = = ' K ' ) {
/* Extract the keypad facility digits. */
keypad = c + 1 ;
c = strchr ( keypad , ' / ' ) ;
if ( c ) {
/* Terminate the keypad facility digits. */
* c + + = ' \0 ' ;
} else {
c = " " ;
c = " " ;
}
}
if ( ast_strlen_zero ( keypad ) ) {
/* What no keypad digits? */
keypad = NULL ;
}
} else {
keypad = NULL ;
}
/*
* v - - - c points here
* / extension
*/
# endif /* defined(HAVE_PRI_SETUP_KEYPAD) */
/* setup dialed_subaddress if found */
/* setup dialed_subaddress if found */
ast_party_subaddress_init ( & dialed_subaddress ) ;
ast_party_subaddress_init ( & dialed_subaddress ) ;
@ -3545,16 +3529,6 @@ int sig_pri_call(struct sig_pri_chan *p, struct ast_channel *ast, char *rdest, i
case ' r ' :
case ' r ' :
pridialplan = PRI_NPI_RESERVED | ( pridialplan & 0xf0 ) ;
pridialplan = PRI_NPI_RESERVED | ( pridialplan & 0xf0 ) ;
break ;
break ;
# if defined(HAVE_PRI_REVERSE_CHARGE)
case ' C ' :
pri_sr_set_reversecharge ( sr , PRI_REVERSECHARGE_REQUESTED ) ;
break ;
# endif
# if defined(HAVE_PRI_SETUP_KEYPAD)
case ' K ' :
/* Reserve this letter for keypad facility digits. */
break ;
# endif /* defined(HAVE_PRI_SETUP_KEYPAD) */
default :
default :
if ( isalpha ( c [ p - > stripmsd ] ) ) {
if ( isalpha ( c [ p - > stripmsd ] ) ) {
ast_log ( LOG_WARNING , " Unrecognized pridialplan %s modifier: %c \n " ,
ast_log ( LOG_WARNING , " Unrecognized pridialplan %s modifier: %c \n " ,
@ -3565,8 +3539,13 @@ int sig_pri_call(struct sig_pri_chan *p, struct ast_channel *ast, char *rdest, i
c + + ;
c + + ;
}
}
# if defined(HAVE_PRI_SETUP_KEYPAD)
# if defined(HAVE_PRI_SETUP_KEYPAD)
if ( keypad ) {
if ( ast_test_flag ( & opts , OPT_KEYPAD )
& & ! ast_strlen_zero ( opt_args [ OPT_ARG_KEYPAD ] ) ) {
/* We have a keypad facility digits option with digits. */
keypad = opt_args [ OPT_ARG_KEYPAD ] ;
pri_sr_set_keypad_digits ( sr , keypad ) ;
pri_sr_set_keypad_digits ( sr , keypad ) ;
} else {
keypad = NULL ;
}
}
if ( ! keypad | | ! ast_strlen_zero ( c + p - > stripmsd + dp_strip ) )
if ( ! keypad | | ! ast_strlen_zero ( c + p - > stripmsd + dp_strip ) )
# endif /* defined(HAVE_PRI_SETUP_KEYPAD) */
# endif /* defined(HAVE_PRI_SETUP_KEYPAD) */
@ -3584,6 +3563,12 @@ int sig_pri_call(struct sig_pri_chan *p, struct ast_channel *ast, char *rdest, i
}
}
# endif /* defined(HAVE_PRI_SUBADDR) */
# endif /* defined(HAVE_PRI_SUBADDR) */
# if defined(HAVE_PRI_REVERSE_CHARGE)
if ( ast_test_flag ( & opts , OPT_REVERSE_CHARGE ) ) {
pri_sr_set_reversecharge ( sr , PRI_REVERSECHARGE_REQUESTED ) ;
}
# endif /* defined(HAVE_PRI_REVERSE_CHARGE) */
ldp_strip = 0 ;
ldp_strip = 0 ;
prilocaldialplan = p - > pri - > localdialplan - 1 ;
prilocaldialplan = p - > pri - > localdialplan - 1 ;
if ( ( l ! = NULL ) & & ( prilocaldialplan = = - 2 | | prilocaldialplan = = - 3 ) ) { /* compute dynamically */
if ( ( l ! = NULL ) & & ( prilocaldialplan = = - 2 | | prilocaldialplan = = - 3 ) ) { /* compute dynamically */