Skip to content
项目
群组
代码片段
帮助
正在加载...
登录
切换导航
F
freeswitch
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
分枝图
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
分枝图
统计图
创建新议题
作业
提交
议题看板
打开侧边栏
张华
freeswitch
Commits
5138aede
提交
5138aede
authored
3月 07, 2014
作者:
Chris Rienzo
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
FS-6282 mod_rayo: allow outbound call JID to be assigned by client
上级
b8e4a66d
隐藏空白字符变更
内嵌
并排
正在显示
7 个修改的文件
包含
256 行增加
和
88 行删除
+256
-88
mod_rayo.c
src/mod/event_handlers/mod_rayo/mod_rayo.c
+200
-71
rayo_cpa_component.c
src/mod/event_handlers/mod_rayo/rayo_cpa_component.c
+4
-1
rayo_fax_components.c
src/mod/event_handlers/mod_rayo/rayo_fax_components.c
+11
-3
rayo_input_component.c
src/mod/event_handlers/mod_rayo/rayo_input_component.c
+5
-1
rayo_output_component.c
src/mod/event_handlers/mod_rayo/rayo_output_component.c
+11
-1
rayo_prompt_component.c
src/mod/event_handlers/mod_rayo/rayo_prompt_component.c
+6
-2
rayo_record_component.c
src/mod/event_handlers/mod_rayo/rayo_record_component.c
+19
-9
没有找到文件。
src/mod/event_handlers/mod_rayo/mod_rayo.c
浏览文件 @
5138aede
/*
* mod_rayo for FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application
* Copyright (C) 2013, Grasshopper
* Copyright (C) 2013
-2014
, Grasshopper
*
* Version: MPL 1.1
*
...
...
@@ -1142,7 +1142,7 @@ void rayo_actor_send_ignore(struct rayo_actor *to, struct rayo_message *msg)
* @param send sent message handler
* @param file that called this function
* @param line that called this function
* @return the actor
* @return the actor
or NULL if JID conflict
*/
static
struct
rayo_actor
*
rayo_actor_init
(
struct
rayo_actor
*
actor
,
switch_memory_pool_t
*
pool
,
const
char
*
type
,
const
char
*
subtype
,
const
char
*
id
,
const
char
*
jid
,
rayo_actor_cleanup_fn
cleanup
,
rayo_actor_send_fn
send
,
const
char
*
file
,
int
line
)
{
...
...
@@ -1180,12 +1180,22 @@ static struct rayo_actor *rayo_actor_init(struct rayo_actor *actor, switch_memor
/* add to hash of actors, so commands can route to call */
switch_mutex_lock
(
globals
.
actors_mutex
);
if
(
!
zstr
(
id
))
{
switch_core_hash_insert
(
globals
.
actors_by_id
,
actor
->
id
,
actor
);
}
if
(
!
zstr
(
jid
))
{
if
(
switch_core_hash_find
(
globals
.
actors
,
RAYO_JID
(
actor
)))
{
/* duplicate JID, give up! */
switch_log_printf
(
SWITCH_CHANNEL_ID_LOG
,
file
,
""
,
line
,
""
,
SWITCH_LOG_NOTICE
,
"JID conflict! %s
\n
"
,
RAYO_JID
(
actor
));
switch_mutex_unlock
(
globals
.
actors_mutex
);
return
NULL
;
}
switch_core_hash_insert
(
globals
.
actors
,
RAYO_JID
(
actor
),
actor
);
}
if
(
!
zstr
(
id
))
{
if
(
switch_core_hash_find
(
globals
.
actors_by_id
,
actor
->
id
))
{
/* duplicate ID - only log for now... */
switch_log_printf
(
SWITCH_CHANNEL_LOG
,
SWITCH_LOG_NOTICE
,
"ID conflict! %s
\n
"
,
actor
->
id
);
}
switch_core_hash_insert
(
globals
.
actors_by_id
,
actor
->
id
,
actor
);
}
switch_mutex_unlock
(
globals
.
actors_mutex
);
switch_log_printf
(
SWITCH_CHANNEL_ID_LOG
,
file
,
""
,
line
,
""
,
SWITCH_LOG_DEBUG
,
"Init %s
\n
"
,
RAYO_JID
(
actor
));
...
...
@@ -1195,6 +1205,7 @@ static struct rayo_actor *rayo_actor_init(struct rayo_actor *actor, switch_memor
/**
* Initialize rayo call
* @return the call or NULL if JID conflict
*/
static
struct
rayo_call
*
rayo_call_init
(
struct
rayo_call
*
call
,
switch_memory_pool_t
*
pool
,
const
char
*
uuid
,
const
char
*
file
,
int
line
)
{
...
...
@@ -1207,17 +1218,19 @@ static struct rayo_call *rayo_call_init(struct rayo_call *call, switch_memory_po
}
call_jid
=
switch_mprintf
(
"%s@%s"
,
uuid
,
RAYO_JID
(
globals
.
server
));
rayo_actor_init
(
RAYO_ACTOR
(
call
),
pool
,
RAT_CALL
,
""
,
uuid
,
call_jid
,
rayo_call_cleanup
,
rayo_call_send
,
file
,
line
);
call
->
dcp_jid
=
""
;
call
->
idle_start_time
=
switch_micro_time_now
();
call
->
joined
=
0
;
call
->
joined_id
=
NULL
;
call
->
ringing_sent
=
0
;
call
->
pending_join_request
=
NULL
;
call
->
dial_request_id
=
NULL
;
call
->
end_event
=
NULL
;
call
->
dial_request_failed
=
0
;
switch_core_hash_init
(
&
call
->
pcps
,
pool
);
call
=
RAYO_CALL
(
rayo_actor_init
(
RAYO_ACTOR
(
call
),
pool
,
RAT_CALL
,
""
,
uuid
,
call_jid
,
rayo_call_cleanup
,
rayo_call_send
,
file
,
line
));
if
(
call
)
{
call
->
dcp_jid
=
""
;
call
->
idle_start_time
=
switch_micro_time_now
();
call
->
joined
=
0
;
call
->
joined_id
=
NULL
;
call
->
ringing_sent
=
0
;
call
->
pending_join_request
=
NULL
;
call
->
dial_request_id
=
NULL
;
call
->
end_event
=
NULL
;
call
->
dial_request_failed
=
0
;
switch_core_hash_init
(
&
call
->
pcps
,
pool
);
}
switch_safe_free
(
call_jid
);
...
...
@@ -1230,7 +1243,7 @@ static struct rayo_call *rayo_call_init(struct rayo_call *call, switch_memory_po
* @param uuid uuid to assign call, if NULL one is picked
* @param file file that called this function
* @param line number of file that called this function
* @return the call
* @return the call
, or NULL if JID conflict
*/
static
struct
rayo_call
*
_rayo_call_create
(
const
char
*
uuid
,
const
char
*
file
,
int
line
)
{
...
...
@@ -1238,7 +1251,11 @@ static struct rayo_call *_rayo_call_create(const char *uuid, const char *file, i
struct
rayo_call
*
call
;
switch_core_new_memory_pool
(
&
pool
);
call
=
switch_core_alloc
(
pool
,
sizeof
(
*
call
));
return
rayo_call_init
(
call
,
pool
,
uuid
,
file
,
line
);
call
=
rayo_call_init
(
call
,
pool
,
uuid
,
file
,
line
);
if
(
!
call
)
{
switch_core_destroy_memory_pool
(
&
pool
);
}
return
call
;
}
/**
...
...
@@ -1253,13 +1270,16 @@ static void rayo_mixer_cleanup(struct rayo_actor *actor)
/**
* Initialize mixer
* @return the mixer or NULL if JID conflict
*/
static
struct
rayo_mixer
*
rayo_mixer_init
(
struct
rayo_mixer
*
mixer
,
switch_memory_pool_t
*
pool
,
const
char
*
name
,
const
char
*
file
,
int
line
)
{
char
*
mixer_jid
=
switch_mprintf
(
"%s@%s"
,
name
,
RAYO_JID
(
globals
.
server
));
rayo_actor_init
(
RAYO_ACTOR
(
mixer
),
pool
,
RAT_MIXER
,
""
,
name
,
mixer_jid
,
rayo_mixer_cleanup
,
rayo_mixer_send
,
file
,
line
);
switch_core_hash_init
(
&
mixer
->
members
,
pool
);
switch_core_hash_init
(
&
mixer
->
subscribers
,
pool
);
mixer
=
RAYO_MIXER
(
rayo_actor_init
(
RAYO_ACTOR
(
mixer
),
pool
,
RAT_MIXER
,
""
,
name
,
mixer_jid
,
rayo_mixer_cleanup
,
rayo_mixer_send
,
file
,
line
));
if
(
mixer
)
{
switch_core_hash_init
(
&
mixer
->
members
,
pool
);
switch_core_hash_init
(
&
mixer
->
subscribers
,
pool
);
}
switch_safe_free
(
mixer_jid
);
return
mixer
;
}
...
...
@@ -1268,15 +1288,18 @@ static struct rayo_mixer *rayo_mixer_init(struct rayo_mixer *mixer, switch_memor
/**
* Create Rayo mixer
* @param name of this mixer
* @return the mixer
* @return the mixer
or NULL if JID conflict
*/
static
struct
rayo_mixer
*
_rayo_mixer_create
(
const
char
*
name
,
const
char
*
file
,
int
line
)
{
switch_memory_pool_t
*
pool
;
struct
rayo_mixer
*
mixer
=
NULL
;
switch_core_new_memory_pool
(
&
pool
);
mixer
=
switch_core_alloc
(
pool
,
sizeof
(
*
mixer
));
return
rayo_mixer_init
(
mixer
,
pool
,
name
,
file
,
line
);
mixer
=
rayo_mixer_init
(
switch_core_alloc
(
pool
,
sizeof
(
*
mixer
)),
pool
,
name
,
file
,
line
);
if
(
!
mixer
)
{
switch_core_destroy_memory_pool
(
&
pool
);
}
return
mixer
;
}
/**
...
...
@@ -1302,7 +1325,7 @@ static void rayo_component_cleanup(struct rayo_actor *actor)
* @param cleanup optional cleanup function
* @param file file that called this function
* @param line line number that called this function
* @return the component
* @return the component
or NULL if JID conflict
*/
struct
rayo_component
*
_rayo_component_init
(
struct
rayo_component
*
component
,
switch_memory_pool_t
*
pool
,
const
char
*
type
,
const
char
*
subtype
,
const
char
*
id
,
struct
rayo_actor
*
parent
,
const
char
*
client_jid
,
rayo_actor_cleanup_fn
cleanup
,
const
char
*
file
,
int
line
)
{
...
...
@@ -1312,13 +1335,14 @@ struct rayo_component *_rayo_component_init(struct rayo_component *component, sw
id
=
jid
;
}
rayo_actor_init
(
RAYO_ACTOR
(
component
),
pool
,
type
,
subtype
,
id
,
jid
,
rayo_component_cleanup
,
rayo_component_send
,
file
,
line
);
RAYO_RDLOCK
(
parent
);
component
->
client_jid
=
switch_core_strdup
(
pool
,
client_jid
);
component
->
ref
=
switch_core_strdup
(
pool
,
ref
);
component
->
parent
=
parent
;
component
->
cleanup_fn
=
cleanup
;
component
=
RAYO_COMPONENT
(
rayo_actor_init
(
RAYO_ACTOR
(
component
),
pool
,
type
,
subtype
,
id
,
jid
,
rayo_component_cleanup
,
rayo_component_send
,
file
,
line
));
if
(
component
)
{
RAYO_RDLOCK
(
parent
);
component
->
client_jid
=
switch_core_strdup
(
pool
,
client_jid
);
component
->
ref
=
switch_core_strdup
(
pool
,
ref
);
component
->
parent
=
parent
;
component
->
cleanup_fn
=
cleanup
;
}
switch_safe_free
(
ref
);
switch_safe_free
(
jid
);
...
...
@@ -1358,27 +1382,28 @@ static void rayo_client_cleanup(struct rayo_actor *actor)
* @param availability of client
* @param send message transmission function
* @param peer_server NULL if locally connected client
* @return the new client
* @return the new client
or NULL if JID conflict
*/
static
struct
rayo_client
*
rayo_client_init
(
struct
rayo_client
*
client
,
switch_memory_pool_t
*
pool
,
const
char
*
jid
,
const
char
*
route
,
enum
presence_status
availability
,
rayo_actor_send_fn
send
,
struct
rayo_peer_server
*
peer_server
)
{
RAYO_ACTOR_INIT
(
RAYO_ACTOR
(
client
),
pool
,
RAT_CLIENT
,
""
,
jid
,
jid
,
rayo_client_cleanup
,
send
);
client
->
availability
=
availability
;
client
->
peer_server
=
peer_server
;
client
->
last_probe
=
0
;
if
(
route
)
{
client
->
route
=
switch_core_strdup
(
pool
,
route
);
}
client
=
RAYO_CLIENT
(
RAYO_ACTOR_INIT
(
RAYO_ACTOR
(
client
),
pool
,
RAT_CLIENT
,
""
,
jid
,
jid
,
rayo_client_cleanup
,
send
));
if
(
client
)
{
client
->
availability
=
availability
;
client
->
peer_server
=
peer_server
;
client
->
last_probe
=
0
;
if
(
route
)
{
client
->
route
=
switch_core_strdup
(
pool
,
route
);
}
/* make client available for offers */
switch_mutex_lock
(
globals
.
clients_mutex
);
switch_core_hash_insert
(
globals
.
clients_roster
,
RAYO_JID
(
client
),
client
);
if
(
peer_server
)
{
switch_log_printf
(
SWITCH_CHANNEL_LOG
,
SWITCH_LOG_INFO
,
"Adding %s to peer server %s
\n
"
,
RAYO_JID
(
client
),
RAYO_JID
(
peer_server
));
switch_core_hash_insert
(
peer_server
->
clients
,
RAYO_JID
(
client
),
client
);
/* make client available for offers */
switch_mutex_lock
(
globals
.
clients_mutex
);
switch_core_hash_insert
(
globals
.
clients_roster
,
RAYO_JID
(
client
),
client
);
if
(
peer_server
)
{
switch_log_printf
(
SWITCH_CHANNEL_LOG
,
SWITCH_LOG_INFO
,
"Adding %s to peer server %s
\n
"
,
RAYO_JID
(
client
),
RAYO_JID
(
peer_server
));
switch_core_hash_insert
(
peer_server
->
clients
,
RAYO_JID
(
client
),
client
);
}
switch_mutex_unlock
(
globals
.
clients_mutex
);
}
switch_mutex_unlock
(
globals
.
clients_mutex
);
return
client
;
}
...
...
@@ -1401,7 +1426,11 @@ static struct rayo_client *rayo_client_create(const char *jid, const char *route
switch_log_printf
(
SWITCH_CHANNEL_LOG
,
SWITCH_LOG_ERROR
,
"Memory Error
\n
"
);
return
NULL
;
}
return
rayo_client_init
(
rclient
,
pool
,
jid
,
route
,
availability
,
send
,
peer_server
);
rclient
=
rayo_client_init
(
rclient
,
pool
,
jid
,
route
,
availability
,
send
,
peer_server
);
if
(
!
rclient
)
{
switch_core_destroy_memory_pool
(
&
pool
);
}
return
rclient
;
}
/**
...
...
@@ -1455,8 +1484,12 @@ static struct rayo_peer_server *rayo_peer_server_create(const char *jid)
switch_log_printf
(
SWITCH_CHANNEL_LOG
,
SWITCH_LOG_ERROR
,
"Memory Error
\n
"
);
return
NULL
;
}
RAYO_ACTOR_INIT
(
RAYO_ACTOR
(
rserver
),
pool
,
RAT_PEER_SERVER
,
""
,
jid
,
jid
,
rayo_peer_server_cleanup
,
rayo_peer_server_send
);
switch_core_hash_init
(
&
rserver
->
clients
,
pool
);
rserver
=
RAYO_PEER_SERVER
(
RAYO_ACTOR_INIT
(
RAYO_ACTOR
(
rserver
),
pool
,
RAT_PEER_SERVER
,
""
,
jid
,
jid
,
rayo_peer_server_cleanup
,
rayo_peer_server_send
));
if
(
rserver
)
{
switch_core_hash_init
(
&
rserver
->
clients
,
pool
);
}
else
{
switch_core_destroy_memory_pool
(
&
pool
);
}
return
rserver
;
}
...
...
@@ -2289,14 +2322,61 @@ static void *SWITCH_THREAD_FUNC rayo_dial_thread(switch_thread_t *thread, void *
char
*
dial_to_dup
=
NULL
;
const
char
*
dial_from
=
iks_find_attrib
(
dial
,
"from"
);
const
char
*
dial_timeout_ms
=
iks_find_attrib
(
dial
,
"timeout"
);
const
char
*
requested_call_uri
=
iks_find_attrib
(
dial
,
"uri"
);
const
char
*
uuid
=
NULL
;
struct
dial_gateway
*
gateway
=
NULL
;
struct
rayo_call
*
call
=
NULL
;
switch_stream_handle_t
stream
=
{
0
};
SWITCH_STANDARD_STREAM
(
stream
);
/* Check if optional URI is valid. */
if
(
!
zstr
(
requested_call_uri
))
{
/* Split node and domain from URI */
char
*
requested_call_uri_dup
=
switch_core_strdup
(
dtdata
->
pool
,
requested_call_uri
);
char
*
requested_call_uri_domain
=
strchr
(
requested_call_uri_dup
,
'@'
);
if
(
requested_call_uri_domain
)
{
*
requested_call_uri_domain
=
'\0'
;
requested_call_uri_domain
++
;
}
/* is domain missing */
if
(
zstr
(
requested_call_uri_domain
))
{
response
=
iks_new_error_detailed
(
iq
,
STANZA_ERROR_BAD_REQUEST
,
"Bad uri"
);
goto
done
;
}
/* is domain correct? */
if
(
strcmp
(
requested_call_uri_domain
,
RAYO_JID
(
globals
.
server
)))
{
response
=
iks_new_error_detailed
(
iq
,
STANZA_ERROR_BAD_REQUEST
,
"Bad uri (invalid domain)"
);
goto
done
;
}
/* is node identifier missing? */
if
(
zstr
(
requested_call_uri_dup
))
{
response
=
iks_new_error_detailed
(
iq
,
STANZA_ERROR_BAD_REQUEST
,
"Bad uri (missing node)"
);
goto
done
;
}
/* strip optional xmpp: from node identifier */
if
(
!
strncasecmp
(
"xmpp:"
,
requested_call_uri_dup
,
5
))
{
requested_call_uri_dup
+=
5
;
if
(
zstr
(
requested_call_uri_dup
))
{
response
=
iks_new_error_detailed
(
iq
,
STANZA_ERROR_BAD_REQUEST
,
"Bad uri (missing node)"
);
goto
done
;
}
}
/* success! */
uuid
=
requested_call_uri_dup
;
}
/* create call and link to DCP */
call
=
rayo_call_create
(
NULL
);
call
=
rayo_call_create
(
uuid
);
if
(
!
call
)
{
response
=
iks_new_error
(
iq
,
STANZA_ERROR_CONFLICT
);
goto
done
;
}
call
->
dcp_jid
=
switch_core_strdup
(
RAYO_POOL
(
call
),
dcp_jid
);
call
->
dial_request_id
=
iks_find_attrib
(
iq
,
"id"
);
switch_log_printf
(
SWITCH_CHANNEL_UUID_LOG
(
rayo_call_get_uuid
(
call
)),
SWITCH_LOG_INFO
,
"%s has control of call
\n
"
,
dcp_jid
);
...
...
@@ -2309,7 +2389,7 @@ static void *SWITCH_THREAD_FUNC rayo_dial_thread(switch_thread_t *thread, void *
/* parse optional params from dialstring and append to */
if
(
*
dial_to
==
'{'
)
{
switch_event_t
*
params
=
NULL
;
dial_to_dup
=
s
trdup
(
dial_to
);
dial_to_dup
=
s
witch_core_strdup
(
dtdata
->
pool
,
dial_to
);
switch_event_create_brackets
(
dial_to_dup
,
'{'
,
'}'
,
','
,
&
params
,
(
char
**
)
&
dial_to
,
SWITCH_FALSE
);
if
(
params
)
{
switch_event_header_t
*
param
;
...
...
@@ -2468,7 +2548,7 @@ done:
/* response when error */
if
(
response
)
{
/* send response to client */
RAYO_SEND_REPLY
(
call
,
iks_find_attrib
(
response
,
"to"
),
response
);
RAYO_SEND_REPLY
(
globals
.
server
,
iks_find_attrib
(
response
,
"to"
),
response
);
/* destroy call */
if
(
call
)
{
...
...
@@ -2477,9 +2557,8 @@ done:
}
}
iks_delete
(
dial
);
iks_delete
(
iq
);
switch_safe_free
(
stream
.
data
);
switch_safe_free
(
dial_to_dup
);
{
switch_memory_pool_t
*
pool
=
dtdata
->
pool
;
...
...
@@ -2757,18 +2836,23 @@ static void on_mixer_delete_member_event(struct rayo_mixer *mixer, switch_event_
}
/* remove member from mixer */
switch_mutex_lock
(
RAYO_ACTOR
(
mixer
)
->
mutex
);
member
=
(
struct
rayo_mixer_member
*
)
switch_core_hash_find
(
mixer
->
members
,
uuid
);
if
(
!
member
)
{
/* not a member */
switch_mutex_unlock
(
RAYO_ACTOR
(
mixer
)
->
mutex
);
return
;
}
switch_core_hash_delete
(
mixer
->
members
,
uuid
);
switch_mutex_unlock
(
RAYO_ACTOR
(
mixer
)
->
mutex
);
/* flag call as available to join another mixer */
call
=
RAYO_CALL_LOCATE_BY_ID
(
uuid
);
if
(
call
)
{
switch_mutex_lock
(
RAYO_ACTOR
(
call
)
->
mutex
);
call
->
joined
=
0
;
call
->
joined_id
=
NULL
;
switch_mutex_unlock
(
RAYO_ACTOR
(
call
)
->
mutex
);
RAYO_UNLOCK
(
call
);
}
...
...
@@ -2786,6 +2870,7 @@ static void on_mixer_delete_member_event(struct rayo_mixer *mixer, switch_event_
iks_delete
(
delete_member_event
);
/* remove member DCP as subscriber to mixer */
switch_mutex_lock
(
RAYO_ACTOR
(
mixer
)
->
mutex
);
subscriber
=
(
struct
rayo_mixer_subscriber
*
)
switch_core_hash_find
(
mixer
->
subscribers
,
member
->
dcp_jid
);
if
(
subscriber
)
{
subscriber
->
ref_count
--
;
...
...
@@ -2793,6 +2878,7 @@ static void on_mixer_delete_member_event(struct rayo_mixer *mixer, switch_event_
switch_core_hash_delete
(
mixer
->
subscribers
,
member
->
dcp_jid
);
}
}
switch_mutex_unlock
(
RAYO_ACTOR
(
mixer
)
->
mutex
);
}
/**
...
...
@@ -2827,6 +2913,7 @@ static void on_mixer_add_member_event(struct rayo_mixer *mixer, switch_event_t *
iks
*
add_member_event
=
NULL
,
*
x
;
const
char
*
uuid
=
switch_event_get_header
(
event
,
"Unique-ID"
);
struct
rayo_call
*
call
=
RAYO_CALL_LOCATE_BY_ID
(
uuid
);
struct
rayo_mixer
*
lmixer
=
NULL
;
if
(
!
mixer
)
{
char
*
ver
;
...
...
@@ -2836,24 +2923,35 @@ static void on_mixer_add_member_event(struct rayo_mixer *mixer, switch_event_t *
const
char
*
mixer_name
=
switch_event_get_header
(
event
,
"Conference-Name"
);
switch_log_printf
(
SWITCH_CHANNEL_LOG
,
SWITCH_LOG_DEBUG
,
"creating mixer: %s
\n
"
,
mixer_name
);
mixer
=
rayo_mixer_create
(
mixer_name
);
/* notify online clients of mixer presence */
ver
=
calculate_entity_sha1_ver
(
&
rayo_mixer_identity
,
rayo_mixer_features
);
presence
=
iks_new_presence
(
"c"
,
IKS_NS_XMPP_ENTITY_CAPABILITIES
,
RAYO_JID
(
mixer
),
""
);
c
=
iks_find
(
presence
,
"c"
);
iks_insert_attrib
(
c
,
"hash"
,
"sha-1"
);
iks_insert_attrib
(
c
,
"node"
,
RAYO_MIXER_NS
);
iks_insert_attrib
(
c
,
"ver"
,
ver
);
free
(
ver
);
broadcast_event
(
RAYO_ACTOR
(
mixer
),
presence
,
1
);
if
(
mixer
)
{
/* notify online clients of mixer presence */
ver
=
calculate_entity_sha1_ver
(
&
rayo_mixer_identity
,
rayo_mixer_features
);
presence
=
iks_new_presence
(
"c"
,
IKS_NS_XMPP_ENTITY_CAPABILITIES
,
RAYO_JID
(
mixer
),
""
);
c
=
iks_find
(
presence
,
"c"
);
iks_insert_attrib
(
c
,
"hash"
,
"sha-1"
);
iks_insert_attrib
(
c
,
"node"
,
RAYO_MIXER_NS
);
iks_insert_attrib
(
c
,
"ver"
,
ver
);
free
(
ver
);
broadcast_event
(
RAYO_ACTOR
(
mixer
),
presence
,
1
);
}
else
{
/* must have lost the race to another add member event... there should be a mixer with mixer_name already */
mixer
=
lmixer
=
RAYO_MIXER_LOCATE
(
mixer_name
);
if
(
!
mixer
)
{
/* this is unexpected */
switch_log_printf
(
SWITCH_CHANNEL_LOG
,
SWITCH_LOG_CRIT
,
"failed to find mixer: %s
\n
"
,
mixer_name
);
return
;
}
}
}
if
(
call
)
{
struct
rayo_mixer_member
*
member
=
NULL
;
/* add member DCP as subscriber to mixer */
struct
rayo_mixer_subscriber
*
subscriber
=
(
struct
rayo_mixer_subscriber
*
)
switch_core_hash_find
(
mixer
->
subscribers
,
call
->
dcp_jid
);
struct
rayo_mixer_subscriber
*
subscriber
;
switch_mutex_lock
(
RAYO_ACTOR
(
mixer
)
->
mutex
);
subscriber
=
(
struct
rayo_mixer_subscriber
*
)
switch_core_hash_find
(
mixer
->
subscribers
,
call
->
dcp_jid
);
if
(
!
subscriber
)
{
subscriber
=
switch_core_alloc
(
RAYO_POOL
(
mixer
),
sizeof
(
*
subscriber
));
subscriber
->
ref_count
=
0
;
...
...
@@ -2868,6 +2966,9 @@ static void on_mixer_add_member_event(struct rayo_mixer *mixer, switch_event_t *
member
->
dcp_jid
=
subscriber
->
jid
;
switch_core_hash_insert
(
mixer
->
members
,
uuid
,
member
);
switch_mutex_unlock
(
RAYO_ACTOR
(
mixer
)
->
mutex
);
switch_mutex_lock
(
RAYO_ACTOR
(
call
)
->
mutex
);
call
->
joined
=
JOINED_MIXER
;
call
->
joined_id
=
switch_core_strdup
(
RAYO_POOL
(
call
),
rayo_mixer_get_name
(
mixer
));
...
...
@@ -2882,6 +2983,7 @@ static void on_mixer_add_member_event(struct rayo_mixer *mixer, switch_event_t *
RAYO_SEND_REPLY
(
call
,
iks_find_attrib_soft
(
request
,
"from"
),
result
);
iks_delete
(
request
);
}
switch_mutex_unlock
(
RAYO_ACTOR
(
call
)
->
mutex
);
/* send mixer joined event to member DCP */
add_member_event
=
iks_new_presence
(
"joined"
,
RAYO_NS
,
RAYO_JID
(
call
),
call
->
dcp_jid
);
...
...
@@ -2898,6 +3000,10 @@ static void on_mixer_add_member_event(struct rayo_mixer *mixer, switch_event_t *
iks_insert_attrib_printf
(
x
,
"call-uri"
,
"xmpp:%s@%s"
,
uuid
,
RAYO_JID
(
globals
.
server
));
broadcast_mixer_event
(
mixer
,
add_member_event
);
iks_delete
(
add_member_event
);
if
(
lmixer
)
{
RAYO_UNLOCK
(
lmixer
);
}
}
/**
...
...
@@ -3402,6 +3508,13 @@ SWITCH_STANDARD_APP(rayo_app)
iks
*
offer
=
NULL
;
call
=
rayo_call_create
(
switch_core_session_get_uuid
(
session
));
if
(
!
call
)
{
/* nothing that can be done to recover... */
switch_log_printf
(
SWITCH_CHANNEL_SESSION_LOG
(
session
),
SWITCH_LOG_CRIT
,
"Failed to create call entity!
\n
"
);
switch_channel_hangup
(
channel
,
SWITCH_CAUSE_NORMAL_TEMPORARY_FAILURE
);
return
;
}
switch_channel_set_variable
(
switch_core_session_get_channel
(
session
),
"rayo_call_jid"
,
RAYO_JID
(
call
));
offer
=
rayo_create_offer
(
call
,
session
);
...
...
@@ -3489,7 +3602,13 @@ static void on_xmpp_stream_ready(struct xmpp_stream *stream)
if
(
xmpp_stream_is_s2s
(
stream
))
{
if
(
xmpp_stream_is_incoming
(
stream
))
{
/* peer server belongs to a s2s inbound stream */
xmpp_stream_set_private
(
stream
,
rayo_peer_server_create
(
xmpp_stream_get_jid
(
stream
)));
struct
rayo_peer_server
*
peer
=
rayo_peer_server_create
(
xmpp_stream_get_jid
(
stream
));
if
(
peer
)
{
xmpp_stream_set_private
(
stream
,
peer
);
}
else
{
/* this went really bad... */
switch_log_printf
(
SWITCH_CHANNEL_LOG
,
SWITCH_LOG_CRIT
,
"failed to create peer server entity!
\n
"
);
}
}
else
{
/* send directed presence to domain */
iks
*
presence
=
iks_new
(
"presence"
);
...
...
@@ -3504,7 +3623,13 @@ static void on_xmpp_stream_ready(struct xmpp_stream *stream)
}
}
else
{
/* client belongs to stream */
xmpp_stream_set_private
(
stream
,
rayo_client_create
(
xmpp_stream_get_jid
(
stream
),
xmpp_stream_get_jid
(
stream
),
PS_OFFLINE
,
rayo_client_send
,
NULL
));
struct
rayo_client
*
client
=
rayo_client_create
(
xmpp_stream_get_jid
(
stream
),
xmpp_stream_get_jid
(
stream
),
PS_OFFLINE
,
rayo_client_send
,
NULL
);
if
(
client
)
{
xmpp_stream_set_private
(
stream
,
client
);
}
else
{
/* this went really bad... */
switch_log_printf
(
SWITCH_CHANNEL_LOG
,
SWITCH_LOG_CRIT
,
"failed to create client entity!
\n
"
);
}
}
}
...
...
@@ -4386,6 +4511,10 @@ SWITCH_MODULE_LOAD_FUNCTION(mod_rayo_load)
/* create admin client */
globals
.
console
=
rayo_console_client_create
();
if
(
!
globals
.
console
)
{
switch_log_printf
(
SWITCH_CHANNEL_LOG
,
SWITCH_LOG_CRIT
,
"Failed to create console client entity!
\n
"
);
return
SWITCH_STATUS_TERM
;
}
switch_console_set_complete
(
"add rayo status"
);
switch_console_set_complete
(
"add rayo msg ::rayo::list_all"
);
...
...
src/mod/event_handlers/mod_rayo/rayo_cpa_component.c
浏览文件 @
5138aede
...
...
@@ -285,7 +285,10 @@ iks *rayo_cpa_component_start(struct rayo_actor *call, struct rayo_message *msg,
/* create CPA component */
switch_core_new_memory_pool
(
&
pool
);
component
=
switch_core_alloc
(
pool
,
sizeof
(
*
component
));
rayo_component_init
((
struct
rayo_component
*
)
component
,
pool
,
RAT_CALL_COMPONENT
,
"cpa"
,
NULL
,
call
,
iks_find_attrib
(
iq
,
"from"
));
component
=
CPA_COMPONENT
(
rayo_component_init
((
struct
rayo_component
*
)
component
,
pool
,
RAT_CALL_COMPONENT
,
"cpa"
,
NULL
,
call
,
iks_find_attrib
(
iq
,
"from"
)));
if
(
!
component
)
{
return
iks_new_error_detailed
(
iq
,
STANZA_ERROR_INTERNAL_SERVER_ERROR
,
"Failed to create CPA entity"
);
}
switch_core_hash_init
(
&
component
->
signals
,
pool
);
...
...
src/mod/event_handlers/mod_rayo/rayo_fax_components.c
浏览文件 @
5138aede
/*
* mod_rayo for FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application
* Copyright (C) 2013, Grasshopper
* Copyright (C) 2013
-2014
, Grasshopper
*
* Version: MPL 1.1
*
...
...
@@ -177,7 +177,11 @@ static iks *start_sendfax_component(struct rayo_actor *call, struct rayo_message
/* create sendfax component */
switch_core_new_memory_pool
(
&
pool
);
sendfax_component
=
switch_core_alloc
(
pool
,
sizeof
(
*
sendfax_component
));
rayo_component_init
((
struct
rayo_component
*
)
sendfax_component
,
pool
,
RAT_CALL_COMPONENT
,
"sendfax"
,
NULL
,
call
,
iks_find_attrib
(
iq
,
"from"
));
sendfax_component
=
FAX_COMPONENT
(
rayo_component_init
((
struct
rayo_component
*
)
sendfax_component
,
pool
,
RAT_CALL_COMPONENT
,
"sendfax"
,
NULL
,
call
,
iks_find_attrib
(
iq
,
"from"
)));
if
(
!
sendfax_component
)
{
switch_core_destroy_memory_pool
(
&
pool
);
return
iks_new_error_detailed
(
iq
,
STANZA_ERROR_INTERNAL_SERVER_ERROR
,
"Failed to create sendfax entity"
);
}
/* add channel variable so that fax component can be located from fax events */
switch_channel_set_variable
(
channel
,
"rayo_fax_jid"
,
RAYO_JID
(
sendfax_component
));
...
...
@@ -265,7 +269,11 @@ static iks *start_receivefax_component(struct rayo_actor *call, struct rayo_mess
/* create receivefax component */
switch_core_new_memory_pool
(
&
pool
);
receivefax_component
=
switch_core_alloc
(
pool
,
sizeof
(
*
receivefax_component
));
rayo_component_init
((
struct
rayo_component
*
)
receivefax_component
,
pool
,
RAT_CALL_COMPONENT
,
"receivefax"
,
NULL
,
call
,
iks_find_attrib
(
iq
,
"from"
));
receivefax_component
=
RECEIVEFAX_COMPONENT
(
rayo_component_init
((
struct
rayo_component
*
)
receivefax_component
,
pool
,
RAT_CALL_COMPONENT
,
"receivefax"
,
NULL
,
call
,
iks_find_attrib
(
iq
,
"from"
)));
if
(
!
receivefax_component
)
{
switch_core_destroy_memory_pool
(
&
pool
);
return
iks_new_error_detailed
(
iq
,
STANZA_ERROR_INTERNAL_SERVER_ERROR
,
"Failed to create sendfax entity"
);
}
file_no
=
rayo_actor_seq_next
(
call
);
receivefax_component
->
filename
=
switch_core_sprintf
(
pool
,
"%s%s%s-%d.tif"
,
globals
.
file_prefix
,
SWITCH_PATH_SEPARATOR
,
switch_core_session_get_uuid
(
session
),
file_no
);
...
...
src/mod/event_handlers/mod_rayo/rayo_input_component.c
浏览文件 @
5138aede
...
...
@@ -662,7 +662,11 @@ static iks *start_call_input_component(struct rayo_actor *call, struct rayo_mess
switch_core_new_memory_pool
(
&
pool
);
input_component
=
switch_core_alloc
(
pool
,
sizeof
(
*
input_component
));
rayo_component_init
(
RAYO_COMPONENT
(
input_component
),
pool
,
RAT_CALL_COMPONENT
,
"input"
,
component_id
,
call
,
iks_find_attrib
(
iq
,
"from"
));
input_component
=
INPUT_COMPONENT
(
rayo_component_init
(
RAYO_COMPONENT
(
input_component
),
pool
,
RAT_CALL_COMPONENT
,
"input"
,
component_id
,
call
,
iks_find_attrib
(
iq
,
"from"
)));
if
(
!
input_component
)
{
switch_core_destroy_memory_pool
(
&
pool
);
return
iks_new_error_detailed
(
iq
,
STANZA_ERROR_INTERNAL_SERVER_ERROR
,
"Failed to create input entity"
);
}
return
start_call_input
(
input_component
,
session
,
input
,
iq
,
NULL
,
0
);
}
...
...
src/mod/event_handlers/mod_rayo/rayo_output_component.c
浏览文件 @
5138aede
...
...
@@ -68,7 +68,11 @@ static struct rayo_component *create_output_component(struct rayo_actor *actor,
switch_core_new_memory_pool
(
&
pool
);
output_component
=
switch_core_alloc
(
pool
,
sizeof
(
*
output_component
));
rayo_component_init
((
struct
rayo_component
*
)
output_component
,
pool
,
type
,
"output"
,
NULL
,
actor
,
client_jid
);
output_component
=
OUTPUT_COMPONENT
(
rayo_component_init
((
struct
rayo_component
*
)
output_component
,
pool
,
type
,
"output"
,
NULL
,
actor
,
client_jid
));
if
(
!
output_component
)
{
switch_core_destroy_memory_pool
(
&
pool
);
return
NULL
;
}
output_component
->
document
=
iks_copy
(
output
);
output_component
->
start_offset_ms
=
iks_find_int_attrib
(
output
,
"start-offset"
);
...
...
@@ -153,6 +157,9 @@ static iks *start_call_output_component(struct rayo_actor *call, struct rayo_mes
}
output_component
=
create_output_component
(
call
,
RAT_CALL_COMPONENT
,
output
,
iks_find_attrib
(
iq
,
"from"
));
if
(
!
output_component
)
{
return
iks_new_error_detailed
(
iq
,
STANZA_ERROR_INTERNAL_SERVER_ERROR
,
"Failed to create output entity"
);
}
return
start_call_output
(
output_component
,
session
,
output
,
iq
);
}
...
...
@@ -179,6 +186,9 @@ static iks *start_mixer_output_component(struct rayo_actor *mixer, struct rayo_m
}
component
=
create_output_component
(
mixer
,
RAT_MIXER_COMPONENT
,
output
,
iks_find_attrib
(
iq
,
"from"
));
if
(
!
component
)
{
return
iks_new_error_detailed
(
iq
,
STANZA_ERROR_INTERNAL_SERVER_ERROR
,
"Failed to create output entity"
);
}
/* build conference command */
SWITCH_STANDARD_STREAM
(
stream
);
...
...
src/mod/event_handlers/mod_rayo/rayo_prompt_component.c
浏览文件 @
5138aede
/*
* mod_rayo for FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application
* Copyright (C) 2013, Grasshopper
* Copyright (C) 2013
-2014
, Grasshopper
*
* Version: MPL 1.1
*
...
...
@@ -559,7 +559,11 @@ static iks *start_call_prompt_component(struct rayo_actor *call, struct rayo_mes
/* create prompt component, linked to call */
switch_core_new_memory_pool
(
&
pool
);
prompt_component
=
switch_core_alloc
(
pool
,
sizeof
(
*
prompt_component
));
rayo_component_init
(
RAYO_COMPONENT
(
prompt_component
),
pool
,
RAT_CALL_COMPONENT
,
"prompt"
,
NULL
,
call
,
iks_find_attrib
(
iq
,
"from"
));
prompt_component
=
PROMPT_COMPONENT
(
rayo_component_init
(
RAYO_COMPONENT
(
prompt_component
),
pool
,
RAT_CALL_COMPONENT
,
"prompt"
,
NULL
,
call
,
iks_find_attrib
(
iq
,
"from"
)));
if
(
!
prompt_component
)
{
switch_core_destroy_memory_pool
(
&
pool
);
return
iks_new_error_detailed
(
iq
,
STANZA_ERROR_INTERNAL_SERVER_ERROR
,
"Failed to create prompt entity"
);
}
prompt_component
->
iq
=
iks_copy
(
iq
);
/* start output */
...
...
src/mod/event_handlers/mod_rayo/rayo_record_component.c
浏览文件 @
5138aede
/*
* mod_rayo for FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application
* Copyright (C) 2013, Grasshopper
* Copyright (C) 2013
-2014
, Grasshopper
*
* Version: MPL 1.1
*
...
...
@@ -156,11 +156,6 @@ static struct rayo_component *record_component_create(struct rayo_actor *actor,
char
*
fs_file_path
;
switch_bool_t
start_paused
;
/* validate record attributes */
if
(
!
VALIDATE_RAYO_RECORD
(
record
))
{
return
NULL
;
}
start_paused
=
iks_find_bool_attrib
(
record
,
"start-paused"
);
/* create record filename from session UUID and ref */
...
...
@@ -175,7 +170,12 @@ static struct rayo_component *record_component_create(struct rayo_actor *actor,
switch_core_new_memory_pool
(
&
pool
);
record_component
=
switch_core_alloc
(
pool
,
sizeof
(
*
record_component
));
rayo_component_init
(
RAYO_COMPONENT
(
record_component
),
pool
,
type
,
"record"
,
fs_file_path
,
actor
,
client_jid
);
record_component
=
RECORD_COMPONENT
(
rayo_component_init
(
RAYO_COMPONENT
(
record_component
),
pool
,
type
,
"record"
,
fs_file_path
,
actor
,
client_jid
));
if
(
!
record_component
)
{
switch_core_destroy_memory_pool
(
&
pool
);
return
NULL
;
}
record_component
->
max_duration
=
iks_find_int_attrib
(
record
,
"max-duration"
);
record_component
->
initial_timeout
=
iks_find_int_attrib
(
record
,
"initial-timeout"
);
record_component
->
final_timeout
=
iks_find_int_attrib
(
record
,
"final-timeout"
);
...
...
@@ -270,9 +270,14 @@ static iks *start_call_record_component(struct rayo_actor *call, struct rayo_mes
struct
rayo_component
*
component
=
NULL
;
iks
*
record
=
iks_find
(
iq
,
"record"
);
/* validate record attributes */
if
(
!
VALIDATE_RAYO_RECORD
(
record
))
{
return
iks_new_error
(
iq
,
STANZA_ERROR_BAD_REQUEST
);
}
component
=
record_component_create
(
call
,
RAT_CALL_COMPONENT
,
iks_find_attrib
(
iq
,
"from"
),
record
);
if
(
!
component
)
{
return
iks_new_error
(
iq
,
STANZA_ERROR_BAD_REQUEST
);
return
iks_new_error
_detailed
(
iq
,
STANZA_ERROR_INTERNAL_SERVER_ERROR
,
"Failed to create record entity"
);
}
if
(
start_call_record
(
session
,
component
))
{
...
...
@@ -396,9 +401,14 @@ static iks *start_mixer_record_component(struct rayo_actor *mixer, struct rayo_m
struct
rayo_component
*
component
=
NULL
;
iks
*
record
=
iks_find
(
iq
,
"record"
);
/* validate record attributes */
if
(
!
VALIDATE_RAYO_RECORD
(
record
))
{
return
iks_new_error
(
iq
,
STANZA_ERROR_BAD_REQUEST
);
}
component
=
record_component_create
(
mixer
,
RAT_MIXER_COMPONENT
,
iks_find_attrib
(
iq
,
"from"
),
record
);
if
(
!
component
)
{
return
iks_new_error
(
iq
,
STANZA_ERROR_BAD_REQUEST
);
return
iks_new_error
_detailed
(
iq
,
STANZA_ERROR_INTERNAL_SERVER_ERROR
,
"Failed to create record entity"
);
}
/* mixer doesn't allow "send" */
...
...
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论