__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;
+ 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)
{
element->enabled = TRUE;
+ emit_enabled_signal(connection, element);
+
#if 0
g_dbus_emit_signal(connection, CONNMAN_MANAGER_PATH,
CONNMAN_MANAGER_INTERFACE, "ElementUpdated",
element->enabled = FALSE;
+ emit_enabled_signal(connection, element);
+
#if 0
g_dbus_emit_signal(connection, CONNMAN_MANAGER_PATH,
CONNMAN_MANAGER_INTERFACE, "ElementUpdated",
}
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);
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,
{
struct connman_element *element = data;
DBusMessage *reply;
- DBusMessageIter array, dict;
+ DBusMessageIter array, dict, entry;
const char *str;
DBG("conn %p", conn);
connman_dbus_dict_append_variant(&dict, "Powered",
DBUS_TYPE_BOOLEAN, &element->enabled);
- append_networks(element, &dict);
+ 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);
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);
+ }
}
}
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);
+ }
}
}
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;
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) {
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) {