From: Daniel Wagner <[email protected]>

---
Hi, 

a very rough first version. 

cheers,
daniel

 include/element.h |    2 -
 src/connman.h     |    4 +
 src/device.c      |  294 ++++++++++++++++++++++++++++++++-----------------
 src/element.c     |  316 -----------------------------------------------------
 src/manager.c     |    6 +-
 src/service.c     |    6 +-
 6 files changed, 201 insertions(+), 427 deletions(-)

diff --git a/include/element.h b/include/element.h
index 2e944d3..dea672d 100644
--- a/include/element.h
+++ b/include/element.h
@@ -42,7 +42,6 @@ extern "C" {
 enum connman_element_type {
        CONNMAN_ELEMENT_TYPE_UNKNOWN    = 0,
        CONNMAN_ELEMENT_TYPE_ROOT       = 1,
-       CONNMAN_ELEMENT_TYPE_DEVICE     = 3,
        CONNMAN_ELEMENT_TYPE_NETWORK    = 4,
 };
 
@@ -81,7 +80,6 @@ struct connman_element {
 
        union {
                void *private;
-               struct connman_device *device;
                struct connman_network *network;
        };
 
diff --git a/src/connman.h b/src/connman.h
index 883051f..af4f6d7 100644
--- a/src/connman.h
+++ b/src/connman.h
@@ -368,6 +368,10 @@ void __connman_device_cleanup(void);
 void __connman_device_list(DBusMessageIter *iter, void *user_data);
 
 enum connman_service_type __connman_device_get_service_type(struct 
connman_device *device);
+struct connman_device *__connman_device_find_device(enum connman_service_type 
type);
+int __connman_device_request_scan(enum connman_service_type type);
+int __connman_device_enable_technology(enum connman_service_type type);
+int __connman_device_disable_technology(enum connman_service_type type);
 
 int __connman_device_get_phyindex(struct connman_device *device);
 void __connman_device_set_phyindex(struct connman_device *device,
diff --git a/src/device.c b/src/device.c
index a9f4330..75e05ee 100644
--- a/src/device.c
+++ b/src/device.c
@@ -28,7 +28,10 @@
 
 #include "connman.h"
 
+static GSList *device_list = NULL;
+
 struct connman_device {
+       gint refcount;
        struct connman_element element;
        enum connman_device_type type;
        connman_bool_t offlinemode;
@@ -308,29 +311,28 @@ static int setup_device(struct connman_device *device)
        return 0;
 }
 
-static void probe_driver(struct connman_element *element, gpointer user_data)
+static void probe_driver(struct connman_device_driver *driver)
 {
-       struct connman_device_driver *driver = user_data;
+       GSList *list;
 
-       DBG("element %p name %s", element, element->name);
+       DBG("driver %p name %s", driver, driver->name);
 
-       if (element->device == NULL)
-               return;
+       for (list = device_list; list != NULL; list = list->next) {
+               struct connman_device *device = list->data;
 
-       if (element->device->driver != NULL)
-               return;
-
-       if (driver->type != element->device->type)
-               return;
+               if (device->driver != NULL)
+                       continue;
 
-       if (driver->probe(element->device) < 0)
-               return;
+               if (driver->type != device->type)
+                       continue;
 
-       element->device->driver = driver;
+               if (driver->probe(device) < 0)
+                       continue;
 
-       __connman_element_set_driver(element);
+               device->driver = driver;
 
-       setup_device(element->device);
+               setup_device(device);
+       }
 }
 
 static void remove_device(struct connman_device *device)
@@ -347,17 +349,18 @@ static void remove_device(struct connman_device *device)
        device->driver = NULL;
 }
 
-static void remove_driver(struct connman_element *element, gpointer user_data)
+static void remove_driver(struct connman_device_driver *driver)
 {
-       struct connman_device_driver *driver = user_data;
+       GSList *list;
 
-       DBG("element %p name %s", element, element->name);
+       DBG("driver %p name %s", driver, driver->name);
 
-       if (element->device == NULL)
-               return;
+       for (list = device_list; list != NULL; list = list->next) {
+               struct connman_device *device = list->data;
 
-       if (element->device->driver == driver)
-               remove_device(element->device);
+               if (device->driver == driver)
+                       remove_device(device);
+       }
 }
 
 connman_bool_t __connman_device_has_driver(struct connman_device *device)
@@ -392,9 +395,7 @@ int connman_device_driver_register(struct 
connman_device_driver *driver)
 
        driver_list = g_slist_insert_sorted(driver_list, driver,
                                                        compare_priority);
-
-       __connman_element_foreach(NULL, CONNMAN_ELEMENT_TYPE_DEVICE,
-                                               probe_driver, driver);
+       probe_driver(driver);
 
        return 0;
 }
@@ -411,8 +412,7 @@ void connman_device_driver_unregister(struct 
connman_device_driver *driver)
 
        driver_list = g_slist_remove(driver_list, driver);
 
-       __connman_element_foreach(NULL, CONNMAN_ELEMENT_TYPE_DEVICE,
-                                               remove_driver, driver);
+       remove_driver(driver);
 }
 
 static void unregister_network(gpointer data)
