<p>George Joseph <strong>merged</strong> this change.</p><p><a href="https://gerrit.asterisk.org/10633">View Change</a></p><div style="white-space:pre-wrap">Approvals:
  George Joseph: Looks good to me, approved; Approved for Submit

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">pjsip: New function PJSIP_PARSE_URI to parse URI and return part of URI<br><br>New dialplan function PJSIP_PARSE_URI added to parse an URI and return<br>a specified part of the URI.<br><br>This is useful when need to get part of the URI instead of cutting it<br>using a CUT function.<br><br>For example to get 'user' part of Remote URI<br>${PJSIP_PARSE_URI(${CHANNEL(pjsip,remote_uri)},user)}<br><br>ASTERISK-28144 #close<br><br>Change-Id: I5d828fb87f6803b6c1152bb7b44835f027bb9d5a<br>---<br>M CHANGES<br>M channels/chan_pjsip.c<br>M channels/pjsip/dialplan_functions.c<br>M channels/pjsip/include/dialplan_functions.h<br>4 files changed, 205 insertions(+), 0 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/CHANGES b/CHANGES</span><br><span>index 4e3d07f..f164680 100644</span><br><span>--- a/CHANGES</span><br><span>+++ b/CHANGES</span><br><span>@@ -18,6 +18,11 @@</span><br><span>    extensions.conf.  Variables are processed in the order they are found</span><br><span>    and duplicate variables overwrite the previous value.</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+chan_pjsip</span><br><span style="color: hsl(120, 100%, 40%);">+------------------</span><br><span style="color: hsl(120, 100%, 40%);">+ * New dialplan function PJSIP_PARSE_URI added to parse an URI and return</span><br><span style="color: hsl(120, 100%, 40%);">+   a specified part of the URI.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> res_pjsip</span><br><span> ------------------</span><br><span>  * New options 'trust_connected_line' and 'send_connected_line' have been</span><br><span>diff --git a/channels/chan_pjsip.c b/channels/chan_pjsip.c</span><br><span>index 8e4e40c..792b3fc 100644</span><br><span>--- a/channels/chan_pjsip.c</span><br><span>+++ b/channels/chan_pjsip.c</span><br><span>@@ -3052,6 +3052,11 @@</span><br><span>        .read = pjsip_acf_dial_contacts_read,</span><br><span> };</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+static struct ast_custom_function chan_pjsip_parse_uri_function = {</span><br><span style="color: hsl(120, 100%, 40%);">+  .name = "PJSIP_PARSE_URI",</span><br><span style="color: hsl(120, 100%, 40%);">+  .read = pjsip_acf_parse_uri_read,</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> static struct ast_custom_function media_offer_function = {</span><br><span>        .name = "PJSIP_MEDIA_OFFER",</span><br><span>       .read = pjsip_acf_media_offer_read,</span><br><span>@@ -3101,6 +3106,11 @@</span><br><span>                 goto end;</span><br><span>    }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ if (ast_custom_function_register(&chan_pjsip_parse_uri_function)) {</span><br><span style="color: hsl(120, 100%, 40%);">+               ast_log(LOG_ERROR, "Unable to register PJSIP_PARSE_URI dialplan function\n");</span><br><span style="color: hsl(120, 100%, 40%);">+               goto end;</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>  if (ast_custom_function_register(&media_offer_function)) {</span><br><span>               ast_log(LOG_WARNING, "Unable to register PJSIP_MEDIA_OFFER dialplan function\n");</span><br><span>          goto end;</span><br><span>@@ -3155,6 +3165,7 @@</span><br><span>    ast_custom_function_unregister(&dtmf_mode_function);</span><br><span>     ast_custom_function_unregister(&media_offer_function);</span><br><span>   ast_custom_function_unregister(&chan_pjsip_dial_contacts_function);</span><br><span style="color: hsl(120, 100%, 40%);">+       ast_custom_function_unregister(&chan_pjsip_parse_uri_function);</span><br><span>  ast_custom_function_unregister(&session_refresh_function);</span><br><span>       ast_channel_unregister(&chan_pjsip_tech);</span><br><span>        ast_rtp_glue_unregister(&chan_pjsip_rtp_glue);</span><br><span>@@ -3179,6 +3190,7 @@</span><br><span>   ast_custom_function_unregister(&dtmf_mode_function);</span><br><span>     ast_custom_function_unregister(&media_offer_function);</span><br><span>   ast_custom_function_unregister(&chan_pjsip_dial_contacts_function);</span><br><span style="color: hsl(120, 100%, 40%);">+       ast_custom_function_unregister(&chan_pjsip_parse_uri_function);</span><br><span>  ast_custom_function_unregister(&session_refresh_function);</span><br><span> </span><br><span>   ast_channel_unregister(&chan_pjsip_tech);</span><br><span>diff --git a/channels/pjsip/dialplan_functions.c b/channels/pjsip/dialplan_functions.c</span><br><span>index d21a80c..70507bb 100644</span><br><span>--- a/channels/pjsip/dialplan_functions.c</span><br><span>+++ b/channels/pjsip/dialplan_functions.c</span><br><span>@@ -121,6 +121,60 @@</span><br><span>                <ref type="function">PJSIP_MEDIA_OFFER</ref></span><br><span>   </see-also></span><br><span> </function></span><br><span style="color: hsl(120, 100%, 40%);">+<function name="PJSIP_PARSE_URI" language="en_US"></span><br><span style="color: hsl(120, 100%, 40%);">+  <synopsis></span><br><span style="color: hsl(120, 100%, 40%);">+              Parse an uri and return a type part of the URI.</span><br><span style="color: hsl(120, 100%, 40%);">+       </synopsis></span><br><span style="color: hsl(120, 100%, 40%);">+     <syntax></span><br><span style="color: hsl(120, 100%, 40%);">+                <parameter name="uri" required="true"></span><br><span style="color: hsl(120, 100%, 40%);">+                      <para>URI to parse</para></span><br><span style="color: hsl(120, 100%, 40%);">+         </parameter></span><br><span style="color: hsl(120, 100%, 40%);">+            <parameter name="type" required="true"></span><br><span style="color: hsl(120, 100%, 40%);">+                     <para>The <literal>type</literal> parameter specifies which URI part to read</para></span><br><span style="color: hsl(120, 100%, 40%);">+                   <enumlist></span><br><span style="color: hsl(120, 100%, 40%);">+                              <enum name="display"></span><br><span style="color: hsl(120, 100%, 40%);">+                                 <para>Display name.</para></span><br><span style="color: hsl(120, 100%, 40%);">+                                </enum></span><br><span style="color: hsl(120, 100%, 40%);">+                         <enum name="scheme"></span><br><span style="color: hsl(120, 100%, 40%);">+                                  <para>URI scheme.</para></span><br><span style="color: hsl(120, 100%, 40%);">+                          </enum></span><br><span style="color: hsl(120, 100%, 40%);">+                         <enum name="user"></span><br><span style="color: hsl(120, 100%, 40%);">+                                    <para>User part.</para></span><br><span style="color: hsl(120, 100%, 40%);">+                           </enum></span><br><span style="color: hsl(120, 100%, 40%);">+                         <enum name="passwd"></span><br><span style="color: hsl(120, 100%, 40%);">+                                  <para>Password part.</para></span><br><span style="color: hsl(120, 100%, 40%);">+                               </enum></span><br><span style="color: hsl(120, 100%, 40%);">+                         <enum name="host"></span><br><span style="color: hsl(120, 100%, 40%);">+                                    <para>Host part.</para></span><br><span style="color: hsl(120, 100%, 40%);">+                           </enum></span><br><span style="color: hsl(120, 100%, 40%);">+                         <enum name="port"></span><br><span style="color: hsl(120, 100%, 40%);">+                                    <para>Port number, or zero.</para></span><br><span style="color: hsl(120, 100%, 40%);">+                                </enum></span><br><span style="color: hsl(120, 100%, 40%);">+                         <enum name="user_param"></span><br><span style="color: hsl(120, 100%, 40%);">+                                      <para>User parameter.</para></span><br><span style="color: hsl(120, 100%, 40%);">+                              </enum></span><br><span style="color: hsl(120, 100%, 40%);">+                         <enum name="method_param"></span><br><span style="color: hsl(120, 100%, 40%);">+                                    <para>Method parameter.</para></span><br><span style="color: hsl(120, 100%, 40%);">+                            </enum></span><br><span style="color: hsl(120, 100%, 40%);">+                         <enum name="transport_param"></span><br><span style="color: hsl(120, 100%, 40%);">+                                 <para>Transport parameter.</para></span><br><span style="color: hsl(120, 100%, 40%);">+                         </enum></span><br><span style="color: hsl(120, 100%, 40%);">+                         <enum name="ttl_param"></span><br><span style="color: hsl(120, 100%, 40%);">+                                       <para>TTL param, or -1.</para></span><br><span style="color: hsl(120, 100%, 40%);">+                            </enum></span><br><span style="color: hsl(120, 100%, 40%);">+                         <enum name="lr_param"></span><br><span style="color: hsl(120, 100%, 40%);">+                                        <para>Loose routing param, or zero.</para></span><br><span style="color: hsl(120, 100%, 40%);">+                                </enum></span><br><span style="color: hsl(120, 100%, 40%);">+                         <enum name="maddr_param"></span><br><span style="color: hsl(120, 100%, 40%);">+                                     <para>Maddr param.</para></span><br><span style="color: hsl(120, 100%, 40%);">+                         </enum></span><br><span style="color: hsl(120, 100%, 40%);">+                 </enumlist></span><br><span style="color: hsl(120, 100%, 40%);">+             </parameter></span><br><span style="color: hsl(120, 100%, 40%);">+    </syntax></span><br><span style="color: hsl(120, 100%, 40%);">+       <description></span><br><span style="color: hsl(120, 100%, 40%);">+           <para>Parse an URI and return a specified part of the URI.</para></span><br><span style="color: hsl(120, 100%, 40%);">+ </description></span><br><span style="color: hsl(120, 100%, 40%);">+</function></span><br><span> <info name="CHANNEL" language="en_US" tech="PJSIP"></span><br><span>   <enumlist></span><br><span>             <enum name="rtp"></span><br><span>@@ -1041,6 +1095,127 @@</span><br><span>  return state;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/*! \brief Struct used to push PJSIP_PARSE_URI function arguments to task processor */</span><br><span style="color: hsl(120, 100%, 40%);">+struct parse_uri_args {</span><br><span style="color: hsl(120, 100%, 40%);">+       const char *uri;</span><br><span style="color: hsl(120, 100%, 40%);">+      const char *type;</span><br><span style="color: hsl(120, 100%, 40%);">+     char *buf;</span><br><span style="color: hsl(120, 100%, 40%);">+    size_t buflen;</span><br><span style="color: hsl(120, 100%, 40%);">+        int ret;</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%);">+/*! \internal \brief Taskprocessor callback that handles the PJSIP_PARSE_URI on a PJSIP thread */</span><br><span style="color: hsl(120, 100%, 40%);">+static int parse_uri_cb(void *data)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+     struct parse_uri_args *args = data;</span><br><span style="color: hsl(120, 100%, 40%);">+   pj_pool_t *pool;</span><br><span style="color: hsl(120, 100%, 40%);">+      pjsip_name_addr *uri;</span><br><span style="color: hsl(120, 100%, 40%);">+ pjsip_sip_uri *sip_uri;</span><br><span style="color: hsl(120, 100%, 40%);">+       pj_str_t tmp;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       args->ret = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   pool = pjsip_endpt_create_pool(ast_sip_get_pjsip_endpoint(), "ParseUri", 128, 128);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!pool) {</span><br><span style="color: hsl(120, 100%, 40%);">+          ast_log(LOG_ERROR, "Failed to allocate ParseUri endpoint pool.\n");</span><br><span style="color: hsl(120, 100%, 40%);">+         args->ret = -1;</span><br><span style="color: hsl(120, 100%, 40%);">+            return 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%);">+   pj_strdup2_with_null(pool, &tmp, args->uri);</span><br><span style="color: hsl(120, 100%, 40%);">+   uri = (pjsip_name_addr *)pjsip_parse_uri(pool, tmp.ptr, tmp.slen, PJSIP_PARSE_URI_AS_NAMEADDR);</span><br><span style="color: hsl(120, 100%, 40%);">+       if (!uri) {</span><br><span style="color: hsl(120, 100%, 40%);">+           ast_log(LOG_WARNING, "Failed to parse URI '%s'\n", args->uri);</span><br><span style="color: hsl(120, 100%, 40%);">+           pjsip_endpt_release_pool(ast_sip_get_pjsip_endpoint(), pool);</span><br><span style="color: hsl(120, 100%, 40%);">+         args->ret = -1;</span><br><span style="color: hsl(120, 100%, 40%);">+            return 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%);">+   if (!strcmp(args->type, "scheme")) {</span><br><span style="color: hsl(120, 100%, 40%);">+             ast_copy_pj_str(args->buf, pjsip_uri_get_scheme(uri), args->buflen);</span><br><span style="color: hsl(120, 100%, 40%);">+            pjsip_endpt_release_pool(ast_sip_get_pjsip_endpoint(), pool);</span><br><span style="color: hsl(120, 100%, 40%);">+         return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+     } else if (!strcmp(args->type, "display")) {</span><br><span style="color: hsl(120, 100%, 40%);">+             ast_copy_pj_str(args->buf, &uri->display, args->buflen);</span><br><span style="color: hsl(120, 100%, 40%);">+         pjsip_endpt_release_pool(ast_sip_get_pjsip_endpoint(), pool);</span><br><span style="color: hsl(120, 100%, 40%);">+         return 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%);">+   sip_uri = pjsip_uri_get_uri(uri);</span><br><span style="color: hsl(120, 100%, 40%);">+     if (!sip_uri) {</span><br><span style="color: hsl(120, 100%, 40%);">+               ast_log(LOG_ERROR, "Failed to get an URI object for '%s'\n", args->uri);</span><br><span style="color: hsl(120, 100%, 40%);">+         pjsip_endpt_release_pool(ast_sip_get_pjsip_endpoint(), pool);</span><br><span style="color: hsl(120, 100%, 40%);">+         args->ret = -1;</span><br><span style="color: hsl(120, 100%, 40%);">+            return 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%);">+   if (!strcmp(args->type, "user")) {</span><br><span style="color: hsl(120, 100%, 40%);">+               ast_copy_pj_str(args->buf, &sip_uri->user, args->buflen);</span><br><span style="color: hsl(120, 100%, 40%);">+        } else if (!strcmp(args->type, "passwd")) {</span><br><span style="color: hsl(120, 100%, 40%);">+              ast_copy_pj_str(args->buf, &sip_uri->passwd, args->buflen);</span><br><span style="color: hsl(120, 100%, 40%);">+      } else if (!strcmp(args->type, "host")) {</span><br><span style="color: hsl(120, 100%, 40%);">+                ast_copy_pj_str(args->buf, &sip_uri->host, args->buflen);</span><br><span style="color: hsl(120, 100%, 40%);">+        } else if (!strcmp(args->type, "port")) {</span><br><span style="color: hsl(120, 100%, 40%);">+                snprintf(args->buf, args->buflen, "%d", sip_uri->port);</span><br><span style="color: hsl(120, 100%, 40%);">+    } else if (!strcmp(args->type, "user_param")) {</span><br><span style="color: hsl(120, 100%, 40%);">+          ast_copy_pj_str(args->buf, &sip_uri->user_param, args->buflen);</span><br><span style="color: hsl(120, 100%, 40%);">+  } else if (!strcmp(args->type, "method_param")) {</span><br><span style="color: hsl(120, 100%, 40%);">+                ast_copy_pj_str(args->buf, &sip_uri->method_param, args->buflen);</span><br><span style="color: hsl(120, 100%, 40%);">+        } else if (!strcmp(args->type, "transport_param")) {</span><br><span style="color: hsl(120, 100%, 40%);">+             ast_copy_pj_str(args->buf, &sip_uri->transport_param, args->buflen);</span><br><span style="color: hsl(120, 100%, 40%);">+     } else if (!strcmp(args->type, "ttl_param")) {</span><br><span style="color: hsl(120, 100%, 40%);">+           snprintf(args->buf, args->buflen, "%d", sip_uri->ttl_param);</span><br><span style="color: hsl(120, 100%, 40%);">+       } else if (!strcmp(args->type, "lr_param")) {</span><br><span style="color: hsl(120, 100%, 40%);">+            snprintf(args->buf, args->buflen, "%d", sip_uri->lr_param);</span><br><span style="color: hsl(120, 100%, 40%);">+        } else if (!strcmp(args->type, "maddr_param")) {</span><br><span style="color: hsl(120, 100%, 40%);">+         ast_copy_pj_str(args->buf, &sip_uri->maddr_param, args->buflen);</span><br><span style="color: hsl(120, 100%, 40%);">+ } else {</span><br><span style="color: hsl(120, 100%, 40%);">+              ast_log(AST_LOG_WARNING, "Unknown type part '%s' specified\n", args->type);</span><br><span style="color: hsl(120, 100%, 40%);">+              pjsip_endpt_release_pool(ast_sip_get_pjsip_endpoint(), pool);</span><br><span style="color: hsl(120, 100%, 40%);">+         args->ret = -1;</span><br><span style="color: hsl(120, 100%, 40%);">+            return 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%);">+   pjsip_endpt_release_pool(ast_sip_get_pjsip_endpoint(), pool);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       return 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%);">+int pjsip_acf_parse_uri_read(struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t buflen)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+      struct parse_uri_args func_args = { 0, };</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   AST_DECLARE_APP_ARGS(args,</span><br><span style="color: hsl(120, 100%, 40%);">+            AST_APP_ARG(uri_str);</span><br><span style="color: hsl(120, 100%, 40%);">+         AST_APP_ARG(type);</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%);">+  AST_STANDARD_APP_ARGS(args, data);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  if (ast_strlen_zero(args.uri_str)) {</span><br><span style="color: hsl(120, 100%, 40%);">+          ast_log(LOG_WARNING, "An URI must be specified when using the '%s' dialplan function\n", cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+              return -1;</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%);">+   if (ast_strlen_zero(args.type)) {</span><br><span style="color: hsl(120, 100%, 40%);">+             ast_log(LOG_WARNING, "A type part of the URI must be specified when using the '%s' dialplan function\n", cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+              return -1;</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%);">+   memset(buf, 0, buflen);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     func_args.uri = args.uri_str;</span><br><span style="color: hsl(120, 100%, 40%);">+ func_args.type = args.type;</span><br><span style="color: hsl(120, 100%, 40%);">+   func_args.buf = buf;</span><br><span style="color: hsl(120, 100%, 40%);">+  func_args.buflen = buflen;</span><br><span style="color: hsl(120, 100%, 40%);">+    if (ast_sip_push_task_wait_serializer(NULL, parse_uri_cb, &func_args)) {</span><br><span style="color: hsl(120, 100%, 40%);">+          ast_log(LOG_WARNING, "Unable to parse URI: failed to push task\n");</span><br><span style="color: hsl(120, 100%, 40%);">+         return -1;</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%);">+   return func_args.ret;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> static int media_offer_read_av(struct ast_sip_session *session, char *buf,</span><br><span>                            size_t len, enum ast_media_type media_type)</span><br><span> {</span><br><span>diff --git a/channels/pjsip/include/dialplan_functions.h b/channels/pjsip/include/dialplan_functions.h</span><br><span>index 731e91d..a9332a2 100644</span><br><span>--- a/channels/pjsip/include/dialplan_functions.h</span><br><span>+++ b/channels/pjsip/include/dialplan_functions.h</span><br><span>@@ -110,4 +110,17 @@</span><br><span>  */</span><br><span> int pjsip_acf_dial_contacts_read(struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t len);</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/*!</span><br><span style="color: hsl(120, 100%, 40%);">+ * \brief PJSIP_PARSE_URI function read callback</span><br><span style="color: hsl(120, 100%, 40%);">+ * \param chan The channel the function is called on</span><br><span style="color: hsl(120, 100%, 40%);">+ * \param cmd The name of the function</span><br><span style="color: hsl(120, 100%, 40%);">+ * \param data Arguments passed to the function</span><br><span style="color: hsl(120, 100%, 40%);">+ * \param buf Out buffer that should be populated with the data</span><br><span style="color: hsl(120, 100%, 40%);">+ * \param len Size of the buffer</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * \retval 0 on success</span><br><span style="color: hsl(120, 100%, 40%);">+ * \retval -1 on failure</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+int pjsip_acf_parse_uri_read(struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t len);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> #endif /* _PJSIP_DIALPLAN_FUNCTIONS */</span><br><span>\ No newline at end of file</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.asterisk.org/10633">change 10633</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/10633"/><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: I5d828fb87f6803b6c1152bb7b44835f027bb9d5a </div>
<div style="display:none"> Gerrit-Change-Number: 10633 </div>
<div style="display:none"> Gerrit-PatchSet: 2 </div>
<div style="display:none"> Gerrit-Owner: Alexei Gradinari <alex2grad@gmail.com> </div>
<div style="display:none"> Gerrit-Reviewer: George Joseph <gjoseph@digium.com> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins2 (1000185) </div>
<div style="display:none"> Gerrit-Reviewer: Joshua Colp <jcolp@digium.com> </div>