From 26be4f3e78aea1bb6df7f77bcdb429a7e2b0329b Mon Sep 17 00:00:00 2001 From: Tomasz Bursztyka Date: Tue, 14 Feb 2012 12:05:44 +0200 Subject: agent: Handle browser request reply --- src/agent.c | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) (limited to 'src/agent.c') diff --git a/src/agent.c b/src/agent.c index 67303087..d0b3ecd5 100644 --- a/src/agent.c +++ b/src/agent.c @@ -524,10 +524,36 @@ int __connman_agent_request_login_input(struct connman_service *service, return -EIO; } +struct request_browser_reply_data { + struct connman_service *service; + browser_authentication_cb_t callback; + void *user_data; +}; + +static void request_browser_reply(DBusPendingCall *call, void *user_data) +{ + struct request_browser_reply_data *browser_reply_data = user_data; + DBusMessage *reply = dbus_pending_call_steal_reply(call); + connman_bool_t result = FALSE; + + if (dbus_message_get_type(reply) == DBUS_MESSAGE_TYPE_ERROR) + goto done; + + result = TRUE; + +done: + browser_reply_data->callback(browser_reply_data->service, + result, browser_reply_data->user_data); + connman_service_unref(browser_reply_data->service); + dbus_message_unref(reply); + g_free(browser_reply_data); +} + int __connman_agent_request_browser(struct connman_service *service, browser_authentication_cb_t callback, const char *url, void *user_data) { + struct request_browser_reply_data *browser_reply_data; DBusPendingCall *call; DBusMessage *message; DBusMessageIter iter; @@ -552,17 +578,32 @@ int __connman_agent_request_browser(struct connman_service *service, dbus_message_iter_append_basic(&iter, DBUS_TYPE_STRING, &url); + browser_reply_data = g_try_new0(struct request_browser_reply_data, 1); + if (browser_reply_data == NULL) { + dbus_message_unref(message); + return -ENOMEM; + } + if (dbus_connection_send_with_reply(connection, message, &call, -1) == FALSE) { dbus_message_unref(message); + g_free(browser_reply_data); return -ESRCH; } if (call == NULL) { dbus_message_unref(message); + g_free(browser_reply_data); return -ESRCH; } + browser_reply_data->service = connman_service_ref(service); + browser_reply_data->callback = callback; + browser_reply_data->user_data = user_data; + + dbus_pending_call_set_notify(call, request_browser_reply, + browser_reply_data, NULL); + dbus_message_unref(message); return -EIO; -- cgit v1.2.3