Asterisk - The Open Source Telephony Project  GIT-master-a24979a
Data Structures | Macros | Functions | Variables
stasis_channels.c File Reference

Stasis Messages and Data Types for Channel Objects. More...

#include "asterisk.h"
#include "asterisk/astobj2.h"
#include "asterisk/json.h"
#include "asterisk/pbx.h"
#include "asterisk/bridge.h"
#include "asterisk/translate.h"
#include "asterisk/stasis.h"
#include "asterisk/stasis_channels.h"
#include "asterisk/dial.h"
#include "asterisk/linkedlists.h"
Include dependency graph for stasis_channels.c:

Go to the source code of this file.

Data Structures

struct  ast_multi_channel_blob
 A multi channel blob data structure for multi_channel_blob stasis messages. More...
 
struct  channel_role_snapshot
 A channel snapshot wrapper object used in ast_multi_channel_blob objects. More...
 
struct  dial_masquerade_datastore
 
struct  dial_target
 

Macros

#define NUM_MULTI_CHANNEL_BLOB_BUCKETS   7
 

Functions

static struct ast_manager_event_blobagent_login_to_ami (struct stasis_message *msg)
 
static struct ast_manager_event_blobagent_logoff_to_ami (struct stasis_message *msg)
 
struct stasis_messageast_channel_blob_create (struct ast_channel *chan, struct stasis_message_type *type, struct ast_json *blob)
 Creates a ast_channel_blob message. More...
 
struct stasis_messageast_channel_blob_create_from_cache (const char *channel_id, struct stasis_message_type *type, struct ast_json *blob)
 Create a ast_channel_blob message, pulling channel state from the cache. More...
 
struct ao2_containerast_channel_cache_all (void)
 
struct ao2_containerast_channel_cache_by_name (void)
 Secondary channel cache, indexed by name. More...
 
void ast_channel_publish_blob (struct ast_channel *chan, struct stasis_message_type *type, struct ast_json *blob)
 Publish a channel blob message. More...
 
void ast_channel_publish_cached_blob (struct ast_channel *chan, struct stasis_message_type *type, struct ast_json *blob)
 Publish a channel blob message using the latest snapshot from the cache. More...
 
void ast_channel_publish_dial (struct ast_channel *caller, struct ast_channel *peer, const char *dialstring, const char *dialstatus)
 Publish in the ast_channel_topic or ast_channel_topic_all topics a stasis message for the channels involved in a dial operation. More...
 
void ast_channel_publish_dial_forward (struct ast_channel *caller, struct ast_channel *peer, struct ast_channel *forwarded, const char *dialstring, const char *dialstatus, const char *forward)
 Publish in the ast_channel_topic or ast_channel_topic_all topics a stasis message for the channels involved in a dial operation that is forwarded. More...
 
static void ast_channel_publish_dial_internal (struct ast_channel *caller, struct ast_channel *peer, struct ast_channel *forwarded, const char *dialstring, const char *dialstatus, const char *forward)
 
void ast_channel_publish_final_snapshot (struct ast_channel *chan)
 Send the final channel snapshot for a channel, thus removing it from cache. More...
 
void ast_channel_publish_snapshot (struct ast_channel *chan)
 Publish a ast_channel_snapshot for a channel. More...
 
void ast_channel_publish_varset (struct ast_channel *chan, const char *name, const char *value)
 Publish a ast_channel_publish_varset for a channel. More...
 
int ast_channel_snapshot_caller_id_equal (const struct ast_channel_snapshot *old_snapshot, const struct ast_channel_snapshot *new_snapshot)
 Compares the callerid info of two snapshots. More...
 
int ast_channel_snapshot_cep_equal (const struct ast_channel_snapshot *old_snapshot, const struct ast_channel_snapshot *new_snapshot)
 Compares the context, exten and priority of two snapshots. More...
 
int ast_channel_snapshot_connected_line_equal (const struct ast_channel_snapshot *old_snapshot, const struct ast_channel_snapshot *new_snapshot)
 Compares the connected line info of two snapshots. More...
 
struct ast_channel_snapshotast_channel_snapshot_create (struct ast_channel *chan)
 Generate a snapshot of the channel state. This is an ao2 object, so ao2_cleanup() to deallocate. More...
 
struct ast_channel_snapshotast_channel_snapshot_get_latest (const char *uniqueid)
 Obtain the latest ast_channel_snapshot from the Stasis Message Bus API cache. This is an ao2 object, so use ao2_cleanup() to deallocate. More...
 
struct ast_channel_snapshotast_channel_snapshot_get_latest_by_name (const char *name)
 Obtain the latest ast_channel_snapshot from the Stasis Message Bus API cache. This is an ao2 object, so use ao2_cleanup() to deallocate. More...
 
void ast_channel_snapshot_invalidate_segment (struct ast_channel *chan, enum ast_channel_snapshot_segment_invalidation segment)
 Invalidate a channel snapshot segment from being reused. More...
 
struct ast_jsonast_channel_snapshot_to_json (const struct ast_channel_snapshot *snapshot, const struct stasis_message_sanitizer *sanitize)
 Build a JSON object from a ast_channel_snapshot. More...
 
void ast_channel_stage_snapshot (struct ast_channel *chan)
 Set flag to indicate channel snapshot is being staged. More...
 
void ast_channel_stage_snapshot_done (struct ast_channel *chan)
 Clear flag to indicate channel snapshot is being staged, and publish snapshot. More...
 
struct stasis_topicast_channel_topic_all (void)
 A topic which publishes the events for all channels. More...
 
void ast_multi_channel_blob_add_channel (struct ast_multi_channel_blob *obj, const char *role, struct ast_channel_snapshot *snapshot)
 Add a ast_channel_snapshot to a ast_multi_channel_blob object. More...
 
struct ast_multi_channel_blobast_multi_channel_blob_create (struct ast_json *blob)
 Create a ast_multi_channel_blob suitable for a stasis_message. More...
 
struct ast_channel_snapshotast_multi_channel_blob_get_channel (struct ast_multi_channel_blob *obj, const char *role)
 Retrieve a channel snapshot associated with a specific role from a ast_multi_channel_blob. More...
 
struct ao2_containerast_multi_channel_blob_get_channels (struct ast_multi_channel_blob *obj, const char *role)
 Retrieve all channel snapshots associated with a specific role from a ast_multi_channel_blob. More...
 
struct ast_jsonast_multi_channel_blob_get_json (struct ast_multi_channel_blob *obj)
 Retrieve the JSON blob from a ast_multi_channel_blob. Returned ast_json is still owned by obj. More...
 
int ast_stasis_channels_init (void)
 Initialize the stasis channel topic and message types. More...
 
static void channel_blob_dtor (void *obj)
 
static struct ast_jsonchannel_blob_to_json (struct stasis_message *message, const char *type, const struct stasis_message_sanitizer *sanitize)
 
static int channel_role_cmp_cb (void *obj, void *arg, int flags)
 
static int channel_role_hash_cb (const void *obj, const int flags)
 
static void channel_role_snapshot_dtor (void *obj)
 
static struct ast_channel_snapshot_basechannel_snapshot_base_create (struct ast_channel *chan)
 
static void channel_snapshot_base_dtor (void *obj)
 
static struct ast_channel_snapshot_bridgechannel_snapshot_bridge_create (struct ast_channel *chan)
 
static struct ast_channel_snapshot_callerchannel_snapshot_caller_create (struct ast_channel *chan)
 
static void channel_snapshot_caller_dtor (void *obj)
 
static int channel_snapshot_cmp_cb (void *obj, void *arg, int flags)
 
static struct ast_channel_snapshot_connectedchannel_snapshot_connected_create (struct ast_channel *chan)
 
static struct ast_channel_snapshot_dialplanchannel_snapshot_dialplan_create (struct ast_channel *chan)
 
static void channel_snapshot_dialplan_dtor (void *obj)
 
static void channel_snapshot_dtor (void *obj)
 
static struct ast_channel_snapshot_hangupchannel_snapshot_hangup_create (struct ast_channel *chan)
 
static int channel_snapshot_hash_cb (const void *obj, const int flags)
 
static struct ast_channel_snapshot_peerchannel_snapshot_peer_create (struct ast_channel *chan)
 
static int channel_snapshot_uniqueid_cmp_cb (void *obj, void *arg, int flags)
 
static int channel_snapshot_uniqueid_hash_cb (const void *obj, const int flags)
 
static struct ast_channel_snapshot_updatechannel_snapshot_update_create (struct ast_channel *chan)
 
static void channel_snapshot_update_dtor (void *obj)
 
static struct stasis_messagecreate_channel_blob_message (struct ast_channel_snapshot *snapshot, struct stasis_message_type *type, struct ast_json *blob)
 
static void dial_masquerade_breakdown (void *data, struct ast_channel *old_chan, struct ast_channel *new_chan)
 
static void dial_masquerade_caller_datastore_destroy (void *data)
 
static struct dial_masquerade_datastoredial_masquerade_datastore_add (struct ast_channel *chan, struct dial_masquerade_datastore *masq_data)
 
static struct dial_masquerade_datastoredial_masquerade_datastore_alloc (void)
 
static void dial_masquerade_datastore_cleanup (struct dial_masquerade_datastore *masq_data)
 
static void dial_masquerade_datastore_destroy (void *data)
 
static void dial_masquerade_datastore_dtor (void *vdoomed)
 
static struct ast_datastoredial_masquerade_datastore_find (struct ast_channel *chan)
 
static void dial_masquerade_datastore_remove_chan (struct dial_masquerade_datastore *masq_data, struct ast_channel *chan)
 
static void dial_masquerade_fixup (void *data, struct ast_channel *old_chan, struct ast_channel *new_chan)
 
static void dial_target_free (struct dial_target *doomed)
 
static struct ast_jsondial_to_json (struct stasis_message *message, const struct stasis_message_sanitizer *sanitize)
 
static struct ast_jsondtmf_end_to_json (struct stasis_message *message, const struct stasis_message_sanitizer *sanitize)
 
static struct ast_jsonhangup_request_to_json (struct stasis_message *message, const struct stasis_message_sanitizer *sanitize)
 
static struct ast_jsonhold_to_json (struct stasis_message *message, const struct stasis_message_sanitizer *sanitize)
 
static void multi_channel_blob_dtor (void *obj)
 
static void publish_message_for_channel_topics (struct stasis_message *message, struct ast_channel *chan)
 
static void remove_dial_masquerade (struct ast_channel *peer)
 
static void remove_dial_masquerade_caller (struct ast_channel *caller)
 
static int set_dial_masquerade (struct ast_channel *caller, struct ast_channel *peer, const char *dialstring)
 
static void stasis_channels_cleanup (void)
 
static struct ast_manager_event_blobtalking_start_to_ami (struct stasis_message *msg)
 
static struct ast_jsontalking_start_to_json (struct stasis_message *message, const struct stasis_message_sanitizer *sanitize)
 
static struct ast_manager_event_blobtalking_stop_to_ami (struct stasis_message *msg)
 
static struct ast_jsontalking_stop_to_json (struct stasis_message *message, const struct stasis_message_sanitizer *sanitize)
 
static struct ast_jsonunhold_to_json (struct stasis_message *message, const struct stasis_message_sanitizer *sanitize)
 
static struct ast_manager_event_blobvarset_to_ami (struct stasis_message *msg)
 
static struct ast_jsonvarset_to_json (struct stasis_message *message, const struct stasis_message_sanitizer *sanitize)
 
 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,)
 
 STASIS_MESSAGE_TYPE_DEFN (ast_channel_chanspy_start_type)
 
 STASIS_MESSAGE_TYPE_DEFN (ast_channel_chanspy_stop_type)
 
 STASIS_MESSAGE_TYPE_DEFN (ast_channel_dial_type,.to_json=dial_to_json,)
 
 STASIS_MESSAGE_TYPE_DEFN (ast_channel_dtmf_begin_type)
 
 STASIS_MESSAGE_TYPE_DEFN (ast_channel_dtmf_end_type,.to_json=dtmf_end_to_json,)
 
 STASIS_MESSAGE_TYPE_DEFN (ast_channel_fax_type)
 
 STASIS_MESSAGE_TYPE_DEFN (ast_channel_flash_type)
 
 STASIS_MESSAGE_TYPE_DEFN (ast_channel_hangup_handler_type)
 
 STASIS_MESSAGE_TYPE_DEFN (ast_channel_hangup_request_type,.to_json=hangup_request_to_json,)
 
 STASIS_MESSAGE_TYPE_DEFN (ast_channel_hold_type,.to_json=hold_to_json,)
 
 STASIS_MESSAGE_TYPE_DEFN (ast_channel_masquerade_type)
 
 STASIS_MESSAGE_TYPE_DEFN (ast_channel_mixmonitor_mute_type)
 
 STASIS_MESSAGE_TYPE_DEFN (ast_channel_mixmonitor_start_type)
 
 STASIS_MESSAGE_TYPE_DEFN (ast_channel_mixmonitor_stop_type)
 
 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_snapshot_type)
 Define channel message types. More...
 
 STASIS_MESSAGE_TYPE_DEFN (ast_channel_talking_start,.to_ami=talking_start_to_ami,.to_json=talking_start_to_json,)
 
 STASIS_MESSAGE_TYPE_DEFN (ast_channel_talking_stop,.to_ami=talking_stop_to_ami,.to_json=talking_stop_to_json,)
 
 STASIS_MESSAGE_TYPE_DEFN (ast_channel_unhold_type,.to_json=unhold_to_json,)
 
 STASIS_MESSAGE_TYPE_DEFN (ast_channel_varset_type,.to_ami=varset_to_ami,.to_json=varset_to_json,)
 
 STASIS_MESSAGE_TYPE_DEFN (ast_channel_wink_type)
 

Variables

static struct ao2_containerchannel_cache
 
static struct ao2_containerchannel_cache_by_name
 
static struct stasis_topicchannel_topic_all
 
static const struct ast_datastore_info dial_masquerade_caller_info
 
