Asterisk - The Open Source Telephony Project  18.5.0
Data Structures | Macros | Typedefs | Functions
mwi.h File Reference

Asterisk MWI API. More...

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

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_publisherast_mwi_add_publisher (const char *mailbox)
 Add an MWI state publisher to the mailbox. More...
 
struct ast_mwi_subscriberast_mwi_add_subscriber (const char *mailbox)
 Add an MWI state subscriber to the mailbox. More...
 
struct stasis_messageast_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_stateast_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_cacheast_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_typeast_mwi_state_type (void)
 Get the Stasis Message Bus API message type for MWI messages. More...
 
struct ast_mwi_subscriberast_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_stateast_mwi_subscriber_data (struct ast_mwi_subscriber *sub)
 Retrieves the state data object associated with the MWI subscriber. More...
 
struct stasis_subscriptionast_mwi_subscriber_subscription (struct ast_mwi_subscriber *sub)
 Retrieve the stasis MWI topic subscription if available. More...
 
struct stasis_topicast_mwi_subscriber_topic (struct ast_mwi_subscriber *sub)
 Retrieves the MWI subscriber's topic. More...
 
struct stasis_topicast_mwi_topic (const char *uniqueid)
 Get the Stasis Message Bus API topic for MWI messages on a unique ID. More...
 
struct stasis_topicast_mwi_topic_all (void)
 Get the Stasis Message Bus API topic for MWI messages. More...
 
struct stasis_topicast_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_typeast_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...
 

Detailed Description

Asterisk MWI API.

Intro

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.

ast_mwi_subscriber

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:

  1. Add an MWI state subscriber using ast_mwi_add_subscriber
  2. Retrieve the topic from the subscriber using ast_mwi_subscriber_topic
  3. Subscribe to the topic itself using stasis_subscribe or stasis_subscribe_pool

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:

  1. Unsubscribe from the stasis topic subscription using stasis_unsubscribe or stasis_unsubscribe_and_join
  2. Remove the MWI subscriber reference

Or call ast_mwi_unsubscribe (or _and_join), which combines those two steps into a single call.

ast_mwi_publisher

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.

ast_mwi_observer

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.

Macro Definition Documentation

◆ ast_delete_mwi_state

#define ast_delete_mwi_state (   mailbox,
  context 
)    ast_delete_mwi_state_full(mailbox, context, NULL)

Delete MWI state cached by stasis.

Since
12.2.0
Parameters
[in]mailboxThe mailbox identifier string.
[in]contextThe context this mailbox resides in (NULL or "" if only using mailbox)
Return values
0Success
-1Failure

Definition at line 433 of file mwi.h.

Referenced by mwi_observe_delete(), and publishers_destroy().

◆ ast_publish_mwi_state

#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.

Since
12
Parameters
[in]mailboxThe mailbox identifier string.
[in]contextThe context this mailbox resides in (NULL or "" if only using mailbox)
[in]new_msgsThe number of new messages in this mailbox
[in]old_msgsThe number of old messages in this mailbox
Return values
0Success
-1Failure

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().

◆ ast_publish_mwi_state_channel

#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.

Since
12
Parameters
[in]mailboxThe mailbox identifier string.
[in]contextThe context this mailbox resides in (NULL or "" if only using mailbox)
[in]new_msgsThe number of new messages in this mailbox
[in]old_msgsThe number of old messages in this mailbox
[in]channel_idA unique identifier for a channel associated with this change in mailbox state
Return values
0Success
-1Failure

Definition at line 397 of file mwi.h.

Referenced by queue_mwi_event().

Typedef Documentation

◆ on_mwi_state

typedef int(* on_mwi_state) (struct ast_mwi_state *mwi_state, void *data)

The delegate called for each managed mailbox state.

Parameters
mwi_stateThe mwi state object
dataUser data passed in by the initiator
Return values
0to continue traversing, or CMP_STOP (2) to stop traversing
Since
13.28.0
16.5.0

Definition at line 303 of file mwi.h.

Function Documentation

◆ ast_delete_mwi_state_full()

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.

Since
12.2.0
Parameters
[in]mailboxThe mailbox identifier string.
[in]contextThe context this mailbox resides in (NULL or "" if only using mailbox)
[in]eidThe EID of the server that originally published the message
Return values
0Success
-1Failure

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().

