<p>Alexei Gradinari has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.asterisk.org/c/asterisk/+/11381">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">app_blind_transfer: new application BlindTransfer<br><br>BlindTransfer redirects all channels currently bridged to the<br>caller channel to the specified destination.<br><br>Change-Id: I9d55e7f69ccfd4472dec00d62771d6de8803215a<br>---<br>A apps/app_blind_transfer.c<br>A doc/CHANGES-staging/app_blind_transfer.txt<br>M menuselect/example_menuselect-tree<br>M menuselect/test/menuselect-tree<br>4 files changed, 147 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/81/11381/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/apps/app_blind_transfer.c b/apps/app_blind_transfer.c</span><br><span>new file mode 100644</span><br><span>index 0000000..c64d286</span><br><span>--- /dev/null</span><br><span>+++ b/apps/app_blind_transfer.c</span><br><span>@@ -0,0 +1,139 @@</span><br><span style="color: hsl(120, 100%, 40%);">+/*</span><br><span style="color: hsl(120, 100%, 40%);">+ * Asterisk -- An open source telephony toolkit.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * Copyright (C) 2019, Alexei Gradinari</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * Alexei Gradinari <alex2grad@gmail.com></span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * See http://www.asterisk.org for more information about</span><br><span style="color: hsl(120, 100%, 40%);">+ * the Asterisk project. Please do not directly contact</span><br><span style="color: hsl(120, 100%, 40%);">+ * any of the maintainers of this project for assistance;</span><br><span style="color: hsl(120, 100%, 40%);">+ * the project provides a web site, mailing lists and IRC</span><br><span style="color: hsl(120, 100%, 40%);">+ * channels for your use.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * This program is free software, distributed under the terms of</span><br><span style="color: hsl(120, 100%, 40%);">+ * the GNU General Public License Version 2. See the LICENSE file</span><br><span style="color: hsl(120, 100%, 40%);">+ * at the top of the source tree.</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%);">+/*! \file</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * \brief Blind transfer by caller channel</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * \author Alexei Gradinari <alex2grad@gmail.com></span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * \ingroup applications</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%);">+/*** MODULEINFO</span><br><span style="color: hsl(120, 100%, 40%);">+      <support_level>core</support_level></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%);">+#include "asterisk.h"</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include "asterisk/pbx.h"</span><br><span style="color: hsl(120, 100%, 40%);">+#include "asterisk/module.h"</span><br><span style="color: hsl(120, 100%, 40%);">+#include "asterisk/app.h"</span><br><span style="color: hsl(120, 100%, 40%);">+#include "asterisk/channel.h"</span><br><span style="color: hsl(120, 100%, 40%);">+#include "asterisk/bridge.h"</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/*** DOCUMENTATION</span><br><span style="color: hsl(120, 100%, 40%);">+  <application name="BlindTransfer" language="en_US"></span><br><span style="color: hsl(120, 100%, 40%);">+         <synopsis></span><br><span style="color: hsl(120, 100%, 40%);">+                      Blind transfer channel(s) to the extension and context provided</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="exten" required="true"></span><br><span style="color: hsl(120, 100%, 40%);">+                            <para>Specify extension.</para></span><br><span style="color: hsl(120, 100%, 40%);">+                   </parameter></span><br><span style="color: hsl(120, 100%, 40%);">+                    <parameter name="context"></span><br><span style="color: hsl(120, 100%, 40%);">+                            <para>Optionally specify a context.</span><br><span style="color: hsl(120, 100%, 40%);">+                             By default, Asterisk will use the caller channel context.</para></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>Redirect all channels currently bridged to the caller channel to the</span><br><span style="color: hsl(120, 100%, 40%);">+                      specified destination.</para></span><br><span style="color: hsl(120, 100%, 40%);">+                   <para>The result of the application will be reported in the <variable>BLINDTRANSFERSTATUS</variable></span><br><span style="color: hsl(120, 100%, 40%);">+                        channel variable:</para></span><br><span style="color: hsl(120, 100%, 40%);">+                        <variablelist></span><br><span style="color: hsl(120, 100%, 40%);">+                          <variable name="BLINDTRANSFERSTATUS"></span><br><span style="color: hsl(120, 100%, 40%);">+                                 <value name="SUCCESS"></span><br><span style="color: hsl(120, 100%, 40%);">+                                                Transfer succeeded.</span><br><span style="color: hsl(120, 100%, 40%);">+                                   </value></span><br><span style="color: hsl(120, 100%, 40%);">+                                        <value name="FAILURE"></span><br><span style="color: hsl(120, 100%, 40%);">+                                                Transfer failed.</span><br><span style="color: hsl(120, 100%, 40%);">+                                      </value></span><br><span style="color: hsl(120, 100%, 40%);">+                                        <value name="INVALID"></span><br><span style="color: hsl(120, 100%, 40%);">+                                                Transfer invalid.</span><br><span style="color: hsl(120, 100%, 40%);">+                                     </value></span><br><span style="color: hsl(120, 100%, 40%);">+                                        <value name="NOTPERMITTED"></span><br><span style="color: hsl(120, 100%, 40%);">+                                           Transfer not permitted.</span><br><span style="color: hsl(120, 100%, 40%);">+                                       </value></span><br><span style="color: hsl(120, 100%, 40%);">+                                </variable></span><br><span style="color: hsl(120, 100%, 40%);">+                     </variablelist></span><br><span style="color: hsl(120, 100%, 40%);">+         </description></span><br><span style="color: hsl(120, 100%, 40%);">+  </application></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%);">+static const char * const app = "BlindTransfer";</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static int blind_transfer_exec(struct ast_channel *chan, const char *data)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+    int res = -1;</span><br><span style="color: hsl(120, 100%, 40%);">+ char *exten = NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+   char *context = NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+ char *parse;</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(exten);</span><br><span style="color: hsl(120, 100%, 40%);">+           AST_APP_ARG(context);</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((char *)data)) {</span><br><span style="color: hsl(120, 100%, 40%);">+          ast_log(LOG_WARNING, "%s requires an argument (exten)\n", app);</span><br><span style="color: hsl(120, 100%, 40%);">+             pbx_builtin_setvar_helper(chan, "BLINDTRANSFERSTATUS", "FAILURE");</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%);">+   parse = ast_strdupa(data);</span><br><span style="color: hsl(120, 100%, 40%);">+    AST_STANDARD_APP_ARGS(args, parse);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ exten = args.exten;</span><br><span style="color: hsl(120, 100%, 40%);">+   if (ast_strlen_zero(args.context)) {</span><br><span style="color: hsl(120, 100%, 40%);">+          context = (char *)ast_channel_context(chan);</span><br><span style="color: hsl(120, 100%, 40%);">+  } else {</span><br><span style="color: hsl(120, 100%, 40%);">+              context = args.context;</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 (ast_bridge_transfer_blind(1, chan, exten, context, NULL, NULL)) {</span><br><span style="color: hsl(120, 100%, 40%);">+             case AST_BRIDGE_TRANSFER_NOT_PERMITTED:</span><br><span style="color: hsl(120, 100%, 40%);">+                       pbx_builtin_setvar_helper(chan, "BLINDTRANSFERSTATUS", "NOTPERMITTED");</span><br><span style="color: hsl(120, 100%, 40%);">+                   break;</span><br><span style="color: hsl(120, 100%, 40%);">+                case AST_BRIDGE_TRANSFER_INVALID:</span><br><span style="color: hsl(120, 100%, 40%);">+                     pbx_builtin_setvar_helper(chan, "BLINDTRANSFERSTATUS", "INVALID");</span><br><span style="color: hsl(120, 100%, 40%);">+                        break;</span><br><span style="color: hsl(120, 100%, 40%);">+                case AST_BRIDGE_TRANSFER_FAIL:</span><br><span style="color: hsl(120, 100%, 40%);">+                        pbx_builtin_setvar_helper(chan, "BLINDTRANSFERSTATUS", "FAILURE");</span><br><span style="color: hsl(120, 100%, 40%);">+                        break;</span><br><span style="color: hsl(120, 100%, 40%);">+                case AST_BRIDGE_TRANSFER_SUCCESS:</span><br><span style="color: hsl(120, 100%, 40%);">+                     pbx_builtin_setvar_helper(chan, "BLINDTRANSFERSTATUS", "SUCCESS");</span><br><span style="color: hsl(120, 100%, 40%);">+                        res = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+                      break;</span><br><span style="color: hsl(120, 100%, 40%);">+                default:</span><br><span style="color: hsl(120, 100%, 40%);">+                      pbx_builtin_setvar_helper(chan, "BLINDTRANSFERSTATUS", "FAILURE");</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 res;</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%);">+static int unload_module(void)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+   return ast_unregister_application(app);</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%);">+static int load_module(void)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ return ast_register_application_xml(app, blind_transfer_exec);</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_MODULE_INFO_STANDARD(ASTERISK_GPL_KEY, "Blind transfer channel to the given destination");</span><br><span>diff --git a/doc/CHANGES-staging/app_blind_transfer.txt b/doc/CHANGES-staging/app_blind_transfer.txt</span><br><span>new file mode 100644</span><br><span>index 0000000..dc86df0</span><br><span>--- /dev/null</span><br><span>+++ b/doc/CHANGES-staging/app_blind_transfer.txt</span><br><span>@@ -0,0 +1,4 @@</span><br><span style="color: hsl(120, 100%, 40%);">+Subject: BlindTransfer</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+A new application, this will redirect all channels currently</span><br><span style="color: hsl(120, 100%, 40%);">+bridged to the caller channel to the specified destination.</span><br><span>diff --git a/menuselect/example_menuselect-tree b/menuselect/example_menuselect-tree</span><br><span>index 6901b70..be07fda 100644</span><br><span>--- a/menuselect/example_menuselect-tree</span><br><span>+++ b/menuselect/example_menuselect-tree</span><br><span>@@ -10,6 +10,8 @@</span><br><span>              </member></span><br><span>              <member name="app_authenticate" displayname="Authentication Application" remove_on_change="apps/app_authenticate.o apps/app_authenticate.so"></span><br><span>            </member></span><br><span style="color: hsl(120, 100%, 40%);">+               <member name="app_blind_transfer" displayname="Blind transfer by caller channel" remove_on_change="apps/app_blind_transfer.o apps/app_blind_transfer.so"></span><br><span style="color: hsl(120, 100%, 40%);">+         </member></span><br><span>              <member name="app_cdr" displayname="Tell Asterisk to not maintain a CDR for the current call" remove_on_change="apps/app_cdr.o apps/app_cdr.so"></span><br><span>                 </member></span><br><span>              <member name="app_chanisavail" displayname="Check channel availability" remove_on_change="apps/app_chanisavail.o apps/app_chanisavail.so"></span><br><span>diff --git a/menuselect/test/menuselect-tree b/menuselect/test/menuselect-tree</span><br><span>index 40c08b6..ac69e90 100644</span><br><span>--- a/menuselect/test/menuselect-tree</span><br><span>+++ b/menuselect/test/menuselect-tree</span><br><span>@@ -11,6 +11,8 @@</span><br><span> </member></span><br><span> <member name="app_authenticate" displayname="Authentication Application" remove_on_change="apps/app_authenticate.o apps/app_authenticate.so"></span><br><span> </member></span><br><span style="color: hsl(120, 100%, 40%);">+<member name="app_blind_transfer" displayname="Blind transfer by caller channel" remove_on_change="apps/app_blind_transfer.o apps/app_blind_transfer.so"></span><br><span style="color: hsl(120, 100%, 40%);">+</member></span><br><span> <member name="app_cdr" displayname="Tell Asterisk to not maintain a CDR for the current call" remove_on_change="apps/app_cdr.o apps/app_cdr.so"></span><br><span> </member></span><br><span> <member name="app_chanisavail" displayname="Check channel availability" remove_on_change="apps/app_chanisavail.o apps/app_chanisavail.so"></span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.asterisk.org/c/asterisk/+/11381">change 11381</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/c/asterisk/+/11381"/><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-Change-Id: I9d55e7f69ccfd4472dec00d62771d6de8803215a </div>
<div style="display:none"> Gerrit-Change-Number: 11381 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: Alexei Gradinari <alex2grad@gmail.com> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>