mirror of
https://github.com/asterisk/asterisk.git
synced 2025-10-13 08:13:22 +00:00
Closes issue #10509
Googletalk calls are answered too early, which results in CDRs wrongly stating that a call was ANSWERED when the calling party cancelled a call before before being established. We must not answer the call upon reception of a 'transport-accept' iq packet, but this packet still needs to be acknowledged, otherwise the remote peer would close the call (like in #8970). git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/1.4@80661 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
@@ -623,6 +623,30 @@ static int gtalk_is_answered(struct gtalk *client, ikspak *pak)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int gtalk_is_accepted(struct gtalk *client, ikspak *pak)
|
||||||
|
{
|
||||||
|
struct gtalk_pvt *tmp;
|
||||||
|
char *from;
|
||||||
|
|
||||||
|
ast_log(LOG_DEBUG, "The client is %s\n", client->name);
|
||||||
|
/* find corresponding call */
|
||||||
|
for (tmp = client->p; tmp; tmp = tmp->next) {
|
||||||
|
if (iks_find_with_attrib(pak->x, "session", "id", tmp->sid))
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
from = iks_find_attrib(pak->x, "to");
|
||||||
|
if(!from)
|
||||||
|
from = client->connection->jid->full;
|
||||||
|
|
||||||
|
if (!tmp)
|
||||||
|
ast_log(LOG_NOTICE, "Whoa, didn't find call!\n");
|
||||||
|
|
||||||
|
/* answer 'iq' packet to let the remote peer know that we're alive */
|
||||||
|
gtalk_response(client, from, pak, NULL, NULL);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
static int gtalk_handle_dtmf(struct gtalk *client, ikspak *pak)
|
static int gtalk_handle_dtmf(struct gtalk *client, ikspak *pak)
|
||||||
{
|
{
|
||||||
struct gtalk_pvt *tmp;
|
struct gtalk_pvt *tmp;
|
||||||
@@ -1568,8 +1592,10 @@ static int gtalk_parser(void *data, ikspak *pak)
|
|||||||
gtalk_add_candidate(client, pak);
|
gtalk_add_candidate(client, pak);
|
||||||
if (option_debug > 2)
|
if (option_debug > 2)
|
||||||
ast_log(LOG_DEBUG, "Candidate Added!\n");
|
ast_log(LOG_DEBUG, "Candidate Added!\n");
|
||||||
} else if (iks_find_with_attrib(pak->x, "session", "type", "accept") || iks_find_with_attrib(pak->x, "session", "type", "transport-accept")) {
|
} else if (iks_find_with_attrib(pak->x, "session", "type", "accept")) {
|
||||||
gtalk_is_answered(client, pak);
|
gtalk_is_answered(client, pak);
|
||||||
|
} else if (iks_find_with_attrib(pak->x, "session", "type", "transport-accept")) {
|
||||||
|
gtalk_is_accepted(client, pak);
|
||||||
} else if (iks_find_with_attrib(pak->x, "session", "type", "content-info")) {
|
} else if (iks_find_with_attrib(pak->x, "session", "type", "content-info")) {
|
||||||
gtalk_handle_dtmf(client, pak);
|
gtalk_handle_dtmf(client, pak);
|
||||||
} else if (iks_find_with_attrib(pak->x, "session", "type", "terminate")) {
|
} else if (iks_find_with_attrib(pak->x, "session", "type", "terminate")) {
|
||||||
|
Reference in New Issue
Block a user