aboutsummaryrefslogtreecommitdiffstats
path: root/res/res_jabber.c
diff options
context:
space:
mode:
authormogorman <mogorman@f38db490-d61c-443f-a65b-d21fe96a405b>2006-07-05 20:28:54 +0000
committermogorman <mogorman@f38db490-d61c-443f-a65b-d21fe96a405b>2006-07-05 20:28:54 +0000
commit253a1ec7d41f6107c8bca2d94db47e4b08c33c05 (patch)
treef233d459491f0bebc6b30400c2940630a0c88ced /res/res_jabber.c
parent2b2913cd7a8dd72045eef8ae6e311a8b9e3bc1eb (diff)
solves issue with bug 7468. but with a patch that works
git-svn-id: http://svn.digium.com/svn/asterisk/trunk@37087 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'res/res_jabber.c')
-rw-r--r--res/res_jabber.c53
1 files changed, 20 insertions, 33 deletions
diff --git a/res/res_jabber.c b/res/res_jabber.c
index b79eb1fe0..52018891f 100644
--- a/res/res_jabber.c
+++ b/res/res_jabber.c
@@ -251,7 +251,7 @@ static struct aji_version *aji_find_version(char *node, char *version, ikspak *p
static struct aji_resource *aji_find_resource(struct aji_buddy *buddy, char *rname)
{
struct aji_resource *res = NULL;
- if (!buddy)
+ if (!buddy || !rname)
return res;
res = buddy->resources;
while (res) {
@@ -317,17 +317,18 @@ static iks *jabber_make_auth(iksid * id, const char *pass, const char *sid)
static int aji_status_exec(struct ast_channel *chan, void *data)
{
struct aji_client *client = NULL;
+ struct aji_buddy *buddy = NULL;
struct aji_resource *r = NULL;
- char *s = NULL, *sender = NULL, *screenname = NULL, *resource = NULL, *variable = NULL;
- int stat = 7, found = 0;
+ char *s = NULL, *sender = NULL, *jid = NULL, *screenname = NULL, *resource = NULL, *variable = NULL;
+ int stat = 7;
char status[2];
if (data) {
s = ast_strdupa((char *) data);
if (s) {
sender = strsep(&s, "|");
if (sender && (sender[0] != '\0')) {
- screenname = strsep(&s, "|");
- if (screenname && (screenname[0] != '\0')) {
+ jid = strsep(&s, "|");
+ if (jid && (jid[0] != '\0')) {
variable = s;
} else {
ast_log(LOG_ERROR, "Bad arguments\n");
@@ -340,48 +341,34 @@ static int aji_status_exec(struct ast_channel *chan, void *data)
return -1;
}
- if(!strchr(screenname, '/')) {
+ if(!strchr(jid, '/')) {
resource = NULL;
} else {
- resource = strsep(&screenname, "/");
+ screenname = strsep(&jid, "/");
+ resource = jid;
}
-
client = ast_aji_get_client(sender);
if (!client) {
ast_log(LOG_WARNING, "Could not find Connection.\n");
return -1;
}
-
if(!&client->buddies) {
ast_log(LOG_WARNING, "No buddies for connection.\n");
return -1;
}
- ASTOBJ_CONTAINER_TRAVERSE(&client->buddies, 1, {
- ASTOBJ_RDLOCK(iterator);
- if (!strcasecmp(iterator->user, screenname)) {
- found = 1;
- r = iterator->resources;
- if (r) { /* client has signed on */
- if (resource) {
- while (r) {
- if (!strcasecmp(r->resource, resource)) {
- stat = r->status;
- }
- r = r->next;
- }
- if (stat == 7) ast_log(LOG_NOTICE, "Resource not found %s\n", resource);
- } else {
- stat = r->status;
- }
- }
- }
- ASTOBJ_UNLOCK(iterator);
- });
-
- if (!found) { /* just a label */
+ buddy = ASTOBJ_CONTAINER_FIND(&client->buddies, (resource)?screenname:jid);
+ if (!buddy) {
ast_log(LOG_WARNING, "Could not find Buddy in list.\n");
return -1;
}
+ r = aji_find_resource(buddy, resource);
+ if(!r && buddy->resources) {
+ r = buddy->resources;
+ }
+ if(!r){
+ ast_log(LOG_NOTICE, "Resource %s of buddy %s not found \n", resource, screenname);
+ }
+ stat = r->status;
sprintf(status, "%d", stat);
pbx_builtin_setvar_helper(chan, variable, status);
return 0;
@@ -1074,7 +1061,7 @@ static void aji_handle_presence(struct aji_client *client, ikspak *pak)
}
buddy = ASTOBJ_CONTAINER_FIND(&client->buddies, pak->from->partial);
if (!buddy) {
- ast_log(LOG_WARNING, "Got presence packet from %s, someone not in our roster!!!!\n", pak->from->partial);
+ ast_log(LOG_NOTICE, "Got presence packet from %s, someone not in our roster!!!!\n", pak->from->partial);
return;
}
ASTOBJ_WRLOCK(buddy);