Mon Mar 19 11:30:37 2012

Asterisk developer's documentation


cel.h File Reference

Call Event Logging API. More...

#include "asterisk/event.h"

Go to the source code of this file.

Data Structures

struct  ast_cel_event_record
 Helper struct for getting the fields out of a CEL event. More...

Defines

#define AST_CEL_EVENT_RECORD_VERSION   2
 struct ABI version

Enumerations

enum  ast_cel_ama_flag {
  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
}
 AMA Flags. More...
enum  ast_cel_event_type {
  AST_CEL_CHANNEL_START = 1, AST_CEL_CHANNEL_END = 2, AST_CEL_HANGUP = 3, AST_CEL_ANSWER = 4,
  AST_CEL_APP_START = 5, AST_CEL_APP_END = 6, AST_CEL_BRIDGE_START = 7, AST_CEL_BRIDGE_END = 8,
  AST_CEL_CONF_START = 9, AST_CEL_CONF_END = 10, AST_CEL_PARK_START = 11, AST_CEL_PARK_END = 12,
  AST_CEL_BLINDTRANSFER = 13, AST_CEL_ATTENDEDTRANSFER = 14, AST_CEL_TRANSFER = 15, AST_CEL_HOOKFLASH = 16,
  AST_CEL_3WAY_START = 17, AST_CEL_3WAY_END = 18, AST_CEL_CONF_ENTER = 19, AST_CEL_CONF_EXIT = 20,
  AST_CEL_USER_DEFINED = 21, AST_CEL_LINKEDID_END = 22, AST_CEL_BRIDGE_UPDATE = 23, AST_CEL_PICKUP = 24,
  AST_CEL_FORWARD = 25
}
 CEL event types. More...

Functions

ast_cel * ast_cel_alloc (void)
 Allocate a CEL record.
unsigned int ast_cel_check_enabled (void)
 Check to see if CEL is enabled.
void ast_cel_check_retire_linkedid (struct ast_channel *chan)
 Check and potentially retire a Linked ID.
void ast_cel_destroy (struct ast_cel *cel)
 Destroy a CEL record.
ast_channelast_cel_fabricate_channel_from_event (const struct ast_event *event)
 Create a fake channel from data in a CEL event.
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.
const char * ast_cel_get_ama_flag_name (enum ast_cel_ama_flag flag)
 Convert AMA flag to printable string.
const char * ast_cel_get_type_name (enum ast_cel_event_type type)
 Get the name of a CEL event type.
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.
enum ast_cel_event_type ast_cel_str_to_event_type (const char *name)
 Get the event type from a string.


Detailed Description

Call Event Logging API.

Definition in file cel.h.


Define Documentation

#define AST_CEL_EVENT_RECORD_VERSION   2

struct ABI version

Note:
This must be incremented when the struct changes.

Definition at line 237 of file cel.h.

Referenced by ast_cel_fabricate_channel_from_event(), and ast_cel_fill_record().


Enumeration Type Documentation

enum ast_cel_ama_flag

AMA Flags.

Note:
This must much up with the AST_CDR_* defines for AMA flags.
Enumerator:
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.

Enumerator:
AST_CEL_CHANNEL_START  channel birth
AST_CEL_CHANNEL_END  channel end
AST_CEL_HANGUP  hangup terminates connection
AST_CEL_ANSWER  A ringing phone is answered.
AST_CEL_APP_START  an app starts
AST_CEL_APP_END  an app ends
AST_CEL_BRIDGE_START  a bridge is established
AST_CEL_BRIDGE_END  a bridge is torn down
AST_CEL_CONF_START  a conference is started
AST_CEL_CONF_END  a conference is ended
AST_CEL_PARK_START  a channel is parked
AST_CEL_PARK_END  channel out of the park
AST_CEL_BLINDTRANSFER  a transfer occurs
AST_CEL_ATTENDEDTRANSFER  a transfer occurs
AST_CEL_TRANSFER  a transfer occurs
AST_CEL_HOOKFLASH  a 3-way conference, usually part of a transfer
AST_CEL_3WAY_START  a 3-way conference, usually part of a transfer
AST_CEL_3WAY_END  a 3-way conference, usually part of a transfer
AST_CEL_CONF_ENTER  channel enters a conference
AST_CEL_CONF_EXIT  channel exits a conference
AST_CEL_USER_DEFINED  a user-defined event, the event name field should be set
AST_CEL_LINKEDID_END  the last channel with the given linkedid is retired
AST_CEL_BRIDGE_UPDATE  a masquerade happened to alter the participants on a bridge
AST_CEL_PICKUP  a directed pickup was performed on this channel
AST_CEL_FORWARD  this call was forwarded somewhere else

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 };


Function Documentation

