summaryrefslogtreecommitdiff
path: root/src/service.c
diff options
context:
space:
mode:
authorGrant Erickson <marathon96@gmail.com>2012-08-08 09:59:27 -0700
committerPatrik Flykt <patrik.flykt@linux.intel.com>2012-08-09 08:42:19 +0300
commitfab9223d04095134a0a79657a8a6250a28e98c2c (patch)
treed4605061a605dbcab28de47703179b6942ec5253 /src/service.c
parentabc1b18ed920d5674d3c934becdc420e65281441 (diff)
downloadconnman-fab9223d04095134a0a79657a8a6250a28e98c2c.tar.gz
connman-fab9223d04095134a0a79657a8a6250a28e98c2c.tar.bz2
connman-fab9223d04095134a0a79657a8a6250a28e98c2c.zip
service: Signal error property changes
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 "" is used when no error is asserted because D-Bus property changed convention has no semantics for indicating a key/value pair was removed.
Diffstat (limited to 'src/service.c')
-rw-r--r--src/service.c35
1 files changed, 30 insertions, 5 deletions
diff --git a/src/service.c b/src/service.c
index 9275e549..d0843fc1 100644
--- a/src/service.c
+++ b/src/service.c
@@ -3206,11 +3206,34 @@ 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;
+
+ if (service->error == error)
+ return;
+
+ service->error = error;
+
+ if (service->path == NULL)
+ return;
+
+ str = error2string(service->error);
+
+ if (str == NULL)
+ str = "";
+
+ connman_dbus_property_changed_basic(service->path,
+ CONNMAN_SERVICE_INTERFACE, "Error",
+ DBUS_TYPE_STRING, &str);
+}
+
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);
}
@@ -4114,6 +4137,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;
@@ -4693,7 +4718,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);
@@ -4943,7 +4968,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) {
@@ -4969,7 +4994,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);
@@ -4995,7 +5020,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);