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