[svn-commits] mjordan: branch 12 r414330 - in /branches/12: include/asterisk/ main/ res/

SVN commits to the Digium repositories svn-commits at lists.digium.com
Thu May 22 06:52:37 CDT 2014


Author: mjordan
Date: Thu May 22 06:51:56 2014
New Revision: 414330

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=414330
Log:
res_corosync: Update module to work with Stasis (and compile)

This patch fixes res_corosync such that it works with Asterisk 12. This
restores the functionality that was present in previous versions of
Asterisk, and ensures compatibility with those versions by restoring the
binary message format needed to pass information from/to them.

The following changes were made in the core to support this:
 * The event system has been partially restored. All event definition and
   event types in this patch were pulled from Asterisk 11. Previously, we had
   hoped that this information would live in res_corosync; however, the
   approach in this patch seems to be better for a few reasons:
   (1) Theoretically, ast_events can be used by any module as a binary
       representation of a Stasis message. Given the structure of an ast_event
       object, that information has to live in the core to be used universally.
       For example, defining the payload of a device state ast_event in
       res_corosync could result in an incompatible device state representation
       in another module.
   (2) Much of this representation already lived in the core, and was not
       easily extensible.
   (3) The code already existed. :-)
 * Stasis message types now have a message formatter that converts their
   payload to an ast_event object.
 * Stasis message forwarders now handle forwarding to themselves. Previously
   this would result in an infinite recursive call. Now, this simply creates a
   new forwarding object with no forwards set up (as it is the thing it is
   forwarding to). This is advantageous for res_corosync, as returning NULL
   would also imply an unrecoverable error. Returning a subscription in this
   case allows for easier handling of message types that are published directly
   to an aggregate topic that has forwarders.

Review: https://reviewboard.asterisk.org/r/3486/

ASTERISK-22912 #close
ASTERISK-22372 #close


Modified:
    branches/12/include/asterisk/devicestate.h
    branches/12/include/asterisk/event.h
    branches/12/include/asterisk/event_defs.h
    branches/12/include/asterisk/stasis.h
    branches/12/main/app.c
    branches/12/main/devicestate.c
    branches/12/main/event.c
    branches/12/main/stasis.c
    branches/12/main/stasis_message.c
    branches/12/res/res_corosync.c

Modified: branches/12/include/asterisk/devicestate.h
URL: http://svnview.digium.com/svn/asterisk/branches/12/include/asterisk/devicestate.h?view=diff&rev=414330&r1=414329&r2=414330
==============================================================================
--- branches/12/include/asterisk/devicestate.h (original)
+++ branches/12/include/asterisk/devicestate.h Thu May 22 06:51:56 2014
@@ -59,7 +59,7 @@
 	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 */
+	AST_DEVICE_TOTAL,        /*!< Total num of device states, used for testing */
 };
 
 /*! \brief Device State Cachability

Modified: branches/12/include/asterisk/event.h
URL: http://svnview.digium.com/svn/asterisk/branches/12/include/asterisk/event.h?view=diff&rev=414330&r1=414329&r2=414330
==============================================================================
--- branches/12/include/asterisk/event.h (original)
+++ branches/12/include/asterisk/event.h Thu May 22 06:51:56 2014
@@ -25,33 +25,27 @@
 /*!
  * \page AstGenericEvents Generic event system
  *
- * The purpose of this API is to provide a generic way to share events between
- * Asterisk modules.  Code can generate events, and other code can subscribe to
- * them.
+ * Prior to the creation of \ref stasis, the purpose of this API was to provide
+ * a generic way to share events between Asterisk modules. Once there was a need
+ * to disseminate data whose definition was provided by the producers/consumers,
+ * it was no longer possible to use the binary representation in the generic
+ * event system.
+ *
+ * That aside, the generic event system is still useful and used by several
+ * modules in Asterisk.
+ *  - CEL uses the \ref ast_event representation to pass information to registered
+ *    backends.
+ *  - The \file res_corosync module publishes \ref ast_event representations of
+ *    information to other Asterisk instances in a cluster.
+ *  - Security event represent their event types and data using this system.
+ *  - Theoretically, any \ref stasis message can use this system to pass
+ *    information around in a binary format.
  *
  * Events have an associated event type, as well as information elements.  The
  * information elements are the meta data that go along with each event.  For
  * example, in the case of message waiting indication, the event type is MWI,
  * and each MWI event contains at least three information elements: the
  * mailbox, the number of new messages, and the number of old messages.
- *
- * Subscriptions to events consist of an event type and information elements,
- * as well.  Subscriptions can be to all events, or a certain subset of events.
- * If an event type is provided, only events of that type will be sent to this
- * subscriber.  Furthermore, if information elements are supplied with the
- * subscription, only events that contain the specified information elements
- * with specified values will be sent to the subscriber.  For example, when a
- * SIP phone subscribes to MWI for mailbox 1234, then chan_sip can subscribe
- * to internal Asterisk MWI events with the MAILBOX information element with
- * a value of "1234".
- *
- * Another key feature of this event system is the ability to cache events.
- * It is useful for some types of events to be able to remember the last known
- * value.  These are usually events that indicate some kind of state change.
- * In the example of MWI, app_voicemail can instruct the event core to cache
- * these events based on the mailbox.  So, the last known MWI state of each
- * mailbox will be cached, and other modules can retrieve this information
- * on demand without having to poll the mailbox directly.
  */
 
 #ifndef AST_EVENT_H
@@ -109,9 +103,6 @@
  *
  * \return Nothing
  *
- * \note Events that have been queued should *not* be destroyed by the code that
- *       created the event.  It will be automatically destroyed after being
- *       dispatched to the appropriate subscribers.
  */
 void ast_event_destroy(struct ast_event *event);
 