static const struct ast_datastore_info dial_masquerade_info
 

Detailed Description

Stasis Messages and Data Types for Channel Objects.

Author
Matt Jordan <mjordan@digium.com> 

Definition in file stasis_channels.c.

Macro Definition Documentation

◆ NUM_MULTI_CHANNEL_BLOB_BUCKETS

#define NUM_MULTI_CHANNEL_BLOB_BUCKETS   7

Definition at line 117 of file stasis_channels.c.

Function Documentation

◆ agent_login_to_ami()

static struct ast_manager_event_blob* agent_login_to_ami ( struct stasis_message msg)
static

Definition at line 1213 of file stasis_channels.c.

1214 {
1215  struct ast_str *channel_string;
1216  struct ast_channel_blob *obj = stasis_message_data(msg);
1217  const char *agent = ast_json_string_get(ast_json_object_get(obj->blob, "agent"));
1218  struct ast_manager_event_blob *ev;
1219 
1220  channel_string = ast_manager_build_channel_state_string(obj->snapshot);
1221  if (!channel_string) {
1222  return NULL;
1223  }
1224 
1226  "%s"
1227  "Agent: %s\r\n",
1228  ast_str_buffer(channel_string), agent);
1229  ast_free(channel_string);
1230  return ev;
1231 }
#define ast_free(a)
Definition: astmm.h:180
struct ast_json * ast_json_object_get(struct ast_json *object, const char *key)
Get a field from a JSON object.
Definition: json.c:397
const char * ast_json_string_get(const struct ast_json *string)
Get the value of a JSON string.
Definition: json.c:273
struct ast_manager_event_blob * ast_manager_event_blob_create(int event_flags, const char *manager_event, const char *extra_fields_fmt,...)
Construct a ast_manager_event_blob.
Definition: manager.c:9760
struct ast_str * ast_manager_build_channel_state_string(const struct ast_channel_snapshot *snapshot)
Generate the AMI message body from a channel snapshot.
#define EVENT_FLAG_AGENT
Definition: manager.h:80
#define NULL
Definition: resample.c:96
void * stasis_message_data(const struct stasis_message *msg)
Get the data contained in a message.
char * ast_str_buffer(const struct ast_str *buf)
Returns the string buffer within the ast_str buf.
Definition: strings.h:739
Blob of data associated with a channel.
struct ast_channel_snapshot * snapshot
struct ast_json * blob
Struct containing info for an AMI event to send out.
Definition: manager.h:490
Support for dynamic strings.
Definition: strings.h:604

References ast_free, ast_json_object_get(), ast_json_string_get(), ast_manager_build_channel_state_string(), ast_manager_event_blob_create(), ast_str_buffer(), ast_channel_blob::blob, EVENT_FLAG_AGENT, NULL, ast_channel_blob::snapshot, and stasis_message_data().

◆ agent_logoff_to_ami()

static struct ast_manager_event_blob* agent_logoff_to_ami ( struct stasis_message msg)
static

Definition at line 1233 of file stasis_channels.c.

1234 {
1235  struct ast_str *channel_string;
1236  struct ast_channel_blob *obj = stasis_message_data(msg);
1237  const char *agent = ast_json_string_get(ast_json_object_get(obj->blob, "agent"));
1238  long logintime = ast_json_integer_get(ast_json_object_get(obj->blob, "logintime"));
1239  struct ast_manager_event_blob *ev;
1240 
1241  channel_string = ast_manager_build_channel_state_string(obj->snapshot);
1242  if (!channel_string) {
1243  return NULL;
1244  }
1245 
1246  ev = ast_manager_event_blob_create(EVENT_FLAG_AGENT, "AgentLogoff",
1247  "%s"
1248  "Agent: %s\r\n"
1249  "Logintime: %ld\r\n",
1250  ast_str_buffer(channel_string), agent, logintime);
1251  ast_free(channel_string);
1252  return ev;
1253 }
intmax_t ast_json_integer_get(const struct ast_json *integer)
Get the value from a JSON integer.
Definition: json.c:322

References ast_free, ast_json_integer_get(), ast_json_object_get(), ast_json_string_get(), ast_manager_build_channel_state_string(), ast_manager_event_blob_create(), ast_str_buffer(), ast_channel_blob::blob, EVENT_FLAG_AGENT, NULL, ast_channel_blob::snapshot, and stasis_message_data().

◆ ast_channel_publish_dial_internal()

static void ast_channel_publish_dial_internal ( struct ast_channel caller,
struct ast_channel peer,
struct ast_channel forwarded,
const char *  dialstring,
const char *  dialstatus,
const char *  forward 
)
static

Definition at line 602 of file stasis_channels.c.

605 {
606  struct ast_multi_channel_blob *payload;
607  struct stasis_message *msg;
608  struct ast_json *blob;
609  struct ast_channel_snapshot *peer_snapshot;
610 
611  if (!ast_channel_dial_type()) {
612  return;
613  }
614 
615  ast_assert(peer != NULL);
616 
617  blob = ast_json_pack("{s: s, s: s, s: s}",
618  "dialstatus", S_OR(dialstatus, ""),
619  "forward", S_OR(forward, ""),
620  "dialstring", S_OR(dialstring, ""));
621  if (!blob) {
622  return;
623  }
624  payload = ast_multi_channel_blob_create(blob);
625  ast_json_unref(blob);
626  if (!payload) {
627  return;
628  }
629 
630  if (caller) {
631  struct ast_channel_snapshot *caller_snapshot;
632 
634  if (ast_strlen_zero(dialstatus)) {
636  } else {
637  caller_snapshot = ast_channel_snapshot_create(caller);
638  }
640  if (!caller_snapshot) {
641  ao2_ref(payload, -1);
642  return;
643  }
644  ast_multi_channel_blob_add_channel(payload, "caller", caller_snapshot);
645  ao2_ref(caller_snapshot, -1);
646  }
647 
649  if (ast_strlen_zero(dialstatus)) {
651  } else {
652  peer_snapshot = ast_channel_snapshot_create(peer);
653  }
655  if (!peer_snapshot) {
656  ao2_ref(payload, -1);
657  return;
658  }
659  ast_multi_channel_blob_add_channel(payload, "peer", peer_snapshot);
660  ao2_ref(peer_snapshot, -1);
661 
662  if (forwarded) {
663  struct ast_channel_snapshot *forwarded_snapshot;
664 
665  ast_channel_lock(forwarded);
666  forwarded_snapshot = ast_channel_snapshot_create(forwarded);
667  ast_channel_unlock(forwarded);
668  if (!forwarded_snapshot) {
669  ao2_ref(payload, -1);
670  return;
671  }
672  ast_multi_channel_blob_add_channel(payload, "forwarded", forwarded_snapshot);
673  ao2_ref(forwarded_snapshot, -1);
674  }
675 
677  ao2_ref(payload, -1);
678  if (msg) {
680  ao2_ref(msg, -1);
681  }
682 }
#define ao2_ref(o, delta)
Reference/unreference an object and return the old refcount.
Definition: astobj2.h:459
const char * ast_channel_uniqueid(const struct ast_channel *chan)
#define ast_channel_lock(chan)
Definition: channel.h:2922
#define ast_channel_unlock(chan)
Definition: channel.h:2923
struct ast_channel_snapshot * ast_channel_snapshot_get_latest(const char *uniqueid)
Obtain the latest ast_channel_snapshot from the Stasis Message Bus API cache. This is an ao2 object,...
struct ast_channel_snapshot * ast_channel_snapshot_create(struct ast_channel *chan)
Generate a snapshot of the channel state. This is an ao2 object, so ao2_cleanup() to deallocate.
void ast_multi_channel_blob_add_channel(struct ast_multi_channel_blob *obj, const char *role, struct ast_channel_snapshot *snapshot)
Add a ast_channel_snapshot to a ast_multi_channel_blob object.
struct stasis_message_type * ast_channel_dial_type(void)
Message type for when a channel dials another channel.
struct ast_multi_channel_blob * ast_multi_channel_blob_create(struct ast_json *blob)
Create a ast_multi_channel_blob suitable for a stasis_message.
void ast_json_unref(struct ast_json *value)
Decrease refcount on value. If refcount reaches zero, value is freed.
Definition: json.c:73
struct ast_json * ast_json_pack(char const *format,...)
Helper for creating complex JSON values.
Definition: json.c:591
struct stasis_message * stasis_message_create(struct stasis_message_type *type, void *data)
Create a new message.
static void publish_message_for_channel_topics(struct stasis_message *message, struct ast_channel *chan)
#define S_OR(a, b)
returns the equivalent of logic or for strings: first one if not empty, otherwise second one.
Definition: strings.h:80
static force_inline int attribute_pure ast_strlen_zero(const char *s)
Definition: strings.h:65
Structure representing a snapshot of channel state.
struct ast_channel_snapshot_peer * peer
struct ast_channel_snapshot_caller * caller
Abstract JSON element (object, array, string, int, ...).
A multi channel blob data structure for multi_channel_blob stasis messages.
#define ast_assert(a)
Definition: utils.h:734

References ao2_ref, ast_assert, ast_channel_dial_type(), ast_channel_lock, ast_channel_snapshot_create(), ast_channel_snapshot_get_latest(), ast_channel_uniqueid(), ast_channel_unlock, ast_json_pack(), ast_json_unref(), ast_multi_channel_blob_add_channel(), ast_multi_channel_blob_create(), ast_strlen_zero(), ast_channel_snapshot::caller, NULL, ast_channel_snapshot::peer, publish_message_for_channel_topics(), S_OR, and stasis_message_create().

Referenced by ast_channel_publish_dial_forward(), dial_masquerade_breakdown(), and dial_masquerade_fixup().

◆ ast_channel_snapshot_caller_id_equal()

int ast_channel_snapshot_caller_id_equal ( const struct ast_channel_snapshot old_snapshot,
const struct ast_channel_snapshot new_snapshot 
)

Compares the callerid info of two snapshots.

Since
12
Parameters
old_snapshotOld snapshot
new_snapshotNew snapshot
Return values
True(non-zero) if callerid are identical.
False(zero) if callerid changed.

Definition at line 1318 of file stasis_channels.c.

1321 {
1322  ast_assert(old_snapshot != NULL);
1323  ast_assert(new_snapshot != NULL);
1324  return strcmp(old_snapshot->caller->number, new_snapshot->caller->number) == 0 &&
1325  strcmp(old_snapshot->caller->name, new_snapshot->caller->name) == 0;
1326 }
const ast_string_field number
const ast_string_field name

References ast_assert, ast_channel_snapshot::caller, ast_channel_snapshot_caller::name, NULL, and ast_channel_snapshot_caller::number.

Referenced by channel_callerid(), and channel_new_callerid().

◆ ast_channel_snapshot_cep_equal()

int ast_channel_snapshot_cep_equal ( const struct ast_channel_snapshot old_snapshot,
const struct ast_channel_snapshot new_snapshot 
)

Compares the context, exten and priority of two snapshots.

Since
12
Parameters
old_snapshotOld snapshot
new_snapshotNew snapshot
Return values
True(non-zero) if context, exten or priority are identical.
False(zero) if context, exten and priority changed.

Definition at line 1297 of file stasis_channels.c.

1300 {
1301  ast_assert(old_snapshot != NULL);
1302  ast_assert(new_snapshot != NULL);
1303 
1304  /* We actually get some snapshots with CEP set, but before the
1305  * application is set. Since empty application is invalid, we treat
1306  * setting the application from nothing as a CEP change.
1307  */
1308  if (ast_strlen_zero(old_snapshot->dialplan->appl) &&
1309  !ast_strlen_zero(new_snapshot->dialplan->appl)) {
1310  return 0;
1311  }
1312 
1313  return old_snapshot->dialplan->priority == new_snapshot->dialplan->priority &&
1314  strcmp(old_snapshot->dialplan->context, new_snapshot->dialplan->context) == 0 &&
1315  strcmp(old_snapshot->dialplan->exten, new_snapshot->dialplan->exten) == 0;
1316 }
const ast_string_field context
const ast_string_field exten
const ast_string_field appl
struct ast_channel_snapshot_dialplan * dialplan

References ast_channel_snapshot_dialplan::appl, ast_assert, ast_strlen_zero(), ast_channel_snapshot_dialplan::context, ast_channel_snapshot::dialplan, ast_channel_snapshot_dialplan::exten, NULL, and ast_channel_snapshot_dialplan::priority.

Referenced by channel_dialplan(), and channel_newexten().

◆ ast_channel_snapshot_connected_line_equal()

int ast_channel_snapshot_connected_line_equal ( const struct ast_channel_snapshot old_snapshot,
const struct ast_channel_snapshot new_snapshot 
)

Compares the connected line info of two snapshots.

Since
13.1.0
Parameters
old_snapshotOld snapshot
new_snapshotNew snapshot
Return values
True(non-zero) if callerid are identical.
False(zero) if callerid changed.

Definition at line 1328 of file stasis_channels.c.

1331 {
1332  ast_assert(old_snapshot != NULL);
1333  ast_assert(new_snapshot != NULL);
1334  return strcmp(old_snapshot->connected->number, new_snapshot->connected->number) == 0 &&
1335  strcmp(old_snapshot->connected->name, new_snapshot->connected->name) == 0;
1336 }
struct ast_channel_snapshot_connected * connected

References ast_assert, ast_channel_snapshot::connected, ast_channel_snapshot_connected::name, NULL, and ast_channel_snapshot_connected::number.

Referenced by channel_connected_line(), and channel_new_connected_line().

◆ ast_channel_snapshot_to_json()

struct ast_json* ast_channel_snapshot_to_json ( const struct ast_channel_snapshot snapshot,
const struct stasis_message_sanitizer sanitize 
)

Build a JSON object from a ast_channel_snapshot.

Parameters
snapshotThe snapshot to convert to JSON
sanitizeThe message sanitizer to use on the snapshot
Returns
JSON object representing channel snapshot.
Return values
NULLon error

