Asterisk - The Open Source Telephony Project GIT-master-7e7a603
Data Structures | Macros | Typedefs | Enumerations | Functions
devicestate.h File Reference

Device state management. More...

#include "asterisk/channelstate.h"
#include "asterisk/utils.h"
Include dependency graph for devicestate.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Data Structures

struct  ast_device_state_message
 The structure that contains device state. More...
 
struct  ast_devstate_aggregate
 You shouldn't care about the contents of this struct. More...
 

Macros

#define ast_publish_device_state(device, state, cachable)    ast_publish_device_state_full(device, state, cachable, &ast_eid_default)
 Publish a device state update. More...
 

Typedefs

typedef enum ast_device_state(* ast_devstate_prov_cb_type) (const char *data)
 Devicestate provider call back. More...
 

Enumerations

enum  ast_device_state {
  AST_DEVICE_UNKNOWN , AST_DEVICE_NOT_INUSE , AST_DEVICE_INUSE , AST_DEVICE_BUSY ,
  AST_DEVICE_INVALID , AST_DEVICE_UNAVAILABLE , AST_DEVICE_RINGING , AST_DEVICE_RINGINUSE ,
  AST_DEVICE_ONHOLD , AST_DEVICE_TOTAL
}
 Device States. More...
 
enum  ast_devstate_cache { AST_DEVSTATE_NOT_CACHABLE , AST_DEVSTATE_CACHABLE }
 Device State Cachability. More...
 

Functions

enum ast_device_state ast_device_state (const char *device)
 Asks a channel for device state. More...
 
struct stasis_cacheast_device_state_cache (void)
 Backend cache for ast_device_state_topic_cached() More...
 
int ast_device_state_clear_cache (const char *device)
 Clear the device from the stasis cache. More...
 
struct stasis_message_typeast_device_state_message_type (void)
 Get the Stasis message type for device state messages. More...
 
struct stasis_topicast_device_state_topic (const char *device)
 Get the Stasis topic for device state messages for a specific device. More...
 
struct stasis_topicast_device_state_topic_all (void)
 Get the Stasis topic for device state messages. More...
 
struct stasis_topicast_device_state_topic_cached (void)
 Get the Stasis caching topic for device state messages. More...
 
const char * ast_devstate2str (enum ast_device_state devstate) attribute_pure
 Convert device state to text string for output. More...
 
void ast_devstate_aggregate_add (struct ast_devstate_aggregate *agg, enum ast_device_state state)
 Add a device state to the aggregate device state. More...
 
void ast_devstate_aggregate_init (struct ast_devstate_aggregate *agg)
 Initialize aggregate device state. More...
 
enum ast_device_state ast_devstate_aggregate_result (struct ast_devstate_aggregate *agg)
 Get the aggregate device state result. More...
 
int ast_devstate_changed (enum ast_device_state state, enum ast_devstate_cache cachable, const char *fmt,...)
 Tells Asterisk the State for Device is changed. More...
 
int ast_devstate_changed_literal (enum ast_device_state state, enum ast_devstate_cache cachable, const char *device)
 Tells Asterisk the State for Device is changed. More...
 
int ast_devstate_prov_add (const char *label, ast_devstate_prov_cb_type callback)
 Add device state provider. More...
 
int ast_devstate_prov_del (const char *label)
 Remove device state provider. More...
 
const char * ast_devstate_str (enum ast_device_state devstate) attribute_pure
 Convert device state to text string that is easier to parse. More...
 
enum ast_device_state ast_devstate_val (const char *val)
 Convert device state from text to integer value. More...
 
enum ast_device_state ast_parse_device_state (const char *device)
 Search the Channels by Name. More...
 
int ast_publish_device_state_full (const char *device, enum ast_device_state state, enum ast_devstate_cache cachable, struct ast_eid *eid)
 Publish a device state update with EID. More...
 
enum ast_device_state ast_state_chan2dev (enum ast_channel_state chanstate)
 Convert channel state to devicestate. More...
 
int devstate_init (void)
 Initialize the device state core. More...
 

Detailed Description

Device state management.

To subscribe to device state changes, use the stasis_subscribe method. For an example, see apps/app_queue.c.

Todo:
Currently, when the state of a device changes, the device state provider calls one of the functions defined here to queue an object to say that the state of a device has changed. However, this does not include the new state. Another thread processes these device state change objects and calls the device state provider's callback to figure out what the new state is. It would make a lot more sense for the new state to be included in the original function call that says the state of a device has changed. However, it will take a lot of work to change this.

Definition in file devicestate.h.

Macro Definition Documentation

◆ ast_publish_device_state

#define ast_publish_device_state (   device,
  state,
  cachable 
)     ast_publish_device_state_full(device, state, cachable, &ast_eid_default)

Publish a device state update.

Parameters
[in]deviceThe device name
[in]stateThe state of the device
[in]cachableWhether the device state can be cached
Return values
0Success
-1Failure
Since
12

