---
 src/technology.c | 52 +++++++++++++++++++++++++++++++++++++++++++---------
 1 file changed, 43 insertions(+), 9 deletions(-)

diff --git a/src/technology.c b/src/technology.c
index 3f41b96..ff0e134 100644
--- a/src/technology.c
+++ b/src/technology.c
@@ -1196,6 +1196,9 @@ int __connman_technology_remove_device(struct 
connman_device *device)
 
 static void powered_changed(struct connman_technology *technology)
 {
+       if (technology->dbus_registered == FALSE)
+               return;
+
        if (technology->pending_reply != NULL) {
                g_dbus_send_reply(connection,
                                technology->pending_reply, DBUS_TYPE_INVALID);
@@ -1233,6 +1236,9 @@ int __connman_technology_enabled(enum 
connman_service_type type)
        if (technology == NULL)
                return -ENXIO;
 
+       if (technology->rfkill_driven == TRUE)
+               return 0;
+
        return technology_enabled(technology);
 }
 
@@ -1252,11 +1258,22 @@ static int technology_disabled(struct 
connman_technology *technology)
 int __connman_technology_disabled(enum connman_service_type type)
 {
        struct connman_technology *technology;
+       GSList *list;
 
        technology = technology_find(type);
        if (technology == NULL)
                return -ENXIO;
 
+       if (technology->rfkill_driven == TRUE)
+               return 0;
+
+       for (list = technology->device_list; list != NULL; list = list->next) {
+               struct connman_device *device = list->data;
+
+               if (connman_device_get_powered(device) == TRUE)
+                       return 0;
+       }
+
        return technology_disabled(technology);
 }
 
@@ -1323,6 +1340,7 @@ static connman_bool_t 
technology_apply_rfkill_change(struct connman_technology *
                                                connman_bool_t softblock,
                                                connman_bool_t hardblock)
 {
+       gboolean hardblock_changed = FALSE;
        gboolean apply = TRUE;
        GList *start, *list;
 
@@ -1346,19 +1364,35 @@ static connman_bool_t 
technology_apply_rfkill_change(struct connman_technology *
                goto softblock_change;
 
        technology->hardblocked = hardblock;
-
-       if (hardblock == TRUE) {
-               DBG("%s is switched off.", get_name(technology->type));
-               technology_disable(technology);
-               technology_dbus_unregister(technology);
-       } else {
-               technology_enable(technology);
-               technology_dbus_register(technology);
-       }
+       hardblock_changed = TRUE;
 
 softblock_change:
+       if (apply == FALSE && technology->softblocked != softblock)
+               apply = TRUE;
+
+       if (apply == FALSE)
+               return technology->hardblocked;
+
        technology->softblocked = softblock;
 
+       if (technology->hardblocked == TRUE ||
+                                       technology->softblocked == TRUE) {
+               if (technology_disabled(technology) != -EALREADY)
+                       technology_affect_devices(technology, FALSE);
+       } else if (technology->hardblocked == FALSE &&
+                                       technology->softblocked == FALSE) {
+               if (technology_enabled(technology) != -EALREADY)
+                       technology_affect_devices(technology, TRUE);
+       }
+
+       if (hardblock_changed == TRUE) {
+               if (technology->hardblocked == TRUE) {
+                       DBG("%s is switched off.", get_name(technology->type));
+                       technology_dbus_unregister(technology);
+               } else
+                       technology_dbus_register(technology);
+       }
+
        return technology->hardblocked;
 }
 
-- 
1.7.12

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

Reply via email to