Definition at line 1255 of file stasis_channels.c.

1258 {
1259  struct ast_json *json_chan;
1260 
1261  if (snapshot == NULL
1262  || (sanitize
1263  && sanitize->channel_snapshot
1264  && sanitize->channel_snapshot(snapshot))) {
1265  return NULL;
1266  }
1267 
1268  json_chan = ast_json_pack(
1269  /* Broken up into groups of three for readability */
1270  "{ s: s, s: s, s: s,"
1271  " s: o, s: o, s: s,"
1272  " s: o, s: o, s: s }",
1273  /* First line */
1274  "id", snapshot->base->uniqueid,
1275  "name", snapshot->base->name,
1276  "state", ast_state2str(snapshot->state),
1277  /* Second line */
1278  "caller", ast_json_name_number(
1279  snapshot->caller->name, snapshot->caller->number),
1280  "connected", ast_json_name_number(
1281  snapshot->connected->name, snapshot->connected->number),
1282  "accountcode", snapshot->base->accountcode,
1283  /* Third line */
1284  "dialplan", ast_json_dialplan_cep_app(
1285  snapshot->dialplan->context, snapshot->dialplan->exten, snapshot->dialplan->priority,
1286  snapshot->dialplan->appl, snapshot->dialplan->data),
1287  "creationtime", ast_json_timeval(snapshot->base->creationtime, NULL),
1288  "language", snapshot->base->language);
1289 
1290  if (snapshot->ari_vars && !AST_LIST_EMPTY(snapshot->ari_vars)) {
1291  ast_json_object_set(json_chan, "channelvars", ast_json_channel_vars(snapshot->ari_vars));
1292  }
1293 
1294  return json_chan;
1295 }
const char * ast_state2str(enum ast_channel_state state)
Gives the string form of a given channel state.
Definition: channel.c:636
struct ast_json * ast_json_channel_vars(struct varshead *channelvars)
Construct a JSON object from a ast_var_t list.
Definition: json.c:843
struct ast_json * ast_json_timeval(const struct timeval tv, const char *zone)
Construct a timeval as JSON.
Definition: json.c:649
int ast_json_object_set(struct ast_json *object, const char *key, struct ast_json *value)
Set a field in a JSON object.
Definition: json.c:404
struct ast_json * ast_json_name_number(const char *name, const char *number)
Common JSON rendering functions for common 'objects'.
Definition: json.c:625
struct ast_json * ast_json_dialplan_cep_app(const char *context, const char *exten, int priority, const char *app_name, const char *app_data)
Construct a context/exten/priority/application/application_data as JSON.
Definition: json.c:632
#define AST_LIST_EMPTY(head)
Checks whether the specified list contains any entries.
Definition: linkedlists.h:450
const ast_string_field language
const ast_string_field accountcode
const ast_string_field uniqueid
const ast_string_field name
const ast_string_field data
struct varshead * ari_vars
struct ast_channel_snapshot_base * base
enum ast_channel_state state
int(* channel_snapshot)(const struct ast_channel_snapshot *snapshot)
Callback which determines whether a channel should be sanitized from a message based on the channel's...
Definition: stasis.h:221

References ast_channel_snapshot_base::accountcode, ast_channel_snapshot_dialplan::appl, ast_channel_snapshot::ari_vars, ast_json_channel_vars(), ast_json_dialplan_cep_app(), ast_json_name_number(), ast_json_object_set(), ast_json_pack(), ast_json_timeval(), AST_LIST_EMPTY, ast_state2str(), ast_channel_snapshot::base, ast_channel_snapshot::caller, stasis_message_sanitizer::channel_snapshot, ast_channel_snapshot::connected, ast_channel_snapshot_dialplan::context, ast_channel_snapshot_base::creationtime, ast_channel_snapshot_dialplan::data, ast_channel_snapshot::dialplan, ast_channel_snapshot_dialplan::exten, ast_channel_snapshot_base::language, ast_channel_snapshot_caller::name, ast_channel_snapshot_connected::name, ast_channel_snapshot_base::name, NULL, ast_channel_snapshot_caller::number, ast_channel_snapshot_connected::number, ast_channel_snapshot_dialplan::priority, ast_channel_snapshot::state, and ast_channel_snapshot_base::uniqueid.

Referenced by ari_channels_handle_originate_with_id(), ari_channels_handle_snoop_channel(), ast_ari_channels_create(), ast_ari_channels_get(), ast_ari_channels_list(), AST_TEST_DEFINE(), attended_transfer_to_json(), blind_transfer_to_json(), channel_blob_to_json(), channel_callerid(), channel_connected_line(), channel_destroyed_event(), channel_dialplan(), channel_to_json(), dial_to_json(), dtmf_end_to_json(), hold_to_json(), multi_user_event_to_json(), rtcp_report_to_json(), simple_bridge_channel_event(), simple_channel_event(), stasis_app_exec(), stasis_end_to_json(), stasis_start_to_json(), and unhold_to_json().

◆ ast_stasis_channels_init()

int ast_stasis_channels_init ( void  )

Initialize the stasis channel topic and message types.

Return values
0on success
Non-zeroon error

Definition at line 1668 of file stasis_channels.c.

1669 {
1670  int res = 0;
1671 
1673 
1674  channel_topic_all = stasis_topic_create("channel:all");
1675  if (!channel_topic_all) {
1676  return -1;
1677  }
1678 
1682  if (!channel_cache) {
1683  return -1;
1684  }
1685 
1689  if (!channel_cache_by_name) {
1690  return -1;
1691  }
1692 
1719 
1720  return res;
1721 }
int ast_register_cleanup(void(*func)(void))
Register a function to be executed before Asterisk gracefully exits.
Definition: clicompat.c:19
@ AO2_ALLOC_OPT_LOCK_RWLOCK
Definition: astobj2.h:365
#define ao2_container_alloc_hash(ao2_options, container_options, n_buckets, hash_fn, sort_fn, cmp_fn)
Allocate and initialize a hash container with the desired number of buckets.
Definition: astobj2.h:1303
#define AST_NUM_CHANNEL_BUCKETS
Definition: channel.h:155
struct stasis_message_type * ast_channel_agent_login_type(void)
Message type for agent login on a channel.
struct stasis_message_type * ast_channel_monitor_stop_type(void)
Message type for stopping monitor on a channel.
struct stasis_message_type * ast_channel_mixmonitor_start_type(void)
Message type for starting mixmonitor on a channel.
struct stasis_message_type * ast_channel_moh_stop_type(void)
Message type for stopping music on hold on a channel.
struct stasis_message_type * ast_channel_talking_stop(void)
Message type for a channel stopping talking.
struct stasis_message_type * ast_channel_mixmonitor_mute_type(void)
Message type for muting or unmuting mixmonitor on a channel.
struct stasis_message_type * ast_channel_flash_type(void)
Message type for when a hook flash occurs on a channel.
struct stasis_message_type * ast_channel_agent_logoff_type(void)
Message type for agent logoff on a channel.
struct stasis_message_type * ast_channel_wink_type(void)
Message type for when a wink occurs on a channel.
struct stasis_message_type * ast_channel_hold_type(void)
Message type for when a channel is placed on hold.
struct stasis_message_type * ast_channel_monitor_start_type(void)
Message type for starting monitor on a channel.
struct stasis_message_type * ast_channel_chanspy_stop_type(void)
Message type for when a channel stops spying on another channel.
struct stasis_message_type * ast_channel_fax_type(void)
Message type for a fax operation.
struct stasis_message_type * ast_channel_masquerade_type(void)
Message type for when a channel is being masqueraded.
struct stasis_message_type * ast_channel_chanspy_start_type(void)
Message type for when a channel starts spying on another channel.
struct stasis_message_type * ast_channel_talking_start(void)
Message type for a channel starting talking.
struct stasis_message_type * ast_channel_snapshot_type(void)
Message type for ast_channel_snapshot_update.
struct stasis_message_type * ast_channel_dtmf_begin_type(void)
Message type for when DTMF begins on a channel.
struct stasis_message_type * ast_channel_dtmf_end_type(void)
Message type for when DTMF ends on a channel.
struct stasis_message_type * ast_channel_hangup_request_type(void)
Message type for when a hangup is requested on a channel.
struct stasis_message_type * ast_channel_unhold_type(void)
Message type for when a channel is removed from hold.
struct stasis_message_type * ast_channel_mixmonitor_stop_type(void)
Message type for stopping mixmonitor on a channel.
struct stasis_message_type * ast_channel_varset_type(void)
Message type for when a variable is set on a channel.
struct stasis_message_type * ast_channel_moh_start_type(void)
Message type for starting music on hold on a channel.
struct stasis_message_type * ast_channel_hangup_handler_type(void)
Message type for hangup handler related actions.
#define STASIS_MESSAGE_TYPE_INIT(name)
Boiler-plate messaging macro for initializing message types.
Definition: stasis.h:1493
struct stasis_topic * stasis_topic_create(const char *name)
Create a new topic.
Definition: stasis.c:619
static int channel_snapshot_cmp_cb(void *obj, void *arg, int flags)
static int channel_snapshot_uniqueid_cmp_cb(void *obj, void *arg, int flags)
static struct ao2_container * channel_cache_by_name
static struct stasis_topic * channel_topic_all
static int channel_snapshot_uniqueid_hash_cb(const void *obj, const int flags)
static struct ao2_container * channel_cache
static int channel_snapshot_hash_cb(const void *obj, const int flags)
static void stasis_channels_cleanup(void)

References AO2_ALLOC_OPT_LOCK_RWLOCK, ao2_container_alloc_hash, ast_channel_agent_login_type(), ast_channel_agent_logoff_type(), ast_channel_chanspy_start_type(), ast_channel_chanspy_stop_type(), ast_channel_dial_type(), ast_channel_dtmf_begin_type(), ast_channel_dtmf_end_type(), ast_channel_fax_type(), ast_channel_flash_type(), ast_channel_hangup_handler_type(), ast_channel_hangup_request_type(), ast_channel_hold_type(), ast_channel_masquerade_type(), ast_channel_mixmonitor_mute_type(), ast_channel_mixmonitor_start_type(), ast_channel_mixmonitor_stop_type(), ast_channel_moh_start_type(), ast_channel_moh_stop_type(), ast_channel_monitor_start_type(), ast_channel_monitor_stop_type(), ast_channel_snapshot_type(), ast_channel_talking_start(), ast_channel_talking_stop(), ast_channel_unhold_type(), ast_channel_varset_type(), ast_channel_wink_type(), AST_NUM_CHANNEL_BUCKETS, ast_register_cleanup(), channel_cache, channel_cache_by_name, channel_snapshot_cmp_cb(), channel_snapshot_hash_cb(), channel_snapshot_uniqueid_cmp_cb(), channel_snapshot_uniqueid_hash_cb(), channel_topic_all, NULL, stasis_channels_cleanup(), STASIS_MESSAGE_TYPE_INIT, and stasis_topic_create().

Referenced by ast_channels_init().

◆ channel_blob_dtor()

static void channel_blob_dtor ( void *  obj)
static

Definition at line 595 of file stasis_channels.c.

596 {
597  struct ast_channel_blob *event = obj;
598  ao2_cleanup(event->snapshot);
599  ast_json_unref(event->blob);
600 }
#define ao2_cleanup(obj)
Definition: astobj2.h:1934
Definition: astman.c:222

References ao2_cleanup, and ast_json_unref().

Referenced by create_channel_blob_message().

◆ channel_blob_to_json()

static struct ast_json* channel_blob_to_json ( struct stasis_message message,
const char *  type,
const struct stasis_message_sanitizer sanitize 
)
static

Definition at line 1338 of file stasis_channels.c.

1342 {
1343  struct ast_json *to_json;
1344  struct ast_channel_blob *channel_blob = stasis_message_data(message);
1345  struct ast_json *blob = channel_blob->blob;
1346  struct ast_channel_snapshot *snapshot = channel_blob->snapshot;
1347  const struct timeval *tv = stasis_message_timestamp(message);
1348  int res = 0;
1349 
1350  if (blob == NULL || ast_json_is_null(blob)) {
1351  to_json = ast_json_object_create();
1352  } else {
1353  /* blobs are immutable, so shallow copies are fine */
1354  to_json = ast_json_copy(blob);
1355  }
1356  if (!to_json) {
1357  return NULL;
1358  }
1359 
1360  res |= ast_json_object_set(to_json, "type", ast_json_string_create(type));
1361  res |= ast_json_object_set(to_json, "timestamp",
1362  ast_json_timeval(*tv, NULL));
1363 
1364  /* For global channel messages, the snapshot is optional */
1365  if (snapshot) {
1366  struct ast_json *json_channel;
1367 
1368  json_channel = ast_channel_snapshot_to_json(snapshot, sanitize);
1369  if (!json_channel) {
1370  ast_json_unref(to_json);
1371  return NULL;
1372  }
1373 
1374  res |= ast_json_object_set(to_json, "channel", json_channel);
1375  }
1376 
1377  if (res != 0) {
1378  ast_json_unref(to_json);
1379  return NULL;
1380  }
1381 
1382  return to_json;
1383 }
static const char type[]
Definition: chan_ooh323.c:109
struct ast_json * ast_json_copy(const struct ast_json *value)
Copy a JSON value, but not its children.
Definition: json.c:616
struct ast_json * ast_json_object_create(void)
Create a new JSON object.
Definition: json.c:389
struct ast_json * ast_json_string_create(const char *value)
Construct a JSON string from value.
Definition: json.c:268
int ast_json_is_null(const struct ast_json *value)
Check if value is JSON null.
Definition: json.c:263
const struct timeval * stasis_message_timestamp(const struct stasis_message *msg)
Get the time when a message was created.
struct ast_json * ast_channel_snapshot_to_json(const struct ast_channel_snapshot *snapshot, const struct stasis_message_sanitizer *sanitize)
Build a JSON object from a ast_channel_snapshot.