@@ -150,6 +141,55 @@
 	uint32_t data);
 
 /*!
+ * \brief Append an information element that has a bitflags payload
+ *
+ * \param event the event that the IE will be appended to
+ * \param ie_type the type of IE to append
+ * \param bitflags the flags that are the payload of the IE
+ *
+ * \retval 0 success
+ * \retval -1 failure
+ * \since 1.8
+ *
+ * The pointer to the event will get updated with the new location for the event
+ * that now contains the appended information element.  If the re-allocation of
+ * the memory for this event fails, it will be set to NULL.
+ */
+int ast_event_append_ie_bitflags(struct ast_event **event, enum ast_event_ie_type ie_type,
+	uint32_t bitflags);
+
+/*!
+ * \brief Append an information element that has a raw payload
+ *
+ * \param event the event that the IE will be appended to
+ * \param ie_type the type of IE to append
+ * \param data A pointer to the raw data for the payload of the IE
+ * \param data_len The amount of data to copy into the payload
+ *
+ * \retval 0 success
+ * \retval -1 failure
+ *
+ * The pointer to the event will get updated with the new location for the event
+ * that now contains the appended information element.  If the re-allocation of
+ * the memory for this event fails, it will be set to NULL.
+ */
+int ast_event_append_ie_raw(struct ast_event **event, enum ast_event_ie_type ie_type,
+	const void *data, size_t data_len);
+
+/*!
+ * \brief Append the global EID IE
+ *
+ * \param event the event to append IE to
+ *
+ * \note For ast_event_new() that includes IEs, this is done automatically
+ *       for you.
+ *
+ * \retval 0 success
+ * \retval -1 failure
+ */
+int ast_event_append_eid(struct ast_event **event);
+
+/*!
  * \brief Get the value of an information element that has an integer payload
  *
  * \param event The event to get the IE from
@@ -173,6 +213,38 @@
 const char *ast_event_get_ie_str(const struct ast_event *event, enum ast_event_ie_type ie_type);
 
 /*!
+ * \brief Get the value of an information element that has a raw payload
+ *
+ * \param event The event to get the IE from
+ * \param ie_type the type of information element to retrieve
+ *
+ * \return This returns the payload of the information element with the given type.
+ *         If the information element isn't found, NULL will be returned.
+ */
+const void *ast_event_get_ie_raw(const struct ast_event *event, enum ast_event_ie_type ie_type);
+
+/*!
+ * \brief Get the length of the raw payload for a particular IE
+ *
+ * \param event The event to get the IE payload length from
+ * \param ie_type the type of information element to get the length of
+ *
+ * \return If an IE of type ie_type is found, its payload length is returned.
+ *         Otherwise, 0 is returned.
+ */
+uint16_t ast_event_get_ie_raw_payload_len(const struct ast_event *event, enum ast_event_ie_type ie_type);
+
+/*!
+ * \brief Get the string representation of the type of the given event
+ *
+ * \arg event the event to get the type of
+ *
+ * \return the string representation of the event type of the provided event
+ * \since 1.6.1
+ */
+const char *ast_event_get_type_name(const struct ast_event *event);
+
+/*!
  * \brief Get the string representation of an information element type
  *
  * \param ie_type the information element type to get the string representation of
@@ -272,6 +344,13 @@
  * \return This returns the payload of the information element as a string.
  */
 const char *ast_event_iterator_get_ie_str(struct ast_event_iterator *iterator);
+
+/*!
+ * \brief Get the minimum length of an ast_event.
+ *
+ * \return minimum amount of memory that will be consumed by any ast_event.
+ */
+size_t ast_event_minimum_length(void);
 
 #if defined(__cplusplus) || defined(c_plusplus)
 }

Modified: branches/12/include/asterisk/event_defs.h
URL: http://svnview.digium.com/svn/asterisk/branches/12/include/asterisk/event_defs.h?view=diff&rev=414330&r1=414329&r2=414330
==============================================================================
--- branches/12/include/asterisk/event_defs.h (original)
+++ branches/12/include/asterisk/event_defs.h Thu May 22 06:51:56 2014
@@ -25,23 +25,41 @@
 #ifndef AST_EVENT_DEFS_H
 #define AST_EVENT_DEFS_H
 
-/*! \brief Event types
- * \note These values no longer go over the wire and can change when items are removed. */
 enum ast_event_type {
 	/*! Reserved to provide the ability to subscribe to all events.  A specific
 	 *  event should never have a payload of 0. */
 	AST_EVENT_ALL                 = 0x00,
 	/*! This event type is reserved for use by third-party modules to create
-	 *  custom events without having to modify this file. 
+	 *  custom events without having to modify this file.
 	 *  \note There are no "custom" IE types, because IEs only have to be
 	 *  unique to the event itself, not necessarily across all events. */
 	AST_EVENT_CUSTOM              = 0x01,
+	/*! Voicemail message waiting indication */
+	AST_EVENT_MWI                 = 0x02,
 	/*! Someone has subscribed to events */
-	AST_EVENT_SUB                 = 0x02,
+	AST_EVENT_SUB                 = 0x03,
+	/*! Someone has unsubscribed from events */
+	AST_EVENT_UNSUB               = 0x04,
+	/*! The aggregate state of a device across all servers configured to be
+	 *  a part of a device state cluster has changed. */
+	AST_EVENT_DEVICE_STATE        = 0x05,
+	/*! The state of a device has changed on _one_ server.  This should not be used
+	 *  directly, in general.  Use AST_EVENT_DEVICE_STATE instead. */
+	AST_EVENT_DEVICE_STATE_CHANGE = 0x06,
 	/*! Channel Event Logging events */
-	AST_EVENT_CEL                 = 0x03,
+	AST_EVENT_CEL                 = 0x07,
+	/*! A report of a security related event (see security_events.h) */
+	AST_EVENT_SECURITY            = 0x08,
+	/*! Used by res_stun_monitor to alert listeners to an exernal network address change. */
+	AST_EVENT_NETWORK_CHANGE      = 0x09,
+	/*! The presence state for a presence provider */
+	AST_EVENT_PRESENCE_STATE      = 0x0a,
+	/*! Used to alert listeners when a named ACL has changed. */
+	AST_EVENT_ACL_CHANGE          = 0x0b,
+	/*! Send out a ping for debugging distributed events */
+	AST_EVENT_PING                = 0x0c,
 	/*! Number of event types.  This should be the last event type + 1 */
-	AST_EVENT_TOTAL               = 0x04,
+	AST_EVENT_TOTAL               = 0x0d,
 };
 
 /*! \brief Event Information Element types */
@@ -49,199 +67,243 @@
 	/*! Used to terminate the arguments to event functions */
 	AST_EVENT_IE_END                 = -1,
 