@@ -428,11 +428,9 @@ static void unregister_network(gpointer data)
        connman_network_unref(network);
 }
 
-static void device_destruct(struct connman_element *element)
+static void device_destruct(struct connman_device *device)
 {
-       struct connman_device *device = element->device;
-
-       DBG("element %p name %s", element, element->name);
+       DBG("device %p name %s", device, device->name);
 
        clear_scan_trigger(device);
 
@@ -447,6 +445,8 @@ static void device_destruct(struct connman_element *element)
 
        g_hash_table_destroy(device->networks);
        device->networks = NULL;
+
+       g_free(device);
 }
 
 /**
@@ -462,7 +462,6 @@ struct connman_device *connman_device_create(const char 
*node,
                                                enum connman_device_type type)
 {
        struct connman_device *device;
-       const char *str;
        enum connman_service_type service_type;
        connman_bool_t bg_scan;
 
@@ -474,21 +473,12 @@ struct connman_device *connman_device_create(const char 
*node,
 
        DBG("device %p", device);
 
+       device->refcount = 1;
+
        bg_scan = connman_setting_get_bool("BackgroundScanning");
 
        __connman_element_initialize(&device->element);
 
-       device->element.name = g_strdup(node);
-       device->element.type = CONNMAN_ELEMENT_TYPE_DEVICE;
-
-       device->element.device = device;
-       device->element.destruct = device_destruct;
-
-       str = type2string(type);
-       if (str != NULL)
-               connman_element_set_string(&device->element,
-                                       CONNMAN_PROPERTY_ID_TYPE, str);
-
        device->type = type;
        device->name = g_strdup(type2description(device->type));
 
@@ -522,6 +512,8 @@ struct connman_device *connman_device_create(const char 
*node,
        device->networks = g_hash_table_new_full(g_str_hash, g_str_equal,
                                                g_free, unregister_network);
 
+       device_list = g_slist_append(device_list, device);
+
        return device;
 }
 
@@ -533,8 +525,9 @@ struct connman_device *connman_device_create(const char 
*node,
  */
 struct connman_device *connman_device_ref(struct connman_device *device)
 {
-       if (connman_element_ref(&device->element) == NULL)
-               return NULL;
+       DBG("%p", device);
+
+       g_atomic_int_inc(&device->refcount);
 
        return device;
 }
@@ -547,7 +540,8 @@ struct connman_device *connman_device_ref(struct 
connman_device *device)
  */
 void connman_device_unref(struct connman_device *device)
 {
-       connman_element_unref(&device->element);
+       if (g_atomic_int_dec_and_test(&device->refcount) == TRUE)
+               device_destruct(device);
 }
 
 const char *__connman_device_get_type(struct connman_device *device)