References ast_channel_snapshot_to_json(), ast_json_copy(), ast_json_is_null(), ast_json_object_create(), ast_json_object_set(), ast_json_string_create(), ast_json_timeval(), ast_json_unref(), ast_channel_blob::blob, NULL, ast_channel_blob::snapshot, stasis_message_data(), stasis_message_timestamp(), and type.

Referenced by hangup_request_to_json(), talking_start_to_json(), talking_stop_to_json(), and varset_to_json().

◆ channel_role_cmp_cb()

static int channel_role_cmp_cb ( void *  obj,
void *  arg,
int  flags 
)
static

Definition at line 820 of file stasis_channels.c.

821 {
822  const struct channel_role_snapshot *object_left = obj;
823  const struct channel_role_snapshot *object_right = arg;
824  const char *right_key = arg;
825  int cmp;
826 
827  switch (flags & OBJ_SEARCH_MASK) {
828  case OBJ_SEARCH_OBJECT:
829  right_key = object_right->role;
830  case OBJ_SEARCH_KEY:
831  cmp = strcasecmp(object_left->role, right_key);
832  break;
834  cmp = strncasecmp(object_left->role, right_key, strlen(right_key));
835  break;
836  default:
837  cmp = 0;
838  break;
839  }
840  if (cmp) {
841  return 0;
842  }
843  return CMP_MATCH;
844 }
@ CMP_MATCH
Definition: astobj2.h:1027
@ OBJ_SEARCH_PARTIAL_KEY
The arg parameter is a partial search key similar to OBJ_SEARCH_KEY.
Definition: astobj2.h:1116
@ OBJ_SEARCH_OBJECT
The arg parameter is an object of the same type.
Definition: astobj2.h:1087
@ OBJ_SEARCH_MASK
Search option field mask.
Definition: astobj2.h:1072
@ OBJ_SEARCH_KEY
The arg parameter is a search key, but is not an object.
Definition: astobj2.h:1101
A channel snapshot wrapper object used in ast_multi_channel_blob objects.

References CMP_MATCH, OBJ_SEARCH_KEY, OBJ_SEARCH_MASK, OBJ_SEARCH_OBJECT, OBJ_SEARCH_PARTIAL_KEY, and channel_role_snapshot::role.

Referenced by ast_multi_channel_blob_create(), and ast_multi_channel_blob_get_channels().

◆ channel_role_hash_cb()

static int channel_role_hash_cb ( const void *  obj,
const int  flags 
)
static

Definition at line 850 of file stasis_channels.c.

851 {
852  const struct channel_role_snapshot *object = obj;
853  const char *key;
854 
855  switch (flags & OBJ_SEARCH_MASK) {
856  case OBJ_SEARCH_KEY:
857  key = obj;
858  break;
859  case OBJ_SEARCH_OBJECT:
860  key = object->role;
861  break;
862  default:
863  ast_assert(0);
864  return 0;
865  }
866  return ast_str_case_hash(key);
867 }
static force_inline int attribute_pure ast_str_case_hash(const char *str)
Compute a hash value on a case-insensitive string.
Definition: strings.h:1281

References ast_assert, ast_str_case_hash(), OBJ_SEARCH_KEY, OBJ_SEARCH_MASK, and OBJ_SEARCH_OBJECT.

Referenced by ast_multi_channel_blob_create().

◆ channel_role_snapshot_dtor()

static void channel_role_snapshot_dtor ( void *  obj)
static

Definition at line 949 of file stasis_channels.c.

950 {
951  struct channel_role_snapshot *role_snapshot = obj;
952 
953  ao2_cleanup(role_snapshot->snapshot);
954 }
struct ast_channel_snapshot * snapshot

References ao2_cleanup, and channel_role_snapshot::snapshot.

Referenced by ast_multi_channel_blob_add_channel().

◆ channel_snapshot_base_create()

static struct ast_channel_snapshot_base* channel_snapshot_base_create ( struct ast_channel chan)
static

Definition at line 266 of file stasis_channels.c.

