static void get_properties_cb (DBusGProxy *proxy, DBusGProxyCall *call, gpointer user_data) { NMBluezDevice *self = NM_BLUEZ_DEVICE (user_data); NMBluezDevicePrivate *priv = NM_BLUEZ_DEVICE_GET_PRIVATE (self); GHashTable *properties = NULL; GError *err = NULL; GValue *value; const char **uuids; if (!dbus_g_proxy_end_call (proxy, call, &err, DBUS_TYPE_G_MAP_OF_VARIANT, &properties, G_TYPE_INVALID)) { nm_log_warn (LOGD_BT, "bluez error getting device properties: %s", err && err->message ? err->message : "(unknown)"); g_error_free (err); g_signal_emit (self, signals[INITIALIZED], 0, FALSE); return; } value = g_hash_table_lookup (properties, "Address"); priv->address = value ? g_value_dup_string (value) : NULL; value = g_hash_table_lookup (properties, "Name"); priv->name = value ? g_value_dup_string (value) : NULL; value = g_hash_table_lookup (properties, "RSSI"); priv->rssi = value ? g_value_get_int (value) : 0; value = g_hash_table_lookup (properties, "UUIDs"); if (value) { uuids = (const char **) g_value_get_boxed (value); priv->capabilities = convert_uuids_to_capabilities (uuids); } else priv->capabilities = NM_BT_CAPABILITY_NONE; g_hash_table_unref (properties); priv->initialized = TRUE; g_signal_emit (self, signals[INITIALIZED], 0, TRUE); check_emit_usable (self); }
static void _set_property_capabilities (NMBluezDevice *self, const char **uuids) { guint32 uint_val; NMBluezDevicePrivate *priv = NM_BLUEZ_DEVICE_GET_PRIVATE (self); uint_val = convert_uuids_to_capabilities (uuids, priv->bluez_version); if (priv->capabilities != uint_val) { if (priv->capabilities) { /* changing (relevant) capabilities is not supported and ignored -- except setting initially */ nm_log_warn (LOGD_BT, "bluez[%s] ignore change of capabilities for Bluetooth device from %u to %u", priv->path, priv->capabilities, uint_val); return; } nm_log_dbg (LOGD_BT, "bluez[%s] set capabilities for Bluetooth device: %s%s%s", priv->path, uint_val & NM_BT_CAPABILITY_NAP ? "NAP" : "", ((uint_val & NM_BT_CAPABILITY_DUN) && (uint_val &NM_BT_CAPABILITY_NAP)) ? " | " : "", uint_val & NM_BT_CAPABILITY_DUN ? "DUN" : ""); priv->capabilities = uint_val; g_object_notify (G_OBJECT (self), NM_BLUEZ_DEVICE_CAPABILITIES); } }
static void property_changed (DBusGProxy *proxy, const char *property, GValue *value, gpointer user_data) { NMBluezDevice *self = NM_BLUEZ_DEVICE (user_data); NMBluezDevicePrivate *priv = NM_BLUEZ_DEVICE_GET_PRIVATE (self); const char *str; guint32 uint_val; gint int_val; if (!strcmp (property, "Name")) { str = g_value_get_string (value); if ( (!priv->name && str) || (priv->name && !str) || (priv->name && str && strcmp (priv->name, str))) { g_free (priv->name); priv->name = g_strdup (str); g_object_notify (G_OBJECT (self), NM_BLUEZ_DEVICE_NAME); } } else if (!strcmp (property, "RSSI")) { int_val = g_value_get_int (value); if (priv->rssi != int_val) { priv->rssi = int_val; g_object_notify (G_OBJECT (self), NM_BLUEZ_DEVICE_RSSI); } } else if (!strcmp (property, "UUIDs")) { uint_val = convert_uuids_to_capabilities ((const char **) g_value_get_boxed (value)); if (priv->capabilities != uint_val) { priv->capabilities = uint_val; g_object_notify (G_OBJECT (self), NM_BLUEZ_DEVICE_CAPABILITIES); } } check_emit_usable (self); }