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 void attio_connected_cb(GAttrib *attrib, gpointer user_data) { struct monitor *monitor = user_data; monitor->attrib = g_attrib_ref(attrib); if (monitor->enabled.linkloss) write_alert_level(monitor); if (monitor->enabled.pathloss) read_tx_power(monitor); if (monitor->immediatehandle == 0) { if(monitor->enabled.pathloss || monitor->enabled.findme) discover_immediate_handle(monitor); } else if (monitor->fallbacklevel) write_immediate_alert(monitor); }
static void immediate_handle_cb(GSList *characteristics, guint8 status, gpointer user_data) { struct monitor *monitor = user_data; struct att_char *chr; if (status) { error("Discover Immediate Alert handle: %s", att_ecode2str(status)); return; } chr = characteristics->data; monitor->immediatehandle = chr->value_handle; DBG("Immediate Alert handle: 0x%04x", monitor->immediatehandle); if (monitor->fallbacklevel) write_immediate_alert(monitor); }
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); }