@ -549,7 +549,7 @@ ASTERISK_REGISTER_FILE()
Count number of members answering a queue .
< / synopsis >
< syntax >
< parameter name = " queuename " required = " tru e" / >
< parameter name = " queuename " required = " fals e" / >
< parameter name = " option " required = " true " >
< enumlist >
< enum name = " logged " >
@ -565,13 +565,22 @@ ASTERISK_REGISTER_FILE()
< para > Returns the total number of members for the specified queue . < / para >
< / enum >
< enum name = " penalty " >
< para > Gets or sets queue member penalty . < / para >
< para > Gets or sets queue member penalty . If
< replaceable > queuename < / replaceable > is not specified
when setting the penalty then the penalty is set in all queues
the interface is a member . < / para >
< / enum >
< enum name = " paused " >
< para > Gets or sets queue member paused status . < / para >
< para > Gets or sets queue member paused status . If
< replaceable > queuename < / replaceable > is not specified
when setting the paused status then the paused status is set
in all queues the interface is a member . < / para >
< / enum >
< enum name = " ringinuse " >
< para > Gets or sets queue member ringinuse . < / para >
< para > Gets or sets queue member ringinuse . If
< replaceable > queuename < / replaceable > is not specified
when setting ringinuse then ringinuse is set
in all queues the interface is a member . < / para >
< / enum >
< / enumlist >
< / parameter >
@ -579,10 +588,8 @@ ASTERISK_REGISTER_FILE()
< / syntax >
< description >
< para > Allows access to queue counts [ R ] and member information [ R / W ] . < / para >
< para >
< replaceable > queuename < / replaceable > is required for all operations
< replaceable > interface < / replaceable > is required for all member operations .
< / para >
< para > < replaceable > queuename < / replaceable > is required for all read operations . < / para >
< para > < replaceable > interface < / replaceable > is required for all member operations . < / para >
< / description >
< see - also >
< ref type = " application " > Queue < / ref >
@ -8147,9 +8154,6 @@ static int queue_function_mem_read(struct ast_channel *chan, const char *cmd, ch
static int queue_function_mem_write ( struct ast_channel * chan , const char * cmd , char * data , const char * value )
{
int memvalue ;
struct call_queue * q ;
struct member * m ;
char rtvalue [ 80 ] ;
AST_DECLARE_APP_ARGS ( args ,
AST_APP_ARG ( queuename ) ;
@ -8158,65 +8162,48 @@ static int queue_function_mem_write(struct ast_channel *chan, const char *cmd, c
) ;
if ( ast_strlen_zero ( data ) ) {
ast_log ( LOG_ERROR , " Missing argument. QUEUE_MEMBER(<queuename>,<option>,<interface>) \n " ) ;
ast_log ( LOG_ERROR ,
" Missing required argument. %s([<queuename>],<option>,<interface>) \n " ,
cmd ) ;
return - 1 ;
}
AST_STANDARD_APP_ARGS ( args , data ) ;
if ( args . argc < 3 ) {
ast_log ( LOG_ERROR , " Missing argument. QUEUE_MEMBER_PENALTY(<queuename>,<interface>) \n " ) ;
if ( ast_strlen_zero ( args . option )
| | ast_strlen_zero ( args . interface ) ) {
ast_log ( LOG_ERROR ,
" Missing required argument. %s([<queuename>],<option>,<interface>) \n " ,
cmd ) ;
return - 1 ;
}
if ( ast_strlen_zero ( args . interface ) & & ast_strlen_zero ( args . option ) ) {
ast_log ( LOG_ERROR , " <interface> and <option> parameter's can't be null \n " ) ;
return - 1 ;
}
/*
* If queuename is empty then the option will be
* set for the interface in all queues .
*/
memvalue = atoi ( value ) ;
if ( ! strcasecmp ( args . option , " penalty " ) ) {
/* if queuename = NULL then penalty will be set for interface in all the queues.*/
if ( set_member_value ( args . queuename , args . interface , MEMBER_PENALTY , memvalue ) ) {
ast_log ( LOG_ERROR , " Invalid interface, queue or penalty\n " ) ;
ast_log ( LOG_ERROR , " Invalid interface, queue , or penalty\n " ) ;
return - 1 ;
}
} else if ( ( q = find_load_queue_rt_friendly ( args . queuename ) ) ) {
ao2_lock ( q ) ;
if ( ( m = interface_exists ( q , args . interface ) ) ) {
sprintf ( rtvalue , " %s " , ( memvalue < = 0 ) ? " 0 " : " 1 " ) ;
if ( ! strcasecmp ( args . option , " paused " ) ) {
if ( m - > realtime ) {
update_realtime_member_field ( m , q - > name , args . option , rtvalue ) ;
}
m - > paused = ( memvalue < = 0 ) ? 0 : 1 ;
ast_devstate_changed ( m - > paused ? QUEUE_PAUSED_DEVSTATE : QUEUE_UNPAUSED_DEVSTATE ,
AST_DEVSTATE_CACHABLE , " Queue:%s_pause_%s " , q - > name , args . interface ) ;
} else if ( ( ! strcasecmp ( args . option , " ignorebusy " ) ) | | ( ! strcasecmp ( args . option , " ringinuse " ) ) ) {
if ( m - > realtime ) {
update_realtime_member_field ( m , q - > name , args . option , rtvalue ) ;
}
m - > ringinuse = ( memvalue < = 0 ) ? 0 : 1 ;
} else {
ast_log ( LOG_ERROR , " Invalid option, only penalty , paused or ringinuse/ignorebusy are valid \n " ) ;
ao2_ref ( m , - 1 ) ;
ao2_unlock ( q ) ;
ao2_ref ( q , - 1 ) ;
return - 1 ;
}
ao2_ref ( m , - 1 ) ;
} else {
ao2_unlock ( q ) ;
ao2_ref ( q , - 1 ) ;
ast_log ( LOG_ERROR , " Invalid interface for queue \n " ) ;
} else if ( ! strcasecmp ( args . option , " paused " ) ) {
memvalue = ( memvalue < = 0 ) ? 0 : 1 ;
if ( set_member_paused ( args . queuename , args . interface , NULL , memvalue ) ) {
ast_log ( LOG_ERROR , " Invalid interface or queue \n " ) ;
return - 1 ;
}
ao2_unlock ( q ) ;
ao2_ref ( q , - 1 ) ;
} else {
ast_log ( LOG_ERROR , " Invalid queue \n " ) ;
} else if ( ! strcasecmp ( args . option , " ignorebusy " ) /* ignorebusy is legacy */
| | ! strcasecmp ( args . option , " ringinuse " ) ) {
memvalue = ( memvalue < = 0 ) ? 0 : 1 ;
if ( set_member_value ( args . queuename , args . interface , MEMBER_RINGINUSE , memvalue ) ) {
ast_log ( LOG_ERROR , " Invalid interface or queue \n " ) ;
return - 1 ;
}
} else {
ast_log ( LOG_ERROR , " %s: Invalid option '%s' provided. \n " , cmd , args . option ) ;
return - 1 ;
}
return 0 ;