struct ast_cel* ast_cel_alloc ( void   ) 

Allocate a CEL record.

Since:
1.8
Note:
The CEL record must be destroyed with ast_cel_destroy().
Return values:
non-NULL an allocated ast_cel structure
NULL error

unsigned int ast_cel_check_enabled ( void   ) 

Check to see if CEL is enabled.

Since:
1.8
Return values:
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.

Parameters:
chan channel that is being destroyed or its linkedid is changing
Since:
1.8
If at least one CEL backend is looking for CEL_LINKEDID_END events, this function will check if the given channel is the last active channel with that linkedid, and if it is, emit a CEL_LINKEDID_END event.

Returns:
nothing

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.

Parameters:
cel the record to destroy
Since:
1.8
Returns:
nothing.

struct ast_channel* ast_cel_fabricate_channel_from_event ( const struct ast_event event  ) 

Create a fake channel from data in a CEL event.

Note:
This function creates a fake channel containing the serialized channel data in the given cel event. It should be released with ast_channel_unref() but could be released with ast_channel_release().
Parameters:
event the CEL event
Since:
1.8
Returns:
a channel with the data filled in, or NULL on error
Todo:
This function is very expensive, especially given that some CEL backends use it on every CEL event. This function really needs to go away at some point.

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_unref, 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, 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_defined_name, 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_unref(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("userdeftype", record.user_defined_name))) {
00443       AST_LIST_INSERT_HEAD(headp, newvariable, entries);
00444    }
00445    if ((newvariable = ast_var_assign("eventextra", record.extra))) {
00446       AST_LIST_INSERT_HEAD(headp, newvariable, entries);
00447    }
00448 
00449    tchan->caller.id.name.valid = 1;
00450    tchan->caller.id.name.str = ast_strdup(record.caller_id_name);
00451    tchan->caller.id.number.valid = 1;
00452    tchan->caller.id.number.str = ast_strdup(record.caller_id_num);
00453    tchan->caller.ani.number.valid = 1;
00454    tchan->caller.ani.number.str = ast_strdup(record.caller_id_ani);
00455    tchan->redirecting.from.number.valid = 1;
00456    tchan->redirecting.from.number.str = ast_strdup(record.caller_id_rdnis);
00457    tchan->dialed.number.str = ast_strdup(record.caller_id_dnid);
00458 
00459    ast_copy_string(tchan->exten, record.extension, sizeof(tchan->exten));
00460    ast_copy_string(tchan->context, record.context, sizeof(tchan->context));
00461    ast_string_field_set(tchan, name, record.channel_name);
00462    ast_string_field_set(tchan, uniqueid, record.unique_id);
00463    ast_string_field_set(tchan, linkedid, record.linked_id);
00464    ast_string_field_set(tchan, accountcode, record.account_code);
00465    ast_string_field_set(tchan, peeraccount, record.peer_account);
00466    ast_string_field_set(tchan, userfield, record.user_field);
00467 
00468    if ((newvariable = ast_var_assign("BRIDGEPEER", record.peer))) {
00469       AST_LIST_INSERT_HEAD(headp, newvariable, entries);
00470    }
00471 
00472    tchan->appl = ast_strdup(record.application_name);
00473    tchan->data = ast_strdup(record.application_data);
00474    tchan->amaflags = record.amaflag;
00475 
00476    return tchan;
00477 }

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.

Parameters:
[in] event the CEL event
[out] r the ast_cel_event_record to fill in
Since:
1.8
Return values:
0 success
non-zero failure

Definition at line 587 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().