@@ -806,7 +800,7 @@ int __connman_device_disconnect(struct connman_device 
*device)
 }
 
 static void mark_network_available(gpointer key, gpointer value,
-                                                        gpointer user_data)
+                                                       gpointer user_data)
 {
        struct connman_network *network = value;
 
@@ -989,13 +983,12 @@ const char *connman_device_get_string(struct 
connman_device *device,
        return NULL;
 }
 
-static void set_offlinemode(struct connman_element *element, gpointer 
user_data)
+static void set_offlinemode(struct connman_device *device,
+                               connman_bool_t offlinemode)
 {
-       struct connman_device *device = element->device;
-       connman_bool_t offlinemode = GPOINTER_TO_UINT(user_data);
        connman_bool_t powered;
 
-       DBG("element %p name %s", element, element->name);
+       DBG("device %p name %s", device, device->name);
 
        if (device == NULL)
                return;
@@ -1018,10 +1011,15 @@ static void set_offlinemode(struct connman_element 
*element, gpointer user_data)
 
 int __connman_device_set_offlinemode(connman_bool_t offlinemode)
 {
+       GSList *list;
+
        DBG("offlinmode %d", offlinemode);
 
-       __connman_element_foreach(NULL, CONNMAN_ELEMENT_TYPE_DEVICE,
-                       set_offlinemode, GUINT_TO_POINTER(offlinemode));
+       for (list = device_list; list != NULL; list = list->next) {
+               struct connman_device *device = list->data;
+
+               set_offlinemode(device, offlinemode);
+       }
 
        __connman_notifier_offlinemode(offlinemode);
 
@@ -1158,6 +1156,55 @@ connman_bool_t  __connman_device_get_reconnect(
        return device->reconnect;
 }
 
+static gboolean match_driver(struct connman_device *device,
+                                       struct connman_device_driver *driver)
+{
+       if (device->type == driver->type ||
+                       driver->type == CONNMAN_DEVICE_TYPE_UNKNOWN)
+               return TRUE;
+
+       return FALSE;
+}
+
+static int device_probe(struct connman_device *device)
+{
+       GSList *list;
+
+       DBG("device %p name %s", device, device->name);
+
+       if (device->driver != NULL)
+               return -EALREADY;
+
+       for (list = driver_list; list; list = list->next) {
+               struct connman_device_driver *driver = list->data;
+
+               if (match_driver(device, driver) == FALSE)
+                       continue;
+
+               DBG("driver %p name %s", driver, driver->name);
+
+               if (driver->probe(device) == 0) {
+                       device->driver = driver;
+                       break;
+               }
+       }
+
+       if (device->driver == NULL)
+               return -ENODEV;
+
+       return setup_device(device);
+}
+
+static void device_remove(struct connman_device *device)
+{
+       DBG("device %p name %s", device, device->name);
+
+       if (device->driver == NULL)
+               return;
+
+       remove_device(device);
+}
+
 /**
  * connman_device_register:
  * @device: device structure
@@ -1170,7 +1217,7 @@ int connman_device_register(struct connman_device *device)
 
        device->offlinemode = __connman_profile_get_offlinemode();
 
-       return connman_element_register(&device->element, NULL);
+       return device_probe(device);
 }
 
 /**
@@ -1183,7 +1230,7 @@ void connman_device_unregister(struct connman_device 
*device)
 {
        __connman_storage_save_device(device);
 
-       connman_element_unregister(&device->element);
+       device_remove(device);
 }
 
 /**
@@ -1209,71 +1256,117 @@ void connman_device_set_data(struct connman_device 
*device, void *data)
        device->driver_data = data;
 }
 
-static gboolean match_driver(struct connman_device *device,
-                                       struct connman_device_driver *driver)
+struct connman_device *__connman_device_find_device(
+                               enum connman_service_type type)
 {
-       if (device->type == driver->type ||
-                       driver->type == CONNMAN_DEVICE_TYPE_UNKNOWN)
-               return TRUE;
+       GSList *list;
 
-       return FALSE;
+       for (list = device_list; list != NULL; list = list->data) {
+               struct connman_device *device = list->data;
+
+               if (__connman_device_get_service_type(device) != type)
+                       continue;
+
+               return device;
+       }
+
+       return NULL;
 }
 
-static int device_probe(struct connman_element *element)
+int __connman_device_request_scan(enum connman_service_type type)
 {
-       struct connman_device *device = element->device;
        GSList *list;
+       int err;
 
-       DBG("element %p name %s", element, element->name);
-
-       if (device == NULL)
-               return -ENODEV;
-
-       if (device->driver != NULL)
-               return -EALREADY;
+       switch (type) {
+       case CONNMAN_SERVICE_TYPE_UNKNOWN:
+       case CONNMAN_SERVICE_TYPE_SYSTEM:
+       case CONNMAN_SERVICE_TYPE_ETHERNET:
+       case CONNMAN_SERVICE_TYPE_BLUETOOTH:
+       case CONNMAN_SERVICE_TYPE_CELLULAR:
+       case CONNMAN_SERVICE_TYPE_GPS:
+       case CONNMAN_SERVICE_TYPE_VPN:
+       case CONNMAN_SERVICE_TYPE_GADGET:
+               return 0;
+       case CONNMAN_SERVICE_TYPE_WIFI:
+       case CONNMAN_SERVICE_TYPE_WIMAX:
+               break;
+       }
 
-       for (list = driver_list; list; list = list->next) {
-               struct connman_device_driver *driver = list->data;
+       for (list = device_list; list != NULL; list = list->data) {
+               struct connman_device *device = list->data;
+               enum connman_service_type device_type =
+                       __connman_device_get_service_type(device);
 
-               if (match_driver(device, driver) == FALSE)
+               if (device_type != CONNMAN_SERVICE_TYPE_UNKNOWN &&
+                               device_type != type) {
                        continue;
+               }
 
-               DBG("driver %p name %s", driver, driver->name);
-
-               if (driver->probe(device) == 0) {
-                       device->driver = driver;
-                       break;
+               err = __connman_device_scan(device);
+               if (err < 0 && err != -EINPROGRESS) {
+                       /* XXX maybe only a continue? */
+                       return err;
                }
        }
 
-       if (device->driver == NULL)
-               return -ENODEV;
-
-       return setup_device(device);
+       return 0;
 }
 
