static void sink_cb(struct btd_service *service, btd_service_state_t old_state, btd_service_state_t new_state) { struct btd_device *dev = btd_service_get_device(service); struct policy_data *data; struct btd_service *controller; controller = btd_device_get_service(dev, AVRCP_REMOTE_UUID); if (controller == NULL) return; data = policy_get_data(dev); switch (new_state) { case BTD_SERVICE_STATE_UNAVAILABLE: case BTD_SERVICE_STATE_DISCONNECTED: if (old_state == BTD_SERVICE_STATE_CONNECTING) { int err = btd_service_get_error(service); if (err == -EAGAIN) { if (data->sink_retries < SINK_RETRIES) policy_set_sink_timer(data); else data->sink_retries = 0; break; } else if (data->sink_timer > 0) { g_source_remove(data->sink_timer); data->sink_timer = 0; } } if (data->ct_timer > 0) { g_source_remove(data->ct_timer); data->ct_timer = 0; } else if (btd_service_get_state(controller) != BTD_SERVICE_STATE_DISCONNECTED) policy_disconnect(data, controller); break; case BTD_SERVICE_STATE_CONNECTING: break; case BTD_SERVICE_STATE_CONNECTED: if (data->sink_timer > 0) { g_source_remove(data->sink_timer); data->sink_timer = 0; } /* Check if service initiate the connection then proceed * immediatelly otherwise set timer */ if (old_state == BTD_SERVICE_STATE_CONNECTING) policy_connect(data, controller); else if (btd_service_get_state(controller) != BTD_SERVICE_STATE_CONNECTED) policy_set_ct_timer(data); break; case BTD_SERVICE_STATE_DISCONNECTING: break; } }
static void controller_cb(struct btd_service *service, btd_service_state_t old_state, btd_service_state_t new_state) { struct btd_device *dev = btd_service_get_device(service); struct policy_data *data; data = find_data(dev); if (data == NULL) return; switch (new_state) { case BTD_SERVICE_STATE_UNAVAILABLE: if (data->ct_timer > 0) { g_source_remove(data->ct_timer); data->ct_timer = 0; } break; case BTD_SERVICE_STATE_DISCONNECTED: if (old_state == BTD_SERVICE_STATE_CONNECTING) { int err = btd_service_get_error(service); if (err == -EAGAIN) { if (data->ct_retries < CT_RETRIES) policy_set_ct_timer(data, CT_RETRY_TIMEOUT); else data->ct_retries = 0; break; } else if (data->ct_timer > 0) { g_source_remove(data->ct_timer); data->ct_timer = 0; } } else if (old_state == BTD_SERVICE_STATE_CONNECTED) { data->ct_retries = 0; } break; case BTD_SERVICE_STATE_CONNECTING: break; case BTD_SERVICE_STATE_CONNECTED: if (data->ct_timer > 0) { g_source_remove(data->ct_timer); data->ct_timer = 0; } break; case BTD_SERVICE_STATE_DISCONNECTING: break; } }