Asterisk - The Open Source Telephony Project
18.5.0
|
Asterisk MWI API. More...
Go to the source code of this file.
Data Structures | |
struct | ast_mwi_blob |
Object that represents an MWI update with some additional application defined data. More... | |
struct | ast_mwi_observer |
MWI state event interface. More... | |
struct | ast_mwi_state |
The structure that contains MWI state. More... | |
Macros | |
#define | ast_delete_mwi_state(mailbox, context) ast_delete_mwi_state_full(mailbox, context, NULL) |
Delete MWI state cached by stasis. More... | |
#define | AST_MAX_MAILBOX_UNIQUEID (AST_MAX_EXTENSION + AST_MAX_CONTEXT + 2) |
#define | ast_publish_mwi_state(mailbox, context, new_msgs, old_msgs) ast_publish_mwi_state_full(mailbox, context, new_msgs, old_msgs, NULL, NULL) |
Publish a MWI state update via stasis. More... | |
#define | ast_publish_mwi_state_channel(mailbox, context, new_msgs, old_msgs, channel_id) ast_publish_mwi_state_full(mailbox, context, new_msgs, old_msgs, channel_id, NULL) |
Publish a MWI state update associated with some channel. More... | |
Typedefs | |
typedef int(* | on_mwi_state) (struct ast_mwi_state *mwi_state, void *data) |
The delegate called for each managed mailbox state. More... | |
Functions | |
int | ast_delete_mwi_state_full (const char *mailbox, const char *context, struct ast_eid *eid) |
Delete MWI state cached by stasis with all parameters. More... | |
int | ast_mwi_add_observer (struct ast_mwi_observer *observer) |
Add an observer to receive MWI state related events. More... | |
struct ast_mwi_publisher * | ast_mwi_add_publisher (const char *mailbox) |
Add an MWI state publisher to the mailbox. More... | |
struct ast_mwi_subscriber * | ast_mwi_add_subscriber (const char *mailbox) |
Add an MWI state subscriber to the mailbox. More... | |
struct stasis_message * | ast_mwi_blob_create (struct ast_mwi_state *mwi_state, struct stasis_message_type *message_type, struct ast_json *blob) |
Creates a ast_mwi_blob message. More... | |
struct ast_mwi_state * | ast_mwi_create (const char *mailbox, const char *context) |
Create a ast_mwi_state object. More... | |
int | ast_mwi_publish (struct ast_mwi_publisher *publisher, int urgent_msgs, int new_msgs, int old_msgs, const char *channel_id, struct ast_eid *eid) |
Publish MWI for the given mailbox. More... | |
int | ast_mwi_publish_by_mailbox (const char *mailbox, const char *context, int urgent_msgs, int new_msgs, int old_msgs, const char *channel_id, struct ast_eid *eid) |
Publish MWI for the given mailbox. More... | |
void | ast_mwi_remove_observer (struct ast_mwi_observer *observer) |
Remove an MWI state observer. More... | |
struct stasis_cache * | ast_mwi_state_cache (void) |
Backend cache for ast_mwi_topic_cached(). More... | |
void | ast_mwi_state_callback_all (on_mwi_state handler, void *data) |
For each managed mailbox call the given handler. More... | |
void | ast_mwi_state_callback_subscribed (on_mwi_state handler, void *data) |
For each managed mailbox that has a subscriber call the given handler. More... | |
struct stasis_message_type * | ast_mwi_state_type (void) |
Get the Stasis Message Bus API message type for MWI messages. More... | |
struct ast_mwi_subscriber * | ast_mwi_subscribe_pool (const char *mailbox, stasis_subscription_cb callback, void *data) |
Add an MWI state subscriber, and stasis subscription to the mailbox. More... | |
struct ast_mwi_state * | ast_mwi_subscriber_data (struct ast_mwi_subscriber *sub) |
Retrieves the state data object associated with the MWI subscriber. More... | |
struct stasis_subscription * | ast_mwi_subscriber_subscription (struct ast_mwi_subscriber *sub) |
Retrieve the stasis MWI topic subscription if available. More... | |
struct stasis_topic * | ast_mwi_subscriber_topic (struct ast_mwi_subscriber *sub) |
Retrieves the MWI subscriber's topic. More... | |
struct stasis_topic * | ast_mwi_topic (const char *uniqueid) |
Get the Stasis Message Bus API topic for MWI messages on a unique ID. More... | |
struct stasis_topic * | ast_mwi_topic_all (void) |
Get the Stasis Message Bus API topic for MWI messages. More... | |
struct stasis_topic * | ast_mwi_topic_cached (void) |
Get the Stasis Message Bus API caching topic for MWI messages. More... | |
void * | ast_mwi_unsubscribe (struct ast_mwi_subscriber *sub) |
Unsubscribe from the stasis topic and MWI. More... | |
void * | ast_mwi_unsubscribe_and_join (struct ast_mwi_subscriber *sub) |
Unsubscribe from the stasis topic, block until the final message is received, and then unsubscribe from MWI. More... | |
struct stasis_message_type * | ast_mwi_vm_app_type (void) |
Get the Stasis Message Bus API message type for voicemail application specific messages. More... | |
int | ast_publish_mwi_state_full (const char *mailbox, const char *context, int new_msgs, int old_msgs, const char *channel_id, struct ast_eid *eid) |
Publish a MWI state update via stasis with all parameters. More... | |
int | mwi_init (void) |
Initialize the mwi core. More... | |
Asterisk MWI API.
This module manages, and processes all things MWI. Defined are mechanisms for subscribing and publishing to MWI topics. User modules wishing to receive MWI updates for a particular mailbox should do so by adding an MWI subscriber to that mailbox, followed by subscribing to the mailbox's topic. Likewise, user modules that want to publish MWI updates about a particular mailbox should first add a publisher for that mailbox prior to publishing.
MWI state is managed via an underlying stasis_state_manager (if interested see the stasis_state.c module for the gory details). As such all last known mailbox state can be retrieve and iterated over by using the ast_mwi_callback function.
Created via ast_mwi_add_subscriber, a subscriber subscribes to a given mailbox in order to receive updates about the given mailbox. Adding a subscriber will create the underlying topic, and associated state data if those do not already exist for it. The topic, and last known state data is guaranteed to exist for the lifetime of the subscriber. State data can be NULL if nothing has been published to the mailbox's topic yet.
NOTE, currently adding a subscriber here will either create, or add a reference to the underlying stasis state (and associated topic). However, it does not actually subscribe to the stasis topic itself. You still need to explicitly call stasis_subscribe, or similar on the topic if you wish to receive published event updates.
So given that when subscribing to an MWI topic the following order should be adhered to:
Or simply call ast_mwi_subscribe_pool, which combines those steps into a single call and returns the subscriber that is now subscribed to both the stasis topic and state.
Similarly, releasing the subscriber's reference removes a reference to the underlying state, but does not unsubscribe from the MWI topic. This should be done separately and prior to removing the subscriber's state reference:
Or call ast_mwi_unsubscribe (or _and_join), which combines those two steps into a single call.
Before publishing to a particular topic a publisher should be created. This can be achieved by using ast_mwi_add_publisher. Publishing to a mailbox should then be done using the ast_mwi_publish function. This ensures the message is published to the appropriate topic, and the last known state is maintained.
Publishing by mailbox id alone is also allowed. However, it is not recommended to do so, and exists mainly for backwards compatibility, and legacy subsystems. If, and when this method of publishing is employed a call to one of the ast_delete_mwi_state functions should also be called for a given mailbox id after no more publishing will be done for that id. Otherwise a memory leak on the underlying stasis_state object will occur.
Add an observer in order to watch for particular MWI module related events. For instance if a submodule needs to know when a subscription is added to any mailbox an observer can be added to watch for that.
Definition in file mwi.h.
Delete MWI state cached by stasis.
[in] | mailbox | The mailbox identifier string. |
[in] | context | The context this mailbox resides in (NULL or "" if only using mailbox) |
0 | Success |
-1 | Failure |
Definition at line 433 of file mwi.h.
Referenced by mwi_observe_delete(), and publishers_destroy().
#define ast_publish_mwi_state | ( | mailbox, | |
context, | |||
new_msgs, | |||
old_msgs | |||
) | ast_publish_mwi_state_full(mailbox, context, new_msgs, old_msgs, NULL, NULL) |
Publish a MWI state update via stasis.
[in] | mailbox | The mailbox identifier string. |
[in] | context | The context this mailbox resides in (NULL or "" if only using mailbox) |
[in] | new_msgs | The number of new messages in this mailbox |
[in] | old_msgs | The number of old messages in this mailbox |
0 | Success |
-1 | Failure |
Definition at line 380 of file mwi.h.
Referenced by handle_request_notify(), mwi_observe_delete(), mwi_post_event(), notify_message(), and pubsub_on_rx_mwi_notify_request().
#define ast_publish_mwi_state_channel | ( | mailbox, | |
context, | |||
new_msgs, | |||
old_msgs, | |||
channel_id | |||
) | ast_publish_mwi_state_full(mailbox, context, new_msgs, old_msgs, channel_id, NULL) |
Publish a MWI state update associated with some channel.
[in] | mailbox | The mailbox identifier string. |
[in] | context | The context this mailbox resides in (NULL or "" if only using mailbox) |
[in] | new_msgs | The number of new messages in this mailbox |
[in] | old_msgs | The number of old messages in this mailbox |
[in] | channel_id | A unique identifier for a channel associated with this change in mailbox state |
0 | Success |
-1 | Failure |
Definition at line 397 of file mwi.h.
Referenced by queue_mwi_event().
typedef int(* on_mwi_state) (struct ast_mwi_state *mwi_state, void *data) |
int ast_delete_mwi_state_full | ( | const char * | mailbox, |
const char * | context, | ||
struct ast_eid * | eid | ||
) |
Delete MWI state cached by stasis with all parameters.
[in] | mailbox | The mailbox identifier string. |
[in] | context | The context this mailbox resides in (NULL or "" if only using mailbox) |
[in] | eid | The EID of the server that originally published the message |
0 | Success |
-1 | Failure |
Definition at line 399 of file mwi.c.
References ao2_cleanup, ast_eid_default, ast_mwi_state_cache(), ast_mwi_state_type(), mwi_state_create_message(), NULL, RAII_VAR, stasis_cache_clear_create(), stasis_cache_get_by_eid(), stasis_message_data(), stasis_state_remove_publish_by_id(), and ast_mwi_state::uniqueid.
Referenced by free_user_final(), and mwi_handle_unsubscribe2().
int ast_mwi_add_observer | ( | struct ast_mwi_observer * | observer | ) |
Add an observer to receive MWI state related events.
observer | The observer handling events |
0 | if successfully registered, -1 otherwise |
Definition at line 296 of file mwi.c.
References stasis_state_add_observer().
Referenced by start_poll_thread(), and subscriptions_create().
struct ast_mwi_publisher* ast_mwi_add_publisher | ( | const char * | mailbox | ) |
Add an MWI state publisher to the mailbox.
Adding a publisher to a mailbox will create a stasis topic for the mailbox if one does not already exist. A publisher can be removed by releasing its reference. Doing so releases its underlying reference to the MWI state.
mailbox | The mailbox id to publish to |
An | MWI publisher object |
NULl | on error |
Definition at line 290 of file mwi.c.
References stasis_state_add_publisher().
Referenced by publishers_create().
struct ast_mwi_subscriber* ast_mwi_add_subscriber | ( | const char * | mailbox | ) |
Add an MWI state subscriber to the mailbox.
Adding a subscriber to a mailbox will create a stasis topic for the mailbox if one does not already exist. It does not however subscribe to the topic itself. This is done separately using a call to stasis_subscribe or stasis_subscribe_pool.
A subscriber can be removed by releasing its reference. Doing so releases its underlying reference to the MWI state. It does not unsubscribe from the topic. Unsubscribing from a topic should be done prior to unsubscribing the state.
mailbox | The subscription state mailbox id |
An | MWI subscriber object |
NULL | on error |
Definition at line 224 of file mwi.c.
References stasis_state_add_subscriber().
int ast_mwi_publish | ( | struct ast_mwi_publisher * | publisher, |
int | urgent_msgs, | ||
int | new_msgs, | ||
int | old_msgs, | ||
const char * | channel_id, | ||
struct ast_eid * | eid | ||
) |
Publish MWI for the given mailbox.
publisher | The publisher to publish a mailbox update on |
urgent_msgs | The number of urgent messages in this mailbox |
new_msgs | The number of new messages in this mailbox |
old_msgs | The number of old messages in this mailbox |
channel_id | A unique identifier for a channel associated with this change in mailbox state |
eid | The EID of the server that originally published the message |
0 | on success |
-1 | on failure |
Definition at line 353 of file mwi.c.
References ao2_ref, mwi_state_create_message(), NULL, stasis_state_publish(), and stasis_state_publisher_id().
Referenced by explicit_publish_cb().
int ast_mwi_publish_by_mailbox | ( | const char * | mailbox, |
const char * | context, | ||
int | urgent_msgs, | ||
int | new_msgs, | ||
int | old_msgs, | ||
const char * | channel_id, | ||
struct ast_eid * | eid | ||
) |
Publish MWI for the given mailbox.
mailbox | The mailbox identifier string. |
context | The context this mailbox resides in (NULL or "" if only using mailbox) |
urgent_msgs | The number of urgent messages in this mailbox |
new_msgs | The number of new messages in this mailbox |
old_msgs | The number of old messages in this mailbox |
channel_id | A unique identifier for a channel associated with this change in mailbox state |
eid | The EID of the server that originally published the message |
0 | on success |
-1 | on failure |
Definition at line 370 of file mwi.c.
References ao2_ref, mwi_state_create_message(), NULL, stasis_message_data(), stasis_state_publish_by_id(), and ast_mwi_state::uniqueid.
Referenced by ast_publish_mwi_state_full(), and implicit_publish_cb().
void ast_mwi_remove_observer | ( | struct ast_mwi_observer * | observer | ) |
Remove an MWI state observer.
observer | The observer being removed |
Definition at line 302 of file mwi.c.
References stasis_state_remove_observer().
Referenced by stop_poll_thread(), and subscriptions_destroy().
void ast_mwi_state_callback_all | ( | on_mwi_state | handler, |
void * | data | ||
) |
For each managed mailbox call the given handler.
handler | The mwi state handler to call for each managed mailbox |
data | User to data to pass on to the handler |
Definition at line 333 of file mwi.c.
References handle_mwi_state(), handler(), mwi_handler_data::handler, and stasis_state_callback_all().
Referenced by actual_load_config(), manager_voicemail_refresh(), publish(), and unload_module().
void ast_mwi_state_callback_subscribed | ( | on_mwi_state | handler, |
void * | data | ||
) |
For each managed mailbox that has a subscriber call the given handler.
handler | The mwi state handler to call for each managed mailbox |
data | User to data to pass on to the handler |
Definition at line 343 of file mwi.c.
References handle_mwi_state(), handler(), mwi_handler_data::handler, and stasis_state_callback_subscribed().
Referenced by mb_poll_thread().
struct ast_mwi_subscriber* ast_mwi_subscribe_pool | ( | const char * | mailbox, |
stasis_subscription_cb | callback, | ||
void * | data | ||
) |
Add an MWI state subscriber, and stasis subscription to the mailbox.
Adding a subscriber to a mailbox will create a stasis topic for the mailbox if one does not already exist. Once successfully create the underlying stasis topic is then subscribed to as well.
A subscriber can be removed by releasing its reference. Doing so releases its underlying reference to the MWI state. It does not unsubscribe from the topic. Unsubscribing from a topic should be done prior to unsubscribing the state.
mailbox | The subscription state mailbox id |
callback | The stasis subscription callback |
data | A user data object passed to the stasis subscription |
An | MWI subscriber object |
NULL | on error |
Definition at line 230 of file mwi.c.
References ast_mwi_state_type(), ast_mwi_subscriber_subscription(), NULL, stasis_state_subscribe_pool(), stasis_subscription_accept_message_type(), STASIS_SUBSCRIPTION_FILTER_SELECTIVE, stasis_subscription_set_filter(), and sub.
Referenced by add_peer_mwi_subs(), build_gateway(), build_peer(), config_line(), mkintf(), mwi_stasis_subscription_alloc(), and subscriptions_create().
struct ast_mwi_state* ast_mwi_subscriber_data | ( | struct ast_mwi_subscriber * | sub | ) |
Retrieves the state data object associated with the MWI subscriber.
sub | An MWI subscriber |
The | state data object |
Definition at line 264 of file mwi.c.
References mwi_retrieve_then_create_state(), stasis_state_subscriber_data(), and stasis_state_subscriber_id().
Referenced by get_message_count(), handle_validate(), mwi_handle_subscribe(), and mwi_handle_unsubscribe().
struct stasis_subscription* ast_mwi_subscriber_subscription | ( | struct ast_mwi_subscriber * | sub | ) |
Retrieve the stasis MWI topic subscription if available.
sub | An MWI subscriber |
The | subscriber's stasis subscription |
NULL | if no subscription available |
Definition at line 272 of file mwi.c.
References stasis_state_subscriber_subscription().
Referenced by add_peer_mwi_subs(), ast_mwi_subscribe_pool(), and mwi_stasis_subscription_alloc().
struct stasis_topic* ast_mwi_subscriber_topic | ( | struct ast_mwi_subscriber * | sub | ) |
Retrieves the MWI subscriber's topic.
sub | An MWI subscriber |
A | stasis topic subscribed to by the subscriber |
Definition at line 259 of file mwi.c.
References stasis_state_subscriber_topic().
void* ast_mwi_unsubscribe | ( | struct ast_mwi_subscriber * | sub | ) |
Unsubscribe from the stasis topic and MWI.
sub | An MWI subscriber |
NULL |
Definition at line 249 of file mwi.c.
References stasis_state_unsubscribe().
Referenced by destroy_dahdi_pvt(), destroy_endpoint(), peer_destructor(), and skinny_reload().
void* ast_mwi_unsubscribe_and_join | ( | struct ast_mwi_subscriber * | sub | ) |
Unsubscribe from the stasis topic, block until the final message is received, and then unsubscribe from MWI.
sub | An MWI subscriber |
NULL |
Definition at line 254 of file mwi.c.
References stasis_state_unsubscribe_and_join().
Referenced by destroy_mailbox(), subscriptions_destroy(), unload_module(), and unsubscribe_stasis().
int ast_publish_mwi_state_full | ( | const char * | mailbox, |
const char * | context, | ||
int | new_msgs, | ||
int | old_msgs, | ||
const char * | channel_id, | ||
struct ast_eid * | eid | ||
) |
Publish a MWI state update via stasis with all parameters.
[in] | mailbox | The mailbox identifier string. |
[in] | context | The context this mailbox resides in (NULL or "" if only using mailbox) |
[in] | new_msgs | The number of new messages in this mailbox |
[in] | old_msgs | The number of old messages in this mailbox |
[in] | channel_id | A unique identifier for a channel associated with this change in mailbox state |
[in] | eid | The EID of the server that originally published the message |
0 | Success |
-1 | Failure |
Definition at line 388 of file mwi.c.
References ast_mwi_publish_by_mailbox().
Referenced by asterisk_publication_mailboxstate(), publish_mwi_to_stasis(), and xmpp_pubsub_handle_event().