#define ANNOUNCEPOSITION_MORE_THAN 3 /*!< We say "Currently there are more than <limit>" */
#define ANNOUNCEPOSITION_LIMIT 4 /*!< We not announce position more than \<limit\> */
+#define FORCELONGESTWAITINGCALLER_NO 0
+#define FORCELONGESTWAITINGCALLER_YES 1
+#define FORCELONGESTWAITINGCALLER_PRIO 2 /*!< Account for call priorities when forcing longest waiting caller */
+
struct call_queue {
AST_DECLARE_STRING_FIELDS(
/*! Queue name */
* will be unused until the first caller is picked up.
*/
if (!ch->pending) {
- if (ch->start < caller->start) {
+ if (ch->prio != caller->prio && force_longest_waiting_caller == FORCELONGESTWAITINGCALLER_PRIO) {
+ if (ch->prio > caller->prio) { /* This queue has a caller with higher priority. */
+ ast_debug(1, "Queue %s has a call at position %i that's higher priority (%d vs %d)\n",
+ q->name, ch->pos, ch->prio, caller->prio);
+ is_longest_waiting = 0;
+ }
+ } else if (ch->start < caller->start) {
ast_debug(1, "Queue %s has a call at position %i that's been waiting longer (%li vs %li)\n",
q->name, ch->pos, ch->start, caller->start);
is_longest_waiting = 0;
}
ch = ch->next;
}
+
+ ao2_ref(mem, -1);
}
}
ao2_unlock(q);
log_membername_as_agent = ast_true(general_val);
}
if ((general_val = ast_variable_retrieve(cfg, "general", "force_longest_waiting_caller"))) {
- force_longest_waiting_caller = ast_true(general_val);
+ if (!strcasecmp(general_val, "prio")) {
+ force_longest_waiting_caller = FORCELONGESTWAITINGCALLER_PRIO;
+ } else if (ast_true(general_val)) {
+ force_longest_waiting_caller = FORCELONGESTWAITINGCALLER_YES;
+ } else {
+ force_longest_waiting_caller = FORCELONGESTWAITINGCALLER_NO;
+ }
}
if ((general_val = ast_variable_retrieve(cfg, "general", "log_unpause_on_reason_change"))) {
log_unpause_on_reason_change = ast_true(general_val);