-static void device_remove(struct connman_element *element)
+static int set_technology(enum connman_service_type type, connman_bool_t 
enable)
 {
-       struct connman_device *device = element->device;
+       GSList *list;
+       int err;
 
-       DBG("element %p name %s", element, element->name);
+       switch (type) {
+       case CONNMAN_SERVICE_TYPE_UNKNOWN:
+       case CONNMAN_SERVICE_TYPE_SYSTEM:
+       case CONNMAN_SERVICE_TYPE_GPS:
+       case CONNMAN_SERVICE_TYPE_VPN:
+       case CONNMAN_SERVICE_TYPE_GADGET:
+               return 0;
+       case CONNMAN_SERVICE_TYPE_ETHERNET:
+       case CONNMAN_SERVICE_TYPE_WIFI:
+       case CONNMAN_SERVICE_TYPE_WIMAX:
+       case CONNMAN_SERVICE_TYPE_BLUETOOTH:
+       case CONNMAN_SERVICE_TYPE_CELLULAR:
+               break;
+       }
 
-       if (device == NULL)
-               return;
+       for (list = device_list; list != NULL; list = list->data) {
+               struct connman_device *device = list->data;
+               enum connman_service_type device_type =
+                       __connman_device_get_service_type(device);
 
-       if (device->driver == NULL)
-               return;
+               if (device_type != CONNMAN_SERVICE_TYPE_UNKNOWN &&
+                               device_type != type) {
+                       continue;
+               }
 
-       remove_device(device);
+               if (enable == TRUE)
+                       err = __connman_device_enable_persistent(device);
+               else
+                       err = __connman_device_disable_persistent(device);
+
+               if (err < 0 && err != -EINPROGRESS) {
+                       /* XXX maybe only a continue? */
+                       return err;
+               }
+       }
+
+       return 0;
 }
 
