Add support for technology interface
[framework/connectivity/connman.git] / src / device.c
index 8c0417d..c78e421 100644 (file)
@@ -2,7 +2,7 @@
  *
  *  Connection Manager
  *
- *  Copyright (C) 2007-2009  Intel Corporation. All rights reserved.
+ *  Copyright (C) 2007-2010  Intel Corporation. All rights reserved.
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License version 2 as
@@ -252,7 +252,7 @@ static int set_powered(struct connman_device *device, connman_bool_t powered)
        return err;
 }
 
-void __connman_device_list(DBusMessageIter *iter)
+void __connman_device_list(DBusMessageIter *iter, void *user_data)
 {
        __connman_element_list(NULL, CONNMAN_ELEMENT_TYPE_DEVICE, iter);
 }
@@ -266,24 +266,11 @@ static void append_path(gpointer key, gpointer value, gpointer user_data)
                                                        &element->path);
 }
 
-static void append_networks(struct connman_device *device,
-                                               DBusMessageIter *entry)
+static void append_networks(DBusMessageIter *iter, void *user_data)
 {
-       DBusMessageIter value, iter;
-       const char *key = "Networks";
-
-       dbus_message_iter_append_basic(entry, DBUS_TYPE_STRING, &key);
-
-       dbus_message_iter_open_container(entry, DBUS_TYPE_VARIANT,
-               DBUS_TYPE_ARRAY_AS_STRING DBUS_TYPE_OBJECT_PATH_AS_STRING,
-                                                               &value);
-
-       dbus_message_iter_open_container(&value, DBUS_TYPE_ARRAY,
-                               DBUS_TYPE_OBJECT_PATH_AS_STRING, &iter);
-       g_hash_table_foreach(device->networks, append_path, &iter);
-       dbus_message_iter_close_container(&value, &iter);
+       struct connman_device *device = user_data;
 
-       dbus_message_iter_close_container(entry, &value);
+       g_hash_table_foreach(device->networks, append_path, iter);
 }
 
 static DBusMessage *get_properties(DBusConnection *conn,
@@ -291,7 +278,7 @@ static DBusMessage *get_properties(DBusConnection *conn,
 {
        struct connman_device *device = data;
        DBusMessage *reply;
-       DBusMessageIter array, dict, entry;
+       DBusMessageIter array, dict;
        const char *str;
 
        DBG("conn %p", conn);
@@ -309,27 +296,27 @@ static DBusMessage *get_properties(DBusConnection *conn,
        connman_dbus_dict_open(&array, &dict);
 
        if (device->name != NULL)
-               connman_dbus_dict_append_variant(&dict, "Name",
+               connman_dbus_dict_append_basic(&dict, "Name",
                                        DBUS_TYPE_STRING, &device->name);
 
        str = type2string(device->type);
        if (str != NULL)
-               connman_dbus_dict_append_variant(&dict, "Type",
+               connman_dbus_dict_append_basic(&dict, "Type",
                                                DBUS_TYPE_STRING, &str);
 
        if (device->address != NULL)
-               connman_dbus_dict_append_variant(&dict, "Address",
+               connman_dbus_dict_append_basic(&dict, "Address",
                                        DBUS_TYPE_STRING, &device->address);
 
        if (device->interface != NULL)
-               connman_dbus_dict_append_variant(&dict, "Interface",
+               connman_dbus_dict_append_basic(&dict, "Interface",
                                        DBUS_TYPE_STRING, &device->interface);
 
-       connman_dbus_dict_append_variant(&dict, "Powered",
+       connman_dbus_dict_append_basic(&dict, "Powered",
                                        DBUS_TYPE_BOOLEAN, &device->powered);
 
        if (device->driver && device->driver->scan)
-               connman_dbus_dict_append_variant(&dict, "Scanning",
+               connman_dbus_dict_append_basic(&dict, "Scanning",
                                        DBUS_TYPE_BOOLEAN, &device->scanning);
 
        switch (device->mode) {
@@ -338,13 +325,11 @@ static DBusMessage *get_properties(DBusConnection *conn,
        case CONNMAN_DEVICE_MODE_NETWORK_SINGLE:
        case CONNMAN_DEVICE_MODE_NETWORK_MULTIPLE:
                if (device->scan_interval > 0)
-                       connman_dbus_dict_append_variant(&dict, "ScanInterval",
+                       connman_dbus_dict_append_basic(&dict, "ScanInterval",
                                DBUS_TYPE_UINT16, &device->scan_interval);
 
-               dbus_message_iter_open_container(&dict, DBUS_TYPE_DICT_ENTRY,
-                                                               NULL, &entry);
-               append_networks(device, &entry);
-               dbus_message_iter_close_container(&dict, &entry);
+               connman_dbus_dict_append_array(&dict, "Networks",
+                               DBUS_TYPE_OBJECT_PATH, append_networks, device);
                break;
        }
 
@@ -493,23 +478,6 @@ static GDBusSignalTable device_signals[] = {
        { },
 };
 
-static void emit_devices_signal(void)
-{
-       DBusMessage *signal;
-       DBusMessageIter iter;
-
-       signal = dbus_message_new_signal(CONNMAN_MANAGER_PATH,
-                               CONNMAN_MANAGER_INTERFACE, "PropertyChanged");
-       if (signal == NULL)
-               return;
-
-       dbus_message_iter_init_append(signal, &iter);
-       connman_dbus_property_append_variable_array(&iter, "Devices",
-                               DBUS_TYPE_OBJECT_PATH, __connman_device_list);
-
-       g_dbus_send_message(connection, signal);
-}
-
 static int register_interface(struct connman_element *element)
 {
        struct connman_device *device = element->device;
@@ -526,8 +494,6 @@ static int register_interface(struct connman_element *element)
 
        device->registered = TRUE;
 
-       emit_devices_signal();
-
        return 0;
 }
 
@@ -539,8 +505,6 @@ static void unregister_interface(struct connman_element *element)
 
        device->registered = FALSE;
 
-       emit_devices_signal();
-
        g_dbus_unregister_interface(connection, element->path,
                                                CONNMAN_DEVICE_INTERFACE);
 }
@@ -560,6 +524,8 @@ static int setup_device(struct connman_device *device)
                return err;
        }
 
+       __connman_technology_add_device(device);
+
        type = __connman_device_get_service_type(device);
        __connman_notifier_register(type);
 
@@ -570,6 +536,9 @@ static int setup_device(struct connman_device *device)
                break;
        }
 
+       if (__connman_udev_get_blocked(device->phyindex) == TRUE)
+               return 0;
+
        if (device->offlinemode == FALSE &&
                                device->powered_persistent == TRUE)
                __connman_device_enable(device);
@@ -618,6 +587,8 @@ static void remove_device(struct connman_device *device)
        type = __connman_device_get_service_type(device);
        __connman_notifier_unregister(type);
 
+       __connman_technology_remove_device(device);
+
        unregister_interface(&device->element);
 
        if (device->driver->remove)