<p>Joshua C. Colp <strong>merged</strong> this change.</p><p><a href="https://gerrit.asterisk.org/10928">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; 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 92c49b5..9b1f486 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/10928">change 10928</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/10928"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: asterisk </div>
<div style="display:none"> Gerrit-Branch: 16 </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: 10928 </div>
<div style="display:none"> Gerrit-PatchSet: 3 </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: Matthew Fredrickson <creslin@digium.com> </div>
<div style="display:none"> Gerrit-Reviewer: Rodrigo Ramirez Norambuena <a@rodrigoramirez.com> </div>