#include "asterisk/event_defs.h"
Go to the source code of this file.
Typedefs | |
typedef void(*) | ast_event_cb_t (const struct ast_event *event, void *userdata) |
Subscriber event callback type. | |
Functions | |
int | ast_event_append_eid (struct ast_event **event) |
Append the global EID IE. | |
int | ast_event_append_ie_bitflags (struct ast_event **event, enum ast_event_ie_type ie_type, uint32_t bitflags) |
Append an information element that has a bitflags payload. | |
int | ast_event_append_ie_raw (struct ast_event **event, enum ast_event_ie_type ie_type, const void *data, size_t data_len) |
Append an information element that has a raw payload. | |
int | ast_event_append_ie_str (struct ast_event **event, enum ast_event_ie_type ie_type, const char *str) |
Append an information element that has a string payload. | |
int | ast_event_append_ie_uint (struct ast_event **event, enum ast_event_ie_type ie_type, uint32_t data) |
Append an information element that has an integer payload. | |
enum ast_event_subscriber_res | ast_event_check_subscriber (enum ast_event_type event_type,...) |
Check if subscribers exist. | |
void | ast_event_destroy (struct ast_event *event) |
Destroy an event. | |
void | ast_event_dump_cache (const struct ast_event_sub *event_sub) |
Dump the event cache for the subscriber. | |
ast_event * | ast_event_get_cached (enum ast_event_type,...) |
Retrieve an event from the cache. | |
uint32_t | ast_event_get_ie_bitflags (const struct ast_event *event, enum ast_event_ie_type ie_type) |
Get the value of an information element that has a bitflags payload. | |
enum ast_event_ie_pltype | ast_event_get_ie_pltype (enum ast_event_ie_type ie_type) |
Get the payload type for a given information element type. | |
const void * | ast_event_get_ie_raw (const struct ast_event *event, enum ast_event_ie_type ie_type) |
Get the value of an information element that has a raw payload. | |
uint16_t | ast_event_get_ie_raw_payload_len (const struct ast_event *event, enum ast_event_ie_type ie_type) |
Get the length of the raw payload for a particular IE. | |
const char * | ast_event_get_ie_str (const struct ast_event *event, enum ast_event_ie_type ie_type) |
Get the value of an information element that has a string payload. | |
uint32_t | ast_event_get_ie_str_hash (const struct ast_event *event, enum ast_event_ie_type ie_type) |
Get the hash for the string payload of an IE. | |
const char * | ast_event_get_ie_type_name (enum ast_event_ie_type ie_type) |
Get the string representation of an information element type. | |
uint32_t | ast_event_get_ie_uint (const struct ast_event *event, enum ast_event_ie_type ie_type) |
Get the value of an information element that has an integer payload. | |
size_t | ast_event_get_size (const struct ast_event *event) |
Get the size of an event. | |
enum ast_event_type | ast_event_get_type (const struct ast_event *event) |
Get the type for an event. | |
const char * | ast_event_get_type_name (const struct ast_event *event) |
Get the string representation of the type of the given event. | |
uint32_t | ast_event_iterator_get_ie_bitflags (struct ast_event_iterator *iterator) |
Get the value of the current IE in the iterator as a bitflags payload. | |
void * | ast_event_iterator_get_ie_raw (struct ast_event_iterator *iterator) |
Get the value of the current IE in the iterator instance that has a raw payload. | |
uint16_t | ast_event_iterator_get_ie_raw_payload_len (struct ast_event_iterator *iterator) |
Get the length of the raw payload for the current IE for an iterator. | |
const char * | ast_event_iterator_get_ie_str (struct ast_event_iterator *iterator) |
Get the value of the current IE in the iterator as a string payload. | |
enum ast_event_ie_type | ast_event_iterator_get_ie_type (struct ast_event_iterator *iterator) |
Get the type of the current IE in the iterator instance. | |
uint32_t | ast_event_iterator_get_ie_uint (struct ast_event_iterator *iterator) |
Get the value of the current IE in the iterator as an integer payload. | |
int | ast_event_iterator_init (struct ast_event_iterator *iterator, const struct ast_event *event) |
Initialize an event iterator instance. | |
int | ast_event_iterator_next (struct ast_event_iterator *iterator) |
Move iterator instance to next IE. | |
size_t | ast_event_minimum_length (void) |
Get the minimum length of an ast_event. | |
ast_event * | ast_event_new (enum ast_event_type event_type,...) |
Create a new event. | |
int | ast_event_queue (struct ast_event *event) |
Queue an event. | |
int | ast_event_queue_and_cache (struct ast_event *event) |
Queue and cache an event. | |
void | ast_event_report_subs (const struct ast_event_sub *sub) |
Report current subscriptions to a subscription subscriber. | |
int | ast_event_str_to_event_type (const char *str, enum ast_event_type *event_type) |
Convert a string into an event type. | |
int | ast_event_str_to_ie_type (const char *str, enum ast_event_ie_type *ie_type) |
Convert a string to an IE type. | |
int | ast_event_sub_activate (struct ast_event_sub *sub) |
Activate a dynamically built subscription. | |
int | ast_event_sub_append_ie_bitflags (struct ast_event_sub *sub, enum ast_event_ie_type ie_type, uint32_t flags) |
Append a bitflags parameter to a subscription. | |
int | ast_event_sub_append_ie_exists (struct ast_event_sub *sub, enum ast_event_ie_type ie_type) |
Append an 'exists' parameter to a subscription. | |
int | ast_event_sub_append_ie_raw (struct ast_event_sub *sub, enum ast_event_ie_type ie_type, void *data, size_t raw_datalen) |
Append a raw parameter to a subscription. | |
int | ast_event_sub_append_ie_str (struct ast_event_sub *sub, enum ast_event_ie_type ie_type, const char *str) |
Append a string parameter to a subscription. | |
int | ast_event_sub_append_ie_uint (struct ast_event_sub *sub, enum ast_event_ie_type ie_type, uint32_t uint) |
Append a uint parameter to a subscription. | |
void | ast_event_sub_destroy (struct ast_event_sub *sub) |
Destroy an allocated subscription. | |
ast_event_sub * | ast_event_subscribe (enum ast_event_type event_type, ast_event_cb_t cb, const char *description, void *userdata,...) |
Subscribe to events. | |
ast_event_sub * | ast_event_subscribe_new (enum ast_event_type type, ast_event_cb_t cb, void *userdata) |
Allocate a subscription, but do not activate it. | |
const char * | ast_event_subscriber_get_description (struct ast_event_sub *sub) |
Get description for a subscription. | |
ast_event_sub * | ast_event_unsubscribe (struct ast_event_sub *event_sub) |
Un-subscribe from events. |
Definition in file event.h.
typedef void(*) ast_event_cb_t(const struct ast_event *event, void *userdata) |
Subscriber event callback type.
event | the event being passed to the subscriber | |
userdata | the data provider in the call to ast_event_subscribe() |
int ast_event_append_eid | ( | struct ast_event ** | event | ) |
Append the global EID IE.
event | the event to append IE to |
0 | success | |
-1 | failure |
Definition at line 1267 of file event.c.
References ast_eid_default, ast_event_append_ie_raw(), and AST_EVENT_IE_EID.
Referenced by ast_event_new().
01268 { 01269 return ast_event_append_ie_raw(event, AST_EVENT_IE_EID, 01270 &ast_eid_default, sizeof(ast_eid_default)); 01271 }
int ast_event_append_ie_bitflags | ( | struct ast_event ** | event, | |
enum ast_event_ie_type | ie_type, | |||
uint32_t | bitflags | |||
) |
Append an information element that has a bitflags payload.
event | the event that the IE will be appended to | |
ie_type | the type of IE to append | |
bitflags | the flags that are the payload of the IE |
0 | success | |
-1 | failure |
Definition at line 1131 of file event.c.
References ast_event_append_ie_raw().
Referenced by ast_event_get_cached(), ast_event_new(), and gen_sub_event().
01133 { 01134 flags = htonl(flags); 01135 return ast_event_append_ie_raw(event, ie_type, &flags, sizeof(flags)); 01136 }
int ast_event_append_ie_raw | ( | struct ast_event ** | event, | |
enum ast_event_ie_type | ie_type, | |||
const void * | data, | |||
size_t | data_len | |||
) |
Append an information element that has a raw payload.
event | the event that the IE will be appended to | |
ie_type | the type of IE to append | |
data | A pointer to the raw data for the payload of the IE | |
data_len | The amount of data to copy into the payload |
0 | success | |
-1 | failure |
Definition at line 1138 of file event.c.
References ast_realloc, ast_event_ie::ie_payload, and ast_event_ie::ie_payload_len.
Referenced by ast_event_append_eid(), ast_event_append_ie_bitflags(), ast_event_append_ie_str(), ast_event_append_ie_uint(), ast_event_get_cached(), ast_event_new(), and gen_sub_event().
01140 { 01141 struct ast_event_ie *ie; 01142 unsigned int extra_len; 01143 uint16_t event_len; 01144 01145 event_len = ntohs((*event)->event_len); 01146 extra_len = sizeof(*ie) + data_len; 01147 01148 if (!(*event = ast_realloc(*event, event_len + extra_len))) { 01149 return -1; 01150 } 01151 01152 ie = (struct ast_event_ie *) ( ((char *) *event) + event_len ); 01153 ie->ie_type = htons(ie_type); 01154 ie->ie_payload_len = htons(data_len); 01155 memcpy(ie->ie_payload, data, data_len); 01156 01157 (*event)->event_len = htons(event_len + extra_len); 01158 01159 return 0; 01160 }
int ast_event_append_ie_str | ( | struct ast_event ** | event, | |
enum ast_event_ie_type | ie_type, | |||
const char * | str | |||
) |
Append an information element that has a string payload.
event | the event that the IE will be appended to | |
ie_type | the type of IE to append | |
str | The string for the payload of the IE |
0 | success | |
-1 | failure |
Definition at line 1109 of file event.c.
References ast_event_append_ie_raw(), ast_str_hash(), ast_event_ie_str_payload::hash, and ast_event_ie_str_payload::str.
Referenced by add_ie(), add_ipv4_ie(), add_timeval_ie(), ast_event_get_cached(), ast_event_new(), and gen_sub_event().
01111 { 01112 struct ast_event_ie_str_payload *str_payload; 01113 size_t payload_len; 01114 01115 payload_len = sizeof(*str_payload) + strlen(str); 01116 str_payload = alloca(payload_len); 01117 01118 strcpy(str_payload->str, str); 01119 str_payload->hash = ast_str_hash(str); 01120 01121 return ast_event_append_ie_raw(event, ie_type, str_payload, payload_len); 01122 }
int ast_event_append_ie_uint | ( | struct ast_event ** | event, | |
enum ast_event_ie_type | ie_type, | |||
uint32_t | data | |||
) |
Append an information element that has an integer payload.
event | the event that the IE will be appended to | |
ie_type | the type of IE to append | |
data | The integer for the payload of the IE |
0 | success | |
-1 | failure |
Definition at line 1124 of file event.c.
References ast_event_append_ie_raw().
Referenced by add_ie(), ast_event_get_cached(), ast_event_new(), and gen_sub_event().
01126 { 01127 data = htonl(data); 01128 return ast_event_append_ie_raw(event, ie_type, &data, sizeof(data)); 01129 }
enum ast_event_subscriber_res ast_event_check_subscriber | ( | enum ast_event_type | event_type, | |
... | ||||
) |
Check if subscribers exist.
event_type | This is the type of event that the caller would like to check for subscribers to. |
<enum ast_event_ie_type>, [enum ast_event_ie_pltype, [payload] ]
If the ie_type specified is *not* AST_EVENT_IE_END, then it must be followed by a valid IE payload type. If the payload type specified is AST_EVENT_IE_PLTYPE_EXISTS, then the 3rd argument should not be provided. Otherwise, a payload must also be specified.
if (ast_event_check_subscriber(AST_EVENT_MWI, AST_EVENT_IE_MAILBOX, AST_EVENT_IE_PLTYPE_STR, mailbox, AST_EVENT_IE_END) == AST_EVENT_SUB_NONE) { return; }
This example will check if there are any subscribers to MWI events for the mailbox defined in the "mailbox" variable.
Definition at line 435 of file event.c.
References ARRAY_LEN, AST_EVENT_ALL, AST_EVENT_IE_END, AST_EVENT_IE_PLTYPE_BITFLAGS, AST_EVENT_IE_PLTYPE_EXISTS, AST_EVENT_IE_PLTYPE_RAW, AST_EVENT_IE_PLTYPE_STR, AST_EVENT_IE_PLTYPE_UINT, AST_EVENT_IE_PLTYPE_UNKNOWN, AST_EVENT_SUB_EXISTS, AST_EVENT_SUB_NONE, ast_event_subs, AST_LIST_HEAD_NOLOCK_INIT_VALUE, AST_LIST_INSERT_TAIL, AST_LIST_TRAVERSE, ast_log(), AST_RWDLLIST_RDLOCK, AST_RWDLLIST_TRAVERSE, AST_RWDLLIST_UNLOCK, AST_RWLIST_FIRST, ast_event_ie_val::ie_type, ast_ev_check_list::ie_vals, ast_event_sub::ie_vals, LOG_ERROR, LOG_WARNING, and match_sub_ie_val_to_event().
Referenced by ast_event_queue(), ast_event_sub_activate(), and ast_event_unsubscribe().
00436 { 00437 va_list ap; 00438 enum ast_event_ie_type ie_type; 00439 enum ast_event_subscriber_res res = AST_EVENT_SUB_NONE; 00440 struct ast_event_ie_val *ie_val; 00441 struct ast_event_sub *sub; 00442 struct ast_ev_check_list check_ie_vals = { 00443 .ie_vals = AST_LIST_HEAD_NOLOCK_INIT_VALUE 00444 }; 00445 const enum ast_event_type event_types[] = { type, AST_EVENT_ALL }; 00446 int i; 00447 int want_specific_event;/* TRUE if looking for subscribers wanting specific parameters. */ 00448 00449 if (type >= AST_EVENT_TOTAL) { 00450 ast_log(LOG_ERROR, "%u is an invalid type!\n", type); 00451 return res; 00452 } 00453 00454 want_specific_event = 0; 00455 va_start(ap, type); 00456 for (ie_type = va_arg(ap, enum ast_event_ie_type); 00457 ie_type != AST_EVENT_IE_END; 00458 ie_type = va_arg(ap, enum ast_event_ie_type)) 00459 { 00460 struct ast_event_ie_val *ie_value = alloca(sizeof(*ie_value)); 00461 int insert = 0; 00462 00463 memset(ie_value, 0, sizeof(*ie_value)); 00464 ie_value->ie_type = ie_type; 00465 ie_value->ie_pltype = va_arg(ap, enum ast_event_ie_pltype); 00466 switch (ie_value->ie_pltype) { 00467 case AST_EVENT_IE_PLTYPE_UINT: 00468 ie_value->payload.uint = va_arg(ap, uint32_t); 00469 insert = 1; 00470 break; 00471 case AST_EVENT_IE_PLTYPE_BITFLAGS: 00472 ie_value->payload.uint = va_arg(ap, uint32_t); 00473 insert = 1; 00474 break; 00475 case AST_EVENT_IE_PLTYPE_STR: 00476 ie_value->payload.str = va_arg(ap, const char *); 00477 insert = 1; 00478 break; 00479 case AST_EVENT_IE_PLTYPE_RAW: 00480 { 00481 void *data = va_arg(ap, void *); 00482 size_t datalen = va_arg(ap, size_t); 00483 00484 ie_value->payload.raw = alloca(datalen); 00485 memcpy(ie_value->payload.raw, data, datalen); 00486 ie_value->raw_datalen = datalen; 00487 insert = 1; 00488 break; 00489 } 00490 case AST_EVENT_IE_PLTYPE_UNKNOWN: 00491 case AST_EVENT_IE_PLTYPE_EXISTS: 00492 /* Unsupported payload type. */ 00493 break; 00494 } 00495 00496 if (insert) { 00497 want_specific_event = 1; 00498 AST_LIST_INSERT_TAIL(&check_ie_vals.ie_vals, ie_value, entry); 00499 } else { 00500 ast_log(LOG_WARNING, "Unsupported PLTYPE(%d)\n", ie_value->ie_pltype); 00501 } 00502 } 00503 va_end(ap); 00504 00505 for (i = 0; i < ARRAY_LEN(event_types); i++) { 00506 AST_RWDLLIST_RDLOCK(&ast_event_subs[event_types[i]]); 00507 if (want_specific_event) { 00508 AST_RWDLLIST_TRAVERSE(&ast_event_subs[event_types[i]], sub, entry) { 00509 AST_LIST_TRAVERSE(&sub->ie_vals, ie_val, entry) { 00510 if (!match_sub_ie_val_to_event(ie_val, &check_ie_vals)) { 00511 /* The current subscription ie did not match an event ie. */ 00512 break; 00513 } 00514 } 00515 if (!ie_val) { 00516 /* Everything matched. A subscriber is looking for this event. */ 00517 break; 00518 } 00519 } 00520 } else { 00521 /* Just looking to see if there are ANY subscribers to the event type. */ 00522 sub = AST_RWLIST_FIRST(&ast_event_subs[event_types[i]]); 00523 } 00524 AST_RWDLLIST_UNLOCK(&ast_event_subs[event_types[i]]); 00525 if (sub) { 00526 break; 00527 } 00528 } 00529 00530 return sub ? AST_EVENT_SUB_EXISTS : AST_EVENT_SUB_NONE; 00531 }
void ast_event_destroy | ( | struct ast_event * | event | ) |
Destroy an event.
event | the event to destroy |
Definition at line 1273 of file event.c.
References ast_free.
Referenced by ast_cel_report_event(), ast_event_get_cached(), ast_event_queue(), ast_event_queue_and_cache(), ast_event_ref_destroy(), ast_event_report_subs(), ast_event_sub_activate(), ast_event_unsubscribe(), devstate_cached(), event_update_cache(), get_cached_mwi(), handle_security_event(), has_voicemail(), process_collection(), sig_pri_mwi_cache_update(), stun_monitor_request(), unistim_send_mwi_to_peer(), and update_registry().
01274 { 01275 ast_free(event); 01276 }
void ast_event_dump_cache | ( | const struct ast_event_sub * | event_sub | ) |
Dump the event cache for the subscriber.
Definition at line 630 of file event.c.
References ao2_callback, ast_event_cache, dump_cache_cb(), event_sub, OBJ_NODATA, and ast_event_sub::type.
Referenced by add_publish_event(), aji_init_event_distribution(), and handle_devstate_change().
00631 { 00632 ao2_callback(ast_event_cache[event_sub->type].container, OBJ_NODATA, 00633 dump_cache_cb, (void *) event_sub); 00634 }
struct ast_event* ast_event_get_cached | ( | enum | ast_event_type, | |
... | ||||
) |
Retrieve an event from the cache.
ast_event_type | The type of event to retrieve from the cache |
<enum ast_event_ie_type>, [enum ast_event_ie_pltype, [payload] ]
If the ie_type specified is *not* AST_EVENT_IE_END, then it must be followed by a valid IE payload type. If the payload type specified is AST_EVENT_IE_PLTYPE_EXISTS, then the 3rd argument should not be provided. Otherwise, a payload must also be specified.
The caller of this function *must* call ast_event_destroy() on the returned event after it is done using it.
event = ast_event_get_cached(AST_EVENT_MWI, AST_EVENT_IE_MAILBOX, AST_EVENT_IE_PLTYPE_STR, mailbox, AST_EVENT_IE_END);
This example will check for an MWI event in the cache that matches the specified mailbox. This would be the way to find out the last known state of a mailbox without having to poll the mailbox directly.
Definition at line 1301 of file event.c.
References ao2_find, ao2_ref, ast_event_append_ie_bitflags(), ast_event_append_ie_raw(), ast_event_append_ie_str(), ast_event_append_ie_uint(), ast_event_cache, ast_event_destroy(), ast_event_dup(), AST_EVENT_IE_END, AST_EVENT_IE_PLTYPE_BITFLAGS, AST_EVENT_IE_PLTYPE_EXISTS, AST_EVENT_IE_PLTYPE_RAW, AST_EVENT_IE_PLTYPE_STR, AST_EVENT_IE_PLTYPE_UINT, AST_EVENT_IE_PLTYPE_UNKNOWN, ast_event_new(), ast_log(), container, ast_event_ref::event, LOG_ERROR, LOG_WARNING, and OBJ_POINTER.
Referenced by devstate_cached(), get_cached_mwi(), has_voicemail(), process_collection(), sig_pri_mwi_cache_update(), unistim_send_mwi_to_peer(), and update_registry().
01302 { 01303 va_list ap; 01304 enum ast_event_ie_type ie_type; 01305 struct ast_event *dup_event = NULL; 01306 struct ast_event_ref *cached_event_ref; 01307 struct ast_event *cache_arg_event; 01308 struct ast_event_ref tmp_event_ref = { 01309 .event = NULL, 01310 }; 01311 struct ao2_container *container = NULL; 01312 01313 if (type >= AST_EVENT_TOTAL) { 01314 ast_log(LOG_ERROR, "%u is an invalid type!\n", type); 01315 return NULL; 01316 } 01317 01318 if (!(container = ast_event_cache[type].container)) { 01319 ast_log(LOG_ERROR, "%u is not a cached event type\n", type); 01320 return NULL; 01321 } 01322 01323 if (!(cache_arg_event = ast_event_new(type, AST_EVENT_IE_END))) { 01324 return NULL; 01325 } 01326 01327 va_start(ap, type); 01328 for (ie_type = va_arg(ap, enum ast_event_ie_type); 01329 ie_type != AST_EVENT_IE_END; 01330 ie_type = va_arg(ap, enum ast_event_ie_type)) 01331 { 01332 enum ast_event_ie_pltype ie_pltype; 01333 01334 ie_pltype = va_arg(ap, enum ast_event_ie_pltype); 01335 01336 switch (ie_pltype) { 01337 case AST_EVENT_IE_PLTYPE_UINT: 01338 ast_event_append_ie_uint(&cache_arg_event, ie_type, va_arg(ap, uint32_t)); 01339 break; 01340 case AST_EVENT_IE_PLTYPE_BITFLAGS: 01341 ast_event_append_ie_bitflags(&cache_arg_event, ie_type, va_arg(ap, uint32_t)); 01342 break; 01343 case AST_EVENT_IE_PLTYPE_STR: 01344 ast_event_append_ie_str(&cache_arg_event, ie_type, va_arg(ap, const char *)); 01345 break; 01346 case AST_EVENT_IE_PLTYPE_RAW: 01347 { 01348 void *data = va_arg(ap, void *); 01349 size_t datalen = va_arg(ap, size_t); 01350 ast_event_append_ie_raw(&cache_arg_event, ie_type, data, datalen); 01351 break; 01352 } 01353 case AST_EVENT_IE_PLTYPE_EXISTS: 01354 ast_log(LOG_WARNING, "PLTYPE_EXISTS not supported by this function\n"); 01355 break; 01356 case AST_EVENT_IE_PLTYPE_UNKNOWN: 01357 break; 01358 } 01359 } 01360 va_end(ap); 01361 01362 tmp_event_ref.event = cache_arg_event; 01363 01364 cached_event_ref = ao2_find(container, &tmp_event_ref, OBJ_POINTER); 01365 01366 ast_event_destroy(cache_arg_event); 01367 cache_arg_event = NULL; 01368 01369 if (cached_event_ref) { 01370 dup_event = ast_event_dup(cached_event_ref->event); 01371 ao2_ref(cached_event_ref, -1); 01372 cached_event_ref = NULL; 01373 } 01374 01375 return dup_event; 01376 }
uint32_t ast_event_get_ie_bitflags | ( | const struct ast_event * | event, | |
enum ast_event_ie_type | ie_type | |||
) |
Get the value of an information element that has a bitflags payload.
event | The event to get the IE from | |
ie_type | the type of information element to retrieve |
Definition at line 1054 of file event.c.
References ast_event_get_ie_raw(), and get_unaligned_uint32().
Referenced by append_ie(), and match_ie_val().
01055 { 01056 const uint32_t *ie_val; 01057 01058 ie_val = ast_event_get_ie_raw(event, ie_type); 01059 01060 return ie_val ? ntohl(get_unaligned_uint32(ie_val)) : 0; 01061 }
enum ast_event_ie_pltype ast_event_get_ie_pltype | ( | enum ast_event_ie_type | ie_type | ) |
Get the payload type for a given information element type.
ie_type | the information element type to get the payload type of |
Definition at line 309 of file event.c.
References ARRAY_LEN, AST_EVENT_IE_PLTYPE_UNKNOWN, ast_log(), ie_maps, ie_map::ie_pltype, and LOG_ERROR.
Referenced by append_ie(), ast_event_cmp(), and event_dump_cli().
00310 { 00311 if (ie_type <= 0 || ie_type >= ARRAY_LEN(ie_maps)) { 00312 ast_log(LOG_ERROR, "Invalid IE type - '%d'\n", ie_type); 00313 return AST_EVENT_IE_PLTYPE_UNKNOWN; 00314 } 00315 00316 return ie_maps[ie_type].ie_pltype; 00317 }
const void* ast_event_get_ie_raw | ( | const struct ast_event * | event, | |
enum ast_event_ie_type | ie_type | |||
) |
Get the value of an information element that has a raw payload.
event | The event to get the IE from | |
ie_type | the type of information element to retrieve |
Definition at line 1081 of file event.c.
References ast_event_iterator_get_ie_raw(), ast_event_iterator_get_ie_type(), ast_event_iterator_init(), ast_event_iterator_next(), and ast_event_iterator::event.
Referenced by aji_devstate_cb(), aji_mwi_cb(), ast_event_cb(), ast_event_get_ie_bitflags(), ast_event_get_ie_str(), ast_event_get_ie_str_hash(), ast_event_get_ie_uint(), ast_event_new(), devstate_cache_cb(), devstate_change_collector_cb(), evt_event_deliver_cb(), ie_is_present(), and match_ie_val().
01082 { 01083 struct ast_event_iterator iterator; 01084 int res; 01085 01086 for (res = ast_event_iterator_init(&iterator, event); !res; res = ast_event_iterator_next(&iterator)) { 01087 if (ast_event_iterator_get_ie_type(&iterator) == ie_type) { 01088 return ast_event_iterator_get_ie_raw(&iterator); 01089 } 01090 } 01091 01092 return NULL; 01093 }
uint16_t ast_event_get_ie_raw_payload_len | ( | const struct ast_event * | event, | |
enum ast_event_ie_type | ie_type | |||
) |
Get the length of the raw payload for a particular IE.
event | The event to get the IE payload length from | |
ie_type | the type of information element to get the length of |
Definition at line 1095 of file event.c.
References ast_event_iterator_get_ie_raw_payload_len(), ast_event_iterator_get_ie_type(), ast_event_iterator_init(), ast_event_iterator_next(), and ast_event_iterator::event.
Referenced by match_ie_val().
01096 { 01097 struct ast_event_iterator iterator; 01098 int res; 01099 01100 for (res = ast_event_iterator_init(&iterator, event); !res; res = ast_event_iterator_next(&iterator)) { 01101 if (ast_event_iterator_get_ie_type(&iterator) == ie_type) { 01102 return ast_event_iterator_get_ie_raw_payload_len(&iterator); 01103 } 01104 } 01105 01106 return 0; 01107 }
const char* ast_event_get_ie_str | ( | const struct ast_event * | event, | |
enum ast_event_ie_type | ie_type | |||
) |
Get the value of an information element that has a string payload.
event | The event to get the IE from | |
ie_type | the type of information element to retrieve |
Definition at line 1072 of file event.c.
References ast_event_get_ie_raw(), and ast_event_ie_str_payload::str.
Referenced by aji_devstate_cb(), aji_mwi_cb(), append_ie(), ast_cel_fill_record(), ast_event_hash_devstate(), ast_event_hash_devstate_change(), ast_event_hash_mwi(), device_state_cb(), devstate_change_collector_cb(), generic_monitor_devstate_cb(), match_ie_val(), mwi_sub_event_cb(), print_cel_sub(), and sig_pri_mwi_event_cb().
01073 { 01074 const struct ast_event_ie_str_payload *str_payload; 01075 01076 str_payload = ast_event_get_ie_raw(event, ie_type); 01077 01078 return str_payload ? str_payload->str : NULL; 01079 }
uint32_t ast_event_get_ie_str_hash | ( | const struct ast_event * | event, | |
enum ast_event_ie_type | ie_type | |||
) |
Get the hash for the string payload of an IE.
event | The event to get the IE from | |
ie_type | the type of information element to retrieve the hash for |
Definition at line 1063 of file event.c.
References ast_event_get_ie_raw(), and ast_event_ie_str_payload::hash.
Referenced by match_ie_val().
01064 { 01065 const struct ast_event_ie_str_payload *str_payload; 01066 01067 str_payload = ast_event_get_ie_raw(event, ie_type); 01068 01069 return str_payload ? str_payload->hash : 0; 01070 }
const char* ast_event_get_ie_type_name | ( | enum ast_event_ie_type | ie_type | ) |
Get the string representation of an information element type.
ie_type | the information element type to get the string representation of |
Definition at line 299 of file event.c.
References ARRAY_LEN, ast_log(), ie_maps, LOG_ERROR, and ie_map::name.
Referenced by append_ie(), dump_raw_ie(), event_dump_cache(), event_dump_cli(), and security_event_cb().
00300 { 00301 if (ie_type <= 0 || ie_type >= ARRAY_LEN(ie_maps)) { 00302 ast_log(LOG_ERROR, "Invalid IE type - '%d'\n", ie_type); 00303 return ""; 00304 } 00305 00306 return ie_maps[ie_type].name; 00307 }
uint32_t ast_event_get_ie_uint | ( | const struct ast_event * | event, | |
enum ast_event_ie_type | ie_type | |||
) |
Get the value of an information element that has an integer payload.
event | The event to get the IE from | |
ie_type | the type of information element to retrieve |
Definition at line 1045 of file event.c.
References ast_event_get_ie_raw(), and get_unaligned_uint32().
Referenced by aji_devstate_cb(), aji_mwi_cb(), append_ie(), ast_cel_fill_record(), device_state_cb(), devstate_cache_cb(), devstate_cached(), devstate_change_collector_cb(), generic_agent_devstate_cb(), generic_monitor_devstate_cb(), get_cached_mwi(), has_voicemail(), match_ie_val(), mwi_event_cb(), mwi_sub_event_cb(), mwi_unsub_event_cb(), process_collection(), security_event_cb(), sig_pri_mwi_cache_update(), sig_pri_mwi_event_cb(), unistim_send_mwi_to_peer(), and update_registry().
01046 { 01047 const uint32_t *ie_val; 01048 01049 ie_val = ast_event_get_ie_raw(event, ie_type); 01050 01051 return ie_val ? ntohl(get_unaligned_uint32(ie_val)) : 0; 01052 }
size_t ast_event_get_size | ( | const struct ast_event * | event | ) |
Get the size of an event.
event | the event to get the size of |
Definition at line 335 of file event.c.
References ast_event::event_len.
Referenced by ast_event_cb(), ast_event_dup(), and ast_event_iterator_init().
00336 { 00337 size_t res; 00338 00339 res = ntohs(event->event_len); 00340 00341 return res; 00342 }
enum ast_event_type ast_event_get_type | ( | const struct ast_event * | event | ) |
Get the type for an event.
event | the event to get the type for |
Definition at line 1040 of file event.c.
Referenced by ast_event_cb(), ast_event_cmp(), ast_event_get_type_name(), ast_event_hash(), ast_event_queue_and_cache(), mwi_sub_event_cb(), and mwi_unsub_event_cb().
const char* ast_event_get_type_name | ( | const struct ast_event * | event | ) |
Get the string representation of the type of the given event.
Definition at line 269 of file event.c.
References ARRAY_LEN, ast_event_get_type(), ast_log(), event_names, LOG_ERROR, and ast_event_sub::type.
Referenced by event_dump_cli().
00270 { 00271 enum ast_event_type type; 00272 00273 type = ast_event_get_type(event); 00274 00275 if (type < 0 || type >= ARRAY_LEN(event_names)) { 00276 ast_log(LOG_ERROR, "Invalid event type - '%d'\n", type); 00277 return ""; 00278 } 00279 00280 return event_names[type]; 00281 }
uint32_t ast_event_iterator_get_ie_bitflags | ( | struct ast_event_iterator * | iterator | ) |
Get the value of the current IE in the iterator as a bitflags payload.
iterator | The iterator instance |
Definition at line 1016 of file event.c.
References get_unaligned_uint32(), ast_event_iterator::ie, and ast_event_ie::ie_payload.
Referenced by event_dump_cli().
01017 { 01018 return ntohl(get_unaligned_uint32(iterator->ie->ie_payload)); 01019 }
void* ast_event_iterator_get_ie_raw | ( | struct ast_event_iterator * | iterator | ) |
Get the value of the current IE in the iterator instance that has a raw payload.
iterator | The iterator instance |
Definition at line 1030 of file event.c.
References ast_event_iterator::ie, and ast_event_ie::ie_payload.
Referenced by ast_event_get_ie_raw(), and dump_raw_ie().
01031 { 01032 return iterator->ie->ie_payload; 01033 }
uint16_t ast_event_iterator_get_ie_raw_payload_len | ( | struct ast_event_iterator * | iterator | ) |
Get the length of the raw payload for the current IE for an iterator.
iterator | The IE iterator |
Definition at line 1035 of file event.c.
References ast_event_iterator::ie, and ast_event_ie::ie_payload_len.
Referenced by ast_event_get_ie_raw_payload_len().
01036 { 01037 return ntohs(iterator->ie->ie_payload_len); 01038 }
const char* ast_event_iterator_get_ie_str | ( | struct ast_event_iterator * | iterator | ) |
Get the value of the current IE in the iterator as a string payload.
iterator | The iterator instance |
Definition at line 1021 of file event.c.
References ast_event_iterator::ie, ast_event_ie::ie_payload, and ast_event_ie_str_payload::str.
Referenced by event_dump_cli().
01022 { 01023 const struct ast_event_ie_str_payload *str_payload; 01024 01025 str_payload = (struct ast_event_ie_str_payload *) iterator->ie->ie_payload; 01026 01027 return str_payload ? str_payload->str : NULL; 01028 }
enum ast_event_ie_type ast_event_iterator_get_ie_type | ( | struct ast_event_iterator * | iterator | ) |
Get the type of the current IE in the iterator instance.
iterator | The iterator instance |
Definition at line 1006 of file event.c.
References ast_event_iterator::ie.
Referenced by ast_event_get_ie_raw(), ast_event_get_ie_raw_payload_len(), dump_raw_ie(), and event_dump_cli().
01007 { 01008 return ntohs(iterator->ie->ie_type); 01009 }
uint32_t ast_event_iterator_get_ie_uint | ( | struct ast_event_iterator * | iterator | ) |
Get the value of the current IE in the iterator as an integer payload.
iterator | The iterator instance |
Definition at line 1011 of file event.c.
References get_unaligned_uint32(), ast_event_iterator::ie, and ast_event_ie::ie_payload.
Referenced by event_dump_cli().
01012 { 01013 return ntohl(get_unaligned_uint32(iterator->ie->ie_payload)); 01014 }
int ast_event_iterator_init | ( | struct ast_event_iterator * | iterator, | |
const struct ast_event * | event | |||
) |
Initialize an event iterator instance.
iterator | The iterator instance to initialize | |
event | The event that will be iterated through |
0 | Success, there are IEs available to iterate | |
-1 | Failure, there are no IEs in the event to iterate |
Definition at line 984 of file event.c.
References ast_event_get_size(), ast_event_iterator::event, ast_event_iterator::event_len, and ast_event_iterator::ie.
Referenced by ast_event_get_ie_raw(), ast_event_get_ie_raw_payload_len(), and event_dump_cli().
00985 { 00986 int res = 0; 00987 00988 iterator->event_len = ast_event_get_size(event); 00989 iterator->event = event; 00990 if (iterator->event_len >= sizeof(*event) + sizeof(struct ast_event_ie)) { 00991 iterator->ie = (struct ast_event_ie *) ( ((char *) event) + sizeof(*event) ); 00992 } else { 00993 iterator->ie = NULL; 00994 res = -1; 00995 } 00996 00997 return res; 00998 }
int ast_event_iterator_next | ( | struct ast_event_iterator * | iterator | ) |
Move iterator instance to next IE.
iterator | The iterator instance |
0 | on success | |
-1 | if end is reached |
Definition at line 1000 of file event.c.
References ast_event_iterator::event, ast_event_iterator::event_len, ast_event_iterator::ie, and ast_event_ie::ie_payload_len.
Referenced by ast_event_get_ie_raw(), ast_event_get_ie_raw_payload_len(), and event_dump_cli().
01001 { 01002 iterator->ie = (struct ast_event_ie *) ( ((char *) iterator->ie) + sizeof(*iterator->ie) + ntohs(iterator->ie->ie_payload_len)); 01003 return ((iterator->event_len <= (((char *) iterator->ie) - ((char *) iterator->event))) ? -1 : 0); 01004 }
size_t ast_event_minimum_length | ( | void | ) |
struct ast_event* ast_event_new | ( | enum ast_event_type | event_type, | |
... | ||||
) |
Create a new event.
event_type | The type of event to create |
<enum ast_event_ie_type>, [enum ast_event_ie_pltype, [payload] ]
If the ie_type specified is *not* AST_EVENT_IE_END, then it must be followed by a valid IE payload type. The payload type, EXISTS, should not be used here because it makes no sense to do so. So, a payload must also be specified after the IE payload type.
if (!(event = ast_event_new(AST_EVENT_MWI, AST_EVENT_IE_MAILBOX, AST_EVENT_IE_PLTYPE_STR, mailbox, AST_EVENT_IE_NEWMSGS, AST_EVENT_IE_PLTYPE_UINT, new, AST_EVENT_IE_OLDMSGS, AST_EVENT_IE_PLTYPE_UINT, old, AST_EVENT_IE_END))) { return; }
This creates a MWI event with 3 information elements, a mailbox which is a string, and the number of new and old messages, specified as integers.
Definition at line 1162 of file event.c.
References ast_calloc, ast_event_append_eid(), ast_event_append_ie_bitflags(), ast_event_append_ie_raw(), ast_event_append_ie_str(), ast_event_append_ie_uint(), ast_event_get_ie_raw(), AST_EVENT_IE_EID, AST_EVENT_IE_END, AST_EVENT_IE_PLTYPE_BITFLAGS, AST_EVENT_IE_PLTYPE_EXISTS, AST_EVENT_IE_PLTYPE_RAW, AST_EVENT_IE_PLTYPE_STR, AST_EVENT_IE_PLTYPE_UINT, AST_EVENT_IE_PLTYPE_UNKNOWN, AST_LIST_HEAD_NOLOCK_STATIC, AST_LIST_INSERT_TAIL, AST_LIST_TRAVERSE, ast_log(), ast_event_ie_val::ie_pltype, ast_event_ie_val::ie_type, ast_event_sub::ie_vals, LOG_WARNING, ast_event_ie_val::payload, ast_event_ie_val::raw, ast_event_ie_val::raw_datalen, ast_event_ie_val::str, and ast_event_ie_val::uint.
Referenced by aji_handle_pubsub_event(), alloc_event(), ast_cel_report_event(), ast_event_get_cached(), ast_event_unsubscribe(), devstate_event(), gen_sub_event(), handle_request_notify(), notify_message(), process_collection(), queue_mwi_event(), and stun_monitor_request().
01163 { 01164 va_list ap; 01165 struct ast_event *event; 01166 enum ast_event_ie_type ie_type; 01167 struct ast_event_ie_val *ie_val; 01168 int has_ie = 0; 01169 AST_LIST_HEAD_NOLOCK_STATIC(ie_vals, ast_event_ie_val); 01170 01171 /* Invalid type */ 01172 if (type >= AST_EVENT_TOTAL) { 01173 ast_log(LOG_WARNING, "Someone tried to create an event of invalid " 01174 "type '%d'!\n", type); 01175 return NULL; 01176 } 01177 01178 va_start(ap, type); 01179 for (ie_type = va_arg(ap, enum ast_event_ie_type); 01180 ie_type != AST_EVENT_IE_END; 01181 ie_type = va_arg(ap, enum ast_event_ie_type)) 01182 { 01183 struct ast_event_ie_val *ie_value = alloca(sizeof(*ie_value)); 01184 int insert = 0; 01185 01186 memset(ie_value, 0, sizeof(*ie_value)); 01187 ie_value->ie_type = ie_type; 01188 ie_value->ie_pltype = va_arg(ap, enum ast_event_ie_pltype); 01189 switch (ie_value->ie_pltype) { 01190 case AST_EVENT_IE_PLTYPE_UINT: 01191 ie_value->payload.uint = va_arg(ap, uint32_t); 01192 insert = 1; 01193 break; 01194 case AST_EVENT_IE_PLTYPE_BITFLAGS: 01195 ie_value->payload.uint = va_arg(ap, uint32_t); 01196 insert = 1; 01197 break; 01198 case AST_EVENT_IE_PLTYPE_STR: 01199 ie_value->payload.str = va_arg(ap, const char *); 01200 insert = 1; 01201 break; 01202 case AST_EVENT_IE_PLTYPE_RAW: 01203 { 01204 void *data = va_arg(ap, void *); 01205 size_t datalen = va_arg(ap, size_t); 01206 ie_value->payload.raw = alloca(datalen); 01207 memcpy(ie_value->payload.raw, data, datalen); 01208 ie_value->raw_datalen = datalen; 01209 insert = 1; 01210 break; 01211 } 01212 case AST_EVENT_IE_PLTYPE_UNKNOWN: 01213 case AST_EVENT_IE_PLTYPE_EXISTS: 01214 break; 01215 } 01216 01217 if (insert) { 01218 AST_LIST_INSERT_TAIL(&ie_vals, ie_value, entry); 01219 has_ie = 1; 01220 } else { 01221 ast_log(LOG_WARNING, "Unsupported PLTYPE(%d)\n", ie_value->ie_pltype); 01222 } 01223 } 01224 va_end(ap); 01225 01226 if (!(event = ast_calloc(1, sizeof(*event)))) { 01227 return NULL; 01228 } 01229 01230 event->type = htons(type); 01231 event->event_len = htons(sizeof(*event)); 01232 01233 AST_LIST_TRAVERSE(&ie_vals, ie_val, entry) { 01234 switch (ie_val->ie_pltype) { 01235 case AST_EVENT_IE_PLTYPE_STR: 01236 ast_event_append_ie_str(&event, ie_val->ie_type, ie_val->payload.str); 01237 break; 01238 case AST_EVENT_IE_PLTYPE_UINT: 01239 ast_event_append_ie_uint(&event, ie_val->ie_type, ie_val->payload.uint); 01240 break; 01241 case AST_EVENT_IE_PLTYPE_BITFLAGS: 01242 ast_event_append_ie_bitflags(&event, ie_val->ie_type, ie_val->payload.uint); 01243 break; 01244 case AST_EVENT_IE_PLTYPE_RAW: 01245 ast_event_append_ie_raw(&event, ie_val->ie_type, 01246 ie_val->payload.raw, ie_val->raw_datalen); 01247 break; 01248 case AST_EVENT_IE_PLTYPE_EXISTS: 01249 case AST_EVENT_IE_PLTYPE_UNKNOWN: 01250 break; 01251 } 01252 01253 if (!event) { 01254 break; 01255 } 01256 } 01257 01258 if (has_ie && !ast_event_get_ie_raw(event, AST_EVENT_IE_EID)) { 01259 /* If the event is originating on this server, add the server's 01260 * entity ID to the event. */ 01261 ast_event_append_eid(&event); 01262 } 01263 01264 return event; 01265 }
int ast_event_queue | ( | struct ast_event * | event | ) |
Queue an event.
event | the event to be queued |
zero | success | |
non-zero | failure. Note that the caller of this function is responsible for destroying the event in the case of a failure. |
Definition at line 1476 of file event.c.
References alloc_event_ref(), ao2_ref, ast_event_check_subscriber(), ast_event_destroy(), AST_EVENT_IE_END, AST_EVENT_SUB_NONE, ast_log(), ast_taskprocessor_push(), ast_event_ref::event, event_dispatcher, handle_event(), and LOG_WARNING.
Referenced by ast_cel_report_event(), ast_event_queue_and_cache(), ast_event_sub_activate(), ast_event_unsubscribe(), handle_security_event(), and stun_monitor_request().
01477 { 01478 struct ast_event_ref *event_ref; 01479 uint16_t host_event_type; 01480 int res; 01481 01482 host_event_type = ntohs(event->type); 01483 01484 /* Invalid type */ 01485 if (host_event_type >= AST_EVENT_TOTAL) { 01486 ast_log(LOG_WARNING, "Someone tried to queue an event of invalid " 01487 "type '%d'!\n", host_event_type); 01488 return -1; 01489 } 01490 01491 /* If nobody has subscribed to this event type, throw it away now */ 01492 if (ast_event_check_subscriber(host_event_type, AST_EVENT_IE_END) 01493 == AST_EVENT_SUB_NONE) { 01494 ast_event_destroy(event); 01495 return 0; 01496 } 01497 01498 if (!(event_ref = alloc_event_ref())) { 01499 return -1; 01500 } 01501 01502 event_ref->event = event; 01503 01504 res = ast_taskprocessor_push(event_dispatcher, handle_event, event_ref); 01505 if (res) { 01506 event_ref->event = NULL; 01507 ao2_ref(event_ref, -1); 01508 } 01509 return res; 01510 }
int ast_event_queue_and_cache | ( | struct ast_event * | event | ) |
Queue and cache an event.
event | the event to be queued and cached |
The event API already knows which events can be cached and how to cache them.
0 | success | |
non-zero | failure. |
Definition at line 1424 of file event.c.
References ast_event_cache, ast_event_destroy(), ast_event_get_type(), ast_event_queue(), ast_log(), container, event_update_cache(), and LOG_WARNING.
Referenced by aji_handle_pubsub_event(), devstate_event(), handle_request_notify(), notify_message(), process_collection(), queue_event(), and queue_mwi_event().
01425 { 01426 struct ao2_container *container; 01427 01428 container = ast_event_cache[ast_event_get_type(event)].container; 01429 if (!container) { 01430 ast_log(LOG_WARNING, "cache requested for non-cached event type\n"); 01431 } else { 01432 event_update_cache(container, event); 01433 } 01434 01435 if (ast_event_queue(event)) { 01436 ast_event_destroy(event); 01437 } 01438 return 0; 01439 }
void ast_event_report_subs | ( | const struct ast_event_sub * | sub | ) |
Report current subscriptions to a subscription subscriber.
The idea here is that it is sometimes very useful for a module to know when someone subscribes to events. However, when they first subscribe, this provides that module the ability to request the event core report to them all of the subscriptions to that event type that already exist.
Definition at line 677 of file event.c.
References ast_event_destroy(), AST_EVENT_IE_EVENTTYPE, AST_EVENT_SUB, ast_event_subs, AST_LIST_TRAVERSE, AST_RWDLLIST_RDLOCK, AST_RWDLLIST_TRAVERSE, AST_RWDLLIST_UNLOCK, ast_event_sub::cb, event_sub, gen_sub_event(), ast_event_ie_val::ie_type, ast_event_sub::ie_vals, ast_event_ie_val::payload, ast_event_sub::type, ast_event_ie_val::uint, and ast_event_sub::userdata.
Referenced by handle_cli_status(), and start_poll_thread().
00678 { 00679 struct ast_event *event; 00680 struct ast_event_sub *sub; 00681 enum ast_event_type event_type = -1; 00682 struct ast_event_ie_val *ie_val; 00683 00684 if (event_sub->type != AST_EVENT_SUB) 00685 return; 00686 00687 AST_LIST_TRAVERSE(&event_sub->ie_vals, ie_val, entry) { 00688 if (ie_val->ie_type == AST_EVENT_IE_EVENTTYPE) { 00689 event_type = ie_val->payload.uint; 00690 break; 00691 } 00692 } 00693 00694 if (event_type == -1) 00695 return; 00696 00697 AST_RWDLLIST_RDLOCK(&ast_event_subs[event_type]); 00698 AST_RWDLLIST_TRAVERSE(&ast_event_subs[event_type], sub, entry) { 00699 if (event_sub == sub) { 00700 continue; 00701 } 00702 00703 event = gen_sub_event(sub); 00704 if (!event) { 00705 continue; 00706 } 00707 00708 event_sub->cb(event, event_sub->userdata); 00709 00710 ast_event_destroy(event); 00711 } 00712 AST_RWDLLIST_UNLOCK(&ast_event_subs[event_type]); 00713 }
int ast_event_str_to_event_type | ( | const char * | str, | |
enum ast_event_type * | event_type | |||
) |
Convert a string into an event type.
str | the string to convert | |
event_type | an output parameter for the event type |
0 | success | |
non-zero | failure |
Definition at line 283 of file event.c.
References ARRAY_LEN, ast_strlen_zero(), and event_names.
Referenced by event_dump_cache().
00284 { 00285 int i; 00286 00287 for (i = 0; i < ARRAY_LEN(event_names); i++) { 00288 if (ast_strlen_zero(event_names[i]) || strcasecmp(event_names[i], str)) { 00289 continue; 00290 } 00291 00292 *event_type = i; 00293 return 0; 00294 } 00295 00296 return -1; 00297 }
int ast_event_str_to_ie_type | ( | const char * | str, | |
enum ast_event_ie_type * | ie_type | |||
) |
Convert a string to an IE type.
str | the string to convert | |
ie_type | an output parameter for the IE type |
0 | success | |
non-zero | failure |
Definition at line 319 of file event.c.
References ARRAY_LEN, ie_maps, and name.
00320 { 00321 int i; 00322 00323 for (i = 0; i < ARRAY_LEN(ie_maps); i++) { 00324 if (strcasecmp(ie_maps[i].name, str)) { 00325 continue; 00326 } 00327 00328 *ie_type = i; 00329 return 0; 00330 } 00331 00332 return -1; 00333 }
int ast_event_sub_activate | ( | struct ast_event_sub * | sub | ) |
Activate a dynamically built subscription.
sub | the subscription to activate that was allocated using ast_event_subscribe_new() |
0 | success | |
non-zero | failure |
Definition at line 859 of file event.c.
References ast_event_check_subscriber(), ast_event_destroy(), AST_EVENT_IE_END, AST_EVENT_IE_EVENTTYPE, AST_EVENT_IE_PLTYPE_UINT, ast_event_queue(), AST_EVENT_SUB, AST_EVENT_SUB_NONE, ast_event_subs, AST_RWDLLIST_INSERT_TAIL, AST_RWDLLIST_UNLOCK, AST_RWDLLIST_WRLOCK, gen_sub_event(), and ast_event_sub::type.
Referenced by ast_event_subscribe().
00860 { 00861 if (ast_event_check_subscriber(AST_EVENT_SUB, 00862 AST_EVENT_IE_EVENTTYPE, AST_EVENT_IE_PLTYPE_UINT, sub->type, 00863 AST_EVENT_IE_END) != AST_EVENT_SUB_NONE) { 00864 struct ast_event *event; 00865 00866 event = gen_sub_event(sub); 00867 if (event && ast_event_queue(event)) { 00868 ast_event_destroy(event); 00869 } 00870 } 00871 00872 AST_RWDLLIST_WRLOCK(&ast_event_subs[sub->type]); 00873 AST_RWDLLIST_INSERT_TAIL(&ast_event_subs[sub->type], sub, entry); 00874 AST_RWDLLIST_UNLOCK(&ast_event_subs[sub->type]); 00875 00876 return 0; 00877 }
int ast_event_sub_append_ie_bitflags | ( | struct ast_event_sub * | sub, | |
enum ast_event_ie_type | ie_type, | |||
uint32_t | flags | |||
) |
Append a bitflags parameter to a subscription.
sub | the dynamic subscription allocated with ast_event_subscribe_new() | |
ie_type | the information element type for the parameter | |
flags | the flags that must be present in the event to match this subscription |
0 | success | |
non-zero | failure |
Definition at line 759 of file event.c.
References ast_calloc, AST_EVENT_IE_PLTYPE_BITFLAGS, AST_EVENT_IE_TOTAL, AST_LIST_INSERT_TAIL, and ast_event_sub::ie_vals.
Referenced by ast_event_subscribe().
00761 { 00762 struct ast_event_ie_val *ie_val; 00763 00764 if (ie_type <= 0 || ie_type >= AST_EVENT_IE_TOTAL) { 00765 return -1; 00766 } 00767 00768 if (!(ie_val = ast_calloc(1, sizeof(*ie_val)))) { 00769 return -1; 00770 } 00771 00772 ie_val->ie_type = ie_type; 00773 ie_val->payload.uint = flags; 00774 ie_val->ie_pltype = AST_EVENT_IE_PLTYPE_BITFLAGS; 00775 00776 AST_LIST_INSERT_TAIL(&sub->ie_vals, ie_val, entry); 00777 00778 return 0; 00779 }
int ast_event_sub_append_ie_exists | ( | struct ast_event_sub * | sub, | |
enum ast_event_ie_type | ie_type | |||
) |
Append an 'exists' parameter to a subscription.
sub | the dynamic subscription allocated with ast_event_subscribe_new() | |
ie_type | the information element type that must be present in the event for it to match this subscription. |
0 | success | |
non-zero | failure |
Definition at line 781 of file event.c.
References ast_calloc, AST_EVENT_IE_PLTYPE_EXISTS, AST_EVENT_IE_TOTAL, AST_LIST_INSERT_TAIL, and ast_event_sub::ie_vals.
Referenced by ast_event_subscribe().
00783 { 00784 struct ast_event_ie_val *ie_val; 00785 00786 if (ie_type <= 0 || ie_type >= AST_EVENT_IE_TOTAL) { 00787 return -1; 00788 } 00789 00790 if (!(ie_val = ast_calloc(1, sizeof(*ie_val)))) { 00791 return -1; 00792 } 00793 00794 ie_val->ie_type = ie_type; 00795 ie_val->ie_pltype = AST_EVENT_IE_PLTYPE_EXISTS; 00796 00797 AST_LIST_INSERT_TAIL(&sub->ie_vals, ie_val, entry); 00798 00799 return 0; 00800 }
int ast_event_sub_append_ie_raw | ( | struct ast_event_sub * | sub, | |
enum ast_event_ie_type | ie_type, | |||
void * | data, | |||
size_t | raw_datalen | |||
) |
Append a raw parameter to a subscription.
sub | the dynamic subscription allocated with ast_event_subscribe_new() | |
ie_type | the information element type for the parameter | |
data | the data that must be present in the event to match this subscription | |
raw_datalen | length of data |
0 | success | |
non-zero | failure |
Definition at line 830 of file event.c.
References ast_calloc, AST_EVENT_IE_PLTYPE_RAW, AST_EVENT_IE_TOTAL, ast_free, AST_LIST_INSERT_TAIL, ast_malloc, and ast_event_sub::ie_vals.
Referenced by ast_event_subscribe().
00832 { 00833 struct ast_event_ie_val *ie_val; 00834 00835 if (ie_type <= 0 || ie_type >= AST_EVENT_IE_TOTAL) { 00836 return -1; 00837 } 00838 00839 if (!(ie_val = ast_calloc(1, sizeof(*ie_val)))) { 00840 return -1; 00841 } 00842 00843 ie_val->ie_type = ie_type; 00844 ie_val->ie_pltype = AST_EVENT_IE_PLTYPE_RAW; 00845 ie_val->raw_datalen = raw_datalen; 00846 00847 if (!(ie_val->payload.raw = ast_malloc(raw_datalen))) { 00848 ast_free(ie_val); 00849 return -1; 00850 } 00851 00852 memcpy(ie_val->payload.raw, data, raw_datalen); 00853 00854 AST_LIST_INSERT_TAIL(&sub->ie_vals, ie_val, entry); 00855 00856 return 0; 00857 }
int ast_event_sub_append_ie_str | ( | struct ast_event_sub * | sub, | |
enum ast_event_ie_type | ie_type, | |||
const char * | str | |||
) |
Append a string parameter to a subscription.
sub | the dynamic subscription allocated with ast_event_subscribe_new() | |
ie_type | the information element type for the parameter | |
str | the string that must be present in the event to match this subscription |
0 | success | |
non-zero | failure |
Definition at line 802 of file event.c.
References ast_calloc, AST_EVENT_IE_PLTYPE_STR, AST_EVENT_IE_TOTAL, ast_free, AST_LIST_INSERT_TAIL, ast_str_hash(), ast_strdup, and ast_event_sub::ie_vals.
Referenced by ast_event_subscribe(), and handle_devstate_change().
00804 { 00805 struct ast_event_ie_val *ie_val; 00806 00807 if (ie_type <= 0 || ie_type >= AST_EVENT_IE_TOTAL) { 00808 return -1; 00809 } 00810 00811 if (!(ie_val = ast_calloc(1, sizeof(*ie_val)))) { 00812 return -1; 00813 } 00814 00815 ie_val->ie_type = ie_type; 00816 ie_val->ie_pltype = AST_EVENT_IE_PLTYPE_STR; 00817 00818 if (!(ie_val->payload.str = ast_strdup(str))) { 00819 ast_free(ie_val); 00820 return -1; 00821 } 00822 00823 ie_val->payload.hash = ast_str_hash(str); 00824 00825 AST_LIST_INSERT_TAIL(&sub->ie_vals, ie_val, entry); 00826 00827 return 0; 00828 }
int ast_event_sub_append_ie_uint | ( | struct ast_event_sub * | sub, | |
enum ast_event_ie_type | ie_type, | |||
uint32_t | uint | |||
) |
Append a uint parameter to a subscription.
sub | the dynamic subscription allocated with ast_event_subscribe_new() | |
ie_type | the information element type for the parameter | |
uint | the value that must be present in the event to match this subscription |
0 | success | |
non-zero | failure |
Definition at line 737 of file event.c.
References ast_calloc, AST_EVENT_IE_PLTYPE_UINT, AST_EVENT_IE_TOTAL, AST_LIST_INSERT_TAIL, and ast_event_sub::ie_vals.
Referenced by ast_event_subscribe(), and handle_cli_status().
00739 { 00740 struct ast_event_ie_val *ie_val; 00741 00742 if (ie_type <= 0 || ie_type >= AST_EVENT_IE_TOTAL) { 00743 return -1; 00744 } 00745 00746 if (!(ie_val = ast_calloc(1, sizeof(*ie_val)))) { 00747 return -1; 00748 } 00749 00750 ie_val->ie_type = ie_type; 00751 ie_val->payload.uint = unsigned_int; 00752 ie_val->ie_pltype = AST_EVENT_IE_PLTYPE_UINT; 00753 00754 AST_LIST_INSERT_TAIL(&sub->ie_vals, ie_val, entry); 00755 00756 return 0; 00757 }
void ast_event_sub_destroy | ( | struct ast_event_sub * | sub | ) |
Destroy an allocated subscription.
sub | the subscription to destroy |
Definition at line 941 of file event.c.
References ast_event_ie_val_destroy(), ast_free, AST_LIST_REMOVE_HEAD, and ast_event_sub::ie_vals.
Referenced by ast_event_unsubscribe(), handle_cli_status(), and handle_devstate_change().
00942 { 00943 struct ast_event_ie_val *ie_val; 00944 00945 while ((ie_val = AST_LIST_REMOVE_HEAD(&sub->ie_vals, entry))) { 00946 ast_event_ie_val_destroy(ie_val); 00947 } 00948 00949 ast_free(sub); 00950 }
struct ast_event_sub* ast_event_subscribe | ( | enum ast_event_type | event_type, | |
ast_event_cb_t | cb, | |||
const char * | description, | |||
void * | userdata, | |||
... | ||||
) |
Subscribe to events.
event_type | The type of events to subscribe to | |
cb | The function to be called with events | |
description | Description of the subscription. | |
userdata | data to be passed to the event callback |
<enum ast_event_ie_type>, [enum ast_event_ie_pltype, [payload] ]
If the ie_type specified is *not* AST_EVENT_IE_END, then it must be followed by a valid IE payload type. If the payload type specified is AST_EVENT_IE_PLTYPE_EXISTS, then the 3rd argument should not be provided. Otherwise, a payload must also be specified.
peer->mwi_event_sub = ast_event_subscribe(AST_EVENT_MWI, mwi_event_cb, peer, AST_EVENT_IE_MAILBOX, AST_EVENT_IE_PLTYPE_STR, peer->mailbox, AST_EVENT_IE_END);
This creates a subscription to AST_EVENT_MWI events that contain an information element, AST_EVENT_IE_MAILBOX, with the same string value contained in peer->mailbox. Also, the event callback will be passed a pointer to the peer.
Definition at line 879 of file event.c.
References ast_copy_string(), AST_EVENT_IE_END, AST_EVENT_IE_PLTYPE_BITFLAGS, AST_EVENT_IE_PLTYPE_EXISTS, AST_EVENT_IE_PLTYPE_RAW, AST_EVENT_IE_PLTYPE_STR, AST_EVENT_IE_PLTYPE_UINT, AST_EVENT_IE_PLTYPE_UNKNOWN, ast_event_sub_activate(), ast_event_sub_append_ie_bitflags(), ast_event_sub_append_ie_exists(), ast_event_sub_append_ie_raw(), ast_event_sub_append_ie_str(), ast_event_sub_append_ie_uint(), ast_event_subscribe_new(), ast_event_sub::description, and str.
Referenced by add_peer_mwi_subs(), add_publish_event(), aji_init_event_distribution(), ast_enable_distributed_devstate(), build_peer(), cc_generic_agent_start_monitoring(), config_line(), create_new_generic_list(), load_module(), load_pbx(), network_change_event_subscribe(), sig_pri_start_pri(), and start_poll_thread().
00881 { 00882 va_list ap; 00883 enum ast_event_ie_type ie_type; 00884 struct ast_event_sub *sub; 00885 00886 if (!(sub = ast_event_subscribe_new(type, cb, userdata))) { 00887 return NULL; 00888 } 00889 00890 ast_copy_string(sub->description, description, sizeof(sub->description)); 00891 00892 va_start(ap, userdata); 00893 for (ie_type = va_arg(ap, enum ast_event_ie_type); 00894 ie_type != AST_EVENT_IE_END; 00895 ie_type = va_arg(ap, enum ast_event_ie_type)) 00896 { 00897 enum ast_event_ie_pltype ie_pltype; 00898 00899 ie_pltype = va_arg(ap, enum ast_event_ie_pltype); 00900 00901 switch (ie_pltype) { 00902 case AST_EVENT_IE_PLTYPE_UNKNOWN: 00903 break; 00904 case AST_EVENT_IE_PLTYPE_UINT: 00905 { 00906 uint32_t unsigned_int = va_arg(ap, uint32_t); 00907 ast_event_sub_append_ie_uint(sub, ie_type, unsigned_int); 00908 break; 00909 } 00910 case AST_EVENT_IE_PLTYPE_BITFLAGS: 00911 { 00912 uint32_t unsigned_int = va_arg(ap, uint32_t); 00913 ast_event_sub_append_ie_bitflags(sub, ie_type, unsigned_int); 00914 break; 00915 } 00916 case AST_EVENT_IE_PLTYPE_STR: 00917 { 00918 const char *str = va_arg(ap, const char *); 00919 ast_event_sub_append_ie_str(sub, ie_type, str); 00920 break; 00921 } 00922 case AST_EVENT_IE_PLTYPE_RAW: 00923 { 00924 void *data = va_arg(ap, void *); 00925 size_t data_len = va_arg(ap, size_t); 00926 ast_event_sub_append_ie_raw(sub, ie_type, data, data_len); 00927 break; 00928 } 00929 case AST_EVENT_IE_PLTYPE_EXISTS: 00930 ast_event_sub_append_ie_exists(sub, ie_type); 00931 break; 00932 } 00933 } 00934 va_end(ap); 00935 00936 ast_event_sub_activate(sub); 00937 00938 return sub; 00939 }
struct ast_event_sub* ast_event_subscribe_new | ( | enum ast_event_type | type, | |
ast_event_cb_t | cb, | |||
void * | userdata | |||
) |
Allocate a subscription, but do not activate it.
type | the event type to subscribe to | |
cb | the function to call when an event matches this subscription | |
userdata | data to pass to the provided callback |
Definition at line 715 of file event.c.
References ast_atomic_fetchadd_int(), ast_calloc, ast_log(), and LOG_ERROR.
Referenced by ast_event_subscribe(), handle_cli_status(), and handle_devstate_change().
00717 { 00718 struct ast_event_sub *sub; 00719 00720 if (type < 0 || type >= AST_EVENT_TOTAL) { 00721 ast_log(LOG_ERROR, "%u is an invalid type!\n", type); 00722 return NULL; 00723 } 00724 00725 if (!(sub = ast_calloc(1, sizeof(*sub)))) { 00726 return NULL; 00727 } 00728 00729 sub->type = type; 00730 sub->cb = cb; 00731 sub->userdata = userdata; 00732 sub->uniqueid = ast_atomic_fetchadd_int((int *) &sub_uniqueid, 1); 00733 00734 return sub; 00735 }
const char* ast_event_subscriber_get_description | ( | struct ast_event_sub * | sub | ) |
Get description for a subscription.
sub | subscription |
Definition at line 952 of file event.c.
References ast_event_sub::description.
00953 { 00954 return sub ? sub->description : NULL; 00955 }
struct ast_event_sub* ast_event_unsubscribe | ( | struct ast_event_sub * | event_sub | ) |
Un-subscribe from events.
event_sub | This is the reference to the subscription returned by ast_event_subscribe. |
Definition at line 957 of file event.c.
References AST_DLLIST_REMOVE, ast_event_check_subscriber(), ast_event_destroy(), AST_EVENT_IE_DESCRIPTION, AST_EVENT_IE_END, AST_EVENT_IE_EVENTTYPE, AST_EVENT_IE_PLTYPE_STR, AST_EVENT_IE_PLTYPE_UINT, AST_EVENT_IE_UNIQUEID, ast_event_new(), ast_event_queue(), ast_event_sub_destroy(), AST_EVENT_SUB_NONE, ast_event_subs, AST_EVENT_UNSUB, AST_RWDLLIST_UNLOCK, AST_RWDLLIST_WRLOCK, ast_event_sub::description, ast_event_sub::type, and ast_event_sub::uniqueid.
Referenced by add_peer_mwi_subs(), cc_generic_agent_destructor(), destroy_dahdi_pvt(), destroy_mailbox(), generic_agent_devstate_unsubscribe(), generic_monitor_instance_list_destructor(), network_change_event_unsubscribe(), peer_destructor(), publish_event_destroy(), sig_pri_start_pri(), sig_pri_stop_pri(), stop_poll_thread(), and unload_module().
00958 { 00959 struct ast_event *event; 00960 00961 AST_RWDLLIST_WRLOCK(&ast_event_subs[sub->type]); 00962 AST_DLLIST_REMOVE(&ast_event_subs[sub->type], sub, entry); 00963 AST_RWDLLIST_UNLOCK(&ast_event_subs[sub->type]); 00964 00965 if (ast_event_check_subscriber(AST_EVENT_UNSUB, 00966 AST_EVENT_IE_EVENTTYPE, AST_EVENT_IE_PLTYPE_UINT, sub->type, 00967 AST_EVENT_IE_END) != AST_EVENT_SUB_NONE) { 00968 00969 event = ast_event_new(AST_EVENT_UNSUB, 00970 AST_EVENT_IE_UNIQUEID, AST_EVENT_IE_PLTYPE_UINT, sub->uniqueid, 00971 AST_EVENT_IE_EVENTTYPE, AST_EVENT_IE_PLTYPE_UINT, sub->type, 00972 AST_EVENT_IE_DESCRIPTION, AST_EVENT_IE_PLTYPE_STR, sub->description, 00973 AST_EVENT_IE_END); 00974 if (event && ast_event_queue(event)) { 00975 ast_event_destroy(event); 00976 } 00977 } 00978 00979 ast_event_sub_destroy(sub); 00980 00981 return NULL; 00982 }