-	/*! 
+	/*!
+	 * \brief Number of new messages
+	 * Used by: AST_EVENT_MWI
+	 * Payload type: UINT
+	 */
+	AST_EVENT_IE_NEWMSGS             = 0x0001,
+	/*!
+	 * \brief Number of
+	 * Used by: AST_EVENT_MWI
+	 * Payload type: UINT
+	 */
+	AST_EVENT_IE_OLDMSGS             = 0x0002,
+	/*!
+	 * \brief Mailbox name \verbatim (mailbox[@context]) \endverbatim
+	 * Used by: AST_EVENT_MWI 
+	 * Payload type: STR
+	 */
+	AST_EVENT_IE_MAILBOX             = 0x0003,
+	/*!
 	 * \brief Unique ID
 	 * Used by: AST_EVENT_SUB, AST_EVENT_UNSUB
 	 * Payload type: UINT
 	 */
-	AST_EVENT_IE_UNIQUEID            = 0x0001,
-	/*! 
-	 * \brief Event type 
+	AST_EVENT_IE_UNIQUEID            = 0x0004,
+	/*!
+	 * \brief Event type
 	 * Used by: AST_EVENT_SUB, AST_EVENT_UNSUB
 	 * Payload type: UINT
 	 */
-	AST_EVENT_IE_EVENTTYPE           = 0x0002,
+	AST_EVENT_IE_EVENTTYPE           = 0x0005,
 	/*!
 	 * \brief Hint that someone cares that an IE exists
 	 * Used by: AST_EVENT_SUB
 	 * Payload type: UINT (ast_event_ie_type)
 	 */
-	AST_EVENT_IE_EXISTS              = 0x0003,
-	 /*!
-	  * \brief Context IE
-	  * Used by AST_EVENT_MWI
-	  * Payload type: str
-	  */
-	 AST_EVENT_IE_CONTEXT            = 0x0004,
-	/*! 
+	AST_EVENT_IE_EXISTS              = 0x0006,
+	/*!
+	 * \brief Device Name
+	 * Used by AST_EVENT_DEVICE_STATE_CHANGE
+	 * Payload type: STR
+	 */
+	AST_EVENT_IE_DEVICE              = 0x0007,
+	/*!
+	 * \brief Generic State IE
+	 * Used by AST_EVENT_DEVICE_STATE_CHANGE
+	 * Payload type: UINT
+	 * The actual state values depend on the event which
+	 * this IE is a part of.
+	 */
+	 AST_EVENT_IE_STATE              = 0x0008,
+	/*!
+	 * \brief Context IE
+	 * Used by AST_EVENT_MWI
+	 * Payload type: str
+	 */
+	 AST_EVENT_IE_CONTEXT            = 0x0009,
+	/*!
 	 * \brief Channel Event Type
 	 * Used by: AST_EVENT_CEL
 	 * Payload type: UINT
 	 */
-	AST_EVENT_IE_CEL_EVENT_TYPE      = 0x0005,
-	/*! 
+	AST_EVENT_IE_CEL_EVENT_TYPE      = 0x000a,
+	/*!
 	 * \brief Channel Event Time (seconds)
 	 * Used by: AST_EVENT_CEL
 	 * Payload type: UINT
 	 */
-	AST_EVENT_IE_CEL_EVENT_TIME      = 0x0006,
-	/*! 
+	AST_EVENT_IE_CEL_EVENT_TIME      = 0x000b,
+	/*!
 	 * \brief Channel Event Time (micro-seconds)
 	 * Used by: AST_EVENT_CEL
 	 * Payload type: UINT
 	 */
-	AST_EVENT_IE_CEL_EVENT_TIME_USEC = 0x0007,
-	/*! 
+	AST_EVENT_IE_CEL_EVENT_TIME_USEC = 0x000c,
+	/*!
 	 * \brief Channel Event User Event Name
 	 * Used by: AST_EVENT_CEL
 	 * Payload type: STR
 	 */
-	AST_EVENT_IE_CEL_USEREVENT_NAME  = 0x0008,
-	/*! 
+	AST_EVENT_IE_CEL_USEREVENT_NAME  = 0x000d,
+	/*!
 	 * \brief Channel Event CID name
 	 * Used by: AST_EVENT_CEL
 	 * Payload type: STR
 	 */
-	AST_EVENT_IE_CEL_CIDNAME         = 0x0009,
-	/*! 
+	AST_EVENT_IE_CEL_CIDNAME         = 0x000e,
+	/*!
 	 * \brief Channel Event CID num
 	 * Used by: AST_EVENT_CEL
 	 * Payload type: STR
 	 */
-	AST_EVENT_IE_CEL_CIDNUM          = 0x000a,
-	/*! 
+	AST_EVENT_IE_CEL_CIDNUM          = 0x000f,
+	/*!
 	 * \brief Channel Event extension name
 	 * Used by: AST_EVENT_CEL
 	 * Payload type: STR
 	 */
-	AST_EVENT_IE_CEL_EXTEN           = 0x000b,
-	/*! 
+	AST_EVENT_IE_CEL_EXTEN           = 0x0010,
+	/*!
 	 * \brief Channel Event context name
 	 * Used by: AST_EVENT_CEL
 	 * Payload type: STR
 	 */
-	AST_EVENT_IE_CEL_CONTEXT         = 0x000c,
-	/*! 
+	AST_EVENT_IE_CEL_CONTEXT         = 0x0011,
+	/*!
 	 * \brief Channel Event channel name
 	 * Used by: AST_EVENT_CEL
 	 * Payload type: STR
 	 */
-	AST_EVENT_IE_CEL_CHANNAME        = 0x000d,
-	/*! 
+	AST_EVENT_IE_CEL_CHANNAME        = 0x0012,
+	/*!
 	 * \brief Channel Event app name
 	 * Used by: AST_EVENT_CEL
 	 * Payload type: STR
 	 */
-	AST_EVENT_IE_CEL_APPNAME         = 0x000e,
-	/*! 
+	AST_EVENT_IE_CEL_APPNAME         = 0x0013,
+	/*!
 	 * \brief Channel Event app args/data
 	 * Used by: AST_EVENT_CEL
 	 * Payload type: STR
 	 */
-	AST_EVENT_IE_CEL_APPDATA         = 0x000f,
-	/*! 
+	AST_EVENT_IE_CEL_APPDATA         = 0x0014,
+	/*!
 	 * \brief Channel Event AMA flags
 	 * Used by: AST_EVENT_CEL
 	 * Payload type: UINT
 	 */
-	AST_EVENT_IE_CEL_AMAFLAGS        = 0x0010,
-	/*! 
+	AST_EVENT_IE_CEL_AMAFLAGS        = 0x0015,
+	/*!
 	 * \brief Channel Event AccountCode
 	 * Used by: AST_EVENT_CEL
 	 * Payload type: STR
 	 */
