static DBusMessage *set_link_loss_alert(DBusConnection *conn, DBusMessage *msg, const char *level, void *data) { struct monitor *monitor = data; struct btd_device *device = monitor->device; bdaddr_t sba, dba; if (!level_is_valid(level)) return btd_error_invalid_args(msg); if (g_strcmp0(monitor->linklosslevel, level) == 0) return dbus_message_new_method_return(msg); g_free(monitor->linklosslevel); monitor->linklosslevel = g_strdup(level); adapter_get_address(device_get_adapter(device), &sba); device_get_address(device, &dba); write_proximity_config(&sba, &dba, "LinkLossAlertLevel", level); if (monitor->attrib) write_alert_level(monitor); return dbus_message_new_method_return(msg); }
static void property_set_immediate_alert_level( const GDBusPropertyTable *property, DBusMessageIter *iter, GDBusPendingPropertySet id, void *data) { struct monitor *monitor = data; struct btd_device *device = monitor->device; const char *level; if (dbus_message_iter_get_arg_type(iter) != DBUS_TYPE_STRING) { g_dbus_pending_property_error(id, ERROR_INTERFACE ".InvalidArguments", "Invalid arguments in method call"); return; } dbus_message_iter_get_basic(iter, &level); if (!level_is_valid(level)) { g_dbus_pending_property_error(id, ERROR_INTERFACE ".InvalidArguments", "Invalid arguments in method call"); return; } if (g_strcmp0(monitor->immediatelevel, level) == 0) goto done; if (monitor->immediateto) { g_source_remove(monitor->immediateto); monitor->immediateto = 0; } /* Previous Immediate Alert level if connection/write fails */ g_free(monitor->fallbacklevel); monitor->fallbacklevel = monitor->immediatelevel; monitor->immediatelevel = g_strdup(level); /* * Means that Link/Path Loss are disabled or there is a pending * writting for Find Me(Immediate Alert characteristic value). * If enabled, Path Loss always registers a connection callback * when the Proximity Monitor starts. */ if (monitor->attioid == 0) monitor->attioid = btd_device_add_attio_callback(device, attio_connected_cb, attio_disconnected_cb, monitor); else if (monitor->attrib) write_immediate_alert(monitor); done: g_dbus_pending_property_success(id); }
static DBusMessage *set_immediate_alert(DBusConnection *conn, DBusMessage *msg, const char *level, void *data) { struct monitor *monitor = data; if (!level_is_valid(level)) return btd_error_invalid_args(msg); if (g_strcmp0(monitor->immediatelevel, level) == 0) return dbus_message_new_method_return(msg); if (monitor->immediateto) { g_source_remove(monitor->immediateto); monitor->immediateto = 0; } /* Previous Immediate Alert level if connection/write fails */ g_free(monitor->fallbacklevel); monitor->fallbacklevel = monitor->immediatelevel; monitor->immediatelevel = g_strdup(level); /* * Means that Link/Path Loss are disabled or there is a pending * writting for Find Me(Immediate Alert characteristic value). * If enabled, Path Loss always registers a connection callback * when the Proximity Monitor starts. */ if (monitor->attioid == 0) monitor->attioid = btd_device_add_attio_callback(monitor->device, attio_connected_cb, attio_disconnected_cb, monitor); else if (monitor->attrib) write_immediate_alert(monitor); return dbus_message_new_method_return(msg); }
static void property_set_link_loss_level(const GDBusPropertyTable *property, DBusMessageIter *iter, GDBusPendingPropertySet id, void *data) { struct monitor *monitor = data; const char *level; if (dbus_message_iter_get_arg_type(iter) != DBUS_TYPE_STRING) { g_dbus_pending_property_error(id, ERROR_INTERFACE ".InvalidArguments", "Invalid arguments in method call"); return; } dbus_message_iter_get_basic(iter, &level); if (!level_is_valid(level)) { g_dbus_pending_property_error(id, ERROR_INTERFACE ".InvalidArguments", "Invalid arguments in method call"); return; } if (g_strcmp0(monitor->linklosslevel, level) == 0) goto done; g_free(monitor->linklosslevel); monitor->linklosslevel = g_strdup(level); write_proximity_config(monitor->device, "LinkLossAlertLevel", level); if (monitor->attrib) write_alert_level(monitor); done: g_dbus_pending_property_success(id); }