@ -3436,7 +3436,7 @@ bailoutandtrynormal:
}
static struct ast_conference * find_conf_realtime ( struct ast_channel * chan , char * confno , int make , int dynamic ,
char * dynamic_pin , size_t pin_buf_len , int refcount , struct ast_flags * confflags , int * too_early )
char * dynamic_pin , size_t pin_buf_len , int refcount , struct ast_flags * confflags , int * too_early , char * * optargs )
{
struct ast_variable * var , * origvar ;
struct ast_conference * cnf ;
@ -3446,8 +3446,9 @@ static struct ast_conference *find_conf_realtime(struct ast_channel *chan, char
/* Check first in the conference list */
AST_LIST_LOCK ( & confs ) ;
AST_LIST_TRAVERSE ( & confs , cnf , list ) {
if ( ! strcmp ( confno , cnf - > confno ) )
if ( ! strcmp ( confno , cnf - > confno ) ) {
break ;
}
}
if ( cnf ) {
cnf - > refcount + = refcount ;
@ -3510,13 +3511,15 @@ static struct ast_conference *find_conf_realtime(struct ast_channel *chan, char
var = ast_load_realtime ( " meetme " , " confno " , confno , NULL ) ;
}
if ( ! var )
if ( ! var ) {
return NULL ;
}
if ( rt_schedule & & * too_early ) {
/* Announce that the caller is early and exit */
if ( ! ast_streamfile ( chan , " conf-has-not-started " , chan - > language ) )
if ( ! ast_streamfile ( chan , " conf-has-not-started " , chan - > language ) ) {
ast_waitstream ( chan , " " ) ;
}
ast_variables_destroy ( var ) ;
return NULL ;
}
@ -3550,6 +3553,8 @@ static struct ast_conference *find_conf_realtime(struct ast_channel *chan, char
cnf = build_conf ( confno , pin ? pin : " " , pinadmin ? pinadmin : " " , make , dynamic , refcount , chan ) ;
if ( cnf ) {
struct ast_flags tmp_flags ;
cnf - > maxusers = maxusers ;
cnf - > endalert = endalert ;
cnf - > endtime = endtime . tv_sec ;
@ -3559,6 +3564,11 @@ static struct ast_conference *find_conf_realtime(struct ast_channel *chan, char
cnf - > recordingfilename = ast_strdup ( recordingfilename ) ;
cnf - > recordingformat = ast_strdup ( recordingformat ) ;
/* Parse the other options into confflags -- need to do this in two
* steps , because the parse_options routine zeroes the buffer . */
ast_app_parse_options ( meetme_opts , & tmp_flags , optargs , useropts ) ;
ast_copy_flags ( confflags , & tmp_flags , tmp_flags . flags ) ;
if ( strchr ( cnf - > useropts , ' r ' ) ) {
if ( ast_strlen_zero ( recordingfilename ) ) { /* If the recordingfilename in the database is empty, use the channel definition or use the default. */
ast_channel_lock ( chan ) ;
@ -3597,7 +3607,7 @@ static struct ast_conference *find_conf_realtime(struct ast_channel *chan, char
ast_log ( LOG_WARNING , " No DAHDI channel available for conference, user introduction disabled (is chan_dahdi loaded?) \n " ) ;
ast_clear_flag ( confflags , CONFFLAG_INTROUSER | CONFFLAG_INTROUSERNOREVIEW ) ;
}
if ( confflags & & ! cnf - > chan & &
ast_test_flag ( confflags , CONFFLAG_RECORDCONF ) ) {
ast_log ( LOG_WARNING , " No DAHDI channel available for conference, conference recording disabled (is chan_dahdi loaded?) \n " ) ;
@ -3853,7 +3863,6 @@ static int conf_exec(struct ast_channel *chan, void *data)
*/
ast_copy_string ( confno , confno_tmp , sizeof ( confno ) ) ;
break ;
/* XXX the map is not complete (but we do have a confno) */
}
}
}
@ -3862,6 +3871,42 @@ static int conf_exec(struct ast_channel *chan, void *data)
}
ast_config_destroy ( cfg ) ;
}
if ( ast_strlen_zero ( confno ) & & ( cfg = ast_load_realtime_multientry ( " meetme " , " confno LIKE " , " % " , SENTINEL ) ) ) {
const char * catg ;
for ( catg = ast_category_browse ( cfg , NULL ) ; catg ; catg = ast_category_browse ( cfg , catg ) ) {
const char * confno_tmp = ast_variable_retrieve ( cfg , catg , " confno " ) ;
const char * pin_tmp = ast_variable_retrieve ( cfg , catg , " pin " ) ;
if ( ast_strlen_zero ( confno_tmp ) ) {
continue ;
}
if ( ! dynamic ) {
int found = 0 ;
/* For static: run through the list and see if this conference is empty */
AST_LIST_LOCK ( & confs ) ;
AST_LIST_TRAVERSE ( & confs , cnf , list ) {
if ( ! strcmp ( confno_tmp , cnf - > confno ) ) {
/* The conference exists, therefore it's not empty */
found = 1 ;
break ;
}
}
AST_LIST_UNLOCK ( & confs ) ;
if ( ! found ) {
/* At this point, we have a confno_tmp (realtime conference) that is empty */
if ( ( empty_no_pin & & ast_strlen_zero ( pin_tmp ) ) | | ( ! empty_no_pin ) ) {
/* Case 1: empty_no_pin and pin is nonexistent (NULL)
* Case 2 : empty_no_pin and pin is blank ( but not NULL )
* Case 3 : not empty_no_pin
*/
ast_copy_string ( confno , confno_tmp , sizeof ( confno ) ) ;
break ;
}
}
}
}
ast_config_destroy ( cfg ) ;
}
}
/* Select first conference number not in use */
@ -3915,7 +3960,7 @@ static int conf_exec(struct ast_channel *chan, void *data)
int too_early = 0 ;
cnf = find_conf_realtime ( chan , confno , 1 , dynamic ,
the_pin , sizeof ( the_pin ) , 1 , & confflags , & too_early ) ;
the_pin , sizeof ( the_pin ) , 1 , & confflags , & too_early , optargs ) ;
if ( rt_schedule & & too_early )
allowretry = 0 ;
}