+static int action_presencestatelist(struct mansession *s, const struct message *m)
+{
+ RAII_VAR(struct ao2_container *, presence_states, NULL, ao2_cleanup);
+ const char *action_id = astman_get_header(m, "ActionID");
+ struct stasis_message *msg;
+ struct ao2_iterator it_states;
+ int count = 0;
+
+ presence_states = stasis_cache_dump(ast_presence_state_cache(),
+ ast_presence_state_message_type());
+ if (!presence_states) {
+ astman_send_error(s, m, "Memory Allocation Failure");
+ return 0;
+ }
+
+ astman_send_listack(s, m, "Presence State Changes will follow", "start");
+
+ it_states = ao2_iterator_init(presence_states, 0);
+ for (; (msg = ao2_iterator_next(&it_states)); ao2_ref(msg, -1)) {
+ struct ast_manager_event_blob *blob = stasis_message_to_ami(msg);
+
+ if (!blob) {
+ continue;
+ }
+
+ count++;
+
+ astman_append(s, "Event: %s\r\n", blob->manager_event);
+ if (!ast_strlen_zero(action_id)) {
+ astman_append(s, "ActionID: %s\r\n", action_id);
+ }
+ astman_append(s, "%s\r\n", blob->extra_fields);
+ ao2_ref(blob, -1);
+ }
+ ao2_iterator_destroy(&it_states);
+
+ astman_append(s, "Event: PresenceStateListComplete\r\n");
+ if (!ast_strlen_zero(action_id)) {
+ astman_append(s, "ActionID: %s\r\n", action_id);
+ }
+ astman_append(s, "EventList: Complete\r\n"
+ "ListItems: %d\r\n\r\n", count);
+
+ return 0;
+}
+