Return with InvalidStateError if a Bluetooth id is not cached.

This commit is contained in:
zakorgyula 2016-10-06 14:47:06 +02:00
parent dae007fd16
commit 11dbb7120f
19 changed files with 28 additions and 66 deletions

View file

@ -628,6 +628,9 @@ impl BluetoothManager {
device_id: String, device_id: String,
uuid: String, uuid: String,
sender: IpcSender<BluetoothResult<BluetoothServiceMsg>>) { sender: IpcSender<BluetoothResult<BluetoothServiceMsg>>) {
if !self.cached_devices.contains_key(&device_id) {
return drop(sender.send(Err(BluetoothError::InvalidState)));
}
let mut adapter = get_adapter_or_return_error!(self, sender); let mut adapter = get_adapter_or_return_error!(self, sender);
if !self.allowed_services.get(&device_id).map_or(false, |s| s.contains(&uuid)) { if !self.allowed_services.get(&device_id).map_or(false, |s| s.contains(&uuid)) {
return drop(sender.send(Err(BluetoothError::Security))); return drop(sender.send(Err(BluetoothError::Security)));
@ -654,6 +657,9 @@ impl BluetoothManager {
device_id: String, device_id: String,
uuid: Option<String>, uuid: Option<String>,
sender: IpcSender<BluetoothResult<BluetoothServicesMsg>>) { sender: IpcSender<BluetoothResult<BluetoothServicesMsg>>) {
if !self.cached_devices.contains_key(&device_id) {
return drop(sender.send(Err(BluetoothError::InvalidState)));
}
let mut adapter = get_adapter_or_return_error!(self, sender); let mut adapter = get_adapter_or_return_error!(self, sender);
let services = match uuid { let services = match uuid {
Some(ref id) => { Some(ref id) => {
@ -690,6 +696,9 @@ impl BluetoothManager {
service_id: String, service_id: String,
uuid: String, uuid: String,
sender: IpcSender<BluetoothResult<BluetoothServiceMsg>>) { sender: IpcSender<BluetoothResult<BluetoothServiceMsg>>) {
if !self.cached_services.contains_key(&service_id) {
return drop(sender.send(Err(BluetoothError::InvalidState)));
}
let mut adapter = match self.get_or_create_adapter() { let mut adapter = match self.get_or_create_adapter() {
Some(a) => a, Some(a) => a,
None => return drop(sender.send(Err(BluetoothError::Type(ADAPTER_ERROR.to_string())))), None => return drop(sender.send(Err(BluetoothError::Type(ADAPTER_ERROR.to_string())))),
@ -721,6 +730,9 @@ impl BluetoothManager {
service_id: String, service_id: String,
uuid: Option<String>, uuid: Option<String>,
sender: IpcSender<BluetoothResult<BluetoothServicesMsg>>) { sender: IpcSender<BluetoothResult<BluetoothServicesMsg>>) {
if !self.cached_services.contains_key(&service_id) {
return drop(sender.send(Err(BluetoothError::InvalidState)));
}
let mut adapter = match self.get_or_create_adapter() { let mut adapter = match self.get_or_create_adapter() {
Some(a) => a, Some(a) => a,
None => return drop(sender.send(Err(BluetoothError::Type(ADAPTER_ERROR.to_string())))), None => return drop(sender.send(Err(BluetoothError::Type(ADAPTER_ERROR.to_string())))),
@ -758,6 +770,9 @@ impl BluetoothManager {
service_id: String, service_id: String,
uuid: String, uuid: String,
sender: IpcSender<BluetoothResult<BluetoothCharacteristicMsg>>) { sender: IpcSender<BluetoothResult<BluetoothCharacteristicMsg>>) {
if !self.cached_services.contains_key(&service_id) {
return drop(sender.send(Err(BluetoothError::InvalidState)));
}
let mut adapter = get_adapter_or_return_error!(self, sender); let mut adapter = get_adapter_or_return_error!(self, sender);
let characteristics = self.get_gatt_characteristics_by_uuid(&mut adapter, &service_id, &uuid); let characteristics = self.get_gatt_characteristics_by_uuid(&mut adapter, &service_id, &uuid);
if characteristics.is_empty() { if characteristics.is_empty() {
@ -789,6 +804,9 @@ impl BluetoothManager {
service_id: String, service_id: String,
uuid: Option<String>, uuid: Option<String>,
sender: IpcSender<BluetoothResult<BluetoothCharacteristicsMsg>>) { sender: IpcSender<BluetoothResult<BluetoothCharacteristicsMsg>>) {
if !self.cached_services.contains_key(&service_id) {
return drop(sender.send(Err(BluetoothError::InvalidState)));
}
let mut adapter = get_adapter_or_return_error!(self, sender); let mut adapter = get_adapter_or_return_error!(self, sender);
let characteristics = match uuid { let characteristics = match uuid {
Some(id) => self.get_gatt_characteristics_by_uuid(&mut adapter, &service_id, &id), Some(id) => self.get_gatt_characteristics_by_uuid(&mut adapter, &service_id, &id),
@ -828,6 +846,9 @@ impl BluetoothManager {
characteristic_id: String, characteristic_id: String,
uuid: String, uuid: String,
sender: IpcSender<BluetoothResult<BluetoothDescriptorMsg>>) { sender: IpcSender<BluetoothResult<BluetoothDescriptorMsg>>) {
if !self.cached_characteristics.contains_key(&characteristic_id) {
return drop(sender.send(Err(BluetoothError::InvalidState)));
}
let mut adapter = get_adapter_or_return_error!(self, sender); let mut adapter = get_adapter_or_return_error!(self, sender);
let descriptors = self.get_gatt_descriptors_by_uuid(&mut adapter, &characteristic_id, &uuid); let descriptors = self.get_gatt_descriptors_by_uuid(&mut adapter, &characteristic_id, &uuid);
if descriptors.is_empty() { if descriptors.is_empty() {
@ -848,6 +869,9 @@ impl BluetoothManager {
characteristic_id: String, characteristic_id: String,
uuid: Option<String>, uuid: Option<String>,
sender: IpcSender<BluetoothResult<BluetoothDescriptorsMsg>>) { sender: IpcSender<BluetoothResult<BluetoothDescriptorsMsg>>) {
if !self.cached_characteristics.contains_key(&characteristic_id) {
return drop(sender.send(Err(BluetoothError::InvalidState)));
}
let mut adapter = get_adapter_or_return_error!(self, sender); let mut adapter = get_adapter_or_return_error!(self, sender);
let descriptors = match uuid { let descriptors = match uuid {
Some(id) => self.get_gatt_descriptors_by_uuid(&mut adapter, &characteristic_id, &id), Some(id) => self.get_gatt_descriptors_by_uuid(&mut adapter, &characteristic_id, &id),
@ -879,7 +903,7 @@ impl BluetoothManager {
value = self.get_gatt_descriptor(&mut adapter, &id) value = self.get_gatt_descriptor(&mut adapter, &id)
.map(|d| d.read_value().unwrap_or(vec![])); .map(|d| d.read_value().unwrap_or(vec![]));
} }
let _ = sender.send(value.ok_or(BluetoothError::NotSupported)); let _ = sender.send(value.ok_or(BluetoothError::InvalidState));
} }
fn write_value(&mut self, id: String, value: Vec<u8>, sender: IpcSender<BluetoothResult<bool>>) { fn write_value(&mut self, id: String, value: Vec<u8>, sender: IpcSender<BluetoothResult<bool>>) {
@ -895,7 +919,7 @@ impl BluetoothManager {
Ok(_) => Ok(true), Ok(_) => Ok(true),
Err(_) => return drop(sender.send(Err(BluetoothError::NotSupported))), Err(_) => return drop(sender.send(Err(BluetoothError::NotSupported))),
}, },
None => return drop(sender.send(Err(BluetoothError::NotSupported))), None => return drop(sender.send(Err(BluetoothError::InvalidState))),
}; };
let _ = sender.send(message); let _ = sender.send(message);
} }

View file

@ -20,6 +20,7 @@ pub enum BluetoothError {
NotFound, NotFound,
NotSupported, NotSupported,
Security, Security,
InvalidState,
} }
#[derive(Deserialize, Serialize)] #[derive(Deserialize, Serialize)]

View file

@ -289,6 +289,7 @@ impl From<BluetoothError> for Error {
BluetoothError::NotFound => Error::NotFound, BluetoothError::NotFound => Error::NotFound,
BluetoothError::NotSupported => Error::NotSupported, BluetoothError::NotSupported => Error::NotSupported,
BluetoothError::Security => Error::Security, BluetoothError::Security => Error::Security,
BluetoothError::InvalidState => Error::InvalidState,
} }
} }
} }

View file

@ -1,4 +0,0 @@
[service-is-removed.html]
type: testharness
[Service is removed. Reject with InvalidStateError.]
expected: FAIL

View file

@ -1,4 +0,0 @@
[service-is-removed-with-uuid.html]
type: testharness
[Service is removed. Reject with InvalidStateError.]
expected: FAIL

View file

@ -1,4 +0,0 @@
[service-is-removed.html]
type: testharness
[Service is removed. Reject with InvalidStateError.]
expected: FAIL

View file

@ -1,4 +0,0 @@
[characteristic-is-removed.html]
type: testharness
[Characteristic is removed. Reject with InvalidStateError.]
expected: FAIL

View file

@ -1,4 +0,0 @@
[characteristic-is-removed-with-uuid.html]
type: testharness
[Characteristic is removed. Reject with InvalidStateError.]
expected: FAIL

View file

@ -1,4 +0,0 @@
[characteristic-is-removed.html]
type: testharness
[Characteristic is removed. Reject with InvalidStateError.]
expected: FAIL

View file

@ -1,4 +0,0 @@
[characteristic-is-removed.html]
type: testharness
[Characteristic gets removed. Reject with InvalidStateError.]
expected: FAIL

View file

@ -1,4 +0,0 @@
[service-is-removed.html]
type: testharness
[Service gets removed. Reject with InvalidStateError.]
expected: FAIL

View file

@ -1,4 +0,0 @@
[characteristic-is-removed.html]
type: testharness
[Characteristic gets removed. Reject with InvalidStateError.]
expected: FAIL

View file

@ -1,4 +0,0 @@
[descriptor-is-removed.html]
type: testharness
[Descriptor gets removed. Reject with InvalidStateError.]
expected: FAIL

View file

@ -1,4 +0,0 @@
[service-is-removed.html]
type: testharness
[Service gets removed. Reject with InvalidStateError.]
expected: FAIL

View file

@ -1,4 +0,0 @@
[characteristic-is-removed.html]
type: testharness
[Characteristic gets removed. Reject with InvalidStateError.]
expected: FAIL

View file

@ -1,4 +0,0 @@
[service-is-removed.html]
type: testharness
[Service gets removed. Reject with InvalidStateError.]
expected: FAIL

View file

@ -1,4 +0,0 @@
[characteristic-is-removed.html]
type: testharness
[Characteristic gets removed. Reject with InvalidStateError.]
expected: FAIL

View file

@ -1,4 +0,0 @@
[descriptor-is-removed.html]
type: testharness
[Descriptor gets removed. Reject with InvalidStateError.]
expected: FAIL

View file

@ -1,4 +0,0 @@
[service-is-removed.html]
type: testharness
[Service gets removed. Reject with InvalidStateError.]
expected: FAIL