267 {
268  struct ast_channel_snapshot_base *snapshot;
269 
270  snapshot = ao2_alloc_options(sizeof(*snapshot), channel_snapshot_base_dtor,
272  if (!snapshot) {
273  return NULL;
274  }
275 
276  if (ast_string_field_init(snapshot, 256)) {
277  ao2_ref(snapshot, -1);
278  return NULL;
279  }
280 
281  ast_string_field_set(snapshot, name, ast_channel_name(chan));
282  ast_string_field_set(snapshot, type, ast_channel_tech(chan)->type);
287 
288  snapshot->creationtime = ast_channel_creationtime(chan);
289  snapshot->tech_properties = ast_channel_tech(chan)->properties;
290 
291  return snapshot;
292 }
@ AO2_ALLOC_OPT_LOCK_NOLOCK
Definition: astobj2.h:367
#define ao2_alloc_options(data_size, destructor_fn, options)
Definition: astobj2.h:404
static char language[MAX_LANGUAGE]
Definition: chan_alsa.c:121
static char accountcode[AST_MAX_ACCOUNT_CODE]
Definition: chan_iax2.c:425
const char * ast_channel_accountcode(const struct ast_channel *chan)
const char * ast_channel_userfield(const struct ast_channel *chan)
const char * ast_channel_name(const struct ast_channel *chan)
struct timeval ast_channel_creationtime(struct ast_channel *chan)
const char * ast_channel_language(const struct ast_channel *chan)
const struct ast_channel_tech * ast_channel_tech(const struct ast_channel *chan)
static const char name[]
Definition: format_mp3.c:68
static void channel_snapshot_base_dtor(void *obj)
#define ast_string_field_set(x, field, data)
Set a field to a simple string value.
Definition: stringfields.h:521
#define ast_string_field_init(x, size)
Initialize a field pool and fields.
Definition: stringfields.h:359
Structure containing base information for a channel snapshot.
const ast_string_field userfield

References accountcode, AO2_ALLOC_OPT_LOCK_NOLOCK, ao2_alloc_options, ao2_ref, ast_channel_accountcode(), ast_channel_creationtime(), ast_channel_language(), ast_channel_name(), ast_channel_tech(), ast_channel_uniqueid(), ast_channel_userfield(), ast_string_field_init, ast_string_field_set, channel_snapshot_base_dtor(), ast_channel_snapshot_base::creationtime, language, name, NULL, ast_channel_tech::properties, ast_channel_snapshot_base::tech_properties, type, ast_channel_snapshot_base::uniqueid, and ast_channel_snapshot_base::userfield.

Referenced by ast_channel_snapshot_create().

◆ channel_snapshot_base_dtor()

static void channel_snapshot_base_dtor ( void *  obj)
static

Definition at line 259 of file stasis_channels.c.

260 {
261  struct ast_channel_snapshot_base *snapshot = obj;
262 
264 }
#define ast_string_field_free_memory(x)
free all memory - to be called before destroying the object
Definition: stringfields.h:374

References ast_string_field_free_memory.

Referenced by channel_snapshot_base_create().

◆ channel_snapshot_bridge_create()

static struct ast_channel_snapshot_bridge* channel_snapshot_bridge_create ( struct ast_channel chan)
static

Definition at line 378 of file stasis_channels.c.

379 {
380  const char *uniqueid = "";
381  struct ast_bridge *bridge;
382  struct ast_channel_snapshot_bridge *snapshot;
383 
384  bridge = ast_channel_get_bridge(chan);
385  if (bridge && !ast_test_flag(&bridge->feature_flags, AST_BRIDGE_FLAG_INVISIBLE)) {
386  uniqueid = bridge->uniqueid;
387  }
388  ao2_cleanup(bridge);
389 
390  snapshot = ao2_alloc_options(sizeof(*snapshot) + strlen(uniqueid) + 1, NULL, AO2_ALLOC_OPT_LOCK_NOLOCK);
391  if (!snapshot) {
392  return NULL;
393  }
394 
395  strcpy(snapshot->id, uniqueid); /* Safe */
396 
397  return snapshot;
398 }
@ AST_BRIDGE_FLAG_INVISIBLE
struct ast_bridge * ast_channel_get_bridge(const struct ast_channel *chan)
Get the bridge associated with a channel.
Definition: channel.c:10720
Structure that contains information about a bridge.
Definition: bridge.h:349
const ast_string_field uniqueid
Definition: bridge.h:401
struct ast_flags feature_flags
Definition: bridge.h:369
Structure containing bridge information for a channel snapshot.
#define ast_test_flag(p, flag)
Definition: utils.h:63

References AO2_ALLOC_OPT_LOCK_NOLOCK, ao2_alloc_options, ao2_cleanup, AST_BRIDGE_FLAG_INVISIBLE, ast_channel_get_bridge(), ast_test_flag, ast_bridge::feature_flags, ast_channel_snapshot_bridge::id, NULL, and ast_bridge::uniqueid.

Referenced by ast_channel_snapshot_create().

◆ channel_snapshot_caller_create()

static struct ast_channel_snapshot_caller* channel_snapshot_caller_create ( struct ast_channel chan)
static

Definition at line 321 of file stasis_channels.c.

322 {
323  struct ast_channel_snapshot_caller *snapshot;
324 
325  snapshot = ao2_alloc_options(sizeof(*snapshot), channel_snapshot_caller_dtor,
327  if (!snapshot) {
328  return NULL;
329  }
330 
331  if (ast_string_field_init(snapshot, 256)) {
332  ao2_ref(snapshot, -1);
333  return NULL;
334  }
335 
336  ast_string_field_set(snapshot, name,
337  S_COR(ast_channel_caller(chan)->id.name.valid, ast_channel_caller(chan)->id.name.str, ""));
338  ast_string_field_set(snapshot, number,
339  S_COR(ast_channel_caller(chan)->id.number.valid, ast_channel_caller(chan)->id.number.str, ""));
340  ast_string_field_set(snapshot, subaddr,
341  S_COR(ast_channel_caller(chan)->id.subaddress.valid, ast_channel_caller(chan)->id.subaddress.str, ""));
342  ast_string_field_set(snapshot, ani,
343  S_COR(ast_channel_caller(chan)->ani.number.valid, ast_channel_caller(chan)->ani.number.str, ""));
344 
345  ast_string_field_set(snapshot, rdnis,
346  S_COR(ast_channel_redirecting(chan)->from.number.valid, ast_channel_redirecting(chan)->from.number.str, ""));
347 
348  ast_string_field_set(snapshot, dnid,
349  S_OR(ast_channel_dialed(chan)->number.str, ""));
351  S_COR(ast_channel_dialed(chan)->subaddress.valid, ast_channel_dialed(chan)->subaddress.str, ""));
352 
353  snapshot->pres = ast_party_id_presentation(&ast_channel_caller(chan)->id);
354 
355  return snapshot;
356 }
int ast_party_id_presentation(const struct ast_party_id *id)
Determine the overall presentation value for the given party.
Definition: channel.c:1815
struct ast_party_dialed * ast_channel_dialed(struct ast_channel *chan)
struct ast_party_caller * ast_channel_caller(struct ast_channel *chan)
struct ast_party_redirecting * ast_channel_redirecting(struct ast_channel *chan)
static void channel_snapshot_caller_dtor(void *obj)
#define S_COR(a, b, c)
returns the equivalent of logic or for strings, with an additional boolean check: second one if not e...
Definition: strings.h:87
Structure containing caller information for a channel snapshot.
const ast_string_field dialed_subaddr
const ast_string_field rdnis
const ast_string_field ani
const ast_string_field subaddr
const ast_string_field dnid
char * str
Subscriber phone number (Malloced)
Definition: channel.h:386
Number structure.
Definition: app_followme.c:154

References ast_channel_snapshot_caller::ani, AO2_ALLOC_OPT_LOCK_NOLOCK, ao2_alloc_options, ao2_ref, ast_channel_caller(), ast_channel_dialed(), ast_channel_redirecting(), ast_party_id_presentation(), ast_string_field_init, ast_string_field_set, channel_snapshot_caller_dtor(), ast_channel_snapshot_caller::dialed_subaddr, ast_channel_snapshot_caller::dnid, name, NULL, ast_channel_snapshot_caller::pres, ast_channel_snapshot_caller::rdnis, S_COR, S_OR, ast_party_dialed::str, and ast_channel_snapshot_caller::subaddr.

Referenced by ast_channel_snapshot_create().

◆ channel_snapshot_caller_dtor()

static void channel_snapshot_caller_dtor ( void *  obj)
static

Definition at line 314 of file stasis_channels.c.

315 {
316  struct ast_channel_snapshot_caller *snapshot = obj;
317 
319 }

References ast_string_field_free_memory.

Referenced by channel_snapshot_caller_create().

◆ channel_snapshot_cmp_cb()

static int channel_snapshot_cmp_cb ( void *  obj,
void *  arg,
int  flags 
)
static

Definition at line 165 of file stasis_channels.c.

166 {
167  const struct ast_channel_snapshot *object_left = obj;
168  const struct ast_channel_snapshot *object_right = arg;
169  const char *right_key = arg;
170  int cmp;
171 
172  switch (flags & OBJ_SEARCH_MASK) {
173  case OBJ_SEARCH_OBJECT:
174  right_key = object_right->base->name;
175  case OBJ_SEARCH_KEY:
176  cmp = strcasecmp(object_left->base->name, right_key);
177  break;
179  cmp = strncasecmp(object_left->base->name, right_key, strlen(right_key));
180  break;
181  default:
182  cmp = 0;
183  break;
184  }
185  if (cmp) {
186  return 0;
187  }
188  return CMP_MATCH;
189 }
struct ast_flags flags

References ast_channel_snapshot::base, CMP_MATCH, ast_channel_snapshot::flags, ast_channel_snapshot_base::name, OBJ_SEARCH_KEY, OBJ_SEARCH_MASK, OBJ_SEARCH_OBJECT, and OBJ_SEARCH_PARTIAL_KEY.

Referenced by ast_multi_channel_blob_get_channels(), and ast_stasis_channels_init().

◆ channel_snapshot_connected_create()

static struct ast_channel_snapshot_connected* channel_snapshot_connected_create ( struct ast_channel chan)
static

Definition at line 358 of file stasis_channels.c.

359 {
360  const char *name = S_COR(ast_channel_connected(chan)->id.name.valid, ast_channel_connected(chan)->id.name.str, "");
361  const char *number = S_COR(ast_channel_connected(chan)->id.number.valid, ast_channel_connected(chan)->id.number.str, "");
362  size_t name_len = strlen(name) + 1;
363  size_t number_len = strlen(number) + 1;
364  struct ast_channel_snapshot_connected *snapshot;
365 
366  snapshot = ao2_alloc_options(sizeof(*snapshot) + name_len + number_len, NULL, AO2_ALLOC_OPT_LOCK_NOLOCK);
367  if (!snapshot) {
368  return NULL;
369  }
370 
371  strcpy(snapshot->name, name); /* Safe */
372  snapshot->number = snapshot->name + name_len;
373  ast_copy_string(snapshot->number, number, number_len); /* Safe */
374 
375  return snapshot;
376 }
struct ast_party_connected_line * ast_channel_connected(struct ast_channel *chan)
void ast_copy_string(char *dst, const char *src, size_t size)
Size-limited null-terminating string copy.
Definition: strings.h:406
Structure containing connected information for a channel snapshot.

References AO2_ALLOC_OPT_LOCK_NOLOCK, ao2_alloc_options, ast_channel_connected(), ast_copy_string(), ast_channel_snapshot_connected::name, name, NULL, ast_channel_snapshot_connected::number, and S_COR.

Referenced by ast_channel_snapshot_create().

◆ channel_snapshot_dialplan_create()

static struct ast_channel_snapshot_dialplan* channel_snapshot_dialplan_create ( struct ast_channel chan)
static

Definition at line 407 of file stasis_channels.c.

408 {
409  struct ast_channel_snapshot_dialplan *snapshot;
410 
411  snapshot = ao2_alloc_options(sizeof(*snapshot), channel_snapshot_dialplan_dtor,
413  if (!snapshot) {
414  return NULL;
415  }
416 
417  if (ast_string_field_init(snapshot, 256)) {
418  ao2_ref(snapshot, -1);
419  return NULL;
420  }
421 
422  if (ast_channel_appl(chan)) {
423  ast_string_field_set(snapshot, appl, ast_channel_appl(chan));
424  }
425  if (ast_channel_data(chan)) {
426  ast_string_field_set(snapshot, data, ast_channel_data(chan));
427  }
429  ast_string_field_set(snapshot, exten, ast_channel_exten(chan));
430  snapshot->priority = ast_channel_priority(chan);
431 
432  return snapshot;
433 }
static char exten[AST_MAX_EXTENSION]
Definition: chan_alsa.c:122
static char context[AST_MAX_CONTEXT]
Definition: chan_alsa.c:120
const char * ast_channel_data(const struct ast_channel *chan)
const char * ast_channel_context(const struct ast_channel *chan)
int ast_channel_priority(const struct ast_channel *chan)
const char * ast_channel_exten(const struct ast_channel *chan)
const char * ast_channel_appl(const struct ast_channel *chan)
static void channel_snapshot_dialplan_dtor(void *obj)
Structure containing dialplan information for a channel snapshot.

References AO2_ALLOC_OPT_LOCK_NOLOCK, ao2_alloc_options, ao2_ref, ast_channel_snapshot_dialplan::appl, ast_channel_appl(), ast_channel_context(), ast_channel_data(), ast_channel_exten(), ast_channel_priority(), ast_string_field_init, ast_string_field_set, channel_snapshot_dialplan_dtor(), context, ast_channel_snapshot_dialplan::data, exten, NULL, and ast_channel_snapshot_dialplan::priority.

Referenced by ast_channel_snapshot_create().

◆ channel_snapshot_dialplan_dtor()

static void channel_snapshot_dialplan_dtor ( void *  obj)
static

Definition at line 400 of file stasis_channels.c.

401 {
402  struct ast_channel_snapshot_dialplan *snapshot = obj;
403 
405 }

References ast_string_field_free_memory.

Referenced by channel_snapshot_dialplan_create().

◆ channel_snapshot_dtor()

static void channel_snapshot_dtor ( void *  obj)
static

Definition at line 244 of file stasis_channels.c.

245 {
246  struct ast_channel_snapshot *snapshot = obj;
247 
248  ao2_cleanup(snapshot->base);
249  ao2_cleanup(snapshot->peer);
250  ao2_cleanup(snapshot->caller);
251  ao2_cleanup(snapshot->connected);
252  ao2_cleanup(snapshot->bridge);
253  ao2_cleanup(snapshot->dialplan);
254  ao2_cleanup(snapshot->hangup);
255  ao2_cleanup(snapshot->manager_vars);
256  ao2_cleanup(snapshot->ari_vars);
257 }
struct varshead * manager_vars
struct ast_channel_snapshot_bridge * bridge
struct ast_channel_snapshot_hangup * hangup

References ao2_cleanup, ast_channel_snapshot::ari_vars, ast_channel_snapshot::base, ast_channel_snapshot::bridge, ast_channel_snapshot::caller, ast_channel_snapshot::connected, ast_channel_snapshot::dialplan, ast_channel_snapshot::hangup, ast_channel_snapshot::manager_vars, and ast_channel_snapshot::peer.

Referenced by ast_channel_snapshot_create().

◆ channel_snapshot_hangup_create()

static struct ast_channel_snapshot_hangup* channel_snapshot_hangup_create ( struct ast_channel chan)
static

Definition at line 435 of file stasis_channels.c.

436 {
437  const char *hangupsource = S_OR(ast_channel_hangupsource(chan), "");
438  struct ast_channel_snapshot_hangup *snapshot;
439 
440  snapshot = ao2_alloc_options(sizeof(*snapshot) + strlen(hangupsource) + 1, NULL, AO2_ALLOC_OPT_LOCK_NOLOCK);
441  if (!snapshot) {
442  return NULL;
443  }
444 
445  snapshot->cause = ast_channel_hangupcause(chan);
446  strcpy(snapshot->source, hangupsource); /* Safe */
447 
448  return snapshot;
449 }
const char * ast_channel_hangupsource(const struct ast_channel *chan)
int ast_channel_hangupcause(const struct ast_channel *chan)
Structure containing hangup information for a channel snapshot.

References AO2_ALLOC_OPT_LOCK_NOLOCK, ao2_alloc_options, ast_channel_hangupcause(), ast_channel_hangupsource(), ast_channel_snapshot_hangup::cause, NULL, S_OR, and ast_channel_snapshot_hangup::source.

Referenced by ast_channel_snapshot_create().

◆ channel_snapshot_hash_cb()

static int channel_snapshot_hash_cb ( const void *  obj,
const int  flags 
)
static

Definition at line 142 of file stasis_channels.c.

143 {
144  const struct ast_channel_snapshot *object = obj;
145  const char *key;
146 
147  switch (flags & OBJ_SEARCH_MASK) {
148  case OBJ_SEARCH_KEY:
149  key = obj;
150  break;
151  case OBJ_SEARCH_OBJECT:
152  key = object->base->name;
153  break;
154  default:
155  ast_assert(0);
156  return 0;
157  }
158  return ast_str_case_hash(key);
159 }

References ast_assert, ast_str_case_hash(), ast_channel_snapshot::flags, OBJ_SEARCH_KEY, OBJ_SEARCH_MASK, and OBJ_SEARCH_OBJECT.

Referenced by ast_multi_channel_blob_get_channels(), and ast_stasis_channels_init().

◆ channel_snapshot_peer_create()

static struct ast_channel_snapshot_peer* channel_snapshot_peer_create ( struct ast_channel chan)
static

Definition at line 294 of file stasis_channels.c.

295 {
296  const char *linkedid = S_OR(ast_channel_linkedid(chan), "");
297  const char *peeraccount = S_OR(ast_channel_peeraccount(chan), "");
298  size_t linkedid_len = strlen(linkedid) + 1;
299  size_t peeraccount_len = strlen(peeraccount) + 1;
300  struct ast_channel_snapshot_peer *snapshot;
301 
302  snapshot = ao2_alloc_options(sizeof(*snapshot) + linkedid_len + peeraccount_len, NULL, AO2_ALLOC_OPT_LOCK_NOLOCK);
303  if (!snapshot) {
304  return NULL;
305  }
306 
307  strcpy(snapshot->account, peeraccount); /* Safe */
308  snapshot->linkedid = snapshot->account + peeraccount_len;
309  ast_copy_string(snapshot->linkedid, linkedid, linkedid_len); /* Safe */
310 
311  return snapshot;
312 }
const char * ast_channel_peeraccount(const struct ast_channel *chan)
const char * ast_channel_linkedid(const struct ast_channel *chan)
Structure containing peer information for a channel snapshot.

References ast_channel_snapshot_peer::account, AO2_ALLOC_OPT_LOCK_NOLOCK, ao2_alloc_options, ast_channel_linkedid(), ast_channel_peeraccount(), ast_copy_string(), ast_channel_snapshot_peer::linkedid, NULL, and S_OR.

Referenced by ast_channel_snapshot_create().

◆ channel_snapshot_uniqueid_cmp_cb()

static int channel_snapshot_uniqueid_cmp_cb ( void *  obj,
void *  arg,
int  flags 
)
static

Definition at line 218 of file stasis_channels.c.

219 {
220  const struct ast_channel_snapshot *object_left = obj;
221  const struct ast_channel_snapshot *object_right = arg;
222  const char *right_key = arg;
223  int cmp;
224 
225  switch (flags & OBJ_SEARCH_MASK) {
226  case OBJ_SEARCH_OBJECT:
227  right_key = object_right->base->uniqueid;
228  case OBJ_SEARCH_KEY:
229  cmp = strcasecmp(object_left->base->uniqueid, right_key);
230  break;
232  cmp = strncasecmp(object_left->base->uniqueid, right_key, strlen(right_key));
233  break;
234  default:
235  cmp = 0;
236  break;
237  }
238  if (cmp) {
239  return 0;
240  }
241  return CMP_MATCH;
242 }

References ast_channel_snapshot::base, CMP_MATCH, ast_channel_snapshot::flags, OBJ_SEARCH_KEY, OBJ_SEARCH_MASK, OBJ_SEARCH_OBJECT, OBJ_SEARCH_PARTIAL_KEY, and ast_channel_snapshot_base::uniqueid.

Referenced by ast_stasis_channels_init().

◆ channel_snapshot_uniqueid_hash_cb()

static int channel_snapshot_uniqueid_hash_cb ( const void *  obj,
const int  flags 
)
static

Definition at line 195 of file stasis_channels.c.

196 {
197  const struct ast_channel_snapshot *object = obj;
198  const char *key;
199 
200  switch (flags & OBJ_SEARCH_MASK) {
201  case OBJ_SEARCH_KEY:
202  key = obj;
203  break;
204  case OBJ_SEARCH_OBJECT:
205  key = object->base->uniqueid;
206  break;
207  default:
208  ast_assert(0);
209  return 0;
210  }
211  return ast_str_case_hash(key);
212 }

References ast_assert, ast_str_case_hash(), ast_channel_snapshot::flags, OBJ_SEARCH_KEY, OBJ_SEARCH_MASK, and OBJ_SEARCH_OBJECT.

Referenced by ast_stasis_channels_init().

◆ channel_snapshot_update_create()

static struct ast_channel_snapshot_update* channel_snapshot_update_create ( struct ast_channel chan)
static

Definition at line 566 of file stasis_channels.c.

567 {
569 
572  if (!update) {
573  return NULL;
574  }
575 
576  update->old_snapshot = ao2_bump(ast_channel_snapshot(chan));
577  update->new_snapshot = ast_channel_snapshot_create(chan);
578  if (!update->new_snapshot) {
579  ao2_ref(update, -1);
580  return NULL;
581  }
582 
583  return update;
584 }
#define ao2_bump(obj)
Bump refcount on an AO2 object by one, returning the object.
Definition: astobj2.h:480
struct ast_channel_snapshot * ast_channel_snapshot(const struct ast_channel *chan)
static void update(int code_size, int y, int wi, int fi, int dq, int sr, int dqsez, struct g726_state *state_ptr)
Definition: codec_g726.c:367
static void channel_snapshot_update_dtor(void *obj)
Structure representing a change of snapshot of channel state.

References AO2_ALLOC_OPT_LOCK_NOLOCK, ao2_alloc_options, ao2_bump, ao2_ref, ast_channel_snapshot(), ast_channel_snapshot_create(), channel_snapshot_update_dtor(), NULL, and update().

Referenced by ast_channel_publish_final_snapshot(), and ast_channel_publish_snapshot().

◆ channel_snapshot_update_dtor()

static void channel_snapshot_update_dtor ( void *  obj)
static

Definition at line 558 of file stasis_channels.c.

559 {
560  struct ast_channel_snapshot_update *update = obj;
561 
562  ao2_cleanup(update->old_snapshot);
563  ao2_cleanup(update->new_snapshot);
564 }

References ao2_cleanup, and update().

Referenced by channel_snapshot_update_create().

◆ create_channel_blob_message()

static struct stasis_message* create_channel_blob_message ( struct ast_channel_snapshot snapshot,
struct stasis_message_type type,
struct ast_json blob 
)
static

Definition at line 745 of file stasis_channels.c.

748 {
749  struct stasis_message *msg;
750  struct ast_channel_blob *obj;
751 
752  obj = ao2_alloc(sizeof(*obj), channel_blob_dtor);
753  if (!obj) {
754  return NULL;
755  }
756 
757  if (snapshot) {
758  obj->snapshot = snapshot;
759  ao2_ref(obj->snapshot, +1);
760  }
761  if (!blob) {
762  blob = ast_json_null();
763  }
764  obj->blob = ast_json_ref(blob);
765 
766  msg = stasis_message_create(type, obj);
767  ao2_cleanup(obj);
768  return msg;
769 }
#define ao2_alloc(data_size, destructor_fn)
Definition: astobj2.h:409
struct ast_json * ast_json_ref(struct ast_json *value)
Increase refcount on value.
Definition: json.c:67
struct ast_json * ast_json_null(void)
Get the JSON null value.
Definition: json.c:248
static void channel_blob_dtor(void *obj)

References ao2_alloc, ao2_cleanup, ao2_ref, ast_json_null(), ast_json_ref(), ast_channel_blob::blob, channel_blob_dtor(), NULL, ast_channel_blob::snapshot, stasis_message_create(), and type.

Referenced by ast_channel_blob_create(), and ast_channel_blob_create_from_cache().

◆ dial_masquerade_breakdown()

static void dial_masquerade_breakdown ( void *  data,
struct ast_channel old_chan,
struct ast_channel new_chan 
)
static

Definition at line 1885 of file stasis_channels.c.

1886 {
1887  struct dial_masquerade_datastore *masq_data = data;
1888  struct dial_target *cur;
1889 
1890  ao2_lock(masq_data);
1891 
1892  if (!masq_data->caller) {
1893  ao2_unlock(masq_data);
1894  return;
1895  }
1896 
1897  if (masq_data->caller == new_chan) {
1898  /*
1899  * The caller channel is being masqueraded into.
1900  * The masquerade is likely because of a blonde transfer.
1901  */
1902  ast_debug(1, "Caller channel %s being masqueraded into by %s (is_empty:%d)\n",
1903  ast_channel_name(old_chan), ast_channel_name(new_chan),
1904  AST_LIST_EMPTY(&masq_data->dialed_peers));
1905  AST_LIST_TRAVERSE(&masq_data->dialed_peers, cur, list) {
1907  cur->dialstring, "NOANSWER", NULL);
1909  cur->dialstring, NULL, NULL);
1910  }
1911 
1912  ao2_unlock(masq_data);
1913  return;
1914  }
1915 
1916  /*
1917  * One of the peer channels is being masqueraded into.
1918  * The masquerade is likely because of a call pickup.
1919  */
1920  AST_LIST_TRAVERSE(&masq_data->dialed_peers, cur, list) {
1921  if (cur->peer == new_chan) {
1922  ast_debug(1, "Peer channel %s being masqueraded into by %s\n",
1923  ast_channel_name(old_chan), ast_channel_name(new_chan));
1924  ast_channel_publish_dial_internal(masq_data->caller, old_chan, NULL,
1925  cur->dialstring, "CANCEL", NULL);
1926  ast_channel_publish_dial_internal(masq_data->caller, new_chan, NULL,
1927  cur->dialstring, NULL, NULL);
1928  break;
1929  }
1930  }
1931 
1932  ao2_unlock(masq_data);
1933 }
#define ao2_unlock(a)
Definition: astobj2.h:729
#define ao2_lock(a)
Definition: astobj2.h:717
#define ast_debug(level,...)
Log a DEBUG message.
#define AST_LIST_TRAVERSE(head, var, field)
Loops over (traverses) the entries in a list.
Definition: linkedlists.h:491
static void ast_channel_publish_dial_internal(struct ast_channel *caller, struct ast_channel *peer, struct ast_channel *forwarded, const char *dialstring, const char *dialstatus, const char *forward)
struct ast_channel * caller
struct dial_masquerade_datastore::@425 dialed_peers
struct ast_channel * peer
struct dial_target::@424 list

