In order to allow clients to update the property in a manner similar to
other service properties, signal changes in the service "Error" property
key/value pair.

The value "none" is used when no error is asserted because D-Bus property
changed convention has no semantics for indicating a key/value pair was
removed.
---

 v1: Initial submission.
 v2: Incorporated stylistic feedback from Patrik Flykt.

 src/service.c |   37 ++++++++++++++++++++++++++++++++-----
 1 file changed, 32 insertions(+), 5 deletions(-)

diff --git a/src/service.c b/src/service.c
index dfe1752..219f05c 100644
--- a/src/service.c
+++ b/src/service.c
@@ -3205,11 +3205,36 @@ static DBusMessage *set_property(DBusConnection *conn,
        return g_dbus_create_reply(msg, DBUS_TYPE_INVALID);
 }
 
+static void set_error(struct connman_service *service,
+                                       enum connman_service_error error)
+{
+       const char *str, **strp;
+       const char *none = "";
+
+       if (service->error != error) {
+               service->error = error;
+
+               if (service->path == NULL)
+                       return;
+
+               str = error2string(service->error);
+
+               if (str == NULL)
+                       strp = &none;
+               else
+                       strp = &str;
+
+               connman_dbus_property_changed_basic(service->path,
+                                       CONNMAN_SERVICE_INTERFACE, "Error",
+                                       DBUS_TYPE_STRING, strp);
+       }
+}
+
 static void set_idle(struct connman_service *service)
 {
        service->state = service->state_ipv4 = service->state_ipv6 =
                                                CONNMAN_SERVICE_STATE_IDLE;
-       service->error = CONNMAN_SERVICE_ERROR_UNKNOWN;
+       set_error(service, CONNMAN_SERVICE_ERROR_UNKNOWN);
        state_changed(service);
 }
 
@@ -4100,6 +4125,8 @@ static void service_initialize(struct connman_service 
*service)
        service->refcount = 1;
        service->session_usage_count = 0;
 
+       service->error = CONNMAN_SERVICE_ERROR_UNKNOWN;
+
        service->type     = CONNMAN_SERVICE_TYPE_UNKNOWN;
        service->security = CONNMAN_SERVICE_SECURITY_UNKNOWN;
 
@@ -4679,7 +4706,7 @@ static void request_input_cb (struct connman_service 
*service,
  done:
        if (err >= 0) {
                /* We forget any previous error. */
-               service->error = CONNMAN_SERVICE_ERROR_UNKNOWN;
+               set_error(service, CONNMAN_SERVICE_ERROR_UNKNOWN);
 
                __connman_service_connect(service);
 
@@ -4929,7 +4956,7 @@ static int service_indicate_state(struct connman_service 
*service)
                        return 0;
                service_complete(service);
        } else
-               service->error = CONNMAN_SERVICE_ERROR_UNKNOWN;
+               set_error(service, CONNMAN_SERVICE_ERROR_UNKNOWN);
 
        iter = g_hash_table_lookup(service_hash, service->identifier);
        if (iter != NULL && g_sequence_get_length(service_list) > 1) {
@@ -4955,7 +4982,7 @@ int __connman_service_indicate_error(struct 
connman_service *service,
        if (service == NULL)
                return -EINVAL;
 
-       service->error = error;
+       set_error(service, error);
 
        if (service->error == CONNMAN_SERVICE_ERROR_INVALID_KEY)
                __connman_service_set_passphrase(service, NULL);
@@ -4981,7 +5008,7 @@ int __connman_service_clear_error(struct connman_service 
*service)
 
        service->state_ipv4 = service->state_ipv6 =
                                                CONNMAN_SERVICE_STATE_UNKNOWN;
-       service->error = CONNMAN_SERVICE_ERROR_UNKNOWN;
+       set_error(service, CONNMAN_SERVICE_ERROR_UNKNOWN);
 
        if (service->favorite == TRUE)
                set_reconnect_state(service, TRUE);
--
1.7.10
_______________________________________________
connman mailing list
connman@connman.net
http://lists.connman.net/listinfo/connman

Reply via email to