From: Patrik Flykt <[email protected]>

---
v2: Update the callbacks to accept a dbus message that needs not be unref'ed

 src/agent.c |  133 +++++++++++++++++++++++------------------------------------
 1 file changed, 52 insertions(+), 81 deletions(-)

diff --git a/src/agent.c b/src/agent.c
index dc32723..b78bc1c 100644
--- a/src/agent.c
+++ b/src/agent.c
@@ -182,7 +182,7 @@ static void agent_receive_message(DBusPendingCall *call, 
void *user_data)
 
 static int agent_queue_message(struct connman_service *service,
                DBusMessage *msg, int timeout,
-               DBusPendingCallNotifyFunction callback, void *user_data)
+               agent_queue_cb callback, void *user_data)
 {
        struct agent_data *queue_data;
 
@@ -229,7 +229,7 @@ struct request_input_reply {
        void *user_data;
 };
 
-static void request_input_passphrase_reply(DBusPendingCall *call, void 
*user_data)
+static void request_input_passphrase_reply(DBusMessage *reply, void *user_data)
 {
        struct request_input_reply *passphrase_reply = user_data;
        connman_bool_t values_received = FALSE;
@@ -242,7 +242,6 @@ static void request_input_passphrase_reply(DBusPendingCall 
*call, void *user_dat
        char *name = NULL;
        int name_len = 0;
        DBusMessageIter iter, dict;
-       DBusMessage *reply = dbus_pending_call_steal_reply(call);
 
        if (dbus_message_get_type(reply) == DBUS_MESSAGE_TYPE_ERROR) {
                error = dbus_message_get_error_name(reply);
@@ -323,8 +322,6 @@ done:
                                wps, wpspin, error,
                                passphrase_reply->user_data);
        connman_service_unref(passphrase_reply->service);
-       dbus_message_unref(reply);
-       dbus_pending_call_unref(call);
        g_free(passphrase_reply);
 }
 
@@ -511,7 +508,7 @@ static void previous_passphrase_handler(DBusMessageIter 
*iter,
                        request_input_append_previouspassphrase, &data);
 }
 
-static void request_input_login_reply(DBusPendingCall *call, void *user_data)
+static void request_input_login_reply(DBusMessage *reply, void *user_data)
 {
        struct request_input_reply *username_password_reply = user_data;
        const char *error = NULL;
@@ -520,7 +517,6 @@ static void request_input_login_reply(DBusPendingCall 
*call, void *user_data)
        char *password = NULL;
        char *key;
        DBusMessageIter iter, dict;
-       DBusMessage *reply = dbus_pending_call_steal_reply(call);
 
        if (dbus_message_get_type(reply) == DBUS_MESSAGE_TYPE_ERROR) {
                error = dbus_message_get_error_name(reply);
@@ -570,7 +566,6 @@ done:
                                        FALSE, NULL, error,
                                        username_password_reply->user_data);
        connman_service_unref(username_password_reply->service);
-       dbus_message_unref(reply);
        g_free(username_password_reply);
 }
 
@@ -581,8 +576,8 @@ int __connman_agent_request_passphrase_input(struct 
connman_service *service,
        const char *path;
        DBusMessageIter iter;
        DBusMessageIter dict;
-       DBusPendingCall *call;
        struct request_input_reply *passphrase_reply;
+       int err;
 
        if (service == NULL || agent_path == NULL || callback == NULL)
                return -ESRCH;
@@ -635,26 +630,22 @@ int __connman_agent_request_passphrase_input(struct 
connman_service *service,
                return -ENOMEM;
        }
 
-       if (dbus_connection_send_with_reply(connection, message, &call,
-                                       connman_timeout_input_request())
-                       == FALSE) {
-               dbus_message_unref(message);
-               g_free(passphrase_reply);
-               return -ESRCH;
-       }
-
-       if (call == NULL) {
-               dbus_message_unref(message);
-               g_free(passphrase_reply);
-               return -ESRCH;
-       }
-
        passphrase_reply->service = connman_service_ref(service);
        passphrase_reply->callback = callback;
        passphrase_reply->user_data = user_data;
 
-       dbus_pending_call_set_notify(call, request_input_passphrase_reply,
-                               passphrase_reply, NULL);
+       err = agent_queue_message(service, message,
+                       connman_timeout_input_request(),
+                       request_input_passphrase_reply,
+                       passphrase_reply);
+
+       if (err < 0 && err != -EBUSY) {
+               DBG("error %d sending agent message", err);
+               connman_service_unref(service);
+               dbus_message_unref(message);
+               g_free(passphrase_reply);
+               return err;
+       }
 
        dbus_message_unref(message);
 
@@ -668,8 +659,8 @@ int __connman_agent_request_login_input(struct 
connman_service *service,
        const char *path;
        DBusMessageIter iter;
        DBusMessageIter dict;
-       DBusPendingCall *call;
        struct request_input_reply *username_password_reply;
+       int err;
 
        if (service == NULL || agent_path == NULL || callback == NULL)
                return -ESRCH;
@@ -702,26 +693,20 @@ int __connman_agent_request_login_input(struct 
connman_service *service,
                return -ENOMEM;
        }
 
-       if (dbus_connection_send_with_reply(connection, message, &call,
-                                       connman_timeout_input_request())
-                       == FALSE) {
-               dbus_message_unref(message);
-               g_free(username_password_reply);
-               return -ESRCH;
-       }
-
-       if (call == NULL) {
-               dbus_message_unref(message);
-               g_free(username_password_reply);
-               return -ESRCH;
-       }
-
        username_password_reply->service = connman_service_ref(service);
        username_password_reply->callback = callback;
        username_password_reply->user_data = user_data;
 
-       dbus_pending_call_set_notify(call, request_input_login_reply,
-                                               username_password_reply, NULL);
+       err = agent_queue_message(service, message,
+                       connman_timeout_input_request(),
+                       request_input_login_reply, username_password_reply);
+       if (err < 0 && err != -EBUSY) {
+               DBG("error %d sending agent request", err);
+               connman_service_unref(service);
+               dbus_message_unref(message);
+               g_free(username_password_reply);
+               return err;
+       }
 
        dbus_message_unref(message);
 
@@ -734,10 +719,9 @@ struct request_browser_reply_data {
        void *user_data;
 };
 
-static void request_browser_reply(DBusPendingCall *call, void *user_data)
+static void request_browser_reply(DBusMessage *reply, 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;
        const char *error = NULL;
 
@@ -752,7 +736,6 @@ done:
        browser_reply_data->callback(browser_reply_data->service, result,
                                        error, browser_reply_data->user_data);
        connman_service_unref(browser_reply_data->service);
-       dbus_message_unref(reply);
        g_free(browser_reply_data);
 }
 
@@ -761,10 +744,10 @@ int __connman_agent_request_browser(struct 
connman_service *service,
                                const char *url, void *user_data)
 {
        struct request_browser_reply_data *browser_reply_data;
-       DBusPendingCall *call;
        DBusMessage *message;
        DBusMessageIter iter;
        const char *path;
+       int err;
 
        if (service == NULL || agent_path == NULL || callback == NULL)
                return -ESRCH;
@@ -791,26 +774,21 @@ int __connman_agent_request_browser(struct 
connman_service *service,
                return -ENOMEM;
        }
 
-       if (dbus_connection_send_with_reply(connection, message, &call,
-                                       connman_timeout_browser_launch())
-                       == 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);
+       err = agent_queue_message(service, message,
+                       connman_timeout_browser_launch(),
+                       request_browser_reply, browser_reply_data);
+
+       if (err < 0 && err != -EBUSY) {
+               DBG("error %d sending browser request", err);
+               connman_service_unref(service);
+               dbus_message_unref(message);
+               g_free(browser_reply_data);
+               return err;
+       }
 
        dbus_message_unref(message);
 
@@ -823,10 +801,9 @@ struct report_error_data {
        void *user_data;
 };
 
-static void report_error_reply(DBusPendingCall *call, void *user_data)
+static void report_error_reply(DBusMessage *reply, void *user_data)
 {
        struct report_error_data *report_error = user_data;
-       DBusMessage *reply = dbus_pending_call_steal_reply(call);
        gboolean retry = FALSE;
        const char *dbus_err;
 
@@ -842,8 +819,6 @@ static void report_error_reply(DBusPendingCall *call, void 
*user_data)
                        report_error->user_data);
        connman_service_unref(report_error->service);
        g_free(report_error);
-       dbus_message_unref(reply);
-       dbus_pending_call_unref(call);
 }
 
 int __connman_agent_report_error(struct connman_service *service,
@@ -854,7 +829,7 @@ int __connman_agent_report_error(struct connman_service 
*service,
        DBusMessageIter iter;
        const char *path;
        struct report_error_data *report_error;
-       DBusPendingCall *call;
+       int err;
 
        if (service == NULL || agent_path == NULL || error == NULL ||
                callback == NULL)
@@ -880,25 +855,21 @@ int __connman_agent_report_error(struct connman_service 
*service,
                return -ENOMEM;
        }
 
-       if (dbus_connection_send_with_reply(connection, message, &call,
-                                       connman_timeout_input_request())
-                       == FALSE) {
-               dbus_message_unref(message);
-               g_free(report_error);
-               return -ESRCH;
-       }
+       report_error->service = connman_service_ref(service);
+       report_error->callback = callback;
+       report_error->user_data = user_data;
 
-       if (call == NULL) {
-               dbus_message_unref(message);
+       err = agent_queue_message(service, message,
+                       connman_timeout_input_request(),
+                       report_error_reply, report_error);
+       if (err < 0 && err != -EBUSY) {
+               DBG("error %d sending error request", err);
+               connman_service_unref(service);
                g_free(report_error);
+               dbus_message_unref(message);
                return -ESRCH;
        }
 
-       report_error->service = connman_service_ref(service);
-       report_error->callback = callback;
-       report_error->user_data = user_data;
-       dbus_pending_call_set_notify(call, report_error_reply,
-                               report_error, NULL);
        dbus_message_unref(message);
 
        return -EINPROGRESS;
-- 
1.7.10.4

_______________________________________________
connman mailing list
[email protected]
http://lists.connman.net/listinfo/connman

Reply via email to