From: Patrik Flykt <[email protected]>

When a service fails, call __connman_agent_report_error to send an
ReportError method call to the agent. Sending of ReportError is requested
only if the service was connected due to a D-Bus request. Thus automatic
connection creation will be done silently without invoking an agent.
---
v3: call __connman_profile_changed() from error callback on retry

 src/service.c |   23 ++++++++++++++++++++++-
 1 files changed, 22 insertions(+), 1 deletions(-)

diff --git a/src/service.c b/src/service.c
index 1c29d88..03fb2cb 100644
--- a/src/service.c
+++ b/src/service.c
@@ -2942,6 +2942,17 @@ static void service_complete(struct connman_service 
*service)
        __connman_storage_save_service(service);
 }
 
+static void report_error_cb(struct connman_service *service,
+                       gboolean retry, void *user_data)
+{
+       if (retry == TRUE)
+               __connman_service_connect(service);
+       else {
+               service_complete(service);
+               __connman_profile_changed(FALSE);
+       }
+}
+
 int __connman_service_indicate_state(struct connman_service *service,
                                        enum connman_service_state state)
 {
@@ -3038,6 +3049,11 @@ int __connman_service_indicate_state(struct 
connman_service *service,
        }
 
        if (state == CONNMAN_SERVICE_STATE_FAILURE) {
+               if (service->userconnect == TRUE &&
+                       __connman_agent_report_error(service,
+                                       error2string(service->error),
+                                       report_error_cb, NULL) == -EIO)
+                       return 0;
                service_complete(service);
        } else
                service->error = CONNMAN_SERVICE_ERROR_UNKNOWN;
@@ -3258,7 +3274,12 @@ int __connman_service_connect(struct connman_service 
*service)
                if (err != -EINPROGRESS) {
                        __connman_ipconfig_disable(service->ipconfig);
                        __connman_stats_service_unregister(service);
-                       return err;
+                       if (service->userconnect == TRUE)
+                               return __connman_agent_report_error(service,
+                                               error2string(service->error),
+                                               report_error_cb, NULL);
+                       else
+                               return err;
                }
 
                service->timeout = g_timeout_add_seconds(CONNECT_TIMEOUT,
-- 
1.7.2.3

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

Reply via email to