Definition at line 321 of file devicestate.h.

Typedef Documentation

◆ ast_devstate_prov_cb_type

typedef enum ast_device_state(* ast_devstate_prov_cb_type) (const char *data)

Devicestate provider call back.

Definition at line 1 of file devicestate.h.

Enumeration Type Documentation

◆ ast_device_state

Device States.

Note
The order of these states may not change because they are included in Asterisk events which may be transmitted across the network to other servers.
Enumerator
AST_DEVICE_UNKNOWN 

Device is valid but channel didn't know state

AST_DEVICE_NOT_INUSE 

Device is not used

AST_DEVICE_INUSE 

Device is in use

AST_DEVICE_BUSY 

Device is busy

AST_DEVICE_INVALID 

Device is invalid

AST_DEVICE_UNAVAILABLE 

Device is unavailable

AST_DEVICE_RINGING 

Device is ringing

AST_DEVICE_RINGINUSE 

Device is ringing and in use

AST_DEVICE_ONHOLD 

Device is on hold

AST_DEVICE_TOTAL 

Total num of device states, used for testing

Definition at line 52 of file devicestate.h.

52 {
53 AST_DEVICE_UNKNOWN, /*!< Device is valid but channel didn't know state */
54 AST_DEVICE_NOT_INUSE, /*!< Device is not used */
55 AST_DEVICE_INUSE, /*!< Device is in use */
56 AST_DEVICE_BUSY, /*!< Device is busy */
57 AST_DEVICE_INVALID, /*!< Device is invalid */
58 AST_DEVICE_UNAVAILABLE, /*!< Device is unavailable */
59 AST_DEVICE_RINGING, /*!< Device is ringing */
60 AST_DEVICE_RINGINUSE, /*!< Device is ringing *and* in use */
61 AST_DEVICE_ONHOLD, /*!< Device is on hold */
62 AST_DEVICE_TOTAL, /*!< Total num of device states, used for testing */
63};
@ AST_DEVICE_RINGINUSE
Definition: devicestate.h:60
@ AST_DEVICE_INUSE
Definition: devicestate.h:55
@ AST_DEVICE_UNKNOWN
Definition: devicestate.h:53
@ AST_DEVICE_ONHOLD
Definition: devicestate.h:61
@ AST_DEVICE_RINGING
Definition: devicestate.h:59
@ AST_DEVICE_INVALID
Definition: devicestate.h:57
@ AST_DEVICE_BUSY
Definition: devicestate.h:56
@ AST_DEVICE_NOT_INUSE
Definition: devicestate.h:54
@ AST_DEVICE_TOTAL
Definition: devicestate.h:62
@ AST_DEVICE_UNAVAILABLE
Definition: devicestate.h:58

◆ ast_devstate_cache

Device State Cachability.

Note
This is used to define the cacheability of a device state when set.
Enumerator
AST_DEVSTATE_NOT_CACHABLE 

This device state is not cachable

AST_DEVSTATE_CACHABLE 

This device state is cachable

Definition at line 68 of file devicestate.h.

68 {
69 AST_DEVSTATE_NOT_CACHABLE, /*!< This device state is not cachable */
70 AST_DEVSTATE_CACHABLE, /*!< This device state is cachable */
71};
@ AST_DEVSTATE_CACHABLE
Definition: devicestate.h:70
@ AST_DEVSTATE_NOT_CACHABLE
Definition: devicestate.h:69

Function Documentation

◆ ast_device_state()

enum ast_device_state ast_device_state ( const char *  device)

Asks a channel for device state.

Parameters
devicelike a dial string

Asks a channel for device state, data is normally a number from a dial string used by the low level module Tries the channel device state callback if not supported search in the active channels list for the device.

Returns
an AST_DEVICE_??? state

Definition at line 382 of file devicestate.c.

383{
384 /* This function is called from elsewhere in the code to find out the
385 * current state of a device. Check the cache, first. */
386
387 return _ast_device_state(device, 1);
388}
static enum ast_device_state _ast_device_state(const char *device, int check_cache)
Check device state through channel specific function or generic function.
Definition: devicestate.c:328

References _ast_device_state().

◆ ast_device_state_cache()

struct stasis_cache * ast_device_state_cache ( void  )

◆ ast_device_state_clear_cache()

int ast_device_state_clear_cache ( const char *  device)

Clear the device from the stasis cache.

Parameters
deviceThe device to clear
Return values
0if successful
-1nothing to clear
Since
12

Definition at line 688 of file devicestate.c.

