mirror of
https://github.com/asterisk/asterisk.git
synced 2025-10-12 15:45:18 +00:00
Add support for using XMPP buddy state via device state.
This change allows you to use XMPP buddy state in places where device state can be used be used, such as dialplan hints. If at least one resource is available the buddy is considered available. Now your phone can reflect their IM status too! git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@383283 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
@@ -3244,6 +3244,14 @@ static int xmpp_client_send_disco_info_request(struct ast_xmpp_client *client, c
|
||||
return res;
|
||||
}
|
||||
|
||||
/*! \brief Callback function which returns when the resource is available */
|
||||
static int xmpp_resource_is_available(void *obj, void *arg, int flags)
|
||||
{
|
||||
struct ast_xmpp_resource *resource = obj;
|
||||
|
||||
return (resource->status == IKS_SHOW_AVAILABLE) ? CMP_MATCH | CMP_STOP : 0;
|
||||
}
|
||||
|
||||
/*! \brief Internal function called when a presence message is received */
|
||||
static int xmpp_pak_presence(struct ast_xmpp_client *client, struct ast_xmpp_client_config *cfg, iks *node, ikspak *pak)
|
||||
{
|
||||
@@ -3251,6 +3259,7 @@ static int xmpp_pak_presence(struct ast_xmpp_client *client, struct ast_xmpp_cli
|
||||
struct ast_xmpp_resource *resource;
|
||||
char *type = iks_find_attrib(pak->x, "type");
|
||||
int status = pak->show ? pak->show : STATUS_DISAPPEAR;
|
||||
enum ast_device_state state = AST_DEVICE_UNAVAILABLE;
|
||||
|
||||
/* If no resource is available this is a general buddy presence update, which we will ignore */
|
||||
if (!pak->from->resource) {
|
||||
@@ -3357,10 +3366,18 @@ static int xmpp_pak_presence(struct ast_xmpp_client *client, struct ast_xmpp_cli
|
||||
client->name, pak->from->partial, pak->show ? pak->show : IKS_SHOW_UNAVAILABLE);
|
||||
}
|
||||
|
||||
/* Determine if at least one resource is available for device state purposes */
|
||||
if ((resource = ao2_callback(buddy->resources, OBJ_NOLOCK, xmpp_resource_is_available, NULL))) {
|
||||
state = AST_DEVICE_NOT_INUSE;
|
||||
ao2_ref(resource, -1);
|
||||
}
|
||||
|
||||
ao2_unlock(buddy->resources);
|
||||
|
||||
ao2_ref(buddy, -1);
|
||||
|
||||
ast_devstate_changed(state, AST_DEVSTATE_CACHABLE, "XMPP/%s/%s", client->name, pak->from->partial);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user