void connman_agent_cancel(void *user_context) { GList *item, *next; struct connman_agent *queued_req; int err; DBG("context %p", user_context); item = agent_queue; while (item != NULL) { next = g_list_next(item); queued_req = item->data; if (queued_req->user_context == user_context || user_context == NULL) { agent_data_free(queued_req); agent_queue = g_list_delete_link(agent_queue, item); } item = next; } if (agent_request == NULL) return; if (agent_request->user_context != user_context && user_context != NULL) return; agent_send_cancel(agent_request); agent_data_free(agent_request); agent_request = NULL; err = agent_send_next_request(); if (err < 0) DBG("send next request failed (%s/%d)", strerror(-err), -err); }
int connman_agent_queue_message(void *user_context, DBusMessage *msg, int timeout, agent_queue_cb callback, void *user_data, void *agent_data) { struct connman_agent_request *queue_data; struct connman_agent_driver *driver; struct connman_agent *agent = agent_data; int err; if (!user_context || !callback) return -EBADMSG; queue_data = g_new0(struct connman_agent_request, 1); if (!queue_data) return -ENOMEM; driver = get_driver(); DBG("driver %p", driver); if (driver && driver->context_ref) { queue_data->user_context = driver->context_ref(user_context); queue_data->driver = driver; } else queue_data->user_context = user_context; queue_data->msg = dbus_message_ref(msg); queue_data->timeout = timeout; queue_data->callback = callback; queue_data->user_data = user_data; agent->queue = g_list_append(agent->queue, queue_data); err = agent_send_next_request(agent); if (err < 0 && err != -EBUSY) DBG("send next request failed (%s/%d)", strerror(-err), -err); return err; }