[asterisk-commits] mjordan: branch mjordan/12-corosync r413031 - in /team/mjordan/12-corosync: ....

SVN commits to the Asterisk project asterisk-commits at lists.digium.com
Sat Apr 26 16:04:10 CDT 2014


Author: mjordan
Date: Sat Apr 26 16:04:04 2014
New Revision: 413031

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=413031
Log:
res_corosync: get it compiling

Untested, but things should at least not crash and attempt to consume state
from Stasis/publish state to Stasis.

Modified:
    team/mjordan/12-corosync/   (props changed)
    team/mjordan/12-corosync/include/asterisk/devicestate.h
    team/mjordan/12-corosync/include/asterisk/event.h
    team/mjordan/12-corosync/include/asterisk/event_defs.h
    team/mjordan/12-corosync/include/asterisk/stasis.h
    team/mjordan/12-corosync/main/app.c
    team/mjordan/12-corosync/main/devicestate.c
    team/mjordan/12-corosync/main/event.c
    team/mjordan/12-corosync/main/stasis.c
    team/mjordan/12-corosync/main/stasis_message.c
    team/mjordan/12-corosync/main/stasis_message_router.c
    team/mjordan/12-corosync/res/res_corosync.c

Propchange: team/mjordan/12-corosync/
------------------------------------------------------------------------------
    automerge = *

Propchange: team/mjordan/12-corosync/
------------------------------------------------------------------------------
    automerge-email = mjordan at digium.com

Modified: team/mjordan/12-corosync/include/asterisk/devicestate.h
URL: http://svnview.digium.com/svn/asterisk/team/mjordan/12-corosync/include/asterisk/devicestate.h?view=diff&rev=413031&r1=413030&r2=413031
==============================================================================
--- team/mjordan/12-corosync/include/asterisk/devicestate.h (original)
+++ team/mjordan/12-corosync/include/asterisk/devicestate.h Sat Apr 26 16:04:04 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: team/mjordan/12-corosync/include/asterisk/event.h
URL: http://svnview.digium.com/svn/asterisk/team/mjordan/12-corosync/include/asterisk/event.h?view=diff&rev=413031&r1=413030&r2=413031
==============================================================================
--- team/mjordan/12-corosync/include/asterisk/event.h (original)
+++ team/mjordan/12-corosync/include/asterisk/event.h Sat Apr 26 16:04:04 2014
@@ -150,6 +150,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 +222,28 @@
 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 an information element type
  *
  * \param ie_type the information element type to get the string representation of
@@ -272,6 +343,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: team/mjordan/12-corosync/include/asterisk/event_defs.h
URL: http://svnview.digium.com/svn/asterisk/team/mjordan/12-corosync/include/asterisk/event_defs.h?view=diff&rev=413031&r1=413030&r2=413031
==============================================================================
--- team/mjordan/12-corosync/include/asterisk/event_defs.h (original)
+++ team/mjordan/12-corosync/include/asterisk/event_defs.h Sat Apr 26 16:04:04 2014
@@ -25,8 +25,6 @@
 #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. */
@@ -36,12 +34,32 @@
 	 *  \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 */
@@ -50,211 +68,256 @@
 	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,
+	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,
+	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            = 0x0004,
+	 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,
-};
-
-/*!
- * \brief Payload types for event information elements
- */
+	AST_EVENT_IE_TOTAL               = 0x003e,
+};
+
 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: team/mjordan/12-corosync/include/asterisk/stasis.h
URL: http://svnview.digium.com/svn/asterisk/team/mjordan/12-corosync/include/asterisk/stasis.h?view=diff&rev=413031&r1=413030&r2=413031
==============================================================================
--- team/mjordan/12-corosync/include/asterisk/stasis.h (original)
+++ team/mjordan/12-corosync/include/asterisk/stasis.h Sat Apr 26 16:04:04 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.4.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,9 @@
  * \return \c NULL if AMI format is not supported.
  */
 struct ast_manager_event_blob *stasis_message_to_ami(
+	struct stasis_message *message);
+
+struct ast_event *stasis_message_to_event(
 	struct stasis_message *message);
 
 /*! @} */