References ao2_lock, ao2_unlock, ast_channel_name(), ast_channel_publish_dial_internal(), ast_debug, AST_LIST_EMPTY, AST_LIST_TRAVERSE, dial_masquerade_datastore::caller, dial_masquerade_datastore::dialed_peers, dial_target::dialstring, dial_target::list, NULL, and dial_target::peer.

◆ dial_masquerade_caller_datastore_destroy()

static void dial_masquerade_caller_datastore_destroy ( void *  data)
static

Definition at line 1818 of file stasis_channels.c.

1819 {
1821  ao2_ref(data, -1);
1822 }
static void dial_masquerade_datastore_cleanup(struct dial_masquerade_datastore *masq_data)

References ao2_ref, and dial_masquerade_datastore_cleanup().

◆ dial_masquerade_datastore_add()

static struct dial_masquerade_datastore* dial_masquerade_datastore_add ( struct ast_channel chan,
struct dial_masquerade_datastore masq_data 
)
static

Definition at line 1980 of file stasis_channels.c.

1982 {
1983  struct ast_datastore *datastore;
1984 
1986  if (!datastore) {
1987  return NULL;
1988  }
1989 
1990  if (!masq_data) {
1991  masq_data = dial_masquerade_datastore_alloc();
1992  if (!masq_data) {
1993  ast_datastore_free(datastore);
1994  return NULL;
1995  }
1996  masq_data->caller = chan;
1997  }
1998 
1999  datastore->data = masq_data;
2000  ast_channel_datastore_add(chan, datastore);
2001 
2002  return masq_data;
2003 }
int ast_channel_datastore_add(struct ast_channel *chan, struct ast_datastore *datastore)
Add a datastore to a channel.
Definition: channel.c:2384
#define ast_datastore_alloc(info, uid)
Definition: datastore.h:85
int ast_datastore_free(struct ast_datastore *datastore)
Free a data store object.
Definition: datastore.c:68
static const struct ast_datastore_info dial_masquerade_caller_info
static const struct ast_datastore_info dial_masquerade_info
static struct dial_masquerade_datastore * dial_masquerade_datastore_alloc(void)
Structure for a data store object.
Definition: datastore.h:64
void * data
Definition: datastore.h:66

References ast_channel_datastore_add(), ast_datastore_alloc, ast_datastore_free(), dial_masquerade_datastore::caller, ast_datastore::data, dial_masquerade_caller_info, dial_masquerade_datastore_alloc(), dial_masquerade_info, and NULL.

Referenced by set_dial_masquerade().

◆ dial_masquerade_datastore_alloc()

static struct dial_masquerade_datastore* dial_masquerade_datastore_alloc ( void  )
static

Definition at line 1792 of file stasis_channels.c.

1793 {
1794  struct dial_masquerade_datastore *masq_data;
1795 
1796  masq_data = ao2_alloc(sizeof(struct dial_masquerade_datastore),
1798  if (!masq_data) {
1799  return NULL;
1800  }
1802  return masq_data;
1803 }
#define AST_LIST_HEAD_INIT_NOLOCK(head)
Initializes a list head structure.
Definition: linkedlists.h:681
static void dial_masquerade_datastore_dtor(void *vdoomed)

References ao2_alloc, AST_LIST_HEAD_INIT_NOLOCK, dial_masquerade_datastore_dtor(), dial_masquerade_datastore::dialed_peers, and NULL.

Referenced by dial_masquerade_datastore_add().

◆ dial_masquerade_datastore_cleanup()

static void dial_masquerade_datastore_cleanup ( struct dial_masquerade_datastore masq_data)
static

Definition at line 1758 of file stasis_channels.c.

1759 {
1760  struct dial_target *cur;
1761 
1762  while ((cur = AST_LIST_REMOVE_HEAD(&masq_data->dialed_peers, list))) {
1763  dial_target_free(cur);
1764  }
1765 }
#define AST_LIST_REMOVE_HEAD(head, field)
Removes and returns the head entry from a list.
Definition: linkedlists.h:833
static void dial_target_free(struct dial_target *doomed)

References AST_LIST_REMOVE_HEAD, dial_target_free(), dial_masquerade_datastore::dialed_peers, and dial_target::list.

Referenced by dial_masquerade_caller_datastore_destroy(), dial_masquerade_datastore_dtor(), dial_masquerade_datastore_remove_chan(), and dial_masquerade_fixup().

◆ dial_masquerade_datastore_destroy()

static void dial_masquerade_datastore_destroy ( void *  data)
static

Definition at line 1809 of file stasis_channels.c.

1810 {
1811  ao2_ref(data, -1);
1812 }

References ao2_ref.

◆ dial_masquerade_datastore_dtor()

static void dial_masquerade_datastore_dtor ( void *  vdoomed)
static

Definition at line 1787 of file stasis_channels.c.

1788 {
1790 }

References dial_masquerade_datastore_cleanup().

Referenced by dial_masquerade_datastore_alloc().

◆ dial_masquerade_datastore_find()

static struct ast_datastore * dial_masquerade_datastore_find ( struct ast_channel chan)
static

Definition at line 1957 of file stasis_channels.c.

1958 {
1959  struct ast_datastore *datastore;
1960 
1962  if (!datastore) {
1964  }
1965 
1966  return datastore;
1967 }
struct ast_datastore * ast_channel_datastore_find(struct ast_channel *chan, const struct ast_datastore_info *info, const char *uid)
Find a datastore on a channel.
Definition: channel.c:2398

References ast_channel_datastore_find(), dial_masquerade_caller_info, dial_masquerade_info, and NULL.

Referenced by dial_masquerade_fixup(), remove_dial_masquerade(), remove_dial_masquerade_caller(), and set_dial_masquerade().

◆ dial_masquerade_datastore_remove_chan()

static void dial_masquerade_datastore_remove_chan ( struct dial_masquerade_datastore masq_data,
struct ast_channel chan 
)
static

Definition at line 1767 of file stasis_channels.c.

1768 {
1769  struct dial_target *cur;
1770 
1771  ao2_lock(masq_data);
1772  if (masq_data->caller == chan) {
1774  } else {
1775  AST_LIST_TRAVERSE_SAFE_BEGIN(&masq_data->dialed_peers, cur, list) {
1776  if (cur->peer == chan) {
1778  dial_target_free(cur);
1779  break;
1780  }
1781  }
1783  }
1784  ao2_unlock(masq_data);
1785 }
#define AST_LIST_TRAVERSE_SAFE_END
Closes a safe loop traversal block.
Definition: linkedlists.h:615
#define AST_LIST_TRAVERSE_SAFE_BEGIN(head, var, field)
Loops safely over (traverses) the entries in a list.
Definition: linkedlists.h:529
#define AST_LIST_REMOVE_CURRENT(field)
Removes the current entry from a list during a traversal.
Definition: linkedlists.h:557

References ao2_lock, ao2_unlock, AST_LIST_REMOVE_CURRENT, AST_LIST_TRAVERSE_SAFE_BEGIN, AST_LIST_TRAVERSE_SAFE_END, dial_masquerade_datastore::caller, dial_masquerade_datastore_cleanup(), dial_target_free(), dial_masquerade_datastore::dialed_peers, dial_target::list, and dial_target::peer.

Referenced by remove_dial_masquerade(), remove_dial_masquerade_caller(), and set_dial_masquerade().

◆ dial_masquerade_fixup()

static void dial_masquerade_fixup ( void *  data,
struct ast_channel old_chan,
struct ast_channel new_chan 
)
static

Definition at line 1826 of file stasis_channels.c.

1827 {
1828  struct dial_masquerade_datastore *masq_data = data;
1829  struct dial_target *cur;
1830  struct ast_datastore *datastore;
1831 
1832  ao2_lock(masq_data);
1833  if (!masq_data->caller) {
1834  /* Nothing to do but remove the datastore */
1835  } else if (masq_data->caller == old_chan) {
1836  /* The caller channel is being masqueraded out. */
1837  ast_debug(1, "Caller channel %s being masqueraded out to %s (is_empty:%d)\n",
1838  ast_channel_name(new_chan), ast_channel_name(old_chan),
1839  AST_LIST_EMPTY(&masq_data->dialed_peers));
1840  AST_LIST_TRAVERSE(&masq_data->dialed_peers, cur, list) {
1842  cur->dialstring, "NOANSWER", NULL);
1844  cur->dialstring, NULL, NULL);
1845  }
1847  } else {
1848  /* One of the peer channels is being masqueraded out. */
1849  AST_LIST_TRAVERSE_SAFE_BEGIN(&masq_data->dialed_peers, cur, list) {
1850  if (cur->peer == old_chan) {
1851  ast_debug(1, "Peer channel %s being masqueraded out to %s\n",
1852  ast_channel_name(new_chan), ast_channel_name(old_chan));
1853  ast_channel_publish_dial_internal(masq_data->caller, new_chan, NULL,
1854  cur->dialstring, "CANCEL", NULL);
1855  ast_channel_publish_dial_internal(masq_data->caller, old_chan, NULL,
1856  cur->dialstring, NULL, NULL);
1857 
1859  dial_target_free(cur);
1860  break;
1861  }
1862  }
1864  }
1865  ao2_unlock(masq_data);
1866 
1867  /* Remove the datastore from the channel. */
1868  datastore = dial_masquerade_datastore_find(old_chan);
1869  if (!datastore) {
1870  return;
1871  }
1872  ast_channel_datastore_remove(old_chan, datastore);
1873  ast_datastore_free(datastore);
1874 }
int ast_channel_datastore_remove(struct ast_channel *chan, struct ast_datastore *datastore)
Remove a datastore from a channel.
Definition: channel.c:2393
static struct ast_datastore * dial_masquerade_datastore_find(struct ast_channel *chan)

References ao2_lock, ao2_unlock, ast_channel_datastore_remove(), ast_channel_name(), ast_channel_publish_dial_internal(), ast_datastore_free(), ast_debug, AST_LIST_EMPTY, AST_LIST_REMOVE_CURRENT, AST_LIST_TRAVERSE, AST_LIST_TRAVERSE_SAFE_BEGIN, AST_LIST_TRAVERSE_SAFE_END, dial_masquerade_datastore::caller, dial_masquerade_datastore_cleanup(), dial_masquerade_datastore_find(), dial_target_free(), dial_masquerade_datastore::dialed_peers, dial_target::dialstring, NULL, and dial_target::peer.

◆ dial_target_free()

static void dial_target_free ( struct dial_target doomed)
static

Definition at line 1736 of file stasis_channels.c.

