@ -2991,6 +2991,7 @@ struct queue_transfer_ds {
struct queue_ent * qe ;
struct member * member ;
int starttime ;
int callcompletedinsl ;
} ;
static void queue_transfer_destroy ( void * data )
@ -3022,11 +3023,14 @@ static void queue_transfer_fixup(void *data, struct ast_channel *old_chan, struc
struct queue_ent * qe = qtds - > qe ;
struct member * member = qtds - > member ;
int callstart = qtds - > starttime ;
int callcompletedinsl = qtds - > callcompletedinsl ;
struct ast_datastore * datastore ;
ast_queue_log ( qe - > parent - > name , qe - > chan - > uniqueid , member - > membername , " TRANSFER " , " %s|%s|%ld|%ld|%d " ,
new_chan - > exten , new_chan - > context , ( long ) ( callstart - qe - > start ) ,
( long ) ( time ( NULL ) - callstart ) , qe - > opos ) ;
update_queue ( qe - > parent , member , callcompletedinsl ) ;
if ( ! ( datastore = ast_channel_datastore_find ( new_chan , & queue_transfer_info , NULL ) ) ) {
ast_log ( LOG_WARNING , " Can't find the queue_transfer datastore. \n " ) ;
@ -3050,7 +3054,7 @@ static int attended_transfer_occurred(struct ast_channel *chan)
/*! \brief create a datastore for storing relevant info to log attended transfers in the queue_log
*/
static void setup_transfer_datastore ( struct queue_ent * qe , struct member * member , int starttime )
static void setup_transfer_datastore ( struct queue_ent * qe , struct member * member , int starttime , int callcompletedinsl )
{
struct ast_datastore * ds ;
struct queue_transfer_ds * qtds = ast_calloc ( 1 , sizeof ( * qtds ) ) ;
@ -3071,6 +3075,7 @@ static void setup_transfer_datastore(struct queue_ent *qe, struct member *member
/* This member is refcounted in try_calling, so no need to add it here, too */
qtds - > member = member ;
qtds - > starttime = starttime ;
qtds - > callcompletedinsl = callcompletedinsl ;
ds - > data = qtds ;
ast_channel_datastore_add ( qe - > chan , ds ) ;
ast_channel_unlock ( qe - > chan ) ;
@ -3746,7 +3751,7 @@ static int try_calling(struct queue_ent *qe, const char *options, char *announce
ast_copy_string ( oldcontext , qe - > chan - > context , sizeof ( oldcontext ) ) ;
ast_copy_string ( oldexten , qe - > chan - > exten , sizeof ( oldexten ) ) ;
time ( & callstart ) ;
setup_transfer_datastore ( qe , member , callstart );
setup_transfer_datastore ( qe , member , callstart , callcompletedinsl );
bridge = ast_bridge_call ( qe - > chan , peer , & bridge_config ) ;
/* If the queue member did an attended transfer, then the TRANSFER already was logged in the queue_log
@ -3775,11 +3780,11 @@ static int try_calling(struct queue_ent *qe, const char *options, char *announce
ast_datastore_free ( transfer_ds ) ;
}
ast_channel_unlock ( qe - > chan ) ;
update_queue ( qe - > parent , member , callcompletedinsl ) ;
}
if ( bridge ! = AST_PBX_NO_HANGUP_PEER )
ast_hangup ( peer ) ;
update_queue ( qe - > parent , member , callcompletedinsl ) ;
res = bridge ? bridge : 1 ;
ao2_ref ( member , - 1 ) ;
}