@ -28,6 +28,7 @@
# include <asterisk/manager.h>
# include <asterisk/utils.h>
# include <asterisk/adsi.h>
# include <pthread.h>
# include <stdlib.h>
# include <errno.h>
# include <unistd.h>
@ -49,6 +50,9 @@ static int parkingtime = DEFAULT_PARK_TIME;
/* Context for which parking is made accessible */
static char parking_con [ AST_MAX_EXTENSION ] = " parkedcalls " ;
/* Context for dialback for parking (KLUDGE) */
static char parking_con_dial [ AST_MAX_EXTENSION ] = " park-dial " ;
/* Extension you type to park the call */
static char parking_ext [ AST_MAX_EXTENSION ] = " 700 " ;
@ -103,6 +107,7 @@ struct parkeduser {
int priority ;
int parkingtime ;
int notquiteyet ;
char peername [ 1024 ] ;
struct parkeduser * next ;
} ;
@ -152,6 +157,7 @@ int ast_park_call(struct ast_channel *chan, struct ast_channel *peer, int timeou
struct ast_context * con ;
pu = malloc ( sizeof ( struct parkeduser ) ) ;
if ( pu ) {
memset ( pu , 0 , sizeof ( struct parkeduser ) ) ;
ast_mutex_lock ( & parking_lock ) ;
for ( x = parking_start ; x < = parking_stop ; x + + ) {
cur = parkinglot ;
@ -179,6 +185,10 @@ int ast_park_call(struct ast_channel *chan, struct ast_channel *peer, int timeou
pu - > parkingtime = parkingtime ;
if ( extout )
* extout = x ;
if ( peer )
{
strncpy ( pu - > peername , peer - > name , sizeof ( pu - > peername ) - 1 ) ;
}
/* Remember what had been dialed, so that if the parking
expires , we try to come back to the same place */
if ( ! ast_strlen_zero ( chan - > macrocontext ) )
@ -196,7 +206,7 @@ int ast_park_call(struct ast_channel *chan, struct ast_channel *peer, int timeou
pu - > next = parkinglot ;
parkinglot = pu ;
/* If parking a channel directly, don't quiet yet get parking running on it */
if ( peer = = chan )
if ( peer = = chan )
pu - > notquiteyet = 1 ;
ast_mutex_unlock ( & parking_lock ) ;
/* Wake up the (presumably select()ing) thread */
@ -221,7 +231,6 @@ int ast_park_call(struct ast_channel *chan, struct ast_channel *peer, int timeou
if ( adsipark & & adsi_available ( peer ) ) {
adsi_announce_park ( peer , pu - > parkingnum ) ;
}
ast_say_digits ( peer , pu - > parkingnum , " " , peer - > language ) ;
if ( adsipark & & adsi_available ( peer ) ) {
adsi_unload_session ( peer ) ;
}
@ -243,6 +252,7 @@ int ast_park_call(struct ast_channel *chan, struct ast_channel *peer, int timeou
snprintf ( exten , sizeof ( exten ) , " %d " , x ) ;
ast_add_extension2 ( con , 1 , exten , 1 , NULL , NULL , parkedcall , strdup ( exten ) , free , registrar ) ;
}
if ( peer ) ast_say_digits ( peer , pu - > parkingnum , " " , peer - > language ) ;
return 0 ;
} else {
ast_log ( LOG_WARNING , " No more parking spaces \n " ) ;
@ -558,6 +568,7 @@ static void *do_parking_thread(void *ignore)
struct timeval tv ;
struct ast_frame * f ;
char exten [ AST_MAX_EXTENSION ] ;
char * peername , * cp ;
struct ast_context * con ;
int x ;
int gc = 0 ;
@ -565,13 +576,13 @@ static void *do_parking_thread(void *ignore)
fd_set nrfds , nefds ;
FD_ZERO ( & rfds ) ;
FD_ZERO ( & efds ) ;
for ( ; ; ) {
ms = - 1 ;
max = - 1 ;
ast_mutex_lock ( & parking_lock ) ;
pl = NULL ;
pu = parkinglot ;
gettimeofday ( & tv , NULL ) ;
FD_ZERO ( & nrfds ) ;
FD_ZERO ( & nefds ) ;
while ( pu ) {
@ -585,17 +596,40 @@ static void *do_parking_thread(void *ignore)
gc + + ;
ast_moh_start ( pu - > chan , NULL ) ;
}
gettimeofday ( & tv , NULL ) ;
tms = ( tv . tv_sec - pu - > start . tv_sec ) * 1000 + ( tv . tv_usec - pu - > start . tv_usec ) / 1000 ;
if ( tms > pu - > parkingtime ) {
/* They've been waiting too long, send them back to where they came. Theoretically they
should have their original extensions and such , but we copy to be on the safe side */
strncpy ( pu - > chan - > exten , pu - > exten , sizeof ( pu - > chan - > exten ) - 1 ) ;
strncpy ( pu - > chan - > context , pu - > context , sizeof ( pu - > chan - > context ) - 1 ) ;
pu - > chan - > priority = pu - > priority ;
if ( option_verbose > 1 )
ast_verbose ( VERBOSE_PREFIX_2 " Timeout for %s parked on %d. Returning to %s,%s,%d \n " , pu - > chan - > name , pu - > parkingnum , pu - > chan - > context , pu - > chan - > exten , pu - > chan - > priority ) ;
/* Stop music on hold */
ast_moh_stop ( pu - > chan ) ;
/* Get chan, exten from derived kludge */
if ( pu - > peername [ 0 ] )
{
peername = strdupa ( pu - > peername ) ;
cp = strrchr ( peername , ' - ' ) ;
if ( cp ) * cp = 0 ;
con = ast_context_find ( parking_con_dial ) ;
if ( ! con ) {
con = ast_context_create ( NULL , parking_con_dial , registrar ) ;
if ( ! con ) {
ast_log ( LOG_ERROR , " Parking dial context '%s' does not exist and unable to create \n " , parking_con_dial ) ;
}
}
if ( con ) {
ast_add_extension2 ( con , 1 , peername , 1 , NULL , NULL , " Dial " , strdup ( peername ) , free , registrar ) ;
}
strncpy ( pu - > chan - > exten , peername , sizeof ( pu - > chan - > exten ) - 1 ) ;
strncpy ( pu - > chan - > context , parking_con_dial , sizeof ( pu - > chan - > context ) - 1 ) ;
pu - > chan - > priority = 1 ;
} else {
/* They've been waiting too long, send them back to where they came. Theoretically they
should have their original extensions and such , but we copy to be on the safe side */
strncpy ( pu - > chan - > exten , pu - > exten , sizeof ( pu - > chan - > exten ) - 1 ) ;
strncpy ( pu - > chan - > context , pu - > context , sizeof ( pu - > chan - > context ) - 1 ) ;
pu - > chan - > priority = pu - > priority ;
}
if ( option_verbose > 1 )
ast_verbose ( VERBOSE_PREFIX_2 " Timeout for %s parked on %d. Returning to %s,%s,%d \n " , pu - > chan - > name , pu - > parkingnum , pu - > chan - > context , pu - > chan - > exten , pu - > chan - > priority ) ;
/* Start up the PBX, or hang them up */
if ( ast_pbx_start ( pu - > chan ) ) {
ast_log ( LOG_WARNING , " Unable to restart the PBX for user on '%s', hanging them up... \n " , pu - > chan - > name ) ;