aboutsummaryrefslogtreecommitdiffstats
path: root/channels/chan_jingle.c
diff options
context:
space:
mode:
Diffstat (limited to 'channels/chan_jingle.c')
-rw-r--r--channels/chan_jingle.c39
1 files changed, 31 insertions, 8 deletions
diff --git a/channels/chan_jingle.c b/channels/chan_jingle.c
index 372ebe3a6..107db0801 100644
--- a/channels/chan_jingle.c
+++ b/channels/chan_jingle.c
@@ -248,15 +248,12 @@ static struct jingle *find_jingle(char *name, char *connection)
if (!jingle && strchr(name, '@'))
jingle = ASTOBJ_CONTAINER_FIND_FULL(&jingle_list, name, user,,, strcasecmp);
- if (!jingle) { /* guest call */
+ if (!jingle) {
+ /* guest call */
ASTOBJ_CONTAINER_TRAVERSE(&jingle_list, 1, {
ASTOBJ_RDLOCK(iterator);
if (!strcasecmp(iterator->name, "guest")) {
- if (!strcasecmp(iterator->connection->jid->partial, connection)) {
- jingle = iterator;
- } else if (!strcasecmp(iterator->connection->name, connection)) {
- jingle = iterator;
- }
+ jingle = iterator;
}
ASTOBJ_UNLOCK(iterator);
@@ -959,8 +956,13 @@ static int jingle_newcall(struct jingle *client, ikspak *pak)
struct ast_channel *chan;
int res;
iks *codec, *content, *description;
+ char *from = NULL;
/* Make sure our new call doesn't exist yet */
+ from = iks_find_attrib(pak->x,"to");
+ if(!from)
+ from = client->connection->jid->full;
+
while (tmp) {
if (iks_find_with_attrib(pak->x, JINGLE_NODE, JINGLE_SID, tmp->sid)) {
ast_log(LOG_NOTICE, "Ignoring duplicate call setup on SID %s\n", tmp->sid);
@@ -970,6 +972,16 @@ static int jingle_newcall(struct jingle *client, ikspak *pak)
tmp = tmp->next;
}
+ if (!strcasecmp(client->name, "guest")){
+ /* the guest account is not tied to any configured XMPP client,
+ let's set it now */
+ client->connection = ast_aji_get_client(from);
+ if (!client->connection) {
+ ast_log(LOG_ERROR, "No XMPP client to talk to, us (partial JID) : %s\n", from);
+ return -1;
+ }
+ }
+
p = jingle_alloc(client, pak->from->partial, iks_find_attrib(pak->query, JINGLE_SID));
if (!p) {
ast_log(LOG_WARNING, "Unable to allocate jingle structure!\n");
@@ -1471,11 +1483,22 @@ static struct ast_channel *jingle_request(const char *type, int format, void *da
}
}
}
+
client = find_jingle(to, sender);
if (!client) {
ast_log(LOG_WARNING, "Could not find recipient.\n");
return NULL;
}
+ if (!strcasecmp(client->name, "guest")){
+ /* the guest account is not tied to any configured XMPP client,
+ let's set it now */
+ client->connection = ast_aji_get_client(sender);
+ if (!client->connection) {
+ ast_log(LOG_ERROR, "No XMPP client to talk to, us (partial JID) : %s\n", sender);
+ return NULL;
+ }
+ }
+
ASTOBJ_WRLOCK(client);
p = jingle_alloc(client, to, NULL);
if (p)
@@ -1797,13 +1820,13 @@ static int jingle_load_config(void)
ASTOBJ_CONTAINER_TRAVERSE(clients, 1, {
ASTOBJ_WRLOCK(iterator);
ASTOBJ_WRLOCK(member);
- member->connection = iterator;
+ member->connection = NULL;
iks_filter_add_rule(iterator->f, jingle_parser, member, IKS_RULE_TYPE, IKS_PAK_IQ, IKS_RULE_NS, JINGLE_NS, IKS_RULE_DONE);
iks_filter_add_rule(iterator->f, jingle_parser, member, IKS_RULE_TYPE, IKS_PAK_IQ, IKS_RULE_NS, JINGLE_DTMF_NS, IKS_RULE_DONE);
ASTOBJ_UNLOCK(member);
- ASTOBJ_CONTAINER_LINK(&jingle_list, member);
ASTOBJ_UNLOCK(iterator);
});
+ ASTOBJ_CONTAINER_LINK(&jingle_list, member);
} else {
ASTOBJ_UNLOCK(member);
ASTOBJ_UNREF(member, jingle_member_destroy);