diff options
-rw-r--r-- | channels/chan_jingle.c | 78 |
1 files changed, 40 insertions, 38 deletions
diff --git a/channels/chan_jingle.c b/channels/chan_jingle.c index 610bda6e8..8709bda7d 100644 --- a/channels/chan_jingle.c +++ b/channels/chan_jingle.c @@ -955,7 +955,7 @@ static int jingle_newcall(struct jingle *client, ikspak *pak) struct jingle_pvt *p, *tmp = client->p; struct ast_channel *chan; int res; - iks *payload_type; + iks *codec; /* Make sure our new call doesn't exist yet */ while (tmp) { @@ -973,45 +973,47 @@ static int jingle_newcall(struct jingle *client, ikspak *pak) return -1; } chan = jingle_new(client, p, AST_STATE_DOWN, pak->from->user); - if (chan) { - ast_mutex_lock(&p->lock); - ast_copy_string(p->them, pak->from->full, sizeof(p->them)); - if (iks_find_attrib(pak->query, JINGLE_SID)) { - ast_copy_string(p->sid, iks_find_attrib(pak->query, JINGLE_SID), - sizeof(p->sid)); - } - - payload_type = iks_child(iks_child(iks_child(iks_child(pak->x)))); - while (payload_type) { - ast_rtp_set_m_type(p->rtp, atoi(iks_find_attrib(payload_type, "id"))); - ast_rtp_set_rtpmap_type(p->rtp, atoi(iks_find_attrib(payload_type, "id")), "audio", iks_find_attrib(payload_type, "name"), 0); - payload_type = iks_next(payload_type); - } - - ast_mutex_unlock(&p->lock); - ast_setstate(chan, AST_STATE_RING); - res = ast_pbx_start(chan); - - switch (res) { - case AST_PBX_FAILED: - ast_log(LOG_WARNING, "Failed to start PBX :(\n"); - jingle_response(client, pak, "service-unavailable", NULL); - break; - case AST_PBX_CALL_LIMIT: - ast_log(LOG_WARNING, "Failed to start PBX (call limit reached) \n"); - jingle_response(client, pak, "service-unavailable", NULL); - break; - case AST_PBX_SUCCESS: - jingle_response(client, pak, NULL, NULL); - jingle_create_candidates(client, p, - iks_find_attrib(pak->query, JINGLE_SID), - iks_find_attrib(pak->x, "from")); - /* nothing to do */ - break; - } - } else { + if (!chan) { jingle_free_pvt(client, p); + return -1; } + ast_mutex_lock(&p->lock); + ast_copy_string(p->them, pak->from->full, sizeof(p->them)); + if (iks_find_attrib(pak->query, JINGLE_SID)) { + ast_copy_string(p->sid, iks_find_attrib(pak->query, JINGLE_SID), + sizeof(p->sid)); + } + + /* codec points to the first <payload-type/> tag */ + codec = iks_child(iks_child(iks_child(iks_child(pak->x)))); + while (codec) { + ast_rtp_set_m_type(p->rtp, atoi(iks_find_attrib(codec, "id"))); + ast_rtp_set_rtpmap_type(p->rtp, atoi(iks_find_attrib(codec, "id")), "audio", iks_find_attrib(codec, "name"), 0); + codec = iks_next(codec); + } + + ast_mutex_unlock(&p->lock); + ast_setstate(chan, AST_STATE_RING); + res = ast_pbx_start(chan); + + switch (res) { + case AST_PBX_FAILED: + ast_log(LOG_WARNING, "Failed to start PBX :(\n"); + jingle_response(client, pak, "service-unavailable", NULL); + break; + case AST_PBX_CALL_LIMIT: + ast_log(LOG_WARNING, "Failed to start PBX (call limit reached) \n"); + jingle_response(client, pak, "service-unavailable", NULL); + break; + case AST_PBX_SUCCESS: + jingle_response(client, pak, NULL, NULL); + jingle_create_candidates(client, p, + iks_find_attrib(pak->query, JINGLE_SID), + iks_find_attrib(pak->x, "from")); + /* nothing to do */ + break; + } + return 1; } |