689{
690 struct stasis_message *cached_msg;
691 struct stasis_message *msg;
692
695 if (!cached_msg) {
696 /* nothing to clear */
697 return -1;
698 }
699
700 msg = stasis_cache_clear_create(cached_msg);
701 if (msg) {
703 }
704 ao2_cleanup(msg);
705 ao2_cleanup(cached_msg);
706 return 0;
707}
#define ao2_cleanup(obj)
Definition: astobj2.h:1934
struct stasis_cache * ast_device_state_cache(void)
Backend cache for ast_device_state_topic_cached()
Definition: devicestate.c:673
struct stasis_topic * ast_device_state_topic(const char *device)
Get the Stasis topic for device state messages for a specific device.
Definition: devicestate.c:683
struct stasis_message_type * ast_device_state_message_type(void)
Get the Stasis message type for device state messages.
struct stasis_message * stasis_cache_clear_create(struct stasis_message *message)
A message which instructs the caching topic to remove an entry from its cache.
Definition: stasis_cache.c:778
void stasis_publish(struct stasis_topic *topic, struct stasis_message *message)
Publish a message to a topic's subscribers.
Definition: stasis.c:1511
struct stasis_message * stasis_cache_get_by_eid(struct stasis_cache *cache, struct stasis_message_type *type, const char *id, const struct ast_eid *eid)
Retrieve an item from the cache for a specific entity.
Definition: stasis_cache.c:659
struct ast_eid ast_eid_default
Global EID.
Definition: options.c:93

References ao2_cleanup, ast_device_state_cache(), ast_device_state_message_type(), ast_device_state_topic(), ast_eid_default, stasis_cache_clear_create(), stasis_cache_get_by_eid(), and stasis_publish().

Referenced by stasis_app_device_state_delete().

◆ ast_device_state_message_type()

struct stasis_message_type * ast_device_state_message_type ( void  )

◆ ast_device_state_topic()

struct stasis_topic * ast_device_state_topic ( const char *  device)

Get the Stasis topic for device state messages for a specific device.

Parameters
deviceThe device for which to get the topic
Returns
The topic structure for MWI messages for a given device
Return values
NULLif it failed to be found or allocated
Since
12

Definition at line 683 of file devicestate.c.

684{
686}
static struct stasis_topic_pool * device_state_topic_pool
Definition: devicestate.c:222
struct stasis_topic * stasis_topic_pool_get_topic(struct stasis_topic_pool *pool, const char *topic_name)
Find or create a topic in the pool.
Definition: stasis.c:1884

References device_state_topic_pool, and stasis_topic_pool_get_topic().

Referenced by ast_device_state_clear_cache(), ast_publish_device_state_full(), cc_generic_agent_start_monitoring(), create_new_generic_list(), device_state_aggregate_publish(), remove_device_states_cb(), and subscribe_device_state().

◆ ast_device_state_topic_all()

struct stasis_topic * ast_device_state_topic_all ( void  )

Get the Stasis topic for device state messages.

Returns
The topic for device state messages
Return values
NULLif it has not been allocated
Since
12

Definition at line 668 of file devicestate.c.

669{
671}
static struct stasis_topic * device_state_topic_all
Definition: devicestate.c:219

References device_state_topic_all.

Referenced by ast_publish_device_state_full(), AST_TEST_DEFINE(), asterisk_start_devicestate_publishing(), devstate_init(), load_module(), load_pbx(), publish_hint_change(), publish_hint_remove(), subscribe_device_state(), and xmpp_init_event_distribution().

◆ ast_device_state_topic_cached()

struct stasis_topic * ast_device_state_topic_cached ( void  )

Get the Stasis caching topic for device state messages.

Returns
The caching topic for device state messages
Return values
NULLif it has not been allocated
Since
12

Definition at line 678 of file devicestate.c.

679{
681}
static struct stasis_caching_topic * device_state_topic_cached
Definition: devicestate.c:221
struct stasis_topic * stasis_caching_get_topic(struct stasis_caching_topic *caching_topic)
Returns the topic of cached events from a caching topics.
Definition: stasis_cache.c:85

References device_state_topic_cached, and stasis_caching_get_topic().

Referenced by AST_TEST_DEFINE().

◆ ast_devstate2str()

const char * ast_devstate2str ( enum ast_device_state  devstate)

Convert device state to text string for output.

Parameters
devstateCurrent device state

Convert device state to text string for output.

Definition at line 237 of file devicestate.c.

238{
239 return devstatestring[devstate][0];
240}
static const char *const devstatestring[][2]
Device state strings for printing.
Definition: devicestate.c:161

References devstatestring.

Referenced by ast_sip_get_device_state(), AST_TEST_DEFINE(), ccss_notify_device_state_change(), device_state_cb(), do_state_change(), extension_state_cb(), page_exec(), parking_notify_metermaids(), and print_queue().

◆ ast_devstate_aggregate_add()

void ast_devstate_aggregate_add ( struct ast_devstate_aggregate agg,
enum ast_device_state  state 
)

Add a device state to the aggregate device state.

Parameters
[in]aggthe state object
[in]statethe state to add
Since
1.6.1

Definition at line 636 of file devicestate.c.

