<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="Generator" content="Microsoft Word 15 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
        {font-family:Tahoma;
        panose-1:2 11 6 4 3 5 4 4 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0in;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
span.EmailStyle18
        {mso-style-type:personal-reply;
        font-family:"Calibri",sans-serif;
        color:windowtext;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-family:"Calibri",sans-serif;}
@page WordSection1
        {size:8.5in 11.0in;
        margin:1.0in 1.0in 1.0in 1.0in;}
div.WordSection1
        {page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
</head>
<body lang="EN-US" link="blue" vlink="purple" style="word-wrap:break-word">
<div class="WordSection1">
<p class="MsoNormal">We found no way to do this from AMI.<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Very tied up on other projects, but if another developer wanted to look into adding support for it, I believe it would be something along these lines….<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">int action_hold(struct mansession *s, const struct message *m)<o:p></o:p></p>
<p class="MsoNormal">{<o:p></o:p></p>
<p class="MsoNormal">    const char *channelarg = astman_get_header(m, "Channel");<o:p></o:p></p>
<p class="MsoNormal">    struct ast_channel *chan = NULL;<o:p></o:p></p>
<p class="MsoNormal">    int res = -1;<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">    if (ast_strlen_zero(channelarg))<o:p></o:p></p>
<p class="MsoNormal">    {<o:p></o:p></p>
<p class="MsoNormal">        astman_send_error(s, m, "No channel specified");<o:p></o:p></p>
<p class="MsoNormal">        return 0;<o:p></o:p></p>
<p class="MsoNormal">    }<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">    chan = ast_channel_get_by_name(channelarg);<o:p></o:p></p>
<p class="MsoNormal">    if (chan)<o:p></o:p></p>
<p class="MsoNormal">    {<o:p></o:p></p>
<p class="MsoNormal">        ast_log(LOG_DEBUG, "Putting channel %s on hold (0x%p)\n", ast_channel_name(chan), chan);<o:p></o:p></p>
<p class="MsoNormal">        if ((res = ast_indicate(chan, AST_CONTROL_HOLD)))<o:p></o:p></p>
<p class="MsoNormal">        {<o:p></o:p></p>
<p class="MsoNormal">            astman_send_error(s, m, "Failed to put channel on hold");<o:p></o:p></p>
<p class="MsoNormal">        }<o:p></o:p></p>
<p class="MsoNormal">        ast_channel_unref(chan);<o:p></o:p></p>
<p class="MsoNormal">    }<o:p></o:p></p>
<p class="MsoNormal">    else astman_send_error(s, m, "No such channel");<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">    if (!res) astman_send_ack(s, m, "Hold");<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">    return 0;<o:p></o:p></p>
<p class="MsoNormal">}<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">int action_unhold(struct mansession *s, const struct message *m)<o:p></o:p></p>
<p class="MsoNormal">{<o:p></o:p></p>
<p class="MsoNormal">    const char *channelarg = astman_get_header(m, "Channel");<o:p></o:p></p>
<p class="MsoNormal">    struct ast_channel *chan = NULL;<o:p></o:p></p>
<p class="MsoNormal">    int res = -1;<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">    if (ast_strlen_zero(channelarg))<o:p></o:p></p>
<p class="MsoNormal">    {<o:p></o:p></p>
<p class="MsoNormal">        astman_send_error(s, m, "No channel specified");<o:p></o:p></p>
<p class="MsoNormal">        return 0;<o:p></o:p></p>
<p class="MsoNormal">    }<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">    chan = ast_channel_get_by_name(channelarg);<o:p></o:p></p>
<p class="MsoNormal">    if (chan)<o:p></o:p></p>
<p class="MsoNormal">    {<o:p></o:p></p>
<p class="MsoNormal">        if ((res = ast_indicate(chan, AST_CONTROL_UNHOLD)))<o:p></o:p></p>
<p class="MsoNormal">        {<o:p></o:p></p>
<p class="MsoNormal">            astman_send_error(s, m, "Failed to remove channel from hold");<o:p></o:p></p>
<p class="MsoNormal">        }<o:p></o:p></p>
<p class="MsoNormal">        ast_channel_unref(chan);<o:p></o:p></p>
<p class="MsoNormal">    }<o:p></o:p></p>
<p class="MsoNormal">    else astman_send_error(s, m, "No such channel");<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">    if (!res) astman_send_ack(s, m, "Unhold");<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">    return 0;<o:p></o:p></p>
<p class="MsoNormal">}<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">const char *hold_synopsis = "Place Channel on Hold";<o:p></o:p></p>
<p class="MsoNormal">const char *hold_desc = "Place the channel specified by the 'Channel' argument on Hold";<o:p></o:p></p>
<p class="MsoNormal">const char *unhold_synopsis = "Remove Channel from Hold";<o:p></o:p></p>
<p class="MsoNormal">const char *unhold_desc = "Remove the channel specified by the 'Channel' argument from Hold";<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">ast_manager_register2("Hold", EVENT_FLAG_CALL, action_hold, AST_MODULE_SELF, hold_synopsis, hold_desc);<o:p></o:p></p>
<p class="MsoNormal">ast_manager_register2("UnHold", EVENT_FLAG_CALL, action_unhold, AST_MODULE_SELF, unhold_synopsis, unhold_desc);<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<div style="border:none;border-top:solid #E1E1E1 1.0pt;padding:3.0pt 0in 0in 0in">
<p class="MsoNormal"><b>From:</b> asterisk-users <asterisk-users-bounces@lists.digium.com>
<b>On Behalf Of </b>Joshua C. Colp<br>
<b>Sent:</b> Wednesday, July 21, 2021 5:57 AM<br>
<b>To:</b> Asterisk Users Mailing List - Non-Commercial Discussion <asterisk-users@lists.digium.com><br>
<b>Subject:</b> Re: [asterisk-users] Call Hold / Transfer via AMI<o:p></o:p></p>
</div>
<p class="MsoNormal"><o:p> </o:p></p>
<div>
<div>
<p class="MsoNormal">On Wed, Jul 21, 2021 at 7:39 AM Antony Stone <<a href="mailto:Antony.Stone@asterisk.open.source.it">Antony.Stone@asterisk.open.source.it</a>> wrote:<o:p></o:p></p>
</div>
<div>
<blockquote style="border:none;border-left:solid #CCCCCC 1.0pt;padding:0in 0in 0in 6.0pt;margin-left:4.8pt;margin-right:0in">
<p class="MsoNormal">Hi.<br>
<br>
From the lack of response to my question, I'm assuming that either:<br>
<br>
a) putting a call on hold is not possible via AMI<br>
or<br>
b) everyone thinks it's so obvious that I should be able to see it for myself<br>
<br>
Can anyone confirm one way or the other?<br>
<br>
If it simply isn't possible, I'd like to put my efforts into exploring <br>
alternative solutions instead of spending more time on AMI.<o:p></o:p></p>
</blockquote>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">From a surface level I know of no way from AMI to control putting a call on and off hold.<o:p></o:p></p>
</div>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<p class="MsoNormal">-- <o:p></o:p></p>
<div>
<div>
<div>
<div>
<div>
<div>
<div>
<div>
<div>
<div>
<p class="MsoNormal"><span style="font-family:"Tahoma",sans-serif;color:#073763">Joshua C. Colp</span><span style="font-family:"Tahoma",sans-serif"><o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-family:"Tahoma",sans-serif;color:#073763">Asterisk Technical Lead</span><span style="font-family:"Tahoma",sans-serif"><o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-family:"Tahoma",sans-serif;color:#073763">Sangoma Technologies</span><span style="font-family:"Tahoma",sans-serif"><o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-family:"Tahoma",sans-serif;color:#073763">Check us out at
<a href="http://www.sangoma.com" target="_blank">www.sangoma.com</a> and <a href="http://www.asterisk.org" target="_blank">
www.asterisk.org</a></span><span style="font-family:"Tahoma",sans-serif"><o:p></o:p></span></p>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<span style="font-size:10.0pt"><br>
This email is intended only for the use of the party to which it is addressed and may contain information that is privileged, confidential, or protected by law. If you are not the intended recipient you are hereby notified that any dissemination, copying or
 distribution of this email or its contents is strictly prohibited. If you have received this message in error, please notify us immediately by replying to the message and deleting it from your computer.
</span>
</body>
</html>