#include "asterisk/event.h"
Go to the source code of this file.
Definition in file cel.h.
#define AST_CEL_EVENT_RECORD_VERSION 2 |
struct ABI version
Definition at line 234 of file cel.h.
Referenced by ast_cel_fabricate_channel_from_event(), and ast_cel_fill_record().
enum ast_cel_ama_flag |
AMA Flags.
AST_CEL_AMA_FLAG_NONE | |
AST_CEL_AMA_FLAG_OMIT | |
AST_CEL_AMA_FLAG_BILLING | |
AST_CEL_AMA_FLAG_DOCUMENTATION | |
AST_CEL_AMA_FLAG_TOTAL | Must be final entry. |
Definition at line 36 of file cel.h.
00036 { 00037 AST_CEL_AMA_FLAG_NONE, 00038 AST_CEL_AMA_FLAG_OMIT, 00039 AST_CEL_AMA_FLAG_BILLING, 00040 AST_CEL_AMA_FLAG_DOCUMENTATION, 00041 /*! \brief Must be final entry */ 00042 AST_CEL_AMA_FLAG_TOTAL, 00043 };
enum ast_cel_event_type |
CEL event types.
Definition at line 48 of file cel.h.
00048 { 00049 /*! \brief channel birth */ 00050 AST_CEL_CHANNEL_START = 1, 00051 /*! \brief channel end */ 00052 AST_CEL_CHANNEL_END = 2, 00053 /*! \brief hangup terminates connection */ 00054 AST_CEL_HANGUP = 3, 00055 /*! \brief A ringing phone is answered */ 00056 AST_CEL_ANSWER = 4, 00057 /*! \brief an app starts */ 00058 AST_CEL_APP_START = 5, 00059 /*! \brief an app ends */ 00060 AST_CEL_APP_END = 6, 00061 /*! \brief a bridge is established */ 00062 AST_CEL_BRIDGE_START = 7, 00063 /*! \brief a bridge is torn down */ 00064 AST_CEL_BRIDGE_END = 8, 00065 /*! \brief a conference is started */ 00066 AST_CEL_CONF_START = 9, 00067 /*! \brief a conference is ended */ 00068 AST_CEL_CONF_END = 10, 00069 /*! \brief a channel is parked */ 00070 AST_CEL_PARK_START = 11, 00071 /*! \brief channel out of the park */ 00072 AST_CEL_PARK_END = 12, 00073 /*! \brief a transfer occurs */ 00074 AST_CEL_BLINDTRANSFER = 13, 00075 /*! \brief a transfer occurs */ 00076 AST_CEL_ATTENDEDTRANSFER = 14, 00077 /*! \brief a transfer occurs */ 00078 AST_CEL_TRANSFER = 15, 00079 /*! \brief a 3-way conference, usually part of a transfer */ 00080 AST_CEL_HOOKFLASH = 16, 00081 /*! \brief a 3-way conference, usually part of a transfer */ 00082 AST_CEL_3WAY_START = 17, 00083 /*! \brief a 3-way conference, usually part of a transfer */ 00084 AST_CEL_3WAY_END = 18, 00085 /*! \brief channel enters a conference */ 00086 AST_CEL_CONF_ENTER = 19, 00087 /*! \brief channel exits a conference */ 00088 AST_CEL_CONF_EXIT = 20, 00089 /*! \brief a user-defined event, the event name field should be set */ 00090 AST_CEL_USER_DEFINED = 21, 00091 /*! \brief the last channel with the given linkedid is retired */ 00092 AST_CEL_LINKEDID_END = 22, 00093 /*! \brief a masquerade happened to alter the participants on a bridge */ 00094 AST_CEL_BRIDGE_UPDATE = 23, 00095 /*! \brief a directed pickup was performed on this channel */ 00096 AST_CEL_PICKUP = 24, 00097 /*! \brief this call was forwarded somewhere else */ 00098 AST_CEL_FORWARD = 25, 00099 };
struct ast_cel* ast_cel_alloc | ( | void | ) |
Allocate a CEL record.
non-NULL | an allocated ast_cel structure | |
NULL | error |
unsigned int ast_cel_check_enabled | ( | void | ) |
Check to see if CEL is enabled.
zero | not enabled | |
non-zero | enabled |
Definition at line 131 of file cel.c.
00132 { 00133 return cel_enabled; 00134 }
void ast_cel_check_retire_linkedid | ( | struct ast_channel * | chan | ) |
Check and potentially retire a Linked ID.
chan | channel that is being destroyed or its linkedid is changing |
Definition at line 382 of file cel.c.
References AST_CEL_LINKEDID_END, ast_cel_report_event(), ast_cel_track_event(), ast_channel_callback(), ast_channel_unref, ast_strlen_zero(), channel_find_data::chan, channel_find_data::linkedid, ast_channel::linkedid, and linkedid_match().
Referenced by ast_channel_change_linkedid(), and ast_channel_destructor().
00383 { 00384 const char *linkedid = chan->linkedid; 00385 struct channel_find_data find_dat; 00386 00387 /* make sure we need to do all this work */ 00388 00389 if (!ast_strlen_zero(linkedid) && ast_cel_track_event(AST_CEL_LINKEDID_END)) { 00390 struct ast_channel *tmp = NULL; 00391 find_dat.chan = chan; 00392 find_dat.linkedid = linkedid; 00393 if ((tmp = ast_channel_callback(linkedid_match, NULL, &find_dat, 0))) { 00394 tmp = ast_channel_unref(tmp); 00395 } else { 00396 ast_cel_report_event(chan, AST_CEL_LINKEDID_END, NULL, NULL, NULL); 00397 } 00398 } 00399 }
void ast_cel_destroy | ( | struct ast_cel * | cel | ) |
Destroy a CEL record.
cel | the record to destroy |
struct ast_channel* ast_cel_fabricate_channel_from_event | ( | const struct ast_event * | event | ) |
Create a fake channel from data in a CEL event.
This function creates a fake channel containing the serialized channel data in the given cel event. It must be released with ast_channel_release.
event | the CEL event |
Definition at line 401 of file cel.c.
References ast_cel_event_record::account_code, accountcode, ast_cel_event_record::amaflag, ast_channel::amaflags, ast_party_caller::ani, ast_channel::appl, ast_cel_event_record::application_data, ast_cel_event_record::application_name, AST_CEL_EVENT_RECORD_VERSION, ast_cel_fill_record(), ast_channel_release(), ast_copy_string(), ast_dummy_channel_alloc(), AST_LIST_INSERT_HEAD, ast_localtime(), ast_strdup, ast_strftime(), ast_string_field_set, ast_strlen_zero(), ast_var_assign(), ast_channel::caller, ast_cel_event_record::caller_id_ani, ast_cel_event_record::caller_id_dnid, ast_cel_event_record::caller_id_name, ast_cel_event_record::caller_id_num, ast_cel_event_record::caller_id_rdnis, ast_cel_event_record::channel_name, ast_channel::context, ast_cel_event_record::context, ast_channel::data, ast_channel::dialed, ast_cel_event_record::event_name, ast_cel_event_record::event_time, ast_channel::exten, ast_cel_event_record::extension, ast_cel_event_record::extra, ast_party_redirecting::from, ast_party_caller::id, ast_cel_event_record::linked_id, ast_party_id::name, name, ast_party_id::number, ast_party_dialed::number, pbx_builtin_setvar_helper(), ast_cel_event_record::peer, ast_cel_event_record::peer_account, ast_channel::redirecting, ast_party_name::str, ast_party_number::str, ast_party_dialed::str, ast_cel_event_record::unique_id, ast_cel_event_record::user_field, ast_party_name::valid, ast_party_number::valid, ast_channel::varshead, and ast_cel_event_record::version.
00402 { 00403 struct varshead *headp; 00404 struct ast_var_t *newvariable; 00405 char timebuf[30]; 00406 struct ast_channel *tchan; 00407 struct ast_cel_event_record record = { 00408 .version = AST_CEL_EVENT_RECORD_VERSION, 00409 }; 00410 00411 /* do not call ast_channel_alloc because this is not really a real channel */ 00412 if (!(tchan = ast_dummy_channel_alloc())) { 00413 return NULL; 00414 } 00415 00416 headp = &tchan->varshead; 00417 00418 /* first, get the variables from the event */ 00419 if (ast_cel_fill_record(event, &record)) { 00420 ast_channel_release(tchan); 00421 return NULL; 00422 } 00423 00424 /* next, fill the channel with their data */ 00425 if ((newvariable = ast_var_assign("eventtype", record.event_name))) { 00426 AST_LIST_INSERT_HEAD(headp, newvariable, entries); 00427 } 00428 00429 if (ast_strlen_zero(cel_dateformat)) { 00430 snprintf(timebuf, sizeof(timebuf), "%ld.%06ld", (long) record.event_time.tv_sec, 00431 (long) record.event_time.tv_usec); 00432 } else { 00433 struct ast_tm tm; 00434 ast_localtime(&record.event_time, &tm, NULL); 00435 ast_strftime(timebuf, sizeof(timebuf), cel_dateformat, &tm); 00436 } 00437 00438 if ((newvariable = ast_var_assign("eventtime", timebuf))) { 00439 AST_LIST_INSERT_HEAD(headp, newvariable, entries); 00440 } 00441 00442 if ((newvariable = ast_var_assign("eventextra", record.extra))) { 00443 AST_LIST_INSERT_HEAD(headp, newvariable, entries); 00444 } 00445 00446 tchan->caller.id.name.valid = 1; 00447 tchan->caller.id.name.str = ast_strdup(record.caller_id_name); 00448 tchan->caller.id.number.valid = 1; 00449 tchan->caller.id.number.str = ast_strdup(record.caller_id_num); 00450 tchan->caller.ani.number.valid = 1; 00451 tchan->caller.ani.number.str = ast_strdup(record.caller_id_ani); 00452 tchan->redirecting.from.number.valid = 1; 00453 tchan->redirecting.from.number.str = ast_strdup(record.caller_id_rdnis); 00454 tchan->dialed.number.str = ast_strdup(record.caller_id_dnid); 00455 00456 ast_copy_string(tchan->exten, record.extension, sizeof(tchan->exten)); 00457 ast_copy_string(tchan->context, record.context, sizeof(tchan->context)); 00458 ast_string_field_set(tchan, name, record.channel_name); 00459 ast_string_field_set(tchan, uniqueid, record.unique_id); 00460 ast_string_field_set(tchan, linkedid, record.linked_id); 00461 ast_string_field_set(tchan, accountcode, record.account_code); 00462 ast_string_field_set(tchan, peeraccount, record.peer_account); 00463 ast_string_field_set(tchan, userfield, record.user_field); 00464 00465 pbx_builtin_setvar_helper(tchan, "BRIDGEPEER", record.peer); 00466 00467 tchan->appl = ast_strdup(record.application_name); 00468 tchan->data = ast_strdup(record.application_data); 00469 tchan->amaflags = record.amaflag; 00470 00471 return tchan; 00472 }
int ast_cel_fill_record | ( | const struct ast_event * | event, | |
struct ast_cel_event_record * | r | |||
) |
Fill in an ast_cel_event_record from a CEL event.
[in] | event | the CEL event |
[out] | r | the ast_cel_event_record to fill in |
0 | success | |
non-zero | failure |
Definition at line 582 of file cel.c.
References ast_cel_event_record::account_code, ast_cel_event_record::amaflag, ast_cel_event_record::application_data, ast_cel_event_record::application_name, AST_CEL_EVENT_RECORD_VERSION, ast_cel_get_type_name(), AST_CEL_USER_DEFINED, ast_event_get_ie_str(), ast_event_get_ie_uint(), AST_EVENT_IE_CEL_ACCTCODE, AST_EVENT_IE_CEL_AMAFLAGS, AST_EVENT_IE_CEL_APPDATA, AST_EVENT_IE_CEL_APPNAME, AST_EVENT_IE_CEL_CHANNAME, AST_EVENT_IE_CEL_CIDANI, AST_EVENT_IE_CEL_CIDDNID, AST_EVENT_IE_CEL_CIDNAME, AST_EVENT_IE_CEL_CIDNUM, AST_EVENT_IE_CEL_CIDRDNIS, AST_EVENT_IE_CEL_CONTEXT, AST_EVENT_IE_CEL_EVENT_TIME, AST_EVENT_IE_CEL_EVENT_TIME_USEC, AST_EVENT_IE_CEL_EVENT_TYPE, AST_EVENT_IE_CEL_EXTEN, AST_EVENT_IE_CEL_EXTRA, AST_EVENT_IE_CEL_LINKEDID, AST_EVENT_IE_CEL_PEER, AST_EVENT_IE_CEL_UNIQUEID, AST_EVENT_IE_CEL_USEREVENT_NAME, AST_EVENT_IE_CEL_USERFIELD, ast_log(), ast_cel_event_record::caller_id_ani, ast_cel_event_record::caller_id_dnid, ast_cel_event_record::caller_id_name, ast_cel_event_record::caller_id_num, ast_cel_event_record::caller_id_rdnis, ast_cel_event_record::channel_name, ast_cel_event_record::context, ast_cel_event_record::event_name, ast_cel_event_record::event_time, ast_cel_event_record::event_type, ast_cel_event_record::extension, ast_cel_event_record::extra, ast_cel_event_record::linked_id, LOG_ERROR, ast_cel_event_record::peer, ast_cel_event_record::peer_account, S_OR, ast_cel_event_record::unique_id, ast_cel_event_record::user_defined_name, ast_cel_event_record::user_field, and ast_cel_event_record::version.
Referenced by ast_cel_fabricate_channel_from_event().
00583 { 00584 if (r->version != AST_CEL_EVENT_RECORD_VERSION) { 00585 ast_log(LOG_ERROR, "Module ABI mismatch for ast_cel_event_record. " 00586 "Please ensure all modules were compiled for " 00587 "this version of Asterisk.\n"); 00588 return -1; 00589 } 00590 00591 r->event_type = ast_event_get_ie_uint(e, AST_EVENT_IE_CEL_EVENT_TYPE); 00592 00593 r->event_time.tv_sec = ast_event_get_ie_uint(e, AST_EVENT_IE_CEL_EVENT_TIME); 00594 r->event_time.tv_usec = ast_event_get_ie_uint(e, AST_EVENT_IE_CEL_EVENT_TIME_USEC); 00595 00596 r->user_defined_name = ""; 00597 00598 if (r->event_type == AST_CEL_USER_DEFINED) { 00599 r->user_defined_name = ast_event_get_ie_str(e, AST_EVENT_IE_CEL_USEREVENT_NAME); 00600 r->event_name = r->user_defined_name; 00601 } else { 00602 r->event_name = ast_cel_get_type_name(r->event_type); 00603 } 00604 00605 r->caller_id_name = S_OR(ast_event_get_ie_str(e, AST_EVENT_IE_CEL_CIDNAME), ""); 00606 r->caller_id_num = S_OR(ast_event_get_ie_str(e, AST_EVENT_IE_CEL_CIDNUM), ""); 00607 r->caller_id_ani = S_OR(ast_event_get_ie_str(e, AST_EVENT_IE_CEL_CIDANI), ""); 00608 r->caller_id_rdnis = S_OR(ast_event_get_ie_str(e, AST_EVENT_IE_CEL_CIDRDNIS), ""); 00609 r->caller_id_dnid = S_OR(ast_event_get_ie_str(e, AST_EVENT_IE_CEL_CIDDNID), ""); 00610 r->extension = S_OR(ast_event_get_ie_str(e, AST_EVENT_IE_CEL_EXTEN), ""); 00611 r->context = S_OR(ast_event_get_ie_str(e, AST_EVENT_IE_CEL_CONTEXT), ""); 00612 r->channel_name = S_OR(ast_event_get_ie_str(e, AST_EVENT_IE_CEL_CHANNAME), ""); 00613 r->application_name = S_OR(ast_event_get_ie_str(e, AST_EVENT_IE_CEL_APPNAME), ""); 00614 r->application_data = S_OR(ast_event_get_ie_str(e, AST_EVENT_IE_CEL_APPDATA), ""); 00615 r->account_code = S_OR(ast_event_get_ie_str(e, AST_EVENT_IE_CEL_ACCTCODE), ""); 00616 r->peer_account = S_OR(ast_event_get_ie_str(e, AST_EVENT_IE_CEL_ACCTCODE), ""); 00617 r->unique_id = S_OR(ast_event_get_ie_str(e, AST_EVENT_IE_CEL_UNIQUEID), ""); 00618 r->linked_id = S_OR(ast_event_get_ie_str(e, AST_EVENT_IE_CEL_LINKEDID), ""); 00619 r->amaflag = ast_event_get_ie_uint(e, AST_EVENT_IE_CEL_AMAFLAGS); 00620 r->user_field = S_OR(ast_event_get_ie_str(e, AST_EVENT_IE_CEL_USERFIELD), ""); 00621 r->peer = S_OR(ast_event_get_ie_str(e, AST_EVENT_IE_CEL_PEER), ""); 00622 r->extra = S_OR(ast_event_get_ie_str(e, AST_EVENT_IE_CEL_EXTRA), ""); 00623 00624 return 0; 00625 }
const char* ast_cel_get_ama_flag_name | ( | enum ast_cel_ama_flag | flag | ) |
Convert AMA flag to printable string.
[in] | flag | the flag to convert to a string |
Definition at line 351 of file cel.c.
References ARRAY_LEN, ast_log(), LOG_WARNING, and S_OR.
00352 { 00353 if (flag < 0 || flag >= ARRAY_LEN(cel_ama_flags)) { 00354 ast_log(LOG_WARNING, "Invalid AMA flag: %d\n", flag); 00355 return "Unknown"; 00356 } 00357 00358 return S_OR(cel_ama_flags[flag], "Unknown"); 00359 }
const char* ast_cel_get_type_name | ( | enum ast_cel_event_type | type | ) |
Get the name of a CEL event type.
type | the type to get the name of |
Definition at line 346 of file cel.c.
References S_OR.
Referenced by ast_cel_fill_record(), and handle_cli_status().
00347 { 00348 return S_OR(cel_event_types[type], "Unknown"); 00349 }
int ast_cel_report_event | ( | struct ast_channel * | chan, | |
enum ast_cel_event_type | event_type, | |||
const char * | userdefevname, | |||
const char * | extra, | |||
struct ast_channel * | peer2 | |||
) |
Report a channel event.
chan | This argument is required. This is the primary channel associated with this channel event. | |
event_type | This is the type of call event being reported. | |
userdefevname | This is an optional custom name for the call event. | |
extra | This is an optional opaque field that will go into the "CEL_EXTRA" information element of the call event. | |
peer2 | All CEL events contain a "peer name" information element. The first place the code will look to get a peer name is from the bridged channel to chan. If chan has no bridged channel and peer2 is specified, then the name of peer2 will go into the "peer name" field. If neither are available, the peer name field will be blank. |
0 | success | |
non-zero | failure |
Definition at line 474 of file cel.c.
References ast_channel::accountcode, ast_channel::amaflags, ast_party_caller::ani, ao2_find, ao2_ref, app, ast_channel::appl, appset, ast_bridged_channel(), AST_CEL_APP_END, AST_CEL_APP_START, ast_cel_track_event(), ast_channel_lock, ast_channel_ref, ast_channel_unlock, ast_channel_unref, AST_EVENT_CEL, ast_event_destroy(), AST_EVENT_IE_CEL_ACCTCODE, AST_EVENT_IE_CEL_AMAFLAGS, AST_EVENT_IE_CEL_APPDATA, AST_EVENT_IE_CEL_APPNAME, AST_EVENT_IE_CEL_CHANNAME, AST_EVENT_IE_CEL_CIDANI, AST_EVENT_IE_CEL_CIDDNID, AST_EVENT_IE_CEL_CIDNAME, AST_EVENT_IE_CEL_CIDNUM, AST_EVENT_IE_CEL_CIDRDNIS, AST_EVENT_IE_CEL_CONTEXT, AST_EVENT_IE_CEL_EVENT_TIME, AST_EVENT_IE_CEL_EVENT_TIME_USEC, AST_EVENT_IE_CEL_EVENT_TYPE, AST_EVENT_IE_CEL_EXTEN, AST_EVENT_IE_CEL_EXTRA, AST_EVENT_IE_CEL_LINKEDID, AST_EVENT_IE_CEL_PEER, AST_EVENT_IE_CEL_PEERACCT, AST_EVENT_IE_CEL_UNIQUEID, AST_EVENT_IE_CEL_USEREVENT_NAME, AST_EVENT_IE_CEL_USERFIELD, AST_EVENT_IE_END, AST_EVENT_IE_PLTYPE_STR, AST_EVENT_IE_PLTYPE_UINT, ast_event_new(), ast_event_queue(), ast_mutex_lock, ast_mutex_unlock, ast_strdupa, ast_tvnow(), ast_channel::caller, ast_channel::context, ast_channel::data, ast_channel::dialed, ast_channel::exten, ast_party_redirecting::from, ast_party_caller::id, ast_channel::linkedid, ast_party_id::name, ast_channel::name, ast_party_id::number, ast_party_dialed::number, OBJ_POINTER, ast_channel::peeraccount, ast_channel::redirecting, reload_lock, S_COR, S_OR, ast_party_name::str, ast_party_number::str, ast_party_dialed::str, ast_channel::uniqueid, ast_channel::userfield, ast_party_name::valid, and ast_party_number::valid.
Referenced by __ast_channel_alloc_ap(), __ast_read(), analog_attempt_transfer(), ast_bridge_call(), ast_cel_check_retire_linkedid(), ast_channel_destructor(), ast_do_masquerade(), ast_hangup(), ast_raw_answer(), builtin_atxfer(), builtin_blindtransfer(), celgenuserevent_exec(), do_forward(), handle_request_refer(), local_attended_transfer(), manage_parkinglot(), park_call_full(), park_exec_full(), pbx_exec(), and pickup_do().
00476 { 00477 struct timeval eventtime; 00478 struct ast_event *ev; 00479 const char *peername = ""; 00480 struct ast_channel *peer; 00481 00482 ast_channel_lock(chan); 00483 peer = ast_bridged_channel(chan); 00484 if (peer) { 00485 ast_channel_ref(peer); 00486 } 00487 ast_channel_unlock(chan); 00488 00489 /* Make sure a reload is not occurring while we're checking to see if this 00490 * is an event that we care about. We could lose an important event in this 00491 * process otherwise. */ 00492 ast_mutex_lock(&reload_lock); 00493 00494 if (!cel_enabled || !ast_cel_track_event(event_type)) { 00495 ast_mutex_unlock(&reload_lock); 00496 if (peer) { 00497 ast_channel_unref(peer); 00498 } 00499 return 0; 00500 } 00501 00502 if (event_type == AST_CEL_APP_START || event_type == AST_CEL_APP_END) { 00503 char *app; 00504 if (!(app = ao2_find(appset, (char *) chan->appl, OBJ_POINTER))) { 00505 ast_mutex_unlock(&reload_lock); 00506 if (peer) { 00507 ast_channel_unref(peer); 00508 } 00509 return 0; 00510 } 00511 ao2_ref(app, -1); 00512 } 00513 00514 ast_mutex_unlock(&reload_lock); 00515 00516 if (peer) { 00517 ast_channel_lock(peer); 00518 peername = ast_strdupa(peer->name); 00519 ast_channel_unlock(peer); 00520 } else if (peer2) { 00521 ast_channel_lock(peer2); 00522 peername = ast_strdupa(peer2->name); 00523 ast_channel_unlock(peer2); 00524 } 00525 00526 if (!userdefevname) { 00527 userdefevname = ""; 00528 } 00529 00530 if (!extra) { 00531 extra = ""; 00532 } 00533 00534 eventtime = ast_tvnow(); 00535 00536 ast_channel_lock(chan); 00537 00538 ev = ast_event_new(AST_EVENT_CEL, 00539 AST_EVENT_IE_CEL_EVENT_TYPE, AST_EVENT_IE_PLTYPE_UINT, event_type, 00540 AST_EVENT_IE_CEL_EVENT_TIME, AST_EVENT_IE_PLTYPE_UINT, eventtime.tv_sec, 00541 AST_EVENT_IE_CEL_EVENT_TIME_USEC, AST_EVENT_IE_PLTYPE_UINT, eventtime.tv_usec, 00542 AST_EVENT_IE_CEL_USEREVENT_NAME, AST_EVENT_IE_PLTYPE_STR, userdefevname, 00543 AST_EVENT_IE_CEL_CIDNAME, AST_EVENT_IE_PLTYPE_STR, 00544 S_COR(chan->caller.id.name.valid, chan->caller.id.name.str, ""), 00545 AST_EVENT_IE_CEL_CIDNUM, AST_EVENT_IE_PLTYPE_STR, 00546 S_COR(chan->caller.id.number.valid, chan->caller.id.number.str, ""), 00547 AST_EVENT_IE_CEL_CIDANI, AST_EVENT_IE_PLTYPE_STR, 00548 S_COR(chan->caller.ani.number.valid, chan->caller.ani.number.str, ""), 00549 AST_EVENT_IE_CEL_CIDRDNIS, AST_EVENT_IE_PLTYPE_STR, 00550 S_COR(chan->redirecting.from.number.valid, chan->redirecting.from.number.str, ""), 00551 AST_EVENT_IE_CEL_CIDDNID, AST_EVENT_IE_PLTYPE_STR, 00552 S_OR(chan->dialed.number.str, ""), 00553 AST_EVENT_IE_CEL_EXTEN, AST_EVENT_IE_PLTYPE_STR, chan->exten, 00554 AST_EVENT_IE_CEL_CONTEXT, AST_EVENT_IE_PLTYPE_STR, chan->context, 00555 AST_EVENT_IE_CEL_CHANNAME, AST_EVENT_IE_PLTYPE_STR, chan->name, 00556 AST_EVENT_IE_CEL_APPNAME, AST_EVENT_IE_PLTYPE_STR, S_OR(chan->appl, ""), 00557 AST_EVENT_IE_CEL_APPDATA, AST_EVENT_IE_PLTYPE_STR, S_OR(chan->data, ""), 00558 AST_EVENT_IE_CEL_AMAFLAGS, AST_EVENT_IE_PLTYPE_UINT, chan->amaflags, 00559 AST_EVENT_IE_CEL_ACCTCODE, AST_EVENT_IE_PLTYPE_STR, chan->accountcode, 00560 AST_EVENT_IE_CEL_PEERACCT, AST_EVENT_IE_PLTYPE_STR, chan->peeraccount, 00561 AST_EVENT_IE_CEL_UNIQUEID, AST_EVENT_IE_PLTYPE_STR, chan->uniqueid, 00562 AST_EVENT_IE_CEL_LINKEDID, AST_EVENT_IE_PLTYPE_STR, chan->linkedid, 00563 AST_EVENT_IE_CEL_USERFIELD, AST_EVENT_IE_PLTYPE_STR, chan->userfield, 00564 AST_EVENT_IE_CEL_EXTRA, AST_EVENT_IE_PLTYPE_STR, extra, 00565 AST_EVENT_IE_CEL_PEER, AST_EVENT_IE_PLTYPE_STR, peername, 00566 AST_EVENT_IE_END); 00567 00568 ast_channel_unlock(chan); 00569 00570 if (peer) { 00571 peer = ast_channel_unref(peer); 00572 } 00573 00574 if (ev && ast_event_queue(ev)) { 00575 ast_event_destroy(ev); 00576 return -1; 00577 } 00578 00579 return 0; 00580 }
enum ast_cel_event_type ast_cel_str_to_event_type | ( | const char * | name | ) |
Get the event type from a string.
name | the event type name as a string |
Definition at line 209 of file cel.c.
References ARRAY_LEN.
Referenced by parse_events().
00210 { 00211 unsigned int i; 00212 00213 for (i = 0; i < ARRAY_LEN(cel_event_types); i++) { 00214 if (!cel_event_types[i]) { 00215 continue; 00216 } 00217 00218 if (!strcasecmp(name, cel_event_types[i])) { 00219 return i; 00220 } 00221 } 00222 00223 return -1; 00224 }