400 {
401  RAII_VAR(struct stasis_message *, msg, NULL, ao2_cleanup);
402  struct stasis_message *cached_msg;
403  struct stasis_message *clear_msg;
404  struct ast_mwi_state *mwi_state;
405 
406  msg = mwi_state_create_message(mailbox, context, 0, 0, 0, NULL, eid);
407  if (!msg) {
408  return -1;
409  }
410 
411  mwi_state = stasis_message_data(msg);
412 
413  /*
414  * XXX As far as stasis is concerned, all MWI events are local.
415  *
416  * For now, it is assumed that there is only one entity
417  * maintaining the state of a particular mailbox.
418  *
419  * If we ever have multiple MWI event entities maintaining
420  * the same mailbox that wish to delete their cached entry
421  * we will need to do something about the race condition
422  * potential between checking the cache and removing the
423  * cache entry.
424  */
427  if (!cached_msg) {
428  /* Nothing to clear from the cache, but still need to remove state */
430  return -1;
431  }
432  ao2_cleanup(cached_msg);
433 
434  clear_msg = stasis_cache_clear_create(msg);
435  stasis_state_remove_publish_by_id(mwi_state_manager, mwi_state->uniqueid, eid, clear_msg);
436  ao2_cleanup(clear_msg);
437 
438  return 0;
439 }
void stasis_state_remove_publish_by_id(struct stasis_state_manager *manager, const char *id, const struct ast_eid *eid, struct stasis_message *msg)
Publish to a managed named by id topic, and remove an implicit publisher.
Definition: stasis_state.c:658
struct stasis_cache * ast_mwi_state_cache(void)
Backend cache for ast_mwi_topic_cached().
Definition: mwi.c:90
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
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
#define NULL
Definition: resample.c:96
static struct stasis_state_manager * mwi_state_manager
Definition: mwi.c:32
static char mailbox[AST_MAX_MAILBOX_UNIQUEID]
Definition: chan_mgcp.c:204
#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:911
void * stasis_message_data(const struct stasis_message *msg)
Get the data contained in a message.
struct stasis_message_type * ast_mwi_state_type(void)
Get the Stasis Message Bus API message type for MWI messages.
struct ast_eid ast_eid_default
Global EID.
Definition: options.c:93
#define ao2_cleanup(obj)
Definition: astobj2.h:1958
const ast_string_field uniqueid
Definition: mwi.h:460
static char context[AST_MAX_CONTEXT]
Definition: chan_alsa.c:116
The structure that contains MWI state.
Definition: mwi.h:457
static struct stasis_message * mwi_state_create_message(const char *mailbox, const char *context, int urgent_msgs, int new_msgs, int old_msgs, const char *channel_id, struct ast_eid *eid)
Definition: mwi.c:169

◆ ast_mwi_add_observer()

int ast_mwi_add_observer ( struct ast_mwi_observer observer)

Add an observer to receive MWI state related events.

Parameters
observerThe observer handling events
Return values
0if successfully registered, -1 otherwise
Since
13.28.0
16.5.0

Definition at line 296 of file mwi.c.

References stasis_state_add_observer().

Referenced by start_poll_thread(), and subscriptions_create().

297 {
299  (struct stasis_state_observer *)observer);
300 }
Managed stasis state event interface.
Definition: stasis_state.h:463
int stasis_state_add_observer(struct stasis_state_manager *manager, struct stasis_state_observer *observer)
Add an observer to receive managed state related events.
Definition: stasis_state.c:688
static struct stasis_state_manager * mwi_state_manager
Definition: mwi.c:32

◆ ast_mwi_add_publisher()

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.

Parameters
mailboxThe mailbox id to publish to
Return values
AnMWI publisher object
NULlon error
Since
13.28.0
16.5.0

Definition at line 290 of file mwi.c.

References stasis_state_add_publisher().

Referenced by publishers_create().

291 {
294 }
static struct stasis_state_manager * mwi_state_manager
Definition: mwi.c:32
static char mailbox[AST_MAX_MAILBOX_UNIQUEID]
Definition: chan_mgcp.c:204
struct stasis_state_publisher * stasis_state_add_publisher(struct stasis_state_manager *manager, const char *id)
Add a publisher to the managed state for the given id.
Definition: stasis_state.c:531

◆ ast_mwi_add_subscriber()

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.

