Add error in connection updates (#89)

* Add error in connection updates

* implement windows

* Update changelog and Docs

* minor fix in connect()

* Add default timeout in connect

* Document new pair and connect API

* Fix Connect and Pair apis to throw proper errors and Improve logging

* remove import

* Rename PairingException and update Exception doc

* Update changelog

* Update comments

---------

Co-authored-by: Foti Dim <fdimanidis@gmail.com>
This commit is contained in:
Rohit Sangwan
2024-09-27 02:38:25 +05:30
committed by GitHub
parent f41aceaa0e
commit b77d0aaeb4
26 changed files with 851 additions and 698 deletions
+33 -25
View File
@@ -1,4 +1,4 @@
// Autogenerated from Pigeon (v21.1.0), do not edit directly.
// Autogenerated from Pigeon (v22.4.0), do not edit directly.
// See also: https://pub.dev/packages/pigeon
#undef _HAS_EXCEPTIONS
@@ -22,10 +22,10 @@ using flutter::EncodableMap;
using flutter::EncodableValue;
FlutterError CreateConnectionError(const std::string channel_name) {
return FlutterError(
"channel-error",
"Unable to establish connection on channel: '" + channel_name + "'.",
EncodableValue(""));
return FlutterError(
"channel-error",
"Unable to establish connection on channel: '" + channel_name + "'.",
EncodableValue(""));
}
// UniversalBleScanResult
@@ -146,7 +146,7 @@ UniversalBleScanResult UniversalBleScanResult::FromEncodableList(const Encodable
}
auto& encodable_rssi = list[3];
if (!encodable_rssi.IsNull()) {
decoded.set_rssi(encodable_rssi.LongValue());
decoded.set_rssi(std::get<int64_t>(encodable_rssi));
}
auto& encodable_manufacturer_data_list = list[4];
if (!encodable_manufacturer_data_list.IsNull()) {
@@ -364,7 +364,7 @@ EncodableList UniversalManufacturerDataFilter::ToEncodableList() const {
UniversalManufacturerDataFilter UniversalManufacturerDataFilter::FromEncodableList(const EncodableList& list) {
UniversalManufacturerDataFilter decoded(
list[0].LongValue());
std::get<int64_t>(list[0]));
auto& encodable_data = list[1];
if (!encodable_data.IsNull()) {
decoded.set_data(std::get<std::vector<uint8_t>>(encodable_data));
@@ -412,36 +412,42 @@ EncodableList UniversalManufacturerData::ToEncodableList() const {
UniversalManufacturerData UniversalManufacturerData::FromEncodableList(const EncodableList& list) {
UniversalManufacturerData decoded(
list[0].LongValue(),
std::get<int64_t>(list[0]),
std::get<std::vector<uint8_t>>(list[1]));
return decoded;
}
PigeonCodecSerializer::PigeonCodecSerializer() {}
PigeonInternalCodecSerializer::PigeonInternalCodecSerializer() {}
EncodableValue PigeonCodecSerializer::ReadValueOfType(
EncodableValue PigeonInternalCodecSerializer::ReadValueOfType(
uint8_t type,
flutter::ByteStreamReader* stream) const {
switch (type) {
case 129:
return CustomEncodableValue(UniversalBleScanResult::FromEncodableList(std::get<EncodableList>(ReadValue(stream))));
case 130:
return CustomEncodableValue(UniversalBleService::FromEncodableList(std::get<EncodableList>(ReadValue(stream))));
case 131:
return CustomEncodableValue(UniversalBleCharacteristic::FromEncodableList(std::get<EncodableList>(ReadValue(stream))));
case 132:
return CustomEncodableValue(UniversalScanFilter::FromEncodableList(std::get<EncodableList>(ReadValue(stream))));
case 133:
return CustomEncodableValue(UniversalManufacturerDataFilter::FromEncodableList(std::get<EncodableList>(ReadValue(stream))));
case 134:
return CustomEncodableValue(UniversalManufacturerData::FromEncodableList(std::get<EncodableList>(ReadValue(stream))));
case 129: {
return CustomEncodableValue(UniversalBleScanResult::FromEncodableList(std::get<EncodableList>(ReadValue(stream))));
}
case 130: {
return CustomEncodableValue(UniversalBleService::FromEncodableList(std::get<EncodableList>(ReadValue(stream))));
}
case 131: {
return CustomEncodableValue(UniversalBleCharacteristic::FromEncodableList(std::get<EncodableList>(ReadValue(stream))));
}
case 132: {
return CustomEncodableValue(UniversalScanFilter::FromEncodableList(std::get<EncodableList>(ReadValue(stream))));
}
case 133: {
return CustomEncodableValue(UniversalManufacturerDataFilter::FromEncodableList(std::get<EncodableList>(ReadValue(stream))));
}
case 134: {
return CustomEncodableValue(UniversalManufacturerData::FromEncodableList(std::get<EncodableList>(ReadValue(stream))));
}
default:
return flutter::StandardCodecSerializer::ReadValueOfType(type, stream);
}
}
void PigeonCodecSerializer::WriteValue(
void PigeonInternalCodecSerializer::WriteValue(
const EncodableValue& value,
flutter::ByteStreamWriter* stream) const {
if (const CustomEncodableValue* custom_value = std::get_if<CustomEncodableValue>(&value)) {
@@ -481,7 +487,7 @@ void PigeonCodecSerializer::WriteValue(
/// The codec used by UniversalBlePlatformChannel.
const flutter::StandardMessageCodec& UniversalBlePlatformChannel::GetCodec() {
return flutter::StandardMessageCodec::GetInstance(&PigeonCodecSerializer::GetInstance());
return flutter::StandardMessageCodec::GetInstance(&PigeonInternalCodecSerializer::GetInstance());
}
// Sets up an instance of `UniversalBlePlatformChannel` to handle messages through the `binary_messenger`.
@@ -1019,7 +1025,7 @@ UniversalBleCallbackChannel::UniversalBleCallbackChannel(
message_channel_suffix_(message_channel_suffix.length() > 0 ? std::string(".") + message_channel_suffix : "") {}
const flutter::StandardMessageCodec& UniversalBleCallbackChannel::GetCodec() {
return flutter::StandardMessageCodec::GetInstance(&PigeonCodecSerializer::GetInstance());
return flutter::StandardMessageCodec::GetInstance(&PigeonInternalCodecSerializer::GetInstance());
}
void UniversalBleCallbackChannel::OnAvailabilityChanged(
@@ -1133,6 +1139,7 @@ void UniversalBleCallbackChannel::OnValueChanged(
void UniversalBleCallbackChannel::OnConnectionChanged(
const std::string& device_id_arg,
bool connected_arg,
const std::string* error_arg,
std::function<void(void)>&& on_success,
std::function<void(const FlutterError&)>&& on_error) {
const std::string channel_name = "dev.flutter.pigeon.universal_ble.UniversalBleCallbackChannel.onConnectionChanged" + message_channel_suffix_;
@@ -1140,6 +1147,7 @@ void UniversalBleCallbackChannel::OnConnectionChanged(
EncodableValue encoded_api_arguments = EncodableValue(EncodableList{
EncodableValue(device_id_arg),
EncodableValue(connected_arg),
error_arg ? EncodableValue(*error_arg) : EncodableValue(),
});
channel.Send(encoded_api_arguments, [channel_name, on_success = std::move(on_success), on_error = std::move(on_error)](const uint8_t* reply, size_t reply_size) {
std::unique_ptr<EncodableValue> response = GetCodec().DecodeMessage(reply, reply_size);
+14 -11
View File
@@ -1,4 +1,4 @@
// Autogenerated from Pigeon (v21.1.0), do not edit directly.
// Autogenerated from Pigeon (v22.4.0), do not edit directly.
// See also: https://pub.dev/packages/pigeon
#ifndef PIGEON_UNIVERSAL_BLE_G_H_
@@ -57,6 +57,7 @@ template<class T> class ErrorOr {
};
// Generated class from Pigeon that represents data sent in messages.
class UniversalBleScanResult {
public:
@@ -101,7 +102,7 @@ class UniversalBleScanResult {
flutter::EncodableList ToEncodableList() const;
friend class UniversalBlePlatformChannel;
friend class UniversalBleCallbackChannel;
friend class PigeonCodecSerializer;
friend class PigeonInternalCodecSerializer;
std::string device_id_;
std::optional<std::string> name_;
std::optional<bool> is_paired_;
@@ -136,7 +137,7 @@ class UniversalBleService {
flutter::EncodableList ToEncodableList() const;
friend class UniversalBlePlatformChannel;
friend class UniversalBleCallbackChannel;
friend class PigeonCodecSerializer;
friend class PigeonInternalCodecSerializer;
std::string uuid_;
std::optional<flutter::EncodableList> characteristics_;
@@ -163,7 +164,7 @@ class UniversalBleCharacteristic {
flutter::EncodableList ToEncodableList() const;
friend class UniversalBlePlatformChannel;
friend class UniversalBleCallbackChannel;
friend class PigeonCodecSerializer;
friend class PigeonInternalCodecSerializer;
std::string uuid_;
flutter::EncodableList properties_;
@@ -196,7 +197,7 @@ class UniversalScanFilter {
flutter::EncodableList ToEncodableList() const;
friend class UniversalBlePlatformChannel;
friend class UniversalBleCallbackChannel;
friend class PigeonCodecSerializer;
friend class PigeonInternalCodecSerializer;
flutter::EncodableList with_services_;
flutter::EncodableList with_name_prefix_;
flutter::EncodableList with_manufacturer_data_;
@@ -233,7 +234,7 @@ class UniversalManufacturerDataFilter {
flutter::EncodableList ToEncodableList() const;
friend class UniversalBlePlatformChannel;
friend class UniversalBleCallbackChannel;
friend class PigeonCodecSerializer;
friend class PigeonInternalCodecSerializer;
int64_t company_identifier_;
std::optional<std::vector<uint8_t>> data_;
std::optional<std::vector<uint8_t>> mask_;
@@ -261,17 +262,18 @@ class UniversalManufacturerData {
flutter::EncodableList ToEncodableList() const;
friend class UniversalBlePlatformChannel;
friend class UniversalBleCallbackChannel;
friend class PigeonCodecSerializer;
friend class PigeonInternalCodecSerializer;
int64_t company_identifier_;
std::vector<uint8_t> data_;
};
class PigeonCodecSerializer : public flutter::StandardCodecSerializer {
class PigeonInternalCodecSerializer : public flutter::StandardCodecSerializer {
public:
PigeonCodecSerializer();
inline static PigeonCodecSerializer& GetInstance() {
static PigeonCodecSerializer sInstance;
PigeonInternalCodecSerializer();
inline static PigeonInternalCodecSerializer& GetInstance() {
static PigeonInternalCodecSerializer sInstance;
return sInstance;
}
@@ -387,6 +389,7 @@ class UniversalBleCallbackChannel {
void OnConnectionChanged(
const std::string& device_id,
bool connected,
const std::string* error,
std::function<void(void)>&& on_success,
std::function<void(const FlutterError&)>&& on_error);
+8 -7
View File
@@ -190,7 +190,7 @@ namespace universal_ble
CleanConnection(deviceAddress);
// TODO: send disconnect event only after disconnect is complete
uiThreadHandler_.Post([deviceAddress]
{ callbackChannel->OnConnectionChanged(_mac_address_to_str(deviceAddress), false, SuccessCallback, ErrorCallback); });
{ callbackChannel->OnConnectionChanged(_mac_address_to_str(deviceAddress), false, nullptr, SuccessCallback, ErrorCallback); });
return std::nullopt;
};
@@ -925,7 +925,7 @@ namespace universal_ble
{
std::cout << "ConnectionLog: ConnectionFailed: Failed to get device" << std::endl;
uiThreadHandler_.Post([bluetoothAddress]
{ callbackChannel->OnConnectionChanged(_mac_address_to_str(bluetoothAddress), false, SuccessCallback, ErrorCallback); });
{ callbackChannel->OnConnectionChanged(_mac_address_to_str(bluetoothAddress), false, new std::string("Failed to get device"), SuccessCallback, ErrorCallback); });
co_return;
}
@@ -933,9 +933,10 @@ namespace universal_ble
auto status = servicesResult.Status();
if (status != GattCommunicationStatus::Success)
{
std::cout << "ConnectionFailed: Failed to get services: " << GattCommunicationStatusToString(status) << std::endl;
uiThreadHandler_.Post([bluetoothAddress]
{ callbackChannel->OnConnectionChanged(_mac_address_to_str(bluetoothAddress), false, SuccessCallback, ErrorCallback); });
std::string error = GattCommunicationStatusToString(status);
std::cout << "ConnectionFailed: Failed to get services: " << error << std::endl;
uiThreadHandler_.Post([bluetoothAddress, error]
{ callbackChannel->OnConnectionChanged(_mac_address_to_str(bluetoothAddress), false, &error, SuccessCallback, ErrorCallback); });
co_return;
}
@@ -972,7 +973,7 @@ namespace universal_ble
connectedDevices.insert(std::move(pair));
std::cout << "ConnectionLog: Connected" << std::endl;
uiThreadHandler_.Post([bluetoothAddress]
{ callbackChannel->OnConnectionChanged(_mac_address_to_str(bluetoothAddress), true, SuccessCallback, ErrorCallback); });
{ callbackChannel->OnConnectionChanged(_mac_address_to_str(bluetoothAddress), true, nullptr, SuccessCallback, ErrorCallback); });
}
void UniversalBlePlugin::BluetoothLEDevice_ConnectionStatusChanged(BluetoothLEDevice sender, IInspectable args)
@@ -982,7 +983,7 @@ namespace universal_ble
CleanConnection(sender.BluetoothAddress());
auto bluetoothAddress = sender.BluetoothAddress();
uiThreadHandler_.Post([bluetoothAddress]
{ callbackChannel->OnConnectionChanged(_mac_address_to_str(bluetoothAddress), false, SuccessCallback, ErrorCallback); });
{ callbackChannel->OnConnectionChanged(_mac_address_to_str(bluetoothAddress), false, nullptr, SuccessCallback, ErrorCallback); });
}
}