1737 {
1738  if (!doomed) {
1739  return;
1740  }
1741  ast_free(doomed->dialstring);
1742  ast_channel_cleanup(doomed->peer);
1743  ast_free(doomed);
1744 }
#define ast_channel_cleanup(c)
Cleanup a channel reference.
Definition: channel.h:2969

References ast_channel_cleanup, ast_free, dial_target::dialstring, and dial_target::peer.

Referenced by dial_masquerade_datastore_cleanup(), dial_masquerade_datastore_remove_chan(), and dial_masquerade_fixup().

◆ dial_to_json()

static struct ast_json* dial_to_json ( struct stasis_message message,
const struct stasis_message_sanitizer sanitize 
)
static

Definition at line 1433 of file stasis_channels.c.

1436 {
1438  struct ast_json *blob = ast_multi_channel_blob_get_json(payload);
1439  const char *dialstatus =
1440  ast_json_string_get(ast_json_object_get(blob, "dialstatus"));
1441  const char *forward =
1442  ast_json_string_get(ast_json_object_get(blob, "forward"));
1443  const char *dialstring =
1444  ast_json_string_get(ast_json_object_get(blob, "dialstring"));
1445  struct ast_json *caller_json = ast_channel_snapshot_to_json(ast_multi_channel_blob_get_channel(payload, "caller"), sanitize);
1446  struct ast_json *peer_json = ast_channel_snapshot_to_json(ast_multi_channel_blob_get_channel(payload, "peer"), sanitize);
1447  struct ast_json *forwarded_json = ast_channel_snapshot_to_json(ast_multi_channel_blob_get_channel(payload, "forwarded"), sanitize);
1448  struct ast_json *json;
1449  const struct timeval *tv = stasis_message_timestamp(message);
1450  int res = 0;
1451 
1452  json = ast_json_pack("{s: s, s: o, s: s, s: s, s: s}",
1453  "type", "Dial",
1454  "timestamp", ast_json_timeval(*tv, NULL),
1455  "dialstatus", dialstatus,
1456  "forward", forward,
1457  "dialstring", dialstring);
1458  if (!json) {
1459  ast_json_unref(caller_json);
1460  ast_json_unref(peer_json);
1461  ast_json_unref(forwarded_json);
1462  return NULL;
1463  }
1464 
1465  if (caller_json) {
1466  res |= ast_json_object_set(json, "caller", caller_json);
1467  }
1468  if (peer_json) {
1469  res |= ast_json_object_set(json, "peer", peer_json);
1470  }
1471  if (forwarded_json) {
1472  res |= ast_json_object_set(json, "forwarded", forwarded_json);
1473  }
1474 
1475  if (res) {
1476  ast_json_unref(json);
1477  return NULL;
1478  }
1479 
1480  return json;
1481 }
struct ast_json * ast_multi_channel_blob_get_json(struct ast_multi_channel_blob *obj)
Retrieve the JSON blob from a ast_multi_channel_blob. Returned ast_json is still owned by obj.
struct ast_channel_snapshot * ast_multi_channel_blob_get_channel(struct ast_multi_channel_blob *obj, const char *role)
Retrieve a channel snapshot associated with a specific role from a ast_multi_channel_blob.

References ast_channel_snapshot_to_json(), ast_json_object_get(), ast_json_object_set(), ast_json_pack(), ast_json_string_get(), ast_json_timeval(), ast_json_unref(), ast_multi_channel_blob_get_channel(), ast_multi_channel_blob_get_json(), NULL, stasis_message_data(), and stasis_message_timestamp().

◆ dtmf_end_to_json()

static struct ast_json* dtmf_end_to_json ( struct stasis_message message,
const struct stasis_message_sanitizer sanitize 
)
static

Definition at line 1385 of file stasis_channels.c.

1388 {
1389  struct ast_channel_blob *channel_blob = stasis_message_data(message);
1390  struct ast_json *blob = channel_blob->blob;
1391  struct ast_channel_snapshot *snapshot = channel_blob->snapshot;
1392  const char *direction =
1393  ast_json_string_get(ast_json_object_get(blob, "direction"));
1394  const char *digit =
1395  ast_json_string_get(ast_json_object_get(blob, "digit"));
1396  long duration_ms =
1397  ast_json_integer_get(ast_json_object_get(blob, "duration_ms"));
1398  const struct timeval *tv = stasis_message_timestamp(message);
1399  struct ast_json *json_channel;
1400 
1401  /* Only present received DTMF end events as JSON */
1402  if (strcasecmp("Received", direction) != 0) {
1403  return NULL;
1404  }
1405 
1406  json_channel = ast_channel_snapshot_to_json(snapshot, sanitize);
1407  if (!json_channel) {
1408  return NULL;
1409  }
1410 
1411  return ast_json_pack("{s: s, s: o, s: s, s: I, s: o}",
1412  "type", "ChannelDtmfReceived",
1413  "timestamp", ast_json_timeval(*tv, NULL),
1414  "digit", digit,
1415  "duration_ms", (ast_json_int_t)duration_ms,
1416  "channel", json_channel);
1417 }
char digit
direction
AST_JSON_INT_T ast_json_int_t
Primarily used to cast when packing to an "I" type.
Definition: json.h:87

References ast_channel_snapshot_to_json(), ast_json_integer_get(), ast_json_object_get(), ast_json_pack(), ast_json_string_get(), ast_json_timeval(), ast_channel_blob::blob, digit, NULL, ast_channel_blob::snapshot, stasis_message_data(), and stasis_message_timestamp().

◆ hangup_request_to_json()

static struct ast_json* hangup_request_to_json ( struct stasis_message message,
const struct stasis_message_sanitizer sanitize 
)
static

Definition at line 1426 of file stasis_channels.c.

1429 {
1430  return channel_blob_to_json(message, "ChannelHangupRequest", sanitize);
1431 }
static struct ast_json * channel_blob_to_json(struct stasis_message *message, const char *type, const struct stasis_message_sanitizer *sanitize)

References channel_blob_to_json().

◆ hold_to_json()

static struct ast_json* hold_to_json ( struct stasis_message message,
const struct stasis_message_sanitizer sanitize 
)
static

Definition at line 1535 of file stasis_channels.c.

1537 {
1538  struct ast_channel_blob *channel_blob = stasis_message_data(message);
1539  struct ast_json *blob = channel_blob->blob;
1540  struct ast_channel_snapshot *snapshot = channel_blob->snapshot;
1541  const char *musicclass = ast_json_string_get(ast_json_object_get(blob, "musicclass"));
1542  const struct timeval *tv = stasis_message_timestamp(message);
1543  struct ast_json *json_channel;
1544 
1545  json_channel = ast_channel_snapshot_to_json(snapshot, sanitize);
1546  if (!json_channel) {
1547  return NULL;
1548  }
1549 
1550  return ast_json_pack("{s: s, s: o, s: s, s: o}",
1551  "type", "ChannelHold",
1552  "timestamp", ast_json_timeval(*tv, NULL),
1553  "musicclass", S_OR(musicclass, "N/A"),
1554  "channel", json_channel);
1555 }
static char musicclass[MAX_MUSICCLASS]
Definition: chan_mgcp.c:165

References ast_channel_snapshot_to_json(), ast_json_object_get(), ast_json_pack(), ast_json_string_get(), ast_json_timeval(), ast_channel_blob::blob, musicclass, NULL, S_OR, ast_channel_blob::snapshot, stasis_message_data(), and stasis_message_timestamp().

◆ multi_channel_blob_dtor()

static void multi_channel_blob_dtor ( void *  obj)
static

Definition at line 873 of file stasis_channels.c.

874 {
875  struct ast_multi_channel_blob *multi_blob = obj;
876 
877  ao2_cleanup(multi_blob->channel_snapshots);
878  ast_json_unref(multi_blob->blob);
879 }
struct ast_json * blob
struct ao2_container * channel_snapshots

References ao2_cleanup, ast_json_unref(), ast_multi_channel_blob::blob, and ast_multi_channel_blob::channel_snapshots.

Referenced by ast_multi_channel_blob_create().

◆ publish_message_for_channel_topics()

static void publish_message_for_channel_topics ( struct stasis_message message,
struct ast_channel chan 
)
static

Definition at line 586 of file stasis_channels.c.

587 {
588  if (chan) {
590  } else {
592  }
593 }
struct stasis_topic * ast_channel_topic(struct ast_channel *chan)
A topic which publishes the events for a particular channel.
struct stasis_topic * ast_channel_topic_all(void)
A topic which publishes the events for all channels.
void stasis_publish(struct stasis_topic *topic, struct stasis_message *message)
Publish a message to a topic's subscribers.
Definition: stasis.c:1513

References ast_channel_topic(), ast_channel_topic_all(), and stasis_publish().

Referenced by ast_channel_publish_dial_internal().

◆ remove_dial_masquerade()

static void remove_dial_masquerade ( struct ast_channel peer)
static

Definition at line 2084 of file stasis_channels.c.

2085 {
2086  struct ast_datastore *datastore;
2087  struct dial_masquerade_datastore *masq_data;
2088 
2089  datastore = dial_masquerade_datastore_find(peer);
2090  if (!datastore) {
2091  return;
2092  }
2093 
2094  masq_data = datastore->data;
2095  if (masq_data) {
2096  dial_masquerade_datastore_remove_chan(masq_data, peer);
2097  }
2098 
2099  ast_channel_datastore_remove(peer, datastore);
2100  ast_datastore_free(datastore);
2101 }
static void dial_masquerade_datastore_remove_chan(struct dial_masquerade_datastore *masq_data, struct ast_channel *chan)

References ast_channel_datastore_remove(), ast_datastore_free(), ast_datastore::data, dial_masquerade_datastore_find(), and dial_masquerade_datastore_remove_chan().

Referenced by ast_channel_publish_dial_forward().

◆ remove_dial_masquerade_caller()

static void remove_dial_masquerade_caller ( struct ast_channel caller)
static

Definition at line 2103 of file stasis_channels.c.

2104 {
2105  struct ast_datastore *datastore;
2106  struct dial_masquerade_datastore *masq_data;
2107 
2109  if (!datastore) {
2110  return;
2111  }
2112 
2113  masq_data = datastore->data;
2114  if (!masq_data || !AST_LIST_EMPTY(&masq_data->dialed_peers)) {
2115  return;
2116  }
2117 
2119 
2121  ast_datastore_free(datastore);
2122 }

References ast_channel_datastore_remove(), ast_datastore_free(), AST_LIST_EMPTY, dial_masquerade_datastore::caller, ast_datastore::data, dial_masquerade_datastore_find(), dial_masquerade_datastore_remove_chan(), and dial_masquerade_datastore::dialed_peers.

Referenced by ast_channel_publish_dial_forward().

◆ set_dial_masquerade()

static int set_dial_masquerade ( struct ast_channel caller,
struct ast_channel peer,
const char *  dialstring 
)
static

Definition at line 2005 of file stasis_channels.c.

2006 {
2007  struct ast_datastore *datastore;
2008  struct dial_masquerade_datastore *masq_data;
2009  struct dial_target *target;
2010 
2011  /* Find or create caller datastore */
2012  datastore = dial_masquerade_datastore_find(caller);
2013  if (!datastore) {
2014  masq_data = dial_masquerade_datastore_add(caller, NULL);
2015  } else {
2016  masq_data = datastore->data;
2017  }
2018  if (!masq_data) {
2019  return -1;
2020  }
2021  ao2_ref(masq_data, +1);
2022 
2023  /*
2024  * Someone likely forgot to do an ast_channel_publish_dial()
2025  * or ast_channel_publish_dial_forward() with a final dial
2026  * status on the channel.
2027  */
2028  ast_assert(masq_data->caller == caller);
2029 
2030  /* Create peer target to put into datastore */
2031  target = ast_calloc(1, sizeof(*target));
2032  if (!target) {
2033  ao2_ref(masq_data, -1);
2034  return -1;
2035  }
2036  if (dialstring) {
2037  target->dialstring = ast_strdup(dialstring);
2038  if (!target->dialstring) {
2039  ast_free(target);
2040  ao2_ref(masq_data, -1);
2041  return -1;
2042  }
2043  }
2044  target->peer = ast_channel_ref(peer);
2045 
2046  /* Put peer target into datastore */
2047  ao2_lock(masq_data);
2049  AST_LIST_INSERT_HEAD(&masq_data->dialed_peers, target, list);
2050  ao2_unlock(masq_data);
2051 
2052  datastore = dial_masquerade_datastore_find(peer);
2053  if (datastore) {
2054  if (datastore->data == masq_data) {
2055  /*
2056  * Peer already had the datastore for this dial masquerade.
2057  * This was a redundant peer dial masquerade setup.
2058  */
2059  ao2_ref(masq_data, -1);
2060  return 0;
2061  }
2062 
2063  /* Something is wrong. Try to fix if the assert doesn't abort. */
2064  ast_assert(0);
2065 
2066  /* Remove the stale dial masquerade datastore */
2068  ast_channel_datastore_remove(peer, datastore);
2069  ast_datastore_free(datastore);
2070  }
2071 
2072  /* Create the peer dial masquerade datastore */
2073  if (dial_masquerade_datastore_add(peer, masq_data)) {
2074  /* Success */
2075  return 0;
2076  }
2077 
2078  /* Failed to create the peer datastore */
2080  ao2_ref(masq_data, -1);
2081  return -1;
2082 }
#define ast_strdup(str)
A wrapper for strdup()
Definition: astmm.h:241
#define ast_calloc(num, len)
A wrapper for calloc()
Definition: astmm.h:202
#define ast_channel_ref(c)
Increase channel reference count.
Definition: channel.h:2947
#define AST_LIST_INSERT_HEAD(head, elm, field)
Inserts a list entry at the head of a list.
Definition: linkedlists.h:711
static struct dial_masquerade_datastore * dial_masquerade_datastore_add(struct ast_channel *chan, struct dial_masquerade_datastore *masq_data)

