@ -339,16 +339,17 @@ static int setup_park_common_datastore(struct ast_channel *parkee, const char *p
ast_datastore_free ( datastore ) ;
ast_datastore_free ( datastore ) ;
return - 1 ;
return - 1 ;
}
}
datastore - > data = park_datastore ;
if ( parker_uuid ) {
park_datastore - > parker_uuid = ast_strdup ( parker_uuid ) ;
park_datastore - > parker_uuid = ast_strdup ( parker_uuid ) ;
if ( ! park_datastore - > parker_uuid ) {
ast_datastore_free ( datastore ) ;
return - 1 ;
}
}
ast_channel_lock ( parkee ) ;
ast_channel_lock ( parkee ) ;
attended_transfer = pbx_builtin_getvar_helper ( parkee , " ATTENDEDTRANSFER " ) ;
attended_transfer = pbx_builtin_getvar_helper ( parkee , " ATTENDEDTRANSFER " ) ;
blind_transfer = pbx_builtin_getvar_helper ( parkee , " BLINDTRANSFER " ) ;
blind_transfer = pbx_builtin_getvar_helper ( parkee , " BLINDTRANSFER " ) ;
if ( ! ast_strlen_zero ( attended_transfer ) ) {
if ( ! ast_strlen_zero ( attended_transfer ) ) {
parker_dial_string = ast_strdupa ( attended_transfer ) ;
parker_dial_string = ast_strdupa ( attended_transfer ) ;
} else if ( ! ast_strlen_zero ( blind_transfer ) ) {
} else if ( ! ast_strlen_zero ( blind_transfer ) ) {
@ -356,7 +357,6 @@ static int setup_park_common_datastore(struct ast_channel *parkee, const char *p
/* Ensure that attended_transfer is NULL and not an empty string. */
/* Ensure that attended_transfer is NULL and not an empty string. */
attended_transfer = NULL ;
attended_transfer = NULL ;
}
}
ast_channel_unlock ( parkee ) ;
ast_channel_unlock ( parkee ) ;
if ( ! ast_strlen_zero ( parker_dial_string ) ) {
if ( ! ast_strlen_zero ( parker_dial_string ) ) {
@ -365,6 +365,10 @@ static int setup_park_common_datastore(struct ast_channel *parkee, const char *p
parker_dial_string ,
parker_dial_string ,
attended_transfer ? " ATTENDEDTRANSFER " : " BLINDTRANSFER " ) ;
attended_transfer ? " ATTENDEDTRANSFER " : " BLINDTRANSFER " ) ;
park_datastore - > parker_dial_string = ast_strdup ( parker_dial_string ) ;
park_datastore - > parker_dial_string = ast_strdup ( parker_dial_string ) ;
if ( ! park_datastore - > parker_dial_string ) {
ast_datastore_free ( datastore ) ;
return - 1 ;
}
}
}
park_datastore - > randomize = randomize ;
park_datastore - > randomize = randomize ;
@ -373,10 +377,13 @@ static int setup_park_common_datastore(struct ast_channel *parkee, const char *p
if ( comeback_override ) {
if ( comeback_override ) {
park_datastore - > comeback_override = ast_strdup ( comeback_override ) ;
park_datastore - > comeback_override = ast_strdup ( comeback_override ) ;
if ( ! park_datastore - > comeback_override ) {
ast_datastore_free ( datastore ) ;
return - 1 ;
}
}
}
datastore - > data = park_datastore ;
ast_channel_lock ( parkee ) ;
ast_channel_lock ( parkee ) ;
ast_channel_datastore_add ( parkee , datastore ) ;
ast_channel_datastore_add ( parkee , datastore ) ;
ast_channel_unlock ( parkee ) ;
ast_channel_unlock ( parkee ) ;
@ -391,23 +398,23 @@ struct park_common_datastore *get_park_common_datastore_copy(struct ast_channel
struct park_common_datastore * data_copy ;
struct park_common_datastore * data_copy ;
SCOPED_CHANNELLOCK ( lock , parkee ) ;
SCOPED_CHANNELLOCK ( lock , parkee ) ;
if ( ! ( datastore = ast_channel_datastore_find ( parkee , & park_common_info , NULL ) ) ) {
if ( ! ( datastore = ast_channel_datastore_find ( parkee , & park_common_info , NULL ) ) ) {
return NULL ;
return NULL ;
}
}
data = datastore - > data ;
data = datastore - > data ;
if ( ! data ) {
/* This data should always be populated if this datastore was appended to the channel */
/* This data should always be populated if this datastore was appended to the channel */
ast_assert ( data ! = NULL ) ;
ast_assert ( 0 ) ;
}
data_copy = ast_calloc ( 1 , sizeof ( * data_copy ) ) ;
data_copy = ast_calloc ( 1 , sizeof ( * data_copy ) ) ;
if ( ! data_copy ) {
if ( ! data_copy ) {
return NULL ;
return NULL ;
}
}
if ( ! ( data_copy - > parker_uuid = ast_strdup ( data - > parker_uuid ) ) ) {
data_copy - > parker_uuid = ast_strdup ( data - > parker_uuid ) ;
if ( ! data_copy - > parker_uuid ) {
park_common_datastore_free ( data_copy ) ;
park_common_datastore_free ( data_copy ) ;
return NULL ;
return NULL ;
}
}
@ -457,7 +464,6 @@ struct ast_bridge *park_common_setup(struct ast_channel *parkee, struct ast_chan
if ( ! lot ) {
if ( ! lot ) {
lot = parking_create_dynamic_lot ( lot_name , parkee ) ;
lot = parking_create_dynamic_lot ( lot_name , parkee ) ;
}
}
if ( ! lot ) {
if ( ! lot ) {
ast_log ( LOG_ERROR , " Could not find parking lot: '%s' \n " , lot_name ) ;
ast_log ( LOG_ERROR , " Could not find parking lot: '%s' \n " , lot_name ) ;
return NULL ;
return NULL ;
@ -504,7 +510,7 @@ static int park_app_exec(struct ast_channel *chan, const char *data)
struct ast_bridge_features chan_features ;
struct ast_bridge_features chan_features ;
int res ;
int res ;
int silence_announcements = 0 ;
int silence_announcements = 0 ;
const char * transfer er;
int blind_transf er;
/* Answer the channel if needed */
/* Answer the channel if needed */
if ( ast_channel_state ( chan ) ! = AST_STATE_UP ) {
if ( ast_channel_state ( chan ) ! = AST_STATE_UP ) {
@ -512,15 +518,12 @@ static int park_app_exec(struct ast_channel *chan, const char *data)
}
}
ast_channel_lock ( chan ) ;
ast_channel_lock ( chan ) ;
if ( ! ( transferer = pbx_builtin_getvar_helper ( chan , " ATTENDEDTRANSFER " ) ) ) {
blind_transfer = ! ast_strlen_zero ( pbx_builtin_getvar_helper ( chan , " BLINDTRANSFER " ) ) ;
transferer = pbx_builtin_getvar_helper ( chan , " BLINDTRANSFER " ) ;
}
transferer = ast_strdupa ( S_OR ( transferer , " " ) ) ;
ast_channel_unlock ( chan ) ;
ast_channel_unlock ( chan ) ;
/* Handle the common parking setup stuff */
/* Handle the common parking setup stuff */
if ( ! ( parking_bridge = park_application_setup ( chan , NULL , data , & silence_announcements ) ) ) {
if ( ! ( parking_bridge = park_application_setup ( chan , NULL , data , & silence_announcements ) ) ) {
if ( ! silence_announcements & & ! transfer er) {
if ( ! silence_announcements & & ! blind_ transfer) {
ast_stream_and_wait ( chan , " pbx-parkingfailed " , " " ) ;
ast_stream_and_wait ( chan , " pbx-parkingfailed " , " " ) ;
}
}
publish_parked_call_failure ( chan ) ;
publish_parked_call_failure ( chan ) ;
@ -593,7 +596,6 @@ static int parked_call_app_exec(struct ast_channel *chan, const char *data)
}
}
lot = parking_lot_find_by_name ( lot_name ) ;
lot = parking_lot_find_by_name ( lot_name ) ;
if ( ! lot ) {
if ( ! lot ) {
ast_log ( LOG_ERROR , " Could not find the requested parking lot \n " ) ;
ast_log ( LOG_ERROR , " Could not find the requested parking lot \n " ) ;
ast_stream_and_wait ( chan , " pbx-invalidpark " , " " ) ;
ast_stream_and_wait ( chan , " pbx-invalidpark " , " " ) ;