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);
if (technology == NULL)
return -ENXIO;
+ if (technology->rfkill_driven == TRUE)
+ return 0;
+
return technology_enabled(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);
}
connman_bool_t softblock,
connman_bool_t hardblock)
{
+ gboolean hardblock_changed = FALSE;
gboolean apply = TRUE;
GList *start, *list;
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;
}