637{
638 static enum ast_device_state state_order[] = {
639 1, /* AST_DEVICE_UNKNOWN */
640 3, /* AST_DEVICE_NOT_INUSE */
641 6, /* AST_DEVICE_INUSE */
642 7, /* AST_DEVICE_BUSY */
643 0, /* AST_DEVICE_INVALID */
644 2, /* AST_DEVICE_UNAVAILABLE */
645 5, /* AST_DEVICE_RINGING */
646 8, /* AST_DEVICE_RINGINUSE */
647 4, /* AST_DEVICE_ONHOLD */
648 };
649
650 if (state == AST_DEVICE_RINGING) {
651 agg->ringing = 1;
653 agg->inuse = 1;
654 }
655
656 if (agg->ringing && agg->inuse) {
658 } else if (state_order[state] > state_order[agg->state]) {
659 agg->state = state;
660 }
661}
enum cc_state state
Definition: ccss.c:393
ast_device_state
Device States.
Definition: devicestate.h:52
enum ast_device_state state
Definition: devicestate.h:231
unsigned int ringing
Definition: devicestate.h:229

References AST_DEVICE_BUSY, AST_DEVICE_INUSE, AST_DEVICE_ONHOLD, AST_DEVICE_RINGING, AST_DEVICE_RINGINUSE, ast_devstate_aggregate::inuse, ast_devstate_aggregate::ringing, ast_devstate_aggregate::state, and state.

Referenced by ast_extension_state3(), AST_TEST_DEFINE(), chan_pjsip_devicestate(), and device_state_aggregate_calc().

◆ ast_devstate_aggregate_init()

void ast_devstate_aggregate_init ( struct ast_devstate_aggregate agg)

Initialize aggregate device state.

Parameters
[in]aggthe state object
Since
1.6.1

Definition at line 630 of file devicestate.c.

631{
632 memset(agg, 0, sizeof(*agg));
634}

References AST_DEVICE_INVALID, and ast_devstate_aggregate::state.

Referenced by ast_extension_state3(), AST_TEST_DEFINE(), chan_pjsip_devicestate(), and device_state_aggregate_calc().

◆ ast_devstate_aggregate_result()

enum ast_device_state ast_devstate_aggregate_result ( struct ast_devstate_aggregate agg)

Get the aggregate device state result.

Parameters
[in]aggthe state object
Returns
the aggregate device state after adding some number of device states.
Since
1.6.1

Definition at line 663 of file devicestate.c.

664{
665 return agg->state;
666}

References ast_devstate_aggregate::state.

Referenced by ast_extension_state3(), AST_TEST_DEFINE(), chan_pjsip_devicestate(), and device_state_aggregate_calc().

◆ ast_devstate_changed()

int ast_devstate_changed ( enum ast_device_state  state,
enum ast_devstate_cache  cachable,
const char *  fmt,
  ... 
)

Tells Asterisk the State for Device is changed.

Parameters
statethe new state of the device
cachablewhether this device state is cachable
fmtdevice name like a dial string with format parameters

The new state of the device will be sent off to any subscribers of device states. It will also be stored in the internal event cache.

Return values
0on success
-1on failure

Definition at line 510 of file devicestate.c.

511{
513 va_list ap;
514
515 va_start(ap, fmt);
516 vsnprintf(buf, sizeof(buf), fmt, ap);
517 va_end(ap);
518
519 return ast_devstate_changed_literal(state, cachable, buf);
520}
#define AST_MAX_EXTENSION
Definition: channel.h:134
int ast_devstate_changed_literal(enum ast_device_state state, enum ast_devstate_cache cachable, const char *device)
Tells Asterisk the State for Device is changed.
Definition: devicestate.c:471
char buf[BUFSIZE]
Definition: eagi_proxy.c:66

References ast_devstate_changed_literal(), AST_MAX_EXTENSION, buf, and state_change::cachable.

Referenced by __expire_registry(), __iax2_poke_noanswer(), add_to_queue(), agent_devstate_changed(), ast_sip_persistent_endpoint_update_state(), calendar_devstate_change(), ccss_notify_device_state_change(), chan_pjsip_indicate(), conf_handle_first_join(), conf_run(), destroy_event(), device_state_cb(), devstate_write(), handle_cli_devstate_change(), init_queue(), join_queue(), leave_queue(), load_module(), member_add_to_queue(), member_remove_from_queue(), mwi_update_cb(), parking_notify_metermaids(), populate_cache(), reg_source_db(), register_verify(), remove_from_queue(), rt_handle_member_record(), set_queue_member_pause(), sla_change_trunk_state(), sla_handle_hold_event(), sla_station_exec(), socket_process_helper(), stasis_app_device_state_delete(), stasis_app_device_state_update(), transition_to_empty(), update_devstate(), update_registry(), and xmpp_pak_presence().

◆ ast_devstate_changed_literal()

int ast_devstate_changed_literal ( enum ast_device_state  state,
enum ast_devstate_cache  cachable,
const char *  device 
)

Tells Asterisk the State for Device is changed.

