[svn-commits] irroot: branch irroot/app_queue_skill r322176 - /team/irroot/app_queue_skill/...
SVN commits to the Digium repositories
svn-commits at lists.digium.com
Tue Jun 7 02:29:11 CDT 2011
Author: irroot
Date: Tue Jun 7 02:29:07 2011
New Revision: 322176
URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=322176
Log:
Changes For Review
Modified:
team/irroot/app_queue_skill/apps/app_queue.c
Modified: team/irroot/app_queue_skill/apps/app_queue.c
URL: http://svnview.digium.com/svn/asterisk/team/irroot/app_queue_skill/apps/app_queue.c?view=diff&rev=322176&r1=322175&r2=322176
==============================================================================
--- team/irroot/app_queue_skill/apps/app_queue.c (original)
+++ team/irroot/app_queue_skill/apps/app_queue.c Tue Jun 7 02:29:07 2011
@@ -1260,13 +1260,13 @@
int rrpos; /*!< Round Robin - position */
int memberdelay; /*!< Seconds to delay connecting member to caller */
int autofill; /*!< Ignore the head call status and ring an available agent */
-
+
struct ao2_container *vqueues; /*!< Virtual queues */
struct ao2_container *members; /*!< Head of the list of members */
- /*!
+ /*!
* \brief Number of members _logged in_
* \note There will be members in the members container that are not logged
- * in, so this can not simply be replaced with ao2_container_count().
+ * in, so this can not simply be replaced with ao2_container_count().
*/
int membercount;
struct queue_ent *head; /*!< Head of the list of callers */
@@ -1287,7 +1287,7 @@
static void update_realtime_members(struct call_queue *q);
static int set_member_paused(const char *queuename, const char *interface, const char *reason, int paused);
-static void queue_transfer_fixup(void *data, struct ast_channel *old_chan, struct ast_channel *new_chan);
+static void queue_transfer_fixup(void *data, struct ast_channel *old_chan, struct ast_channel *new_chan);
static int update_queue_ent_skills_next_check(struct call_queue *q);
static int member_is_selected(struct queue_ent *qe, struct member *mem);
@@ -1457,7 +1457,7 @@
}
}
- if (qe && !member_is_selected(qe, member)) {
+ if (!member_is_selected(qe, member)) {
ast_debug(4, "%s is unavailable because it is not selected by rule '%s'\n", member->membername, qe->skill_ruleset);
continue;
}
@@ -1704,7 +1704,7 @@
static struct member *create_queue_member(const char *interface, const char *membername, int penalty, int paused, const char *state_interface, const char *skills)
{
struct member *cur;
-
+
if ((cur = ao2_alloc(sizeof(*cur), NULL))) {
cur->penalty = penalty;
cur->paused = paused;
@@ -1727,10 +1727,11 @@
ast_copy_string(cur->state_context, S_OR(context, "default"), sizeof(cur->state_context));
}
cur->status = get_queue_member_status(cur);
- if (!ast_strlen_zero(skills))
+ if (!ast_strlen_zero(skills)) {
ast_copy_string(cur->skills, skills, sizeof(cur->skills));
- else
+ } else {
cur->skills[0] = '\0';
+ }
}
return cur;
@@ -2196,7 +2197,7 @@
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");
- const char *skills = ast_variable_retrieve(member_config, interface, "skills"));
+ const char *skills = ast_variable_retrieve(member_config, interface, "skills");
if (ast_strlen_zero(rt_uniqueid)) {
ast_log(LOG_WARNING, "Realtime field uniqueid is empty for member %s\n", S_OR(membername, "NULL"));
@@ -2215,33 +2216,34 @@
paused = 0;
}
- /* Find member by realtime uniqueid and update */
- mem_iter = ao2_iterator_init(q->members, 0);
- while ((m = ao2_iterator_next(&mem_iter))) {
- if (!strcasecmp(m->rt_uniqueid, rt_uniqueid)) {
- m->dead = 0; /* Do not delete this one. */
- ast_copy_string(m->rt_uniqueid, rt_uniqueid, sizeof(m->rt_uniqueid));
- if (paused_str)
- m->paused = paused;
- if (strcasecmp(state_interface, m->state_interface)) {
- ast_copy_string(m->state_interface, state_interface, sizeof(m->state_interface));
- }
- m->penalty = penalty;
- if (!ast_strlen_zero(skills))
- ast_copy_string(m->skills, skills, sizeof(m->skills));
- else
- m->skills[0] = '\0';
- found = 1;
- ao2_ref(m, -1);
- update_queue_ent_skills_next_check(q);
- break;
- }
- ao2_ref(m, -1);
- }
+ /* Find member by realtime uniqueid and update */
+ mem_iter = ao2_iterator_init(q->members, 0);
+ while ((m = ao2_iterator_next(&mem_iter))) {
+ if (!strcasecmp(m->rt_uniqueid, rt_uniqueid)) {
+ m->dead = 0; /* Do not delete this one. */
+ ast_copy_string(m->rt_uniqueid, rt_uniqueid, sizeof(m->rt_uniqueid));
+ if (paused_str)
+ m->paused = paused;
+ if (strcasecmp(state_interface, m->state_interface)) {
+ ast_copy_string(m->state_interface, state_interface, sizeof(m->state_interface));
+ }
+ m->penalty = penalty;
+ if (!ast_strlen_zero(skills)) {
+ ast_copy_string(m->skills, skills, sizeof(m->skills));
+ } else {
+ m->skills[0] = '\0';
+ }
+ found = 1;
+ ao2_ref(m, -1);
+ update_queue_ent_skills_next_check(q);
+ break;
+ }
+ ao2_ref(m, -1);
+ }
ao2_iterator_destroy(&mem_iter);
- /* Create a new member */
- if (!found) {
+ /* Create a new member */
+ if (!found) {
if ((m = create_queue_member(interface, membername, penalty, paused, state_interface, skills))) {
m->dead = 0;
m->realtime = 1;
@@ -2584,8 +2586,9 @@
{
struct skill_rule_operand *operand;
- if (!op)
+ if (!op) {
return;
+ }
AST_LIST_TRAVERSE_SAFE_BEGIN(&op->operands, operand, entry) {
AST_LIST_REMOVE_CURRENT(entry);
@@ -2601,10 +2604,12 @@
static void destroy_skill_rule(void* obj)
{
struct skill_rule* r = obj;
- if (r->dcond)
+ if (r->dcond) {
destroy_operator(r->dcond);
- if (r->cond)
+ }
+ if (r->cond) {
destroy_operator(r->cond);
+ }
}
static void destroy_skill_ruleset(void *obj)
@@ -2625,8 +2630,9 @@
{
struct skill_rule_operator *op;
op = ast_calloc(1, sizeof(*op));
- if (!op)
+ if (!op) {
return NULL;
+ }
op->type = t;
AST_LIST_HEAD_INIT_NOLOCK(&op->operands);
@@ -2639,8 +2645,9 @@
{
struct skill_rule_operand *operand;
operand = ast_calloc(1, sizeof(*operand));
- if (!operand)
+ if (!operand) {
return NULL;
+ }
operand->type = t;
return operand;
@@ -2666,8 +2673,9 @@
default: t = '?'; break;
}
- if (*str != '\0')
+ if (*str != '\0') {
ast_build_string(&s, &len, "%c", t);
+ }
switch(operand->type) {
case SKILL_RULE_OPERAND_VARIABLE:
@@ -2697,8 +2705,9 @@
const char *ptr, *start = NULL;
op = create_skill_rule_operator(SKILL_RULE_OPERATOR_UNKNOWN, NULL);
- if (!op)
+ if (!op) {
return NULL;
+ }
head = op;
ptr = expr;
@@ -2832,10 +2841,11 @@
goto error;
}
- if (*ptr != '\0')
+ if (*ptr != '\0') {
flag = skill_rule_operator_type_str[(size_t)*ptr];
- else
+ } else {
flag = op->type;
+ }
if (op->type == SKILL_RULE_OPERATOR_UNKNOWN) {
if (flag == SKILL_RULE_OPERATOR_UNKNOWN) {
@@ -2857,8 +2867,9 @@
/* Then we try to jump to an upper operator, or to create one. */
/* look for a parent operator with a lower or equal priority. */
- for(parent = op->parent; parent && parent->type < flag; parent = parent->parent)
+ for (parent = op->parent; parent && parent->type < flag; parent = parent->parent) {
op = parent;
+ }
if (!parent) {
/* There isn't any other operator with a lower or equal priority */
@@ -2966,8 +2977,9 @@
error:
destroy_operator(head);
- if(operand)
+ if (operand) {
ast_free(operand);
+ }
return NULL;
}
@@ -2980,9 +2992,9 @@
if (cond) {
*cond++ = '\0';
r->dcond = parse_expr(dcond);
- }
- else
+ } else {
cond = dcond;
+ }
r->cond = parse_expr(cond);
return 0;
@@ -3046,8 +3058,9 @@
}
}
- if (var)
+ if (var) {
ao2_ref(var, -1);
+ }
break;
}
case SKILL_RULE_OPERAND_VALUE:
@@ -3061,17 +3074,18 @@
return 0;
}
- if (first)
+ if (first) {
ret = value;
- else {
- if (operator_proceeded_cb)
+ } else {
+ if (operator_proceeded_cb) {
operator_proceeded_cb(last_name, ret, op->type, name, value, data);
+ }
switch(op->type) {
case SKILL_RULE_OPERATOR_DIVISION:
- if (value != 0)
+ if (value != 0) {
ret /= value;
- else {
+ } else {
ast_log(LOG_WARNING, "Rule error: division by zero.\n");
return 0;
}
@@ -3122,12 +3136,13 @@
int value = 0;
struct skill* skill;
struct ao2_iterator iter = ao2_iterator_init(skills->skills, 0);
- while ((skill = ao2_iterator_next(&iter)) && strcasecmp(skill->name, key))
+ while ((skill = ao2_iterator_next(&iter)) && strcasecmp(skill->name, key)) {
ao2_ref(skill, -1);
-
- if (!skill)
+ }
+
+ if (!skill) {
value = 0;
- else {
+ } else {
value = skill->weight;
ao2_ref(skill, -1);
}
@@ -3149,8 +3164,9 @@
float aht, ciqu = 0;
float ali;
- if (!qe->mem_selection || ao2_container_count(qe->mem_selection) == 0)
+ if (!qe->mem_selection || ao2_container_count(qe->mem_selection) == 0) {
return qe->vqueue->holdtime;
+ }
iter = ao2_iterator_init(qe->mem_selection, 0);
while ((mem = ao2_iterator_next(&iter))) {
@@ -3164,8 +3180,9 @@
aht = sum / ali;
for (ch = qe->parent->head; ch; ch = ch->next) {
- if (!ch->pending && ch->vqueue == qe->vqueue)
+ if (!ch->pending && ch->vqueue == qe->vqueue) {
ciqu++;
+ }
}
return (qe->vqueue->holdtime = aht * ciqu / ali);
@@ -3173,10 +3190,11 @@
static int get_estimated_waiting_time(struct queue_ent *qe)
{
- if (qe->vqueue)
+ if (qe->vqueue) {
return calculate_estimated_waiting_time(qe);
- else
+ } else {
return qe->parent->holdtime;
+ }
}
static int get_waiting_time(struct queue_ent *qe)
@@ -3197,11 +3215,11 @@
size_t i;
int value = 0;
- for (i = 0; i < sizeof(static_vars) / sizeof(*static_vars) && strcasecmp(static_vars[i].name, key); ++i)
- ;
-
- if (i < (sizeof(static_vars) / sizeof(*static_vars)))
- value = static_vars[i].func(qe);
+ for (i = 0; i < sizeof(static_vars) / sizeof(*static_vars) && strcasecmp(static_vars[i].name, key); ++i) {
+ if (i < (sizeof(static_vars) / sizeof(*static_vars))) {
+ value = static_vars[i].func(qe);
+ }
+ }
return value;
}
@@ -3219,22 +3237,25 @@
return;
}
- switch(op)
- {
+ switch (op) {
case SKILL_RULE_OPERATOR_EQUAL:
- if (left_wt)
+ if (left_wt) {
new_check = time(NULL) + right_value - get_waiting_time(qe);
- if (right_wt)
+ }
+ if (right_wt) {
new_check = time(NULL) + left_value - get_waiting_time(qe);
+ }
break;
case SKILL_RULE_OPERATOR_GREATER:
- if (right_wt)
+ if (right_wt) {
new_check = time(NULL) + left_value - get_waiting_time(qe);
+ }
break;
case SKILL_RULE_OPERATOR_LESSER:
- if (left_wt)
+ if (left_wt) {
new_check = time(NULL) + right_value - get_waiting_time(qe);
+ }
break;
case SKILL_RULE_OPERATOR_DIVISION:
case SKILL_RULE_OPERATOR_MULTIPLICATION:
@@ -3271,20 +3292,23 @@
return NULL;
}
- if (!(ptr = strchr(*rulename, '(')))
+ if (!(ptr = strchr(*rulename, '('))) {
return variables;
+ }
*ptr++ = '\0';
while ((var = strsep(&ptr, ",|^)"))) {
char *value = strchr(var, '=');
- if (!value)
+ if (!value) {
continue;
+ }
*value++ = '\0';
v = ao2_alloc(sizeof(*v), NULL);
- if (!v)
+ if (!v) {
break;
+ }
ast_copy_string(v->name, var, sizeof(v->name));
ast_copy_string(v->value, value, sizeof(v->value));
ao2_link(variables, v);
@@ -3301,17 +3325,18 @@
/* If there isn't any queue entry or if there isn't any ruleset on the
* queue, it's because he doesn't use the skills routing.
*/
- if (!qe || ast_strlen_zero(qe->skill_ruleset))
+ if (!qe || ast_strlen_zero(qe->skill_ruleset)) {
return 1;
+ }
/* No member is selected. */
- if (!qe->mem_selection)
+ if (!qe->mem_selection) {
return 0;
-
- m = ao2_find(qe->mem_selection, mem, OBJ_POINTER);
-
- if (m)
+ }
+
+ if ((m = ao2_find(qe->mem_selection, mem, OBJ_POINTER))) {
ao2_ref(m, -1);
+ }
return m != NULL;
}
@@ -3335,8 +3360,9 @@
if (!vq) {
vq = ao2_alloc(sizeof(*vq), NULL);
- if (!vq)
+ if (!vq) {
return -1;
+ }
ast_copy_string(vq->id, qe->skill_ruleset, sizeof(vq->id));
ao2_link(q->vqueues, vq);
}
@@ -3363,22 +3389,25 @@
struct ao2_iterator rule_iter, mem_iter;
char* ruleset_name;
- if (ast_strlen_zero(qe->skill_ruleset))
+ if (ast_strlen_zero(qe->skill_ruleset)) {
return 0;
+ }
ruleset_name = ast_strdupa(qe->skill_ruleset);
qe->skills_next_check = 0;
variables = get_rule_variables(qe, &ruleset_name);
- if (!variables)
+ if (!variables) {
return -1;
+ }
AST_LIST_LOCK(&skill_rulesets);
AST_LIST_LOCK(&skills_groups);
AST_LIST_TRAVERSE(&skill_rulesets, rs, entry) {
- if (!strcmp(rs->name, ruleset_name))
+ if (!strcmp(rs->name, ruleset_name)) {
break;
+ }
}
if (!rs) {
@@ -3411,8 +3440,9 @@
operator_eval_skills(rule->cond, skills, variables, qe)) {
ao2_link(qe->mem_selection, member);
ast_log(LOG_DEBUG, "Member %s is associated.\n", member->interface);
- } else
+ } else {
ast_log(LOG_DEBUG, "Member %s is NOT associated.\n", member->interface);
+ }
ao2_ref(member, -1);
}
ao2_iterator_destroy(&mem_iter);
@@ -3441,8 +3471,9 @@
{
struct queue_ent* ch = q->head;
time_t now = time(NULL);
- for (; ch; ch = ch->next)
+ for (; ch; ch = ch->next) {
ch->skills_next_check = now;
+ }
return 0;
}
@@ -3481,8 +3512,9 @@
inserted = 0;
prev = NULL;
- if (!ast_strlen_zero(qe->skill_ruleset))
+ if (!ast_strlen_zero(qe->skill_ruleset)) {
join_virtual_queue(q, qe);
+ }
cur = q->head;
while (cur) {
@@ -3605,7 +3637,11 @@
static int say_position(struct queue_ent *qe, int ringing)
{
- int res = 0, avgholdmins, avgholdsecs, holdtime, announceposition = 0;
+ int res = 0;
+ int avgholdmins;
+ int avgholdsecs;
+ int holdtime;
+ int announceposition = 0;
int say_thanks = 1;
time_t now;
@@ -4893,9 +4929,10 @@
ast_debug(1, "There %s %d available %s.\n", avl != 1 ? "are" : "is", avl, avl != 1 ? "members" : "member");
while ((idx < avl) && (ch) && (ch != qe)) {
- if (!ch->pending && ch->vqueue == qe->vqueue)
+ if (!ch->pending && ch->vqueue == qe->vqueue) {
idx++;
- ch = ch->next;
+ }
+ ch = ch->next;
}
ao2_unlock(qe->parent);
@@ -6172,7 +6209,7 @@
}
res = snprintf(value + value_len, sizeof(value) - value_len, "%s%s;%d;%d;%s;%s;%s",
- value_len ? "|" : "", cur_member->interface, cur_member->penalty, cur_member->paused, cur_member->membername,
+ value_len ? "|" : "", cur_member->interface, cur_member->penalty, cur_member->paused, cur_member->membername,
cur_member->state_interface, cur_member->skills);
ao2_ref(cur_member, -1);
@@ -6202,7 +6239,7 @@
static int remove_from_queue(const char *queuename, const char *interface)
{
struct call_queue *q, tmpq = {
- .name = queuename,
+ .name = queuename,
};
struct member *mem, tmpmem;
struct queue_ent* qe;
@@ -6231,15 +6268,18 @@
update_queue_ent_skills_next_check(q);
/* Remove member from selection of each callers. */
- for(qe = q->head; qe; qe = qe->next)
- if (qe->mem_selection)
+ for(qe = q->head; qe; qe = qe->next) {
+ if (qe->mem_selection) {
ao2_unlink(qe->mem_selection, mem);
+ }
+ }
ao2_ref(mem, -1);
- if (queue_persistent_members)
+ if (queue_persistent_members) {
dump_queue_members(q);
-
+ }
+
res = RES_OKAY;
} else {
res = RES_EXISTS;
@@ -6357,7 +6397,7 @@
ast_queue_log(q->name, "NONE", mem->membername, (paused ? "PAUSE" : "UNPAUSE"), "%s", S_OR(reason, ""));
update_queue_ent_skills_next_check(q);
-
+
if (!ast_strlen_zero(reason)) {
manager_event(EVENT_FLAG_AGENT, "QueueMemberPaused",
"Queue: %s\r\n"
@@ -6556,7 +6596,7 @@
}
ast_debug(1, "Reload Members: Queue: %s Member: %s Name: %s Penalty: %d Paused: %d\n", queue_name, interface, membername, penalty, paused);
-
+
if (add_to_queue(queue_name, interface, membername, penalty, paused, 0, state_interface, skills) == RES_OUTOFMEMORY) {
ast_log(LOG_ERROR, "Out of Memory when reloading persistent queue member\n");
break;
@@ -6873,12 +6913,12 @@
);
/* Our queue entry */
struct queue_ent qe = { 0 };
-
+
if (ast_strlen_zero(data)) {
ast_log(LOG_WARNING, "Queue requires an argument: queuename[,options[,URL[,announceoverride[,timeout[,agi[,macro[,gosub[,rule[,position[,skill_ruleset]]]]]]]]]]\n");
return -1;
}
-
+
parse = ast_strdupa(data);
AST_STANDARD_APP_ARGS(args, parse);
@@ -6987,8 +7027,9 @@
switch (select_members_from_skills(&qe)) {
case 1:
- if (!qe.parent->joinempty || !get_member_status(qe.parent, qe.max_penalty, qe.min_penalty, qe.parent->joinempty, &qe))
+ if (!qe.parent->joinempty || !get_member_status(qe.parent, qe.max_penalty, qe.min_penalty, qe.parent->joinempty, &qe)) {
break;
+ }
reason = QUEUE_JOINEMPTY;
case -1:
goto stop;
@@ -7686,8 +7727,9 @@
parse_skill_rule(r, var->value);
/* check if this rule is empty. */
- if (r->cond)
+ if (r->cond) {
ao2_link(ruleset->rules, r);
+ }
ao2_ref(r, -1);
}
@@ -8184,13 +8226,15 @@
mem->realtime ? " (realtime)" : "",
mem->paused ? " (paused)" : "",
ast_devstate2str(mem->status));
- if (!ast_strlen_zero(mem->skills))
+ if (!ast_strlen_zero(mem->skills)) {
ast_str_append(&out, 0, " (skills: %s)", mem->skills);
- if (mem->calls)
+ }
+ if (mem->calls) {
ast_str_append(&out, 0, " has taken %d calls (last was %ld secs ago)",
mem->calls, (long) (time(NULL) - mem->lastcall));
- else
+ } else {
ast_str_append(&out, 0, " has taken no calls yet");
+ }
do_print(s, fd, ast_str_buffer(out));
ao2_ref(mem, -1);
}
@@ -8206,8 +8250,7 @@
struct virtual_queue *vqueue;
struct ao2_iterator iter;
iter = ao2_iterator_init(q->vqueues, 0);
- while ((vqueue = ao2_iterator_next(&iter)))
- {
+ while ((vqueue = ao2_iterator_next(&iter))) {
pos = 1;
ast_str_set(&out, 0, " Virtual queue %s: ", vqueue->id);
do_print(s, fd, ast_str_buffer(out));
@@ -9109,10 +9152,10 @@
}
}
AST_LIST_UNLOCK(&rule_lists);
- return CLI_SUCCESS;
-}
-
-static char *complete_queue_skills_groups(const char *line, const char *word, int pos, int state)
+ return CLI_SUCCESS;
+}
+
+static char *complete_queue_skills_groups(const char *line, const char *word, int pos, int state)
{
int which = 0;
struct skills_group *skills;
@@ -9152,8 +9195,9 @@
return complete_queue_skills_groups(a->line, a->word, a->pos, a->n);
}
- if (a->argc != 3 && a->argc != 4 && a->argc != 5)
+ if (a->argc != 3 && a->argc != 4 && a->argc != 5) {
return CLI_SHOWUSAGE;
+ }
name = a->argc == 5 ? a->argv[4] : "";
@@ -9180,10 +9224,10 @@
}
}
AST_LIST_UNLOCK(&skills_groups);
- return CLI_SUCCESS;
-}
-
-static char *complete_queue_skills_rules(const char *line, const char *word, int pos, int state)
+ return CLI_SUCCESS;
+}
+
+static char *complete_queue_skills_rules(const char *line, const char *word, int pos, int state)
{
int which = 0;
struct skill_ruleset *rs;
@@ -9223,8 +9267,9 @@
return complete_queue_skills_rules(a->line, a->word, a->pos, a->n);
}
- if (a->argc != 3 && a->argc != 4 && a->argc != 5)
+ if (a->argc != 3 && a->argc != 4 && a->argc != 5) {
return CLI_SHOWUSAGE;
+ }
name = a->argc == 5 ? a->argv[4] : "";
@@ -9240,9 +9285,9 @@
char *dcond = display_operator(rule->dcond);
ast_cli(a->fd, " => [%s] %s\n", dcond, cond);
ast_free(dcond);
+ } else {
+ ast_cli(a->fd, " => %s\n", cond);
}
- else
- ast_cli(a->fd, " => %s\n", cond);
ast_free(cond);
ao2_ref(rule, -1);
}
@@ -9250,7 +9295,7 @@
}
}
AST_LIST_UNLOCK(&skill_rulesets);
- return CLI_SUCCESS;
+ return CLI_SUCCESS;
}
static char *handle_queue_reset(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
More information about the svn-commits
mailing list