+void RegisterForNotificationCallback(int conn_id, int registered, int status,
+ btgatt_srvc_id_t *srvc_id,
+ btgatt_gatt_id_t *char_id) {
+ shared_lock<shared_timed_mutex> lock(g_instance_lock);
+ VERIFY_INTERFACE_OR_RETURN();
+
+ LOG(INFO) << __func__ << " - conn_id: " << conn_id
+ << " - status: " << status
+ << " - registered: " << registered
+ << " - srvc_id: " << (srvc_id ? srvc_id->id.inst_id : 0)
+ << " - char_id: " << (char_id ? char_id->inst_id : 0);
+ FOR_EACH_CLIENT_OBSERVER(
+ RegisterForNotificationCallback(g_interface, conn_id, status, registered,
+ srvc_id, char_id));
+}
+
+void NotifyCallback(int conn_id, btgatt_notify_params_t *p_data) {
+ shared_lock<shared_timed_mutex> lock(g_instance_lock);
+ VERIFY_INTERFACE_OR_RETURN();
+
+ VLOG(2) << __func__ << " - conn_id: " << conn_id
+ << " - address: " << BtAddrString(&p_data->bda)
+ << " - srvc_id: " << (p_data ? p_data->srvc_id.id.inst_id : 0)
+ << " - char_id: " << (p_data ? p_data->char_id.inst_id : 0)
+ << " - len: " << p_data->len
+ << " - is_notify: " << p_data->is_notify;
+
+ FOR_EACH_CLIENT_OBSERVER(
+ NotifyCallback(g_interface, conn_id, p_data));
+}
+
+void WriteCharacteristicCallback(int conn_id, int status,
+ btgatt_write_params_t *p_data) {
+ shared_lock<shared_timed_mutex> lock(g_instance_lock);
+ VERIFY_INTERFACE_OR_RETURN();
+
+ VLOG(2) << __func__ << " - conn_id: " << conn_id
+ << " - status: " << status;
+
+ FOR_EACH_CLIENT_OBSERVER(
+ WriteCharacteristicCallback(g_interface, conn_id, status, p_data));
+}
+
+void WriteDescriptorCallback(int conn_id, int status,
+ btgatt_write_params_t *p_data) {
+ shared_lock<shared_timed_mutex> lock(g_instance_lock);
+ VERIFY_INTERFACE_OR_RETURN();
+
+ VLOG(2) << __func__ << " - conn_id: " << conn_id
+ << " - status: " << status;
+
+ FOR_EACH_CLIENT_OBSERVER(
+ WriteDescriptorCallback(g_interface, conn_id, status, p_data));
+}
+