Parameters
statethe new state of the device
cachablewhether this device state is cachable
devicedevice name like a dial string with format parameters

The new state of the device will be sent off to any subscribers of device states. It will also be stored in the internal event cache.

Return values
0on success
-1on failure

Definition at line 471 of file devicestate.c.

472{
473 struct state_change *change;
474
475 /*
476 * If we know the state change (how nice of the caller of this function!)
477 * then we can just generate a device state event.
478 *
479 * Otherwise, we do the following:
480 * - Queue an event up to another thread that the state has changed
481 * - In the processing thread, it calls the callback provided by the
482 * device state provider (which may or may not be a channel driver)
483 * to determine the state.
484 * - If the device state provider does not know the state, or this is
485 * for a channel and the channel driver does not implement a device
486 * state callback, then we will look through the channel list to
487 * see if we can determine a state based on active calls.
488 * - Once a state has been determined, a device state event is generated.
489 */
490
491 if (state != AST_DEVICE_UNKNOWN) {
493 } else if (change_thread == AST_PTHREADT_NULL || !(change = ast_calloc(1, sizeof(*change) + strlen(device)))) {
494 /* we could not allocate a change struct, or */
495 /* there is no background thread, so process the change now */
497 } else {
498 /* queue the change */
499 strcpy(change->device, device);
500 change->cachable = cachable;
505 }
506
507 return 0;
508}
#define ast_calloc(num, len)
A wrapper for calloc()
Definition: astmm.h:202
static pthread_t change_thread
The device state change notification thread.
Definition: devicestate.c:211
static ast_cond_t change_pending
Flag for the queue.
Definition: devicestate.c:214
static void do_state_change(const char *device, enum ast_devstate_cache cachable)
Definition: devicestate.c:460
#define ast_publish_device_state(device, state, cachable)
Publish a device state update.
Definition: devicestate.h:321
#define AST_LIST_INSERT_TAIL(head, elm, field)
Appends a list entry to the tail of a list.
Definition: linkedlists.h:731
#define AST_LIST_LOCK(head)
Locks a list.
Definition: linkedlists.h:40
#define AST_LIST_UNLOCK(head)
Attempts to unlock a list.
Definition: linkedlists.h:140
#define AST_PTHREADT_NULL
Definition: lock.h:66
#define ast_cond_signal(cond)
Definition: lock.h:203
struct state_change::@342 list
enum ast_devstate_cache cachable
Definition: devicestate.c:202
char device[1]
Definition: devicestate.c:203
The state change queue. State changes are queued for processing by a separate thread.
Definition: devicestate.c:208

References ast_calloc, ast_cond_signal, AST_DEVICE_UNKNOWN, AST_LIST_INSERT_TAIL, AST_LIST_LOCK, AST_LIST_UNLOCK, AST_PTHREADT_NULL, ast_publish_device_state, state_change::cachable, change_pending, change_thread, state_change::device, do_state_change(), and state_change::list.

Referenced by ast_channel_destructor(), ast_devstate_changed(), ast_setstate(), AST_TEST_DEFINE(), chan_pjsip_indicate(), and dahdi_new().

◆ ast_devstate_prov_add()

int ast_devstate_prov_add ( const char *  label,
ast_devstate_prov_cb_type  callback 
)

Add device state provider.

Parameters
labelto use in hint, like label:object
callbackCallback
Return values
0success
-1failure

Definition at line 391 of file devicestate.c.

392{
393 struct devstate_prov *devcb;
394 struct devstate_prov *devprov;
395
396 if (!callback || !(devprov = ast_calloc(1, sizeof(*devprov))))
397 return -1;
398
399 devprov->callback = callback;
400 ast_copy_string(devprov->label, label, sizeof(devprov->label));
401
403 AST_RWLIST_TRAVERSE(&devstate_provs, devcb, list) {
404 if (!strcasecmp(devcb->label, label)) {
405 ast_log(LOG_WARNING, "Device state provider '%s' already registered\n", label);
406 ast_free(devprov);
408 return -1;
409 }
410 }
411 AST_RWLIST_INSERT_HEAD(&devstate_provs, devprov, list);
413
414 return 0;
415}
#define ast_free(a)
Definition: astmm.h:180
#define ast_log
Definition: astobj2.c:42
#define LOG_WARNING
#define AST_RWLIST_WRLOCK(head)
Write locks a list.
Definition: linkedlists.h:52
#define AST_RWLIST_UNLOCK(head)
Attempts to unlock a read/write based list.
Definition: linkedlists.h:151
#define AST_RWLIST_TRAVERSE
Definition: linkedlists.h:494
#define AST_RWLIST_INSERT_HEAD
Definition: linkedlists.h:718
void ast_copy_string(char *dst, const char *src, size_t size)
Size-limited null-terminating string copy.
Definition: strings.h:425
A device state provider (not a channel)
Definition: devicestate.c:191
ast_devstate_prov_cb_type callback
Definition: devicestate.c:193
char label[40]
Definition: devicestate.c:192
A list of providers.
Definition: devicestate.c:198