-	AST_EVENT_IE_CEL_ACCTCODE        = 0x0011,
-	/*! 
+	AST_EVENT_IE_CEL_ACCTCODE        = 0x0016,
+	/*!
 	 * \brief Channel Event UniqueID
 	 * Used by: AST_EVENT_CEL
 	 * Payload type: STR
 	 */
-	AST_EVENT_IE_CEL_UNIQUEID        = 0x0012,
-	/*! 
+	AST_EVENT_IE_CEL_UNIQUEID        = 0x0017,
+	/*!
 	 * \brief Channel Event Userfield
 	 * Used by: AST_EVENT_CEL
 	 * Payload type: STR
 	 */
-	AST_EVENT_IE_CEL_USERFIELD       = 0x0013,
-	/*! 
+	AST_EVENT_IE_CEL_USERFIELD       = 0x0018,
+	/*!
 	 * \brief Channel Event CID ANI field
 	 * Used by: AST_EVENT_CEL
 	 * Payload type: STR
 	 */
-	AST_EVENT_IE_CEL_CIDANI          = 0x0014,
-	/*! 
+	AST_EVENT_IE_CEL_CIDANI          = 0x0019,
+	/*!
 	 * \brief Channel Event CID RDNIS field
 	 * Used by: AST_EVENT_CEL
 	 * Payload type: STR
 	 */
-	AST_EVENT_IE_CEL_CIDRDNIS        = 0x0015,
-	/*! 
+	AST_EVENT_IE_CEL_CIDRDNIS        = 0x001a,
+	/*!
 	 * \brief Channel Event CID dnid
 	 * Used by: AST_EVENT_CEL
 	 * Payload type: STR
 	 */
-	AST_EVENT_IE_CEL_CIDDNID         = 0x0016,
-	/*! 
+	AST_EVENT_IE_CEL_CIDDNID         = 0x001b,
+	/*!
 	 * \brief Channel Event Peer -- for Things involving multiple channels, like BRIDGE
 	 * Used by: AST_EVENT_CEL
 	 * Payload type: STR
 	 */
-	AST_EVENT_IE_CEL_PEER            = 0x0017,
-	/*! 
+	AST_EVENT_IE_CEL_PEER            = 0x001c,
+	/*!
 	 * \brief Channel Event LinkedID
 	 * Used by: AST_EVENT_CEL
 	 * Payload type: STR
 	 */
-	AST_EVENT_IE_CEL_LINKEDID        = 0x0018,
-	/*! 
+	AST_EVENT_IE_CEL_LINKEDID        = 0x001d,
+	/*!
 	 * \brief Channel Event peeraccount
 	 * Used by: AST_EVENT_CEL
 	 * Payload type: STR
 	 */
-	AST_EVENT_IE_CEL_PEERACCT        = 0x0019,
-	/*! 
+	AST_EVENT_IE_CEL_PEERACCT        = 0x001e,
+	/*!
 	 * \brief Channel Event extra data
 	 * Used by: AST_EVENT_CEL
 	 * Payload type: STR
 	 */
-	AST_EVENT_IE_CEL_EXTRA           = 0x001a,
+	AST_EVENT_IE_CEL_EXTRA           = 0x001f,
 	/*!
 	 * \brief Description
 	 * Used by: AST_EVENT_SUB, AST_EVENT_UNSUB
 	 * Payload type: STR
 	 */
-	AST_EVENT_IE_DESCRIPTION         = 0x001b,
+	AST_EVENT_IE_DESCRIPTION         = 0x0020,
 	/*!
 	 * \brief Entity ID
 	 * Used by All events
 	 * Payload type: RAW
 	 * This IE indicates which server the event originated from
 	 */
-	AST_EVENT_IE_EVENT_VERSION       = 0x001c,
-	AST_EVENT_IE_SERVICE             = 0x001d,
-	AST_EVENT_IE_MODULE              = 0x001e,
-	AST_EVENT_IE_ACCOUNT_ID          = 0x001f,
-	AST_EVENT_IE_SESSION_ID          = 0x0020,
-	AST_EVENT_IE_SESSION_TV          = 0x0021,
-	AST_EVENT_IE_ACL_NAME            = 0x0022,
-	AST_EVENT_IE_LOCAL_ADDR          = 0x0023,
-	AST_EVENT_IE_REMOTE_ADDR         = 0x0024,
-	AST_EVENT_IE_EVENT_TV            = 0x0025,
-	AST_EVENT_IE_REQUEST_TYPE        = 0x0026,
-	AST_EVENT_IE_REQUEST_PARAMS      = 0x0027,
-	AST_EVENT_IE_AUTH_METHOD         = 0x0028,
-	AST_EVENT_IE_SEVERITY            = 0x0029,
-	AST_EVENT_IE_EXPECTED_ADDR       = 0x002a,
-	AST_EVENT_IE_CHALLENGE           = 0x002b,
-	AST_EVENT_IE_RESPONSE            = 0x002c,
-	AST_EVENT_IE_EXPECTED_RESPONSE   = 0x002e,
-	AST_EVENT_IE_RECEIVED_CHALLENGE  = 0x002f,
-	AST_EVENT_IE_RECEIVED_HASH       = 0x0030,
-	AST_EVENT_IE_USING_PASSWORD      = 0x0031,
-	AST_EVENT_IE_ATTEMPTED_TRANSPORT = 0x0032,
-
+	AST_EVENT_IE_EID                 = 0x0021,
+	AST_EVENT_IE_SECURITY_EVENT      = 0x0022,
+	AST_EVENT_IE_EVENT_VERSION       = 0x0023,
+	AST_EVENT_IE_SERVICE             = 0x0024,
+	AST_EVENT_IE_MODULE              = 0x0025,
+	AST_EVENT_IE_ACCOUNT_ID          = 0x0026,
+	AST_EVENT_IE_SESSION_ID          = 0x0027,
+	AST_EVENT_IE_SESSION_TV          = 0x0028,
+	AST_EVENT_IE_ACL_NAME            = 0x0029,
+	AST_EVENT_IE_LOCAL_ADDR          = 0x002a,
+	AST_EVENT_IE_REMOTE_ADDR         = 0x002b,
+	AST_EVENT_IE_EVENT_TV            = 0x002c,
+	AST_EVENT_IE_REQUEST_TYPE        = 0x002d,
+	AST_EVENT_IE_REQUEST_PARAMS      = 0x002e,
+	AST_EVENT_IE_AUTH_METHOD         = 0x002f,
+	AST_EVENT_IE_SEVERITY            = 0x0030,
+	AST_EVENT_IE_EXPECTED_ADDR       = 0x0031,
+	AST_EVENT_IE_CHALLENGE           = 0x0032,
+	AST_EVENT_IE_RESPONSE            = 0x0033,
+	AST_EVENT_IE_EXPECTED_RESPONSE   = 0x0034,
+	AST_EVENT_IE_RECEIVED_CHALLENGE  = 0x0035,
+	AST_EVENT_IE_RECEIVED_HASH       = 0x0036,
+	AST_EVENT_IE_USING_PASSWORD      = 0x0037,
+	AST_EVENT_IE_ATTEMPTED_TRANSPORT = 0x0038,
+	AST_EVENT_IE_PRESENCE_PROVIDER   = 0x0039,
+	AST_EVENT_IE_PRESENCE_STATE      = 0x003a,
+	AST_EVENT_IE_PRESENCE_SUBTYPE    = 0x003b,
+	AST_EVENT_IE_PRESENCE_MESSAGE    = 0x003c,
+
+	/*!
+	 * \brief Event non-cachability flag
+	 * Used by: All events
+	 * Payload type: UINT
+	 */
+	AST_EVENT_IE_CACHABLE            = 0x003d,
 	/*! \brief Must be the last IE value +1 */
