|
|
@ -223,7 +223,7 @@ static int cdr_toggle_runtime_options(void);
|
|
|
|
|
|
|
|
|
|
|
|
/*! \brief The configuration settings for this module */
|
|
|
|
/*! \brief The configuration settings for this module */
|
|
|
|
struct module_config {
|
|
|
|
struct module_config {
|
|
|
|
struct ast_cdr_config *general; /*< CDR global settings */
|
|
|
|
struct ast_cdr_config *general; /*!< CDR global settings */
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
/*! \brief The container for the module configuration */
|
|
|
|
/*! \brief The container for the module configuration */
|
|
|
@ -1462,7 +1462,8 @@ static int base_process_parked_channel(struct cdr_object *cdr, struct ast_parked
|
|
|
|
|
|
|
|
|
|
|
|
/* SINGLE STATE */
|
|
|
|
/* SINGLE STATE */
|
|
|
|
|
|
|
|
|
|
|
|
static void single_state_init_function(struct cdr_object *cdr) {
|
|
|
|
static void single_state_init_function(struct cdr_object *cdr)
|
|
|
|
|
|
|
|
{
|
|
|
|
cdr->start = ast_tvnow();
|
|
|
|
cdr->start = ast_tvnow();
|
|
|
|
cdr_object_check_party_a_answer(cdr);
|
|
|
|
cdr_object_check_party_a_answer(cdr);
|
|
|
|
}
|
|
|
|
}
|
|
|
@ -2020,6 +2021,7 @@ static int cdr_object_finalize_party_b(void *obj, void *arg, int flags)
|
|
|
|
struct cdr_object *cdr = obj;
|
|
|
|
struct cdr_object *cdr = obj;
|
|
|
|
struct ast_channel_snapshot *party_b = arg;
|
|
|
|
struct ast_channel_snapshot *party_b = arg;
|
|
|
|
struct cdr_object *it_cdr;
|
|
|
|
struct cdr_object *it_cdr;
|
|
|
|
|
|
|
|
|
|
|
|
for (it_cdr = cdr; it_cdr; it_cdr = it_cdr->next) {
|
|
|
|
for (it_cdr = cdr; it_cdr; it_cdr = it_cdr->next) {
|
|
|
|
if (it_cdr->party_b.snapshot
|
|
|
|
if (it_cdr->party_b.snapshot
|
|
|
|
&& !strcasecmp(it_cdr->party_b.snapshot->name, party_b->name)) {
|
|
|
|
&& !strcasecmp(it_cdr->party_b.snapshot->name, party_b->name)) {
|
|
|
@ -2037,6 +2039,7 @@ static int cdr_object_update_party_b(void *obj, void *arg, int flags)
|
|
|
|
struct cdr_object *cdr = obj;
|
|
|
|
struct cdr_object *cdr = obj;
|
|
|
|
struct ast_channel_snapshot *party_b = arg;
|
|
|
|
struct ast_channel_snapshot *party_b = arg;
|
|
|
|
struct cdr_object *it_cdr;
|
|
|
|
struct cdr_object *it_cdr;
|
|
|
|
|
|
|
|
|
|
|
|
for (it_cdr = cdr; it_cdr; it_cdr = it_cdr->next) {
|
|
|
|
for (it_cdr = cdr; it_cdr; it_cdr = it_cdr->next) {
|
|
|
|
if (!it_cdr->fn_table->process_party_b) {
|
|
|
|
if (!it_cdr->fn_table->process_party_b) {
|
|
|
|
continue;
|
|
|
|
continue;
|
|
|
@ -2889,7 +2892,7 @@ void ast_cdr_format_var(struct ast_cdr *cdr, const char *name, char **ret, char
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
/*!
|
|
|
|
* \internal
|
|
|
|
* \internal
|
|
|
|
* \brief Callback that finds all CDRs that reference a particular channel by name
|
|
|
|
* \brief Callback that finds all CDRs that reference a particular channel by name
|
|
|
|
*/
|
|
|
|
*/
|
|
|
@ -2905,7 +2908,7 @@ static int cdr_object_select_all_by_name_cb(void *obj, void *arg, int flags)
|
|
|
|
return 0;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
/*!
|
|
|
|
* \internal
|
|
|
|
* \internal
|
|
|
|
* \brief Callback that finds a CDR by channel name
|
|
|
|
* \brief Callback that finds a CDR by channel name
|
|
|
|
*/
|
|
|
|
*/
|
|
|
@ -3142,8 +3145,9 @@ int ast_cdr_serialize_variables(const char *channel_name, struct ast_str **buf,
|
|
|
|
|
|
|
|
|
|
|
|
ao2_lock(cdr);
|
|
|
|
ao2_lock(cdr);
|
|
|
|
for (it_cdr = cdr; it_cdr; it_cdr = it_cdr->next) {
|
|
|
|
for (it_cdr = cdr; it_cdr; it_cdr = it_cdr->next) {
|
|
|
|
if (++x > 1)
|
|
|
|
if (++x > 1) {
|
|
|
|
ast_str_append(buf, 0, "\n");
|
|
|
|
ast_str_append(buf, 0, "\n");
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
AST_LIST_TRAVERSE(&it_cdr->party_a.variables, variable, entries) {
|
|
|
|
AST_LIST_TRAVERSE(&it_cdr->party_a.variables, variable, entries) {
|
|
|
|
if (!(var = ast_var_name(variable))) {
|
|
|
|
if (!(var = ast_var_name(variable))) {
|
|
|
@ -3226,6 +3230,7 @@ static int cdr_object_update_party_b_userfield_cb(void *obj, void *arg, int flag
|
|
|
|
struct cdr_object *cdr = obj;
|
|
|
|
struct cdr_object *cdr = obj;
|
|
|
|
struct party_b_userfield_update *info = arg;
|
|
|
|
struct party_b_userfield_update *info = arg;
|
|
|
|
struct cdr_object *it_cdr;
|
|
|
|
struct cdr_object *it_cdr;
|
|
|
|
|
|
|
|
|
|
|
|
for (it_cdr = cdr; it_cdr; it_cdr = it_cdr->next) {
|
|
|
|
for (it_cdr = cdr; it_cdr; it_cdr = it_cdr->next) {
|
|
|
|
if (it_cdr->fn_table == &finalized_state_fn_table && it_cdr->next != NULL) {
|
|
|
|
if (it_cdr->fn_table == &finalized_state_fn_table && it_cdr->next != NULL) {
|
|
|
|
continue;
|
|
|
|
continue;
|
|
|
@ -3800,6 +3805,7 @@ static void cli_show_channel(struct ast_cli_args *a)
|
|
|
|
ao2_lock(cdr);
|
|
|
|
ao2_lock(cdr);
|
|
|
|
for (it_cdr = cdr; it_cdr; it_cdr = it_cdr->next) {
|
|
|
|
for (it_cdr = cdr; it_cdr; it_cdr = it_cdr->next) {
|
|
|
|
struct timeval end;
|
|
|
|
struct timeval end;
|
|
|
|
|
|
|
|
|
|
|
|
if (snapshot_is_dialed(it_cdr->party_a.snapshot)) {
|
|
|
|
if (snapshot_is_dialed(it_cdr->party_a.snapshot)) {
|
|
|
|
continue;
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
}
|
|
|
@ -4290,5 +4296,3 @@ int ast_cdr_engine_reload(void)
|
|
|
|
|
|
|
|
|
|
|
|
return cdr_toggle_runtime_options();
|
|
|
|
return cdr_toggle_runtime_options();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|