summaryrefslogtreecommitdiff
path: root/main
diff options
context:
space:
mode:
authorRichard Mudgett <rmudgett@digium.com>2013-07-03 23:57:37 +0000
committerRichard Mudgett <rmudgett@digium.com>2013-07-03 23:57:37 +0000
commit02f55a36a0b8e38631c90cb3465085fbc6ed796c (patch)
treeec963fa3512861ab421a1ea6bae3e763d5ffc232 /main
parentb4e9a3fc2fd63a4a73c5a0025f3fdef86578da4c (diff)
Revert accidental overcommit.
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@393632 65c4cc65-6c06-0410-ace0-fbb531ad65f3
Diffstat (limited to 'main')
-rw-r--r--main/bridging.c247
-rw-r--r--main/config_options.c6
-rw-r--r--main/stasis_channels.c77
3 files changed, 58 insertions, 272 deletions
diff --git a/main/bridging.c b/main/bridging.c
index 99e97a4ed..110f5255b 100644
--- a/main/bridging.c
+++ b/main/bridging.c
@@ -3145,70 +3145,15 @@ static struct ast_bridge_channel *bridge_channel_alloc(struct ast_bridge *bridge
return bridge_channel;
}
-struct after_bridge_cb_node {
- /*! Next list node. */
- AST_LIST_ENTRY(after_bridge_cb_node) list;
+struct after_bridge_cb_ds {
/*! Desired callback function. */
ast_after_bridge_cb callback;
/*! After bridge callback will not be called and destroy any resources data may contain. */
ast_after_bridge_cb_failed failed;
/*! Extra data to pass to the callback. */
void *data;
- /*! Reason the after bridge callback failed. */
- enum ast_after_bridge_cb_reason reason;
};
-struct after_bridge_cb_ds {
- /*! After bridge callbacks container. */
- AST_LIST_HEAD(, after_bridge_cb_node) callbacks;
-};
-
-/*!
- * \internal
- * \brief Indicate after bridge callback failed.
- * \since 12.0.0
- *
- * \param node After bridge callback node.
- *
- * \return Nothing
- */
-static void after_bridge_cb_failed(struct after_bridge_cb_node *node)
-{
- if (node->failed) {
- node->failed(node->reason, node->data);
- node->failed = NULL;
- }
-}
-
-/*!
- * \internal
- * \brief Run discarding any after bridge callbacks.
- * \since 12.0.0
- *
- * \param after_bridge After bridge callback container process.
- * \param reason Why are we doing this.
- *
- * \return Nothing
- */
-static void after_bridge_cb_run_discard(struct after_bridge_cb_ds *after_bridge, enum ast_after_bridge_cb_reason reason)
-{
- struct after_bridge_cb_node *node;
-
- for (;;) {
- AST_LIST_LOCK(&after_bridge->callbacks);
- node = AST_LIST_REMOVE_HEAD(&after_bridge->callbacks, list);
- AST_LIST_UNLOCK(&after_bridge->callbacks);
- if (!node) {
- break;
- }
- if (!node->reason) {
- node->reason = reason;
- }
- after_bridge_cb_failed(node);
- ast_free(node);
- }
-}
-
/*!
* \internal
* \brief Destroy the after bridge callback datastore.
@@ -3222,9 +3167,10 @@ static void after_bridge_cb_destroy(void *data)
{
struct after_bridge_cb_ds *after_bridge = data;
- after_bridge_cb_run_discard(after_bridge, AST_AFTER_BRIDGE_CB_REASON_DESTROY);
-
- AST_LIST_HEAD_DESTROY(&after_bridge->callbacks);
+ if (after_bridge->failed) {
+ after_bridge->failed(AST_AFTER_BRIDGE_CB_REASON_DESTROY, after_bridge->data);
+ after_bridge->failed = NULL;
+ }
ast_free(after_bridge);
}
@@ -3241,6 +3187,7 @@ static void after_bridge_cb_destroy(void *data)
*/
static void after_bridge_cb_fixup(void *data, struct ast_channel *old_chan, struct ast_channel *new_chan)
{
+ /* There can be only one. Discard any already on the new channel. */
ast_after_bridge_callback_discard(new_chan, AST_AFTER_BRIDGE_CB_REASON_MASQUERADE);
}
@@ -3252,144 +3199,82 @@ static const struct ast_datastore_info after_bridge_cb_info = {
/*!
* \internal
- * \brief Setup/create an after bridge callback datastore container.
+ * \brief Remove channel after the bridge callback and return it.
* \since 12.0.0
*
- * \param chan Channel to setup/create the after bridge callback container on.
+ * \param chan Channel to remove after bridge callback.
*
- * \retval after_bridge datastore container on success.
- * \retval NULL on error.
+ * \retval datastore on success.
+ * \retval NULL on error or not found.
*/
-static struct after_bridge_cb_ds *after_bridge_cb_setup(struct ast_channel *chan)
+static struct ast_datastore *after_bridge_cb_remove(struct ast_channel *chan)
{
struct ast_datastore *datastore;
- struct after_bridge_cb_ds *after_bridge;
- SCOPED_CHANNELLOCK(lock, chan);
+ ast_channel_lock(chan);
datastore = ast_channel_datastore_find(chan, &after_bridge_cb_info, NULL);
- if (datastore) {
- return datastore->data;
- }
-
- /* Create a new datastore. */
- datastore = ast_datastore_alloc(&after_bridge_cb_info, NULL);
- if (!datastore) {
- return NULL;
- }
- after_bridge = ast_calloc(1, sizeof(*after_bridge));
- if (!after_bridge) {
- ast_datastore_free(datastore);
- return NULL;
+ if (datastore && ast_channel_datastore_remove(chan, datastore)) {
+ datastore = NULL;
}
- AST_LIST_HEAD_INIT(&after_bridge->callbacks);
- datastore->data = after_bridge;
- ast_channel_datastore_add(chan, datastore);
+ ast_channel_unlock(chan);
- return datastore->data;
+ return datastore;
}
-/*!
- * \internal
- * \brief Find an after bridge callback datastore container.
- * \since 12.0.0
- *
- * \param chan Channel to find the after bridge callback container on.
- *
- * \retval after_bridge datastore container on success.
- * \retval NULL on error.
- */
-static struct after_bridge_cb_ds *after_bridge_cb_find(struct ast_channel *chan)
+void ast_after_bridge_callback_discard(struct ast_channel *chan, enum ast_after_bridge_cb_reason reason)
{
struct ast_datastore *datastore;
- SCOPED_CHANNELLOCK(lock, chan);
- datastore = ast_channel_datastore_find(chan, &after_bridge_cb_info, NULL);
- if (!datastore) {
- return NULL;
- }
- return datastore->data;
-}
-
-/*!
- * \internal
- * \brief Run any after bridge callback.
- * \since 12.0.0
- *
- * \param chan Channel to run after bridge callback.
- *
- * \return Nothing
- */
-static void after_bridge_callback_run(struct ast_channel *chan)
-{
- struct after_bridge_cb_ds *after_bridge;
- struct after_bridge_cb_node *node;
-
- after_bridge = after_bridge_cb_find(chan);
- if (!after_bridge) {
- return;
- }
+ datastore = after_bridge_cb_remove(chan);
+ if (datastore) {
+ struct after_bridge_cb_ds *after_bridge = datastore->data;
- for (;;) {
- AST_LIST_LOCK(&after_bridge->callbacks);
- node = AST_LIST_REMOVE_HEAD(&after_bridge->callbacks, list);
- AST_LIST_UNLOCK(&after_bridge->callbacks);
- if (!node) {
- break;
- }
- if (node->reason) {
- after_bridge_cb_failed(node);
- } else {
- node->failed = NULL;
- node->callback(chan, node->data);
+ if (after_bridge && after_bridge->failed) {
+ after_bridge->failed(reason, after_bridge->data);
+ after_bridge->failed = NULL;
}
- ast_free(node);
+ ast_datastore_free(datastore);
}
}
/*!
* \internal
- * \brief Run discarding any after bridge callbacks.
+ * \brief Run any after bridge callback if possible.
* \since 12.0.0
*
* \param chan Channel to run after bridge callback.
*
* \return Nothing
*/
-static void after_bridge_callback_run_discard(struct ast_channel *chan, enum ast_after_bridge_cb_reason reason)
+static void after_bridge_callback_run(struct ast_channel *chan)
{
+ struct ast_datastore *datastore;
struct after_bridge_cb_ds *after_bridge;
- after_bridge = after_bridge_cb_find(chan);
- if (!after_bridge) {
+ if (ast_check_hangup(chan)) {
return;
}
- after_bridge_cb_run_discard(after_bridge, reason);
-}
-
-void ast_after_bridge_callback_discard(struct ast_channel *chan, enum ast_after_bridge_cb_reason reason)
-{
- struct after_bridge_cb_ds *after_bridge;
- struct after_bridge_cb_node *node;
-
- after_bridge = after_bridge_cb_find(chan);
- if (!after_bridge) {
+ /* Get after bridge goto datastore. */
+ datastore = after_bridge_cb_remove(chan);
+ if (!datastore) {
return;
}
- AST_LIST_LOCK(&after_bridge->callbacks);
- node = AST_LIST_LAST(&after_bridge->callbacks);
- if (node && !node->reason) {
- node->reason = reason;
+ after_bridge = datastore->data;
+ if (after_bridge) {
+ after_bridge->failed = NULL;
+ after_bridge->callback(chan, after_bridge->data);
}
- AST_LIST_UNLOCK(&after_bridge->callbacks);
+
+ /* Discard after bridge callback datastore. */
+ ast_datastore_free(datastore);
}
int ast_after_bridge_callback_set(struct ast_channel *chan, ast_after_bridge_cb callback, ast_after_bridge_cb_failed failed, void *data)
{
+ struct ast_datastore *datastore;
struct after_bridge_cb_ds *after_bridge;
- struct after_bridge_cb_node *new_node;
- struct after_bridge_cb_node *last_node;
/* Sanity checks. */
ast_assert(chan != NULL);
@@ -3397,28 +3282,29 @@ int ast_after_bridge_callback_set(struct ast_channel *chan, ast_after_bridge_cb
return -1;
}
- after_bridge = after_bridge_cb_setup(chan);
- if (!after_bridge) {
+ /* Create a new datastore. */
+ datastore = ast_datastore_alloc(&after_bridge_cb_info, NULL);
+ if (!datastore) {
return -1;
}
-
- /* Create a new callback node. */
- new_node = ast_calloc(1, sizeof(*new_node));
- if (!new_node) {
+ after_bridge = ast_calloc(1, sizeof(*after_bridge));
+ if (!after_bridge) {
+ ast_datastore_free(datastore);
return -1;
}
- new_node->callback = callback;
- new_node->failed = failed;
- new_node->data = data;
- /* Put it in the container disabling any previously active one. */
- AST_LIST_LOCK(&after_bridge->callbacks);
- last_node = AST_LIST_LAST(&after_bridge->callbacks);
- if (last_node && !last_node->reason) {
- last_node->reason = AST_AFTER_BRIDGE_CB_REASON_REPLACED;
- }
- AST_LIST_INSERT_TAIL(&after_bridge->callbacks, new_node, list);
- AST_LIST_UNLOCK(&after_bridge->callbacks);
+ /* Initialize it. */
+ after_bridge->callback = callback;
+ after_bridge->failed = failed;
+ after_bridge->data = data;
+ datastore->data = after_bridge;
+
+ /* Put it on the channel replacing any existing one. */
+ ast_channel_lock(chan);
+ ast_after_bridge_callback_discard(chan, AST_AFTER_BRIDGE_CB_REASON_REPLACED);
+ ast_channel_datastore_add(chan, datastore);
+ ast_channel_unlock(chan);
+
return 0;
}
@@ -3883,7 +3769,7 @@ static void *bridge_channel_depart_thread(void *data)
ast_bridge_features_destroy(bridge_channel->features);
bridge_channel->features = NULL;
- after_bridge_callback_run_discard(bridge_channel->chan, AST_AFTER_BRIDGE_CB_REASON_DEPART);
+ ast_after_bridge_callback_discard(bridge_channel->chan, AST_AFTER_BRIDGE_CB_REASON_DEPART);
ast_after_bridge_goto_discard(bridge_channel->chan);
return NULL;
@@ -5107,23 +4993,6 @@ int ast_bridge_features_unregister(enum ast_bridge_builtin_feature feature)
return 0;
}
-int ast_bridge_features_do(enum ast_bridge_builtin_feature feature, struct ast_bridge *bridge, struct ast_bridge_channel *bridge_channel, void *hook_pvt)
-{
- ast_bridge_hook_callback callback;
-
- if (ARRAY_LEN(builtin_features_handlers) <= feature) {
- return -1;
- }
-
- callback = builtin_features_handlers[feature];
- if (!callback) {
- return -1;
- }
- callback(bridge, bridge_channel, hook_pvt);
-
- return 0;
-}
-
int ast_bridge_interval_register(enum ast_bridge_builtin_interval interval, ast_bridge_builtin_set_limits_fn callback)
{
if (ARRAY_LEN(builtin_interval_handlers) <= interval
diff --git a/main/config_options.c b/main/config_options.c
index caa697c49..908b6ac12 100644
--- a/main/config_options.c
+++ b/main/config_options.c
@@ -598,12 +598,6 @@ enum aco_process_status aco_process_config(struct aco_info *info, int reload)
return ACO_PROCESS_ERROR;
}
-/*
- * BUGBUG must fix config framework loading of multiple files.
- *
- * A reload with multiple files must reload all files if any
- * file has been touched.
- */
while (res != ACO_PROCESS_ERROR && (file = info->files[x++])) {
const char *filename = file->filename;
try_alias:
diff --git a/main/stasis_channels.c b/main/stasis_channels.c
index dd8f7b445..d121279d8 100644
--- a/main/stasis_channels.c
+++ b/main/stasis_channels.c
@@ -53,35 +53,6 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
</syntax>
</managerEventInstance>
</managerEvent>
- <managerEvent language="en_US" name="AgentLogin">
- <managerEventInstance class="EVENT_FLAG_AGENT">
- <synopsis>Raised when an Agent has logged in.</synopsis>
- <syntax>
- <xi:include xpointer="xpointer(/docs/managerEvent[@name='Newchannel']/managerEventInstance/syntax/parameter)" />
- <parameter name="Agent">
- <para>The name of the agent.</para>
- </parameter>
- </syntax>
- <see-also>
- <ref type="application">AgentLogin</ref>
- <ref type="managerEvent">Agentlogoff</ref>
- </see-also>
- </managerEventInstance>
- </managerEvent>
- <managerEvent language="en_US" name="AgentLogoff">
- <managerEventInstance class="EVENT_FLAG_AGENT">
- <synopsis>Raised when an Agent has logged off.</synopsis>
- <syntax>
- <xi:include xpointer="xpointer(/docs/managerEvent[@name='AgentLogin']/managerEventInstance/syntax/parameter)" />
- <parameter name="Logintime">
- <para>The number of seconds the agent was logged in.</para>
- </parameter>
- </syntax>
- <see-also>
- <ref type="managerEvent">AgentLogin</ref>
- </see-also>
- </managerEventInstance>
- </managerEvent>
***/
#define NUM_MULTI_CHANNEL_BLOB_BUCKETS 7
@@ -619,44 +590,6 @@ static struct ast_manager_event_blob *varset_to_ami(struct stasis_message *msg)
ast_str_buffer(channel_event_string), variable, value);
}
-static struct ast_manager_event_blob *agent_login_to_ami(struct stasis_message *msg)
-{
- RAII_VAR(struct ast_str *, channel_string, NULL, ast_free);
- RAII_VAR(struct ast_str *, party_string, ast_str_create(256), ast_free);
- struct ast_channel_blob *obj = stasis_message_data(msg);
- const char *agent = ast_json_string_get(ast_json_object_get(obj->blob, "agent"));
-
- channel_string = ast_manager_build_channel_state_string(obj->snapshot);
- if (!channel_string) {
- return NULL;
- }
-
- return ast_manager_event_blob_create(EVENT_FLAG_AGENT, "AgentLogin",
- "%s"
- "Agent: %s\r\n",
- ast_str_buffer(channel_string), agent);
-}
-
-static struct ast_manager_event_blob *agent_logoff_to_ami(struct stasis_message *msg)
-{
- RAII_VAR(struct ast_str *, channel_string, NULL, ast_free);
- RAII_VAR(struct ast_str *, party_string, ast_str_create(256), ast_free);
- struct ast_channel_blob *obj = stasis_message_data(msg);
- const char *agent = ast_json_string_get(ast_json_object_get(obj->blob, "agent"));
- long logintime = ast_json_integer_get(ast_json_object_get(obj->blob, "logintime"));
-
- channel_string = ast_manager_build_channel_state_string(obj->snapshot);
- if (!channel_string) {
- return NULL;
- }
-
- return ast_manager_event_blob_create(EVENT_FLAG_AGENT, "AgentLogoff",
- "%s"
- "Agent: %s\r\n"
- "Logintime: %ld\r\n",
- ast_str_buffer(channel_string), agent, logintime);
-}
-
void ast_publish_channel_state(struct ast_channel *chan)
{
RAII_VAR(struct ast_channel_snapshot *, snapshot, NULL, ao2_cleanup);
@@ -857,12 +790,6 @@ STASIS_MESSAGE_TYPE_DEFN(ast_channel_moh_start_type);
STASIS_MESSAGE_TYPE_DEFN(ast_channel_moh_stop_type);
STASIS_MESSAGE_TYPE_DEFN(ast_channel_monitor_start_type);
STASIS_MESSAGE_TYPE_DEFN(ast_channel_monitor_stop_type);
-STASIS_MESSAGE_TYPE_DEFN(ast_channel_agent_login_type,
- .to_ami = agent_login_to_ami,
- );
-STASIS_MESSAGE_TYPE_DEFN(ast_channel_agent_logoff_type,
- .to_ami = agent_logoff_to_ami,
- );
/*! @} */
@@ -889,8 +816,6 @@ static void stasis_channels_cleanup(void)
STASIS_MESSAGE_TYPE_CLEANUP(ast_channel_moh_stop_type);
STASIS_MESSAGE_TYPE_CLEANUP(ast_channel_monitor_start_type);
STASIS_MESSAGE_TYPE_CLEANUP(ast_channel_monitor_stop_type);
- STASIS_MESSAGE_TYPE_CLEANUP(ast_channel_agent_login_type);
- STASIS_MESSAGE_TYPE_CLEANUP(ast_channel_agent_logoff_type);
}
void ast_stasis_channels_init(void)
@@ -914,8 +839,6 @@ void ast_stasis_channels_init(void)
STASIS_MESSAGE_TYPE_INIT(ast_channel_moh_stop_type);
STASIS_MESSAGE_TYPE_INIT(ast_channel_monitor_start_type);
STASIS_MESSAGE_TYPE_INIT(ast_channel_monitor_stop_type);
- STASIS_MESSAGE_TYPE_INIT(ast_channel_agent_login_type);
- STASIS_MESSAGE_TYPE_INIT(ast_channel_agent_logoff_type);
channel_topic_all = stasis_topic_create("ast_channel_topic_all");
channel_topic_all_cached = stasis_caching_topic_create(channel_topic_all, channel_snapshot_get_id);