summaryrefslogtreecommitdiff
path: root/apps
diff options
context:
space:
mode:
authorMark Spencer <markster@digium.com>2004-06-28 22:10:50 +0000
committerMark Spencer <markster@digium.com>2004-06-28 22:10:50 +0000
commit5fec7176e07c9688a5e87ecba5340d70184c56b4 (patch)
tree38afeac6f1dc73d459a94664706eca0627d6314f /apps
parenta11c4965b718af6504ea3e6613b03fd0d49e5f11 (diff)
Merge Tilghman's meetme updates (bug #1934)
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@3334 65c4cc65-6c06-0410-ace0-fbb531ad65f3
Diffstat (limited to 'apps')
-rwxr-xr-xapps/app_meetme.c343
1 files changed, 178 insertions, 165 deletions
diff --git a/apps/app_meetme.c b/apps/app_meetme.c
index c3b0d8c99..ae76c3a22 100755
--- a/apps/app_meetme.c
+++ b/apps/app_meetme.c
@@ -541,7 +541,8 @@ static int conf_run(struct ast_channel *chan, struct ast_conference *conf, int c
user->nextuser = NULL;
if (conf->lastuser->nextuser != NULL) {
ast_log(LOG_WARNING, "Error in User Management!\n");
- goto outrun;
+ ast_mutex_unlock(&conflock);
+ goto outrun;
} else {
conf->lastuser->nextuser = user;
conf->lastuser = user;
@@ -784,151 +785,150 @@ zapretry:
}
}
- if (c) {
- if (c->fds[0] != origfd) {
- if (using_pseudo) {
- /* Kill old pseudo */
- close(fd);
+ if (c) {
+ if (c->fds[0] != origfd) {
+ if (using_pseudo) {
+ /* Kill old pseudo */
+ close(fd);
+ }
+ ast_log(LOG_DEBUG, "Ooh, something swapped out under us, starting over\n");
+ retryzap = 0;
+ using_pseudo = 0;
+ goto zapretry;
}
- ast_log(LOG_DEBUG, "Ooh, something swapped out under us, starting over\n");
- retryzap = 0;
- using_pseudo = 0;
- goto zapretry;
- }
- f = ast_read(c);
- if (!f)
- break;
- if ((f->frametype == AST_FRAME_DTMF) && (f->subclass == '#') && (confflags & CONFFLAG_POUNDEXIT)) {
- ret = 0;
- break;
+ f = ast_read(c);
+ if (!f)
+ break;
+ if ((f->frametype == AST_FRAME_DTMF) && (f->subclass == '#') && (confflags & CONFFLAG_POUNDEXIT)) {
+ ret = 0;
+ break;
} else if (((f->frametype == AST_FRAME_DTMF) && (f->subclass == '*') && (confflags & CONFFLAG_STARMENU)) || ((f->frametype == AST_FRAME_DTMF) && menu_active)) {
- if (musiconhold) {
- ast_moh_stop(chan);
- }
- if ((confflags & CONFFLAG_ADMIN)) {
- /* Admin menu */
- if (!menu_active) {
- menu_active = 1;
- /* Record this sound! */
- if (!ast_streamfile(chan, "conf-adminmenu", chan->language))
- ast_waitstream(chan, "");
- } else {
- switch(f->subclass - 48) {
- case 1: /* Un/Mute */
- menu_active = 0;
- if (ztc.confmode & ZT_CONF_TALKER) {
- ztc.confmode = ZT_CONF_CONF | ZT_CONF_LISTENER;
- confflags |= CONFFLAG_MONITOR ^ CONFFLAG_TALKER;
- } else {
- ztc.confmode = ZT_CONF_CONF | ZT_CONF_TALKER | ZT_CONF_LISTENER;
- confflags ^= CONFFLAG_MONITOR | CONFFLAG_TALKER;
- }
- if (ioctl(fd, ZT_SETCONF, &ztc)) {
- ast_log(LOG_WARNING, "Error setting conference - Un/Mute \n");
- ret = -1;
- break;
- }
- if (ztc.confmode & ZT_CONF_TALKER) {
- if (!ast_streamfile(chan, "conf-unmuted", chan->language))
- ast_waitstream(chan, "");
- } else {
- if (!ast_streamfile(chan, "conf-muted", chan->language))
- ast_waitstream(chan, "");
- }
- break;
- case 2: /* Un/Lock the Conference */
- menu_active = 0;
- if (conf->locked) {
- conf->locked = 0;
- if (!ast_streamfile(chan, "conf-unlockednow", chan->language))
- ast_waitstream(chan, "");
- } else {
- conf->locked = 1;
- if (!ast_streamfile(chan, "conf-lockednow", chan->language))
- ast_waitstream(chan, "");
+ if (musiconhold) {
+ ast_moh_stop(chan);
}
-
+ if ((confflags & CONFFLAG_ADMIN)) {
+ /* Admin menu */
+ if (!menu_active) {
+ menu_active = 1;
+ /* Record this sound! */
+ if (!ast_streamfile(chan, "conf-adminmenu", chan->language))
+ ast_waitstream(chan, "");
+ } else {
+ switch(f->subclass - 48) {
+ case 1: /* Un/Mute */
+ menu_active = 0;
+ if (ztc.confmode & ZT_CONF_TALKER) {
+ ztc.confmode = ZT_CONF_CONF | ZT_CONF_LISTENER;
+ confflags |= CONFFLAG_MONITOR ^ CONFFLAG_TALKER;
+ } else {
+ ztc.confmode = ZT_CONF_CONF | ZT_CONF_TALKER | ZT_CONF_LISTENER;
+ confflags ^= CONFFLAG_MONITOR | CONFFLAG_TALKER;
+ }
+ if (ioctl(fd, ZT_SETCONF, &ztc)) {
+ ast_log(LOG_WARNING, "Error setting conference - Un/Mute \n");
+ ret = -1;
break;
- default:
- menu_active = 0;
- /* Play an error message! */
- if (!ast_streamfile(chan, "conf-errormenu", chan->language))
+ }
+ if (ztc.confmode & ZT_CONF_TALKER) {
+ if (!ast_streamfile(chan, "conf-unmuted", chan->language))
ast_waitstream(chan, "");
- break;
- }
+ } else {
+ if (!ast_streamfile(chan, "conf-muted", chan->language))
+ ast_waitstream(chan, "");
+ }
+ break;
+ case 2: /* Un/Lock the Conference */
+ menu_active = 0;
+ if (conf->locked) {
+ conf->locked = 0;
+ if (!ast_streamfile(chan, "conf-unlockednow", chan->language))
+ ast_waitstream(chan, "");
+ } else {
+ conf->locked = 1;
+ if (!ast_streamfile(chan, "conf-lockednow", chan->language))
+ ast_waitstream(chan, "");
+ }
+ break;
+ default:
+ menu_active = 0;
+ /* Play an error message! */
+ if (!ast_streamfile(chan, "conf-errormenu", chan->language))
+ ast_waitstream(chan, "");
+ break;
}
+ }
+ } else {
+ /* User menu */
+ if (!menu_active) {
+ menu_active = 1;
+ /* Record this sound! */
+ if (!ast_streamfile(chan, "conf-usermenu", chan->language))
+ ast_waitstream(chan, "");
} else {
- /* User menu */
- if (!menu_active) {
- menu_active = 1;
- /* Record this sound! */
- if (!ast_streamfile(chan, "conf-usermenu", chan->language))
- ast_waitstream(chan, "");
- } else {
- switch(f->subclass - 48) {
- case 1: /* Un/Mute */
- menu_active = 0;
- if (ztc.confmode & ZT_CONF_TALKER) {
- ztc.confmode = ZT_CONF_CONF | ZT_CONF_LISTENER;
- confflags |= CONFFLAG_MONITOR ^ CONFFLAG_TALKER;
- } else if (!(user->adminflags & ADMINFLAG_MUTED)) {
- ztc.confmode = ZT_CONF_CONF | ZT_CONF_TALKER | ZT_CONF_LISTENER;
- confflags ^= CONFFLAG_MONITOR | CONFFLAG_TALKER;
- }
- if (ioctl(fd, ZT_SETCONF, &ztc)) {
- ast_log(LOG_WARNING, "Error setting conference - Un/Mute \n");
- ret = -1;
- break;
- }
- if (ztc.confmode & ZT_CONF_TALKER) {
- if (!ast_streamfile(chan, "conf-unmuted", chan->language))
- ast_waitstream(chan, "");
- } else {
- if (!ast_streamfile(chan, "conf-muted", chan->language))
- ast_waitstream(chan, "");
- }
+ switch(f->subclass - 48) {
+ case 1: /* Un/Mute */
+ menu_active = 0;
+ if (ztc.confmode & ZT_CONF_TALKER) {
+ ztc.confmode = ZT_CONF_CONF | ZT_CONF_LISTENER;
+ confflags |= CONFFLAG_MONITOR ^ CONFFLAG_TALKER;
+ } else if (!(user->adminflags & ADMINFLAG_MUTED)) {
+ ztc.confmode = ZT_CONF_CONF | ZT_CONF_TALKER | ZT_CONF_LISTENER;
+ confflags ^= CONFFLAG_MONITOR | CONFFLAG_TALKER;
+ }
+ if (ioctl(fd, ZT_SETCONF, &ztc)) {
+ ast_log(LOG_WARNING, "Error setting conference - Un/Mute \n");
+ ret = -1;
break;
- default:
- menu_active = 0;
- /* Play an error message! */
- if (!ast_streamfile(chan, "errormenu", chan->language))
+ }
+ if (ztc.confmode & ZT_CONF_TALKER) {
+ if (!ast_streamfile(chan, "conf-unmuted", chan->language))
ast_waitstream(chan, "");
- break;
- }
+ } else {
+ if (!ast_streamfile(chan, "conf-muted", chan->language))
+ ast_waitstream(chan, "");
+ }
+ break;
+ default:
+ menu_active = 0;
+ /* Play an error message! */
+ if (!ast_streamfile(chan, "errormenu", chan->language))
+ ast_waitstream(chan, "");
+ break;
}
}
- if (musiconhold) {
- ast_moh_start(chan, NULL);
- }
- } else if (using_pseudo) {
- if (f->frametype == AST_FRAME_VOICE) {
- if (f->subclass == AST_FORMAT_SLINEAR) {
- /* Carefully write */
- careful_write(fd, f->data, f->datalen);
- } else
- ast_log(LOG_WARNING, "Huh? Got a non-linear (%d) frame in the conference\n", f->subclass);
+ }
+ if (musiconhold) {
+ ast_moh_start(chan, NULL);
+ }
+ } else if (using_pseudo) {
+ if (f->frametype == AST_FRAME_VOICE) {
+ if (f->subclass == AST_FORMAT_SLINEAR) {
+ /* Carefully write */
+ careful_write(fd, f->data, f->datalen);
+ } else
+ ast_log(LOG_WARNING, "Huh? Got a non-linear (%d) frame in the conference\n", f->subclass);
+ }
}
+ ast_frfree(f);
+ } else if (outfd > -1) {
+ res = read(outfd, buf, CONF_SIZE);
+ if (res > 0) {
+ memset(&fr, 0, sizeof(fr));
+ fr.frametype = AST_FRAME_VOICE;
+ fr.subclass = AST_FORMAT_SLINEAR;
+ fr.datalen = res;
+ fr.samples = res/2;
+ fr.data = buf;
+ fr.offset = AST_FRIENDLY_OFFSET;
+ if (ast_write(chan, &fr) < 0) {
+ ast_log(LOG_WARNING, "Unable to write frame to channel: %s\n", strerror(errno));
+ /* break; */
+ }
+ } else
+ ast_log(LOG_WARNING, "Failed to read frame: %s\n", strerror(errno));
}
- ast_frfree(f);
- } else if (outfd > -1) {
- res = read(outfd, buf, CONF_SIZE);
- if (res > 0) {
- memset(&fr, 0, sizeof(fr));
- fr.frametype = AST_FRAME_VOICE;
- fr.subclass = AST_FORMAT_SLINEAR;
- fr.datalen = res;
- fr.samples = res/2;
- fr.data = buf;
- fr.offset = AST_FRIENDLY_OFFSET;
- if (ast_write(chan, &fr) < 0) {
- ast_log(LOG_WARNING, "Unable to write frame to channel: %s\n", strerror(errno));
- /* break; */
- }
- } else
- ast_log(LOG_WARNING, "Failed to read frame: %s\n", strerror(errno));
}
}
- }
if (using_pseudo)
close(fd);
else {
@@ -1216,52 +1216,63 @@ static int conf_exec(struct ast_channel *chan, void *data)
}
ast_mutex_unlock(&conflock);
- /* Disqualify static conferences with pins */
- cfg = ast_load("meetme.conf");
- if (cfg) {
- var = ast_variable_browse(cfg, "rooms");
- while(var) {
- if (!strcasecmp(var->name, "conf")) {
- char *stringp = ast_strdupa(var->value);
- if (stringp) {
- char *confno_tmp = strsep(&stringp, "|,");
- int found = 0;
- if (sscanf(confno_tmp, "%d", &confno_int) == 1) {
- if (confno_int >= 0 && confno_int < 1024) {
- if (stringp && empty_no_pin) {
- map[confno_int]++;
+ /* We only need to load the config file for static and empty_no_pin (otherwise we don't care) */
+ if ((empty_no_pin) || (!dynamic)) {
+ cfg = ast_load("meetme.conf");
+ if (cfg) {
+ var = ast_variable_browse(cfg, "rooms");
+ while(var) {
+ if (!strcasecmp(var->name, "conf")) {
+ char *stringp = ast_strdupa(var->value);
+ if (stringp) {
+ char *confno_tmp = strsep(&stringp, "|,");
+ int found = 0;
+ if (sscanf(confno_tmp, "%d", &confno_int) == 1) {
+ if ((confno_int >= 0) && (confno_int < 1024)) {
+ if (stringp && empty_no_pin) {
+ map[confno_int]++;
+ }
}
}
- }
- if (! dynamic) {
- /* For static: run through the list and see if this conference is empty */
- ast_mutex_lock(&conflock);
- cnf = confs;
- while (cnf) {
- if (!strcmp(confno_tmp, cnf->confno)) {
- found = 1;
- break;
+ if (! dynamic) {
+ /* For static: run through the list and see if this conference is empty */
+ ast_mutex_lock(&conflock);
+ cnf = confs;
+ while (cnf) {
+ if (!strcmp(confno_tmp, cnf->confno)) {
+ /* The conference exists, therefore it's not empty */
+ found = 1;
+ break;
+ }
+ cnf = cnf->next;
}
- }
- ast_mutex_unlock(&conflock);
- if (!found) {
- if ((empty_no_pin && (!stringp)) || (!empty_no_pin)) {
- strncpy(confno, confno_tmp, sizeof(confno) - 1);
- break;
+ ast_mutex_unlock(&conflock);
+ if (!found) {
+ /* At this point, we have a confno_tmp (static conference) that is empty */
+ if ((empty_no_pin && ((!stringp) || (stringp && (stringp[0] == '\0')))) || (!empty_no_pin)) {
+ /* Case 1: empty_no_pin and pin is nonexistant (NULL)
+ * Case 2: empty_no_pin and pin is blank (but not NULL)
+ * Case 3: not empty_no_pin
+ */
+ strncpy(confno, confno_tmp, sizeof(confno) - 1);
+ break;
+ /* XXX the map is not complete (but we do have a confno) */
+ }
}
}
+ } else {
+ ast_log(LOG_ERROR, "Out of memory\n");
}
}
+ var = var->next;
}
- var = var->next;
+ ast_destroy(cfg);
}
- ast_destroy(cfg);
}
-
/* Select first conference number not in use */
- if (dynamic) {
+ if (ast_strlen_zero(confno) && dynamic) {
for (i=0;i<1024;i++) {
- if (dynamic && (!map[i])) {
+ if (!map[i]) {
snprintf(confno, sizeof(confno) - 1, "%d", i);
break;
}
@@ -1280,6 +1291,8 @@ static int conf_exec(struct ast_channel *chan, void *data)
ast_waitstream(chan, "");
res = ast_say_digits(chan, confno_int, "", chan->language);
}
+ } else {
+ ast_log(LOG_ERROR, "Could not scan confno '%s'\n", confno);
}
}
}