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;
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");
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);
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;
}