@@ -1020,6 +1039,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 +1066,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: team/mjordan/12-corosync/main/app.c
URL: http://svnview.digium.com/svn/asterisk/team/mjordan/12-corosync/main/app.c?view=diff&rev=413031&r1=413030&r2=413031
==============================================================================
--- team/mjordan/12-corosync/main/app.c (original)
+++ team/mjordan/12-corosync/main/app.c Sat Apr 26 16:04:04 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_EID, 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: team/mjordan/12-corosync/main/devicestate.c
URL: http://svnview.digium.com/svn/asterisk/team/mjordan/12-corosync/main/devicestate.c?view=diff&rev=413031&r1=413030&r2=413031
==============================================================================
--- team/mjordan/12-corosync/main/devicestate.c (original)
+++ team/mjordan/12-corosync/main/devicestate.c Sat Apr 26 16:04:04 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: team/mjordan/12-corosync/main/event.c
URL: http://svnview.digium.com/svn/asterisk/team/mjordan/12-corosync/main/event.c?view=diff&rev=413031&r1=413030&r2=413031
==============================================================================
--- team/mjordan/12-corosync/main/event.c (original)
+++ team/mjordan/12-corosync/main/event.c Sat Apr 26 16:04:04 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
@@ -257,7 +253,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 +262,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 +281,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 +313,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 +384,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 +409,7 @@
 			break;
 		}
 		case AST_EVENT_IE_PLTYPE_UNKNOWN:
+		case AST_EVENT_IE_PLTYPE_EXISTS:
 			break;
 		}
 
@@ -407,10 +436,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 +454,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: team/mjordan/12-corosync/main/stasis.c
URL: http://svnview.digium.com/svn/asterisk/team/mjordan/12-corosync/main/stasis.c?view=diff&rev=413031&r1=413030&r2=413031
==============================================================================
--- team/mjordan/12-corosync/main/stasis.c (original)
+++ team/mjordan/12-corosync/main/stasis.c Sat Apr 26 16:04:04 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 forward;
 	}
 
 	forward->from_topic = ao2_bump(from_topic);

Modified: team/mjordan/12-corosync/main/stasis_message.c
URL: http://svnview.digium.com/svn/asterisk/team/mjordan/12-corosync/main/stasis_message.c?view=diff&rev=413031&r1=413030&r2=413031
==============================================================================
--- team/mjordan/12-corosync/main/stasis_message.c (original)
+++ team/mjordan/12-corosync/main/stasis_message.c Sat Apr 26 16:04:04 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: team/mjordan/12-corosync/main/stasis_message_router.c
URL: http://svnview.digium.com/svn/asterisk/team/mjordan/12-corosync/main/stasis_message_router.c?view=diff&rev=413031&r1=413030&r2=413031
==============================================================================
--- team/mjordan/12-corosync/main/stasis_message_router.c (original)
+++ team/mjordan/12-corosync/main/stasis_message_router.c Sat Apr 26 16:04:04 2014
@@ -175,7 +175,7 @@
 	if (route == NULL) {
 		/* Find a regular route */
 		route = route_table_find(&router->routes, type);
-	}
+	}	
 
 	if (route == NULL && router->default_route.callback) {
 		/* Maybe the default route, then? */
@@ -282,7 +282,7 @@
 	if (!message_type) {
 		/* Cannot route to NULL type. */
 		return -1;
-	}
+	}	
 	ao2_lock(router);
 	res = route_table_add(&router->routes, message_type, callback, data);
 	ao2_unlock(router);

