static void on_notify (GObject *object, GParamSpec *pspec, gpointer user_data) { GDBusConnection *connection; const gchar *path; GVariant *value; const gchar *property_name; guint prop_id; path = g_object_get_data (object, "gdbus-codegen-path"); connection = g_object_get_data (object, "gdbus-codegen-connection"); if (connection == NULL || path == NULL) goto out; property_name = lookup_property_name_from_property_gname (pspec->name); if (property_name == NULL) goto out; prop_id = lookup_property_id_from_property_name (property_name); value = NULL; switch (prop_id) { } if (value != NULL && property_name != NULL) { queue_notification (object, property_name, g_variant_ref_sink (value)); } out: ; }
static void notify_curr_time(gpointer data, gpointer user_data) { struct time_adapter *ta = data; struct current_time *curtime = user_data; DBG(""); queue_notification(ta->adapter, BDADDR_ALL, ta->h_curr_time_value, ta->h_curr_time_ccc, curtime, sizeof(*curtime)); }
static void __notify_unread_alert(gpointer data, gpointer user_data) { struct alert_adapter *aa = data; uint8_t category_id = (uint32_t)user_data & 0xff; uint8_t category_id_bit = 1 << category_id; if ((aa->en_unread_alerts & category_id_bit) | override_notifications) queue_notification(aa->adapter, BDADDR_ALL, aa->h_unread_alerts, aa->h_unread_alerts_ccc, &unread_alerts[category_id], sizeof(unread_alerts[0])); }
static void __notify_alert_status(gpointer data, gpointer user_data) { struct alert_adapter *aa = data; uint8_t status = (uint32_t)user_data & 0xff; if (alert_status != status) { alert_status = status; queue_notification(aa->adapter, BDADDR_ALL, aa->h_alert_status, aa->h_alert_status_ccc, &alert_status, sizeof(alert_status)); attrib_db_update(aa->adapter, aa->h_alert_status, NULL, &alert_status, sizeof(alert_status), NULL); } }
static void __notify_ringer_setting(gpointer data, gpointer user_data) { struct alert_adapter *aa = data; uint8_t setting = (uint32_t)user_data & 0xff; if (ringer_setting != setting) { ringer_setting = setting; queue_notification(aa->adapter, BDADDR_ALL, aa->h_ringer_setting, aa->h_ringer_setting_ccc, &ringer_setting, sizeof(ringer_setting)); attrib_db_update(aa->adapter, aa->h_ringer_setting, NULL, &ringer_setting, sizeof(ringer_setting), NULL); } }
static uint8_t alert_notif_cp_write(struct attribute *a, gpointer user_data, struct btd_device *device) { struct alert_adapter *aa = user_data; bdaddr_t addr; int i; if (!initialized) { error("Uninitialized"); return ATT_ECODE_IO; } device_get_address(device, &addr, NULL); DBG("Command = %d; Data = 0x%X", a->data[0], a->data[1]); switch (a->data[0]) { case ENABLE_NEW_INCOMING: aa->en_new_alerts |= a->data[1]; register_devstate_cleanup_cb(aa, device); break; case ENABLE_UNREAD_CAT: aa->en_unread_alerts |= a->data[1]; register_devstate_cleanup_cb(aa, device); break; case DISABLE_NEW_INCOMING: aa->en_new_alerts &= ~a->data[1]; break; case DISABLE_UNREAD_CAT: aa->en_unread_alerts &= ~a->data[1]; break; case NOTIFY_NEW_INCOMING: for (i = 0; i < NUM_OF_ALERT_CATEGORIES; i++) { if ((1 << i) & aa->en_new_alerts && new_alerts[i].num_new_alerts) queue_notification(aa->adapter, &addr, aa->h_new_alerts, aa->h_new_alerts_ccc, &new_alerts[i], sizeof(new_alerts[0])); } break; case NOTIFY_UNREAD_CAT: for (i = 0; i < NUM_OF_ALERT_CATEGORIES; i++) { if ((1 << i) & aa->en_unread_alerts && unread_alerts[i].unread_count) queue_notification(aa->adapter, &addr, aa->h_unread_alerts, aa->h_unread_alerts_ccc, &unread_alerts[i], sizeof(unread_alerts[0])); } break; default: DBG("Unknown command"); } DBG("Enabled new alert = 0x%X", aa->en_new_alerts); DBG("Enabled unread alert = 0x%X", aa->en_unread_alerts); return 0; }