summaryrefslogtreecommitdiff
path: root/apps/app_queue.c
diff options
context:
space:
mode:
Diffstat (limited to 'apps/app_queue.c')
-rw-r--r--apps/app_queue.c82
1 files changed, 29 insertions, 53 deletions
diff --git a/apps/app_queue.c b/apps/app_queue.c
index fd692a4b2..9de87892c 100644
--- a/apps/app_queue.c
+++ b/apps/app_queue.c
@@ -990,9 +990,6 @@ static const struct autopause {
{ QUEUE_AUTOPAUSE_ALL,"all" },
};
-
-static struct ast_taskprocessor *devicestate_tps;
-
#define DEFAULT_RETRY 5
#define DEFAULT_TIMEOUT 15
#define RECHECK 1 /*!< Recheck every second to see we we're at the top yet */
@@ -1037,8 +1034,8 @@ static int montype_default = 0;
/*! \brief queues.conf [general] option */
static int shared_lastcall = 1;
-/*! \brief Subscription to device state change events */
-static struct ast_event_sub *device_state_sub;
+/*! \brief Subscription to device state change messages */
+static struct stasis_subscription *device_state_sub;
/*! \brief queues.conf [general] option */
static int update_cdr = 0;
@@ -1618,12 +1615,6 @@ static int get_member_status(struct call_queue *q, int max_penalty, int min_pena
return -1;
}
-struct statechange {
- AST_LIST_ENTRY(statechange) entry;
- int state;
- char dev[0];
-};
-
/*! \brief set a member's status based on device state of that member's state_interface.
*
* Lock interface list find sc, iterate through each queues queue_member list for member to
@@ -1742,10 +1733,10 @@ static int is_member_available(struct member *mem)
}
/*! \brief set a member's status based on device state of that member's interface*/
-static int handle_statechange(void *datap)
+static void device_state_cb(void *unused, struct stasis_subscription *sub, struct stasis_topic *topic, struct stasis_message *msg)
{
- struct statechange *sc = datap;
struct ao2_iterator miter, qiter;
+ struct ast_device_state_message *dev_state;
struct member *m;
struct call_queue *q;
char interface[80], *slash_pos;
@@ -1753,6 +1744,16 @@ static int handle_statechange(void *datap)
int found_member; /* Found this member in this queue */
int avail = 0; /* Found an available member in this queue */
+ if (ast_device_state_message_type() != stasis_message_type(msg)) {
+ return;
+ }
+
+ dev_state = stasis_message_data(msg);
+ if (dev_state->eid) {
+ /* ignore non-aggregate states */
+ return;
+ }
+
qiter = ao2_iterator_init(queues, 0);
while ((q = ao2_t_iterator_next(&qiter, "Iterate over queues"))) {
ao2_lock(q);
@@ -1770,9 +1771,9 @@ static int handle_statechange(void *datap)
}
}
- if (!strcasecmp(interface, sc->dev)) {
+ if (!strcasecmp(interface, dev_state->device)) {
found_member = 1;
- update_status(q, m, sc->state);
+ update_status(q, m, dev_state->state);
}
}
@@ -1804,39 +1805,18 @@ static int handle_statechange(void *datap)
ao2_iterator_destroy(&qiter);
if (found) {
- ast_debug(1, "Device '%s' changed to state '%d' (%s)\n", sc->dev, sc->state, ast_devstate2str(sc->state));
+ ast_debug(1, "Device '%s' changed to state '%d' (%s)\n",
+ dev_state->device,
+ dev_state->state,
+ ast_devstate2str(dev_state->state));
} else {
- ast_debug(3, "Device '%s' changed to state '%d' (%s) but we don't care because they're not a member of any queue.\n", sc->dev, sc->state, ast_devstate2str(sc->state));
+ ast_debug(3, "Device '%s' changed to state '%d' (%s) but we don't care because they're not a member of any queue.\n",
+ dev_state->device,
+ dev_state->state,
+ ast_devstate2str(dev_state->state));
}
- ast_free(sc);
- return 0;
-}
-
-static void device_state_cb(const struct ast_event *event, void *unused)
-{
- enum ast_device_state state;
- const char *device;
- struct statechange *sc;
- size_t datapsize;
-
- state = ast_event_get_ie_uint(event, AST_EVENT_IE_STATE);
- device = ast_event_get_ie_str(event, AST_EVENT_IE_DEVICE);
-
- if (ast_strlen_zero(device)) {
- ast_log(LOG_ERROR, "Received invalid event that had no device IE\n");
- return;
- }
- datapsize = sizeof(*sc) + strlen(device) + 1;
- if (!(sc = ast_calloc(1, datapsize))) {
- ast_log(LOG_ERROR, "failed to calloc a state change struct\n");
- return;
- }
- sc->state = state;
- strcpy(sc->dev, device);
- if (ast_taskprocessor_push(devicestate_tps, handle_statechange, sc) < 0) {
- ast_free(sc);
- }
+ return;
}
/*! \brief Helper function which converts from extension state to device state values */
@@ -9876,8 +9856,9 @@ static int unload_module(void)
res |= ast_data_unregister(NULL);
- if (device_state_sub)
- ast_event_unsubscribe(device_state_sub);
+ if (device_state_sub) {
+ device_state_sub = stasis_unsubscribe(device_state_sub);
+ }
ast_extension_state_del(0, extension_state_cb);
@@ -9887,7 +9868,6 @@ static int unload_module(void)
queue_t_unref(q, "Done with iterator");
}
ao2_iterator_destroy(&q_iter);
- devicestate_tps = ast_taskprocessor_unreference(devicestate_tps);
ao2_ref(queues, -1);
ast_unload_realtime("queue_members");
return res;
@@ -9948,12 +9928,8 @@ static int load_module(void)
res |= ast_custom_function_register(&queuewaitingcount_function);
res |= ast_custom_function_register(&queuememberpenalty_function);
- if (!(devicestate_tps = ast_taskprocessor_get("app_queue", 0))) {
- ast_log(LOG_WARNING, "devicestate taskprocessor reference failed - devicestate notifications will not occur\n");
- }
-
/* in the following subscribe call, do I use DEVICE_STATE, or DEVICE_STATE_CHANGE? */
- if (!(device_state_sub = ast_event_subscribe(AST_EVENT_DEVICE_STATE, device_state_cb, "AppQueue Device state", NULL, AST_EVENT_IE_END))) {
+ if (!(device_state_sub = stasis_subscribe(ast_device_state_topic_all(), device_state_cb, NULL))) {
res = -1;
}