summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoshua Colp <jcolp@digium.com>2016-05-31 16:36:35 -0500
committerGerrit Code Review <gerrit2@gerrit.digium.api>2016-05-31 16:36:35 -0500
commit608e0267e8512e16e186cbdc874cd7902e287ff7 (patch)
tree6f632eaf07b813be6ef771dca26876ed3c379b37
parentad31e5bb1c663b3b4c64f5668728dac70dfb4af1 (diff)
parent205a31f86c4ceec4966492363fb9ac674c990235 (diff)
Merge "Expand the scope of Dial Events"
-rw-r--r--CHANGES11
-rw-r--r--UPGRADE.txt8
-rw-r--r--apps/app_dial.c5
-rw-r--r--apps/app_followme.c3
-rw-r--r--apps/app_queue.c4
-rw-r--r--main/bridge_channel.c29
-rw-r--r--main/cdr.c9
-rw-r--r--main/dial.c3
-rw-r--r--main/manager_channels.c36
-rw-r--r--main/stasis_channels.c2
10 files changed, 107 insertions, 3 deletions
diff --git a/CHANGES b/CHANGES
index ea07bb698..6ffefbf35 100644
--- a/CHANGES
+++ b/CHANGES
@@ -12,6 +12,13 @@
--- Functionality changes from Asterisk 13 to Asterisk 14 --------------------
------------------------------------------------------------------------------
+AMI
+-----------------
+ * A new event, "DialState" has been added. This is similar to "DialBegin" and
+ "DialEnd" in that it tracks the state of a dialed call. The difference is that
+ this indicates some intermediate state change in the dial attempt, such as
+ "RINGING", "PROGRESS", or "PROCEEDING".
+
ARI
-----------------
* A new ARI method has been added to the channels resource. "create" allows for
@@ -37,6 +44,10 @@ ARI
transmit the raw media file to the requester as binary.
+ * "Dial" events have been modified to not only be sent when dialing begins and ends.
+ They now are also sent for intermediate states, such as "RINGING", "PROGRESS", and
+ "PROCEEDING".
+
Applications
------------------
diff --git a/UPGRADE.txt b/UPGRADE.txt
index 131ce6caa..f8fa7906b 100644
--- a/UPGRADE.txt
+++ b/UPGRADE.txt
@@ -22,6 +22,14 @@
=== UPGRADE-13.txt -- Upgrade info for 12 to 13
===========================================================
+ARI:
+ - The policy for when to send "Dial" events has changed. Previously, "Dial"
+ events were sent on the calling channel's topic. However, starting in Asterisk
+ 14, if there is no calling channel on which to send the event, the event is
+ instead sent on the called channel's topic. Note that for the ARI channels
+ resource's dial operation, this means that the "Dial" events will always be
+ sent on the called channel's topic.
+
Channel Drivers:
chan_dahdi:
diff --git a/apps/app_dial.c b/apps/app_dial.c
index 11591bdfb..5e034d3eb 100644
--- a/apps/app_dial.c
+++ b/apps/app_dial.c
@@ -872,6 +872,8 @@ static void do_forward(struct chanlist *o, struct cause_args *num,
/* If we have been told to ignore forwards, just set this channel to null and continue processing extensions normally */
if (ast_test_flag64(peerflags, OPT_IGNORE_FORWARDING)) {
ast_verb(3, "Forwarding %s to '%s/%s' prevented.\n", ast_channel_name(in), tech, stuff);
+ ast_channel_publish_dial_forward(in, original, NULL, NULL, "CANCEL",
+ ast_channel_call_forward(original));
c = o->chan = NULL;
cause = AST_CAUSE_BUSY;
} else {
@@ -1385,6 +1387,7 @@ static struct ast_channel *wait_for_answer(struct ast_channel *in,
pa->sentringing++;
}
}
+ ast_channel_publish_dial(in, c, NULL, "RINGING");
break;
case AST_CONTROL_PROGRESS:
ast_verb(3, "%s is making progress passing it to %s\n", ast_channel_name(c), ast_channel_name(in));
@@ -1404,6 +1407,7 @@ static struct ast_channel *wait_for_answer(struct ast_channel *in,
dtmf_progress);
ast_dtmf_stream(c, in, dtmf_progress, 250, 0);
}
+ ast_channel_publish_dial(in, c, NULL, "PROGRESS");
break;
case AST_CONTROL_VIDUPDATE:
case AST_CONTROL_SRCUPDATE:
@@ -1476,6 +1480,7 @@ static struct ast_channel *wait_for_answer(struct ast_channel *in,
}
if (!ast_test_flag64(outgoing, OPT_RINGBACK))
ast_indicate(in, AST_CONTROL_PROCEEDING);
+ ast_channel_publish_dial(in, c, NULL, "PROCEEDING");
break;
case AST_CONTROL_HOLD:
/* XXX this should be saved like AST_CONTROL_CONNECTED_LINE for !single || caller_entertained */
diff --git a/apps/app_followme.c b/apps/app_followme.c
index 7d13bb4b4..a955843bc 100644
--- a/apps/app_followme.c
+++ b/apps/app_followme.c
@@ -848,9 +848,11 @@ static struct ast_channel *wait_for_winner(struct findme_user_listptr *findme_us
break;
case AST_CONTROL_RINGING:
ast_verb(3, "%s is ringing\n", ast_channel_name(winner));
+ ast_channel_publish_dial(caller, winner, NULL, "RINGING");
break;
case AST_CONTROL_PROGRESS:
ast_verb(3, "%s is making progress\n", ast_channel_name(winner));
+ ast_channel_publish_dial(caller, winner, NULL, "PROGRESS");
break;
case AST_CONTROL_VIDUPDATE:
ast_verb(3, "%s requested a video update\n", ast_channel_name(winner));
@@ -860,6 +862,7 @@ static struct ast_channel *wait_for_winner(struct findme_user_listptr *findme_us
break;
case AST_CONTROL_PROCEEDING:
ast_verb(3, "%s is proceeding\n", ast_channel_name(winner));
+ ast_channel_publish_dial(caller, winner, NULL, "PROCEEDING");
break;
case AST_CONTROL_HOLD:
ast_verb(3, "%s placed call on hold\n", ast_channel_name(winner));
diff --git a/apps/app_queue.c b/apps/app_queue.c
index 8171d11cb..165924e0c 100644
--- a/apps/app_queue.c
+++ b/apps/app_queue.c
@@ -4846,6 +4846,8 @@ static struct callattempt *wait_for_answer(struct queue_ent *qe, struct callatte
/* Before processing channel, go ahead and check for forwarding */
if (!ast_strlen_zero(ast_channel_call_forward(o->chan)) && !forwardsallowed) {
ast_verb(3, "Forwarding %s to '%s' prevented.\n", inchan_name, ast_channel_call_forward(o->chan));
+ ast_channel_publish_dial_forward(qe->chan, o->chan, NULL, NULL,
+ "CANCEL", ast_channel_call_forward(o->chan));
numnochan++;
do_hang(o);
winner = NULL;
@@ -5052,6 +5054,8 @@ static struct callattempt *wait_for_answer(struct queue_ent *qe, struct callatte
case AST_CONTROL_RINGING:
ast_verb(3, "%s is ringing\n", ochan_name);
+ ast_channel_publish_dial(qe->chan, o->chan, on, "RINGING");
+
/* Start ring indication when the channel is ringing, if specified */
if (qe->ring_when_ringing) {
ast_moh_stop(qe->chan);
diff --git a/main/bridge_channel.c b/main/bridge_channel.c
index db4ecfe57..6766dff8e 100644
--- a/main/bridge_channel.c
+++ b/main/bridge_channel.c
@@ -2393,6 +2393,14 @@ static struct ast_frame *bridge_handle_dtmf(struct ast_bridge_channel *bridge_ch
return frame;
}
+static const char *controls[] = {
+ [AST_CONTROL_RINGING] = "RINGING",
+ [AST_CONTROL_PROCEEDING] = "PROCEEDING",
+ [AST_CONTROL_PROGRESS] = "PROGRESS",
+ [AST_CONTROL_BUSY] = "BUSY",
+ [AST_CONTROL_CONGESTION] = "CONGESTION",
+ [AST_CONTROL_ANSWER] = "ANSWER",
+};
/*!
* \internal
@@ -2404,6 +2412,17 @@ static void bridge_handle_trip(struct ast_bridge_channel *bridge_channel)
{
struct ast_frame *frame;
+ if (!ast_strlen_zero(ast_channel_call_forward(bridge_channel->chan))) {
+ /* TODO If early bridging is ever used by anything other than ARI,
+ * it's important that we actually attempt to handle the call forward
+ * attempt, as well as expand features on a bridge channel to allow/disallow
+ * call forwarding. For now, all we do is raise an event, showing that
+ * a call forward is being attempted.
+ */
+ ast_channel_publish_dial_forward(NULL, bridge_channel->chan, NULL, NULL, "CANCEL",
+ ast_channel_call_forward(bridge_channel->chan));
+ }
+
if (bridge_channel->features->mute) {
frame = ast_read_noaudio(bridge_channel->chan);
} else {
@@ -2417,10 +2436,20 @@ static void bridge_handle_trip(struct ast_bridge_channel *bridge_channel)
switch (frame->frametype) {
case AST_FRAME_CONTROL:
switch (frame->subclass.integer) {
+ case AST_CONTROL_CONGESTION:
+ case AST_CONTROL_BUSY:
+ ast_channel_publish_dial(NULL, bridge_channel->chan, NULL, controls[frame->subclass.integer]);
+ break;
case AST_CONTROL_HANGUP:
ast_bridge_channel_kick(bridge_channel, 0);
bridge_frame_free(frame);
return;
+ case AST_CONTROL_RINGING:
+ case AST_CONTROL_PROGRESS:
+ case AST_CONTROL_PROCEEDING:
+ case AST_CONTROL_ANSWER:
+ ast_channel_publish_dial(NULL, bridge_channel->chan, NULL, controls[frame->subclass.integer]);
+ break;
default:
break;
}
diff --git a/main/cdr.c b/main/cdr.c
index b6a0b428c..b43e3610c 100644
--- a/main/cdr.c
+++ b/main/cdr.c
@@ -1902,6 +1902,13 @@ static int filter_channel_cache_message(struct ast_channel_snapshot *old_snapsho
return ret;
}
+static int dial_status_end(const char *dialstatus)
+{
+ return (strcmp(dialstatus, "RINGING") &&
+ strcmp(dialstatus, "PROCEEDING") &&
+ strcmp(dialstatus, "PROGRESS"));
+}
+
/* TOPIC ROUTER CALLBACKS */
/*!
@@ -1970,7 +1977,7 @@ static void handle_dial_message(void *data, struct stasis_subscription *sub, str
res &= it_cdr->fn_table->process_dial_begin(it_cdr,
caller,
peer);
- } else {
+ } else if (dial_status_end(dial_status)) {
if (!it_cdr->fn_table->process_dial_end) {
continue;
}
diff --git a/main/dial.c b/main/dial.c
index fc66af5a7..bac191e06 100644
--- a/main/dial.c
+++ b/main/dial.c
@@ -627,11 +627,13 @@ static void handle_frame(struct ast_dial *dial, struct ast_dial_channel *channel
break;
case AST_CONTROL_RINGING:
ast_verb(3, "%s is ringing\n", ast_channel_name(channel->owner));
+ ast_channel_publish_dial(chan, channel->owner, channel->device, "RINGING");
if (chan && !dial->options[AST_DIAL_OPTION_MUSIC])
ast_indicate(chan, AST_CONTROL_RINGING);
set_state(dial, AST_DIAL_RESULT_RINGING);
break;
case AST_CONTROL_PROGRESS:
+ ast_channel_publish_dial(chan, channel->owner, channel->device, "PROGRESS");
if (chan) {
ast_verb(3, "%s is making progress, passing it to %s\n", ast_channel_name(channel->owner), ast_channel_name(chan));
ast_indicate(chan, AST_CONTROL_PROGRESS);
@@ -675,6 +677,7 @@ static void handle_frame(struct ast_dial *dial, struct ast_dial_channel *channel
}
break;
case AST_CONTROL_PROCEEDING:
+ ast_channel_publish_dial(chan, channel->owner, channel->device, "PROCEEDING");
if (chan) {
ast_verb(3, "%s is proceeding, passing it to %s\n", ast_channel_name(channel->owner), ast_channel_name(chan));
ast_indicate(chan, AST_CONTROL_PROCEEDING);
diff --git a/main/manager_channels.c b/main/manager_channels.c
index c395708cc..ec1f807dc 100644
--- a/main/manager_channels.c
+++ b/main/manager_channels.c
@@ -142,6 +142,33 @@ ASTERISK_REGISTER_FILE()
</see-also>
</managerEventInstance>
</managerEvent>
+ <managerEvent language="en_US" name="DialState">
+ <managerEventInstance class="EVENT_FLAG_CALL">
+ <synopsis>Raised when dial status has changed.</synopsis>
+ <syntax>
+ <channel_snapshot/>
+ <channel_snapshot prefix="Dest"/>
+ <parameter name="DialStatus">
+ <para> The new state of the outbound dial attempt.</para>
+ <enumlist>
+ <enum name="RINGING">
+ <para>The outbound channel is ringing.</para>
+ </enum>
+ <enum name="PROCEEDING">
+ <para>The call to the outbound channel is proceeding.</para>
+ </enum>
+ <enum name="PROGRESS">
+ <para>Progress has been received on the outbound channel.</para>
+ </enum>
+ </enumlist>
+ </parameter>
+ <parameter name="Forward" required="false">
+ <para>If the call was forwarded, where the call was
+ forwarded to.</para>
+ </parameter>
+ </syntax>
+ </managerEventInstance>
+ </managerEvent>
<managerEvent language="en_US" name="DialEnd">
<managerEventInstance class="EVENT_FLAG_CALL">
<synopsis>Raised when a dial action has completed.</synopsis>
@@ -1034,6 +1061,13 @@ static void channel_monitor_stop_cb(void *data, struct stasis_subscription *sub,
publish_basic_channel_event("MonitorStop", EVENT_FLAG_CALL, payload->snapshot);
}
+static int dial_status_end(const char *dialstatus)
+{
+ return (strcmp(dialstatus, "RINGING") &&
+ strcmp(dialstatus, "PROCEEDING") &&
+ strcmp(dialstatus, "PROGRESS"));
+}
+
/*!
* \brief Callback processing messages for channel dialing
*/
@@ -1077,7 +1111,7 @@ static void channel_dial_cb(void *data, struct stasis_subscription *sub,
} else {
int forwarded = !ast_strlen_zero(forward);
- manager_event(EVENT_FLAG_CALL, "DialEnd",
+ manager_event(EVENT_FLAG_CALL, dial_status_end(dialstatus) ? "DialEnd" : "DialState",
"%s"
"%s"
"%s%s%s"
diff --git a/main/stasis_channels.c b/main/stasis_channels.c
index e56d1b928..e1c50c6d0 100644
--- a/main/stasis_channels.c
+++ b/main/stasis_channels.c
@@ -362,7 +362,7 @@ static void ast_channel_publish_dial_internal(struct ast_channel *caller,
return;
}
- publish_message_for_channel_topics(msg, caller);
+ publish_message_for_channel_topics(msg, caller ?: peer);
}
static void remove_dial_masquerade(struct ast_channel *peer);