[asterisk-commits] murf: branch murf/newcdr r62340 - in
/team/murf/newcdr: apps/ build_tools/ ce...
asterisk-commits at lists.digium.com
asterisk-commits at lists.digium.com
Sat Apr 28 23:01:08 MST 2007
Author: murf
Date: Sun Apr 29 01:01:07 2007
New Revision: 62340
URL: http://svn.digium.com/view/asterisk?view=rev&rev=62340
Log:
Got things to compile again after the conflicts were completely (I hope) resolved
Modified:
team/murf/newcdr/apps/app_voicemail.c
team/murf/newcdr/build_tools/prep_moduledeps
team/murf/newcdr/cel/cel_csv.c
team/murf/newcdr/cel/cel_custom.c
team/murf/newcdr/cel/cel_manager.c
team/murf/newcdr/channels/chan_iax2.c
team/murf/newcdr/channels/chan_mgcp.c
team/murf/newcdr/channels/chan_sip.c
team/murf/newcdr/channels/chan_zap.c
team/murf/newcdr/include/asterisk/cel.h
team/murf/newcdr/include/asterisk/event.h
team/murf/newcdr/include/asterisk/event_defs.h
team/murf/newcdr/main/cel.c
team/murf/newcdr/main/event.c
Modified: team/murf/newcdr/apps/app_voicemail.c
URL: http://svn.digium.com/view/asterisk/team/murf/newcdr/apps/app_voicemail.c?view=diff&rev=62340&r1=62339&r2=62340
==============================================================================
--- team/murf/newcdr/apps/app_voicemail.c (original)
+++ team/murf/newcdr/apps/app_voicemail.c Sun Apr 29 01:01:07 2007
@@ -7461,11 +7461,11 @@
{
pthread_attr_t attr;
- mwi_sub_sub = ast_event_subscribe(AST_EVENT_SUB, mwi_sub_event_cb, NULL,
+ mwi_sub_sub = ast_event_subscribe(AST_EVENT_SUB, mwi_sub_event_cb, "Voicemail MWI subscription", NULL,
AST_EVENT_IE_EVENTTYPE, AST_EVENT_IE_PLTYPE_UINT, AST_EVENT_MWI,
AST_EVENT_IE_END);
- mwi_unsub_sub = ast_event_subscribe(AST_EVENT_UNSUB, mwi_unsub_event_cb, NULL,
+ mwi_unsub_sub = ast_event_subscribe(AST_EVENT_UNSUB, mwi_unsub_event_cb, "Voicemail MWI subscription", NULL,
AST_EVENT_IE_EVENTTYPE, AST_EVENT_IE_PLTYPE_UINT, AST_EVENT_MWI,
AST_EVENT_IE_END);
Modified: team/murf/newcdr/build_tools/prep_moduledeps
URL: http://svn.digium.com/view/asterisk/team/murf/newcdr/build_tools/prep_moduledeps?view=diff&rev=62340&r1=62339&r2=62340
==============================================================================
--- team/murf/newcdr/build_tools/prep_moduledeps (original)
+++ team/murf/newcdr/build_tools/prep_moduledeps Sun Apr 29 01:01:07 2007
@@ -34,6 +34,7 @@
rm -f .makeoptstmp
process_dir apps app APPS Applications
process_dir cdr cdr CDR "Call Detail Recording"
+process_dir cel cel CEL "Channel Event Logging"
process_dir channels chan CHANNELS "Channel Drivers"
process_dir codecs codec CODECS "Codec Translators"
process_dir formats format FORMATS "Format Interpreters"
Modified: team/murf/newcdr/cel/cel_csv.c
URL: http://svn.digium.com/view/asterisk/team/murf/newcdr/cel/cel_csv.c?view=diff&rev=62340&r1=62339&r2=62340
==============================================================================
--- team/murf/newcdr/cel/cel_csv.c (original)
+++ team/murf/newcdr/cel/cel_csv.c Sun Apr 29 01:01:07 2007
@@ -264,12 +264,12 @@
/* Make sure we have a big enough buf */
char buf[1024];
char csvmaster[PATH_MAX];
- const struct ast_channel *chan;
+ struct ast_channel *chan;
enum ast_cel_eventtype eventtype;
const char *userdefname = 0;
time_t eventtime = 0;
- chan = ast_event_get_ie_raw(event, AST_EVENT_IE_CHANPTR);
+ chan = (struct ast_channel *)ast_event_get_ie_raw(event, AST_EVENT_IE_CHANPTR);
eventtype = (enum ast_cel_eventtype)ast_event_get_ie_uint(event, AST_EVENT_IE_CEL_EVENT_TYPE);
eventtime = (time_t)ast_event_get_ie_uint(event, AST_EVENT_IE_CEL_EVENT_TIME);
if (eventtype == CEL_USER_DEFINED)
Modified: team/murf/newcdr/cel/cel_custom.c
URL: http://svn.digium.com/view/asterisk/team/murf/newcdr/cel/cel_custom.c?view=diff&rev=62340&r1=62339&r2=62340
==============================================================================
--- team/murf/newcdr/cel/cel_custom.c (original)
+++ team/murf/newcdr/cel/cel_custom.c Sun Apr 29 01:01:07 2007
@@ -107,7 +107,7 @@
{
/* Make sure we have a big enough buf */
char buf[2048];
- const struct ast_channel *chan;
+ struct ast_channel *chan;
enum ast_cel_eventtype eventtype;
const char *userdefname = 0;
time_t eventtime = 0;
@@ -116,7 +116,7 @@
if (ast_strlen_zero(master))
return;
- chan = ast_event_get_ie_raw(event, AST_EVENT_IE_CHANPTR);
+ chan = (struct ast_channel *)ast_event_get_ie_raw(event, AST_EVENT_IE_CHANPTR);
eventtype = (enum ast_cel_eventtype)ast_event_get_ie_uint(event, AST_EVENT_IE_CEL_EVENT_TYPE);
eventtime = (time_t)ast_event_get_ie_uint(event, AST_EVENT_IE_CEL_EVENT_TIME);
if (eventtype == CEL_USER_DEFINED)
Modified: team/murf/newcdr/cel/cel_manager.c
URL: http://svn.digium.com/view/asterisk/team/murf/newcdr/cel/cel_manager.c?view=diff&rev=62340&r1=62339&r2=62340
==============================================================================
--- team/murf/newcdr/cel/cel_manager.c (original)
+++ team/murf/newcdr/cel/cel_manager.c Sun Apr 29 01:01:07 2007
@@ -90,7 +90,7 @@
time_t t;
struct tm timeresult;
char strStartTime[80] = "";
- const struct ast_channel *chan;
+ struct ast_channel *chan;
enum ast_cel_eventtype eventtype;
const char *userdefname = 0;
time_t eventtime = 0;
@@ -98,7 +98,7 @@
if (!enablecel)
return;
- chan = ast_event_get_ie_raw(event, AST_EVENT_IE_CHANPTR);
+ chan = (struct ast_channel *)ast_event_get_ie_raw(event, AST_EVENT_IE_CHANPTR);
eventtype = (enum ast_cel_eventtype)ast_event_get_ie_uint(event, AST_EVENT_IE_CEL_EVENT_TYPE);
eventtime = (time_t)ast_event_get_ie_uint(event, AST_EVENT_IE_CEL_EVENT_TIME);
if (eventtype == CEL_USER_DEFINED)
Modified: team/murf/newcdr/channels/chan_iax2.c
URL: http://svn.digium.com/view/asterisk/team/murf/newcdr/channels/chan_iax2.c?view=diff&rev=62340&r1=62339&r2=62340
==============================================================================
--- team/murf/newcdr/channels/chan_iax2.c (original)
+++ team/murf/newcdr/channels/chan_iax2.c Sun Apr 29 01:01:07 2007
@@ -8808,7 +8808,7 @@
ast_free_ha(oldha);
if (!ast_strlen_zero(peer->mailbox)) {
- peer->mwi_event_sub = ast_event_subscribe(AST_EVENT_MWI, mwi_event_cb, NULL,
+ peer->mwi_event_sub = ast_event_subscribe(AST_EVENT_MWI, mwi_event_cb, "IAX MWI subscription", NULL,
AST_EVENT_IE_MAILBOX, AST_EVENT_IE_PLTYPE_STR, peer->mailbox,
AST_EVENT_IE_END);
}
Modified: team/murf/newcdr/channels/chan_mgcp.c
URL: http://svn.digium.com/view/asterisk/team/murf/newcdr/channels/chan_mgcp.c?view=diff&rev=62340&r1=62339&r2=62340
==============================================================================
--- team/murf/newcdr/channels/chan_mgcp.c (original)
+++ team/murf/newcdr/channels/chan_mgcp.c Sun Apr 29 01:01:07 2007
@@ -3765,7 +3765,7 @@
ast_copy_string(e->musicclass, musicclass, sizeof(e->musicclass));
ast_copy_string(e->mailbox, mailbox, sizeof(e->mailbox));
if (!ast_strlen_zero(e->mailbox)) {
- e->mwi_event_sub = ast_event_subscribe(AST_EVENT_MWI, mwi_event_cb, NULL,
+ e->mwi_event_sub = ast_event_subscribe(AST_EVENT_MWI, mwi_event_cb, "MGCP MWI subscription", NULL,
AST_EVENT_IE_MAILBOX, AST_EVENT_IE_PLTYPE_STR, e->mailbox,
AST_EVENT_IE_NEWMSGS, AST_EVENT_IE_PLTYPE_EXISTS,
AST_EVENT_IE_END);
Modified: team/murf/newcdr/channels/chan_sip.c
URL: http://svn.digium.com/view/asterisk/team/murf/newcdr/channels/chan_sip.c?view=diff&rev=62340&r1=62339&r2=62340
==============================================================================
--- team/murf/newcdr/channels/chan_sip.c (original)
+++ team/murf/newcdr/channels/chan_sip.c Sun Apr 29 01:01:07 2007
@@ -15240,7 +15240,7 @@
p->subscribed = MWI_NOTIFICATION;
if (ast_test_flag(&authpeer->flags[1], SIP_PAGE2_SUBSCRIBEMWIONLY)) {
- authpeer->mwi_event_sub = ast_event_subscribe(AST_EVENT_MWI, mwi_event_cb, authpeer,
+ authpeer->mwi_event_sub = ast_event_subscribe(AST_EVENT_MWI, mwi_event_cb, "SIP MWI subscription", authpeer,
AST_EVENT_IE_MAILBOX, AST_EVENT_IE_PLTYPE_STR, authpeer->mailbox,
AST_EVENT_IE_END);
}
@@ -16934,7 +16934,7 @@
* subscribe to it now. */
if (!ast_test_flag(&peer->flags[1], SIP_PAGE2_SUBSCRIBEMWIONLY) &&
!ast_strlen_zero(peer->mailbox)) {
- peer->mwi_event_sub = ast_event_subscribe(AST_EVENT_MWI, mwi_event_cb, peer,
+ peer->mwi_event_sub = ast_event_subscribe(AST_EVENT_MWI, mwi_event_cb, "SIP MWI subscription", peer,
AST_EVENT_IE_MAILBOX, AST_EVENT_IE_PLTYPE_STR, peer->mailbox,
AST_EVENT_IE_END);
/* Send MWI from the event cache only. This is so we can send initial
Modified: team/murf/newcdr/channels/chan_zap.c
URL: http://svn.digium.com/view/asterisk/team/murf/newcdr/channels/chan_zap.c?view=diff&rev=62340&r1=62339&r2=62340
==============================================================================
--- team/murf/newcdr/channels/chan_zap.c (original)
+++ team/murf/newcdr/channels/chan_zap.c Sun Apr 29 01:01:07 2007
@@ -7899,7 +7899,7 @@
ast_copy_string(tmp->cid_name, conf.chan.cid_name, sizeof(tmp->cid_name));
ast_copy_string(tmp->mailbox, conf.chan.mailbox, sizeof(tmp->mailbox));
if (!ast_strlen_zero(tmp->mailbox)) {
- tmp->mwi_event_sub = ast_event_subscribe(AST_EVENT_MWI, mwi_event_cb, NULL,
+ tmp->mwi_event_sub = ast_event_subscribe(AST_EVENT_MWI, mwi_event_cb, "Zaptel MWI subscription", NULL,
AST_EVENT_IE_MAILBOX, AST_EVENT_IE_PLTYPE_STR, tmp->mailbox,
AST_EVENT_IE_NEWMSGS, AST_EVENT_IE_PLTYPE_EXISTS,
AST_EVENT_IE_END);
Modified: team/murf/newcdr/include/asterisk/cel.h
URL: http://svn.digium.com/view/asterisk/team/murf/newcdr/include/asterisk/cel.h?view=diff&rev=62340&r1=62339&r2=62340
==============================================================================
--- team/murf/newcdr/include/asterisk/cel.h (original)
+++ team/murf/newcdr/include/asterisk/cel.h Sun Apr 29 01:01:07 2007
@@ -104,7 +104,7 @@
int ast_cel_setvar(struct ast_channel *chan, const char *name, const char *value);
-void cel_set_backend_channel_vars(const struct ast_channel *chan, enum ast_cel_eventtype eventtype, const char *usereventname, time_t eventtime);
+void cel_set_backend_channel_vars(struct ast_channel *chan, enum ast_cel_eventtype eventtype, const char *usereventname, time_t eventtime);
/*! Frees the cel struct */
void ast_cel_destroy(struct ast_cel *cel);
Modified: team/murf/newcdr/include/asterisk/event.h
URL: http://svn.digium.com/view/asterisk/team/murf/newcdr/include/asterisk/event.h?view=diff&rev=62340&r1=62339&r2=62340
==============================================================================
--- team/murf/newcdr/include/asterisk/event.h (original)
+++ team/murf/newcdr/include/asterisk/event.h Sun Apr 29 01:01:07 2007
@@ -103,7 +103,7 @@
* pointer to the peer.
*/
struct ast_event_sub *ast_event_subscribe(enum ast_event_type event_type,
- ast_event_cb_t cb, char *description, void *userdata, ...);
+ ast_event_cb_t cb, char *description, void *userdata, ...);
/*!
* \brief Un-subscribe from events
Modified: team/murf/newcdr/include/asterisk/event_defs.h
URL: http://svn.digium.com/view/asterisk/team/murf/newcdr/include/asterisk/event_defs.h?view=diff&rev=62340&r1=62339&r2=62340
==============================================================================
--- team/murf/newcdr/include/asterisk/event_defs.h (original)
+++ team/murf/newcdr/include/asterisk/event_defs.h Sun Apr 29 01:01:07 2007
@@ -1,4 +1,3 @@
-<<<<<<< .working
/*
* Asterisk -- An open source telephony toolkit.
*
@@ -147,125 +146,3 @@
struct ast_event_sub;
#endif /* AST_EVENT_DEFS_H */
-=======
-/*
- * Asterisk -- An open source telephony toolkit.
- *
- * Copyright (C) 2007, Digium, Inc.
- *
- * Russell Bryant <russell at digium.com>
- *
- * See http://www.asterisk.org for more information about
- * the Asterisk project. Please do not directly contact
- * any of the maintainers of this project for assistance;
- * the project provides a web site, mailing lists and IRC
- * channels for your use.
- *
- * This program is free software, distributed under the terms of
- * the GNU General Public License Version 2. See the LICENSE file
- * at the top of the source tree.
- */
-
-/*!
- * \file
- * \author Russell Bryant <russell at digium.com>
- * \brief Generic event system
- */
-
-#ifndef AST_EVENT_DEFS_H
-#define AST_EVENT_DEFS_H
-
-/*! \brief Event types
- * \note These values can *never* change. */
-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.
- \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 = 0x03,
- /*! Someone has unsubscribed from events */
- AST_EVENT_UNSUB = 0x04,
- /*! Number of event types. This should be the last event type + 1 */
- AST_EVENT_TOTAL = 0x05,
-};
-
-/*! \brief Event Information Element types */
-enum ast_event_ie_type {
- /*! 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 = 0x01,
- /*!
- * \brief Number of
- * Used by: AST_EVENT_MWI
- * Payload type: UINT
- */
- AST_EVENT_IE_OLDMSGS = 0x02,
- /*!
- * \brief Mailbox name (mailbox[@context])
- * Used by: AST_EVENT_MWI
- * Payload type: STR
- */
- AST_EVENT_IE_MAILBOX = 0x03,
- /*!
- * \brief Unique ID
- * Used by: AST_EVENT_SUB, AST_EVENT_UNSUB
- * Payload type: UINT
- */
- AST_EVENT_IE_UNIQUEID = 0x04,
- /*!
- * \brief Event type
- * Used by: AST_EVENT_SUB, AST_EVENT_UNSUB
- * Payload type: UINT
- */
- AST_EVENT_IE_EVENTTYPE = 0x05,
- /*!
- * \brief Hint that someone cares than an IE exists
- * Used by: AST_EVENT_SUB
- * Payload type: UINT (ast_event_ie_type)
- */
- AST_EVENT_IE_EXISTS = 0x06,
-};
-
-/*!
- * \brief Payload types for event information elements
- */
-enum ast_event_ie_pltype {
- /*! 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,
-};
-
-/*!
- * \brief Results for checking for subscribers
- *
- * \ref ast_event_check_subscriber()
- */
-enum ast_event_subscriber_res {
- /*! No subscribers exist */
- AST_EVENT_SUB_NONE,
- /*! At least one subscriber exists */
- AST_EVENT_SUB_EXISTS,
-};
-
-struct ast_event;
-struct ast_event_ie;
-struct ast_event_sub;
-
-#endif /* AST_EVENT_DEFS_H */
->>>>>>> .merge-right.r62300
Modified: team/murf/newcdr/main/cel.c
URL: http://svn.digium.com/view/asterisk/team/murf/newcdr/main/cel.c?view=diff&rev=62340&r1=62339&r2=62340
==============================================================================
--- team/murf/newcdr/main/cel.c (original)
+++ team/murf/newcdr/main/cel.c Sun Apr 29 01:01:07 2007
@@ -337,7 +337,7 @@
*ret = workspace;
}
-void cel_set_backend_channel_vars(const struct ast_channel *chan, enum ast_cel_eventtype eventtype, const char *usereventname, time_t eventtime)
+void cel_set_backend_channel_vars(struct ast_channel *chan, enum ast_cel_eventtype eventtype, const char *usereventname, time_t eventtime)
{
/* set the eventtime, eventtype fields */
Modified: team/murf/newcdr/main/event.c
URL: http://svn.digium.com/view/asterisk/team/murf/newcdr/main/event.c?view=diff&rev=62340&r1=62339&r2=62340
==============================================================================
--- team/murf/newcdr/main/event.c (original)
+++ team/murf/newcdr/main/event.c Sun Apr 29 01:01:07 2007
@@ -807,779 +807,3 @@
ast_pthread_create_background(&dont_care, NULL, ast_event_dispatcher, NULL);
}
}
-=======
-/*
- * Asterisk -- An open source telephony toolkit.
- *
- * Copyright (C) 2007, Digium, Inc.
- *
- * Russell Bryant <russell at digium.com>
- *
- * See http://www.asterisk.org for more information about
- * the Asterisk project. Please do not directly contact
- * any of the maintainers of this project for assistance;
- * the project provides a web site, mailing lists and IRC
- * channels for your use.
- *
- * This program is free software, distributed under the terms of
- * the GNU General Public License Version 2. See the LICENSE file
- * at the top of the source tree.
- */
-
-/*! \file
- *
- * \brief Internal generic event system
- *
- * \author Russell Bryant <russell at digium.com>
- */
-
-#include "asterisk.h"
-
-ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
-
-#include <stdlib.h>
-#include <stdio.h>
-
-#include "asterisk/event.h"
-#include "asterisk/linkedlists.h"
-#include "asterisk/lock.h"
-#include "asterisk/utils.h"
-
-#define NUM_EVENT_THREADS 5
-
-struct ast_event_ie {
- enum ast_event_ie_type ie_type:16;
- /*! Total length of the IE payload */
- uint16_t ie_payload_len;
- unsigned char ie_payload[0];
-} __attribute__ ((packed));
-
-/*!
- * \brief An event
- *
- * \note The format of this structure is important, and can not change, since
- * they are sent directly over the network (via IAX2).
- *
- */
-struct ast_event {
- /*! Event type */
- enum ast_event_type type:16;
- /*! Total length of the event */
- uint16_t event_len:16;
- /*! The data payload of the event, made up of information elements */
- unsigned char payload[0];
-} __attribute__ ((packed));
-
-struct ast_event_ref {
- struct ast_event *event;
- AST_LIST_ENTRY(ast_event_ref) entry;
-};
-
-/*! \brief data shared between event dispatching threads */
-static struct {
- ast_cond_t cond;
- ast_mutex_t lock;
- AST_LIST_HEAD_NOLOCK(, ast_event_ref) event_q;
-} event_thread = {
- .lock = AST_MUTEX_INIT_VALUE,
-};
-
-struct ast_event_ie_val {
- AST_LIST_ENTRY(ast_event_ie_val) entry;
- enum ast_event_ie_type ie_type;
- enum ast_event_ie_pltype ie_pltype;
- union {
- uint32_t uint;
- const char *str;
- } payload;
-};
-
-/*! \brief Event subscription */
-struct ast_event_sub {
- enum ast_event_type type;
- ast_event_cb_t cb;
- void *userdata;
- uint32_t uniqueid;
- AST_LIST_HEAD_NOLOCK(, ast_event_ie_val) ie_vals;
- AST_RWLIST_ENTRY(ast_event_sub) entry;
-};
-
-static uint32_t sub_uniqueid;
-
-/*! \brief Event subscriptions
- * The event subscribers are indexed by which event they are subscribed to */
-static AST_RWLIST_HEAD(ast_event_sub_list, ast_event_sub) ast_event_subs[AST_EVENT_TOTAL];
-
-/*! \brief Cached events
- * The event cache is indexed on the event type. The purpose of this is
- * for events that express some sort of state. So, when someone first
- * needs to know this state, it can get the last known state from the cache. */
-static AST_RWLIST_HEAD(ast_event_ref_list, ast_event_ref) ast_event_cache[AST_EVENT_TOTAL];
-
-static void ast_event_ie_val_destroy(struct ast_event_ie_val *ie_val)
-{
- if (ie_val->ie_pltype == AST_EVENT_IE_PLTYPE_STR)
- free((void *) ie_val->payload.str);
-
- free(ie_val);
-}
-
-enum ast_event_subscriber_res ast_event_check_subscriber(enum ast_event_type type, ...)
-{
- va_list ap;
- enum ast_event_ie_type ie_type;
- enum ast_event_subscriber_res res = AST_EVENT_SUB_NONE;
- struct ast_event_ie_val *ie_val, *sub_ie_val;
- struct ast_event_sub *sub;
- AST_LIST_HEAD_NOLOCK_STATIC(ie_vals, ast_event_ie_val);
-
- if (type >= AST_EVENT_TOTAL) {
- ast_log(LOG_ERROR, "%u is an invalid type!\n", type);
- return res;
- }
-
- va_start(ap, type);
- for (ie_type = va_arg(ap, enum ast_event_type);
- ie_type != AST_EVENT_IE_END;
- ie_type = va_arg(ap, enum ast_event_type))
- {
- struct ast_event_ie_val *ie_val = alloca(sizeof(*ie_val));
- memset(ie_val, 0, sizeof(*ie_val));
- ie_val->ie_type = ie_type;
- ie_val->ie_pltype = va_arg(ap, enum ast_event_ie_pltype);
- if (ie_val->ie_pltype == AST_EVENT_IE_PLTYPE_UINT)
- ie_val->payload.uint = va_arg(ap, uint32_t);
- else if (ie_val->ie_pltype == AST_EVENT_IE_PLTYPE_STR)
- ie_val->payload.str = ast_strdupa(va_arg(ap, const char *));
- AST_LIST_INSERT_TAIL(&ie_vals, ie_val, entry);
- }
- va_end(ap);
-
- AST_RWLIST_RDLOCK(&ast_event_subs[type]);
- AST_RWLIST_TRAVERSE(&ast_event_subs[type], sub, entry) {
- AST_LIST_TRAVERSE(&ie_vals, ie_val, entry) {
- AST_LIST_TRAVERSE(&sub->ie_vals, sub_ie_val, entry) {
- if (sub_ie_val->ie_type == ie_val->ie_type)
- break;
- }
- if (!sub_ie_val) {
- if (ie_val->ie_pltype == AST_EVENT_IE_PLTYPE_EXISTS)
- break;
- continue;
- }
- /* The subscriber doesn't actually care what the value is */
- if (sub_ie_val->ie_pltype == AST_EVENT_IE_PLTYPE_EXISTS)
- continue;
- if (ie_val->ie_pltype == AST_EVENT_IE_PLTYPE_UINT &&
- ie_val->payload.uint != sub_ie_val->payload.uint)
- break;
- if (ie_val->ie_pltype == AST_EVENT_IE_PLTYPE_STR &&
- strcmp(ie_val->payload.str, sub_ie_val->payload.str))
- break;
- }
- if (!ie_val)
- break;
- }
- AST_RWLIST_UNLOCK(&ast_event_subs[type]);
-
- if (sub) /* All parameters were matched */
- return AST_EVENT_SUB_EXISTS;
-
- AST_RWLIST_RDLOCK(&ast_event_subs[AST_EVENT_ALL]);
- if (!AST_LIST_EMPTY(&ast_event_subs[AST_EVENT_ALL]))
- res = AST_EVENT_SUB_EXISTS;
- AST_RWLIST_UNLOCK(&ast_event_subs[AST_EVENT_ALL]);
-
- return res;
-}
-
-/*! Send AST_EVENT_SUB events to this subscriber of ... subscriber events */
-void ast_event_report_subs(const struct ast_event_sub *event_sub)
-{
- struct ast_event *event;
- struct ast_event_sub *sub;
- enum ast_event_type event_type = -1;
- struct ast_event_ie_val *ie_val;
-
- if (event_sub->type != AST_EVENT_SUB)
- return;
-
- AST_LIST_TRAVERSE(&event_sub->ie_vals, ie_val, entry) {
- if (ie_val->ie_type == AST_EVENT_IE_EVENTTYPE) {
- event_type = ie_val->payload.uint;
- break;
- }
- }
-
- if (event_type == -1)
- return;
-
- AST_RWLIST_RDLOCK(&ast_event_subs[event_type]);
- AST_RWLIST_TRAVERSE(&ast_event_subs[event_type], sub, entry) {
- if (event_sub == sub)
- continue;
-
- event = ast_event_new(AST_EVENT_SUB,
- AST_EVENT_IE_UNIQUEID, AST_EVENT_IE_PLTYPE_UINT, sub->uniqueid,
- AST_EVENT_IE_EVENTTYPE, AST_EVENT_IE_PLTYPE_UINT, sub->type,
- AST_EVENT_IE_END);
-
- AST_LIST_TRAVERSE(&sub->ie_vals, ie_val, entry) {
- switch (ie_val->ie_pltype) {
- case AST_EVENT_IE_PLTYPE_EXISTS:
- ast_event_append_ie_uint(&event, AST_EVENT_IE_EXISTS, ie_val->ie_type);
- break;
- 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_STR:
- ast_event_append_ie_str(&event, ie_val->ie_type, ie_val->payload.str);
- break;
- }
- if (!event)
- break;
- }
-
- if (!event)
- continue;
-
- event_sub->cb(event, event_sub->userdata);
-
- ast_event_destroy(event);
- }
- AST_RWLIST_UNLOCK(&ast_event_subs[event_type]);
-}
-
-struct ast_event_sub *ast_event_subscribe(enum ast_event_type type, ast_event_cb_t cb,
- void *userdata, ...)
-{
- va_list ap;
- enum ast_event_ie_type ie_type;
- struct ast_event_sub *sub;
- struct ast_event *event;
-
- if (type >= AST_EVENT_TOTAL) {
- ast_log(LOG_ERROR, "%u is an invalid type!\n", type);
- return NULL;
- }
-
- if (!(sub = ast_calloc(1, sizeof(*sub))))
- return NULL;
-
- va_start(ap, userdata);
- for (ie_type = va_arg(ap, enum ast_event_type);
- ie_type != AST_EVENT_IE_END;
- ie_type = va_arg(ap, enum ast_event_type))
- {
- struct ast_event_ie_val *ie_val;
- if (!(ie_val = ast_calloc(1, sizeof(*ie_val))))
- continue;
- ie_val->ie_type = ie_type;
- ie_val->ie_pltype = va_arg(ap, enum ast_event_ie_pltype);
- if (ie_val->ie_pltype == AST_EVENT_IE_PLTYPE_UINT)
- ie_val->payload.uint = va_arg(ap, uint32_t);
- else if (ie_val->ie_pltype == AST_EVENT_IE_PLTYPE_STR) {
- if (!(ie_val->payload.str = ast_strdup(va_arg(ap, const char *)))) {
- free(ie_val);
- continue;
- }
- }
- AST_LIST_INSERT_TAIL(&sub->ie_vals, ie_val, entry);
- }
- va_end(ap);
-
- sub->type = type;
- sub->cb = cb;
- sub->userdata = userdata;
- sub->uniqueid = ast_atomic_fetchadd_int((int *) &sub_uniqueid, 1);
-
- if (ast_event_check_subscriber(AST_EVENT_SUB,
- AST_EVENT_IE_EVENTTYPE, AST_EVENT_IE_PLTYPE_UINT, type,
- AST_EVENT_IE_END) != AST_EVENT_SUB_NONE) {
- struct ast_event_ie_val *ie_val;
-
- event = ast_event_new(AST_EVENT_SUB,
- AST_EVENT_IE_UNIQUEID, AST_EVENT_IE_PLTYPE_UINT, sub->uniqueid,
- AST_EVENT_IE_EVENTTYPE, AST_EVENT_IE_PLTYPE_UINT, sub->type,
- AST_EVENT_IE_END);
-
- AST_LIST_TRAVERSE(&sub->ie_vals, ie_val, entry) {
- switch (ie_val->ie_pltype) {
- case AST_EVENT_IE_PLTYPE_EXISTS:
- ast_event_append_ie_uint(&event, AST_EVENT_IE_EXISTS, ie_val->ie_type);
- break;
- 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_STR:
- ast_event_append_ie_str(&event, ie_val->ie_type, ie_val->payload.str);
- break;
- }
- if (!event)
- break;
- }
-
- if (event)
- ast_event_queue(event);
- }
-
- AST_RWLIST_WRLOCK(&ast_event_subs[type]);
- AST_RWLIST_INSERT_TAIL(&ast_event_subs[type], sub, entry);
- AST_RWLIST_UNLOCK(&ast_event_subs[type]);
-
- return sub;
-}
-
-static void ast_event_sub_destroy(struct ast_event_sub *sub)
-{
- struct ast_event_ie_val *ie_val;
-
- while ((ie_val = AST_LIST_REMOVE_HEAD(&sub->ie_vals, entry)))
- ast_event_ie_val_destroy(ie_val);
-
- free(sub);
-}
-
-void ast_event_unsubscribe(struct ast_event_sub *sub)
-{
- struct ast_event *event;
-
- AST_RWLIST_WRLOCK(&ast_event_subs[sub->type]);
- AST_LIST_REMOVE(&ast_event_subs[sub->type], sub, entry);
- AST_RWLIST_UNLOCK(&ast_event_subs[sub->type]);
-
- if (ast_event_check_subscriber(AST_EVENT_UNSUB,
- AST_EVENT_IE_EVENTTYPE, AST_EVENT_IE_PLTYPE_UINT, sub->type,
- AST_EVENT_IE_END) != AST_EVENT_SUB_NONE) {
-
- event = ast_event_new(AST_EVENT_UNSUB,
- AST_EVENT_IE_UNIQUEID, AST_EVENT_IE_PLTYPE_UINT, sub->uniqueid,
- AST_EVENT_IE_EVENTTYPE, AST_EVENT_IE_PLTYPE_UINT, sub->type,
- AST_EVENT_IE_END);
-
- if (event)
- ast_event_queue(event);
- }
-
- ast_event_sub_destroy(sub);
-}
-
-enum ast_event_type ast_event_get_type(const struct ast_event *event)
-{
- return ntohs(event->type);
-}
-
-uint32_t ast_event_get_ie_uint(const struct ast_event *event, enum ast_event_ie_type ie_type)
-{
- const uint32_t *ie_val;
-
- ie_val = ast_event_get_ie_raw(event, ie_type);
-
- return ie_val ? ntohl(*ie_val) : 0;
-}
-
-const char *ast_event_get_ie_str(const struct ast_event *event, enum ast_event_ie_type ie_type)
-{
- return ast_event_get_ie_raw(event, ie_type);
-}
-
-const void *ast_event_get_ie_raw(const struct ast_event *event, enum ast_event_ie_type ie_type)
-{
- struct ast_event_ie *ie;
- uint16_t event_len;
-
- ie_type = ntohs(ie_type);
- event_len = ntohs(event->event_len);
-
- ie = ((void *) event) + sizeof(*event);
-
- while ((((void *) ie) - ((void *) event)) < event_len) {
- if (ie->ie_type == ie_type)
- return ie->ie_payload;
- ie = ((void *) ie) + sizeof(*ie) + ntohs(ie->ie_payload_len);
- }
-
- return NULL;
-}
-
-int ast_event_append_ie_str(struct ast_event **event, enum ast_event_ie_type ie_type,
- const char *str)
-{
- return ast_event_append_ie_raw(event, ie_type, str, strlen(str) + 1);
-}
-
-int ast_event_append_ie_uint(struct ast_event **event, enum ast_event_ie_type ie_type,
- uint32_t data)
-{
- data = htonl(data);
- return ast_event_append_ie_raw(event, ie_type, &data, sizeof(data));
-}
-
-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;
- unsigned int extra_len;
- uint16_t event_len;
-
- event_len = ntohs((*event)->event_len);
- extra_len = sizeof(*ie) + data_len;
-
- if (!(*event = ast_realloc(*event, event_len + extra_len)))
- return -1;
-
- ie = ((void *) *event) + event_len;
- ie->ie_type = htons(ie_type);
- ie->ie_payload_len = htons(data_len);
- memcpy(ie->ie_payload, data, data_len);
-
- (*event)->event_len = htons(event_len + extra_len);
-
- return 0;
-}
-
-struct ast_event *ast_event_new(enum ast_event_type type, ...)
-{
- va_list ap;
- struct ast_event *event;
- enum ast_event_type ie_type;
- struct ast_event_ie_val *ie_val;
- AST_LIST_HEAD_NOLOCK_STATIC(ie_vals, ast_event_ie_val);
-
- /* Invalid type */
- if (type >= AST_EVENT_TOTAL) {
- ast_log(LOG_WARNING, "Someone tried to create an event of invalid "
- "type '%d'!\n", type);
- return NULL;
- }
-
- va_start(ap, type);
- for (ie_type = va_arg(ap, enum ast_event_type);
- ie_type != AST_EVENT_IE_END;
- ie_type = va_arg(ap, enum ast_event_type))
- {
- struct ast_event_ie_val *ie_val = alloca(sizeof(*ie_val));
- memset(ie_val, 0, sizeof(*ie_val));
- ie_val->ie_type = ie_type;
- ie_val->ie_pltype = va_arg(ap, enum ast_event_ie_pltype);
- if (ie_val->ie_pltype == AST_EVENT_IE_PLTYPE_UINT)
- ie_val->payload.uint = va_arg(ap, uint32_t);
- else if (ie_val->ie_pltype == AST_EVENT_IE_PLTYPE_STR)
- ie_val->payload.str = ast_strdupa(va_arg(ap, const char *));
- AST_LIST_INSERT_TAIL(&ie_vals, ie_val, entry);
- }
- va_end(ap);
-
- if (!(event = ast_calloc(1, sizeof(*event))))
- return NULL;
-
- event->type = htons(type);
- event->event_len = htons(sizeof(*event));
-
- AST_LIST_TRAVERSE(&ie_vals, ie_val, entry) {
- if (ie_val->ie_pltype == AST_EVENT_IE_PLTYPE_STR)
- ast_event_append_ie_str(&event, ie_val->ie_type, ie_val->payload.str);
- else if (ie_val->ie_pltype == AST_EVENT_IE_PLTYPE_UINT)
- ast_event_append_ie_uint(&event, ie_val->ie_type, ie_val->payload.uint);
-
- if (!event)
- break;
- }
-
- return event;
-}
-
-void ast_event_destroy(struct ast_event *event)
-{
- free(event);
-}
-
-static void ast_event_ref_destroy(struct ast_event_ref *event_ref)
-{
- ast_event_destroy(event_ref->event);
- free(event_ref);
-}
-
-static struct ast_event *ast_event_dup(const struct ast_event *event)
-{
- struct ast_event *dup_event;
- uint16_t event_len;
-
- event_len = ntohs(event->event_len);
-
- if (!(dup_event = ast_calloc(1, event_len)))
- return NULL;
-
- memcpy(dup_event, event, event_len);
-
- return dup_event;
-}
-
-struct ast_event *ast_event_get_cached(enum ast_event_type type, ...)
-{
- va_list ap;
- enum ast_event_ie_type ie_type;
- struct ast_event *dup_event = NULL;
- struct ast_event_ref *event_ref;
- struct cache_arg {
- AST_LIST_ENTRY(cache_arg) entry;
- enum ast_event_ie_type ie_type;
- enum ast_event_ie_pltype ie_pltype;
- union {
- uint32_t uint;
- const char *str;
- } payload;
- } *cache_arg;
- AST_LIST_HEAD_NOLOCK_STATIC(cache_args, cache_arg);
-
- if (type >= AST_EVENT_TOTAL) {
- ast_log(LOG_ERROR, "%u is an invalid type!\n", type);
- return NULL;
- }
-
- va_start(ap, type);
- for (ie_type = va_arg(ap, enum ast_event_type);
- ie_type != AST_EVENT_IE_END;
- ie_type = va_arg(ap, enum ast_event_type))
- {
- cache_arg = alloca(sizeof(*cache_arg));
- memset(cache_arg, 0, sizeof(*cache_arg));
- cache_arg->ie_type = ie_type;
- cache_arg->ie_pltype = va_arg(ap, enum ast_event_ie_pltype);
- if (cache_arg->ie_pltype == AST_EVENT_IE_PLTYPE_UINT)
- cache_arg->payload.uint = va_arg(ap, uint32_t);
- else if (cache_arg->ie_pltype == AST_EVENT_IE_PLTYPE_STR)
- cache_arg->payload.str = ast_strdupa(va_arg(ap, const char *));
- AST_LIST_INSERT_TAIL(&cache_args, cache_arg, entry);
- }
- va_end(ap);
-
- if (AST_LIST_EMPTY(&cache_args)) {
- ast_log(LOG_ERROR, "Events can not be retrieved from the cache without "
- "specifying at least one IE type!\n");
- return NULL;
- }
-
- AST_RWLIST_RDLOCK(&ast_event_cache[type]);
- AST_RWLIST_TRAVERSE_SAFE_BEGIN(&ast_event_cache[type], event_ref, entry) {
- AST_LIST_TRAVERSE(&cache_args, cache_arg, entry) {
- if ( ! ( (cache_arg->ie_pltype == AST_EVENT_IE_PLTYPE_UINT &&
- (cache_arg->payload.uint ==
- ast_event_get_ie_uint(event_ref->event, cache_arg->ie_type))) ||
-
- (cache_arg->ie_pltype == AST_EVENT_IE_PLTYPE_STR &&
- (!strcmp(cache_arg->payload.str,
- ast_event_get_ie_str(event_ref->event, cache_arg->ie_type)))) ||
-
- (cache_arg->ie_pltype == AST_EVENT_IE_PLTYPE_EXISTS &&
- ast_event_get_ie_raw(event_ref->event, cache_arg->ie_type)) ) )
- {
- break;
- }
- }
- if (!cache_arg) {
- /* All parameters were matched on this cache entry, so return it */
- dup_event = ast_event_dup(event_ref->event);
- break;
- }
- }
- AST_RWLIST_TRAVERSE_SAFE_END
- AST_RWLIST_UNLOCK(&ast_event_cache[type]);
-
- return dup_event;
-}
-
-/*! \brief Duplicate an event and add it to the cache
- * \note This assumes this index in to the cache is locked */
-static int ast_event_dup_and_cache(const struct ast_event *event)
-{
- struct ast_event *dup_event;
- struct ast_event_ref *event_ref;
-
- if (!(dup_event = ast_event_dup(event)))
- return -1;
- if (!(event_ref = ast_calloc(1, sizeof(*event_ref))))
- return -1;
-
- event_ref->event = dup_event;
-
- AST_LIST_INSERT_TAIL(&ast_event_cache[ntohs(event->type)], event_ref, entry);
-
- return 0;
-}
-
-int ast_event_queue_and_cache(struct ast_event *event, ...)
-{
- va_list ap;
- enum ast_event_type ie_type;
- uint16_t host_event_type;
- struct ast_event_ref *event_ref;
- int res;
- struct cache_arg {
- AST_LIST_ENTRY(cache_arg) entry;
- enum ast_event_ie_type ie_type;
- enum ast_event_ie_pltype ie_pltype;
- } *cache_arg;
- AST_LIST_HEAD_NOLOCK_STATIC(cache_args, cache_arg);
-
- host_event_type = ntohs(event->type);
-
- /* Invalid type */
- if (host_event_type >= AST_EVENT_TOTAL) {
- ast_log(LOG_WARNING, "Someone tried to queue an event of invalid "
- "type '%d'!\n", host_event_type);
- return -1;
- }
-
- va_start(ap, event);
- for (ie_type = va_arg(ap, enum ast_event_type);
- ie_type != AST_EVENT_IE_END;
- ie_type = va_arg(ap, enum ast_event_type))
- {
- cache_arg = alloca(sizeof(*cache_arg));
- memset(cache_arg, 0, sizeof(*cache_arg));
- cache_arg->ie_type = ie_type;
- cache_arg->ie_pltype = va_arg(ap, enum ast_event_ie_pltype);
- AST_LIST_INSERT_TAIL(&cache_args, cache_arg, entry);
- }
- va_end(ap);
-
- if (AST_LIST_EMPTY(&cache_args)) {
- ast_log(LOG_ERROR, "Events can not be cached without specifying at "
- "least one IE type!\n");
- return ast_event_queue(event);
- }
-
- AST_RWLIST_WRLOCK(&ast_event_cache[host_event_type]);
- AST_RWLIST_TRAVERSE_SAFE_BEGIN(&ast_event_cache[host_event_type], event_ref, entry) {
- AST_LIST_TRAVERSE(&cache_args, cache_arg, entry) {
- if ( ! ( (cache_arg->ie_pltype == AST_EVENT_IE_PLTYPE_UINT &&
- (ast_event_get_ie_uint(event, cache_arg->ie_type) ==
- ast_event_get_ie_uint(event_ref->event, cache_arg->ie_type))) ||
-
- (cache_arg->ie_pltype == AST_EVENT_IE_PLTYPE_STR &&
- (!strcmp(ast_event_get_ie_str(event, cache_arg->ie_type),
- ast_event_get_ie_str(event_ref->event, cache_arg->ie_type)))) ||
-
- (cache_arg->ie_pltype == AST_EVENT_IE_PLTYPE_EXISTS &&
- ast_event_get_ie_raw(event_ref->event, cache_arg->ie_type)) ) )
- {
- break;
- }
- }
- if (!cache_arg) {
- /* All parameters were matched on this cache entry, so remove it */
- AST_LIST_REMOVE_CURRENT(&ast_event_cache[host_event_type], entry);
- ast_event_ref_destroy(event_ref);
- }
- }
- AST_RWLIST_TRAVERSE_SAFE_END
- res = ast_event_dup_and_cache(event);
- AST_RWLIST_UNLOCK(&ast_event_cache[host_event_type]);
-
- return (ast_event_queue(event) || res) ? -1 : 0;
-}
-
-int ast_event_queue(struct ast_event *event)
-{
- struct ast_event_ref *event_ref;
- uint16_t host_event_type;
-
- host_event_type = ntohs(event->type);
-
- /* Invalid type */
- if (host_event_type >= AST_EVENT_TOTAL) {
- ast_log(LOG_WARNING, "Someone tried to queue an event of invalid "
- "type '%d'!\n", host_event_type);
- return -1;
- }
-
- /* If nobody has subscribed to this event type, throw it away now */
- if (ast_event_check_subscriber(host_event_type, AST_EVENT_IE_END)
- == AST_EVENT_SUB_NONE) {
- ast_event_destroy(event);
- return 0;
- }
-
- if (!(event_ref = ast_calloc(1, sizeof(*event_ref))))
- return -1;
-
- event_ref->event = event;
-
- ast_mutex_lock(&event_thread.lock);
- AST_LIST_INSERT_TAIL(&event_thread.event_q, event_ref, entry);
- ast_cond_signal(&event_thread.cond);
- ast_mutex_unlock(&event_thread.lock);
-
- return 0;
-}
-
-static void *ast_event_dispatcher(void *unused)
-{
- for (;;) {
- struct ast_event_ref *event_ref;
- struct ast_event_sub *sub;
- uint16_t host_event_type;
-
- ast_mutex_lock(&event_thread.lock);
- while (!(event_ref = AST_LIST_REMOVE_HEAD(&event_thread.event_q, entry)))
- ast_cond_wait(&event_thread.cond, &event_thread.lock);
- ast_mutex_unlock(&event_thread.lock);
-
- host_event_type = ntohs(event_ref->event->type);
-
- /* Subscribers to this specific event first */
- AST_RWLIST_RDLOCK(&ast_event_subs[host_event_type]);
- AST_RWLIST_TRAVERSE(&ast_event_subs[host_event_type], sub, entry) {
- struct ast_event_ie_val *ie_val;
- AST_LIST_TRAVERSE(&sub->ie_vals, ie_val, entry) {
- if (ie_val->ie_pltype == AST_EVENT_IE_PLTYPE_EXISTS &&
- ast_event_get_ie_raw(event_ref->event, ie_val->ie_type)) {
- continue;
- } else if (ie_val->ie_pltype == AST_EVENT_IE_PLTYPE_UINT &&
- ast_event_get_ie_uint(event_ref->event, ie_val->ie_type)
- == ie_val->payload.uint) {
- continue;
- } else if (ie_val->ie_pltype == AST_EVENT_IE_PLTYPE_STR &&
- !strcmp(ast_event_get_ie_str(event_ref->event, ie_val->ie_type),
- ie_val->payload.str)) {
- continue;
- }
- break;
- }
- if (ie_val)
- continue;
- sub->cb(event_ref->event, sub->userdata);
- }
- AST_RWLIST_UNLOCK(&ast_event_subs[host_event_type]);
-
- /* Now to subscribers to all event types */
- AST_RWLIST_RDLOCK(&ast_event_subs[AST_EVENT_ALL]);
- AST_RWLIST_TRAVERSE(&ast_event_subs[AST_EVENT_ALL], sub, entry)
- sub->cb(event_ref->event, sub->userdata);
- AST_RWLIST_UNLOCK(&ast_event_subs[AST_EVENT_ALL]);
-
- ast_event_ref_destroy(event_ref);
- }
-
- return NULL;
-}
-
-void ast_event_init(void)
-{
- int i;
-
- for (i = 0; i < AST_EVENT_TOTAL; i++)
- AST_RWLIST_HEAD_INIT(&ast_event_subs[i]);
-
- for (i = 0; i < AST_EVENT_TOTAL; i++)
- AST_RWLIST_HEAD_INIT(&ast_event_cache[i]);
-
- ast_cond_init(&event_thread.cond, NULL);
-
- for (i = 0; i < NUM_EVENT_THREADS; i++) {
- pthread_t dont_care;
- ast_pthread_create_background(&dont_care, NULL, ast_event_dispatcher, NULL);
- }
-}
->>>>>>> .merge-right.r62300
More information about the asterisk-commits
mailing list