--- ../clean/asterisk-1.6.2.17-rc2/apps/app_queue.c 2010-12-16 22:49:33.000000000 +0200 +++ apps/app_queue.c 2011-02-17 14:01:35.000000000 +0200 @@ -675,6 +675,7 @@ unsigned int dead:1; /*!< Used to detect members deleted in realtime */ unsigned int delme:1; /*!< Flag to delete entry on reload */ char rt_uniqueid[80]; /*!< Unique id of realtime member entry */ + unsigned int ignorebusy:1; /*!< Flag to ignore member if the status is not available */ }; enum empty_conditions { @@ -1590,13 +1600,21 @@ * Search for member in queue, if found update penalty/paused state, * if no member exists create one flag it as a RT member and add to queue member list. */ -static void rt_handle_member_record(struct call_queue *q, char *interface, const char *rt_uniqueid, const char *membername, const char *penalty_str, const char *paused_str, const char* state_interface) +static void rt_handle_member_record(struct call_queue *q, char *interface, struct ast_config *member_config) { struct member *m; struct ao2_iterator mem_iter; int penalty = 0; int paused = 0; int found = 0; + int ignorebusy = 0; + + const char *config_val; + const char *rt_uniqueid=ast_variable_retrieve(member_config, interface, "uniqueid"); + const char *membername=S_OR(ast_variable_retrieve(member_config, interface, "membername"),interface); + const char *state_interface=S_OR(ast_variable_retrieve(member_config, interface, "state_interface"),interface); + const char *penalty_str=ast_variable_retrieve(member_config, interface, "penalty"); + const char *paused_str=ast_variable_retrieve(member_config, interface, "paused"); if (ast_strlen_zero(rt_uniqueid)) { ast_log(LOG_WARNING, "Realtime field uniqueid is empty for member %s\n", S_OR(membername, "NULL")); @@ -1615,6 +1633,11 @@ paused = 0; } + if ((config_val = ast_variable_retrieve(member_config, interface, "ignorebusy"))) + ignorebusy=ast_true(config_val); + else + ignorebusy=1; + /* Find member by realtime uniqueid and update */ mem_iter = ao2_iterator_init(q->members, 0); while ((m = ao2_iterator_next(&mem_iter))) { @@ -1627,6 +1650,7 @@ ast_copy_string(m->state_interface, state_interface, sizeof(m->state_interface)); } m->penalty = penalty; + m->ignorebusy = ignorebusy; found = 1; ao2_ref(m, -1); break; @@ -1640,6 +1664,7 @@ if ((m = create_queue_member(interface, membername, penalty, paused, state_interface))) { m->dead = 0; m->realtime = 1; + m->ignorebusy = ignorebusy; ast_copy_string(m->rt_uniqueid, rt_uniqueid, sizeof(m->rt_uniqueid)); ast_queue_log(q->name, "REALTIME", m->interface, "ADDMEMBER", "%s", ""); ao2_link(q->members, m); @@ -1810,12 +1835,7 @@ ao2_iterator_destroy(&mem_iter); while ((interface = ast_category_browse(member_config, interface))) { - rt_handle_member_record(q, interface, - ast_variable_retrieve(member_config, interface, "uniqueid"), - S_OR(ast_variable_retrieve(member_config, interface, "membername"),interface), - ast_variable_retrieve(member_config, interface, "penalty"), - ast_variable_retrieve(member_config, interface, "paused"), - S_OR(ast_variable_retrieve(member_config, interface, "state_interface"),interface)); + rt_handle_member_record(q, interface, member_config); } /* Delete all realtime members that have been deleted in DB. */ @@ -1936,12 +1956,7 @@ ao2_iterator_destroy(&mem_iter); while ((interface = ast_category_browse(member_config, interface))) { - rt_handle_member_record(q, interface, - ast_variable_retrieve(member_config, interface, "uniqueid"), - S_OR(ast_variable_retrieve(member_config, interface, "membername"), interface), - ast_variable_retrieve(member_config, interface, "penalty"), - ast_variable_retrieve(member_config, interface, "paused"), - S_OR(ast_variable_retrieve(member_config, interface, "state_interface"), interface)); + rt_handle_member_record(q, interface, member_config); } /* Delete all realtime members that have been deleted in DB. */ @@ -2346,7 +2361,7 @@ while ((mem = ao2_iterator_next(&mem_iter))) { switch (mem->status) { case AST_DEVICE_INUSE: - if (!q->ringinuse) + if ((!q->ringinuse) || (!mem->ignorebusy)) break; /* else fall through */ case AST_DEVICE_NOT_INUSE: @@ -2495,7 +2510,7 @@ return 0; } - if (!qe->parent->ringinuse && (tmp->member->status != AST_DEVICE_NOT_INUSE) && (tmp->member->status != AST_DEVICE_UNKNOWN)) { + if ((!qe->parent->ringinuse || !tmp->member->ignorebusy) && (tmp->member->status != AST_DEVICE_NOT_INUSE) && (tmp->member->status != AST_DEVICE_UNKNOWN)) { ast_debug(1, "%s in use, can't receive call\n", tmp->interface); if (qe->chan->cdr) ast_cdr_busy(qe->chan->cdr);