]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
Merged revisions 278463 via svnmerge from
authorTilghman Lesher <tilghman@meg.abyt.es>
Wed, 21 Jul 2010 15:58:20 +0000 (15:58 +0000)
committerTilghman Lesher <tilghman@meg.abyt.es>
Wed, 21 Jul 2010 15:58:20 +0000 (15:58 +0000)
https://origsvn.digium.com/svn/asterisk/trunk

........
  r278463 | tilghman | 2010-07-21 10:56:05 -0500 (Wed, 21 Jul 2010) | 11 lines

  Ensure realtime conferences are treated the same as static conferences when trying to find an empty one.

  Also, parse the useropts properly, when retrieving from realtime, and add them
  to the existing flags.

  (closes issue #17502)
   Reported by: kenji
   Patches:
         20100720__issue17502.diff.txt uploaded by tilghman (license 14)
   Tested by: kenji
........

git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/1.6.2@278464 65c4cc65-6c06-0410-ace0-fbb531ad65f3

apps/app_meetme.c

index e53bf2997dc4f759359e4551b26f644ec2364d95..4e490a0db79c2476b2c270abbc351cf6d0b0c162 100644 (file)
@@ -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;
                        }