agent: Implement Agent API Cancel() method call
authorPatrik Flykt <patrik.flykt@linux.intel.com>
Mon, 3 Sep 2012 11:17:13 +0000 (14:17 +0300)
committerPatrik Flykt <patrik.flykt@linux.intel.com>
Tue, 4 Sep 2012 09:08:53 +0000 (12:08 +0300)
Clean up the queue and cancel the current message at the agent, if
any. Split out the actual cancel message sending as it will be used
separately from the rest of the code.

src/agent.c
src/connman.h

index 92cea77a1004c15ad8f5fde74ff12ef5eda7b9ec..132aa8583de3ba478f7cf3a4a8a718334b819c30 100644 (file)
@@ -150,6 +150,25 @@ fail:
        return -ESRCH;
 }
 
+static int agent_send_cancel(void)
+{
+       DBusMessage *message;
+
+       if (agent_sender == NULL)
+               return 0;
+
+       message = dbus_message_new_method_call(agent_sender, agent_path,
+                       CONNMAN_AGENT_INTERFACE, "Cancel");
+       if (message != NULL) {
+               dbus_message_set_no_reply(message, TRUE);
+               g_dbus_send_message(connection, message);
+               return 0;
+       }
+
+       connman_warn("Failed to send Cancel message to agent");
+       return -ESRCH;
+}
+
 static void agent_receive_message(DBusPendingCall *call, void *user_data)
 {
        struct agent_data *queue_data = user_data;
@@ -199,6 +218,41 @@ static int agent_queue_message(struct connman_service *service,
        return agent_send_next_request();
 }
 
+void __connman_agent_cancel(struct connman_service *service)
+{
+       GList *item, *next;
+       struct agent_data *queued_req;
+
+       DBG("service %p", service);
+
+       item = agent_queue;
+
+       while (item != NULL) {
+               next = g_list_next(item);
+               queued_req = item->data;
+
+               if (queued_req->service == service || service == 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->service != service && service != NULL)
+               return;
+
+       agent_data_free(agent_request);
+       agent_request = NULL;
+
+       agent_send_cancel();
+
+       agent_send_next_request();
+}
+
 static connman_bool_t check_reply_has_dict(DBusMessage *reply)
 {
        const char *signature = DBUS_TYPE_ARRAY_AS_STRING
index 305f09f9ecb2744098f7250b7257f0a30bddbdb5..120de302c67d05ba63ac23349c02c689808e47fb 100644 (file)
@@ -84,6 +84,8 @@ void __connman_counter_cleanup(void);
 
 struct connman_service;
 
+void __connman_agent_cancel(struct connman_service *service);
+
 int __connman_service_add_passphrase(struct connman_service *service,
                                        const gchar *passphrase);
 typedef void (* authentication_cb_t) (struct connman_service *service,