-	AST_EVENT_IE_TOTAL               = 0x0033,
+	AST_EVENT_IE_TOTAL               = 0x003e,
 };
 
 /*!
@@ -249,12 +311,16 @@
  */
 enum ast_event_ie_pltype {
 	AST_EVENT_IE_PLTYPE_UNKNOWN = -1,
+	/*! Just check if it exists, not the value */
+	AST_EVENT_IE_PLTYPE_EXISTS,
 	/*! Unsigned Integer (Can be used for signed, too ...) */
 	AST_EVENT_IE_PLTYPE_UINT,
 	/*! String */
 	AST_EVENT_IE_PLTYPE_STR,
 	/*! Raw data, compared with memcmp */
 	AST_EVENT_IE_PLTYPE_RAW,
+	/*! Bit flags (unsigned integer, compared using boolean logic) */
+	AST_EVENT_IE_PLTYPE_BITFLAGS,
 };
 
 /*!

Modified: branches/12/include/asterisk/stasis.h
URL: http://svnview.digium.com/svn/asterisk/branches/12/include/asterisk/stasis.h?view=diff&rev=414330&r1=414329&r2=414330
==============================================================================
--- branches/12/include/asterisk/stasis.h (original)
+++ branches/12/include/asterisk/stasis.h Thu May 22 06:51:56 2014
@@ -171,6 +171,7 @@
 #include "asterisk/json.h"
 #include "asterisk/manager.h"
 #include "asterisk/utils.h"
+#include "asterisk/event.h"
 
 /*! @{ */
 
@@ -255,6 +256,21 @@
 	 */
 	struct ast_manager_event_blob *(*to_ami)(
 		struct stasis_message *message);
+
+	/*!
+	 * \since 12.3.0
+	 * \brief Build the \ref ast_event representation of the message.
+	 *
+	 * May be \c NULL, or may return \c NULL, to indicate no representation.
+	 * The returned object should be free'd.
+	 *
+	 * \param message Message to convert to an \ref ast_event.
+	 * \return Newly allocated \ref ast_event.
+	 * \return \c NULL on error.
+	 * \return \c NULL if AMI format is not supported.
+	 */
+	struct ast_event *(*to_event)(
+		struct stasis_message *message);
 };
 
 /*!
@@ -387,6 +403,19 @@
  * \return \c NULL if AMI format is not supported.
  */
 struct ast_manager_event_blob *stasis_message_to_ami(
+	struct stasis_message *message);
+
+/*!
+ * \brief Build the \ref AstGenericEvents representation of the message.
+ *
+ * May return \c NULL, to indicate no representation. The returned object should
+ * be disposed of via \ref ast_event_destroy.
+ *
+ * \param message Message to convert to AMI.
+ * \return \c NULL on error.
+ * \return \c NULL if AMI format is not supported.
+ */
+struct ast_event *stasis_message_to_event(
 	struct stasis_message *message);
 
 /*! @} */
@@ -1020,6 +1049,7 @@
  *	STASIS_MESSAGE_TYPE_DEFN(ast_foo_type,
  *		.to_ami = foo_to_ami,
  *		.to_json = foo_to_json,
+ *		.to_event = foo_to_event,
  *		);
  * \endcode
  *
@@ -1046,6 +1076,7 @@
  *	STASIS_MESSAGE_TYPE_DEFN_LOCAL(ast_foo_type,
  *		.to_ami = foo_to_ami,
  *		.to_json = foo_to_json,
+ *		.to_event = foo_to_event,
  *		);
  * \endcode
  *

Modified: branches/12/main/app.c
URL: http://svnview.digium.com/svn/asterisk/branches/12/main/app.c?view=diff&rev=414330&r1=414329&r2=414330
==============================================================================
--- branches/12/main/app.c (original)
+++ branches/12/main/app.c Thu May 22 06:51:56 2014
@@ -96,10 +96,43 @@
 static struct stasis_topic_pool *queue_topic_pool;
 /* @} */
 
+/*! \brief Convert a MWI \ref stasis_message to a \ref ast_event */
+static struct ast_event *mwi_to_event(struct stasis_message *message)
+{
+	struct ast_event *event;
+	struct ast_mwi_state *mwi_state;
+	char *mailbox;
+	char *context;
+
+	if (!message) {
+		return NULL;
+	}
+
+	mwi_state = stasis_message_data(message);
+
+	/* Strip off @context */
+	context = mailbox = ast_strdupa(mwi_state->uniqueid);
+	strsep(&context, "@");
+	if (ast_strlen_zero(context)) {
+		context = "default";
+	}
+
+	event = ast_event_new(AST_EVENT_MWI,
+				AST_EVENT_IE_MAILBOX, AST_EVENT_IE_PLTYPE_STR, mailbox,
+				AST_EVENT_IE_CONTEXT, AST_EVENT_IE_PLTYPE_STR, context,
+				AST_EVENT_IE_NEWMSGS, AST_EVENT_IE_PLTYPE_UINT, mwi_state->new_msgs,
+				AST_EVENT_IE_OLDMSGS, AST_EVENT_IE_PLTYPE_UINT, mwi_state->old_msgs,
+				AST_EVENT_IE_EID, AST_EVENT_IE_PLTYPE_RAW, &mwi_state->eid, sizeof(mwi_state->eid),
+				AST_EVENT_IE_END);
+
+	return event;
+}
+
 /*
  * @{ \brief Define \ref stasis message types for MWI
  */
