+function _setReadWriteValueRequestCallbacksIfPresent(
+ object,
+ readValueRequestCallback,
+ readValueSendResponseSuccessCallback,
+ readValueSendResponseErrorCallback,
+ writeValueRequestCallback,
+ writeValueSendResponseSuccessCallback,
+ writeValueSendResponseErrorCallback,
+ successCallback,
+ errorCallback
+) {
+ if (
+ object instanceof BluetoothGATTServerCharacteristic ||
+ object instanceof BluetoothGATTServerDescriptor
+ ) {
+ if (readValueRequestCallback) {
+ object.setReadValueRequestCallback(
+ readValueRequestCallback,
+ successCallback,
+ errorCallback,
+ readValueSendResponseSuccessCallback,
+ readValueSendResponseErrorCallback
+ );
+ }
+ if (writeValueRequestCallback) {
+ object.setWriteValueRequestCallback(
+ writeValueRequestCallback,
+ successCallback,
+ errorCallback,
+ writeValueSendResponseSuccessCallback,
+ writeValueSendResponseErrorCallback
+ );
+ }
+ }
+}
+
+function _countCallbackToRegisterInService(service) {
+ var count = 0;
+ for (var serviceIndex = 0; serviceIndex < service.services.length; ++serviceIndex) {
+ count = count + _countCallbackToRegisterInService(service.services[serviceIndex]);
+ }
+
+ for (
+ var characteristicIndex = 0;
+ characteristicIndex < service.characteristics.length;
+ ++characteristicIndex
+ ) {
+ var characteristic = service.characteristics[characteristicIndex];
+ if (characteristic['_readValueRequestCallback']) {
+ count++;
+ }
+ if (characteristic['_writeValueRequestCallback']) {
+ count++;
+ }
+ for (
+ var descriptorIndex = 0;
+ descriptorIndex < characteristic.descriptors.length;
+ ++descriptorIndex
+ ) {
+ var descriptor = characteristic.descriptors[descriptorIndex];
+ if (descriptor['_readValueRequestCallback']) {
+ count++;
+ }
+ if (descriptor['_writeValueRequestCallback']) {
+ count++;
+ }
+ }
+ }
+ return count;
+}
+
+function _registerReadWriteValueRequestCallbacksInGATTServiceRecursively(
+ service,
+ callbacksAggregator
+) {
+ for (var serviceIndex = 0; serviceIndex < service.services.length; ++serviceIndex) {
+ _registerReadWriteValueRequestCallbacksInGATTServiceRecursively(
+ service.services[serviceIndex],
+ callbacksAggregator
+ );
+ }
+
+ for (
+ var characteristicIndex = 0;
+ characteristicIndex < service.characteristics.length;
+ ++characteristicIndex
+ ) {
+ var characteristic = service.characteristics[characteristicIndex];
+ // Callbacks for characteristics
+ _setReadWriteValueRequestCallbacksIfPresent(
+ characteristic,
+ characteristic['_readValueRequestCallback'],
+ characteristic['_readValueSendResponseSuccessCallback'],
+ characteristic['_readValueSendResponseErrorCallback'],
+ characteristic['_writeValueRequestCallback'],
+ characteristic['_writeValueSendResponseSuccessCallback'],
+ characteristic['_writeValueSendResponseErrorCallback'],
+ callbacksAggregator.successCallback,
+ callbacksAggregator.errorCallback
+ );
+ for (
+ var descriptorIndex = 0;
+ descriptorIndex < characteristic.descriptors.length;
+ ++descriptorIndex
+ ) {
+ // Callbacks for descriptors
+ var descriptor = characteristic.descriptors[descriptorIndex];
+ _setReadWriteValueRequestCallbacksIfPresent(
+ descriptor,
+ descriptor['_readValueRequestCallback'],
+ descriptor['_readValueSendResponseSuccessCallback'],
+ descriptor['_readValueSendResponseErrorCallback'],
+ descriptor['_writeValueRequestCallback'],
+ descriptor['_writeValueSendResponseSuccessCallback'],
+ descriptor['_writeValueSendResponseErrorCallback'],
+ callbacksAggregator.successCallback,
+ callbacksAggregator.errorCallback
+ );
+ }
+ }
+}
+
+function _registerReadWriteValueRequestCallbacksInGATTService(
+ service,
+ successCallback,
+ errorCallback
+) {
+ var count = _countCallbackToRegisterInService(service);
+ var callbacksAggregator = new ResultCallbacksAggregator(
+ count,
+ function onAllSucceeded() {
+ successCallback();
+ },
+ function onFailure(error) {
+ errorCallback(error);
+ }
+ );
+
+ _registerReadWriteValueRequestCallbacksInGATTServiceRecursively(
+ service,
+ callbacksAggregator
+ );
+}
+