Parameters
mailboxThe subscription state mailbox id
Return values
AnMWI subscriber object
NULLon error
Since
13.28.0
16.5.0

Definition at line 224 of file mwi.c.

References stasis_state_add_subscriber().

225 {
228 }
struct stasis_state_subscriber * stasis_state_add_subscriber(struct stasis_state_manager *manager, const char *id)
Add a subscriber to the managed stasis state for the given id.
Definition: stasis_state.c:412
static struct stasis_state_manager * mwi_state_manager
Definition: mwi.c:32
static char mailbox[AST_MAX_MAILBOX_UNIQUEID]
Definition: chan_mgcp.c:204

◆ ast_mwi_publish()

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.

Parameters
publisherThe publisher to publish a mailbox update on
urgent_msgsThe number of urgent messages in this mailbox
new_msgsThe number of new messages in this mailbox
old_msgsThe number of old messages in this mailbox
channel_idA unique identifier for a channel associated with this change in mailbox state
eidThe EID of the server that originally published the message
Return values
0on success
-1on failure
Since
13.28.0
16.5.0

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().

355 {
356  struct stasis_state_publisher *p = (struct stasis_state_publisher *)pub;
358  NULL, urgent_msgs, new_msgs, old_msgs, channel_id, eid);
359 
360  if (!msg) {
361  return -1;
362  }
363 
364  stasis_state_publish(p, msg);
365  ao2_ref(msg, -1);
366 
367  return 0;
368 }
const char * stasis_state_publisher_id(const struct stasis_state_publisher *pub)
Retrieve the publisher's underlying state's unique id.
Definition: stasis_state.c:552
#define NULL
Definition: resample.c:96
#define ao2_ref(o, delta)
Definition: astobj2.h:464
void stasis_state_publish(struct stasis_state_publisher *pub, struct stasis_message *msg)
Publish to a managed state (topic) using a publisher.
Definition: stasis_state.c:562
static struct stasis_message * mwi_state_create_message(const char *mailbox, const char *context, int urgent_msgs, int new_msgs, int old_msgs, const char *channel_id, struct ast_eid *eid)
Definition: mwi.c:169

◆ ast_mwi_publish_by_mailbox()

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.

Parameters
mailboxThe mailbox identifier string.
contextThe context this mailbox resides in (NULL or "" if only using mailbox)
urgent_msgsThe number of urgent messages in this mailbox
new_msgsThe number of new messages in this mailbox
old_msgsThe number of old messages in this mailbox
channel_idA unique identifier for a channel associated with this change in mailbox state
eidThe EID of the server that originally published the message
Return values
0on success
-1on failure
Since
13.28.0
16.5.0

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().

372 {
373  struct ast_mwi_state *mwi_state;
375  mailbox, context, urgent_msgs, new_msgs, old_msgs, channel_id, eid);
376 
377  if (!msg) {
378  return -1;
379  }
380 
381  mwi_state = stasis_message_data(msg);
383  ao2_ref(msg, -1);
384 
385  return 0;
386 }
#define NULL
Definition: resample.c:96
static struct stasis_state_manager * mwi_state_manager
Definition: mwi.c:32
static char mailbox[AST_MAX_MAILBOX_UNIQUEID]
Definition: chan_mgcp.c:204
#define ao2_ref(o, delta)
Definition: astobj2.h:464
void * stasis_message_data(const struct stasis_message *msg)
Get the data contained in a message.
void stasis_state_publish_by_id(struct stasis_state_manager *manager, const char *id, const struct ast_eid *eid, struct stasis_message *msg)
Publish to a managed named by id topic, and add an implicit subscriber.
Definition: stasis_state.c:638
const ast_string_field uniqueid
Definition: mwi.h:460
static char context[AST_MAX_CONTEXT]
Definition: chan_alsa.c:116
The structure that contains MWI state.
Definition: mwi.h:457
static struct stasis_message * mwi_state_create_message(const char *mailbox, const char *context, int urgent_msgs, int new_msgs, int old_msgs, const char *channel_id, struct ast_eid *eid)
Definition: mwi.c:169

◆ ast_mwi_remove_observer()

void ast_mwi_remove_observer ( struct ast_mwi_observer observer)

Remove an MWI state observer.

Parameters
observerThe observer being removed
Since
13.28.0
16.5.0

Definition at line 302 of file mwi.c.

References stasis_state_remove_observer().

