summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CHANGES8
-rw-r--r--res/res_xmpp.c17
2 files changed, 25 insertions, 0 deletions
diff --git a/CHANGES b/CHANGES
index 6f594aa88..6b1a94a8f 100644
--- a/CHANGES
+++ b/CHANGES
@@ -117,6 +117,14 @@ RTP
them, an Asterisk-specific version of pjproject needs to be installed.
Tarballs are available from https://github.com/asterisk/pjproject/tags/.
+XMPP
+------------------
+ * Device state for XMPP buddies is now available using the following format:
+ XMPP/<client name>/<buddy address>
+ If any resource is available the device state is considered to be not in use.
+ If no resources exist or all are unavailable the device state is considered
+ to be unavailable.
+
------------------------------------------------------------------------------
--- Functionality changes from Asterisk 10 to Asterisk 11 --------------------
------------------------------------------------------------------------------
diff --git a/res/res_xmpp.c b/res/res_xmpp.c
index 5939d30d4..f2f200c9a 100644
--- a/res/res_xmpp.c
+++ b/res/res_xmpp.c
@@ -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;
}