00588 {
00589    if (r->version != AST_CEL_EVENT_RECORD_VERSION) {
00590       ast_log(LOG_ERROR, "Module ABI mismatch for ast_cel_event_record.  "
00591             "Please ensure all modules were compiled for "
00592             "this version of Asterisk.\n");
00593       return -1;
00594    }
00595 
00596    r->event_type = ast_event_get_ie_uint(e, AST_EVENT_IE_CEL_EVENT_TYPE);
00597 
00598    r->event_time.tv_sec = ast_event_get_ie_uint(e, AST_EVENT_IE_CEL_EVENT_TIME);
00599    r->event_time.tv_usec = ast_event_get_ie_uint(e, AST_EVENT_IE_CEL_EVENT_TIME_USEC);
00600 
00601    r->user_defined_name = "";
00602 
00603    if (r->event_type == AST_CEL_USER_DEFINED) {
00604       r->user_defined_name = ast_event_get_ie_str(e, AST_EVENT_IE_CEL_USEREVENT_NAME);
00605       r->event_name = r->user_defined_name;
00606    } else {
00607       r->event_name = ast_cel_get_type_name(r->event_type);
00608    }
00609 
00610    r->caller_id_name   = S_OR(ast_event_get_ie_str(e, AST_EVENT_IE_CEL_CIDNAME), "");
00611    r->caller_id_num    = S_OR(ast_event_get_ie_str(e, AST_EVENT_IE_CEL_CIDNUM), "");
00612    r->caller_id_ani    = S_OR(ast_event_get_ie_str(e, AST_EVENT_IE_CEL_CIDANI), "");
00613    r->caller_id_rdnis  = S_OR(ast_event_get_ie_str(e, AST_EVENT_IE_CEL_CIDRDNIS), "");
00614    r->caller_id_dnid   = S_OR(ast_event_get_ie_str(e, AST_EVENT_IE_CEL_CIDDNID), "");
00615    r->extension        = S_OR(ast_event_get_ie_str(e, AST_EVENT_IE_CEL_EXTEN), "");
00616    r->context          = S_OR(ast_event_get_ie_str(e, AST_EVENT_IE_CEL_CONTEXT), "");
00617    r->channel_name     = S_OR(ast_event_get_ie_str(e, AST_EVENT_IE_CEL_CHANNAME), "");
00618    r->application_name = S_OR(ast_event_get_ie_str(e, AST_EVENT_IE_CEL_APPNAME), "");
00619    r->application_data = S_OR(ast_event_get_ie_str(e, AST_EVENT_IE_CEL_APPDATA), "");
00620    r->account_code     = S_OR(ast_event_get_ie_str(e, AST_EVENT_IE_CEL_ACCTCODE), "");
00621    r->peer_account     = S_OR(ast_event_get_ie_str(e, AST_EVENT_IE_CEL_ACCTCODE), "");
00622    r->unique_id        = S_OR(ast_event_get_ie_str(e, AST_EVENT_IE_CEL_UNIQUEID), "");
00623    r->linked_id        = S_OR(ast_event_get_ie_str(e, AST_EVENT_IE_CEL_LINKEDID), "");
00624    r->amaflag          = ast_event_get_ie_uint(e, AST_EVENT_IE_CEL_AMAFLAGS);
00625    r->user_field       = S_OR(ast_event_get_ie_str(e, AST_EVENT_IE_CEL_USERFIELD), "");
00626    r->peer             = S_OR(ast_event_get_ie_str(e, AST_EVENT_IE_CEL_PEER), "");
00627    r->extra            = S_OR(ast_event_get_ie_str(e, AST_EVENT_IE_CEL_EXTRA), "");
00628 
00629    return 0;
00630 }

const char* ast_cel_get_ama_flag_name ( enum ast_cel_ama_flag  flag  ) 

Convert AMA flag to printable string.

Parameters:
[in] flag the flag to convert to a string
Since:
1.8
Returns:
the string representation of the flag

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.

Parameters:
type the type to get the name of
Since:
1.8
Returns:
the string representation of the type

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.

Parameters:
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.
Since:
1.8
Precondition:
chan and peer2 are both unlocked
Return values:
0 success
non-zero failure

Definition at line 479 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_do_pickup(), ast_hangup(), ast_raw_answer(), builtin_atxfer(), builtin_blindtransfer(), celgenuserevent_exec(), do_forward(), handle_request_refer(), local_attended_transfer(), manage_parked_call(), park_call_full(), parked_call_exec(), and pbx_exec().