-STASIS_MESSAGE_TYPE_DEFN(ast_mwi_state_type);
+STASIS_MESSAGE_TYPE_DEFN(ast_mwi_state_type,
+	.to_event = mwi_to_event, );
 STASIS_MESSAGE_TYPE_DEFN(ast_mwi_vm_app_type);
 /* @} */
 

Modified: branches/12/main/devicestate.c
URL: http://svnview.digium.com/svn/asterisk/branches/12/main/devicestate.c?view=diff&rev=414330&r1=414329&r2=414330
==============================================================================
--- branches/12/main/devicestate.c (original)
+++ branches/12/main/devicestate.c Thu May 22 06:51:56 2014
@@ -199,7 +199,38 @@
 static struct stasis_caching_topic *device_state_topic_cached;
 static struct stasis_topic_pool *device_state_topic_pool;
 
-STASIS_MESSAGE_TYPE_DEFN(ast_device_state_message_type);
+/*! \brief Convert a \ref stasis_message to a \ref ast_event */
+static struct ast_event *device_state_to_event(struct stasis_message *message)
+{
+	struct ast_event *event;
+	struct ast_device_state_message *device_state;
+
+	if (!message) {
+		return NULL;
+	}
+
+	device_state = stasis_message_data(message);
+
+	if (device_state->eid) {
+		event = ast_event_new(AST_EVENT_DEVICE_STATE_CHANGE,
+					    AST_EVENT_IE_DEVICE, AST_EVENT_IE_PLTYPE_STR, device_state->device,
+					    AST_EVENT_IE_STATE, AST_EVENT_IE_PLTYPE_UINT, device_state->state,
+					    AST_EVENT_IE_CACHABLE, AST_EVENT_IE_PLTYPE_UINT, device_state->cachable,
+					    AST_EVENT_IE_EID, AST_EVENT_IE_PLTYPE_RAW, device_state->eid, sizeof(*device_state->eid),
+					    AST_EVENT_IE_END);
+	} else {
+		event = ast_event_new(AST_EVENT_DEVICE_STATE,
+					    AST_EVENT_IE_DEVICE, AST_EVENT_IE_PLTYPE_STR, device_state->device,
+					    AST_EVENT_IE_STATE, AST_EVENT_IE_PLTYPE_UINT, device_state->state,
+					    AST_EVENT_IE_CACHABLE, AST_EVENT_IE_PLTYPE_UINT, device_state->cachable,
+					    AST_EVENT_IE_END);
+	}
+
+	return event;
+}
+
+STASIS_MESSAGE_TYPE_DEFN(ast_device_state_message_type,
+	.to_event = device_state_to_event);
 
 /* Forward declarations */
 static int getproviderstate(const char *provider, const char *address);

Modified: branches/12/main/event.c
URL: http://svnview.digium.com/svn/asterisk/branches/12/main/event.c?view=diff&rev=414330&r1=414329&r2=414330
==============================================================================
--- branches/12/main/event.c (original)
+++ branches/12/main/event.c Thu May 22 06:51:56 2014
@@ -43,10 +43,6 @@
 #include "asterisk/taskprocessor.h"
 #include "asterisk/astobj2.h"
 #include "asterisk/cli.h"
