Skip to content
项目
群组
代码片段
帮助
正在加载...
登录
切换导航
F
freeswitch
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
分枝图
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
分枝图
统计图
创建新议题
作业
提交
议题看板
打开侧边栏
张华
freeswitch
Commits
024e5fde
提交
024e5fde
authored
5月 08, 2012
作者:
Anthony Minessale
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
FS-4196 --resolve
上级
1edf94b5
隐藏空白字符变更
内嵌
并排
正在显示
4 个修改的文件
包含
270 行增加
和
451 行删除
+270
-451
switch_ivr.h
src/include/switch_ivr.h
+9
-0
Makefile
src/mod/event_handlers/mod_json_cdr/Makefile
+0
-23
mod_json_cdr.c
src/mod/event_handlers/mod_json_cdr/mod_json_cdr.c
+7
-428
switch_ivr.c
src/switch_ivr.c
+254
-0
没有找到文件。
src/include/switch_ivr.h
浏览文件 @
024e5fde
...
@@ -41,6 +41,7 @@
...
@@ -41,6 +41,7 @@
#define SWITCH_IVR_H
#define SWITCH_IVR_H
#include <switch.h>
#include <switch.h>
#include "switch_json.h"
SWITCH_BEGIN_EXTERN_C
struct
switch_unicast_conninfo
{
SWITCH_BEGIN_EXTERN_C
struct
switch_unicast_conninfo
{
switch_core_session_t
*
session
;
switch_core_session_t
*
session
;
...
@@ -82,6 +83,14 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_activate_unicast(switch_core_session_
...
@@ -82,6 +83,14 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_activate_unicast(switch_core_session_
char
*
local_ip
,
char
*
local_ip
,
switch_port_t
local_port
,
switch_port_t
local_port
,
char
*
remote_ip
,
switch_port_t
remote_port
,
char
*
transport
,
char
*
flags
);
char
*
remote_ip
,
switch_port_t
remote_port
,
char
*
transport
,
char
*
flags
);
/*!
\brief Generate an JSON CDR report.
\param session the session to get the data from.
\param json_cdr pointer to the json object
\return SWITCH_STATUS_SUCCESS if successful
\note on success the json object must be freed
*/
SWITCH_DECLARE
(
switch_status_t
)
switch_ivr_generate_json_cdr
(
switch_core_session_t
*
session
,
cJSON
**
json_cdr
,
switch_bool_t
urlencode
);
/*!
/*!
\brief Generate an XML CDR report.
\brief Generate an XML CDR report.
...
...
src/mod/event_handlers/mod_json_cdr/Makefile
浏览文件 @
024e5fde
json-c
=
json-c-0.9
BASE
=
../../../..
BASE
=
../../../..
JSON_DIR
=
$(switch_srcdir)
/libs/
$
(
json-c
)
JSON_BUILDDIR
=
$(switch_builddir)
/libs/
$
(
json-c
)
JSONLA
=
$(JSON_BUILDDIR)
/libjson.la
LOCAL_CFLAGS
=
-I
$(JSON_DIR)
LOCAL_LIBADD
=
$(JSONLA)
include
$(BASE)/build/modmake.rules
include
$(BASE)/build/modmake.rules
$(JSON_DIR)
:
$(GETLIB)
$
(
json-c
)
.tar.gz
$(JSON_BUILDDIR)/Makefile
:
$(JSON_DIR)
mkdir
-p
$(JSON_BUILDDIR)
cd
$(JSON_BUILDDIR)
&&
$(DEFAULT_VARS)
$(JSON_DIR)
/configure
$(DEFAULT_ARGS)
--srcdir
=
$(JSON_DIR)
CPPFLAGS
=
LDFLAGS
=
$(TOUCH_TARGET)
$(JSONLA)
:
$(JSON_BUILDDIR)/Makefile
cd
$(JSON_BUILDDIR)
&&
$(MAKE)
$(TOUCH_TARGET)
src/mod/event_handlers/mod_json_cdr/mod_json_cdr.c
浏览文件 @
024e5fde
...
@@ -33,7 +33,6 @@
...
@@ -33,7 +33,6 @@
#include <sys/stat.h>
#include <sys/stat.h>
#include <switch.h>
#include <switch.h>
#include <switch_curl.h>
#include <switch_curl.h>
#include <json.h>
#define MAX_URLS 20
#define MAX_URLS 20
#define MAX_ERR_DIRS 20
#define MAX_ERR_DIRS 20
...
@@ -181,432 +180,11 @@ static switch_status_t set_json_cdr_log_dirs()
...
@@ -181,432 +180,11 @@ static switch_status_t set_json_cdr_log_dirs()
return
status
;
return
status
;
}
}
#define json_object_safe_new_string(str) json_object_new_string(str ? str : "")
#define JSON_ENSURE_SUCCESS(obj) if (is_error(obj)) { return; }
static
void
set_json_profile_data
(
struct
json_object
*
json
,
switch_caller_profile_t
*
caller_profile
)
{
struct
json_object
*
param
=
NULL
;
param
=
json_object_safe_new_string
((
char
*
)
caller_profile
->
username
);
JSON_ENSURE_SUCCESS
(
param
);
json_object_object_add
(
json
,
"username"
,
param
);
param
=
json_object_safe_new_string
((
char
*
)
caller_profile
->
dialplan
);
JSON_ENSURE_SUCCESS
(
param
);
json_object_object_add
(
json
,
"dialplan"
,
param
);
param
=
json_object_safe_new_string
((
char
*
)
caller_profile
->
caller_id_name
);
JSON_ENSURE_SUCCESS
(
param
);
json_object_object_add
(
json
,
"caller_id_name"
,
param
);
param
=
json_object_safe_new_string
((
char
*
)
caller_profile
->
ani
);
JSON_ENSURE_SUCCESS
(
param
);
json_object_object_add
(
json
,
"ani"
,
param
);
param
=
json_object_safe_new_string
((
char
*
)
caller_profile
->
aniii
);
JSON_ENSURE_SUCCESS
(
param
);
json_object_object_add
(
json
,
"aniii"
,
param
);
param
=
json_object_safe_new_string
((
char
*
)
caller_profile
->
caller_id_number
);
JSON_ENSURE_SUCCESS
(
param
);
json_object_object_add
(
json
,
"caller_id_number"
,
param
);
param
=
json_object_safe_new_string
((
char
*
)
caller_profile
->
network_addr
);
JSON_ENSURE_SUCCESS
(
param
);
json_object_object_add
(
json
,
"network_addr"
,
param
);
param
=
json_object_safe_new_string
((
char
*
)
caller_profile
->
rdnis
);
JSON_ENSURE_SUCCESS
(
param
);
json_object_object_add
(
json
,
"rdnis"
,
param
);
param
=
json_object_safe_new_string
(
caller_profile
->
destination_number
);
JSON_ENSURE_SUCCESS
(
param
);
json_object_object_add
(
json
,
"destination_number"
,
param
);
param
=
json_object_safe_new_string
(
caller_profile
->
uuid
);
JSON_ENSURE_SUCCESS
(
param
);
json_object_object_add
(
json
,
"uuid"
,
param
);
param
=
json_object_safe_new_string
((
char
*
)
caller_profile
->
source
);
JSON_ENSURE_SUCCESS
(
param
);
json_object_object_add
(
json
,
"source"
,
param
);
param
=
json_object_safe_new_string
((
char
*
)
caller_profile
->
context
);
JSON_ENSURE_SUCCESS
(
param
);
json_object_object_add
(
json
,
"context"
,
param
);
param
=
json_object_safe_new_string
(
caller_profile
->
chan_name
);
JSON_ENSURE_SUCCESS
(
param
);
json_object_object_add
(
json
,
"chan_name"
,
param
);
}
static
void
set_json_chan_vars
(
struct
json_object
*
json
,
switch_channel_t
*
channel
)
{
struct
json_object
*
variable
=
NULL
;
switch_event_header_t
*
hi
=
switch_channel_variable_first
(
channel
);
if
(
!
hi
)
return
;
for
(;
hi
;
hi
=
hi
->
next
)
{
if
(
!
zstr
(
hi
->
name
)
&&
!
zstr
(
hi
->
value
))
{
char
*
data
=
hi
->
value
;
if
(
globals
.
encode_values
==
ENCODING_DEFAULT
)
{
switch_size_t
dlen
=
strlen
(
hi
->
value
)
*
3
;
if
((
data
=
malloc
(
dlen
)))
{
memset
(
data
,
0
,
dlen
);
switch_url_encode
(
hi
->
value
,
data
,
dlen
);
}
}
variable
=
json_object_safe_new_string
(
data
);
if
(
!
is_error
(
variable
))
{
json_object_object_add
(
json
,
hi
->
name
,
variable
);
}
if
(
data
!=
hi
->
value
)
{
switch_safe_free
(
data
);
}
}
}
switch_channel_variable_last
(
channel
);
}
static
switch_status_t
generate_json_cdr
(
switch_core_session_t
*
session
,
struct
json_object
**
json_cdr
)
{
struct
json_object
*
cdr
=
json_object_new_object
();
switch_channel_t
*
channel
=
switch_core_session_get_channel
(
session
);
switch_caller_profile_t
*
caller_profile
;
struct
json_object
*
variables
,
*
j_main_cp
,
*
j_caller_profile
,
*
j_caller_extension
,
*
j_times
,
*
time_tag
,
*
j_application
,
*
j_callflow
,
*
j_inner_extension
,
*
j_apps
,
*
j_o
,
*
j_channel_data
,
*
j_field
;
switch_app_log_t
*
app_log
;
char
tmp
[
512
],
*
f
;
if
(
is_error
(
cdr
))
{
return
SWITCH_STATUS_FALSE
;
}
j_channel_data
=
json_object_new_object
();
if
(
is_error
(
j_channel_data
))
{
goto
error
;
}
json_object_object_add
(
cdr
,
"channel_data"
,
j_channel_data
);
j_field
=
json_object_safe_new_string
((
char
*
)
switch_channel_state_name
(
switch_channel_get_state
(
channel
)));
json_object_object_add
(
j_channel_data
,
"state"
,
j_field
);
j_field
=
json_object_safe_new_string
(
switch_channel_direction
(
channel
)
==
SWITCH_CALL_DIRECTION_OUTBOUND
?
"outbound"
:
"inbound"
);
json_object_object_add
(
j_channel_data
,
"direction"
,
j_field
);
switch_snprintf
(
tmp
,
sizeof
(
tmp
),
"%d"
,
switch_channel_get_state
(
channel
));
j_field
=
json_object_new_string
((
char
*
)
tmp
);
json_object_object_add
(
j_channel_data
,
"state_number"
,
j_field
);
if
((
f
=
switch_channel_get_flag_string
(
channel
)))
{
j_field
=
json_object_safe_new_string
((
char
*
)
f
);
json_object_object_add
(
j_channel_data
,
"flags"
,
j_field
);
free
(
f
);
}
if
((
f
=
switch_channel_get_cap_string
(
channel
)))
{
j_field
=
json_object_safe_new_string
((
char
*
)
f
);
json_object_object_add
(
j_channel_data
,
"caps"
,
j_field
);
free
(
f
);
}
variables
=
json_object_new_object
();
json_object_object_add
(
cdr
,
"variables"
,
variables
);
if
(
is_error
(
variables
))
{
goto
error
;
}
set_json_chan_vars
(
variables
,
channel
);
if
((
app_log
=
switch_core_session_get_app_log
(
session
)))
{
switch_app_log_t
*
ap
;
j_apps
=
json_object_new_object
();
if
(
is_error
(
j_apps
))
{
goto
error
;
}
json_object_object_add
(
cdr
,
"app_log"
,
j_apps
);
for
(
ap
=
app_log
;
ap
;
ap
=
ap
->
next
)
{
j_application
=
json_object_new_object
();
if
(
is_error
(
j_application
))
{
goto
error
;
}
json_object_object_add
(
j_application
,
"app_name"
,
json_object_safe_new_string
(
ap
->
app
));
json_object_object_add
(
j_application
,
"app_data"
,
json_object_safe_new_string
(
ap
->
arg
));
json_object_object_add
(
j_apps
,
"application"
,
j_application
);
}
}
caller_profile
=
switch_channel_get_caller_profile
(
channel
);
while
(
caller_profile
)
{
j_callflow
=
json_object_new_object
();
if
(
is_error
(
j_callflow
))
{
goto
error
;
}
json_object_object_add
(
cdr
,
"callflow"
,
j_callflow
);
if
(
!
zstr
(
caller_profile
->
dialplan
))
{
json_object_object_add
(
j_callflow
,
"dialplan"
,
json_object_safe_new_string
((
char
*
)
caller_profile
->
dialplan
));
}
if
(
!
zstr
(
caller_profile
->
profile_index
))
{
json_object_object_add
(
j_callflow
,
"profile_index"
,
json_object_safe_new_string
((
char
*
)
caller_profile
->
profile_index
));
}
if
(
caller_profile
->
caller_extension
)
{
switch_caller_application_t
*
ap
;
j_caller_extension
=
json_object_new_object
();
if
(
is_error
(
j_caller_extension
))
{
goto
error
;
}
json_object_object_add
(
j_callflow
,
"extension"
,
j_caller_extension
);
json_object_object_add
(
j_caller_extension
,
"name"
,
json_object_safe_new_string
(
caller_profile
->
caller_extension
->
extension_name
));
json_object_object_add
(
j_caller_extension
,
"number"
,
json_object_safe_new_string
(
caller_profile
->
caller_extension
->
extension_number
));
if
(
caller_profile
->
caller_extension
->
current_application
)
{
json_object_object_add
(
j_caller_extension
,
"current_app"
,
json_object_safe_new_string
(
caller_profile
->
caller_extension
->
current_application
->
application_name
));
}
for
(
ap
=
caller_profile
->
caller_extension
->
applications
;
ap
;
ap
=
ap
->
next
)
{
j_application
=
json_object_new_object
();
if
(
is_error
(
j_application
))
{
goto
error
;
}
json_object_object_add
(
j_caller_extension
,
"application"
,
j_application
);
if
(
ap
==
caller_profile
->
caller_extension
->
current_application
)
{
json_object_object_add
(
j_application
,
"last_executed"
,
json_object_new_string
(
"true"
));
}
json_object_object_add
(
j_application
,
"app_name"
,
json_object_safe_new_string
(
ap
->
application_name
));
json_object_object_add
(
j_application
,
"app_data"
,
json_object_safe_new_string
(
switch_str_nil
(
ap
->
application_data
)));
}
if
(
caller_profile
->
caller_extension
->
children
)
{
switch_caller_profile_t
*
cp
=
NULL
;
for
(
cp
=
caller_profile
->
caller_extension
->
children
;
cp
;
cp
=
cp
->
next
)
{
if
(
!
cp
->
caller_extension
)
{
continue
;
}
j_inner_extension
=
json_object_new_object
();
if
(
is_error
(
j_inner_extension
))
{
goto
error
;
}
json_object_object_add
(
j_caller_extension
,
"sub_extensions"
,
j_inner_extension
);
j_caller_extension
=
json_object_new_object
();
if
(
is_error
(
j_caller_extension
))
{
goto
error
;
}
json_object_object_add
(
j_inner_extension
,
"extension"
,
j_caller_extension
);
json_object_object_add
(
j_caller_extension
,
"name"
,
json_object_safe_new_string
(
cp
->
caller_extension
->
extension_name
));
json_object_object_add
(
j_caller_extension
,
"number"
,
json_object_safe_new_string
(
cp
->
caller_extension
->
extension_number
));
json_object_object_add
(
j_caller_extension
,
"dialplan"
,
json_object_safe_new_string
((
char
*
)
cp
->
dialplan
));
if
(
cp
->
caller_extension
->
current_application
)
{
json_object_object_add
(
j_caller_extension
,
"current_app"
,
json_object_safe_new_string
(
cp
->
caller_extension
->
current_application
->
application_name
));
}
for
(
ap
=
cp
->
caller_extension
->
applications
;
ap
;
ap
=
ap
->
next
)
{
j_application
=
json_object_new_object
();
if
(
is_error
(
j_application
))
{
goto
error
;
}
json_object_object_add
(
j_caller_extension
,
"application"
,
j_application
);
if
(
ap
==
cp
->
caller_extension
->
current_application
)
{
json_object_object_add
(
j_application
,
"last_executed"
,
json_object_new_string
(
"true"
));
}
json_object_object_add
(
j_application
,
"app_name"
,
json_object_safe_new_string
(
ap
->
application_name
));
json_object_object_add
(
j_application
,
"app_data"
,
json_object_safe_new_string
(
switch_str_nil
(
ap
->
application_data
)));
}
}
}
}
j_main_cp
=
json_object_new_object
();
if
(
is_error
(
j_main_cp
))
{
goto
error
;
}
json_object_object_add
(
j_callflow
,
"caller_profile"
,
j_main_cp
);
set_json_profile_data
(
j_main_cp
,
caller_profile
);
if
(
caller_profile
->
originator_caller_profile
)
{
switch_caller_profile_t
*
cp
=
NULL
;
j_o
=
json_object_new_object
();
if
(
is_error
(
j_o
))
{
goto
error
;
}
json_object_object_add
(
j_main_cp
,
"originator"
,
j_o
);
for
(
cp
=
caller_profile
->
originator_caller_profile
;
cp
;
cp
=
cp
->
next
)
{
j_caller_profile
=
json_object_new_object
();
if
(
is_error
(
j_caller_profile
))
{
goto
error
;
}
json_object_object_add
(
j_o
,
"originator_caller_profile"
,
j_caller_profile
);
set_json_profile_data
(
j_caller_profile
,
cp
);
}
}
if
(
caller_profile
->
originatee_caller_profile
)
{
switch_caller_profile_t
*
cp
=
NULL
;
j_o
=
json_object_new_object
();
if
(
is_error
(
j_o
))
{
goto
error
;
}
json_object_object_add
(
j_main_cp
,
"originatee"
,
j_o
);
for
(
cp
=
caller_profile
->
originatee_caller_profile
;
cp
;
cp
=
cp
->
next
)
{
j_caller_profile
=
json_object_new_object
();
if
(
is_error
(
j_caller_profile
))
{
goto
error
;
}
json_object_object_add
(
j_o
,
"originatee_caller_profile"
,
j_caller_profile
);
set_json_profile_data
(
j_caller_profile
,
cp
);
}
}
if
(
caller_profile
->
times
)
{
j_times
=
json_object_new_object
();
if
(
is_error
(
j_times
))
{
goto
error
;
}
json_object_object_add
(
j_callflow
,
"times"
,
j_times
);
switch_snprintf
(
tmp
,
sizeof
(
tmp
),
"%"
SWITCH_TIME_T_FMT
,
caller_profile
->
times
->
created
);
time_tag
=
json_object_new_string
(
tmp
);
if
(
is_error
(
time_tag
))
{
goto
error
;
}
json_object_object_add
(
j_times
,
"created_time"
,
time_tag
);
switch_snprintf
(
tmp
,
sizeof
(
tmp
),
"%"
SWITCH_TIME_T_FMT
,
caller_profile
->
times
->
profile_created
);
time_tag
=
json_object_new_string
(
tmp
);
if
(
is_error
(
time_tag
))
{
goto
error
;
}
json_object_object_add
(
j_times
,
"profile_created_time"
,
time_tag
);
switch_snprintf
(
tmp
,
sizeof
(
tmp
),
"%"
SWITCH_TIME_T_FMT
,
caller_profile
->
times
->
progress
);
time_tag
=
json_object_new_string
(
tmp
);
if
(
is_error
(
time_tag
))
{
goto
error
;
}
json_object_object_add
(
j_times
,
"progress_time"
,
time_tag
);
switch_snprintf
(
tmp
,
sizeof
(
tmp
),
"%"
SWITCH_TIME_T_FMT
,
caller_profile
->
times
->
progress_media
);
time_tag
=
json_object_new_string
(
tmp
);
if
(
is_error
(
time_tag
))
{
goto
error
;
}
json_object_object_add
(
j_times
,
"progress_media_time"
,
time_tag
);
switch_snprintf
(
tmp
,
sizeof
(
tmp
),
"%"
SWITCH_TIME_T_FMT
,
caller_profile
->
times
->
answered
);
time_tag
=
json_object_new_string
(
tmp
);
if
(
is_error
(
time_tag
))
{
goto
error
;
}
json_object_object_add
(
j_times
,
"answered_time"
,
time_tag
);
switch_snprintf
(
tmp
,
sizeof
(
tmp
),
"%"
SWITCH_TIME_T_FMT
,
caller_profile
->
times
->
hungup
);
time_tag
=
json_object_new_string
(
tmp
);
if
(
is_error
(
time_tag
))
{
goto
error
;
}
json_object_object_add
(
j_times
,
"hangup_time"
,
time_tag
);
switch_snprintf
(
tmp
,
sizeof
(
tmp
),
"%"
SWITCH_TIME_T_FMT
,
caller_profile
->
times
->
resurrected
);
time_tag
=
json_object_new_string
(
tmp
);
if
(
is_error
(
time_tag
))
{
goto
error
;
}
json_object_object_add
(
j_times
,
"resurrect_time"
,
time_tag
);
switch_snprintf
(
tmp
,
sizeof
(
tmp
),
"%"
SWITCH_TIME_T_FMT
,
caller_profile
->
times
->
transferred
);
time_tag
=
json_object_new_string
(
tmp
);
if
(
is_error
(
time_tag
))
{
goto
error
;
}
json_object_object_add
(
j_times
,
"transfer_time"
,
time_tag
);
}
caller_profile
=
caller_profile
->
next
;
}
*
json_cdr
=
cdr
;
return
SWITCH_STATUS_SUCCESS
;
error:
if
(
cdr
)
{
json_object_put
(
cdr
);
}
return
SWITCH_STATUS_FALSE
;
}
static
switch_status_t
my_on_reporting
(
switch_core_session_t
*
session
)
static
switch_status_t
my_on_reporting
(
switch_core_session_t
*
session
)
{
{
struct
json_object
*
json_cdr
=
NULL
;
cJSON
*
json_cdr
=
NULL
;
c
onst
c
har
*
json_text
=
NULL
;
char
*
json_text
=
NULL
;
char
*
path
=
NULL
;
char
*
path
=
NULL
;
char
*
curl_json_text
=
NULL
;
char
*
curl_json_text
=
NULL
;
const
char
*
logdir
=
NULL
;
const
char
*
logdir
=
NULL
;
...
@@ -637,12 +215,12 @@ static switch_status_t my_on_reporting(switch_core_session_t *session)
...
@@ -637,12 +215,12 @@ static switch_status_t my_on_reporting(switch_core_session_t *session)
a_prefix
=
"a_"
;
a_prefix
=
"a_"
;
if
(
generate_json_cdr
(
session
,
&
json_cdr
)
!=
SWITCH_STATUS_SUCCESS
)
{
if
(
switch_ivr_generate_json_cdr
(
session
,
&
json_cdr
,
globals
.
encode_values
==
ENCODING_DEFAULT
)
!=
SWITCH_STATUS_SUCCESS
)
{
switch_log_printf
(
SWITCH_CHANNEL_LOG
,
SWITCH_LOG_ERROR
,
"Error Generating Data!
\n
"
);
switch_log_printf
(
SWITCH_CHANNEL_LOG
,
SWITCH_LOG_ERROR
,
"Error Generating Data!
\n
"
);
return
SWITCH_STATUS_FALSE
;
return
SWITCH_STATUS_FALSE
;
}
}
json_text
=
json_object_to_json_string
(
json_cdr
);
json_text
=
cJSON_PrintUnformatted
(
json_cdr
);
if
(
!
json_text
)
{
if
(
!
json_text
)
{
switch_log_printf
(
SWITCH_CHANNEL_LOG
,
SWITCH_LOG_CRIT
,
"Memory Error!
\n
"
);
switch_log_printf
(
SWITCH_CHANNEL_LOG
,
SWITCH_LOG_CRIT
,
"Memory Error!
\n
"
);
...
@@ -705,6 +283,7 @@ static switch_status_t my_on_reporting(switch_core_session_t *session)
...
@@ -705,6 +283,7 @@ static switch_status_t my_on_reporting(switch_core_session_t *session)
switch_b64_encode
((
unsigned
char
*
)
json_text
,
need_bytes
/
3
,
(
unsigned
char
*
)
json_text_escaped
,
need_bytes
);
switch_b64_encode
((
unsigned
char
*
)
json_text
,
need_bytes
/
3
,
(
unsigned
char
*
)
json_text_escaped
,
need_bytes
);
}
}
switch_safe_free
(
json_text
);
json_text
=
json_text_escaped
;
json_text
=
json_text_escaped
;
if
(
!
(
curl_json_text
=
switch_mprintf
(
"cdr=%s"
,
json_text
)))
{
if
(
!
(
curl_json_text
=
switch_mprintf
(
"cdr=%s"
,
json_text
)))
{
...
@@ -861,8 +440,8 @@ static switch_status_t my_on_reporting(switch_core_session_t *session)
...
@@ -861,8 +440,8 @@ static switch_status_t my_on_reporting(switch_core_session_t *session)
switch_safe_free
(
curl_json_text
);
switch_safe_free
(
curl_json_text
);
}
}
json_object_put
(
json_cdr
);
cJSON_Delete
(
json_cdr
);
switch_safe_free
(
json_text
_escaped
);
switch_safe_free
(
json_text
);
return
status
;
return
status
;
}
}
...
...
src/switch_ivr.c
浏览文件 @
024e5fde
...
@@ -2472,6 +2472,260 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_generate_xml_cdr(switch_core_session_
...
@@ -2472,6 +2472,260 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_generate_xml_cdr(switch_core_session_
return
SWITCH_STATUS_FALSE
;
return
SWITCH_STATUS_FALSE
;
}
}
static
void
switch_ivr_set_json_profile_data
(
cJSON
*
json
,
switch_caller_profile_t
*
caller_profile
)
{
cJSON_AddItemToObject
(
json
,
"username"
,
cJSON_CreateString
((
char
*
)
caller_profile
->
username
));
cJSON_AddItemToObject
(
json
,
"dialplan"
,
cJSON_CreateString
((
char
*
)
caller_profile
->
dialplan
));
cJSON_AddItemToObject
(
json
,
"caller_id_name"
,
cJSON_CreateString
((
char
*
)
caller_profile
->
caller_id_name
));
cJSON_AddItemToObject
(
json
,
"ani"
,
cJSON_CreateString
((
char
*
)
caller_profile
->
ani
));
cJSON_AddItemToObject
(
json
,
"aniii"
,
cJSON_CreateString
((
char
*
)
caller_profile
->
aniii
));
cJSON_AddItemToObject
(
json
,
"caller_id_number"
,
cJSON_CreateString
((
char
*
)
caller_profile
->
caller_id_number
));
cJSON_AddItemToObject
(
json
,
"network_addr"
,
cJSON_CreateString
((
char
*
)
caller_profile
->
network_addr
));
cJSON_AddItemToObject
(
json
,
"rdnis"
,
cJSON_CreateString
((
char
*
)
caller_profile
->
rdnis
));
cJSON_AddItemToObject
(
json
,
"destination_number"
,
cJSON_CreateString
(
caller_profile
->
destination_number
));
cJSON_AddItemToObject
(
json
,
"uuid"
,
cJSON_CreateString
(
caller_profile
->
uuid
));
cJSON_AddItemToObject
(
json
,
"source"
,
cJSON_CreateString
((
char
*
)
caller_profile
->
source
));
cJSON_AddItemToObject
(
json
,
"context"
,
cJSON_CreateString
((
char
*
)
caller_profile
->
context
));
cJSON_AddItemToObject
(
json
,
"chan_name"
,
cJSON_CreateString
(
caller_profile
->
chan_name
));
}
static
void
switch_ivr_set_json_chan_vars
(
cJSON
*
json
,
switch_channel_t
*
channel
,
switch_bool_t
urlencode
)
{
switch_event_header_t
*
hi
=
switch_channel_variable_first
(
channel
);
if
(
!
hi
)
return
;
for
(;
hi
;
hi
=
hi
->
next
)
{
if
(
!
zstr
(
hi
->
name
)
&&
!
zstr
(
hi
->
value
))
{
char
*
data
=
hi
->
value
;
if
(
urlencode
)
{
switch_size_t
dlen
=
strlen
(
hi
->
value
)
*
3
;
if
((
data
=
malloc
(
dlen
)))
{
memset
(
data
,
0
,
dlen
);
switch_url_encode
(
hi
->
value
,
data
,
dlen
);
}
}
cJSON_AddItemToObject
(
json
,
hi
->
name
,
cJSON_CreateString
(
data
));
if
(
data
!=
hi
->
value
)
{
switch_safe_free
(
data
);
}
}
}
switch_channel_variable_last
(
channel
);
}
SWITCH_DECLARE
(
switch_status_t
)
switch_ivr_generate_json_cdr
(
switch_core_session_t
*
session
,
cJSON
**
json_cdr
,
switch_bool_t
urlencode
)
{
cJSON
*
cdr
=
cJSON_CreateObject
();
switch_channel_t
*
channel
=
switch_core_session_get_channel
(
session
);
switch_caller_profile_t
*
caller_profile
;
cJSON
*
variables
,
*
j_main_cp
,
*
j_caller_profile
,
*
j_caller_extension
,
*
j_times
,
*
j_application
,
*
j_callflow
,
*
j_inner_extension
,
*
j_apps
,
*
j_o
,
*
j_channel_data
;
switch_app_log_t
*
app_log
;
char
tmp
[
512
],
*
f
;
j_channel_data
=
cJSON_CreateObject
();
cJSON_AddItemToObject
(
cdr
,
"channel_data"
,
j_channel_data
);
cJSON_AddItemToObject
(
j_channel_data
,
"state"
,
cJSON_CreateString
((
char
*
)
switch_channel_state_name
(
switch_channel_get_state
(
channel
))));
cJSON_AddItemToObject
(
j_channel_data
,
"direction"
,
cJSON_CreateString
(
switch_channel_direction
(
channel
)
==
SWITCH_CALL_DIRECTION_OUTBOUND
?
"outbound"
:
"inbound"
));
switch_snprintf
(
tmp
,
sizeof
(
tmp
),
"%d"
,
switch_channel_get_state
(
channel
));
cJSON_AddItemToObject
(
j_channel_data
,
"state_number"
,
cJSON_CreateString
((
char
*
)
tmp
));
if
((
f
=
switch_channel_get_flag_string
(
channel
)))
{
cJSON_AddItemToObject
(
j_channel_data
,
"flags"
,
cJSON_CreateString
((
char
*
)
f
));
free
(
f
);
}
if
((
f
=
switch_channel_get_cap_string
(
channel
)))
{
cJSON_AddItemToObject
(
j_channel_data
,
"caps"
,
cJSON_CreateString
((
char
*
)
f
));
free
(
f
);
}
variables
=
cJSON_CreateObject
();
cJSON_AddItemToObject
(
cdr
,
"variables"
,
variables
);
switch_ivr_set_json_chan_vars
(
variables
,
channel
,
urlencode
);
if
((
app_log
=
switch_core_session_get_app_log
(
session
)))
{
switch_app_log_t
*
ap
;
j_apps
=
cJSON_CreateObject
();
cJSON_AddItemToObject
(
cdr
,
"app_log"
,
j_apps
);
for
(
ap
=
app_log
;
ap
;
ap
=
ap
->
next
)
{
j_application
=
cJSON_CreateObject
();
cJSON_AddItemToObject
(
j_application
,
"app_name"
,
cJSON_CreateString
(
ap
->
app
));
cJSON_AddItemToObject
(
j_application
,
"app_data"
,
cJSON_CreateString
(
ap
->
arg
));
cJSON_AddItemToObject
(
j_apps
,
"application"
,
j_application
);
}
}
caller_profile
=
switch_channel_get_caller_profile
(
channel
);
while
(
caller_profile
)
{
j_callflow
=
cJSON_CreateObject
();
cJSON_AddItemToObject
(
cdr
,
"callflow"
,
j_callflow
);
if
(
!
zstr
(
caller_profile
->
dialplan
))
{
cJSON_AddItemToObject
(
j_callflow
,
"dialplan"
,
cJSON_CreateString
((
char
*
)
caller_profile
->
dialplan
));
}
if
(
!
zstr
(
caller_profile
->
profile_index
))
{
cJSON_AddItemToObject
(
j_callflow
,
"profile_index"
,
cJSON_CreateString
((
char
*
)
caller_profile
->
profile_index
));
}
if
(
caller_profile
->
caller_extension
)
{
switch_caller_application_t
*
ap
;
j_caller_extension
=
cJSON_CreateObject
();
cJSON_AddItemToObject
(
j_callflow
,
"extension"
,
j_caller_extension
);
cJSON_AddItemToObject
(
j_caller_extension
,
"name"
,
cJSON_CreateString
(
caller_profile
->
caller_extension
->
extension_name
));
cJSON_AddItemToObject
(
j_caller_extension
,
"number"
,
cJSON_CreateString
(
caller_profile
->
caller_extension
->
extension_number
));
if
(
caller_profile
->
caller_extension
->
current_application
)
{
cJSON_AddItemToObject
(
j_caller_extension
,
"current_app"
,
cJSON_CreateString
(
caller_profile
->
caller_extension
->
current_application
->
application_name
));
}
for
(
ap
=
caller_profile
->
caller_extension
->
applications
;
ap
;
ap
=
ap
->
next
)
{
j_application
=
cJSON_CreateObject
();
cJSON_AddItemToObject
(
j_caller_extension
,
"application"
,
j_application
);
if
(
ap
==
caller_profile
->
caller_extension
->
current_application
)
{
cJSON_AddItemToObject
(
j_application
,
"last_executed"
,
cJSON_CreateString
(
"true"
));
}
cJSON_AddItemToObject
(
j_application
,
"app_name"
,
cJSON_CreateString
(
ap
->
application_name
));
cJSON_AddItemToObject
(
j_application
,
"app_data"
,
cJSON_CreateString
(
switch_str_nil
(
ap
->
application_data
)));
}
if
(
caller_profile
->
caller_extension
->
children
)
{
switch_caller_profile_t
*
cp
=
NULL
;
for
(
cp
=
caller_profile
->
caller_extension
->
children
;
cp
;
cp
=
cp
->
next
)
{
if
(
!
cp
->
caller_extension
)
{
continue
;
}
j_inner_extension
=
cJSON_CreateObject
();
cJSON_AddItemToObject
(
j_caller_extension
,
"sub_extensions"
,
j_inner_extension
);
j_caller_extension
=
cJSON_CreateObject
();
cJSON_AddItemToObject
(
j_inner_extension
,
"extension"
,
j_caller_extension
);
cJSON_AddItemToObject
(
j_caller_extension
,
"name"
,
cJSON_CreateString
(
cp
->
caller_extension
->
extension_name
));
cJSON_AddItemToObject
(
j_caller_extension
,
"number"
,
cJSON_CreateString
(
cp
->
caller_extension
->
extension_number
));
cJSON_AddItemToObject
(
j_caller_extension
,
"dialplan"
,
cJSON_CreateString
((
char
*
)
cp
->
dialplan
));
if
(
cp
->
caller_extension
->
current_application
)
{
cJSON_AddItemToObject
(
j_caller_extension
,
"current_app"
,
cJSON_CreateString
(
cp
->
caller_extension
->
current_application
->
application_name
));
}
for
(
ap
=
cp
->
caller_extension
->
applications
;
ap
;
ap
=
ap
->
next
)
{
j_application
=
cJSON_CreateObject
();
cJSON_AddItemToObject
(
j_caller_extension
,
"application"
,
j_application
);
if
(
ap
==
cp
->
caller_extension
->
current_application
)
{
cJSON_AddItemToObject
(
j_application
,
"last_executed"
,
cJSON_CreateString
(
"true"
));
}
cJSON_AddItemToObject
(
j_application
,
"app_name"
,
cJSON_CreateString
(
ap
->
application_name
));
cJSON_AddItemToObject
(
j_application
,
"app_data"
,
cJSON_CreateString
(
switch_str_nil
(
ap
->
application_data
)));
}
}
}
}
j_main_cp
=
cJSON_CreateObject
();
cJSON_AddItemToObject
(
j_callflow
,
"caller_profile"
,
j_main_cp
);
switch_ivr_set_json_profile_data
(
j_main_cp
,
caller_profile
);
if
(
caller_profile
->
originator_caller_profile
)
{
switch_caller_profile_t
*
cp
=
NULL
;
j_o
=
cJSON_CreateObject
();
cJSON_AddItemToObject
(
j_main_cp
,
"originator"
,
j_o
);
for
(
cp
=
caller_profile
->
originator_caller_profile
;
cp
;
cp
=
cp
->
next
)
{
j_caller_profile
=
cJSON_CreateObject
();
cJSON_AddItemToObject
(
j_o
,
"originator_caller_profile"
,
j_caller_profile
);
switch_ivr_set_json_profile_data
(
j_caller_profile
,
cp
);
}
}
if
(
caller_profile
->
originatee_caller_profile
)
{
switch_caller_profile_t
*
cp
=
NULL
;
j_o
=
cJSON_CreateObject
();
cJSON_AddItemToObject
(
j_main_cp
,
"originatee"
,
j_o
);
for
(
cp
=
caller_profile
->
originatee_caller_profile
;
cp
;
cp
=
cp
->
next
)
{
j_caller_profile
=
cJSON_CreateObject
();
cJSON_AddItemToObject
(
j_o
,
"originatee_caller_profile"
,
j_caller_profile
);
switch_ivr_set_json_profile_data
(
j_caller_profile
,
cp
);
}
}
if
(
caller_profile
->
times
)
{
j_times
=
cJSON_CreateObject
();
cJSON_AddItemToObject
(
j_callflow
,
"times"
,
j_times
);
switch_snprintf
(
tmp
,
sizeof
(
tmp
),
"%"
SWITCH_TIME_T_FMT
,
caller_profile
->
times
->
created
);
cJSON_AddItemToObject
(
j_times
,
"created_time"
,
cJSON_CreateString
(
tmp
));
switch_snprintf
(
tmp
,
sizeof
(
tmp
),
"%"
SWITCH_TIME_T_FMT
,
caller_profile
->
times
->
profile_created
);
cJSON_AddItemToObject
(
j_times
,
"profile_created_time"
,
cJSON_CreateString
(
tmp
));
switch_snprintf
(
tmp
,
sizeof
(
tmp
),
"%"
SWITCH_TIME_T_FMT
,
caller_profile
->
times
->
progress
);
cJSON_AddItemToObject
(
j_times
,
"progress_time"
,
cJSON_CreateString
(
tmp
));
switch_snprintf
(
tmp
,
sizeof
(
tmp
),
"%"
SWITCH_TIME_T_FMT
,
caller_profile
->
times
->
progress_media
);
cJSON_AddItemToObject
(
j_times
,
"progress_media_time"
,
cJSON_CreateString
(
tmp
));
switch_snprintf
(
tmp
,
sizeof
(
tmp
),
"%"
SWITCH_TIME_T_FMT
,
caller_profile
->
times
->
answered
);
cJSON_AddItemToObject
(
j_times
,
"answered_time"
,
cJSON_CreateString
(
tmp
));
switch_snprintf
(
tmp
,
sizeof
(
tmp
),
"%"
SWITCH_TIME_T_FMT
,
caller_profile
->
times
->
hungup
);
cJSON_AddItemToObject
(
j_times
,
"hangup_time"
,
cJSON_CreateString
(
tmp
));
switch_snprintf
(
tmp
,
sizeof
(
tmp
),
"%"
SWITCH_TIME_T_FMT
,
caller_profile
->
times
->
resurrected
);
cJSON_AddItemToObject
(
j_times
,
"resurrect_time"
,
cJSON_CreateString
(
tmp
));
switch_snprintf
(
tmp
,
sizeof
(
tmp
),
"%"
SWITCH_TIME_T_FMT
,
caller_profile
->
times
->
transferred
);
cJSON_AddItemToObject
(
j_times
,
"transfer_time"
,
cJSON_CreateString
(
tmp
));
}
caller_profile
=
caller_profile
->
next
;
}
*
json_cdr
=
cdr
;
return
SWITCH_STATUS_SUCCESS
;
}
SWITCH_DECLARE
(
void
)
switch_ivr_park_session
(
switch_core_session_t
*
session
)
SWITCH_DECLARE
(
void
)
switch_ivr_park_session
(
switch_core_session_t
*
session
)
{
{
switch_channel_t
*
channel
=
switch_core_session_get_channel
(
session
);
switch_channel_t
*
channel
=
switch_core_session_get_channel
(
session
);
...
...
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论