References ao2_lock, ao2_ref, ao2_unlock, ast_assert, ast_calloc, ast_channel_datastore_remove(), ast_channel_ref, ast_datastore_free(), ast_free, AST_LIST_INSERT_HEAD, ast_strdup, dial_masquerade_datastore::caller, ast_datastore::data, dial_masquerade_datastore_add(), dial_masquerade_datastore_find(), dial_masquerade_datastore_remove_chan(), dial_masquerade_datastore::dialed_peers, dial_target::dialstring, dial_target::list, NULL, and dial_target::peer.

Referenced by ast_channel_publish_dial_forward().

◆ stasis_channels_cleanup()

static void stasis_channels_cleanup ( void  )
static

Definition at line 1631 of file stasis_channels.c.

1632 {
1636  channel_cache = NULL;
1639 
1666 }
#define STASIS_MESSAGE_TYPE_CLEANUP(name)
Boiler-plate messaging macro for cleaning up message types.
Definition: stasis.h:1515

References ao2_cleanup, ast_channel_agent_login_type(), ast_channel_agent_logoff_type(), ast_channel_chanspy_start_type(), ast_channel_chanspy_stop_type(), ast_channel_dial_type(), ast_channel_dtmf_begin_type(), ast_channel_dtmf_end_type(), ast_channel_fax_type(), ast_channel_flash_type(), ast_channel_hangup_handler_type(), ast_channel_hangup_request_type(), ast_channel_hold_type(), ast_channel_masquerade_type(), ast_channel_mixmonitor_mute_type(), ast_channel_mixmonitor_start_type(), ast_channel_mixmonitor_stop_type(), ast_channel_moh_start_type(), ast_channel_moh_stop_type(), ast_channel_monitor_start_type(), ast_channel_monitor_stop_type(), ast_channel_snapshot_type(), ast_channel_talking_start(), ast_channel_talking_stop(), ast_channel_unhold_type(), ast_channel_varset_type(), ast_channel_wink_type(), channel_cache, channel_cache_by_name, channel_topic_all, NULL, and STASIS_MESSAGE_TYPE_CLEANUP.

Referenced by ast_stasis_channels_init().

◆ STASIS_MESSAGE_TYPE_DEFN() [1/26]

STASIS_MESSAGE_TYPE_DEFN ( ast_channel_agent_login_type  ,
to_ami = agent_login_to_ami 
)

◆ STASIS_MESSAGE_TYPE_DEFN() [2/26]

STASIS_MESSAGE_TYPE_DEFN ( ast_channel_agent_logoff_type  ,
to_ami = agent_logoff_to_ami 
)

◆ STASIS_MESSAGE_TYPE_DEFN() [3/26]

STASIS_MESSAGE_TYPE_DEFN ( ast_channel_chanspy_start_type  )

◆ STASIS_MESSAGE_TYPE_DEFN() [4/26]

STASIS_MESSAGE_TYPE_DEFN ( ast_channel_chanspy_stop_type  )

◆ STASIS_MESSAGE_TYPE_DEFN() [5/26]

STASIS_MESSAGE_TYPE_DEFN ( ast_channel_dial_type  ,
to_json = dial_to_json 
)

◆ STASIS_MESSAGE_TYPE_DEFN() [6/26]

STASIS_MESSAGE_TYPE_DEFN ( ast_channel_dtmf_begin_type  )

◆ STASIS_MESSAGE_TYPE_DEFN() [7/26]

STASIS_MESSAGE_TYPE_DEFN ( ast_channel_dtmf_end_type  ,
to_json = dtmf_end_to_json 
)

◆ STASIS_MESSAGE_TYPE_DEFN() [8/26]

STASIS_MESSAGE_TYPE_DEFN ( ast_channel_fax_type  )

◆ STASIS_MESSAGE_TYPE_DEFN() [9/26]

STASIS_MESSAGE_TYPE_DEFN ( ast_channel_flash_type  )

◆ STASIS_MESSAGE_TYPE_DEFN() [10/26]

STASIS_MESSAGE_TYPE_DEFN ( ast_channel_hangup_handler_type  )

◆ STASIS_MESSAGE_TYPE_DEFN() [11/26]

STASIS_MESSAGE_TYPE_DEFN ( ast_channel_hangup_request_type  ,
to_json = hangup_request_to_json 
)

◆ STASIS_MESSAGE_TYPE_DEFN() [12/26]

STASIS_MESSAGE_TYPE_DEFN ( ast_channel_hold_type  ,
to_json = hold_to_json 
)

◆ STASIS_MESSAGE_TYPE_DEFN() [13/26]

STASIS_MESSAGE_TYPE_DEFN ( ast_channel_masquerade_type  )

◆ STASIS_MESSAGE_TYPE_DEFN() [14/26]

STASIS_MESSAGE_TYPE_DEFN ( ast_channel_mixmonitor_mute_type  )

◆ STASIS_MESSAGE_TYPE_DEFN() [15/26]

STASIS_MESSAGE_TYPE_DEFN ( ast_channel_mixmonitor_start_type  )

◆ STASIS_MESSAGE_TYPE_DEFN() [16/26]

STASIS_MESSAGE_TYPE_DEFN ( ast_channel_mixmonitor_stop_type  )

◆ STASIS_MESSAGE_TYPE_DEFN() [17/26]

STASIS_MESSAGE_TYPE_DEFN ( ast_channel_moh_start_type  )

◆ STASIS_MESSAGE_TYPE_DEFN() [18/26]

STASIS_MESSAGE_TYPE_DEFN ( ast_channel_moh_stop_type  )

◆ STASIS_MESSAGE_TYPE_DEFN() [19/26]

STASIS_MESSAGE_TYPE_DEFN ( ast_channel_monitor_start_type  )

◆ STASIS_MESSAGE_TYPE_DEFN() [20/26]

STASIS_MESSAGE_TYPE_DEFN ( ast_channel_monitor_stop_type  )

◆ STASIS_MESSAGE_TYPE_DEFN() [21/26]

STASIS_MESSAGE_TYPE_DEFN ( ast_channel_snapshot_type  )

Define channel message types.

◆ STASIS_MESSAGE_TYPE_DEFN() [22/26]

STASIS_MESSAGE_TYPE_DEFN ( ast_channel_talking_start  ,
to_ami = talking_start_to_ami,
to_json = talking_start_to_json 
)

◆ STASIS_MESSAGE_TYPE_DEFN() [23/26]

STASIS_MESSAGE_TYPE_DEFN ( ast_channel_talking_stop  ,
to_ami = talking_stop_to_ami,
to_json = talking_stop_to_json 
)

◆ STASIS_MESSAGE_TYPE_DEFN() [24/26]

STASIS_MESSAGE_TYPE_DEFN ( ast_channel_unhold_type  ,
to_json = unhold_to_json 
)

◆ STASIS_MESSAGE_TYPE_DEFN() [25/26]

STASIS_MESSAGE_TYPE_DEFN ( ast_channel_varset_type  ,
to_ami = varset_to_ami,
to_json = varset_to_json 
)

◆ STASIS_MESSAGE_TYPE_DEFN() [26/26]

STASIS_MESSAGE_TYPE_DEFN ( ast_channel_wink_type  )

◆ talking_start_to_ami()

static struct ast_manager_event_blob* talking_start_to_ami ( struct stasis_message msg)
static

Definition at line 1483 of file stasis_channels.c.

1484 {
1485  struct ast_str *channel_string;
1486  struct ast_channel_blob *obj = stasis_message_data(msg);
1487  struct ast_manager_event_blob *blob;
1488 
1489  channel_string = ast_manager_build_channel_state_string(obj->snapshot);
1490  if (!channel_string) {
1491  return NULL;
1492  }
1493 
1494  blob = ast_manager_event_blob_create(EVENT_FLAG_CALL, "ChannelTalkingStart",
1495  "%s", ast_str_buffer(channel_string));
1496  ast_free(channel_string);
1497 
1498  return blob;
1499 }
#define EVENT_FLAG_CALL
Definition: manager.h:76

References ast_free, ast_manager_build_channel_state_string(), ast_manager_event_blob_create(), ast_str_buffer(), EVENT_FLAG_CALL, NULL, ast_channel_blob::snapshot, and stasis_message_data().

◆ talking_start_to_json()

static struct ast_json* talking_start_to_json ( struct stasis_message message,
const struct stasis_message_sanitizer sanitize 
)
static

Definition at line 1501 of file stasis_channels.c.

1503 {
1504  return channel_blob_to_json(message, "ChannelTalkingStarted", sanitize);
1505 }

References channel_blob_to_json().

◆ talking_stop_to_ami()

static struct ast_manager_event_blob* talking_stop_to_ami ( struct stasis_message msg)
static

Definition at line 1507 of file stasis_channels.c.

1508 {
1509  struct ast_str *channel_string;
1510  struct ast_channel_blob *obj = stasis_message_data(msg);
1511  int duration = ast_json_integer_get(ast_json_object_get(obj->blob, "duration"));
1512  struct ast_manager_event_blob *blob;
1513 
1514  channel_string = ast_manager_build_channel_state_string(obj->snapshot);
1515  if (!channel_string) {
1516  return NULL;
1517  }
1518 
1519  blob = ast_manager_event_blob_create(EVENT_FLAG_CALL, "ChannelTalkingStop",
1520  "%s"
1521  "Duration: %d\r\n",
1522  ast_str_buffer(channel_string),
1523  duration);
1524  ast_free(channel_string);
1525 
1526  return blob;
1527 }

References ast_free, ast_json_integer_get(), ast_json_object_get(), ast_manager_build_channel_state_string(), ast_manager_event_blob_create(), ast_str_buffer(), ast_channel_blob::blob, EVENT_FLAG_CALL, NULL, ast_channel_blob::snapshot, and stasis_message_data().

◆ talking_stop_to_json()

static struct ast_json* talking_stop_to_json ( struct stasis_message message,
const struct stasis_message_sanitizer sanitize 
)
static

Definition at line 1529 of file stasis_channels.c.

1531 {
1532  return channel_blob_to_json(message, "ChannelTalkingFinished", sanitize);
1533 }

References channel_blob_to_json().

◆ unhold_to_json()

static struct ast_json* unhold_to_json ( struct stasis_message message,
const struct stasis_message_sanitizer sanitize 
)
static

Definition at line 1557 of file stasis_channels.c.

1559 {
1560  struct ast_channel_blob *channel_blob = stasis_message_data(message);
1561  struct ast_channel_snapshot *snapshot = channel_blob->snapshot;
1562  const struct timeval *tv = stasis_message_timestamp(message);
1563  struct ast_json *json_channel;
1564 
1565  json_channel = ast_channel_snapshot_to_json(snapshot, sanitize);
1566  if (!json_channel) {
1567  return NULL;
1568  }
1569 
1570  return ast_json_pack("{s: s, s: o, s: o}",
1571  "type", "ChannelUnhold",
1572  "timestamp", ast_json_timeval(*tv, NULL),
1573  "channel", json_channel);
1574 }

References ast_channel_snapshot_to_json(), ast_json_pack(), ast_json_timeval(), NULL, ast_channel_blob::snapshot, stasis_message_data(), and stasis_message_timestamp().

◆ varset_to_ami()

static struct ast_manager_event_blob* varset_to_ami ( struct stasis_message msg)
static

Definition at line 1175 of file stasis_channels.c.

1176 {
1177  struct ast_str *channel_event_string;
1178  struct ast_channel_blob *obj = stasis_message_data(msg);
1179  const char *variable =
1180  ast_json_string_get(ast_json_object_get(obj->blob, "variable"));
1181  char *value;
1182  struct ast_manager_event_blob *ev;
1183 
1185  "value")));
1186  if (!value) {
1187  return NULL;
1188  }
1189 
1190  if (obj->snapshot) {
1191  channel_event_string = ast_manager_build_channel_state_string(obj->snapshot);
1192  } else {
1193  channel_event_string = ast_str_create(35);
1194  ast_str_set(&channel_event_string, 0,
1195  "Channel: none\r\n"
1196  "Uniqueid: none\r\n");
1197  }
1198  if (!channel_event_string) {
1199  ast_free(value);
1200  return NULL;
1201  }
1202 
1204  "%s"
1205  "Variable: %s\r\n"
1206  "Value: %s\r\n",
1207  ast_str_buffer(channel_event_string), variable, value);
1208  ast_free(channel_event_string);
1209  ast_free(value);
1210  return ev;
1211 }
#define EVENT_FLAG_DIALPLAN
Definition: manager.h:86
char * ast_escape_c_alloc(const char *s)
Escape standard 'C' sequences in the given string.
Definition: main/utils.c:2038
#define ast_str_create(init_len)
Create a malloc'ed dynamic length string.
Definition: strings.h:640
int ast_str_set(struct ast_str **buf, ssize_t max_len, const char *fmt,...)
Set a dynamic string using variable arguments.
Definition: strings.h:1091
int value
Definition: syslog.c:37

References ast_escape_c_alloc(), ast_free, ast_json_object_get(), ast_json_string_get(), ast_manager_build_channel_state_string(), ast_manager_event_blob_create(), ast_str_buffer(), ast_str_create, ast_str_set(), ast_channel_blob::blob, EVENT_FLAG_DIALPLAN, NULL, ast_channel_blob::snapshot, stasis_message_data(), and value.

◆ varset_to_json()

static struct ast_json* varset_to_json ( struct stasis_message message,
const struct stasis_message_sanitizer sanitize 
)
static

Definition at line 1419 of file stasis_channels.c.

1422 {
1423  return channel_blob_to_json(message, "ChannelVarset", sanitize);
1424 }

References channel_blob_to_json().

Variable Documentation

◆ channel_cache

struct ao2_container* channel_cache
static

◆ channel_cache_by_name

struct ao2_container* channel_cache_by_name
static

◆ channel_topic_all

struct stasis_topic* channel_topic_all
static

◆ dial_masquerade_caller_info

const struct ast_datastore_info dial_masquerade_caller_info
static

◆ dial_masquerade_info

const struct ast_datastore_info dial_masquerade_info
static