| OLD | NEW | 
|---|
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be | 
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. | 
| 4 | 4 | 
| 5 #include "device/bluetooth/dbus/fake_bluetooth_gatt_characteristic_client.h" | 5 #include "device/bluetooth/dbus/fake_bluetooth_gatt_characteristic_client.h" | 
| 6 | 6 | 
| 7 #include "base/bind.h" | 7 #include "base/bind.h" | 
| 8 #include "base/location.h" | 8 #include "base/location.h" | 
| 9 #include "base/rand_util.h" | 9 #include "base/rand_util.h" | 
| 10 #include "base/single_thread_task_runner.h" | 10 #include "base/single_thread_task_runner.h" | 
| (...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 127     return heart_rate_control_point_properties_.get(); | 127     return heart_rate_control_point_properties_.get(); | 
| 128   } | 128   } | 
| 129   return NULL; | 129   return NULL; | 
| 130 } | 130 } | 
| 131 | 131 | 
| 132 void FakeBluetoothGattCharacteristicClient::ReadValue( | 132 void FakeBluetoothGattCharacteristicClient::ReadValue( | 
| 133     const dbus::ObjectPath& object_path, | 133     const dbus::ObjectPath& object_path, | 
| 134     const ValueCallback& callback, | 134     const ValueCallback& callback, | 
| 135     const ErrorCallback& error_callback) { | 135     const ErrorCallback& error_callback) { | 
| 136   if (!authenticated_) { | 136   if (!authenticated_) { | 
| 137     error_callback.Run("org.bluez.Error.NotPaired", "Please login"); | 137     error_callback.Run(bluetooth_gatt_service::kErrorNotPaired, "Please login"); | 
| 138     return; | 138     return; | 
| 139   } | 139   } | 
| 140 | 140 | 
| 141   if (!authorized_) { | 141   if (!authorized_) { | 
| 142     error_callback.Run("org.bluez.Error.NotAuthorized", "Authorize first"); | 142     error_callback.Run(bluetooth_gatt_service::kErrorNotAuthorized, | 
|  | 143                        "Authorize first"); | 
| 143     return; | 144     return; | 
| 144   } | 145   } | 
| 145 | 146 | 
| 146   if (object_path.value() == heart_rate_control_point_path_) { | 147   if (object_path.value() == heart_rate_control_point_path_) { | 
| 147     error_callback.Run("org.bluez.Error.NotPermitted", | 148     error_callback.Run(bluetooth_gatt_service::kErrorReadNotPermitted, | 
| 148                        "Reads of this value are not allowed"); | 149                        "Reads of this value are not allowed"); | 
| 149     return; | 150     return; | 
| 150   } | 151   } | 
| 151 | 152 | 
| 152   if (object_path.value() == heart_rate_measurement_path_) { | 153   if (object_path.value() == heart_rate_measurement_path_) { | 
| 153     error_callback.Run("org.bluez.Error.NotSupported", | 154     error_callback.Run(bluetooth_gatt_service::kErrorNotSupported, | 
| 154                        "Action not supported on this characteristic"); | 155                        "Action not supported on this characteristic"); | 
| 155     return; | 156     return; | 
| 156   } | 157   } | 
| 157 | 158 | 
| 158   if (object_path.value() != body_sensor_location_path_) { | 159   if (object_path.value() != body_sensor_location_path_) { | 
| 159     error_callback.Run(kUnknownCharacteristicError, ""); | 160     error_callback.Run(kUnknownCharacteristicError, ""); | 
| 160     return; | 161     return; | 
| 161   } | 162   } | 
| 162 | 163 | 
| 163   if (action_extra_requests_.find("ReadValue") != | 164   if (action_extra_requests_.find("ReadValue") != | 
| 164       action_extra_requests_.end()) { | 165       action_extra_requests_.end()) { | 
| 165     DelayedCallback* delayed = action_extra_requests_["ReadValue"]; | 166     DelayedCallback* delayed = action_extra_requests_["ReadValue"]; | 
| 166     delayed->delay_--; | 167     delayed->delay_--; | 
| 167     error_callback.Run("org.bluez.Error.InProgress", | 168     error_callback.Run(bluetooth_gatt_service::kErrorInProgress, | 
| 168                        "Another read is currenty in progress"); | 169                        "Another read is currenty in progress"); | 
| 169     if (delayed->delay_ == 0) { | 170     if (delayed->delay_ == 0) { | 
| 170       delayed->callback_.Run(); | 171       delayed->callback_.Run(); | 
| 171       action_extra_requests_.erase("ReadValue"); | 172       action_extra_requests_.erase("ReadValue"); | 
| 172       delete delayed; | 173       delete delayed; | 
| 173     } | 174     } | 
| 174     return; | 175     return; | 
| 175   } | 176   } | 
| 176 | 177 | 
| 177   base::Closure completed_callback; | 178   base::Closure completed_callback; | 
| (...skipping 15 matching lines...) Expand all  Loading... | 
| 193 | 194 | 
| 194   completed_callback.Run(); | 195   completed_callback.Run(); | 
| 195 } | 196 } | 
| 196 | 197 | 
| 197 void FakeBluetoothGattCharacteristicClient::WriteValue( | 198 void FakeBluetoothGattCharacteristicClient::WriteValue( | 
| 198     const dbus::ObjectPath& object_path, | 199     const dbus::ObjectPath& object_path, | 
| 199     const std::vector<uint8_t>& value, | 200     const std::vector<uint8_t>& value, | 
| 200     const base::Closure& callback, | 201     const base::Closure& callback, | 
| 201     const ErrorCallback& error_callback) { | 202     const ErrorCallback& error_callback) { | 
| 202   if (!authenticated_) { | 203   if (!authenticated_) { | 
| 203     error_callback.Run("org.bluez.Error.NotPaired", "Please login"); | 204     error_callback.Run(bluetooth_gatt_service::kErrorNotPaired, "Please login"); | 
| 204     return; | 205     return; | 
| 205   } | 206   } | 
| 206 | 207 | 
| 207   if (!authorized_) { | 208   if (!authorized_) { | 
| 208     error_callback.Run("org.bluez.Error.NotAuthorized", "Authorize first"); | 209     error_callback.Run(bluetooth_gatt_service::kErrorNotAuthorized, | 
|  | 210                        "Authorize first"); | 
| 209     return; | 211     return; | 
| 210   } | 212   } | 
| 211 | 213 | 
| 212   if (!IsHeartRateVisible()) { | 214   if (!IsHeartRateVisible()) { | 
| 213     error_callback.Run(kUnknownCharacteristicError, ""); | 215     error_callback.Run(kUnknownCharacteristicError, ""); | 
| 214     return; | 216     return; | 
| 215   } | 217   } | 
| 216 | 218 | 
| 217   if (object_path.value() == heart_rate_measurement_path_) { | 219   if (object_path.value() == heart_rate_measurement_path_) { | 
| 218     error_callback.Run("org.bluez.Error.NotSupported", | 220     error_callback.Run(bluetooth_gatt_service::kErrorNotSupported, | 
| 219                        "Action not supported on this characteristic"); | 221                        "Action not supported on this characteristic"); | 
| 220     return; | 222     return; | 
| 221   } | 223   } | 
| 222 | 224 | 
| 223   if (object_path.value() != heart_rate_control_point_path_) { | 225   if (object_path.value() != heart_rate_control_point_path_) { | 
| 224     error_callback.Run("org.bluez.Error.NotPermitted", | 226     error_callback.Run(bluetooth_gatt_service::kErrorWriteNotPermitted, | 
| 225                        "Writes of this value are not allowed"); | 227                        "Writes of this value are not allowed"); | 
| 226     return; | 228     return; | 
| 227   } | 229   } | 
| 228 | 230 | 
| 229   DCHECK(heart_rate_control_point_properties_.get()); | 231   DCHECK(heart_rate_control_point_properties_.get()); | 
| 230   if (action_extra_requests_.find("WriteValue") != | 232   if (action_extra_requests_.find("WriteValue") != | 
| 231       action_extra_requests_.end()) { | 233       action_extra_requests_.end()) { | 
| 232     DelayedCallback* delayed = action_extra_requests_["WriteValue"]; | 234     DelayedCallback* delayed = action_extra_requests_["WriteValue"]; | 
| 233     delayed->delay_--; | 235     delayed->delay_--; | 
| 234     error_callback.Run("org.bluez.Error.InProgress", | 236     error_callback.Run(bluetooth_gatt_service::kErrorInProgress, | 
| 235                        "Another write is in progress"); | 237                        "Another write is in progress"); | 
| 236     if (delayed->delay_ == 0) { | 238     if (delayed->delay_ == 0) { | 
| 237       delayed->callback_.Run(); | 239       delayed->callback_.Run(); | 
| 238       action_extra_requests_.erase("WriteValue"); | 240       action_extra_requests_.erase("WriteValue"); | 
| 239       delete delayed; | 241       delete delayed; | 
| 240     } | 242     } | 
| 241     return; | 243     return; | 
| 242   } | 244   } | 
| 243   base::Closure completed_callback; | 245   base::Closure completed_callback; | 
| 244   if (value.size() != 1) { | 246   if (value.size() != 1) { | 
|  | 247     completed_callback = base::Bind( | 
|  | 248         error_callback, bluetooth_gatt_service::kErrorInvalidValueLength, | 
|  | 249         "Invalid length for write"); | 
|  | 250   } else if (value[0] > 1) { | 
| 245     completed_callback = | 251     completed_callback = | 
| 246         base::Bind(error_callback, "org.bluez.Error.InvalidValueLength", | 252         base::Bind(error_callback, bluetooth_gatt_service::kErrorFailed, | 
| 247                    "Invalid length for write"); | 253                    "Invalid value given for write"); | 
| 248   } else if (value[0] > 1) { |  | 
| 249     completed_callback = base::Bind(error_callback, "org.bluez.Error.Failed", |  | 
| 250                                     "Invalid value given for write"); |  | 
| 251   } else if (value[0] == 1) { | 254   } else if (value[0] == 1) { | 
| 252     // TODO(jamuraa): make this happen when the callback happens | 255     // TODO(jamuraa): make this happen when the callback happens | 
| 253     calories_burned_ = 0; | 256     calories_burned_ = 0; | 
| 254     completed_callback = callback; | 257     completed_callback = callback; | 
| 255   } | 258   } | 
| 256 | 259 | 
| 257   if (extra_requests_ > 0) { | 260   if (extra_requests_ > 0) { | 
| 258     action_extra_requests_["WriteValue"] = | 261     action_extra_requests_["WriteValue"] = | 
| 259         new DelayedCallback(completed_callback, extra_requests_); | 262         new DelayedCallback(completed_callback, extra_requests_); | 
| 260     return; | 263     return; | 
| 261   } | 264   } | 
| 262   completed_callback.Run(); | 265   completed_callback.Run(); | 
| 263 } | 266 } | 
| 264 | 267 | 
| 265 void FakeBluetoothGattCharacteristicClient::StartNotify( | 268 void FakeBluetoothGattCharacteristicClient::StartNotify( | 
| 266     const dbus::ObjectPath& object_path, | 269     const dbus::ObjectPath& object_path, | 
| 267     const base::Closure& callback, | 270     const base::Closure& callback, | 
| 268     const ErrorCallback& error_callback) { | 271     const ErrorCallback& error_callback) { | 
| 269   if (!IsHeartRateVisible()) { | 272   if (!IsHeartRateVisible()) { | 
| 270     error_callback.Run(kUnknownCharacteristicError, ""); | 273     error_callback.Run(kUnknownCharacteristicError, ""); | 
| 271     return; | 274     return; | 
| 272   } | 275   } | 
| 273 | 276 | 
| 274   if (object_path.value() != heart_rate_measurement_path_) { | 277   if (object_path.value() != heart_rate_measurement_path_) { | 
| 275     error_callback.Run("org.bluez.Error.NotSupported", | 278     error_callback.Run(bluetooth_gatt_service::kErrorNotSupported, | 
| 276                        "This characteristic does not support notifications"); | 279                        "This characteristic does not support notifications"); | 
| 277     return; | 280     return; | 
| 278   } | 281   } | 
| 279 | 282 | 
| 280   if (heart_rate_measurement_properties_->notifying.value()) { | 283   if (heart_rate_measurement_properties_->notifying.value()) { | 
| 281     error_callback.Run("org.bluez.Error.InProgress", | 284     error_callback.Run(bluetooth_gatt_service::kErrorInProgress, | 
| 282                        "Characteristic already notifying"); | 285                        "Characteristic already notifying"); | 
| 283     return; | 286     return; | 
| 284   } | 287   } | 
| 285 | 288 | 
| 286   heart_rate_measurement_properties_->notifying.ReplaceValue(true); | 289   heart_rate_measurement_properties_->notifying.ReplaceValue(true); | 
| 287   ScheduleHeartRateMeasurementValueChange(); | 290   ScheduleHeartRateMeasurementValueChange(); | 
| 288 | 291 | 
| 289   // Respond asynchronously. | 292   // Respond asynchronously. | 
| 290   base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( | 293   base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( | 
| 291       FROM_HERE, callback, | 294       FROM_HERE, callback, | 
| 292       base::TimeDelta::FromMilliseconds(kStartNotifyResponseIntervalMs)); | 295       base::TimeDelta::FromMilliseconds(kStartNotifyResponseIntervalMs)); | 
| 293 } | 296 } | 
| 294 | 297 | 
| 295 void FakeBluetoothGattCharacteristicClient::StopNotify( | 298 void FakeBluetoothGattCharacteristicClient::StopNotify( | 
| 296     const dbus::ObjectPath& object_path, | 299     const dbus::ObjectPath& object_path, | 
| 297     const base::Closure& callback, | 300     const base::Closure& callback, | 
| 298     const ErrorCallback& error_callback) { | 301     const ErrorCallback& error_callback) { | 
| 299   if (!IsHeartRateVisible()) { | 302   if (!IsHeartRateVisible()) { | 
| 300     error_callback.Run(kUnknownCharacteristicError, ""); | 303     error_callback.Run(kUnknownCharacteristicError, ""); | 
| 301     return; | 304     return; | 
| 302   } | 305   } | 
| 303 | 306 | 
| 304   if (object_path.value() != heart_rate_measurement_path_) { | 307   if (object_path.value() != heart_rate_measurement_path_) { | 
| 305     error_callback.Run("org.bluez.Error.NotSupported", | 308     error_callback.Run(bluetooth_gatt_service::kErrorNotSupported, | 
| 306                        "This characteristic does not support notifications"); | 309                        "This characteristic does not support notifications"); | 
| 307     return; | 310     return; | 
| 308   } | 311   } | 
| 309 | 312 | 
| 310   if (!heart_rate_measurement_properties_->notifying.value()) { | 313   if (!heart_rate_measurement_properties_->notifying.value()) { | 
| 311     error_callback.Run("org.bluez.Error.Failed", "Not notifying"); | 314     error_callback.Run(bluetooth_gatt_service::kErrorFailed, "Not notifying"); | 
| 312     return; | 315     return; | 
| 313   } | 316   } | 
| 314 | 317 | 
| 315   heart_rate_measurement_properties_->notifying.ReplaceValue(false); | 318   heart_rate_measurement_properties_->notifying.ReplaceValue(false); | 
| 316 | 319 | 
| 317   callback.Run(); | 320   callback.Run(); | 
| 318 } | 321 } | 
| 319 | 322 | 
| 320 void FakeBluetoothGattCharacteristicClient::ExposeHeartRateCharacteristics( | 323 void FakeBluetoothGattCharacteristicClient::ExposeHeartRateCharacteristics( | 
| 321     const dbus::ObjectPath& service_path) { | 324     const dbus::ObjectPath& service_path) { | 
| (...skipping 231 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 553   DCHECK(heart_rate_visible_ != heart_rate_measurement_path_.empty()); | 556   DCHECK(heart_rate_visible_ != heart_rate_measurement_path_.empty()); | 
| 554   DCHECK(heart_rate_visible_ != body_sensor_location_path_.empty()); | 557   DCHECK(heart_rate_visible_ != body_sensor_location_path_.empty()); | 
| 555   DCHECK(heart_rate_visible_ != heart_rate_control_point_path_.empty()); | 558   DCHECK(heart_rate_visible_ != heart_rate_control_point_path_.empty()); | 
| 556   DCHECK(heart_rate_visible_ == !!heart_rate_measurement_properties_.get()); | 559   DCHECK(heart_rate_visible_ == !!heart_rate_measurement_properties_.get()); | 
| 557   DCHECK(heart_rate_visible_ == !!body_sensor_location_properties_.get()); | 560   DCHECK(heart_rate_visible_ == !!body_sensor_location_properties_.get()); | 
| 558   DCHECK(heart_rate_visible_ == !!heart_rate_control_point_properties_.get()); | 561   DCHECK(heart_rate_visible_ == !!heart_rate_control_point_properties_.get()); | 
| 559   return heart_rate_visible_; | 562   return heart_rate_visible_; | 
| 560 } | 563 } | 
| 561 | 564 | 
| 562 }  // namespace bluez | 565 }  // namespace bluez | 
| OLD | NEW | 
|---|