Modified: team/mjordan/12-corosync/res/res_corosync.c
URL: http://svnview.digium.com/svn/asterisk/team/mjordan/12-corosync/res/res_corosync.c?view=diff&rev=413031&r1=413030&r2=413031
==============================================================================
--- team/mjordan/12-corosync/res/res_corosync.c (original)
+++ team/mjordan/12-corosync/res/res_corosync.c Sat Apr 26 16:04:04 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;
+}
+
+/*! \brief A payload wrapper around a corosync ping event */
+struct corosync_ping_payload {
+	/*! The corosync ping event being passed over \ref stasis */
+	struct ast_event *event;
+};
+
+/*! \brief Destructor for the \ref corosync_ping_payload wrapper object */
+static void corosync_ping_payload_dtor(void *obj)
+{
+	struct corosync_ping_payload *payload = obj;
+
+	ast_free(payload->event);
+}
+
+/*! \brief Convert a Corosync PING to a \ref ast_event */
+static struct ast_event *corosync_ping_to_event(struct stasis_message *message)
+{
+	struct corosync_ping_payload *payload;
+	struct ast_event *event;
+	struct ast_eid *event_eid;
+
+	if (!message) {
+		return NULL;
+	}
+
+	payload = stasis_message_data(message);
+
+	if (!payload->event) {
+		return NULL;
+	}
+
+	event_eid = (struct ast_eid *)ast_event_get_ie_raw(payload->event, AST_EVENT_IE_EID);
+
+	event = ast_event_new(AST_EVENT_PING,
+				AST_EVENT_IE_EID, AST_EVENT_IE_PLTYPE_RAW, event_eid, sizeof(*event_eid),
+				AST_EVENT_IE_END);
+
+	return event;
+}
+
+STASIS_MESSAGE_TYPE_DEFN_LOCAL(corosync_ping_message_type,
+	.to_event = corosync_ping_to_event, );
+
+/*! \brief Publish a Corosync ping to \ref stasis */
+static void publish_corosync_ping_to_stasis(struct ast_event *event)
+{
+	struct corosync_ping_payload *payload;
+	struct stasis_message *message;
+
+	ast_assert(ast_event_get_type(event) == AST_EVENT_PING);
+	ast_assert(event != NULL);
+
+	payload = ao2_t_alloc(sizeof(*payload), corosync_ping_payload_dtor, "Create ping payload");
+	if (!payload) {
+		return;
+	}
+	payload->event = event;
+
+	message = stasis_message_create(corosync_ping_message_type(), payload);
+	if (!message) {
+		ao2_t_ref(payload, -1, "Destroy payload on off nominal");
+		return;
+	}
+
+	stasis_publish(corosync_topic(), message);
+
+	ao2_t_ref(payload, -1, "Hand ref to stasis");
+	ao2_t_ref(message, -1, "Hand ref to stasis");
+}
 
 static struct {
 	const char *name;
-	struct ast_event_sub *sub;
+	struct stasis_forward *sub;
 	unsigned char publish;
 	unsigned char publish_default;
 	unsigned char subscribe;
 	unsigned char subscribe_default;
+	struct stasis_topic *(* topic_fn)(void);
+	struct stasis_cache *(* cache_fn)(void);
+	struct stasis_message_type *(* message_type_fn)(void);
+	void (* publish_to_stasis)(struct ast_event *);
 } event_types[] = {
-	[AST_EVENT_MWI] = { .name = "mwi", },
-	[AST_EVENT_DEVICE_STATE_CHANGE] = { .name = "device_state", },
-	[AST_EVENT_PING] = { .name = "ping", .publish_default = 1, .subscribe_default = 1 },
+	[AST_EVENT_MWI] = { .name = "mwi",
+						.topic_fn = ast_mwi_topic_all,
+						.cache_fn = ast_mwi_state_cache, 
+						.message_type_fn = ast_mwi_state_type,
+						.publish_to_stasis = publish_mwi_to_stasis, },
+	[AST_EVENT_DEVICE_STATE_CHANGE] = { .name = "device_state",
+										.topic_fn = ast_device_state_topic_all,
+										.cache_fn = ast_device_state_cache,
+										.message_type_fn = ast_device_state_message_type,
+										.publish_to_stasis = publish_device_state_to_stasis, },
+	[AST_EVENT_PING] = { .name = "ping",
+						 .publish_default = 1,
+						 .subscribe_default = 1,
+						 .topic_fn = corosync_topic,
+						 .message_type_fn = corosync_ping_message_type,
+						 .publish_to_stasis = publish_corosync_ping_to_stasis, },
 };
 
 static struct {
@@ -88,6 +193,73 @@
 	.corosync_cfg_shutdown_callback = cfg_shutdown_cb,
 };
 
+/*! \brief Publish a received MWI \ref ast_event to \ref stasis */
+static void publish_mwi_to_stasis(struct ast_event *event)
+{
+	const char *mailbox;
+	const char *context;
+	unsigned int new_msgs;
+	unsigned int old_msgs;
+	struct ast_eid *event_eid;
+
+	ast_assert(ast_event_get_type(event) == AST_EVENT_MWI);
+
+	mailbox = ast_event_get_ie_str(event, AST_EVENT_IE_MAILBOX);
+	context = ast_event_get_ie_str(event, AST_EVENT_IE_CONTEXT);
+	new_msgs = ast_event_get_ie_uint(event, AST_EVENT_IE_NEWMSGS);
+	old_msgs = ast_event_get_ie_uint(event, AST_EVENT_IE_OLDMSGS);
+	event_eid = (struct ast_eid *)ast_event_get_ie_raw(event, AST_EVENT_IE_EID);
+
+	if (ast_strlen_zero(mailbox) || ast_strlen_zero(context)) {
+		return;
+	}
+
+	if (new_msgs > INT_MAX) {
+		new_msgs = INT_MAX;
+	}
+
+	if (old_msgs > INT_MAX) {
+		old_msgs = INT_MAX;
+	}
+
+	if (ast_publish_mwi_state_full(mailbox,
+			context, (int)new_msgs, (int)old_msgs,
+			NULL, event_eid)) {
+		char eid[16];
+		ast_eid_to_str(eid, sizeof(eid), event_eid);
+		ast_log(AST_LOG_WARNING, "Failed to publish MWI message for %s@%s from %s\n",
+			mailbox, context, eid);
+	}
+}
+
+/*! \brief Publish a received device state \ref ast_event to \ref stasis */
+static void publish_device_state_to_stasis(struct ast_event *event)
+{
+	const char *device;
+	enum ast_device_state state;
+	unsigned int cachable;
+	struct ast_eid *event_eid;
+
+	ast_assert(ast_event_get_type(event) == AST_EVENT_DEVICE_STATE_CHANGE);
+
+	device = ast_event_get_ie_str(event, AST_EVENT_IE_DEVICE);
+	state = ast_event_get_ie_uint(event, AST_EVENT_IE_STATE);
+	cachable = ast_event_get_ie_uint(event, AST_EVENT_IE_CACHABLE);
+	event_eid = (struct ast_eid *)ast_event_get_ie_raw(event, AST_EVENT_IE_EID);
+
+	if (ast_strlen_zero(device)) {
+		return;
+	}
+
+	if (ast_publish_device_state_full(device,
+			state, cachable, event_eid)) {
+		char eid[16];
+		ast_eid_to_str(eid, sizeof(eid), event_eid);
+		ast_log(AST_LOG_WARNING, "Failed to publish device state message for %s from %s\n",
+			device, eid);
+	}
+}
+
 static void cpg_deliver_cb(cpg_handle_t handle, const struct cpg_name *group_name,
 		uint32_t nodeid, uint32_t pid, void *msg, size_t msg_len);
 