-static struct connman_driver device_driver = {
-       .name           = "device",
-       .type           = CONNMAN_ELEMENT_TYPE_DEVICE,
-       .priority       = CONNMAN_DRIVER_PRIORITY_LOW,
-       .probe          = device_probe,
-       .remove         = device_remove,
-};
+int __connman_device_enable_technology(enum connman_service_type type)
+{
+
+       return set_technology(type, TRUE);
+}
+
+int __connman_device_disable_technology(enum connman_service_type type)
+{
+       return set_technology(type, FALSE);
+}
 
 static int device_load(struct connman_device *device)
 {
@@ -1345,17 +1438,12 @@ int __connman_device_init(void)
 {
        DBG("");
 
-       if (connman_storage_register(&device_storage) < 0)
-               connman_error("Failed to register device storage");
-
-       return connman_driver_register(&device_driver);
+       return connman_storage_register(&device_storage);
 }
 
 void __connman_device_cleanup(void)
 {
        DBG("");
 
-       connman_driver_unregister(&device_driver);
-
        connman_storage_unregister(&device_storage);
 }
diff --git a/src/element.c b/src/element.c
index 0d796fa..119fb29 100644
--- a/src/element.c
+++ b/src/element.c
@@ -48,8 +48,6 @@ static const char *type2string(enum connman_element_type type)
                return "unknown";
        case CONNMAN_ELEMENT_TYPE_ROOT:
                return "root";
-       case CONNMAN_ELEMENT_TYPE_DEVICE:
-               return "device";
        case CONNMAN_ELEMENT_TYPE_NETWORK:
                return "network";
        }
@@ -123,10 +121,6 @@ static gboolean append_path(GNode *node, gpointer 
user_data)
                                        filter->type != element->type)
                return FALSE;
 
-       if (filter->type == CONNMAN_ELEMENT_TYPE_DEVICE &&
-                       __connman_device_has_driver(element->device) == FALSE)
-               return FALSE;
-
        if (filter->type == CONNMAN_ELEMENT_TYPE_NETWORK &&
                        __connman_network_has_driver(element->network) == FALSE)
                return FALSE;
@@ -158,255 +152,6 @@ void __connman_element_list(struct connman_element 
*element,
                                                append_path, &filter);
 }
 
