<p>Friendly Automation <strong>merged</strong> this change.</p><p><a href="https://gerrit.asterisk.org/10785">View Change</a></p><div style="white-space:pre-wrap">Approvals:
Kevin Harwell: Looks good to me, but someone else must approve
Joshua C. Colp: Looks good to me, approved
Friendly Automation: Approved for Submit
</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">app_queue: Enable set the wrapuptime from AddQueueMember application<br><br>This change add ability to set the wrapuptime per-member using the<br>AddQueueMember application.<br><br>The feature to set wrapuptime per member was include in the issue<br>ASTERISK-27483 for static member by configuration file and was not<br>added to set from AddQueueMember.<br><br>ASTERISK-28055 #close<br><br>Change-Id: I7c7ee4a6f804922cd7c42cb02eea26eb3806c6cf<br>---<br>M apps/app_queue.c<br>1 file changed, 59 insertions(+), 20 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/apps/app_queue.c b/apps/app_queue.c</span><br><span>index 60be305..8b34d73 100644</span><br><span>--- a/apps/app_queue.c</span><br><span>+++ b/apps/app_queue.c</span><br><span>@@ -319,6 +319,7 @@</span><br><span> <parameter name="options" /></span><br><span> <parameter name="membername" /></span><br><span> <parameter name="stateinterface" /></span><br><span style="color: hsl(120, 100%, 40%);">+ <parameter name="wrapuptime" /></span><br><span> </syntax></span><br><span> <description></span><br><span> <para>Dynamically adds interface to an existing queue. If the interface is</span><br><span>@@ -1108,6 +1109,9 @@</span><br><span> <enum name="1"/></span><br><span> </enumlist></span><br><span> </parameter></span><br><span style="color: hsl(120, 100%, 40%);">+ <parameter name="Wrapuptime"></span><br><span style="color: hsl(120, 100%, 40%);">+ <para>The Wrapup Time of the queue member. If this value is set will override the wrapup time of queue.</para></span><br><span style="color: hsl(120, 100%, 40%);">+ </parameter></span><br><span> </syntax></span><br><span> </managerEventInstance></span><br><span> </managerEvent></span><br><span>@@ -2260,7 +2264,7 @@</span><br><span> </span><br><span> static struct ast_json *queue_member_blob_create(struct call_queue *q, struct member *mem)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">- return ast_json_pack("{s: s, s: s, s: s, s: s, s: s, s: i, s: i, s: i, s: i, s: i, s: i, s: i, s: s, s: i}",</span><br><span style="color: hsl(120, 100%, 40%);">+ return ast_json_pack("{s: s, s: s, s: s, s: s, s: s, s: i, s: i, s: i, s: i, s: i, s: i, s: i, s: s, s: i, s: i}",</span><br><span> "Queue", q->name,</span><br><span> "MemberName", mem->membername,</span><br><span> "Interface", mem->interface,</span><br><span>@@ -2274,7 +2278,8 @@</span><br><span> "Status", mem->status,</span><br><span> "Paused", mem->paused,</span><br><span> "PausedReason", mem->reason_paused,</span><br><span style="color: hsl(0, 100%, 40%);">- "Ringinuse", mem->ringinuse);</span><br><span style="color: hsl(120, 100%, 40%);">+ "Ringinuse", mem->ringinuse,</span><br><span style="color: hsl(120, 100%, 40%);">+ "Wrapuptime", mem->wrapuptime);</span><br><span> }</span><br><span> </span><br><span> /*! \brief Check if members are available</span><br><span>@@ -2679,7 +2684,7 @@</span><br><span> }</span><br><span> </span><br><span> /*! \brief allocate space for new queue member and set fields based on parameters passed */</span><br><span style="color: hsl(0, 100%, 40%);">-static struct member *create_queue_member(const char *interface, const char *membername, int penalty, int paused, const char *state_interface, int ringinuse)</span><br><span style="color: hsl(120, 100%, 40%);">+static struct member *create_queue_member(const char *interface, const char *membername, int penalty, int paused, const char *state_interface, int ringinuse, int wrapuptime)</span><br><span> {</span><br><span> struct member *cur;</span><br><span> </span><br><span>@@ -2687,6 +2692,7 @@</span><br><span> cur->ringinuse = ringinuse;</span><br><span> cur->penalty = penalty;</span><br><span> cur->paused = paused;</span><br><span style="color: hsl(120, 100%, 40%);">+ cur->wrapuptime = wrapuptime;</span><br><span> if (paused) {</span><br><span> time(&cur->lastpause); /* Update time of last pause */</span><br><span> }</span><br><span>@@ -3468,7 +3474,7 @@</span><br><span> </span><br><span> /* Create a new member */</span><br><span> if (!found) {</span><br><span style="color: hsl(0, 100%, 40%);">- if ((m = create_queue_member(interface, membername, penalty, paused, state_interface, ringinuse))) {</span><br><span style="color: hsl(120, 100%, 40%);">+ if ((m = create_queue_member(interface, membername, penalty, paused, state_interface, ringinuse, wrapuptime))) {</span><br><span> m->dead = 0;</span><br><span> m->realtime = 1;</span><br><span> ast_copy_string(m->rt_uniqueid, rt_uniqueid, sizeof(m->rt_uniqueid));</span><br><span>@@ -7260,14 +7266,15 @@</span><br><span> continue;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- ast_str_append(&value, 0, "%s%s;%d;%d;%s;%s;%s",</span><br><span style="color: hsl(120, 100%, 40%);">+ ast_str_append(&value, 0, "%s%s;%d;%d;%s;%s;%s;%d",</span><br><span> ast_str_strlen(value) ? "|" : "",</span><br><span> cur_member->interface,</span><br><span> cur_member->penalty,</span><br><span> cur_member->paused,</span><br><span> cur_member->membername,</span><br><span> cur_member->state_interface,</span><br><span style="color: hsl(0, 100%, 40%);">- cur_member->reason_paused);</span><br><span style="color: hsl(120, 100%, 40%);">+ cur_member->reason_paused,</span><br><span style="color: hsl(120, 100%, 40%);">+ cur_member->wrapuptime);</span><br><span> </span><br><span> ao2_ref(cur_member, -1);</span><br><span> }</span><br><span>@@ -7344,7 +7351,7 @@</span><br><span> * \retval RES_EXISTS queue exists but no members</span><br><span> * \retval RES_OUT_OF_MEMORY queue exists but not enough memory to create member</span><br><span> */</span><br><span style="color: hsl(0, 100%, 40%);">-static int add_to_queue(const char *queuename, const char *interface, const char *membername, int penalty, int paused, int dump, const char *state_interface, const char *reason_paused)</span><br><span style="color: hsl(120, 100%, 40%);">+static int add_to_queue(const char *queuename, const char *interface, const char *membername, int penalty, int paused, int dump, const char *state_interface, const char *reason_paused, int wrapuptime)</span><br><span> {</span><br><span> struct call_queue *q;</span><br><span> struct member *new_member, *old_member;</span><br><span>@@ -7358,7 +7365,7 @@</span><br><span> </span><br><span> ao2_lock(q);</span><br><span> if ((old_member = interface_exists(q, interface)) == NULL) {</span><br><span style="color: hsl(0, 100%, 40%);">- if ((new_member = create_queue_member(interface, membername, penalty, paused, state_interface, q->ringinuse))) {</span><br><span style="color: hsl(120, 100%, 40%);">+ if ((new_member = create_queue_member(interface, membername, penalty, paused, state_interface, q->ringinuse, wrapuptime))) {</span><br><span> new_member->dynamic = 1;</span><br><span> if (reason_paused) {</span><br><span> ast_copy_string(new_member->reason_paused, reason_paused, sizeof(new_member->reason_paused));</span><br><span>@@ -7750,6 +7757,8 @@</span><br><span> int penalty = 0;</span><br><span> char *paused_tok;</span><br><span> int paused = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+ char *wrapuptime_tok;</span><br><span style="color: hsl(120, 100%, 40%);">+ int wrapuptime = 0;</span><br><span> char *reason_paused;</span><br><span> struct ast_db_entry *db_tree;</span><br><span> struct ast_db_entry *entry;</span><br><span>@@ -7798,6 +7807,7 @@</span><br><span> membername = strsep(&member, ";");</span><br><span> state_interface = strsep(&member, ";");</span><br><span> reason_paused = strsep(&member, ";");</span><br><span style="color: hsl(120, 100%, 40%);">+ wrapuptime_tok = strsep(&member, ";");</span><br><span> </span><br><span> if (!penalty_tok) {</span><br><span> ast_log(LOG_WARNING, "Error parsing persistent member string for '%s' (penalty)\n", queue_name);</span><br><span>@@ -7819,10 +7829,18 @@</span><br><span> break;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- ast_debug(1, "Reload Members: Queue: %s Member: %s Name: %s Penalty: %d Paused: %d ReasonPause: %s\n",</span><br><span style="color: hsl(0, 100%, 40%);">- queue_name, interface, membername, penalty, paused, reason_paused);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!ast_strlen_zero(wrapuptime_tok)) {</span><br><span style="color: hsl(120, 100%, 40%);">+ wrapuptime = strtol(wrapuptime_tok, NULL, 10);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (errno == ERANGE) {</span><br><span style="color: hsl(120, 100%, 40%);">+ ast_log(LOG_WARNING, "Error converting wrapuptime: %s: Out of range.\n", wrapuptime_tok);</span><br><span style="color: hsl(120, 100%, 40%);">+ break;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- if (add_to_queue(queue_name, interface, membername, penalty, paused, 0, state_interface, reason_paused) == RES_OUTOFMEMORY) {</span><br><span style="color: hsl(120, 100%, 40%);">+ ast_debug(1, "Reload Members: Queue: %s Member: %s Name: %s Penalty: %d Paused: %d ReasonPause: %s Wrapuptime: %d\n",</span><br><span style="color: hsl(120, 100%, 40%);">+ queue_name, interface, membername, penalty, paused, reason_paused, wrapuptime);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ if (add_to_queue(queue_name, interface, membername, penalty, paused, 0, state_interface, reason_paused, wrapuptime) == RES_OUTOFMEMORY) {</span><br><span> ast_log(LOG_ERROR, "Out of Memory when reloading persistent queue member\n");</span><br><span> break;</span><br><span> }</span><br><span>@@ -7984,7 +8002,7 @@</span><br><span> static int aqm_exec(struct ast_channel *chan, const char *data)</span><br><span> {</span><br><span> int res=-1;</span><br><span style="color: hsl(0, 100%, 40%);">- char *parse, *temppos = NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+ char *parse, *tmp, *temppos = NULL;</span><br><span> AST_DECLARE_APP_ARGS(args,</span><br><span> AST_APP_ARG(queuename);</span><br><span> AST_APP_ARG(interface);</span><br><span>@@ -7992,11 +8010,13 @@</span><br><span> AST_APP_ARG(options);</span><br><span> AST_APP_ARG(membername);</span><br><span> AST_APP_ARG(state_interface);</span><br><span style="color: hsl(120, 100%, 40%);">+ AST_APP_ARG(wrapuptime);</span><br><span> );</span><br><span> int penalty = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+ int wrapuptime;</span><br><span> </span><br><span> if (ast_strlen_zero(data)) {</span><br><span style="color: hsl(0, 100%, 40%);">- ast_log(LOG_WARNING, "AddQueueMember requires an argument (queuename[,interface[,penalty[,options[,membername[,stateinterface]]]]])\n");</span><br><span style="color: hsl(120, 100%, 40%);">+ ast_log(LOG_WARNING, "AddQueueMember requires an argument (queuename[,interface[,penalty[,options[,membername[,stateinterface][,wrapuptime]]]]])\n");</span><br><span> return -1;</span><br><span> }</span><br><span> </span><br><span>@@ -8019,7 +8039,18 @@</span><br><span> }</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- switch (add_to_queue(args.queuename, args.interface, args.membername, penalty, 0, queue_persistent_members, args.state_interface, NULL)) {</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!ast_strlen_zero(args.wrapuptime)) {</span><br><span style="color: hsl(120, 100%, 40%);">+ tmp = args.wrapuptime;</span><br><span style="color: hsl(120, 100%, 40%);">+ ast_strip(tmp);</span><br><span style="color: hsl(120, 100%, 40%);">+ wrapuptime = atoi(tmp);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (wrapuptime < 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+ wrapuptime = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ } else {</span><br><span style="color: hsl(120, 100%, 40%);">+ wrapuptime = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ switch (add_to_queue(args.queuename, args.interface, args.membername, penalty, 0, queue_persistent_members, args.state_interface, NULL, wrapuptime)) {</span><br><span> case RES_OKAY:</span><br><span> if (ast_strlen_zero(args.membername) || !log_membername_as_agent) {</span><br><span> ast_queue_log(args.queuename, ast_channel_uniqueid(chan), args.interface, "ADDMEMBER", "%s", "");</span><br><span>@@ -9265,7 +9296,7 @@</span><br><span> ast_copy_string(tmpmem.interface, interface, sizeof(tmpmem.interface));</span><br><span> cur = ao2_find(q->members, &tmpmem, OBJ_POINTER);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- if ((newm = create_queue_member(interface, membername, penalty, cur ? cur->paused : 0, state_interface, ringinuse))) {</span><br><span style="color: hsl(120, 100%, 40%);">+ if ((newm = create_queue_member(interface, membername, penalty, cur ? cur->paused : 0, state_interface, ringinuse, wrapuptime))) {</span><br><span> newm->wrapuptime = wrapuptime;</span><br><span> if (cur) {</span><br><span> /* Round Robin Queue Position must be copied if this is replacing an existing member */</span><br><span>@@ -10078,11 +10109,12 @@</span><br><span> "Status: %d\r\n"</span><br><span> "Paused: %d\r\n"</span><br><span> "PausedReason: %s\r\n"</span><br><span style="color: hsl(120, 100%, 40%);">+ "Wrapuptime: %d\r\n"</span><br><span> "%s"</span><br><span> "\r\n",</span><br><span> q->name, mem->membername, mem->interface, mem->state_interface, mem->dynamic ? "dynamic" : "static",</span><br><span> mem->penalty, mem->calls, (int)mem->lastcall, (int)mem->lastpause, mem->starttime ? 1 : 0, mem->status,</span><br><span style="color: hsl(0, 100%, 40%);">- mem->paused, mem->reason_paused, idText);</span><br><span style="color: hsl(120, 100%, 40%);">+ mem->paused, mem->reason_paused, mem->wrapuptime, idText);</span><br><span> ++q_items;</span><br><span> }</span><br><span> ao2_ref(mem, -1);</span><br><span>@@ -10127,8 +10159,8 @@</span><br><span> </span><br><span> static int manager_add_queue_member(struct mansession *s, const struct message *m)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">- const char *queuename, *interface, *penalty_s, *paused_s, *membername, *state_interface;</span><br><span style="color: hsl(0, 100%, 40%);">- int paused, penalty = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+ const char *queuename, *interface, *penalty_s, *paused_s, *membername, *state_interface, *wrapuptime_s;</span><br><span style="color: hsl(120, 100%, 40%);">+ int paused, penalty, wrapuptime = 0;</span><br><span> </span><br><span> queuename = astman_get_header(m, "Queue");</span><br><span> interface = astman_get_header(m, "Interface");</span><br><span>@@ -10136,6 +10168,7 @@</span><br><span> paused_s = astman_get_header(m, "Paused");</span><br><span> membername = astman_get_header(m, "MemberName");</span><br><span> state_interface = astman_get_header(m, "StateInterface");</span><br><span style="color: hsl(120, 100%, 40%);">+ wrapuptime_s = astman_get_header(m, "Wrapuptime");</span><br><span> </span><br><span> if (ast_strlen_zero(queuename)) {</span><br><span> astman_send_error(s, m, "'Queue' not specified.");</span><br><span>@@ -10153,13 +10186,19 @@</span><br><span> penalty = 0;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ if (ast_strlen_zero(wrapuptime_s)) {</span><br><span style="color: hsl(120, 100%, 40%);">+ wrapuptime = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+ } else if (sscanf(wrapuptime_s, "%30d", &wrapuptime) != 1 || wrapuptime < 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+ wrapuptime = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> if (ast_strlen_zero(paused_s)) {</span><br><span> paused = 0;</span><br><span> } else {</span><br><span> paused = abs(ast_true(paused_s));</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- switch (add_to_queue(queuename, interface, membername, penalty, paused, queue_persistent_members, state_interface, NULL)) {</span><br><span style="color: hsl(120, 100%, 40%);">+ switch (add_to_queue(queuename, interface, membername, penalty, paused, queue_persistent_members, state_interface, NULL, wrapuptime)) {</span><br><span> case RES_OKAY:</span><br><span> if (ast_strlen_zero(membername) || !log_membername_as_agent) {</span><br><span> ast_queue_log(queuename, "MANAGER", interface, "ADDMEMBER", "%s", paused ? "PAUSED" : "");</span><br><span>@@ -10509,7 +10548,7 @@</span><br><span> state_interface = a->argv[11];</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- switch (add_to_queue(queuename, interface, membername, penalty, 0, queue_persistent_members, state_interface, NULL)) {</span><br><span style="color: hsl(120, 100%, 40%);">+ switch (add_to_queue(queuename, interface, membername, penalty, 0, queue_persistent_members, state_interface, NULL, 0)) {</span><br><span> case RES_OKAY:</span><br><span> if (ast_strlen_zero(membername) || !log_membername_as_agent) {</span><br><span> ast_queue_log(queuename, "CLI", interface, "ADDMEMBER", "%s", "");</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.asterisk.org/10785">change 10785</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://gerrit.asterisk.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://gerrit.asterisk.org/10785"/><meta itemprop="name" content="View Change"/></div></div>
<div style="display:none"> Gerrit-Project: asterisk </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-MessageType: merged </div>
<div style="display:none"> Gerrit-Change-Id: I7c7ee4a6f804922cd7c42cb02eea26eb3806c6cf </div>
<div style="display:none"> Gerrit-Change-Number: 10785 </div>
<div style="display:none"> Gerrit-PatchSet: 4 </div>
<div style="display:none"> Gerrit-Owner: Rodrigo Ramirez Norambuena <a@rodrigoramirez.com> </div>
<div style="display:none"> Gerrit-Reviewer: Friendly Automation (1000185) </div>
<div style="display:none"> Gerrit-Reviewer: George Joseph <gjoseph@digium.com> </div>
<div style="display:none"> Gerrit-Reviewer: Joshua C. Colp <jcolp@digium.com> </div>
<div style="display:none"> Gerrit-Reviewer: Kevin Harwell <kharwell@digium.com> </div>
<div style="display:none"> Gerrit-Reviewer: Rodrigo Ramirez Norambuena <a@rodrigoramirez.com> </div>