-
-static int event_append_ie_raw(struct ast_event **event, enum ast_event_ie_type ie_type,
-	const void *data, size_t data_len);
-static const void *event_get_ie_raw(const struct ast_event *event, enum ast_event_ie_type ie_type);
 
 /*!
  * \brief An event information element
@@ -109,19 +105,42 @@
 	size_t raw_datalen;
 };
 
-struct ie_map {
+/*!
+ * \brief Event Names
+ */
+static const char * const event_names[AST_EVENT_TOTAL] = {
+	[AST_EVENT_ALL]                 = "All",
+	[AST_EVENT_CUSTOM]              = "Custom",
+	[AST_EVENT_MWI]                 = "MWI",
+	[AST_EVENT_SUB]                 = "Subscription",
+	[AST_EVENT_UNSUB]               = "Unsubscription",
+	[AST_EVENT_DEVICE_STATE]        = "DeviceState",
+	[AST_EVENT_DEVICE_STATE_CHANGE] = "DeviceStateChange",
+	[AST_EVENT_CEL]                 = "CEL",
+	[AST_EVENT_SECURITY]            = "Security",
+	[AST_EVENT_NETWORK_CHANGE]      = "NetworkChange",
+	[AST_EVENT_PRESENCE_STATE]      = "PresenceState",
+	[AST_EVENT_ACL_CHANGE]          = "ACLChange",
+	[AST_EVENT_PING]                = "Ping",
+};
+
+/*!
+ * \brief IE payload types and names
+ */
+static const struct ie_map {
 	enum ast_event_ie_pltype ie_pltype;
 	const char *name;
-};
-
-/*!
- * \brief IE payload types and names
- */
-static const struct ie_map ie_maps[AST_EVENT_IE_TOTAL] = {
+} ie_maps[AST_EVENT_IE_TOTAL] = {
+	[AST_EVENT_IE_NEWMSGS]             = { AST_EVENT_IE_PLTYPE_UINT, "NewMessages" },
+	[AST_EVENT_IE_OLDMSGS]             = { AST_EVENT_IE_PLTYPE_UINT, "OldMessages" },
+	[AST_EVENT_IE_MAILBOX]             = { AST_EVENT_IE_PLTYPE_STR,  "Mailbox" },
 	[AST_EVENT_IE_UNIQUEID]            = { AST_EVENT_IE_PLTYPE_UINT, "UniqueID" },
 	[AST_EVENT_IE_EVENTTYPE]           = { AST_EVENT_IE_PLTYPE_UINT, "EventType" },
 	[AST_EVENT_IE_EXISTS]              = { AST_EVENT_IE_PLTYPE_UINT, "Exists" },
+	[AST_EVENT_IE_DEVICE]              = { AST_EVENT_IE_PLTYPE_STR,  "Device" },
+	[AST_EVENT_IE_STATE]               = { AST_EVENT_IE_PLTYPE_UINT, "State" },
 	[AST_EVENT_IE_CONTEXT]             = { AST_EVENT_IE_PLTYPE_STR,  "Context" },
+	[AST_EVENT_IE_EID]                 = { AST_EVENT_IE_PLTYPE_RAW,  "EntityID" },
 	[AST_EVENT_IE_CEL_EVENT_TYPE]      = { AST_EVENT_IE_PLTYPE_UINT, "CELEventType" },
 	[AST_EVENT_IE_CEL_EVENT_TIME]      = { AST_EVENT_IE_PLTYPE_UINT, "CELEventTime" },
 	[AST_EVENT_IE_CEL_EVENT_TIME_USEC] = { AST_EVENT_IE_PLTYPE_UINT, "CELEventTimeUSec" },
@@ -144,6 +163,7 @@
 	[AST_EVENT_IE_CEL_LINKEDID]        = { AST_EVENT_IE_PLTYPE_STR,  "CELLinkedID" },
 	[AST_EVENT_IE_CEL_PEERACCT]        = { AST_EVENT_IE_PLTYPE_STR,  "CELPeerAcct" },
 	[AST_EVENT_IE_CEL_EXTRA]           = { AST_EVENT_IE_PLTYPE_STR,  "CELExtra" },
+	[AST_EVENT_IE_SECURITY_EVENT]      = { AST_EVENT_IE_PLTYPE_STR,  "SecurityEvent" },
 	[AST_EVENT_IE_EVENT_VERSION]       = { AST_EVENT_IE_PLTYPE_UINT, "EventVersion" },
 	[AST_EVENT_IE_SERVICE]             = { AST_EVENT_IE_PLTYPE_STR,  "Service" },
 	[AST_EVENT_IE_MODULE]              = { AST_EVENT_IE_PLTYPE_STR,  "Module" },
@@ -166,7 +186,26 @@
 	[AST_EVENT_IE_RECEIVED_HASH]       = { AST_EVENT_IE_PLTYPE_STR,  "ReceivedHash" },
 	[AST_EVENT_IE_USING_PASSWORD]      = { AST_EVENT_IE_PLTYPE_UINT, "UsingPassword" },
 	[AST_EVENT_IE_ATTEMPTED_TRANSPORT] = { AST_EVENT_IE_PLTYPE_STR,  "AttemptedTransport" },
+	[AST_EVENT_IE_CACHABLE]            = { AST_EVENT_IE_PLTYPE_UINT, "Cachable" },
+	[AST_EVENT_IE_PRESENCE_PROVIDER]   = { AST_EVENT_IE_PLTYPE_STR,  "PresenceProvider" },
+	[AST_EVENT_IE_PRESENCE_STATE]      = { AST_EVENT_IE_PLTYPE_UINT, "PresenceState" },
+	[AST_EVENT_IE_PRESENCE_SUBTYPE]    = { AST_EVENT_IE_PLTYPE_STR,  "PresenceSubtype" },
+	[AST_EVENT_IE_PRESENCE_MESSAGE]    = { AST_EVENT_IE_PLTYPE_STR,  "PresenceMessage" },
 };
+
+const char *ast_event_get_type_name(const struct ast_event *event)
+{
+	enum ast_event_type type;
+
+	type = ast_event_get_type(event);
+
+	if (type < 0 || type >= ARRAY_LEN(event_names)) {
+		ast_log(LOG_ERROR, "Invalid event type - '%d'\n", type);
+		return "";
+	}
+
+	return event_names[type];
+}
 
 const char *ast_event_get_ie_type_name(enum ast_event_ie_type ie_type)
 {
@@ -257,7 +296,7 @@
 {
 	const uint32_t *ie_val;
 
-	ie_val = event_get_ie_raw(event, ie_type);
+	ie_val = ast_event_get_ie_raw(event, ie_type);
 
 	return ie_val ? ntohl(get_unaligned_uint32(ie_val)) : 0;
 }
@@ -266,12 +305,12 @@
 {
 	const struct ast_event_ie_str_payload *str_payload;
 
-	str_payload = event_get_ie_raw(event, ie_type);
+	str_payload = ast_event_get_ie_raw(event, ie_type);
 
 	return str_payload ? str_payload->str : NULL;
 }
 
-static const void *event_get_ie_raw(const struct ast_event *event, enum ast_event_ie_type ie_type)
+const void *ast_event_get_ie_raw(const struct ast_event *event, enum ast_event_ie_type ie_type)
 {
 	struct ast_event_iterator iterator;
 	int res;
@@ -285,6 +324,26 @@
 	return NULL;
 }
 
+static uint16_t event_iterator_get_ie_raw_payload_len(struct ast_event_iterator *iterator)
+{
+	return ntohs(iterator->ie->ie_payload_len);
+}
+
+uint16_t ast_event_get_ie_raw_payload_len(const struct ast_event *event, enum ast_event_ie_type ie_type)
+{
+	struct ast_event_iterator iterator;
+	int res;
+
+	for (res = ast_event_iterator_init(&iterator, event); !res; res = ast_event_iterator_next(&iterator)) {
+		if (ast_event_iterator_get_ie_type(&iterator) == ie_type) {
+			return event_iterator_get_ie_raw_payload_len(&iterator);
+		}
+	}
+
+	return 0;
+}
+
+
 int ast_event_append_ie_str(struct ast_event **event, enum ast_event_ie_type ie_type,
 	const char *str)
 {
@@ -297,17 +356,24 @@
 	strcpy(str_payload->str, str);
 	str_payload->hash = ast_str_hash(str);
 
-	return event_append_ie_raw(event, ie_type, str_payload, payload_len);
+	return ast_event_append_ie_raw(event, ie_type, str_payload, payload_len);
 }
 
 int ast_event_append_ie_uint(struct ast_event **event, enum ast_event_ie_type ie_type,
 	uint32_t data)
 {
 	data = htonl(data);
-	return event_append_ie_raw(event, ie_type, &data, sizeof(data));
-}
-
-static int event_append_ie_raw(struct ast_event **event, enum ast_event_ie_type ie_type,
+	return ast_event_append_ie_raw(event, ie_type, &data, sizeof(data));
+}
+
+int ast_event_append_ie_bitflags(struct ast_event **event, enum ast_event_ie_type ie_type,
+	uint32_t flags)
+{
+	flags = htonl(flags);
+	return ast_event_append_ie_raw(event, ie_type, &flags, sizeof(flags));
+}
+
+int ast_event_append_ie_raw(struct ast_event **event, enum ast_event_ie_type ie_type,
 	const void *data, size_t data_len)
 {
 	struct ast_event_ie *ie;
@@ -361,8 +427,13 @@
 		memset(ie_value, 0, sizeof(*ie_value));
 		ie_value->ie_type = ie_type;
 		ie_value->ie_pltype = va_arg(ap, enum ast_event_ie_pltype);
+
 		switch (ie_value->ie_pltype) {
 		case AST_EVENT_IE_PLTYPE_UINT:
+			ie_value->payload.uint = va_arg(ap, uint32_t);
+			insert = 1;
+			break;
+		case AST_EVENT_IE_PLTYPE_BITFLAGS:
 			ie_value->payload.uint = va_arg(ap, uint32_t);
 			insert = 1;
 			break;
@@ -381,6 +452,7 @@
 			break;
 		}
 		case AST_EVENT_IE_PLTYPE_UNKNOWN:
+		case AST_EVENT_IE_PLTYPE_EXISTS:
 			break;
 		}
 
@@ -407,10 +479,14 @@
 		case AST_EVENT_IE_PLTYPE_UINT:
 			ast_event_append_ie_uint(&event, ie_val->ie_type, ie_val->payload.uint);
 			break;
+		case AST_EVENT_IE_PLTYPE_BITFLAGS:
+			ast_event_append_ie_bitflags(&event, ie_val->ie_type, ie_val->payload.uint);
+			break;
 		case AST_EVENT_IE_PLTYPE_RAW:
-			event_append_ie_raw(&event, ie_val->ie_type,
+			ast_event_append_ie_raw(&event, ie_val->ie_type,
 					ie_val->payload.raw, ie_val->raw_datalen);
 			break;
+		case AST_EVENT_IE_PLTYPE_EXISTS:
 		case AST_EVENT_IE_PLTYPE_UNKNOWN:
 			break;
 		}
@@ -421,10 +497,27 @@
 		}
 	}
 
