--- asterisk/apps/app_meetme.c.original 2005-11-10 10:05:29.000000000 +0100 +++ asterisk/apps/app_meetme.c 2005-11-10 16:14:07.266659584 +0100 @@ -1,3 +1,4 @@ + /* * Asterisk -- An open source telephony toolkit. * @@ -818,6 +819,7 @@ char meetmesecs[30] = ""; char exitcontext[AST_MAX_CONTEXT] = ""; char recordingtmp[AST_MAX_EXTENSION] = ""; + char members[10] = ""; int dtmf; ZT_BUFFERINFO bi; char __buf[CONF_SIZE + AST_FRIENDLY_OFFSET]; @@ -883,6 +885,10 @@ user->adminflags = 0; user->talking = -1; conf->users++; + /* Update table */ + snprintf(members, sizeof(members), "%d", conf->users); + ast_update_realtime("meetme", "confno", conf->confno, "members", members , NULL); + ast_mutex_unlock(&conflock); if (confflags & CONFFLAG_EXIT_CONTEXT) { @@ -1558,6 +1564,9 @@ "Usernum: %d\r\n", chan->name, chan->uniqueid, conf->confno, user->user_no); conf->users--; + /* Update table */ + snprintf(members, sizeof(members), "%d", conf->users); + ast_update_realtime("meetme", "confno", conf->confno, "members", members, NULL); if (confflags & CONFFLAG_MARKEDUSER) conf->markedusers--; if (!conf->users) { @@ -1602,6 +1611,62 @@ return ret; } +/* + This function looks for a conference via the RealTime module +*/ +static struct ast_conference *find_conf_realtime(struct ast_channel *chan, char *confno, int make, int dynamic, char *dynamic_pin) +{ + + struct ast_variable *var; + struct ast_conference *cnf = NULL; + + /* Check first in the conference list */ + ast_mutex_lock(&conflock); + cnf = confs; + while (cnf) { + if (!strcmp(confno, cnf->confno)) + break; + cnf = cnf->next; + } + ast_mutex_unlock(&conflock); + + if (!cnf) { + cnf = malloc(sizeof(struct ast_conference)); + char *pin = NULL, *pinadmin = NULL; /* For temp use */ + if (cnf) { + memset(cnf, 0, sizeof(struct ast_conference)); + var = ast_load_realtime("meetme", "confno", confno, NULL); + while(var) { + if (!strcasecmp(var->name, "confno")) + ast_copy_string(cnf->confno, var->value, sizeof(cnf->confno)); + if (!strcasecmp(var->name, "pin")) { + pin = (char*)malloc(strlen(var->value+1)); + ast_copy_string(pin, var->value, sizeof(pin)); + } + if (!strcasecmp(var->name, "adminpin")) { + pinadmin = (char*)malloc(strlen(var->value+1)); + ast_copy_string(pinadmin, var->value, sizeof(pinadmin)); + } + var = var->next; + } + if (pin) { + if (pinadmin) + cnf = build_conf(confno, pin, pinadmin, make, dynamic); + else + cnf = build_conf(confno, pin, "", make, dynamic); + } else { + if (pinadmin) + cnf = build_conf(confno, "", pinadmin, make, dynamic); + else + cnf = build_conf(confno, "", "", make, dynamic); + } + } + } + + return cnf; +} + + static struct ast_conference *find_conf(struct ast_channel *chan, char *confno, int make, int dynamic, char *dynamic_pin) { struct ast_config *cfg; @@ -1893,6 +1958,9 @@ /* Check the validity of the conference */ cnf = find_conf(chan, confno, 1, dynamic, the_pin); if (!cnf) { + cnf = find_conf_realtime(chan, confno, 1, dynamic, the_pin); + } + if (!cnf) { res = ast_streamfile(chan, "conf-invalid", chan->language); if (!res) ast_waitstream(chan, "");