--- app_meetme.c 2008-08-13 22:42:33.000000000 +0200 +++ app_meetmertk.c 2008-12-10 13:37:11.000000000 +0100 @@ -164,6 +164,9 @@ CONFFLAG_SLA_STATION = (1 << 26), /*! This is a SLA trunk. (Only for use by the SLA applications.) */ CONFFLAG_SLA_TRUNK = (1 << 27), + + /* If marked user exits, continue conference */ + CONFFLAG_CONTINUE_IF_MARKEDEXITS = (1 << 28), }; enum { @@ -198,6 +201,8 @@ AST_APP_OPTION('X', CONFFLAG_EXIT_CONTEXT ), AST_APP_OPTION('x', CONFFLAG_MARKEDEXIT ), AST_APP_OPTION('1', CONFFLAG_NOONLYPERSON ), + + AST_APP_OPTION('C', CONFFLAG_CONTINUE_IF_MARKEDEXITS ), END_OPTIONS ); static const char *app = "MeetMe"; @@ -342,6 +347,7 @@ struct ast_frame *transframe[32]; struct ast_frame *origframe; struct ast_trans_pvt *transpath[32]; + int ignoremarked; AST_LIST_HEAD_NOLOCK(, ast_conf_user) userlist; AST_LIST_ENTRY(ast_conference) list; }; @@ -1418,7 +1424,7 @@ return ret; /* Possible timeout waiting for marked user */ - if ((confflags & CONFFLAG_WAITMARKED) && + if (!conf->ignoremarked && (confflags & CONFFLAG_WAITMARKED) && !ast_strlen_zero(optargs[OPT_ARG_WAITMARKED]) && (sscanf(optargs[OPT_ARG_WAITMARKED], "%d", &opt_waitmarked_timeout) == 1) && (opt_waitmarked_timeout > 0)) { @@ -1537,7 +1543,7 @@ if (conf->users == 1 && !(confflags & CONFFLAG_WAITMARKED)) if (!ast_streamfile(chan, "conf-onlyperson", chan->language)) ast_waitstream(chan, ""); - if ((confflags & CONFFLAG_WAITMARKED) && conf->markedusers == 0) + if (!conf->ignoremarked && (confflags & CONFFLAG_WAITMARKED) && conf->markedusers == 0) if (!ast_streamfile(chan, "conf-waitforleader", chan->language)) ast_waitstream(chan, ""); } @@ -1677,7 +1683,7 @@ } } - if (confflags & CONFFLAG_WAITMARKED && !conf->markedusers) + if (!conf->ignoremarked && confflags & CONFFLAG_WAITMARKED && !conf->markedusers) ztc.confmode = DAHDI_CONF_CONF; else if (confflags & CONFFLAG_MONITOR) ztc.confmode = DAHDI_CONF_CONFMON | DAHDI_CONF_LISTENER; @@ -1772,6 +1778,7 @@ currentmarked = conf->markedusers; if (!(confflags & CONFFLAG_QUIET) && (confflags & CONFFLAG_MARKEDUSER) && + !conf->ignoremarked && (confflags & CONFFLAG_WAITMARKED) && lastmarked == 0) { if (currentmarked == 1 && conf->users > 1) { @@ -1794,8 +1801,8 @@ /* Update the struct with the actual confflags */ user->userflags = confflags; - - if (confflags & CONFFLAG_WAITMARKED) { + + if (!conf->ignoremarked && (confflags & CONFFLAG_WAITMARKED)) { if(currentmarked == 0) { if (lastmarked != 0) { if (!(confflags & CONFFLAG_QUIET)) @@ -1856,12 +1863,17 @@ } } } - + + if (currentmarked == 0 && lastmarked != 0 && (confflags & CONFFLAG_CONTINUE_IF_MARKEDEXITS)) { + conf->ignoremarked = 1; + } + else { /* Leave if the last marked user left */ if (currentmarked == 0 && lastmarked != 0 && (confflags & CONFFLAG_MARKEDEXIT)) { ret = -1; break; } + } /* Check if my modes have changed */ @@ -2310,8 +2322,9 @@ /* Update table */ snprintf(members, sizeof(members), "%d", conf->users); ast_update_realtime("meetme", "confno", conf->confno, "members", members, NULL); - if (confflags & CONFFLAG_MARKEDUSER) + if (confflags & CONFFLAG_MARKEDUSER) { conf->markedusers--; + } } /* Remove ourselves from the list */ AST_LIST_REMOVE(&conf->userlist, user, list);