References ast_calloc, ast_copy_string(), ast_free, ast_log, AST_RWLIST_INSERT_HEAD, AST_RWLIST_TRAVERSE, AST_RWLIST_UNLOCK, AST_RWLIST_WRLOCK, devstate_prov::callback, devstate_prov::label, and LOG_WARNING.

Referenced by AST_TEST_DEFINE(), load_module(), and load_parking_devstate().

◆ ast_devstate_prov_del()

int ast_devstate_prov_del ( const char *  label)

Remove device state provider.

Parameters
labelto use in hint, like label:object
Return values
-1on failure
0on success

Definition at line 418 of file devicestate.c.

419{
420 struct devstate_prov *devcb;
421 int res = -1;
422
425 if (!strcasecmp(devcb->label, label)) {
427 ast_free(devcb);
428 res = 0;
429 break;
430 }
431 }
434
435 return res;
436}
#define AST_RWLIST_REMOVE_CURRENT
Definition: linkedlists.h:570
#define AST_RWLIST_TRAVERSE_SAFE_BEGIN
Definition: linkedlists.h:545
#define AST_RWLIST_TRAVERSE_SAFE_END
Definition: linkedlists.h:617

References ast_free, AST_RWLIST_REMOVE_CURRENT, AST_RWLIST_TRAVERSE_SAFE_BEGIN, AST_RWLIST_TRAVERSE_SAFE_END, AST_RWLIST_UNLOCK, AST_RWLIST_WRLOCK, and devstate_prov::label.

Referenced by AST_TEST_DEFINE(), load_module(), unload_module(), and unload_parking_devstate().

◆ ast_devstate_str()

const char * ast_devstate_str ( enum ast_device_state  devstate)

Convert device state to text string that is easier to parse.

Parameters
devstateCurrent device state

Definition at line 255 of file devicestate.c.

256{
257 return devstatestring[state][1];
258}

References devstatestring, and state.

Referenced by agent_handle_show_specific(), agent_show_requested(), AST_TEST_DEFINE(), asterisk_publisher_devstate_cb(), devstate_read(), devstate_to_ami(), stasis_app_device_state_to_json(), and xmpp_pubsub_devstate_cb().

◆ ast_devstate_val()

enum ast_device_state ast_devstate_val ( const char *  val)

Convert device state from text to integer value.

Parameters
valThe text representing the device state. Valid values are anything that comes after AST_DEVICE_ in one of the defined values.
Returns
The AST_DEVICE_ integer value

Definition at line 260 of file devicestate.c.

261{
262 if (!strcasecmp(val, "NOT_INUSE"))
264 else if (!strcasecmp(val, "INUSE"))
265 return AST_DEVICE_INUSE;
266 else if (!strcasecmp(val, "BUSY"))
267 return AST_DEVICE_BUSY;
268 else if (!strcasecmp(val, "INVALID"))
269 return AST_DEVICE_INVALID;
270 else if (!strcasecmp(val, "UNAVAILABLE"))
272 else if (!strcasecmp(val, "RINGING"))
273 return AST_DEVICE_RINGING;
274 else if (!strcasecmp(val, "RINGINUSE"))
276 else if (!strcasecmp(val, "ONHOLD"))
277 return AST_DEVICE_ONHOLD;
278
279 return AST_DEVICE_UNKNOWN;
280}
Definition: ast_expr2.c:325

References AST_DEVICE_BUSY, AST_DEVICE_INUSE, AST_DEVICE_INVALID, AST_DEVICE_NOT_INUSE, AST_DEVICE_ONHOLD, AST_DEVICE_RINGING, AST_DEVICE_RINGINUSE, AST_DEVICE_UNAVAILABLE, and AST_DEVICE_UNKNOWN.

Referenced by AST_TEST_DEFINE(), asterisk_publication_devicestate(), custom_devstate_callback(), devstate_write(), handle_cli_devstate_change(), initialize_cc_devstate_map_helper(), load_module(), populate_cache(), stasis_app_device_state_update(), stasis_device_state_cb(), and xmpp_pubsub_handle_event().

◆ ast_parse_device_state()

enum ast_device_state ast_parse_device_state ( const char *  device)

Search the Channels by Name.

Parameters
devicelike a dial string

Search the Device in active channels by compare the channel name against the device name. Compared are only the first chars to the first '-' char.

Return values
AST_DEVICE_UNKNOWNif no channel found
AST_DEVICE_INUSEif a channel is found

Search the Channels by Name.

Note
find channels with the device's name in it This function is only used for channels that does not implement devicestate natively

Definition at line 287 of file devicestate.c.