-static struct connman_network *get_network(struct connman_element *element)
-{
-       if (element->type == CONNMAN_ELEMENT_TYPE_NETWORK &&
-                                               element->network != NULL)
-               return element->network;
-
-       if (element->parent == NULL)
-               return NULL;
-
-       return get_network(element->parent);
-}
-
-struct connman_service *__connman_element_get_service(struct connman_element 
*element)
-{
-       struct connman_service *service = NULL;
-       struct connman_network *network;
-       struct connman_device *device;
-       enum connman_device_type type;
-
-       device = __connman_element_get_device(element);
-       if (device == NULL) {
-               /* Workaround for the connection removal. */
-               service = __connman_service_lookup_from_index(element->index);
-               return service;
-       }
-
-       type = connman_device_get_type(device);
-
-       switch (type) {
-       case CONNMAN_DEVICE_TYPE_UNKNOWN:
-       case CONNMAN_DEVICE_TYPE_VENDOR:
-       case CONNMAN_DEVICE_TYPE_GPS:
-       case CONNMAN_DEVICE_TYPE_GADGET:
-               break;
-       case CONNMAN_DEVICE_TYPE_ETHERNET:
-       case CONNMAN_DEVICE_TYPE_WIFI:
-       case CONNMAN_DEVICE_TYPE_WIMAX:
-       case CONNMAN_DEVICE_TYPE_BLUETOOTH:
-       case CONNMAN_DEVICE_TYPE_CELLULAR:
-               network = get_network(element);
-               if (network == NULL)
-                       return NULL;
-               service = __connman_service_lookup_from_network(network);
-               break;
-       }
-
-       return service;
-}
-
-struct connman_device *__connman_element_get_device(struct connman_element 
*element)
-{
-       if (element->type == CONNMAN_ELEMENT_TYPE_DEVICE &&
-                                               element->device != NULL)
-               return element->device;
-
-       if (element->parent == NULL)
-               return NULL;
-
-       return __connman_element_get_device(element->parent);
-}
-
-struct find_data {
-       enum connman_service_type type;
-       struct connman_device *device;
-       connman_bool_t error;
-};
-
-static gboolean find_device(GNode *node, gpointer user_data)
-{
-       struct connman_element *element = node->data;
-       struct find_data *data = user_data;
-
-       if (element->type != CONNMAN_ELEMENT_TYPE_DEVICE)
-               return FALSE;
-
-       if (element->device == NULL)
-               return FALSE;
-
-       if (data->type != __connman_device_get_service_type(element->device))
-               return FALSE;
-
-       data->device = element->device;
-
-       return TRUE;
-}
-
-struct connman_device *__connman_element_find_device(enum connman_service_type 
type)
-{
-       struct find_data data = { .type = type, .device = NULL };
-
-       g_node_traverse(element_root, G_PRE_ORDER,
-                               G_TRAVERSE_ALL, -1, find_device, &data);
-
-       return data.device;
-}
-
-static gboolean request_scan(GNode *node, gpointer user_data)
-{
-       struct connman_element *element = node->data;
-       struct find_data *data = user_data;
-       enum connman_service_type type;
-
-       if (element->type != CONNMAN_ELEMENT_TYPE_DEVICE)
-               return FALSE;
-
-       if (element->device == NULL)
-               return FALSE;
-
-       type = __connman_device_get_service_type(element->device);
-
-       switch (type) {
-       case CONNMAN_SERVICE_TYPE_UNKNOWN:
-       case CONNMAN_SERVICE_TYPE_SYSTEM:
-       case CONNMAN_SERVICE_TYPE_ETHERNET:
-       case CONNMAN_SERVICE_TYPE_BLUETOOTH:
-       case CONNMAN_SERVICE_TYPE_CELLULAR:
-       case CONNMAN_SERVICE_TYPE_GPS:
-       case CONNMAN_SERVICE_TYPE_VPN:
-       case CONNMAN_SERVICE_TYPE_GADGET:
-               return FALSE;
-       case CONNMAN_SERVICE_TYPE_WIFI:
-       case CONNMAN_SERVICE_TYPE_WIMAX:
-               if (data->type != CONNMAN_SERVICE_TYPE_UNKNOWN &&
-                                                       data->type != type)
-                       return FALSE;
-               break;
-       }
-
-       __connman_device_scan(element->device);
-
-       return FALSE;
-}
-
-int __connman_element_request_scan(enum connman_service_type type)
-{
-       struct find_data data = { .type = type, .device = NULL };
-
-       g_node_traverse(element_root, G_PRE_ORDER,
-                               G_TRAVERSE_ALL, -1, request_scan, &data);
-
-       return 0;
-}
-
-static gboolean enable_technology(GNode *node, gpointer user_data)
-{
-       struct connman_element *element = node->data;
-       struct find_data *data = user_data;
-       enum connman_service_type type;
-       int err;
-
-       if (element->type != CONNMAN_ELEMENT_TYPE_DEVICE)
-               return FALSE;
-
-       if (element->device == NULL)
-               return FALSE;
-
-       type = __connman_device_get_service_type(element->device);
-
-       switch (type) {
-       case CONNMAN_SERVICE_TYPE_UNKNOWN:
-       case CONNMAN_SERVICE_TYPE_SYSTEM:
-       case CONNMAN_SERVICE_TYPE_GPS:
-       case CONNMAN_SERVICE_TYPE_VPN:
-       case CONNMAN_SERVICE_TYPE_GADGET:
-               return FALSE;
-       case CONNMAN_SERVICE_TYPE_ETHERNET:
-       case CONNMAN_SERVICE_TYPE_WIFI:
-       case CONNMAN_SERVICE_TYPE_WIMAX:
-       case CONNMAN_SERVICE_TYPE_BLUETOOTH:
-       case CONNMAN_SERVICE_TYPE_CELLULAR:
-               if (data->type != CONNMAN_SERVICE_TYPE_UNKNOWN &&
-                                                       data->type != type)
-                       return FALSE;
-               break;
-       }
-
-       err = __connman_device_enable_persistent(element->device);
-       if (err == 0 || (err < 0 && err == -EINPROGRESS))
-               data->error = FALSE;
-
-       return FALSE;
-}
-
-int __connman_element_enable_technology(enum connman_service_type type)
-{
-       struct find_data data = { .type = type, .device = NULL, .error = TRUE };
-
-       g_node_traverse(element_root, G_PRE_ORDER,
-                               G_TRAVERSE_ALL, -1, enable_technology, &data);
-
-       if (data.error == TRUE)
-               return -ENODEV;
-
-       return 0;
-}
-
-static gboolean disable_technology(GNode *node, gpointer user_data)
-{
-       struct connman_element *element = node->data;
-       struct find_data *data = user_data;
-       enum connman_service_type type;
-       int err;
-
-       if (element->type != CONNMAN_ELEMENT_TYPE_DEVICE)
-               return FALSE;
-
-       if (element->device == NULL)
-               return FALSE;
-
-       type = __connman_device_get_service_type(element->device);
-
-       switch (type) {
-       case CONNMAN_SERVICE_TYPE_UNKNOWN:
-       case CONNMAN_SERVICE_TYPE_SYSTEM:
-       case CONNMAN_SERVICE_TYPE_GPS:
-       case CONNMAN_SERVICE_TYPE_VPN:
-       case CONNMAN_SERVICE_TYPE_GADGET:
-               return FALSE;
-       case CONNMAN_SERVICE_TYPE_ETHERNET:
-       case CONNMAN_SERVICE_TYPE_WIFI:
-       case CONNMAN_SERVICE_TYPE_WIMAX:
-       case CONNMAN_SERVICE_TYPE_BLUETOOTH:
-       case CONNMAN_SERVICE_TYPE_CELLULAR:
-               if (data->type != CONNMAN_SERVICE_TYPE_UNKNOWN &&
-                                                       data->type != type)
-                       return FALSE;
-               break;
-       }
-
-       err = __connman_device_disable_persistent(element->device);
-       if (err == 0 || (err < 0 && err == -EINPROGRESS))
-               data->error = FALSE;
-
-       return FALSE;
-}
-
-int __connman_element_disable_technology(enum connman_service_type type)
-{
-       struct find_data data = { .type = type, .device = NULL, .error = TRUE };
-
-       g_node_traverse(element_root, G_PRE_ORDER,
-                               G_TRAVERSE_ALL, -1, disable_technology, &data);
-
-       if (data.error == TRUE)
-               return -ENODEV;
-
-       return 0;
-}
-
 static gint compare_priority(gconstpointer a, gconstpointer b)
 {
        const struct connman_driver *driver1 = a;
@@ -988,13 +733,6 @@ int connman_element_register(struct connman_element 
*element,
        if (element->devname == NULL)
                element->devname = g_strdup(element->name);
 
-       if (element->type != CONNMAN_ELEMENT_TYPE_DEVICE)
-               goto setup;
-
-       if (__connman_element_device_isfiltered(element->devname) == TRUE)
-               return -EPERM;
-
-setup:
        if (connman_element_ref(element) == NULL)
                return -EINVAL;
 
@@ -1158,60 +896,6 @@ int connman_element_set_enabled(struct connman_element 
*element,
        return 0;
 }
 
-static enum connman_service_error convert_error(enum connman_element_error 
error)
-{
-       return CONNMAN_SERVICE_ERROR_UNKNOWN;
-}
-
-/**
- * connman_element_set_error:
- * @element: element structure
- * @error: error identifier
- *
- * Set error state and specific error identifier
- */
-void connman_element_set_error(struct connman_element *element,
-                                       enum connman_element_error error)
-{
-       struct connman_service *service;
-
-       DBG("element %p error %d", element, error);
-
-       if (element->type == CONNMAN_ELEMENT_TYPE_ROOT)
-               return;
-
-       element->state = CONNMAN_ELEMENT_STATE_ERROR;
-       element->error = error;
-
-       if (element->driver && element->driver->change)
-               element->driver->change(element);
-
-       service = __connman_element_get_service(element);
-       __connman_service_indicate_error(service, convert_error(error));
-}
-
-void __connman_element_set_driver(struct connman_element *element)
-{
-       GSList *list;
-
-       DBG("element %p name %s driver %p", element, element->name,
-                                               element->driver);
-
-       if (element->driver)
-               return;
-
-       for (list = driver_list; list; list = list->next) {
-               struct connman_driver *driver = list->data;
-
-               if (match_driver(element, driver) == FALSE)
-                       continue;
-
-               element->driver = driver;
-
-               break;
-       }
-}
-
 int __connman_element_init(const char *device, const char *nodevice)
 {
        struct connman_element *element;
diff --git a/src/manager.c b/src/manager.c
index 4fd966a..40736af 100644
--- a/src/manager.c
+++ b/src/manager.c
@@ -192,7 +192,7 @@ static DBusMessage *request_scan(DBusConnection *conn,
        else
                return __connman_error_invalid_arguments(msg);
 
-       err = __connman_element_request_scan(type);
+       err = __connman_device_request_scan(type);
        if (err < 0) {
                if (err == -EINPROGRESS) {
                        connman_error("Invalid return code from scan");
@@ -304,7 +304,7 @@ static DBusMessage *enable_technology(DBusConnection *conn,
        technology_enabled = TRUE;
        technology_pending = dbus_message_ref(msg);
 
-       err = __connman_element_enable_technology(type);
+       err = __connman_device_enable_technology(type);
        if (err < 0 && err != -EINPROGRESS)
                technology_reply(-err);
        else
@@ -352,7 +352,7 @@ static DBusMessage *disable_technology(DBusConnection *conn,
        technology_enabled = FALSE;
        technology_pending = dbus_message_ref(msg);
 
-       err = __connman_element_disable_technology(type);
+       err = __connman_device_disable_technology(type);
        if (err < 0 && err != -EINPROGRESS)
                technology_reply(-err);
        else
diff --git a/src/service.c b/src/service.c
index a7ebf05..e247cc2 100644
--- a/src/service.c
+++ b/src/service.c
@@ -3424,7 +3424,7 @@ static void report_error_cb(struct connman_service 
*service,
        else {
                service_complete(service);
                __connman_profile_changed(FALSE);
-               __connman_element_request_scan(CONNMAN_ELEMENT_TYPE_UNKNOWN);
+               __connman_device_request_scan(CONNMAN_SERVICE_TYPE_UNKNOWN);
        }
 }
 
@@ -3655,7 +3655,7 @@ int __connman_service_indicate_state(struct 
connman_service *service,
 
        if (service_state == CONNMAN_SERVICE_STATE_IDLE ||
                        service_state == CONNMAN_SERVICE_STATE_FAILURE)
-               __connman_element_request_scan(CONNMAN_ELEMENT_TYPE_UNKNOWN);
+               __connman_device_request_scan(CONNMAN_SERVICE_TYPE_UNKNOWN);
 
        return 0;
 }
@@ -4185,7 +4185,7 @@ int __connman_service_create_and_connect(DBusMessage *msg)
                                g_strcmp0(security, "ieee8021x") != 0)
                return -EINVAL;
 
-       device = __connman_element_find_device(CONNMAN_SERVICE_TYPE_WIFI);
+       device = __connman_device_find_device(CONNMAN_SERVICE_TYPE_WIFI);
        if (device == NULL)
                return -EOPNOTSUPP;
 
-- 
1.7.4.4

_______________________________________________
connman mailing list
[email protected]
http://lists.connman.net/listinfo/connman

Reply via email to