Index: main/devicestate.c =================================================================== --- main/devicestate.c (revision 385594) +++ main/devicestate.c (working copy) @@ -705,7 +705,7 @@ static void devstate_change_collector_cb(const struct ast_event *event, void *data) { struct devstate_change *sc; - const char *device; + const char *device, *cachable_str; const struct ast_eid *eid; uint32_t state; enum ast_devstate_cache cachable = AST_DEVSTATE_CACHABLE; @@ -713,7 +713,6 @@ device = ast_event_get_ie_str(event, AST_EVENT_IE_DEVICE); eid = ast_event_get_ie_raw(event, AST_EVENT_IE_EID); state = ast_event_get_ie_uint(event, AST_EVENT_IE_STATE); - cachable = ast_event_get_ie_uint(event, AST_EVENT_IE_CACHABLE); if (ast_strlen_zero(device) || !eid) { ast_log(LOG_ERROR, "Invalid device state change event received\n"); @@ -726,6 +725,16 @@ strcpy(sc->device, device); sc->eid = *eid; sc->state = state; + + /* For 'cachable' we cannot use ast_event_get_ie_uint(), it overwrites the default of AST_DEVSTATE_CACHABLE we + * have already setup for 'cachable', if for whatever reason the AST_EVENT_IE_CACHABLE wasn't + * posted in the event ast_event_get_ie_uint() is going will return 0, + * which equates to AST_DEVSTATE_NOT_CACHABLE the first enumeration in 'ast_devstate_cache'. + */ + + if ((cachable_str = ast_event_get_ie_str(event, AST_EVENT_IE_CACHABLE))) { + sscanf(cachable_str, "%30u", &cachable); + } sc->cachable = cachable; ast_mutex_lock(&devstate_collector.lock); Index: res/res_jabber.c =================================================================== --- res/res_jabber.c (revision 385594) +++ res/res_jabber.c (working copy) @@ -3339,14 +3339,15 @@ return IKS_FILTER_EAT; } if (!strcasecmp(iks_name(item_content), "state")) { - device_state = iks_find_cdata(item, "state"); - if ((cachable_str = iks_find_cdata(item, "cachable"))) { + if ((cachable_str = iks_find_attrib(item_content, "cachable"))) { sscanf(cachable_str, "%30d", &cachable); } + device_state = iks_find_cdata(item, "state"); if (!(event = ast_event_new(AST_EVENT_DEVICE_STATE_CHANGE, AST_EVENT_IE_DEVICE, AST_EVENT_IE_PLTYPE_STR, item_id, AST_EVENT_IE_STATE, AST_EVENT_IE_PLTYPE_UINT, ast_devstate_val(device_state), AST_EVENT_IE_EID, AST_EVENT_IE_PLTYPE_RAW, &pubsub_eid, sizeof(pubsub_eid), + AST_EVENT_IE_CACHABLE, AST_EVENT_IE_PLTYPE_UINT, cachable, AST_EVENT_IE_END))) { return IKS_FILTER_EAT; } Index: res/res_xmpp.c =================================================================== --- res/res_xmpp.c (revision 385594) +++ res/res_xmpp.c (working copy) @@ -1328,14 +1328,15 @@ return IKS_FILTER_EAT; } if (!strcasecmp(iks_name(item_content), "state")) { - device_state = iks_find_cdata(item, "state"); - if ((cachable_str = iks_find_cdata(item, "cachable"))) { + if ((cachable_str = iks_find_attrib(item_content, "cachable"))) { sscanf(cachable_str, "%30d", &cachable); } + device_state = iks_find_cdata(item, "state"); if (!(event = ast_event_new(AST_EVENT_DEVICE_STATE_CHANGE, AST_EVENT_IE_DEVICE, AST_EVENT_IE_PLTYPE_STR, item_id, AST_EVENT_IE_STATE, AST_EVENT_IE_PLTYPE_UINT, ast_devstate_val(device_state), AST_EVENT_IE_EID, AST_EVENT_IE_PLTYPE_RAW, &pubsub_eid, sizeof(pubsub_eid), + AST_EVENT_IE_CACHABLE, AST_EVENT_IE_PLTYPE_UINT, cachable, AST_EVENT_IE_END))) { return IKS_FILTER_EAT; }