288{
289 struct ast_channel *chan;
291 enum ast_device_state res;
292
293 snprintf(match, sizeof(match), "%s-", device);
294
295 if (!(chan = ast_channel_get_by_name_prefix(match, strlen(match)))) {
296 return AST_DEVICE_UNKNOWN;
297 }
298
300 res = AST_DEVICE_ONHOLD;
301 } else {
303 }
304 ast_channel_unref(chan);
305
306 return res;
307}
static int match(struct ast_sockaddr *addr, unsigned short callno, unsigned short dcallno, const struct chan_iax2_pvt *cur, int check_dcallno)
Definition: chan_iax2.c:2362
struct ast_channel * ast_channel_get_by_name_prefix(const char *name, size_t name_len)
Find a channel by a name prefix.
Definition: channel.c:1434
#define AST_CHANNEL_NAME
Definition: channel.h:171
#define ast_channel_unref(c)
Decrease channel reference count.
Definition: channel.h:2958
int ast_channel_hold_state(const struct ast_channel *chan)
ast_channel_state
ast_channel states
Definition: channelstate.h:35
enum ast_device_state ast_state_chan2dev(enum ast_channel_state chanstate)
Convert channel state to devicestate.
Definition: devicestate.c:242
@ AST_CONTROL_HOLD
Main Channel structure associated with a channel.

References ast_channel_get_by_name_prefix(), ast_channel_hold_state(), AST_CHANNEL_NAME, ast_channel_unref, AST_CONTROL_HOLD, AST_DEVICE_ONHOLD, AST_DEVICE_UNKNOWN, ast_state_chan2dev(), and match().

Referenced by _ast_device_state(), AST_TEST_DEFINE(), and chanavail_exec().

◆ ast_publish_device_state_full()

int ast_publish_device_state_full ( const char *  device,
enum ast_device_state  state,
enum ast_devstate_cache  cachable,
struct ast_eid eid 
)

Publish a device state update with EID.

Parameters
[in]deviceThe device name
[in]stateThe state of the device
[in]cachableWhether the device state can be cached
[in]eidThe EID of the server that originally published the message
Return values
0Success
-1Failure
Since
12

Definition at line 709 of file devicestate.c.

714{
715 RAII_VAR(struct ast_device_state_message *, device_state, NULL, ao2_cleanup);
717 struct stasis_topic *topic;
718
719 ast_assert(!ast_strlen_zero(device));
720
722 return -1;
723 }
724
725 device_state = device_state_alloc(device, state, cachable, eid);
726 if (!device_state) {
727 return -1;
728 }
729
731 eid);
732 if (!message) {
733 return -1;
734 }
735
736 /* When a device state is to be cached it is likely that something
737 * external will either be monitoring it or will want to pull the
738 * information from the cache, so we always publish to the device
739 * specific topic. Cachable updates traditionally come from such things
740 * as a SIP or PJSIP device.
741 * When a device state is not to be cached we only publish to its
742 * specific topic if something has already created the topic. Publishing
743 * to its topic otherwise would create the topic, which may not be
744 * necessary as it could be an ephemeral device. Uncachable updates
745 * traditionally come from such things as Local channels.
746 */
748 topic = ast_device_state_topic(device);
749 } else {
751 }
752
753 if (!topic) {
754 return -1;
755 }
756
757 stasis_publish(topic, message);
758 return 0;
759}
struct stasis_topic * ast_device_state_topic_all(void)
Get the Stasis topic for device state messages.
Definition: devicestate.c:668
static struct ast_device_state_message * device_state_alloc(const char *device, enum ast_device_state state, enum ast_devstate_cache cachable, const struct ast_eid *eid)
Definition: devicestate.c:547
#define NULL
Definition: resample.c:96
int stasis_topic_pool_topic_exists(const struct stasis_topic_pool *pool, const char *topic_name)
Check if a topic exists in a pool.
Definition: stasis.c:1927
struct stasis_message * stasis_message_create_full(struct stasis_message_type *type, void *data, const struct ast_eid *eid)
Create a new message for an entity.
static force_inline int attribute_pure ast_strlen_zero(const char *s)
Definition: strings.h:65
The structure that contains device state.
Definition: devicestate.h:238
#define RAII_VAR(vartype, varname, initval, dtor)
Declare a variable that will call a destructor function when it goes out of scope.
Definition: utils.h:941
#define ast_assert(a)
Definition: utils.h:739

References ao2_cleanup, ast_assert, ast_device_state_message_type(), ast_device_state_topic(), ast_device_state_topic_all(), ast_strlen_zero(), device_state_alloc(), device_state_topic_pool, NULL, RAII_VAR, stasis_message_create_full(), stasis_publish(), and stasis_topic_pool_topic_exists().

Referenced by AST_TEST_DEFINE(), asterisk_publication_devicestate(), devstate_change_cb(), publish_device_state_to_stasis(), and xmpp_pubsub_handle_event().

◆ ast_state_chan2dev()

enum ast_device_state ast_state_chan2dev ( enum ast_channel_state  chanstate)

Convert channel state to devicestate.

Parameters
chanstateCurrent channel state
Since
1.6.1

Definition at line 242 of file devicestate.c.