Referenced by stop_poll_thread(), and subscriptions_destroy().

303 {
305  (struct stasis_state_observer *)observer);
306 }
Managed stasis state event interface.
Definition: stasis_state.h:463
void stasis_state_remove_observer(struct stasis_state_manager *manager, struct stasis_state_observer *observer)
Remove an observer (will no longer receive managed state related events).
Definition: stasis_state.c:700
static struct stasis_state_manager * mwi_state_manager
Definition: mwi.c:32

◆ ast_mwi_state_callback_all()

void ast_mwi_state_callback_all ( on_mwi_state  handler,
void *  data 
)

For each managed mailbox call the given handler.

Parameters
handlerThe mwi state handler to call for each managed mailbox
dataUser to data to pass on to the handler
Since
13.28.0
16.5.0

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().

334 {
335  struct mwi_handler_data d = {
336  .handler = handler,
337  .data = data
338  };
339 
341 }
static struct test_val d
static int handle_mwi_state(const char *id, struct stasis_message *msg, void *user_data)
Definition: mwi.c:313
static struct stasis_state_manager * mwi_state_manager
Definition: mwi.c:32
void stasis_state_callback_all(struct stasis_state_manager *manager, on_stasis_state handler, void *data)
For each managed state call the given handler.
Definition: stasis_state.c:740
static void handler(const char *name, int response_code, struct ast_variable *get_params, struct ast_variable *path_vars, struct ast_variable *headers, struct ast_json *body, struct ast_ari_response *response)
Definition: test_ari.c:59
void * data
Definition: mwi.c:310

◆ ast_mwi_state_callback_subscribed()

void ast_mwi_state_callback_subscribed ( on_mwi_state  handler,
void *  data 
)

For each managed mailbox that has a subscriber call the given handler.

Parameters
handlerThe mwi state handler to call for each managed mailbox
dataUser to data to pass on to the handler
Since
13.28.0
16.5.0

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().

344 {
345  struct mwi_handler_data d = {
346  .handler = handler,
347  .data = data
348  };
349 
351 }
static struct test_val d
static int handle_mwi_state(const char *id, struct stasis_message *msg, void *user_data)
Definition: mwi.c:313
static struct stasis_state_manager * mwi_state_manager
Definition: mwi.c:32
void stasis_state_callback_subscribed(struct stasis_state_manager *manager, on_stasis_state handler, void *data)
For each managed, and explicitly subscribed state call the given handler.
Definition: stasis_state.c:763
static void handler(const char *name, int response_code, struct ast_variable *get_params, struct ast_variable *path_vars, struct ast_variable *headers, struct ast_json *body, struct ast_ari_response *response)
Definition: test_ari.c:59
void * data
Definition: mwi.c:310

◆ ast_mwi_subscribe_pool()

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.

Parameters
mailboxThe subscription state mailbox id
callbackThe stasis subscription callback
dataA user data object passed to the stasis subscription
Return values
AnMWI subscriber object
NULLon error
Since
13.28.0
16.5.0

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().

232 {
233  struct stasis_subscription *stasis_sub;
235  mwi_state_manager, mailbox, callback, data);
236 
237  if (!sub) {
238  return NULL;
239  }
240 
241  stasis_sub = ast_mwi_subscriber_subscription(sub);
242 
245 
246  return sub;
247 }
struct stasis_state_subscriber * stasis_state_subscribe_pool(struct stasis_state_manager *manager, const char *id, stasis_subscription_cb callback, void *data)
Add a subscriber, and subscribe to its underlying stasis topic.
Definition: stasis_state.c:446
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:1079
#define NULL
Definition: resample.c:96
static struct stasis_state_manager * mwi_state_manager
Definition: mwi.c:32
static char mailbox[AST_MAX_MAILBOX_UNIQUEID]
Definition: chan_mgcp.c:204
struct stasis_subscription * ast_mwi_subscriber_subscription(struct ast_mwi_subscriber *sub)
Retrieve the stasis MWI topic subscription if available.
Definition: mwi.c:272
struct stasis_message_type * ast_mwi_state_type(void)
Get the Stasis Message Bus API message type for MWI messages.
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:1025
struct stasis_forward * sub
Definition: res_corosync.c:240

◆ ast_mwi_subscriber_data()

struct ast_mwi_state* ast_mwi_subscriber_data ( struct ast_mwi_subscriber sub)

