Refactor extraneous channel events

This change removes JitterBufStats, ChannelReload, and ChannelUpdate
and refactors the following events to travel over Stasis-Core:
* LocalBridge
* DAHDIChannel
* AlarmClear
* SpanAlarmClear
* Alarm
* SpanAlarm
* DNDState
* MCID
* SIPQualifyPeerDone
* SessionTimeout

Review: https://reviewboard.asterisk.org/r/2627/
(closes issue ASTERISK-21476)


git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@393284 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
Kinsey Moore
2013-07-01 13:16:09 +00:00
parent 68b3bce8b8
commit 909ee4bfb9
16 changed files with 888 additions and 405 deletions

View File

@@ -47,6 +47,7 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
#include "asterisk/core_unreal.h"
#include "asterisk/core_local.h"
#include "asterisk/_private.h"
#include "asterisk/stasis_channels.h"
/*** DOCUMENTATION
<manager name="LocalOptimizeAway" language="en_US">
@@ -65,6 +66,101 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
it to optimize away if it's bridged or when it becomes bridged.</para>
</description>
</manager>
<managerEvent language="en_US" name="LocalBridge">
<managerEventInstance class="EVENT_FLAG_CALL">
<synopsis>Raised when two halves of a Local Channel form a bridge.</synopsis>
<syntax>
<parameter name="LocalOneChannel">
</parameter>
<parameter name="LocalOneChannelState">
<para>A numeric code for the channel's current state, related to ChannelStateDesc</para>
</parameter>
<parameter name="LocalOneChannelStateDesc">
<enumlist>
<enum name="Down"/>
<enum name="Rsrvd"/>
<enum name="OffHook"/>
<enum name="Dialing"/>
<enum name="Ring"/>
<enum name="Ringing"/>
<enum name="Up"/>
<enum name="Busy"/>
<enum name="Dialing Offhook"/>
<enum name="Pre-ring"/>
<enum name="Unknown"/>
</enumlist>
</parameter>
<parameter name="LocalOneCallerIDNum">
</parameter>
<parameter name="LocalOneCallerIDName">
</parameter>
<parameter name="LocalOneConnectedLineNum">
</parameter>
<parameter name="LocalOneConnectedLineName">
</parameter>
<parameter name="LocalOneAccountCode">
</parameter>
<parameter name="LocalOneContext">
</parameter>
<parameter name="LocalOneExten">
</parameter>
<parameter name="LocalOnePriority">
</parameter>
<parameter name="LocalOneUniqueid">
</parameter>
<parameter name="LocalTwoChannel">
</parameter>
<parameter name="LocalTwoChannelState">
<para>A numeric code for the channel's current state, related to ChannelStateDesc</para>
</parameter>
<parameter name="LocalTwoChannelStateDesc">
<enumlist>
<enum name="Down"/>
<enum name="Rsrvd"/>
<enum name="OffHook"/>
<enum name="Dialing"/>
<enum name="Ring"/>
<enum name="Ringing"/>
<enum name="Up"/>
<enum name="Busy"/>
<enum name="Dialing Offhook"/>
<enum name="Pre-ring"/>
<enum name="Unknown"/>
</enumlist>
</parameter>
<parameter name="LocalTwoCallerIDNum">
</parameter>
<parameter name="LocalTwoCallerIDName">
</parameter>
<parameter name="LocalTwoConnectedLineNum">
</parameter>
<parameter name="LocalTwoConnectedLineName">
</parameter>
<parameter name="LocalTwoAccountCode">
</parameter>
<parameter name="LocalTwoContext">
</parameter>
<parameter name="LocalTwoExten">
</parameter>
<parameter name="LocalTwoPriority">
</parameter>
<parameter name="LocalTwoUniqueid">
</parameter>
<parameter name="Context">
<para>The context in the dialplan that Channel2 starts in.</para>
</parameter>
<parameter name="Exten">
<para>The extension in the dialplan that Channel2 starts in.</para>
</parameter>
<parameter name="LocalOptimization">
<enumlist>
<enum name="Yes"/>
<enum name="No"/>
</enumlist>
</parameter>
</syntax>
</managerEventInstance>
</managerEvent>
***/
static const char tdesc[] = "Local Proxy Channel Driver";
@@ -230,6 +326,49 @@ static int local_devicestate(const char *data)
return res;
}
static struct ast_manager_event_blob *local_bridge_to_ami(struct stasis_message *msg)
{
RAII_VAR(struct ast_str *, channel_one_string, NULL, ast_free);
RAII_VAR(struct ast_str *, channel_two_string, NULL, ast_free);
struct ast_multi_channel_blob *obj = stasis_message_data(msg);
struct ast_json *blob, *context, *exten, *optimize;
struct ast_channel_snapshot *chan_one, *chan_two;
chan_one = ast_multi_channel_blob_get_channel(obj, "1");
chan_two = ast_multi_channel_blob_get_channel(obj, "2");
blob = ast_multi_channel_blob_get_json(obj);
channel_one_string = ast_manager_build_channel_state_string_prefix(chan_one, "LocalOne");
if (!channel_one_string) {
return NULL;
}
channel_two_string = ast_manager_build_channel_state_string_prefix(chan_two, "LocalTwo");
if (!channel_two_string) {
return NULL;
}
context = ast_json_object_get(blob, "context");
exten = ast_json_object_get(blob, "exten");
optimize = ast_json_object_get(blob, "optimize");
return ast_manager_event_blob_create(EVENT_FLAG_CALL, "LocalBridge",
"%s"
"%s"
"Context: %s\r\n"
"Exten: %s\r\n"
"LocalOptimization: %s\r\n",
ast_str_buffer(channel_one_string),
ast_str_buffer(channel_two_string),
ast_json_string_get(context),
ast_json_string_get(exten),
ast_json_is_true(optimize) ? "Yes" : "No");
}
STASIS_MESSAGE_TYPE_DEFN_LOCAL(local_bridge_type,
.to_ami = local_bridge_to_ami,
);
/*!
* \internal
* \brief Post the LocalBridge AMI event.
@@ -241,45 +380,45 @@ static int local_devicestate(const char *data)
*/
static void local_bridge_event(struct local_pvt *p)
{
ao2_lock(p);
/*** DOCUMENTATION
<managerEventInstance>
<synopsis>Raised when two halves of a Local Channel form a bridge.</synopsis>
<syntax>
<parameter name="Channel1">
<para>The name of the Local Channel half that bridges to another channel.</para>
</parameter>
<parameter name="Channel2">
<para>The name of the Local Channel half that executes the dialplan.</para>
</parameter>
<parameter name="Context">
<para>The context in the dialplan that Channel2 starts in.</para>
</parameter>
<parameter name="Exten">
<para>The extension in the dialplan that Channel2 starts in.</para>
</parameter>
<parameter name="LocalOptimization">
<enumlist>
<enum name="Yes"/>
<enum name="No"/>
</enumlist>
</parameter>
</syntax>
</managerEventInstance>
***/
manager_event(EVENT_FLAG_CALL, "LocalBridge",
"Channel1: %s\r\n"
"Channel2: %s\r\n"
"Uniqueid1: %s\r\n"
"Uniqueid2: %s\r\n"
"Context: %s\r\n"
"Exten: %s\r\n"
"LocalOptimization: %s\r\n",
ast_channel_name(p->base.owner), ast_channel_name(p->base.chan),
ast_channel_uniqueid(p->base.owner), ast_channel_uniqueid(p->base.chan),
p->context, p->exten,
ast_test_flag(&p->base, AST_UNREAL_NO_OPTIMIZATION) ? "Yes" : "No");
ao2_unlock(p);
RAII_VAR(struct ast_multi_channel_blob *, multi_blob, NULL, ao2_cleanup);
RAII_VAR(struct ast_json *, blob, NULL, ast_json_unref);
RAII_VAR(struct stasis_message *, msg, NULL, ao2_cleanup);
RAII_VAR(struct ast_channel_snapshot *, one_snapshot, NULL, ao2_cleanup);
RAII_VAR(struct ast_channel_snapshot *, two_snapshot, NULL, ao2_cleanup);
SCOPED_AO2LOCK(lock, p);
blob = ast_json_pack("{s: s, s: s, s: b}",
"context", p->context,
"exten", p->exten,
"optimize", ast_test_flag(&p->base, AST_UNREAL_NO_OPTIMIZATION));
if (!blob) {
return;
}
multi_blob = ast_multi_channel_blob_create(blob);
if (!multi_blob) {
return;
}
one_snapshot = ast_channel_snapshot_create(p->base.owner);
if (!one_snapshot) {
return;
}
two_snapshot = ast_channel_snapshot_create(p->base.chan);
if (!two_snapshot) {
return;
}
ast_multi_channel_blob_add_channel(multi_blob, "1", one_snapshot);
ast_multi_channel_blob_add_channel(multi_blob, "2", two_snapshot);
msg = stasis_message_create(local_bridge_type(), multi_blob);
if (!msg) {
return;
}
stasis_publish(ast_channel_topic(p->base.owner), msg);
}
int ast_local_setup_bridge(struct ast_channel *ast, struct ast_bridge *bridge, struct ast_channel *swap, struct ast_bridge_features *features)
@@ -744,10 +883,15 @@ static void local_shutdown(void)
locals = NULL;
ast_format_cap_destroy(local_tech.capabilities);
STASIS_MESSAGE_TYPE_CLEANUP(local_bridge_type);
}
int ast_local_init(void)
{
if (STASIS_MESSAGE_TYPE_INIT(local_bridge_type)) {
return -1;
}
if (!(local_tech.capabilities = ast_format_cap_alloc())) {
return -1;
}

View File

@@ -40,6 +40,8 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
#include "asterisk/module.h"
#include "asterisk/utils.h"
#include "asterisk/astobj2.h"
#include "asterisk/channel.h"
#include "asterisk/callerid.h"
#include <jansson.h>
#include <time.h>
@@ -599,3 +601,70 @@ struct ast_json_payload *ast_json_payload_create(struct ast_json *json)
return payload;
}
static struct ast_json *json_party_number(struct ast_party_number *number)
{
if (!number->valid) {
return NULL;
}
return ast_json_pack("{s: s, s: i, s: i, s: s}",
"number", number->str,
"plan", number->plan,
"presentation", number->presentation,
"presentation_txt", ast_describe_caller_presentation(number->presentation));
}
static struct ast_json *json_party_name(struct ast_party_name *name)
{
if (!name->valid) {
return NULL;
}
return ast_json_pack("{s: s, s: s, s: i, s: s}",
"name", name->str,
"character_set", ast_party_name_charset_describe(name->char_set),
"presentation", name->presentation,
"presentation_txt", ast_describe_caller_presentation(name->presentation));
}
static struct ast_json *json_party_subaddress(struct ast_party_subaddress *subaddress)
{
if (!subaddress->valid) {
return NULL;
}
return ast_json_pack("{s: s, s: i, s: b}",
"subaddress", subaddress->str,
"type", subaddress->type,
"odd", subaddress->odd_even_indicator);
}
struct ast_json *ast_json_party_id(struct ast_party_id *party)
{
RAII_VAR(struct ast_json *, json_party_id, NULL, ast_json_unref);
int pres;
/* Combined party presentation */
pres = ast_party_id_presentation(party);
json_party_id = ast_json_pack("{s: i, s: s}",
"presentation", pres,
"presentation_txt", ast_describe_caller_presentation(pres));
if (!json_party_id) {
return NULL;
}
/* Party number */
if (party->number.valid && ast_json_object_set(json_party_id, "number", json_party_number(&party->number))) {
return NULL;
}
/* Party name */
if (party->name.valid && ast_json_object_set(json_party_id, "name", json_party_name(&party->name))) {
return NULL;
}
/* Party subaddress */
if (party->subaddress.valid && ast_json_object_set(json_party_id, "subaddress", json_party_subaddress(&party->subaddress))) {
return NULL;
}
return ast_json_ref(json_party_id);
}