243{
244 int i;
245 chanstate &= 0xFFFF;
246 for (i = 0; i < ARRAY_LEN(chan2dev); i++) {
247 if (chan2dev[i].chan == chanstate) {
248 return chan2dev[i].dev;
249 }
250 }
251 return AST_DEVICE_UNKNOWN;
252}
Mapping for channel states to device states.
Definition: devicestate.c:174
enum ast_device_state dev
Definition: devicestate.c:176
#define ARRAY_LEN(a)
Definition: utils.h:666

References ARRAY_LEN, AST_DEVICE_UNKNOWN, and chan2dev::dev.

Referenced by ast_parse_device_state(), AST_TEST_DEFINE(), and chan_pjsip_devicestate().

◆ devstate_init()

int devstate_init ( void  )

Initialize the device state core.

Return values
0Success
-1Failure
Since
12

Definition at line 896 of file devicestate.c.

897{
899
901 return -1;
902 }
903 device_state_topic_all = stasis_topic_create("devicestate:all");
905 return -1;
906 }
909 return -1;
910 }
913 if (!device_state_cache) {
914 return -1;
915 }
919 return -1;
920 }
923
927 ast_log(LOG_ERROR, "Failed to create subscription creating uncached device state aggregate events.\n");
928 return -1;
929 }
932
933 return 0;
934}
int ast_register_cleanup(void(*func)(void))
Register a function to be executed before Asterisk gracefully exits.
Definition: clicompat.c:19
static void devstate_change_cb(void *data, struct stasis_subscription *sub, struct stasis_message *msg)
Definition: devicestate.c:583
static void devstate_cleanup(void)
Definition: devicestate.c:879
static struct stasis_message * device_state_aggregate_calc(struct stasis_cache_entry *entry, struct stasis_message *new_snapshot)
Definition: devicestate.c:816
static void device_state_aggregate_publish(struct stasis_topic *cache_topic, struct stasis_message *aggregate)
Definition: devicestate.c:785
struct stasis_subscription * devstate_message_sub
Definition: devicestate.c:217
static const char * device_state_get_id(struct stasis_message *message)
Definition: devicestate.c:761
#define LOG_ERROR
@ STASIS_SUBSCRIPTION_FILTER_SELECTIVE
Definition: stasis.h:297
struct stasis_topic * stasis_topic_create(const char *name)
Create a new topic.
Definition: stasis.c:617
struct stasis_caching_topic * stasis_caching_topic_create(struct stasis_topic *original_topic, struct stasis_cache *cache)
Create a topic which monitors and caches messages from another topic.
Definition: stasis_cache.c:948
int stasis_subscription_accept_message_type(struct stasis_subscription *subscription, const struct stasis_message_type *type)
Indicate to a subscription that we are interested in a message type.
Definition: stasis.c:1023
int stasis_subscription_set_filter(struct stasis_subscription *subscription, enum stasis_subscription_message_filter filter)
Set the message type filtering level on a subscription.
Definition: stasis.c:1077
int stasis_caching_set_filter(struct stasis_caching_topic *caching_topic, enum stasis_subscription_message_filter filter)
Set the message type filtering level on a cache.
Definition: stasis_cache.c:109
#define STASIS_MESSAGE_TYPE_INIT(name)
Boiler-plate messaging macro for initializing message types.
Definition: stasis.h:1493
struct stasis_cache * stasis_cache_create_full(snapshot_get_id id_fn, cache_aggregate_calc_fn aggregate_calc_fn, cache_aggregate_publish_fn aggregate_publish_fn)
Create a cache.
Definition: stasis_cache.c:334
struct stasis_topic_pool * stasis_topic_pool_create(struct stasis_topic *pooled_topic)
Create a topic pool that routes messages from dynamically generated topics to the given topic.
Definition: stasis.c:1833
#define stasis_subscribe(topic, callback, data)
Definition: stasis.h:649
int stasis_caching_accept_message_type(struct stasis_caching_topic *caching_topic, struct stasis_message_type *type)
Indicate to a caching topic that we are interested in a message type.
Definition: stasis_cache.c:90

References ast_device_state_message_type(), ast_device_state_topic_all(), ast_log, ast_register_cleanup(), device_state_aggregate_calc(), device_state_aggregate_publish(), device_state_cache, device_state_get_id(), device_state_topic_all, device_state_topic_cached, device_state_topic_pool, devstate_change_cb(), devstate_cleanup(), devstate_message_sub, LOG_ERROR, NULL, stasis_cache_create_full(), stasis_caching_accept_message_type(), stasis_caching_set_filter(), stasis_caching_topic_create(), STASIS_MESSAGE_TYPE_INIT, stasis_subscribe, stasis_subscription_accept_message_type(), STASIS_SUBSCRIPTION_FILTER_SELECTIVE, stasis_subscription_set_filter(), stasis_topic_create(), and stasis_topic_pool_create().

Referenced by asterisk_daemon().