static void adapter_property_change(GDBusProxy *proxy, const char *name, DBusMessageIter *iter, void *user_data) { struct connman_device *device; const char *path; bool adapter_powered, device_powered; if (strcmp(name, "Powered") != 0) return; path = g_dbus_proxy_get_path(proxy); device = g_hash_table_lookup(devices, path); adapter_powered = proxy_get_bool(proxy, "Powered"); device_powered = connman_device_get_powered(device); DBG("device %p %s device powered %d adapter powered %d", device, path, device_powered, adapter_powered); if (device_powered != adapter_powered) { if (adapter_powered) enable_device(device, path); else disable_device(device, path); } }
static bool pan_connect(struct bluetooth_pan *pan, const char *iface) { int index; if (!iface) { if (!proxy_get_bool(pan->btnetwork_proxy, "Connected")) return false; iface = proxy_get_string(pan->btnetwork_proxy, "Interface"); } if (!iface) return false; index = connman_inet_ifindex(iface); if (index < 0) { DBG("network %p invalid index %d", pan->network, index); return false; } connman_network_set_index(pan->network, index); connman_network_set_connected(pan->network, true); return true; }
static connman_bool_t pan_connect(struct bluetooth_pan *pan, const char *iface) { int index; if (iface == NULL) { if (proxy_get_bool(pan->btnetwork_proxy, "Connected") == FALSE) return FALSE; iface = proxy_get_string(pan->btnetwork_proxy, "Interface"); } if (iface == NULL) return FALSE; index = connman_inet_ifindex(iface); if (index < 0) { DBG("network %p invalid index %d", pan->network, index); return FALSE; } connman_network_set_index(pan->network, index); connman_network_set_connected(pan->network, TRUE); return TRUE; }
static void device_create(GDBusProxy *proxy) { struct connman_device *device = NULL; const char *path = g_dbus_proxy_get_path(proxy); const char *address; char ident[BLUETOOTH_ADDR_LEN * 2 + 1]; bool powered; address = proxy_get_string(proxy, "Address"); if (!address) return; address2ident(address, ident); device = connman_device_create("bluetooth", CONNMAN_DEVICE_TYPE_BLUETOOTH); if (!device) return; connman_device_set_data(device, g_dbus_proxy_ref(proxy)); connman_device_set_ident(device, ident); g_hash_table_replace(devices, g_strdup(path), device); DBG("device %p %s device powered %d adapter powered %d", device, path, connman_device_get_powered(device), proxy_get_bool(proxy, "Powered")); if (connman_device_register(device) < 0) { g_hash_table_remove(devices, device); return; } g_dbus_proxy_set_property_watch(proxy, adapter_property_change, NULL); powered = proxy_get_bool(proxy, "Powered"); connman_device_set_powered(device, powered); if (proxy_get_role(proxy) && !bluetooth_tethering) tethering_create(path, NULL, NULL, false); }
static int bluetooth_device_disable(struct connman_device *device) { GDBusProxy *proxy = connman_device_get_data(device); dbus_bool_t device_powered = FALSE; const char *path; if (!proxy) return 0; path = g_dbus_proxy_get_path(proxy); if (!proxy_get_bool(proxy, "Powered")) { DBG("already disabled %p %s", device, path); return -EALREADY; } DBG("device %p %s", device, path); g_dbus_proxy_set_property_basic(proxy, "Powered", DBUS_TYPE_BOOLEAN, &device_powered, device_disable_cb, g_strdup(path), NULL); return -EINPROGRESS; }