00481 {
00482    struct timeval eventtime;
00483    struct ast_event *ev;
00484    const char *peername = "";
00485    struct ast_channel *peer;
00486 
00487    ast_channel_lock(chan);
00488    peer = ast_bridged_channel(chan);
00489    if (peer) {
00490       ast_channel_ref(peer);
00491    }
00492    ast_channel_unlock(chan);
00493 
00494    /* Make sure a reload is not occurring while we're checking to see if this
00495     * is an event that we care about.  We could lose an important event in this
00496     * process otherwise. */
00497    ast_mutex_lock(&reload_lock);
00498 
00499    if (!cel_enabled || !ast_cel_track_event(event_type)) {
00500       ast_mutex_unlock(&reload_lock);
00501       if (peer) {
00502          ast_channel_unref(peer);
00503       }
00504       return 0;
00505    }
00506 
00507    if (event_type == AST_CEL_APP_START || event_type == AST_CEL_APP_END) {
00508       char *app;
00509       if (!(app = ao2_find(appset, (char *) chan->appl, OBJ_POINTER))) {
00510          ast_mutex_unlock(&reload_lock);
00511          if (peer) {
00512             ast_channel_unref(peer);
00513          }
00514          return 0;
00515       }
00516       ao2_ref(app, -1);
00517    }
00518 
00519    ast_mutex_unlock(&reload_lock);
00520 
00521    if (peer) {
00522       ast_channel_lock(peer);
00523       peername = ast_strdupa(peer->name);
00524       ast_channel_unlock(peer);
00525    } else if (peer2) {
00526       ast_channel_lock(peer2);
00527       peername = ast_strdupa(peer2->name);
00528       ast_channel_unlock(peer2);
00529    }
00530 
00531    if (!userdefevname) {
00532       userdefevname = "";
00533    }
00534 
00535    if (!extra) {
00536       extra = "";
00537    }
00538 
00539    eventtime = ast_tvnow();
00540 
00541    ast_channel_lock(chan);
00542 
00543    ev = ast_event_new(AST_EVENT_CEL,
00544       AST_EVENT_IE_CEL_EVENT_TYPE, AST_EVENT_IE_PLTYPE_UINT, event_type,
00545       AST_EVENT_IE_CEL_EVENT_TIME, AST_EVENT_IE_PLTYPE_UINT, eventtime.tv_sec,
00546       AST_EVENT_IE_CEL_EVENT_TIME_USEC, AST_EVENT_IE_PLTYPE_UINT, eventtime.tv_usec,
00547       AST_EVENT_IE_CEL_USEREVENT_NAME, AST_EVENT_IE_PLTYPE_STR, userdefevname,
00548       AST_EVENT_IE_CEL_CIDNAME, AST_EVENT_IE_PLTYPE_STR,
00549          S_COR(chan->caller.id.name.valid, chan->caller.id.name.str, ""),
00550       AST_EVENT_IE_CEL_CIDNUM, AST_EVENT_IE_PLTYPE_STR,
00551          S_COR(chan->caller.id.number.valid, chan->caller.id.number.str, ""),
00552       AST_EVENT_IE_CEL_CIDANI, AST_EVENT_IE_PLTYPE_STR,
00553          S_COR(chan->caller.ani.number.valid, chan->caller.ani.number.str, ""),
00554       AST_EVENT_IE_CEL_CIDRDNIS, AST_EVENT_IE_PLTYPE_STR,
00555          S_COR(chan->redirecting.from.number.valid, chan->redirecting.from.number.str, ""),
00556       AST_EVENT_IE_CEL_CIDDNID, AST_EVENT_IE_PLTYPE_STR,
00557          S_OR(chan->dialed.number.str, ""),
00558       AST_EVENT_IE_CEL_EXTEN, AST_EVENT_IE_PLTYPE_STR, chan->exten,
00559       AST_EVENT_IE_CEL_CONTEXT, AST_EVENT_IE_PLTYPE_STR, chan->context,
00560       AST_EVENT_IE_CEL_CHANNAME, AST_EVENT_IE_PLTYPE_STR, chan->name,
00561       AST_EVENT_IE_CEL_APPNAME, AST_EVENT_IE_PLTYPE_STR, S_OR(chan->appl, ""),
00562       AST_EVENT_IE_CEL_APPDATA, AST_EVENT_IE_PLTYPE_STR, S_OR(chan->data, ""),
00563       AST_EVENT_IE_CEL_AMAFLAGS, AST_EVENT_IE_PLTYPE_UINT, chan->amaflags,
00564       AST_EVENT_IE_CEL_ACCTCODE, AST_EVENT_IE_PLTYPE_STR, chan->accountcode,
00565       AST_EVENT_IE_CEL_PEERACCT, AST_EVENT_IE_PLTYPE_STR, chan->peeraccount,
00566       AST_EVENT_IE_CEL_UNIQUEID, AST_EVENT_IE_PLTYPE_STR, chan->uniqueid,
00567       AST_EVENT_IE_CEL_LINKEDID, AST_EVENT_IE_PLTYPE_STR, chan->linkedid,
00568       AST_EVENT_IE_CEL_USERFIELD, AST_EVENT_IE_PLTYPE_STR, chan->userfield,
00569       AST_EVENT_IE_CEL_EXTRA, AST_EVENT_IE_PLTYPE_STR, extra,
00570       AST_EVENT_IE_CEL_PEER, AST_EVENT_IE_PLTYPE_STR, peername,
00571       AST_EVENT_IE_END);
00572 
00573    ast_channel_unlock(chan);
00574 
00575    if (peer) {
00576       peer = ast_channel_unref(peer);
00577    }
00578 
00579    if (ev && ast_event_queue(ev)) {
00580       ast_event_destroy(ev);
00581       return -1;
00582    }
00583 
00584    return 0;
00585 }

enum ast_cel_event_type ast_cel_str_to_event_type ( const char *  name  ) 

Get the event type from a string.

Parameters:
name the event type name as a string
Since:
1.8
Returns:
the ast_cel_event_type given by the 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 }


Generated on Mon Mar 19 11:30:37 2012 for Asterisk - The Open Source Telephony Project by  doxygen 1.4.7