void BluetoothLEDevice::GattConnectionState(int result, bool connected, const char* remote_address,
void* user_data) {
ScopeLogger("%s connected: %d", remote_address, connected);
- auto le_device = static_cast<BluetoothLEDevice*>(user_data);
-
- if (!le_device) {
+ if (!user_data) {
LoggerE("user_data is NULL");
return;
}
+ BluetoothLEDevice* le_device = static_cast<BluetoothLEDevice*>(user_data);
+
+ // check state change success
+ PlatformResult operation_success = ValidateConnectionChange(result);
+ if (operation_success) {
+ if (connected) { // connect success
+ le_device->is_connected_.insert(remote_address);
+ } else { // disconnect success
+ le_device->CleanClientInfo(remote_address);
+ }
+ }
- if (connected) {
- le_device->is_connected_.insert(remote_address);
+ // trigger connect/disconnect callback (success or error)
+ le_device->TriggerConnectCallback(remote_address, operation_success);
+
+ // trigger state change listener, if operation succeed
+ if (operation_success) {
+ le_device->TriggerConnectStateChangeListener(remote_address, connected);
+ }
+}
+
+PlatformResult BluetoothLEDevice::ValidateConnectionChange(int err_code) {
+ ScopeLogger();
+ if (BT_ERROR_NONE != err_code) {
+ return LogAndCreateResult(
+ ErrorCode::UNKNOWN_ERR, "Failed to get connection state",
+ ("GattConnectionState error: %d (%s)", err_code, get_error_message(err_code)));
+ }
+ return PlatformResult(ErrorCode::NO_ERROR);
+}
+
+void BluetoothLEDevice::CleanClientInfo(const char* remote_address) {
+ ScopeLogger();
+ is_connected_.erase(remote_address);
+ // inform that this device is not connected anymore
+ service_.TryDestroyClient(remote_address);
+}
+
+void BluetoothLEDevice::TriggerConnectCallback(const char* remote_address, PlatformResult result) {
+ ScopeLogger();
+ auto it = connecting_.find(remote_address);
+ if (connecting_.end() != it) {
+ instance_.AsyncResponse(it->second, result);
+ connecting_.erase(it);
} else {
- le_device->is_connected_.erase(remote_address);
- // inform that this device is not connected anymore
- le_device->service_.TryDestroyClient(remote_address);
+ LoggerW("Given address is not in waiting connections list");
}
+}
- if (le_device->is_listener_set_) {
+void BluetoothLEDevice::TriggerConnectStateChangeListener(const char* remote_address,
+ bool connected) {
+ ScopeLogger();
+ if (is_listener_set_) {
picojson::value value = picojson::value(picojson::object());
picojson::object* data_obj = &value.get<picojson::object>();
if (connected) {
LoggerD("OnDisconnected");
data_obj->insert(std::make_pair(kAction, picojson::value(kOnDisconnected)));
}
-
data_obj->insert(std::make_pair(kDeviceAddress, picojson::value(remote_address)));
-
- le_device->instance_.FireEvent(kConnectChangeEvent, value);
- }
-
- auto it = le_device->connecting_.find(remote_address);
- if (le_device->connecting_.end() == it) {
- LoggerW("Given address is not in waiting connections list");
- return;
- }
-
- PlatformResult ret = PlatformResult(ErrorCode::NO_ERROR);
- if (BT_ERROR_NONE != result) {
- ret = LogAndCreateResult(
- ErrorCode::UNKNOWN_ERR, "Failed to get connection state",
- ("GattConnectionState error: %d (%s)", result, get_error_message(result)));
+ instance_.FireEvent(kConnectChangeEvent, value);
+ } else {
+ LoggerD("Listener is not registered - ignoring event");
}
-
- le_device->instance_.AsyncResponse(it->second, ret);
-
- le_device->connecting_.erase(it);
-}
+};
} // namespace bluetooth
} // namespace extension