+	if (!ast_event_get_ie_raw(event, AST_EVENT_IE_EID)) {
+		/* If the event is originating on this server, add the server's
+		 * entity ID to the event. */
+		ast_event_append_eid(&event);
+	}
+
 	return event;
 }
 
+int ast_event_append_eid(struct ast_event **event)
+{
+	return ast_event_append_ie_raw(event, AST_EVENT_IE_EID,
+			&ast_eid_default, sizeof(ast_eid_default));
+}
+
 void ast_event_destroy(struct ast_event *event)
 {
 	ast_free(event);
 }
+
+size_t ast_event_minimum_length(void)
+{
+	return sizeof(struct ast_event);
+}

Modified: branches/12/main/stasis.c
URL: http://svnview.digium.com/svn/asterisk/branches/12/main/stasis.c?view=diff&rev=414330&r1=414329&r2=414330
==============================================================================
--- branches/12/main/stasis.c (original)
+++ branches/12/main/stasis.c Thu May 22 06:51:56 2014
@@ -686,15 +686,17 @@
 	from = forward->from_topic;
 	to = forward->to_topic;
 
-	topic_lock_both(to, from);
-	AST_VECTOR_REMOVE_ELEM_UNORDERED(&to->upstream_topics, from,
-		AST_VECTOR_ELEM_CLEANUP_NOOP);
-
-	for (idx = 0; idx < AST_VECTOR_SIZE(&to->subscribers); ++idx) {
-		topic_remove_subscription(from, AST_VECTOR_GET(&to->subscribers, idx));
-	}
-	ao2_unlock(from);
-	ao2_unlock(to);
+	if (from && to) {
+		topic_lock_both(to, from);
+		AST_VECTOR_REMOVE_ELEM_UNORDERED(&to->upstream_topics, from,
+			AST_VECTOR_ELEM_CLEANUP_NOOP);
+
+		for (idx = 0; idx < AST_VECTOR_SIZE(&to->subscribers); ++idx) {
+			topic_remove_subscription(from, AST_VECTOR_GET(&to->subscribers, idx));
+		}
+		ao2_unlock(from);
+		ao2_unlock(to);
+	}
 
 	ao2_cleanup(forward);
 
@@ -715,6 +717,11 @@
 	forward = ao2_alloc_options(sizeof(*forward), forward_dtor, AO2_ALLOC_OPT_LOCK_NOLOCK);
 	if (!forward) {
 		return NULL;
+	}
+
+	/* Forwards to ourselves are implicit. */
+	if (to_topic == from_topic) {
+		return ao2_bump(forward);
 	}
 
 	forward->from_topic = ao2_bump(from_topic);

Modified: branches/12/main/stasis_message.c
URL: http://svnview.digium.com/svn/asterisk/branches/12/main/stasis_message.c?view=diff&rev=414330&r1=414329&r2=414330
==============================================================================
--- branches/12/main/stasis_message.c (original)
+++ branches/12/main/stasis_message.c Thu May 22 06:51:56 2014
@@ -187,3 +187,8 @@
 {
 	return INVOKE_VIRTUAL(to_json, msg, sanitize);
 }
+
+struct ast_event *stasis_message_to_event(struct stasis_message *msg)
+{
+	return INVOKE_VIRTUAL(to_event, msg);
+}

Modified: branches/12/res/res_corosync.c
URL: http://svnview.digium.com/svn/asterisk/branches/12/res/res_corosync.c?view=diff&rev=414330&r1=414329&r2=414330
==============================================================================
--- branches/12/res/res_corosync.c (original)
+++ branches/12/res/res_corosync.c Thu May 22 06:51:56 2014
@@ -44,20 +44,125 @@
 #include "asterisk/event.h"
 #include "asterisk/cli.h"
 #include "asterisk/devicestate.h"
+#include "asterisk/app.h"
+#include "asterisk/stasis.h"
+#include "asterisk/stasis_message_router.h"
 
 AST_RWLOCK_DEFINE_STATIC(event_types_lock);
+
+static void publish_mwi_to_stasis(struct ast_event *event);
+static void publish_device_state_to_stasis(struct ast_event *event);
+
+/*! \brief The internal topic used for message forwarding and pings */
+static struct stasis_topic *corosync_aggregate_topic;
+
+/*! \brief Our \ref stasis message router */
+static struct stasis_message_router *stasis_router;
+
+/*! \brief Internal accessor for our topic */
+static struct stasis_topic *corosync_topic(void)
+{
+	return corosync_aggregate_topic;
+}
+

[... 522 lines stripped ...]



More information about the svn-commits mailing list