Retrieves the state data object associated with the MWI subscriber.

Note
Returned data's reference count is incremented
Parameters
subAn MWI subscriber
Return values
Thestate data object
Since
13.28.0
16.5.0

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().

265 {
266  struct stasis_state_subscriber *s = (struct stasis_state_subscriber *)sub;
267  struct ast_mwi_state *mwi_state = stasis_state_subscriber_data(s);
268 
270 }
static struct ast_mwi_state * mwi_retrieve_then_create_state(const char *mailbox)
Definition: mwi.c:138
void * stasis_state_subscriber_data(struct stasis_state_subscriber *sub)
Retrieve the last known state stasis message payload for the subscriber.
Definition: stasis_state.c:497
const char * stasis_state_subscriber_id(const struct stasis_state_subscriber *sub)
Retrieve the underlying subscribed to state's unique id.
Definition: stasis_state.c:487
The structure that contains MWI state.
Definition: mwi.h:457

◆ ast_mwi_subscriber_subscription()

struct stasis_subscription* ast_mwi_subscriber_subscription ( struct ast_mwi_subscriber sub)

Retrieve the stasis MWI topic subscription if available.

Parameters
subAn MWI subscriber
Return values
Thesubscriber's stasis subscription
NULLif no subscription available
Since
13.28.0
16.5.0

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().

273 {
275 }
struct stasis_subscription * stasis_state_subscriber_subscription(struct stasis_state_subscriber *sub)
Retrieve the stasis topic subscription if available.
Definition: stasis_state.c:513

◆ ast_mwi_subscriber_topic()

struct stasis_topic* ast_mwi_subscriber_topic ( struct ast_mwi_subscriber sub)

Retrieves the MWI subscriber's topic.

Note
Returned topic's reference count is NOT incremented. However, the topic is guaranteed to live for the lifetime of the subscriber.
Parameters
subAn MWI subscriber
Return values
Astasis topic subscribed to by the subscriber
Since
13.28.0
16.5.0

Definition at line 259 of file mwi.c.

References stasis_state_subscriber_topic().

260 {
262 }
struct stasis_topic * stasis_state_subscriber_topic(struct stasis_state_subscriber *sub)
Retrieve the subscriber's topic.
Definition: stasis_state.c:492

◆ ast_mwi_unsubscribe()

void* ast_mwi_unsubscribe ( struct ast_mwi_subscriber sub)

Unsubscribe from the stasis topic and MWI.

Parameters
subAn MWI subscriber
Return values
NULL
Since
13.28.0
16.5.0

Definition at line 249 of file mwi.c.

References stasis_state_unsubscribe().

Referenced by destroy_dahdi_pvt(), destroy_endpoint(), peer_destructor(), and skinny_reload().

250 {
252 }
void * stasis_state_unsubscribe(struct stasis_state_subscriber *sub)
Unsubscribe from the stasis topic and stasis state.
Definition: stasis_state.c:470

◆ ast_mwi_unsubscribe_and_join()

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.

Parameters
subAn MWI subscriber
Return values
NULL
Since
13.28.0
16.5.0

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().

255 {
257 }
void * stasis_state_unsubscribe_and_join(struct stasis_state_subscriber *sub)
Unsubscribe from the stasis topic, block until the final message is received, and then unsubscribe fr...
Definition: stasis_state.c:477

◆ ast_publish_mwi_state_full()

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.

Since
12
Parameters
[in]mailboxThe mailbox identifier string.
[in]contextThe context this mailbox resides in (NULL or "" if only using mailbox)
[in]new_msgsThe number of new messages in this mailbox
[in]old_msgsThe number of old messages in this mailbox
[in]channel_idA unique identifier for a channel associated with this change in mailbox state
[in]eidThe EID of the server that originally published the message
Return values
0Success
-1Failure

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().

395 {
396  return ast_mwi_publish_by_mailbox(mailbox, context, 0, new_msgs, old_msgs, channel_id, eid);
397 }
static char mailbox[AST_MAX_MAILBOX_UNIQUEID]
Definition: chan_mgcp.c:204
int old_msgs
Definition: mwi.h:462
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.
Definition: mwi.c:370
int new_msgs
Definition: mwi.h:461
static char context[AST_MAX_CONTEXT]
Definition: chan_alsa.c:116