X-Git-Url: https://vcs.maemo.org/git/?a=blobdiff_plain;f=src%2Felement.c;h=1b1e61dc1e2b8b58ea5b49d429886fbf10a2ca6c;hb=3bbee5b2cc7b77a044ea32f46a4469d0b5cdddf2;hp=7361eb241d8043b6492ce12c777717633479aa1e;hpb=da8e11efb0472f8d21cd4afff152036701e531a9;p=connman diff --git a/src/element.c b/src/element.c index 7361eb2..1b1e61d 100644 --- a/src/element.c +++ b/src/element.c @@ -34,11 +34,8 @@ static DBusConnection *connection; -static GStaticRWLock element_lock = G_STATIC_RW_LOCK_INIT; static GNode *element_root = NULL; - static GSList *driver_list = NULL; - static gchar *device_filter = NULL; static struct { @@ -55,6 +52,8 @@ static struct { DBUS_TYPE_STRING, "IPv4.Netmask" }, { CONNMAN_PROPERTY_ID_IPV4_GATEWAY, DBUS_TYPE_STRING, "IPv4.Gateway" }, + { CONNMAN_PROPERTY_ID_IPV4_BROADCAST, + DBUS_TYPE_STRING, "IPv4.Broadcast" }, { CONNMAN_PROPERTY_ID_IPV4_NAMESERVER, DBUS_TYPE_STRING, "IPv4.Nameserver" }, @@ -115,8 +114,6 @@ static const char *type2string(enum connman_element_type type) return "bootp"; case CONNMAN_ELEMENT_TYPE_ZEROCONF: return "zeroconf"; - case CONNMAN_ELEMENT_TYPE_RESOLVER: - return "resolver"; case CONNMAN_ELEMENT_TYPE_CONNECTION: return "connection"; } @@ -153,12 +150,10 @@ const char *__connman_element_policy2string(enum connman_element_policy policy) switch (policy) { case CONNMAN_ELEMENT_POLICY_UNKNOWN: return "unknown"; - case CONNMAN_ELEMENT_POLICY_OFF: - return "off"; - case CONNMAN_ELEMENT_POLICY_AUTO: - return "auto"; case CONNMAN_ELEMENT_POLICY_IGNORE: return "ignore"; + case CONNMAN_ELEMENT_POLICY_AUTO: + return "auto"; case CONNMAN_ELEMENT_POLICY_ASK: return "ask"; } @@ -168,9 +163,7 @@ const char *__connman_element_policy2string(enum connman_element_policy policy) enum connman_element_policy __connman_element_string2policy(const char *policy) { - if (strcasecmp(policy, "off") == 0) - return CONNMAN_ELEMENT_POLICY_OFF; - else if (strcasecmp(policy, "ignore") == 0) + if (strcasecmp(policy, "ignore") == 0) return CONNMAN_ELEMENT_POLICY_IGNORE; else if (strcasecmp(policy, "auto") == 0) return CONNMAN_ELEMENT_POLICY_AUTO; @@ -180,6 +173,34 @@ enum connman_element_policy __connman_element_string2policy(const char *policy) return CONNMAN_ELEMENT_POLICY_UNKNOWN; } +const char *__connman_ipv4_method2string(enum connman_ipv4_method method) +{ + switch (method) { + case CONNMAN_IPV4_METHOD_UNKNOWN: + return "unknown"; + case CONNMAN_IPV4_METHOD_OFF: + return "off"; + case CONNMAN_IPV4_METHOD_STATIC: + return "static"; + case CONNMAN_IPV4_METHOD_DHCP: + return "dhcp"; + } + + return "unknown"; +} + +enum connman_ipv4_method __connman_ipv4_string2method(const char *method) +{ + if (strcasecmp(method, "off") == 0) + return CONNMAN_IPV4_METHOD_OFF; + else if (strcasecmp(method, "static") == 0) + return CONNMAN_IPV4_METHOD_STATIC; + else if (strcasecmp(method, "dhcp") == 0) + return CONNMAN_IPV4_METHOD_DHCP; + else + return CONNMAN_IPV4_METHOD_UNKNOWN; +} + static void append_property(DBusMessageIter *dict, struct connman_property *property) { @@ -288,6 +309,53 @@ static void set_common_property(struct connman_element *element, __connman_element_unlock(element); } +static void emit_enabled_signal(DBusConnection *conn, + struct connman_element *element) +{ + DBusMessage *signal; + DBusMessageIter entry, value; + const char *iface, *key; + + DBG("conn %p", conn); + + if (element == NULL) + return; + + switch (element->type) { + case CONNMAN_ELEMENT_TYPE_DEVICE: + iface = CONNMAN_DEVICE_INTERFACE; + key = "Powered"; + break; + case CONNMAN_ELEMENT_TYPE_NETWORK: + iface = CONNMAN_NETWORK_INTERFACE; + key = "Connected"; + break; + case CONNMAN_ELEMENT_TYPE_CONNECTION: + iface = CONNMAN_CONNECTION_INTERFACE; + key = "Default"; + break; + default: + return; + } + + signal = dbus_message_new_signal(element->path, + iface, "PropertyChanged"); + if (signal == NULL) + return; + + dbus_message_iter_init_append(signal, &entry); + + dbus_message_iter_append_basic(&entry, DBUS_TYPE_STRING, &key); + + dbus_message_iter_open_container(&entry, DBUS_TYPE_VARIANT, + DBUS_TYPE_BOOLEAN_AS_STRING, &value); + dbus_message_iter_append_basic(&value, DBUS_TYPE_BOOLEAN, + &element->enabled); + dbus_message_iter_close_container(&entry, &value); + + g_dbus_send_message(conn, signal); +} + static DBusMessage *do_update(DBusConnection *conn, DBusMessage *msg, void *data) { @@ -326,12 +394,7 @@ static DBusMessage *do_enable(DBusConnection *conn, element->enabled = TRUE; -#if 0 - g_dbus_emit_signal(connection, CONNMAN_MANAGER_PATH, - CONNMAN_MANAGER_INTERFACE, "ElementUpdated", - DBUS_TYPE_OBJECT_PATH, &element->path, - DBUS_TYPE_INVALID); -#endif + emit_enabled_signal(connection, element); return g_dbus_create_reply(msg, DBUS_TYPE_INVALID); } @@ -354,32 +417,20 @@ static DBusMessage *do_disable(DBusConnection *conn, element->enabled = FALSE; -#if 0 - g_dbus_emit_signal(connection, CONNMAN_MANAGER_PATH, - CONNMAN_MANAGER_INTERFACE, "ElementUpdated", - DBUS_TYPE_OBJECT_PATH, &element->path, - DBUS_TYPE_INVALID); -#endif + emit_enabled_signal(connection, element); return g_dbus_create_reply(msg, DBUS_TYPE_INVALID); } static void append_networks(struct connman_element *element, - DBusMessageIter *dict) + DBusMessageIter *entry) { - DBusMessageIter entry, value, iter; + DBusMessageIter value, iter; const char *key = "Networks"; - if (element->subtype != CONNMAN_ELEMENT_SUBTYPE_WIFI && - element->subtype != CONNMAN_ELEMENT_SUBTYPE_WIMAX) - return; - - dbus_message_iter_open_container(dict, DBUS_TYPE_DICT_ENTRY, - NULL, &entry); - - dbus_message_iter_append_basic(&entry, DBUS_TYPE_STRING, &key); + dbus_message_iter_append_basic(entry, DBUS_TYPE_STRING, &key); - dbus_message_iter_open_container(&entry, DBUS_TYPE_VARIANT, + dbus_message_iter_open_container(entry, DBUS_TYPE_VARIANT, DBUS_TYPE_ARRAY_AS_STRING DBUS_TYPE_OBJECT_PATH_AS_STRING, &value); @@ -390,9 +441,7 @@ static void append_networks(struct connman_element *element, dbus_message_iter_close_container(&value, &iter); - dbus_message_iter_close_container(&entry, &value); - - dbus_message_iter_close_container(dict, &entry); + dbus_message_iter_close_container(entry, &value); } static DBusMessage *device_get_properties(DBusConnection *conn, @@ -400,7 +449,7 @@ static DBusMessage *device_get_properties(DBusConnection *conn, { struct connman_element *element = data; DBusMessage *reply; - DBusMessageIter array, dict; + DBusMessageIter array, dict, entry; const char *str; DBG("conn %p", conn); @@ -429,7 +478,13 @@ static DBusMessage *device_get_properties(DBusConnection *conn, connman_dbus_dict_append_variant(&dict, "Powered", DBUS_TYPE_BOOLEAN, &element->enabled); - append_networks(element, &dict); + if (element->subtype == CONNMAN_ELEMENT_SUBTYPE_WIFI || + element->subtype == CONNMAN_ELEMENT_SUBTYPE_WIMAX) { + dbus_message_iter_open_container(&dict, DBUS_TYPE_DICT_ENTRY, + NULL, &entry); + append_networks(element, &entry); + dbus_message_iter_close_container(&dict, &entry); + } add_common_properties(element, &dict); @@ -630,35 +685,7 @@ static DBusMessage *network_set_property(DBusConnection *conn, return g_dbus_create_reply(msg, DBUS_TYPE_INVALID); } -static DBusMessage *get_connection_properties(DBusConnection *conn, - DBusMessage *msg, void *data) -{ - struct connman_element *element = data; - DBusMessage *reply; - DBusMessageIter array, dict; - - DBG("conn %p", conn); - - reply = dbus_message_new_method_return(msg); - if (reply == NULL) - return NULL; - - dbus_message_iter_init_append(reply, &array); - - dbus_message_iter_open_container(&array, DBUS_TYPE_ARRAY, - DBUS_DICT_ENTRY_BEGIN_CHAR_AS_STRING - DBUS_TYPE_STRING_AS_STRING DBUS_TYPE_VARIANT_AS_STRING - DBUS_DICT_ENTRY_END_CHAR_AS_STRING, &dict); - - add_common_properties(element, &dict); - - dbus_message_iter_close_container(&array, &dict); - - return reply; -} - -#if 0 -static DBusMessage *get_properties(DBusConnection *conn, +static DBusMessage *connection_get_properties(DBusConnection *conn, DBusMessage *msg, void *data) { struct connman_element *element = data; @@ -679,22 +706,17 @@ static DBusMessage *get_properties(DBusConnection *conn, DBUS_TYPE_STRING_AS_STRING DBUS_TYPE_VARIANT_AS_STRING DBUS_DICT_ENTRY_END_CHAR_AS_STRING, &dict); - if (element->parent != NULL && - element->parent->type != CONNMAN_ELEMENT_TYPE_ROOT) { - connman_dbus_dict_append_variant(&dict, "Parent", - DBUS_TYPE_OBJECT_PATH, &element->parent->path); - } - - str = type2string(element->type); - if (str != NULL) - connman_dbus_dict_append_variant(&dict, "Type", - DBUS_TYPE_STRING, &str); str = subtype2string(element->subtype); if (str != NULL) - connman_dbus_dict_append_variant(&dict, "Subtype", + connman_dbus_dict_append_variant(&dict, "Type", DBUS_TYPE_STRING, &str); - connman_dbus_dict_append_variant(&dict, "Enabled", + if (element->subtype == CONNMAN_ELEMENT_SUBTYPE_WIFI || + element->subtype == CONNMAN_ELEMENT_SUBTYPE_WIMAX) + connman_dbus_dict_append_variant(&dict, "Strength", + DBUS_TYPE_BYTE, &element->strength); + + connman_dbus_dict_append_variant(&dict, "Default", DBUS_TYPE_BOOLEAN, &element->enabled); add_common_properties(element, &dict); @@ -704,90 +726,6 @@ static DBusMessage *get_properties(DBusConnection *conn, return reply; } -static DBusMessage *set_property(DBusConnection *conn, - DBusMessage *msg, void *data) -{ - struct connman_element *element = data; - DBusMessageIter iter; - DBusMessageIter value; - const char *name; - - DBG("conn %p", conn); - - if (dbus_message_iter_init(msg, &iter) == FALSE) - return __connman_error_invalid_arguments(msg); - - dbus_message_iter_get_basic(&iter, &name); - dbus_message_iter_next(&iter); - dbus_message_iter_recurse(&iter, &value); - - if (__connman_security_check_privileges(msg) < 0) - return __connman_error_permission_denied(msg); - - set_common_property(element, name, &value); - - return g_dbus_create_reply(msg, DBUS_TYPE_INVALID); -} - -static DBusMessage *clear_property(DBusConnection *conn, - DBusMessage *msg, void *data) -{ - struct connman_element *element = data; - const char *name; - GSList *list; - - DBG("conn %p", conn); - - if (dbus_message_get_args(msg, NULL, DBUS_TYPE_STRING, &name, - DBUS_TYPE_INVALID) == FALSE) - return __connman_error_invalid_arguments(msg); - - if (__connman_security_check_privileges(msg) < 0) - return __connman_error_permission_denied(msg); - - __connman_element_lock(element); - - for (list = element->properties; list; list = list->next) { - struct connman_property *property = list->data; - - if (g_str_equal(property->name, name) == FALSE) - continue; - - if (property->flags & CONNMAN_PROPERTY_FLAG_STATIC) - continue; - - if (property->flags & CONNMAN_PROPERTY_FLAG_REFERENCE) - continue; - - property->flags |= CONNMAN_PROPERTY_FLAG_REFERENCE; - - if (property->type == DBUS_TYPE_STRING) - g_free(property->value); - - property->value = NULL; - } - - __connman_element_unlock(element); - - return g_dbus_create_reply(msg, DBUS_TYPE_INVALID); -} - -static GDBusMethodTable element_methods[] = { - { "GetProperties", "", "a{sv}", get_properties }, - { "SetProperty", "sv", "", set_property }, - { "ClearProperty", "s", "", clear_property }, - { "Update", "", "", do_update }, - { "Enable", "", "", do_enable }, - { "Disable", "", "", do_disable }, - { }, -}; -#endif - -static GDBusSignalTable element_signals[] = { - { "PropertyChanged", "sv" }, - { }, -}; - static GDBusMethodTable device_methods[] = { { "GetProperties", "", "a{sv}", device_get_properties }, { "SetProperty", "sv", "", device_set_property }, @@ -806,7 +744,12 @@ static GDBusMethodTable network_methods[] = { }; static GDBusMethodTable connection_methods[] = { - { "GetProperties", "", "a{sv}", get_connection_properties }, + { "GetProperties", "", "a{sv}", connection_get_properties }, + { }, +}; + +static GDBusSignalTable element_signals[] = { + { "PropertyChanged", "sv" }, { }, }; @@ -856,10 +799,8 @@ void __connman_element_list(struct connman_element *element, } else node = element_root; - g_static_rw_lock_reader_lock(&element_lock); g_node_traverse(node, G_PRE_ORDER, G_TRAVERSE_ALL, -1, append_path, &filter); - g_static_rw_lock_reader_unlock(&element_lock); } struct count_data { @@ -902,10 +843,8 @@ int __connman_element_count(struct connman_element *element, } else node = element_root; - g_static_rw_lock_reader_lock(&element_lock); g_node_traverse(node, G_PRE_ORDER, G_TRAVERSE_ALL, -1, count_element, &data); - g_static_rw_lock_reader_unlock(&element_lock); return data.count; } @@ -944,8 +883,10 @@ static void enable_element(struct connman_element *element) return; if (element->driver && element->driver->enable) { - if (element->driver->enable(element) == 0) + if (element->driver->enable(element) == 0) { element->enabled = TRUE; + emit_enabled_signal(connection, element); + } } } @@ -977,13 +918,9 @@ void __connman_driver_rescan(struct connman_driver *driver) if (!driver->probe) return; - g_static_rw_lock_writer_lock(&element_lock); - if (element_root != NULL) g_node_traverse(element_root, G_PRE_ORDER, G_TRAVERSE_ALL, -1, probe_driver, driver); - - g_static_rw_lock_writer_unlock(&element_lock); } /** @@ -1004,8 +941,6 @@ int connman_driver_register(struct connman_driver *driver) if (!driver->probe) return -EINVAL; - g_static_rw_lock_writer_lock(&element_lock); - driver_list = g_slist_insert_sorted(driver_list, driver, compare_priority); @@ -1013,8 +948,6 @@ int connman_driver_register(struct connman_driver *driver) g_node_traverse(element_root, G_PRE_ORDER, G_TRAVERSE_ALL, -1, probe_driver, driver); - g_static_rw_lock_writer_unlock(&element_lock); - return 0; } @@ -1027,8 +960,10 @@ static void disable_element(struct connman_element *element) return; if (element->driver && element->driver->disable) { - if (element->driver->disable(element) == 0) + if (element->driver->disable(element) == 0) { element->enabled = FALSE; + emit_enabled_signal(connection, element); + } } } @@ -1063,15 +998,11 @@ void connman_driver_unregister(struct connman_driver *driver) { DBG("driver %p name %s", driver, driver->name); - g_static_rw_lock_writer_lock(&element_lock); - driver_list = g_slist_remove(driver_list, driver); if (element_root != NULL) g_node_traverse(element_root, G_POST_ORDER, G_TRAVERSE_ALL, -1, remove_driver, driver); - - g_static_rw_lock_writer_unlock(&element_lock); } /** @@ -1200,6 +1131,102 @@ int connman_element_add_static_property(struct connman_element *element, return 0; } +static void emit_property_changed(DBusConnection *conn, + struct connman_element *element, + const char *name, int type, const void *data) +{ + DBusMessage *signal; + DBusMessageIter entry, value; + const char *iface, *sig; + + DBG("conn %p", conn); + + switch (element->type) { + case CONNMAN_ELEMENT_TYPE_DEVICE: + iface = CONNMAN_DEVICE_INTERFACE; + break; + case CONNMAN_ELEMENT_TYPE_NETWORK: + iface = CONNMAN_NETWORK_INTERFACE; + break; + case CONNMAN_ELEMENT_TYPE_CONNECTION: + iface = CONNMAN_CONNECTION_INTERFACE; + break; + default: + return; + } + + signal = dbus_message_new_signal(element->path, + iface, "PropertyChanged"); + if (signal == NULL) + return; + + dbus_message_iter_init_append(signal, &entry); + + dbus_message_iter_append_basic(&entry, DBUS_TYPE_STRING, &name); + + switch (type) { + case DBUS_TYPE_STRING: + sig = DBUS_TYPE_STRING_AS_STRING; + break; + case DBUS_TYPE_BYTE: + sig = DBUS_TYPE_BYTE_AS_STRING; + break; + default: + sig = DBUS_TYPE_VARIANT_AS_STRING; + break; + } + + dbus_message_iter_open_container(&entry, DBUS_TYPE_VARIANT, + sig, &value); + dbus_message_iter_append_basic(&value, type, data); + dbus_message_iter_close_container(&entry, &value); + + g_dbus_send_message(conn, signal); +} + +int connman_element_set_static_property(struct connman_element *element, + const char *name, int type, const void *value) +{ + GSList *list; + + DBG("element %p name %s", element, element->name); + + if (type != DBUS_TYPE_STRING && type != DBUS_TYPE_BYTE) + return -EINVAL; + + __connman_element_lock(element); + + for (list = element->properties; list; list = list->next) { + struct connman_property *property = list->data; + + if (g_str_equal(property->name, name) == FALSE) + continue; + + if (!(property->flags & CONNMAN_PROPERTY_FLAG_STATIC)) + continue; + + property->type = type; + g_free(property->value); + + switch (type) { + case DBUS_TYPE_STRING: + property->value = g_strdup(*((const char **) value)); + break; + case DBUS_TYPE_BYTE: + property->value = g_try_malloc(1); + if (property->value != NULL) + memcpy(property->value, value, 1); + break; + } + } + + __connman_element_unlock(element); + + emit_property_changed(connection, element, name, type, value); + + return 0; +} + int connman_element_add_static_array_property(struct connman_element *element, const char *name, int type, const void *value, int len) { @@ -1418,6 +1445,12 @@ int connman_element_set_property(struct connman_element *element, element->ipv4.gateway = g_strdup(*((const char **) value)); __connman_element_unlock(element); break; + case CONNMAN_PROPERTY_ID_IPV4_BROADCAST: + __connman_element_lock(element); + g_free(element->ipv4.broadcast); + element->ipv4.broadcast = g_strdup(*((const char **) value)); + __connman_element_unlock(element); + break; case CONNMAN_PROPERTY_ID_IPV4_NAMESERVER: __connman_element_lock(element); g_free(element->ipv4.nameserver); @@ -1440,13 +1473,6 @@ int connman_element_set_property(struct connman_element *element, return -EINVAL; } -#if 0 - g_dbus_emit_signal(connection, CONNMAN_MANAGER_PATH, - CONNMAN_MANAGER_INTERFACE, "ElementUpdated", - DBUS_TYPE_OBJECT_PATH, &element->path, - DBUS_TYPE_INVALID); -#endif - return 0; } @@ -1481,6 +1507,14 @@ int connman_element_get_value(struct connman_element *element, *((char **) value) = element->ipv4.gateway; __connman_element_unlock(element); break; + case CONNMAN_PROPERTY_ID_IPV4_BROADCAST: + if (element->ipv4.broadcast == NULL) + return connman_element_get_value(element->parent, + id, value); + __connman_element_lock(element); + *((char **) value) = element->ipv4.broadcast; + __connman_element_unlock(element); + break; case CONNMAN_PROPERTY_ID_IPV4_NAMESERVER: if (element->ipv4.nameserver == NULL) return connman_element_get_value(element->parent, @@ -1618,9 +1652,7 @@ static void append_devices(DBusMessageIter *entry) dbus_message_iter_open_container(&value, DBUS_TYPE_ARRAY, DBUS_TYPE_OBJECT_PATH_AS_STRING, &iter); - __connman_element_list(NULL, CONNMAN_ELEMENT_TYPE_DEVICE, &iter); - dbus_message_iter_close_container(&value, &iter); dbus_message_iter_close_container(entry, &value); @@ -1645,6 +1677,29 @@ static void emit_devices_signal(DBusConnection *conn) g_dbus_send_message(conn, signal); } +static void emit_networks_signal(DBusConnection *conn, + struct connman_element *device) +{ + DBusMessage *signal; + DBusMessageIter entry; + + DBG("conn %p", conn); + + if (device == NULL) + return; + + signal = dbus_message_new_signal(device->path, + CONNMAN_DEVICE_INTERFACE, "PropertyChanged"); + if (signal == NULL) + return; + + dbus_message_iter_init_append(signal, &entry); + + append_networks(device, &entry); + + g_dbus_send_message(conn, signal); +} + static void append_connections(DBusMessageIter *entry) { DBusMessageIter value, iter; @@ -1658,9 +1713,7 @@ static void append_connections(DBusMessageIter *entry) dbus_message_iter_open_container(&value, DBUS_TYPE_ARRAY, DBUS_TYPE_OBJECT_PATH_AS_STRING, &iter); - __connman_element_list(NULL, CONNMAN_ELEMENT_TYPE_CONNECTION, &iter); - dbus_message_iter_close_container(&value, &iter); dbus_message_iter_close_container(entry, &value); @@ -1694,9 +1747,7 @@ static void append_state(DBusMessageIter *entry, const char *state) dbus_message_iter_open_container(entry, DBUS_TYPE_VARIANT, DBUS_TYPE_STRING_AS_STRING, &value); - dbus_message_iter_append_basic(&value, DBUS_TYPE_STRING, &state); - dbus_message_iter_close_container(entry, &value); } @@ -1719,6 +1770,20 @@ static void emit_state_change(DBusConnection *conn, const char *state) g_dbus_send_message(conn, signal); } +static void set_signal_strength(struct connman_element *connection) +{ + struct connman_element *element = connection; + + while (element != NULL) { + if (element->type == CONNMAN_ELEMENT_TYPE_NETWORK) { + connection->strength = element->strength; + break; + } + + element = element->parent; + } +} + static void register_element(gpointer data, gpointer user_data) { struct connman_element *element = data; @@ -1726,8 +1791,6 @@ static void register_element(gpointer data, gpointer user_data) GSList *list; GNode *node; - g_static_rw_lock_writer_lock(&element_lock); - __connman_element_lock(element); if (element->parent) { @@ -1756,14 +1819,6 @@ static void register_element(gpointer data, gpointer user_data) g_node_append_data(node, element); -#if 0 - if (g_dbus_register_interface(connection, element->path, - CONNMAN_ELEMENT_INTERFACE, - element_methods, element_signals, - NULL, element, NULL) == FALSE) - connman_error("Failed to register %s element", element->path); -#endif - if (element->type == CONNMAN_ELEMENT_TYPE_DEVICE && element->subtype != CONNMAN_ELEMENT_SUBTYPE_NETWORK) { if (g_dbus_register_interface(connection, element->path, @@ -1783,6 +1838,8 @@ static void register_element(gpointer data, gpointer user_data) NULL, element, NULL) == FALSE) connman_error("Failed to register %s network", element->path); + else + emit_networks_signal(connection, element->parent); } if (element->type == CONNMAN_ELEMENT_TYPE_CONNECTION) { @@ -1793,24 +1850,14 @@ static void register_element(gpointer data, gpointer user_data) connman_error("Failed to register %s connection", element->path); else { + set_signal_strength(element); emit_connections_signal(connection); emit_state_change(connection, "online"); } } -#if 0 - g_dbus_emit_signal(connection, CONNMAN_MANAGER_PATH, - CONNMAN_MANAGER_INTERFACE, "ElementAdded", - DBUS_TYPE_OBJECT_PATH, &element->path, - DBUS_TYPE_INVALID); -#endif - - g_static_rw_lock_writer_unlock(&element_lock); - __connman_element_store(element); - g_static_rw_lock_writer_lock(&element_lock); - for (list = driver_list; list; list = list->next) { struct connman_driver *driver = list->data; @@ -1828,8 +1875,6 @@ static void register_element(gpointer data, gpointer user_data) break; } } - - g_static_rw_lock_writer_unlock(&element_lock); } /** @@ -1850,7 +1895,8 @@ int connman_element_register(struct connman_element *element, if (element->devname == NULL) element->devname = g_strdup(element->name); - if (device_filter && element->type == CONNMAN_ELEMENT_TYPE_DEVICE) { + if (device_filter && element->type == CONNMAN_ELEMENT_TYPE_DEVICE && + element->subtype != CONNMAN_ELEMENT_SUBTYPE_NETWORK) { if (g_pattern_match_simple(device_filter, element->devname) == FALSE) { DBG("ignoring %s [%s] device", element->name, @@ -1892,6 +1938,8 @@ static gboolean remove_element(GNode *node, gpointer user_data) return FALSE; if (element->driver) { + disable_element(element); + if (element->driver->remove) element->driver->remove(element); @@ -1905,13 +1953,6 @@ static gboolean remove_element(GNode *node, gpointer user_data) g_node_destroy(node); } -#if 0 - g_dbus_emit_signal(connection, CONNMAN_MANAGER_PATH, - CONNMAN_MANAGER_INTERFACE, "ElementRemoved", - DBUS_TYPE_OBJECT_PATH, &element->path, - DBUS_TYPE_INVALID); -#endif - if (element->type == CONNMAN_ELEMENT_TYPE_CONNECTION) { emit_state_change(connection, "offline"); emit_connections_signal(connection); @@ -1920,9 +1961,12 @@ static gboolean remove_element(GNode *node, gpointer user_data) CONNMAN_CONNECTION_INTERFACE); } - if (element->type == CONNMAN_ELEMENT_TYPE_NETWORK) + if (element->type == CONNMAN_ELEMENT_TYPE_NETWORK) { + emit_networks_signal(connection, element->parent); + g_dbus_unregister_interface(connection, element->path, CONNMAN_NETWORK_INTERFACE); + } if (element->type == CONNMAN_ELEMENT_TYPE_DEVICE && element->subtype != CONNMAN_ELEMENT_SUBTYPE_NETWORK) { @@ -1932,11 +1976,6 @@ static gboolean remove_element(GNode *node, gpointer user_data) CONNMAN_DEVICE_INTERFACE); } -#if 0 - g_dbus_unregister_interface(connection, element->path, - CONNMAN_ELEMENT_INTERFACE); -#endif - connman_element_unref(element); return FALSE; @@ -1948,15 +1987,11 @@ void connman_element_unregister(struct connman_element *element) DBG("element %p name %s", element, element->name); - g_static_rw_lock_writer_lock(&element_lock); - node = g_node_find(element_root, G_PRE_ORDER, G_TRAVERSE_ALL, element); if (node != NULL) g_node_traverse(node, G_POST_ORDER, G_TRAVERSE_ALL, -1, remove_element, NULL); - - g_static_rw_lock_writer_unlock(&element_lock); } void connman_element_unregister_children(struct connman_element *element) @@ -1965,32 +2000,31 @@ void connman_element_unregister_children(struct connman_element *element) DBG("element %p name %s", element, element->name); - g_static_rw_lock_writer_lock(&element_lock); - node = g_node_find(element_root, G_PRE_ORDER, G_TRAVERSE_ALL, element); if (node != NULL) g_node_traverse(node, G_POST_ORDER, G_TRAVERSE_ALL, -1, remove_element, element); - - g_static_rw_lock_writer_unlock(&element_lock); } static gboolean update_element(GNode *node, gpointer user_data) { struct connman_element *element = node->data; + struct connman_element *root = user_data; DBG("element %p name %s", element, element->name); if (element->driver && element->driver->update) element->driver->update(element); -#if 0 - g_dbus_emit_signal(connection, CONNMAN_MANAGER_PATH, - CONNMAN_MANAGER_INTERFACE, "ElementUpdated", - DBUS_TYPE_OBJECT_PATH, &element->path, - DBUS_TYPE_INVALID); -#endif + if (element->type == CONNMAN_ELEMENT_TYPE_CONNECTION && + root->type == CONNMAN_ELEMENT_TYPE_NETWORK) { + if (element->strength != root->strength) { + element->strength = root->strength; + emit_property_changed(connection, element, "Strength", + DBUS_TYPE_BYTE, &element->strength); + } + } return FALSE; } @@ -2001,15 +2035,11 @@ void connman_element_update(struct connman_element *element) DBG("element %p name %s", element, element->name); - g_static_rw_lock_reader_lock(&element_lock); - node = g_node_find(element_root, G_PRE_ORDER, G_TRAVERSE_ALL, element); if (node != NULL) g_node_traverse(node, G_PRE_ORDER, - G_TRAVERSE_ALL, -1, update_element, NULL); - - g_static_rw_lock_reader_unlock(&element_lock); + G_TRAVERSE_ALL, -1, update_element, element); } int connman_element_set_enabled(struct connman_element *element, @@ -2020,7 +2050,7 @@ int connman_element_set_enabled(struct connman_element *element, element->enabled = enabled; - connman_element_update(element); + emit_enabled_signal(connection, element); return 0; } @@ -2037,8 +2067,6 @@ int __connman_element_init(DBusConnection *conn, const char *device) device_filter = g_strdup(device); - g_static_rw_lock_writer_lock(&element_lock); - element = connman_element_create("root"); element->path = g_strdup("/"); @@ -2048,8 +2076,6 @@ int __connman_element_init(DBusConnection *conn, const char *device) element_root = g_node_new(element); - g_static_rw_lock_writer_unlock(&element_lock); - __connman_device_init(); return 0; @@ -2062,6 +2088,8 @@ static gboolean free_driver(GNode *node, gpointer data) DBG("element %p name %s", element, element->name); if (element->driver) { + disable_element(element); + if (element->driver->remove) element->driver->remove(element); @@ -2091,20 +2119,14 @@ void __connman_element_cleanup(void) __connman_device_cleanup(); - g_static_rw_lock_writer_lock(&element_lock); g_node_traverse(element_root, G_POST_ORDER, G_TRAVERSE_ALL, -1, free_driver, NULL); - g_static_rw_lock_writer_unlock(&element_lock); - g_static_rw_lock_writer_lock(&element_lock); g_node_traverse(element_root, G_POST_ORDER, G_TRAVERSE_ALL, -1, free_node, NULL); - g_static_rw_lock_writer_unlock(&element_lock); - g_static_rw_lock_writer_lock(&element_lock); g_node_destroy(element_root); element_root = NULL; - g_static_rw_lock_writer_unlock(&element_lock); g_free(device_filter);