<p>Alexei Gradinari has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.asterisk.org/10633">View Change</a></p><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, 206 insertions(+), 0 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.asterisk.org:29418/asterisk refs/changes/33/10633/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/CHANGES b/CHANGES</span><br><span>index e00c16f..48334fc 100644</span><br><span>--- a/CHANGES</span><br><span>+++ b/CHANGES</span><br><span>@@ -12,6 +12,12 @@</span><br><span> --- Functionality changes from Asterisk 16.0.0 to Asterisk 16.1.0 ------------</span><br><span> ------------------------------------------------------------------------------</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 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: newchange </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: 1 </div>
<div style="display:none"> Gerrit-Owner: Alexei Gradinari <alex2grad@gmail.com> </div>