From 7dd64ff993261da54d96a320ea261c32b622d9b1 Mon Sep 17 00:00:00 2001 From: Mark Michelson Date: Mon, 28 Apr 2014 14:40:21 +0000 Subject: Add DeviceStateChanged and PresenceStateChanged AMI events. These events are controlled by two new modules, res_manager_devicestate and res_manager_presencestate. Review: https://reviewboard.asterisk.org/r/3417 git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@413060 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- CHANGES | 8 +++++++ main/devicestate.c | 47 +++++++++++++++++++++++++++++++++++++- main/presencestate.c | 50 ++++++++++++++++++++++++++++++++++++++++- res/res_manager_devicestate.c | 50 +++++++++++++++++++++++++++++++++++++++++ res/res_manager_presencestate.c | 50 +++++++++++++++++++++++++++++++++++++++++ 5 files changed, 203 insertions(+), 2 deletions(-) create mode 100644 res/res_manager_devicestate.c create mode 100644 res/res_manager_presencestate.c diff --git a/CHANGES b/CHANGES index 2071879a2..f8c698fd5 100644 --- a/CHANGES +++ b/CHANGES @@ -12,6 +12,14 @@ --- Functionality changes from Asterisk 12 to Asterisk 13 -------------------- ------------------------------------------------------------------------------ +AMI +------------------ + * New DeviceStateChanged and PresenceStateChanged AMI events have been added. + These events are emitted whenever a device state or presence state change + occurs. The events are controlled by res_manager_device_state.so and + res_manager_presence_state.so. If the high frequency of these events is + problematic for you, do not load these modules. + ------------------------------------------------------------------------------ --- Functionality changes from Asterisk 12.2.0 to Asterisk 12.3.0 ------------ ------------------------------------------------------------------------------ diff --git a/main/devicestate.c b/main/devicestate.c index 5c2340863..839557485 100644 --- a/main/devicestate.c +++ b/main/devicestate.c @@ -117,6 +117,30 @@ core ***/ +/*** DOCUMENTATION + + + Raised when a device state changes + + + The device whose state has changed + + + The new state of the device + + + + This differs from the ExtensionStatus + event because this event is raised for all device state changes, + not only for changes that affect dialplan hints. + + + ExtensionStatus + + + +***/ + #include "asterisk.h" ASTERISK_FILE_VERSION(__FILE__, "$Revision$") @@ -199,7 +223,11 @@ static struct stasis_cache *device_state_cache; static struct stasis_caching_topic *device_state_topic_cached; static struct stasis_topic_pool *device_state_topic_pool; -STASIS_MESSAGE_TYPE_DEFN(ast_device_state_message_type); +static struct ast_manager_event_blob *devstate_to_ami(struct stasis_message *msg); + +STASIS_MESSAGE_TYPE_DEFN(ast_device_state_message_type, + .to_ami = devstate_to_ami, +); /* Forward declarations */ static int getproviderstate(const char *provider, const char *address); @@ -880,3 +908,20 @@ int devstate_init(void) return 0; } + +static struct ast_manager_event_blob *devstate_to_ami(struct stasis_message *msg) +{ + struct ast_device_state_message *dev_state; + + dev_state = stasis_message_data(msg); + + /* Ignore non-aggregate states */ + if (dev_state->eid) { + return NULL; + } + + return ast_manager_event_blob_create(EVENT_FLAG_CALL, "DeviceStateChange", + "Device: %s\r\n" + "State: %s\r\n", + dev_state->device, ast_devstate_str(dev_state->state)); +} diff --git a/main/presencestate.c b/main/presencestate.c index b0a1959c0..db947df34 100644 --- a/main/presencestate.c +++ b/main/presencestate.c @@ -25,6 +25,36 @@ core ***/ +/*** DOCUMENTATION + + + Raised when a presence state changes + + + The entity whose presence state has changed + + + The new status of the presentity + + + The new subtype of the presentity + + + The new message of the presentity + + + + This differs from the PresenceStatus + event because this event is raised for all presence state changes, + not only for changes that affect dialplan hints. + + + PresenceStatus + + + +***/ + #include "asterisk.h" ASTERISK_FILE_VERSION(__FILE__, "$Revision$") @@ -52,7 +82,11 @@ static const struct { { "dnd", AST_PRESENCE_DND}, }; -STASIS_MESSAGE_TYPE_DEFN(ast_presence_state_message_type); +static struct ast_manager_event_blob *presence_state_to_ami(struct stasis_message *msg); + +STASIS_MESSAGE_TYPE_DEFN(ast_presence_state_message_type, + .to_ami = presence_state_to_ami, +); struct stasis_topic *presence_state_topic_all; struct stasis_cache *presence_state_cache; struct stasis_caching_topic *presence_state_topic_cached; @@ -351,3 +385,17 @@ int ast_presence_state_engine_init(void) return 0; } +static struct ast_manager_event_blob *presence_state_to_ami(struct stasis_message *msg) +{ + struct ast_presence_state_message *presence_state = stasis_message_data(msg); + + return ast_manager_event_blob_create(EVENT_FLAG_CALL, "PresenceStateChange", + "Presentity: %s\r\n" + "Status: %s\r\n" + "Subtype: %s\r\n" + "Message: %s\r\n", + presence_state->provider, + ast_presence_state2str(presence_state->state), + presence_state->subtype, + presence_state->message); +} diff --git a/res/res_manager_devicestate.c b/res/res_manager_devicestate.c new file mode 100644 index 000000000..57908bac8 --- /dev/null +++ b/res/res_manager_devicestate.c @@ -0,0 +1,50 @@ +/* + * Asterisk -- An open source telephony toolkit. + * + * Copyright (C) 2014, Digium, Inc. + * + * Mark Michelson + * + * See http://www.asterisk.org for more information about + * the Asterisk project. Please do not directly contact + * any of the maintainers of this project for assistance; + * the project provides a web site, mailing lists and IRC + * channels for your use. + * + * This program is free software, distributed under the terms of + * the GNU General Public License Version 2. See the LICENSE file + * at the top of the source tree. + */ + +#include "asterisk.h" +#include "asterisk/module.h" +#include "asterisk/stasis.h" +#include "asterisk/devicestate.h" + +static struct stasis_forward *topic_forwarder; + +static int unload_module(void) +{ + topic_forwarder = stasis_forward_cancel(topic_forwarder); + return 0; +} + +static int load_module(void) +{ + struct stasis_topic *manager_topic; + + manager_topic = ast_manager_get_topic(); + if (!manager_topic) { + return AST_MODULE_LOAD_DECLINE; + } + + topic_forwarder = stasis_forward_all(ast_device_state_topic_all(), manager_topic); + + return AST_MODULE_LOAD_SUCCESS; +} + +AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_LOAD_ORDER, "Manager Device State Topic Forwarder", + .load = load_module, + .unload = unload_module, + .load_pri = AST_MODPRI_DEVSTATE_CONSUMER, + ); diff --git a/res/res_manager_presencestate.c b/res/res_manager_presencestate.c new file mode 100644 index 000000000..2b3ef418e --- /dev/null +++ b/res/res_manager_presencestate.c @@ -0,0 +1,50 @@ +/* + * Asterisk -- An open source telephony toolkit. + * + * Copyright (C) 2014, Digium, Inc. + * + * Mark Michelson + * + * See http://www.asterisk.org for more information about + * the Asterisk project. Please do not directly contact + * any of the maintainers of this project for assistance; + * the project provides a web site, mailing lists and IRC + * channels for your use. + * + * This program is free software, distributed under the terms of + * the GNU General Public License Version 2. See the LICENSE file + * at the top of the source tree. + */ + +#include "asterisk.h" +#include "asterisk/module.h" +#include "asterisk/stasis.h" +#include "asterisk/presencestate.h" + +static struct stasis_forward *topic_forwarder; + +static int unload_module(void) +{ + topic_forwarder = stasis_forward_cancel(topic_forwarder); + return 0; +} + +static int load_module(void) +{ + struct stasis_topic *manager_topic; + + manager_topic = ast_manager_get_topic(); + if (!manager_topic) { + return AST_MODULE_LOAD_DECLINE; + } + + topic_forwarder = stasis_forward_all(ast_presence_state_topic_all(), manager_topic); + + return AST_MODULE_LOAD_SUCCESS; +} + +AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_LOAD_ORDER, "Manager Presence State Topic Forwarder", + .load = load_module, + .unload = unload_module, + .load_pri = AST_MODPRI_DEVSTATE_CONSUMER, + ); -- cgit v1.2.3