@@ -101,7 +273,7 @@
 	.cpg_confchg_fn = cpg_confchg_cb,
 };
 
-static void ast_event_cb(const struct ast_event *event, void *data);
+/*static void ast_event_cb(const struct ast_event *event, void *data);*/
 
 #ifdef HAVE_COROSYNC_CFG_STATE_TRACK
 static void cfg_state_track_cb(
@@ -120,6 +292,8 @@
 		uint32_t nodeid, uint32_t pid, void *msg, size_t msg_len)
 {
 	struct ast_event *event;
+	void (*publish_handler)(struct ast_event *) = NULL;
+	enum ast_event_type event_type;
 
 	if (msg_len < ast_event_minimum_length()) {
 		ast_debug(1, "Ignoring event that's too small. %u < %u\n",
@@ -133,9 +307,19 @@
 		return;
 	}
 
+	event_type = ast_event_get_type(msg);
+	if (event_type > AST_EVENT_TOTAL) {
+		/* Egads, we don't support this */
+		return;
+	}
+
 	ast_rwlock_rdlock(&event_types_lock);
-	if (!event_types[ast_event_get_type(msg)].subscribe) {
-		/* We are not configured to subscribe to these events. */
+	ast_log(AST_LOG_NOTICE, "GOT EVENT TYPE %d\n", event_type);
+	publish_handler = event_types[event_type].publish_to_stasis;
+	if (!event_types[event_type].subscribe ||
+		!publish_handler) {
+		/* We are not configured to subscribe to these events or
+		   we have no way to publish it internally. */
 		ast_rwlock_unlock(&event_types_lock);
 		return;
 	}
@@ -154,11 +338,67 @@
 		eid = ast_event_get_ie_raw(event, AST_EVENT_IE_EID);
 		ast_eid_to_str(buf, sizeof(buf), (struct ast_eid *) eid);
 		ast_log(LOG_NOTICE, "(cpg_deliver_cb) Got event PING from server with EID: '%s'\n", buf);
-
-		ast_event_queue(event);
-	} else {
-		ast_event_queue_and_cache(event);
-	}
+	}
+	publish_handler(event);
+}
+
+static void publish_to_corosync(struct stasis_message *message)
+{
+	cs_error_t cs_err;
+	struct iovec iov;
+	struct ast_event *event;
+
+	event = stasis_message_to_event(message);
+	if (!event) {
+		return;
+	}
+
+	if (ast_event_get_type(event) == AST_EVENT_PING) {
+		const struct ast_eid *eid;
+		char buf[128] = "";
+
+		eid = ast_event_get_ie_raw(event, AST_EVENT_IE_EID);
+		ast_eid_to_str(buf, sizeof(buf), (struct ast_eid *) eid);
+		ast_log(LOG_NOTICE, "(ast_event_cb) Got event PING from server with EID: '%s'\n", buf);
+	}
+
+	if (ast_eid_cmp(&ast_eid_default,
+			ast_event_get_ie_raw(event, AST_EVENT_IE_EID))) {
+		/* If the event didn't originate from this server, don't send it back out. */
+		ast_free(event);
+		return;
+	}
+

[... 222 lines stripped ...]



More information about the asterisk-commits mailing list