From 827c8ea4d478dd9c7521d6b1a54055c9d3d78114 Mon Sep 17 00:00:00 2001 From: D4ryl00 Date: Thu, 29 Jun 2023 16:37:09 +0200 Subject: [PATCH] feat: add a build tag for proximity drivers Signed-off-by: D4ryl00 --- pkg/androidnearby/bridge_android.go | 4 +- pkg/androidnearby/bridge_unsupported.go | 4 +- pkg/ble-driver/BertyDevice_darwin.m | 230 +++++++++--------- pkg/ble-driver/BleInterface_darwin.m | 12 +- pkg/ble-driver/BleManager_darwin.m | 176 +++++++------- pkg/ble-driver/BleQueue.m | 24 +- pkg/ble-driver/CircularQueue.m | 18 +- pkg/ble-driver/ConnectedPeer.m | 2 +- pkg/ble-driver/CountDownLatch_darwin.m | 2 +- pkg/ble-driver/Logger.m | 18 +- pkg/ble-driver/PeerManager.m | 40 +-- pkg/ble-driver/TaskDelay.m | 4 +- pkg/ble-driver/WriteDataCache.m | 8 +- pkg/ble-driver/bridge_android.go | 4 +- pkg/ble-driver/bridge_darwin.go | 4 +- pkg/ble-driver/bridge_unsupported.go | 4 +- .../bridge_darwin.go | 4 +- .../bridge_unsupported.go | 4 +- .../driver/Logger.m | 18 +- .../driver/MCManager.m | 26 +- .../driver/cgo_bridge.go | 4 +- .../driver/mc-driver.m | 4 +- 22 files changed, 307 insertions(+), 307 deletions(-) diff --git a/pkg/androidnearby/bridge_android.go b/pkg/androidnearby/bridge_android.go index 0f07576c..8687ca2c 100644 --- a/pkg/androidnearby/bridge_android.go +++ b/pkg/androidnearby/bridge_android.go @@ -1,5 +1,5 @@ -//go:build android -// +build android +//go:build android && !noproximitytransport +// +build android,!noproximitytransport package androidnearby diff --git a/pkg/androidnearby/bridge_unsupported.go b/pkg/androidnearby/bridge_unsupported.go index 6689ba32..6092f63f 100644 --- a/pkg/androidnearby/bridge_unsupported.go +++ b/pkg/androidnearby/bridge_unsupported.go @@ -1,5 +1,5 @@ -//go:build !android -// +build !android +//go:build !android || noproximitytransport +// +build !android noproximitytransport package androidnearby diff --git a/pkg/ble-driver/BertyDevice_darwin.m b/pkg/ble-driver/BertyDevice_darwin.m index 3e006bf7..c6d4e8b7 100644 --- a/pkg/ble-driver/BertyDevice_darwin.m +++ b/pkg/ble-driver/BertyDevice_darwin.m @@ -1,4 +1,4 @@ -// +build darwin +// +build darwin,!noproximitytransport // // BertyDevice.m // ble @@ -19,7 +19,7 @@ CBService *getService(NSArray *services, NSString *uuid) { CBService *result = nil; - + for (CBService *service in services) { if ([service.UUID.UUIDString containsString:uuid] != NSNotFound) { result = service; @@ -33,59 +33,59 @@ @implementation BertyDevice - (instancetype)initWithPeripheral:(CBPeripheral *)peripheral logger:(Logger *__nonnull)logger central:(BleManager *)manager withName:(NSString *__nonnull)name { self = [self initWithIdentifier:[peripheral.identifier UUIDString] logger:logger central:manager asClient:TRUE]; - + if (self) { _peripheral = [peripheral retain]; _name = name; } - + return self; } - (instancetype)initWithIdentifier:(NSString *)identifier logger:(Logger *__nonnull)logger central:(BleManager *)manager asClient:(BOOL)client{ self = [super init]; - + if (self) { if (client) { _clientSideIdentifier = [identifier retain]; } else { _serverSideIdentifier = [identifier retain]; } - + _logger = [logger retain]; _peripheral = nil; _manager = manager; _remotePeerID = nil; _psm = 0; - + _connectionQ = [[BleQueue alloc] init: dispatch_get_main_queue() logger:logger]; _writeQ = [[BleQueue alloc] init: dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0) logger:logger]; _readQ = [[BleQueue alloc] init: dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0) logger:logger]; - + BOOL (^peerIDHandler)(NSData *data) = ^BOOL(NSData *data) { return [self handlePeerID:data]; }; - + BOOL (^writeHandler)(NSData *data) = ^BOOL(NSData *data) { return [self handleIncomingData:data]; }; - + _characteristicHandlers = [@{ [BleManager.writerUUID UUIDString]: [[writeHandler copy] autorelease], [BleManager.peerUUID UUIDString]: [[peerIDHandler copy] autorelease], } retain]; - + _characteristicData = [@{ [BleManager.writerUUID UUIDString]: [NSMutableData data], [BleManager.peerUUID UUIDString]: [NSMutableData data], } retain]; - + // put inside incoming message arrived before handsake is completed _dataCache = [[CircularQueue alloc] initWithCapacity:10]; - + _writerLatch = [[NSObject alloc] init]; } - + return self; } @@ -103,7 +103,7 @@ - (void)dealloc { [_characteristicData release]; [_dataCache release]; [_writerLatch release]; - + [super dealloc]; } @@ -111,13 +111,13 @@ - (NSString *__nonnull)getIdentifier { if (self.clientSideIdentifier != nil) { return self.clientSideIdentifier; } - + return self.serverSideIdentifier; } - (void)closeL2cap { [self.logger d:@"closeL2cap: device=%@", [self.logger SensitiveNSObject:[self getIdentifier]]]; - + if (self.l2capChannel != nil) { [self.l2capChannel.inputStream close]; [self.l2capChannel.outputStream close]; @@ -133,14 +133,14 @@ - (void)closeL2cap { - (void)closeBertyDevice { @synchronized (self) { [self.logger d:@"closeBertyDevice: device=%@", [self.logger SensitiveNSObject:[self getIdentifier]]]; - + if (!self.isDisconnecting) { self.isDisconnecting = TRUE; - + [self.connectionQ clear]; [self.writeQ clear]; [self.readQ clear]; - + [self closeL2cap]; if (self.peer != nil) { [self.manager.peerManager unregisterDevice:self]; @@ -158,16 +158,16 @@ - (BOOL)handlePeerID:(NSData *__nonnull)peerIDData { [self.logger e:@"handlePeerID: device=%@: peer already connected", [self.logger SensitiveNSObject:[self getIdentifier]]]; return FALSE; } - + NSMutableData *tmpData = [self.characteristicData objectForKey:[BleManager.peerUUID UUIDString]]; - + if ([peerIDData isEqual:[EOD dataUsingEncoding:NSUTF8StringEncoding]]) { // adding 0 byte unsigned char zeroByte = 0; @synchronized (tmpData) { [tmpData appendBytes:&zeroByte length:1]; } - + NSString *remotePeerID = [NSString stringWithUTF8String:[tmpData bytes]]; // reset tmpData [tmpData setLength:0]; @@ -198,7 +198,7 @@ - (BOOL)handleIncomingData:(NSData *__nonnull)data { if ([self.logger showSensitiveData]) { [BleManager printLongLog:[BleManager NSDataToHex:data]]; } - + if (self.l2capClientHandshakeRunning) { [self.l2capHandshakeRecvData appendBytes:data length:[data length]]; if ([self.l2capHandshakeRecvData length] < L2CAP_HANDSHAKE_DATA) { @@ -221,14 +221,14 @@ - (BOOL)handleIncomingData:(NSData *__nonnull)data { } else if (self.l2capServerHandshakeRunning) { if (!self.l2capHandshakeStepStatus) { [self.logger d:@"handleIncomingData: device=%@: server handshake received payload, going to write it back", [self.logger SensitiveNSObject:[self getIdentifier]]]; - + // the server side needs to know when it receives all 1st step data, so it must count data len self.l2capHandshakeRecvDataLen += [data length]; if (self.l2capHandshakeRecvDataLen == L2CAP_HANDSHAKE_DATA) { self.l2capHandshakeStepStatus = TRUE; self.l2capHandshakeRecvDataLen = 0; } - + if (![self l2capWrite:data]) { [self.logger e:@"handleIncomingData: device=%@: server handshake write error", [self.logger SensitiveNSObject:[self getIdentifier]]]; self.l2capServerHandshakeRunning = FALSE; @@ -246,12 +246,12 @@ - (BOOL)handleIncomingData:(NSData *__nonnull)data { [self.logger e:@"handleIncomingData: device=%@: peer not existing", [self.logger SensitiveNSObject:[self getIdentifier]]]; return [self putIncomingDataInCache:data]; } - + if (![self.peer isConnected]) { [self.logger d:@"handleIncomingData: device=%@: peer not connected, put data in cache", [self.logger SensitiveNSObject:[self getIdentifier]]]; return [self putIncomingDataInCache:data]; } - + [self.readQ add:^{ BLEBridgeReceiveFromPeer(self.remotePeerID, data); [self.readQ completedTask:nil]; @@ -266,14 +266,14 @@ - (void)handshake { [self.manager disconnect:self]; return ; } - + if (![self readToCharacteristic:self.peerIDCharacteristic]) { [self.manager disconnect:self]; return ; } - + [self negotiateL2cap]; - + if (![self setNotifyValue]) { [self.manager disconnect:self]; } @@ -288,10 +288,10 @@ - (BOOL)setNotifyValue { [self.peripheral setNotifyValue:TRUE forCharacteristic:self.writerCharacteristic]; } } withCallback:nil withDelay:0]; - + return TRUE; } - + return FALSE; } @@ -301,19 +301,19 @@ - (void)peripheral:(CBPeripheral *)peripheral didModifyServices:(NSArray [self.peripheral maximumWriteValueLengthForType:CBCharacteristicWriteWithResponse] ? [self.peripheral maximumWriteValueLengthForType:CBCharacteristicWriteWithResponse] : self.remainingData.length; - + result = [NSData dataWithBytes:[self.remainingData bytes] length:chunckSize]; - + if (self.remainingData.length <= chunckSize) { self.remainingData = nil; } else { @@ -357,7 +357,7 @@ - (NSData *)getDataToSend { initWithBytes:[self.remainingData bytes] + chunckSize length:[self.remainingData length] - chunckSize]; } - + return result; } @@ -367,16 +367,16 @@ - (BOOL)writeToCharacteristic:(NSData *)data forCharacteristic:(CBCharacteristic if ([self.logger showSensitiveData]) { [BleManager printLongLog:[BleManager NSDataToHex:data]]; } - + __block BOOL success = FALSE; NSData *toSend = nil; self.remainingData = data; - + while (self.remainingData.length > 0) { if (self.peripheral != nil && self.peripheral.state == CBPeripheralStateConnected) { toSend = [[self getDataToSend] retain]; CountDownLatch *countDownLatch = [[CountDownLatch alloc] initCount:1]; - + [self.logger d:@"writeToCharacteristic: device=%@: going to write payload=%@", [self.logger SensitiveNSObject:[self getIdentifier]], [self.logger SensitiveNSObject:[toSend base64EncodedStringWithOptions:0]]]; [self.writeQ add:^{ if (self.peripheral == nil || self.peripheral.state != CBPeripheralStateConnected) { @@ -385,7 +385,7 @@ - (BOOL)writeToCharacteristic:(NSData *)data forCharacteristic:(CBCharacteristic [countDownLatch countDown]; return ; } - + [self.logger d:@"writeToCharacteristic: device=%@: writing base64=%@ data=%@", [self.logger SensitiveNSObject:[self getIdentifier]], [self.logger SensitiveNSObject:[toSend base64EncodedStringWithOptions:0]], [self.logger SensitiveNSObject:[BleManager NSDataToHex:toSend]]]; [self.peripheral writeValue:toSend forCharacteristic:characteristic type:CBCharacteristicWriteWithResponse]; } withCallback:^(NSError *error){ @@ -393,12 +393,12 @@ - (BOOL)writeToCharacteristic:(NSData *)data forCharacteristic:(CBCharacteristic success = error == nil ? TRUE : FALSE; [countDownLatch countDown]; } withDelay:0]; - + [countDownLatch await]; [countDownLatch release]; - + [toSend release]; - + // don't write EOD is error occured if (!success) { [self.logger e:@"writeToCharacteristic error: device=%@: cancellation of the following writes", [self.logger SensitiveNSObject:[self getIdentifier]]]; @@ -409,10 +409,10 @@ - (BOOL)writeToCharacteristic:(NSData *)data forCharacteristic:(CBCharacteristic return FALSE; } } - + if (eod) { dispatch_semaphore_t sema = dispatch_semaphore_create(0); - + [self.logger d:@"writeToCharacteristic: device=%@ going to write EOD", [self.logger SensitiveNSObject:[self getIdentifier]]]; [self.writeQ add:^{ [self.logger d:@"writeToCharacteristic: device=%@ writing EOD", [self.logger SensitiveNSObject:[self getIdentifier]]]; @@ -422,36 +422,36 @@ - (BOOL)writeToCharacteristic:(NSData *)data forCharacteristic:(CBCharacteristic success = error == nil ? 1 : 0; dispatch_semaphore_signal(sema); } withDelay:0]; - + dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER); dispatch_release(sema); } - + return success; } } - (BOOL)readToCharacteristic:(CBCharacteristic *) characteristic { [self.logger d:@"readToCharacteristic called: device=%@", [self.logger SensitiveNSObject:[self getIdentifier]]]; - + if (self.peripheral == nil || self.peripheral.state != CBPeripheralStateConnected) { [self.logger e:@"readToCharacteristic error: device=%@ is not connected", [self.logger SensitiveNSObject:[self getIdentifier]]]; return FALSE; } - + __block BOOL success = FALSE; CountDownLatch *countDownLatch = [[CountDownLatch alloc] initCount:1]; - + [self.writeQ add:^{ [self.logger d:@"readToCharacteristic: device=%@: in queue", [self.logger SensitiveNSObject:[self getIdentifier]]]; - + if (self.peripheral == nil || self.peripheral.state != CBPeripheralStateConnected) { [self.logger e:@"readToCharacteristic: device=%@ is not connected", [self.logger SensitiveNSObject:[self getIdentifier]]]; success = FALSE; [countDownLatch countDown]; return ; } - + [self.peripheral readValueForCharacteristic:characteristic]; } withCallback:^(NSError *error){ if (error == nil) { @@ -463,22 +463,22 @@ - (BOOL)readToCharacteristic:(CBCharacteristic *) characteristic { } [countDownLatch countDown]; } withDelay:0]; - + [countDownLatch await]; [countDownLatch release]; - + return success; } - (void)peripheral:(CBPeripheral *)peripheral didUpdateNotificationStateForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error { [self.writeQ completedTask:error]; - + if (error) { [self.logger e:@"didUpdateNotificationStateForCharacteristic error: device=%@ characteristic=%@ error=%@", [self.logger SensitiveNSObject:[self getIdentifier]], [characteristic.UUID UUIDString], error]; [self.manager disconnect:self]; return; } - + self.peer = [self.manager.peerManager registerDevice:self withPeerID:self.remotePeerID isClient:TRUE]; if (self.peer == nil) { [self.logger e:@"didUpdateNotificationStateForCharacteristic error: device=%@: registerDevice failed", [self.logger SensitiveNSObject:[self getIdentifier]]]; @@ -491,25 +491,25 @@ - (void)peripheral:(CBPeripheral *)peripheral didUpdateNotificationStateForChara // Called when the value of the characteristic changed, whether by readValueForCharacteristic: or by a notification after a subscription - (void)peripheral:(CBPeripheral *)peripheral didUpdateValueForCharacteristic:(CBCharacteristic *)characteristic error:(nullable NSError *)error { [self.logger d:@"didUpdateValueForCharacteristic called: device=%@ characteristic=%@", [self.logger SensitiveNSObject:[self getIdentifier]], [characteristic.UUID UUIDString]]; - + if (error) { [self.logger e:@"didUpdateValueForCharacteristic error: device=%@ error=%@", [self.logger SensitiveNSObject:[self getIdentifier]], error]; [self.manager disconnect:self]; [self.writeQ completedTask:error]; return; } - + if ([characteristic.UUID isEqual:self.manager.peerUUID]) { if (characteristic.value != nil) { int psm; [[characteristic.value subdataWithRange:NSMakeRange(0, 4)] getBytes:&psm length:sizeof(psm)]; self.psm = NSSwapBigIntToHost(psm); NSString* remotePeerID = [NSString stringWithUTF8String: [[characteristic.value subdataWithRange:NSMakeRange(4, characteristic.value.length - 4)] bytes]]; - + [self.logger d:@"didUpdateValueForCharacteristic: device=%@ PSM=%d remotePID=%@", [self.logger SensitiveNSObject:[self getIdentifier]], self.psm, [self.logger SensitiveNSObject:remotePeerID]]; - + self.remotePeerID = remotePeerID; - + [self.writeQ completedTask:nil]; } else { [self.logger e:@"didUpdateValueForCharacteristic error: device=%@: characteristic doesn't have any value", [self.logger SensitiveNSObject:[self getIdentifier]]]; @@ -524,11 +524,11 @@ - (void)peripheral:(CBPeripheral *)peripheral didUpdateValueForCharacteristic:(C - (void)peripheral:(CBPeripheral *)peripheral didWriteValueForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error { [self.logger d:@"didWriteValueForCharacteristic called: device=%@", [self.logger SensitiveNSObject:[self getIdentifier]]]; - + if (error) { [self.logger e:@"didWriteValueForCharacteristic error: device=%@ characteristic=%@ error=%@", [self.logger SensitiveNSObject:[self getIdentifier]], [characteristic.UUID UUIDString], error]; } - + [self.writeQ completedTask:error]; } @@ -540,7 +540,7 @@ - (void)discoverCharacteristics:(nullable NSArray *)characteristics forService:( [self.manager disconnect:self]; return ; } - + [self.connectionQ add:^{ [self.peripheral discoverCharacteristics:characteristics forService:service]; } withCallback:nil withDelay:0]; @@ -548,15 +548,15 @@ - (void)discoverCharacteristics:(nullable NSArray *)characteristics forService:( - (void)peripheral:(CBPeripheral *)peripheral didDiscoverCharacteristicsForService:(CBService *)service error:(NSError *)error { [self.logger d:@"didDiscoverCharacteristicsForService called: device=%@", [self.logger SensitiveNSObject:[self getIdentifier]]]; - + [self.connectionQ completedTask:error]; - + if (error) { [self.logger e:@"didDiscoverCharacteristicsForService error: device=%@ error=%@", [self.logger SensitiveNSObject:[self getIdentifier]], error]; [self.manager disconnect:self]; return; } - + for (CBCharacteristic *chr in service.characteristics) { if ([chr.UUID isEqual:self.manager.peerUUID]) { self.peerIDCharacteristic = chr; @@ -566,13 +566,13 @@ - (void)peripheral:(CBPeripheral *)peripheral didDiscoverCharacteristicsForServi [self.logger d:@"didDiscoverCharacteristicsForService: device=%@: writer characteristic found", [self.logger SensitiveNSObject:[self getIdentifier]]]; } } - + if (self.peerIDCharacteristic == nil || self.writerCharacteristic == nil) { [self.logger e:@"didDiscoverCharacteristicsForService error: device=%@: not all characteristics found", [self.logger SensitiveNSObject:[self getIdentifier]]]; [self.manager disconnect:self]; return ; } - + dispatch_async(dispatch_get_global_queue(0, 0), ^{ [self handshake]; }); @@ -586,7 +586,7 @@ - (void)discoverServices:(NSArray *)serviceUUIDs { [self.manager disconnect:self]; return ; } - + self.peripheral.delegate = self; [self.connectionQ add:^{ [self.peripheral discoverServices:serviceUUIDs]; @@ -595,9 +595,9 @@ - (void)discoverServices:(NSArray *)serviceUUIDs { - (void)peripheral:(CBPeripheral *)peripheral didDiscoverServices:(NSError *)error { [self.logger d:@"didDiscoverServices called: device=%@", [self.logger SensitiveNSObject:[self getIdentifier]]]; - + [self.connectionQ completedTask:error]; - + if (error) { [self.logger e:@"didDiscoverServices error: device=%@ error=%@", [self.logger SensitiveNSObject:[self getIdentifier]], error]; [self.manager disconnect:self]; @@ -617,15 +617,15 @@ - (void)peripheral:(CBPeripheral *)peripheral didDiscoverServices:(NSError *)err - (BOOL) negotiateL2cap { [self.logger d:@"negotiateL2cap called: device=%@", [self.logger SensitiveNSObject:[self getIdentifier]]]; - + if (self.peripheral == nil || self.peripheral.state != CBPeripheralStateConnected) { [self.logger e:@"negotiateL2cap error: device=%@ is not connected", [self.logger SensitiveNSObject:[self getIdentifier]]]; return FALSE; } - + __block BOOL success = FALSE; CountDownLatch *countDownLatch = [[CountDownLatch alloc] initCount:1]; - + if (@available(iOS 11.0, *)) { if (self.psm != 0) { [self.connectionQ add:^{ @@ -641,7 +641,7 @@ - (BOOL) negotiateL2cap { } [countDownLatch countDown]; } withDelay:0]; - + [countDownLatch await]; [countDownLatch release]; } else { @@ -652,23 +652,23 @@ - (BOOL) negotiateL2cap { [self.logger d:@"negotiateL2cap: device=%@: iOS 11+ is required", [self.logger SensitiveNSObject:[self getIdentifier]]]; success = TRUE; // return TRUE to continue connection without L2cap } - + return success; } - (BOOL)l2capWrite:(NSData *__nonnull)data { __block BOOL success = FALSE; - + if (self.l2capChannel != nil) { dispatch_semaphore_t sema = dispatch_semaphore_create(0); - + [self.writeQ add:^{ @synchronized (self.writerLatch) { [self.logger d:@"l2capWrite: device=%@ len=%lu base64=%@", [self.logger SensitiveNSObject:[self getIdentifier]], [data length], [self.logger SensitiveNSObject:[data base64EncodedStringWithOptions:0]]]; if ([self.logger showSensitiveData]) { [BleManager printLongLog:[BleManager NSDataToHex:data]]; } - + self.l2capWriteIndex = 0; self.l2capWriteData = data; if ([self.l2capChannel.outputStream hasSpaceAvailable]) { @@ -676,25 +676,25 @@ - (BOOL)l2capWrite:(NSData *__nonnull)data { NSUInteger data_len = [data length]; NSUInteger len = (data_len >= L2CAP_BUFFER) ? L2CAP_BUFFER : (data_len); uint8_t buf[len]; - + (void)memcpy(buf, readBytes, len); - + self.l2capWriteIndex = [self.l2capChannel.outputStream write:(const uint8_t *)buf maxLength:len]; [self.logger d:@"l2capWrite: device=%@: wrote len=%zd", [self.logger SensitiveNSObject:[self getIdentifier]], self.l2capWriteIndex]; - + if (self.l2capWriteIndex == -1) { [self.logger e:@"l2capWrite error: device=%@", [self.logger SensitiveNSObject:[self getIdentifier]], self.l2capWriteIndex]; - + self.l2capWriteData = nil; [self.writeQ completedTask:[NSError errorWithDomain:@LOCAL_DOMAIN code:200 userInfo:@{@"Error reason": @"write error"}]]; return ; } - + if (self.l2capWriteIndex < data_len) { // write next data chunk when callback stream handleEvent: NSStreamEventHasSpaceAvailable is called [self.logger d:@"l2capWrite: device=%@: write completed but need more write space to send all data, waiting...", [self.logger SensitiveNSObject:[self getIdentifier]], self.l2capWriteIndex]; } else { [self.logger d:@"l2capWrite: device=%@: write completed and all data send", [self.logger SensitiveNSObject:[self getIdentifier]]]; - + self.l2capWriteData = nil; [self.writeQ completedTask:nil]; } @@ -712,10 +712,10 @@ - (BOOL)l2capWrite:(NSData *__nonnull)data { } dispatch_semaphore_signal(sema); } withDelay:0]; - + dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER); dispatch_release(sema); - + return success; } else { [self.logger e:@"l2capWrite error: device=%@: channel not set", [self.logger SensitiveNSObject:[self getIdentifier]]]; @@ -730,32 +730,32 @@ - (void)peripheral:(CBPeripheral *)peripheral didOpenL2CAPChannel:(CBL2CAPChanne [self.connectionQ completedTask:error]; return ; } - + self.l2capChannel = channel; - + self.l2capThread = [[NSThread alloc] initWithTarget:self selector:@selector(setupL2capStreams) object:nil]; [self.l2capThread start]; self.l2capClientHandshakeRunning = TRUE; self.useL2cap = [self testL2cap]; self.l2capClientHandshakeRunning = FALSE; - + // wait that server complete L2CAP tests [NSThread sleepForTimeInterval:2.0f]; - + [self.connectionQ completedTask:nil]; } - (void)setupL2capStreams { [self.logger d:@"setupL2capStreams called: device=%@", [self.logger SensitiveNSObject:[self getIdentifier]]]; - + self.l2capChannel.inputStream.delegate = self; [self.l2capChannel.inputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; [self.l2capChannel.inputStream open]; self.l2capChannel.outputStream.delegate = self; [self.l2capChannel.outputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; [self.l2capChannel.outputStream open]; - + @autoreleasepool { do { [[NSRunLoop currentRunLoop] run]; @@ -766,7 +766,7 @@ - (void)setupL2capStreams { - (NSMutableData *__nonnull)createRandomNSData:(int) capacity { NSMutableData* theData = [NSMutableData dataWithCapacity:capacity]; - + for (unsigned int i = 0 ; i < capacity / 4 ; ++i ) { u_int32_t randomBits = arc4random(); [theData appendBytes:(void *)&randomBits length:4]; @@ -781,13 +781,13 @@ - (BOOL)testL2cap { self.l2capHandshakeStepStatus = FALSE; self.l2capHandshakeRecvData = [NSMutableData dataWithCapacity:L2CAP_HANDSHAKE_DATA]; self.l2capHandshakeLatch = [[CountDownLatch alloc] initCount:1]; - + self.l2capHandshakeBlock = dispatch_block_create(DISPATCH_BLOCK_INHERIT_QOS_CLASS, ^{ [self.logger e:@"testL2cap: device=%@: timout hired", [self.logger SensitiveNSObject:[self getIdentifier]]]; [self.l2capHandshakeLatch countDown]; }); dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 10 * NSEC_PER_SEC), dispatch_get_main_queue(), self.l2capHandshakeBlock); - + // step 1 [self.logger d:@"testL2cap: device=%@: client going to write the 1st payload", [self.logger SensitiveNSObject:[self getIdentifier]]]; self.l2capHandshakeData = [self createRandomNSData:L2CAP_HANDSHAKE_DATA]; @@ -798,12 +798,12 @@ - (BOOL)testL2cap { self.l2capHandshakeRecvData = nil; return FALSE; } - + // waiting for receiving remote PID [self.l2capHandshakeLatch await]; self.l2capHandshakeData = nil; self.l2capHandshakeRecvData = nil; - + // step 2 if (self.l2capHandshakeStepStatus) { [self.logger d:@"testL2cap: device=%@: client going to write the 2nd payload", [self.logger SensitiveNSObject:[self getIdentifier]]]; @@ -811,11 +811,11 @@ - (BOOL)testL2cap { [self.logger e:@"testL2cap error: device=%@: client write error", [self.logger SensitiveNSObject:[self getIdentifier]]]; return FALSE; } - + [self.logger d:@"testL2cap: device=%@: client handshake completed", [self.logger SensitiveNSObject:[self getIdentifier]]]; return TRUE; } - + return FALSE; } @@ -845,12 +845,12 @@ - (void)stream:(NSStream *)stream handleEvent:(NSStreamEvent)eventCode { } else { [self.logger e:@"stream handleEvent error: NSStreamEventHasBytesAvailable: device=%@: nothing to read", [self.logger SensitiveNSObject:[self getIdentifier]]]; } - + break; } case NSStreamEventHasSpaceAvailable: { [self.logger d:@"stream handleEvent: NSStreamEventHasSpaceAvailable: device=%@", [self.logger SensitiveNSObject:[self getIdentifier]]]; - + if ((self.peer != nil && [self.peer isConnected]) || self.l2capServerHandshakeRunning || self.l2capClientHandshakeRunning) { @synchronized (self.writerLatch) { if (self.l2capWriteData != nil) { @@ -867,15 +867,15 @@ - (void)stream:(NSStream *)stream handleEvent:(NSStreamEvent)eventCode { } NSInteger wroteLen = [(NSOutputStream *)stream write:(const uint8_t *)buf maxLength:len]; [self.logger d:@"stream handleEvent: NSStreamEventHasSpaceAvailable: device=%@ wrote data offset=%lu len=%zd", [self.logger SensitiveNSObject:[self getIdentifier]], self.l2capWriteIndex, wroteLen]; - + if (wroteLen == -1) { [self.logger e:@"stream handleEvent error: NSStreamEventHasSpaceAvailable: device=%@ write: error", [self.logger SensitiveNSObject:[self getIdentifier]]]; self.l2capWriteData = nil; [self.writeQ completedTask:[NSError errorWithDomain:@LOCAL_DOMAIN code:200 userInfo:@{@"Error reason": @"write error"}]]; - + break; } - + self.l2capWriteIndex += wroteLen; if ([self.l2capWriteData length] == self.l2capWriteIndex) { [self.logger d:@"stream handleEvent: NSStreamEventHasSpaceAvailable: device=%@: write completed", [self.logger SensitiveNSObject:[self getIdentifier]]]; @@ -890,12 +890,12 @@ - (void)stream:(NSStream *)stream handleEvent:(NSStreamEvent)eventCode { } else { [self.logger e:@"stream handleEvent error: NSStreamEventHasSpaceAvailable: device=%@: device is not connected", [self.logger SensitiveNSObject:[self getIdentifier]]]; } - + break; } case NSStreamEventErrorOccurred: { [self.logger d:@"stream handleEvent: NSStreamEventErrorOccurred: device=%@", [self.logger SensitiveNSObject:[self getIdentifier]]]; - + [self.manager disconnect:self]; break; } @@ -923,7 +923,7 @@ - (void)stream:(NSStream *)stream handleEvent:(NSStreamEvent)eventCode { } [self.manager disconnect:self]; - + break; } } diff --git a/pkg/ble-driver/BleInterface_darwin.m b/pkg/ble-driver/BleInterface_darwin.m index 60b6832b..053c6fd8 100644 --- a/pkg/ble-driver/BleInterface_darwin.m +++ b/pkg/ble-driver/BleInterface_darwin.m @@ -1,4 +1,4 @@ -// +build darwin +// +build darwin,!noproximitytransport // // BleInterface.m // ble @@ -70,21 +70,21 @@ void BLEStop(void) { int BLESendToPeer(char *remotePID, void *payload, int length) { int status = 0; - + NSString *cPID = [[NSString alloc] initWithUTF8String:remotePID]; NSData *cPayload = [[NSData alloc] initWithBytes:payload length:length]; - + BertyDevice *bDevice = [getManager() findPeripheralFromPID:cPID]; if (bDevice == nil) { [getManager().logger e:@"BLESendToPeer error: no device found"]; return 0; } - + if (bDevice.peer == nil) { [getManager().logger e:@"BLESendToPeer error: peer object not found"]; return 0; } - + if (bDevice.useL2cap && bDevice.l2capChannel != nil) { status = [bDevice l2capWrite:cPayload]; } else { @@ -96,7 +96,7 @@ int BLESendToPeer(char *remotePID, void *payload, int length) { [getManager().logger e:@"BLESendToPeer error: device not connected"]; } } - + [cPID release]; [cPayload release]; return status; diff --git a/pkg/ble-driver/BleManager_darwin.m b/pkg/ble-driver/BleManager_darwin.m index 6bba187e..59f2990b 100644 --- a/pkg/ble-driver/BleManager_darwin.m +++ b/pkg/ble-driver/BleManager_darwin.m @@ -1,4 +1,4 @@ -// +build darwin +// +build darwin,!noproximitytransport // // BleManager.m // ble @@ -34,16 +34,16 @@ static inline char itoh(int i) { + (NSString *__nonnull)NSDataToHex:(NSData *__nonnull)data { NSUInteger i, len; unsigned char *buf, *bytes; - + len = data.length; bytes = (unsigned char*)data.bytes; buf = malloc(len*2); - + for (i=0; i> 4) & 0xF); buf[i*2+1] = itoh(bytes[i] & 0xF); } - + return [[[NSString alloc] initWithBytesNoCopy:buf length:len*2 encoding:NSASCIIStringEncoding @@ -70,7 +70,7 @@ + (void) printLongLog:(NSString *__nonnull)message { // TODO: No need to check error on this? - (instancetype __nonnull) initDriver:(BOOL)useExternalLogger { self = [super init]; - + if (self) { BOOL showSensitiveData = FALSE; if (useExternalLogger) { @@ -85,47 +85,47 @@ - (instancetype __nonnull) initDriver:(BOOL)useExternalLogger { _bleOn = [[CountDownLatch alloc] initCount:2]; _serviceAdded = [[CountDownLatch alloc] initCount:1]; _bDevices = [[NSMutableArray alloc] init]; - + _cManager = [[CBCentralManager alloc] initWithDelegate:self queue:dispatch_queue_create("CentralManager", DISPATCH_QUEUE_SERIAL) options:@{CBCentralManagerOptionShowPowerAlertKey:[NSNumber numberWithBool:NO]}]; - + _pManager = [[CBPeripheralManager alloc] initWithDelegate:self queue:dispatch_queue_create("PeripheralManager", DISPATCH_QUEUE_SERIAL) options:@{CBPeripheralManagerOptionShowPowerAlertKey:[NSNumber numberWithBool:NO]}]; - + [self initService]; [self addService]; } - + return self; } - (void)initService { [self.logger d:@"initService called"]; - + _scanning = FALSE; _serviceUUID = [[CBUUID UUIDWithString:SERVICE_UUID] retain]; _peerUUID = [[CBUUID UUIDWithString:PEER_ID_UUID] retain]; _writerUUID = [[CBUUID UUIDWithString:WRITER_UUID] retain]; - + _peerIDCharacteristic = [[CBMutableCharacteristic alloc] initWithType:self.peerUUID properties:CBCharacteristicPropertyRead | CBCharacteristicPropertyWrite value:nil permissions:CBAttributePermissionsReadable | CBAttributePermissionsWriteable]; - + _writerCharacteristic = [[CBMutableCharacteristic alloc] initWithType:self.writerUUID properties:CBCharacteristicPropertyWrite | CBCharacteristicPropertyNotify value:nil permissions:CBAttributePermissionsWriteable]; - + _bertyService = [[CBMutableService alloc] initWithType:self.serviceUUID primary:YES]; - + _bertyService.characteristics = [@[self.writerCharacteristic, self.peerIDCharacteristic] retain]; } @@ -145,7 +145,7 @@ - (void)dealloc { [_writerCharacteristic release]; [_bertyService.characteristics release]; [_bertyService release]; - + [super dealloc]; } @@ -176,13 +176,13 @@ - (void)startScanning { if (self.cmEnable && !self.scanning) { if (self.localPID != nil) { [self.logger d:@"startScanning called"]; - + NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:YES], CBCentralManagerScanOptionAllowDuplicatesKey, nil]; [self.cManager scanForPeripheralsWithServices:@[self.serviceUUID] options:options]; self.scanning = TRUE; - + dispatch_async(dispatch_get_main_queue(), ^(void){ self.scannerTimer = [NSTimer scheduledTimerWithTimeInterval:12.0 target:self selector:@selector(toggleScanner:) userInfo:nil repeats:YES]; }); @@ -206,14 +206,14 @@ - (void)toggleScanner:(NSTimer*)timer { CBCentralManagerScanOptionAllowDuplicatesKey, nil]; [self.cManager scanForPeripheralsWithServices:@[self.serviceUUID] options:options]; } - + } - (void)stopScanning { @synchronized (self.cManager) { if (self.cmEnable && self.scanning) { [self.logger d:@"stopScanning called"]; - + dispatch_async(dispatch_get_main_queue(), ^{ if (self.scannerTimer != nil) { if ([self.scannerTimer isValid]) { @@ -221,11 +221,11 @@ - (void)stopScanning { } self.scannerTimer = nil; } - + if ([self.cManager isScanning]) { [self.cManager stopScan]; } - + self.scanning = FALSE; }); } @@ -237,13 +237,13 @@ - (void)startAdvertising { if (self.pmEnable && ![self.pManager isAdvertising]) { if (self.ID != nil) { [self.logger d:@"startAdvertising called: ID=%@", [self.logger SensitiveNSObject:self.ID]]; - + // publish l2cap channel self.psm = 0; if (@available(iOS 11.0, *)) { [self.pManager publishL2CAPChannelWithEncryption:false]; } - + [self.pManager startAdvertising:@{ CBAdvertisementDataLocalNameKey:self.ID, CBAdvertisementDataServiceUUIDsKey:@[self.serviceUUID]}]; } else { [self.logger e:@"startAdvertising error: local ID is null"]; @@ -271,7 +271,7 @@ - (void)stopAdvertising { // Only the client side can disconnect - (void)disconnect:(BertyDevice *__nonnull)device { [self.logger d:@"closeAllConnections called: debice=%@", [self.logger SensitiveNSObject:[device clientSideIdentifier]]]; - + if (device.peripheral != nil && device.clientSideIdentifier != nil) { [self.logger d:@"disconnect: client device=%@", [self.logger SensitiveNSObject:[device clientSideIdentifier]]]; if (device.peripheral.state == CBPeripheralStateConnecting || device.peripheral.state == CBPeripheralStateConnected) { @@ -302,61 +302,61 @@ - (BOOL)writeAndNotify:(BertyDevice *__nonnull)device data:(NSData *__nonnull)da if ([self.logger showSensitiveData]) { [BleManager printLongLog:[BleManager NSDataToHex:data]]; } - + BOOL success = FALSE; NSUInteger mtu = device.cbCentral.maximumUpdateValueLength; NSUInteger offset = 0; NSUInteger dataLen = [data length]; - + while (offset < dataLen) { if (![device.peer isServerReady]) { [self.logger e:@"writeAndNotify error: device=%@ server not connected", [self.logger SensitiveNSObject:[device clientSideIdentifier]]]; return FALSE; } - + self.writerLactch = [[CountDownLatch alloc] initCount:1]; NSUInteger toWriteLen = (dataLen - offset) < mtu ? (dataLen - offset) : mtu; NSData *toWrite = [[data subdataWithRange:NSMakeRange(offset, toWriteLen)] retain]; - + if ([self.logger showSensitiveData]) { [self.logger d:@"writeAndNotify: device=%@ mtu=%lu base64=%@ data=%@", [device getIdentifier], mtu, [toWrite base64EncodedStringWithOptions:0], [BleManager NSDataToHex:toWrite]]; } - + // Need to add data to the cache prior to write it because sometime peripheralManagerIsReadyToUpdateSubscribers is called before data is put to the cache @synchronized (self.writeCache) { self.writeCache = [[WriteDataCache alloc] initWithDevice:device withData:toWrite]; [self.logger d:@"writeAndNotify: device=%@: data put in cache successfully", [self.logger SensitiveNSObject:[device getIdentifier]]]; } - + success = [self.pManager updateValue:toWrite forCharacteristic:self.writerCharacteristic onSubscribedCentrals:@[device.cbCentral]]; - + if (success) { [self.writerLactch countDown]; } else { [self.logger d:@"writeAndNotify: device=%@: operation queue is full and will be processed by the peripheralManagerIsReadyToUpdateSubscribers callback", [self.logger SensitiveNSObject:[device getIdentifier]]]; } - + [self.writerLactch await]; - + // take write status from peripheralManagerIsReadyToUpdateSubscribers if (!success) { success = self.writeStatus; } - + [self.writeCache release]; self.writeCache = nil; [self.writerLactch release]; self.writerLactch = nil; [toWrite release]; - + // this time write failed, don't continue if (!success) { break ; } - + offset += toWriteLen; } - + [self.logger d:@"writeAndNotify: device=%@: success=%d", [self.logger SensitiveNSObject:[device getIdentifier]], success]; return success; } @@ -365,7 +365,7 @@ - (BOOL)writeAndNotify:(BertyDevice *__nonnull)device data:(NSData *__nonnull)da - (BertyDevice *)findPeripheral:(CBPeripheral *)peripheral { BertyDevice *result = nil; - + @synchronized (self.bDevices) { for (BertyDevice *bDevice in self.bDevices) { if (bDevice.peripheral == peripheral) { @@ -374,7 +374,7 @@ - (BertyDevice *)findPeripheral:(CBPeripheral *)peripheral { } } } - + return result; } @@ -386,13 +386,13 @@ - (BertyDevice *)findPeripheralFromName:(NSString *) name { } } } - + return nil; } - (BertyDevice *)findPeripheralFromPID:(NSString *)peerID { BertyDevice *result = nil; - + @synchronized (self.bDevices) { for (BertyDevice *bDevice in self.bDevices) { if ([bDevice.remotePeerID isEqualToString:peerID]) { @@ -401,7 +401,7 @@ - (BertyDevice *)findPeripheralFromPID:(NSString *)peerID { } } } - + return result; } @@ -409,7 +409,7 @@ - (BertyDevice *)findPeripheralFromPID:(NSString *)peerID { - (BertyDevice *)findPeripheralFromIdentifier:(NSUUID *)identifier { BertyDevice *result = nil; NSString *id = [identifier UUIDString]; - + @synchronized (self.bDevices) { for (BertyDevice *bDevice in self.bDevices) { if ([bDevice.clientSideIdentifier isEqual:id]) { @@ -421,7 +421,7 @@ - (BertyDevice *)findPeripheralFromIdentifier:(NSUUID *)identifier { } } } - + return result; } @@ -429,7 +429,7 @@ - (BertyDevice *)findPeripheralFromIdentifier:(NSUUID *)identifier { - (void)centralManager:(CBCentralManager *)central didConnectPeripheral:(CBPeripheral *)peripheral { [self.logger i:@"didConnectPeripheral called: device=%@", [self.logger SensitiveNSObject:[peripheral.identifier UUIDString]]]; - + BertyDevice *bDevice = [self findPeripheral:peripheral]; if (bDevice == nil) { [self.logger e:@"didConnectPeripheral error: device=%@ not found", [self.logger SensitiveNSObject:[peripheral.identifier UUIDString]]]; @@ -441,7 +441,7 @@ - (void)centralManager:(CBCentralManager *)central didConnectPeripheral:(CBPerip - (void)centralManager:(CBCentralManager *)central didFailToConnectPeripheral:(CBPeripheral *)peripheral error:(NSError *)error { [self.logger i:@"didFailToConnectPeripheral called: device=%@", [self.logger SensitiveNSObject:[peripheral.identifier UUIDString]]]; - + BertyDevice *bDevice = [self findPeripheral:peripheral]; if (bDevice == nil) { [self.logger e:@"didFailToConnectPeripheral error: device=%@ not found", [self.logger SensitiveNSObject:[peripheral.identifier UUIDString]]]; @@ -454,11 +454,11 @@ - (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI { NSString *id = nil; - + if (advertisementData && [advertisementData.allKeys containsObject:CBAdvertisementDataLocalNameKey]) { // between 2 iOS id = [advertisementData valueForKeyPath:CBAdvertisementDataLocalNameKey]; - + } else if (advertisementData && [advertisementData.allKeys containsObject:CBAdvertisementDataServiceDataKey]) { // between Android / iOS NSDictionary *data = [advertisementData valueForKey:CBAdvertisementDataServiceDataKey]; @@ -475,19 +475,19 @@ - (void)centralManager:(CBCentralManager *)central // [self.logger e:@"didDiscoverPeripheral error: device=%@ has not advertisement name", [self.logger SensitiveNSObject:[peripheral.identifier UUIDString]]]; return ; } - + if ([id length] == 0) { [self.logger d:@"didDiscoverPeripheral error: device=%@: id is empty", [self.logger SensitiveNSObject:[peripheral.identifier UUIDString]]]; return ; } - + // only lower id can be client if ([self.ID compare:id] != NSOrderedAscending) { // Verbose // [self.logger d:@"didDiscoverPeripheral: device=%@: greater ID, cancel client connection", [self.logger SensitiveNSObject:[peripheral.identifier UUIDString]]]; return ; } - + BertyDevice *nDevice = [self findPeripheralFromIdentifier:peripheral.identifier]; if (nDevice != nil) { // peripheral already known if (nDevice.clientSideIdentifier != nil) { // peripheral already discovered @@ -500,11 +500,11 @@ - (void)centralManager:(CBCentralManager *)central nDevice.clientSideIdentifier = [peripheral.identifier UUIDString]; } else { nDevice = [self findPeripheralFromName:id]; - + if (nDevice != nil && nDevice.peripheral != nil) { // device already known with another peripheral object return ; } - + // TODO: retest if bDevices is still null after @synchronized @synchronized (self.bDevices) { nDevice = [[BertyDevice alloc]initWithPeripheral:peripheral logger:self.logger central:self withName:id]; @@ -536,7 +536,7 @@ - (void)peripheralManagerDidUpdateState:(nonnull CBPeripheralManager *)periphera @synchronized (self.pManager) { self.pmEnable = FALSE; } - + switch(peripheral.state) { case CBManagerStateUnknown: { @@ -580,7 +580,7 @@ - (void)centralManagerDidUpdateState:(nonnull CBCentralManager *)central { @synchronized (self.cManager) { self.cmEnable = FALSE; } - + switch(central.state) { case CBManagerStateResetting: { @@ -614,19 +614,19 @@ - (void)centralManagerDidUpdateState:(nonnull CBCentralManager *)central { - (void)peripheralManager:(CBPeripheralManager *)peripheral central:(CBCentral *)central didSubscribeToCharacteristic:(CBCharacteristic *)characteristic { [self.logger d:@"peripheralManager didSubscribeToCharacteristic called: device=%@", [self.logger SensitiveNSObject:[central.identifier UUIDString]]]; - + BertyDevice *device; if ((device = [self findPeripheralFromIdentifier:central.identifier]) == nil) { [self.logger e:@"peripheralManager didSubscribeToCharacteristic error: device=%@ not found", [self.logger SensitiveNSObject:[central.identifier UUIDString]]]; return ; } - + device.cbCentral = central; - + // Server doesn't know if the L2CAP handshake failed on the client side // so we have to set it manually at this step. device.l2capServerHandshakeRunning = FALSE; - + // complete handshake device.peer = [self.peerManager registerDevice:device withPeerID:device.remotePeerID isClient:FALSE]; if (device.peer == nil) { @@ -640,13 +640,13 @@ - (void)peripheralManager:(CBPeripheralManager *)peripheral central:(CBCentral * // server disconnection callback entry point - (void)peripheralManager:(CBPeripheralManager *)peripheral central:(CBCentral *)central didUnsubscribeFromCharacteristic:(CBCharacteristic *)characteristic { [self.logger d:@"peripheralManager didUnsubscribeFromCharacteristic called: device=%@", [self.logger SensitiveNSObject:[central.identifier UUIDString]]]; - + BertyDevice *device; if ((device = [self findPeripheralFromIdentifier:central.identifier]) == nil) { [self.logger e:@"peripheralManager didUnsubscribeFromCharacteristic error: device=%@ not found", [self.logger SensitiveNSObject:[central.identifier UUIDString]]]; return ; } - + [device closeBertyDevice]; @synchronized (self.bDevices) { [self.bDevices removeObject:device]; @@ -655,34 +655,34 @@ - (void)peripheralManager:(CBPeripheralManager *)peripheral central:(CBCentral * - (void)peripheralManagerIsReadyToUpdateSubscribers:(CBPeripheralManager *)peripheral { [self.logger d:@"peripheralManager peripheralManagerIsReadyToUpdateSubscribers called"]; - + self.writeStatus = FALSE; - + @synchronized(self.writeCache) { if (self.writeCache != nil) { if (self.logger.showSensitiveData) { [self.logger d:@"peripheralManagerIsReadyToUpdateSubscribers: device=%@ base64=%@ data=%@", [self.writeCache.device getIdentifier], [self.writeCache.data base64EncodedStringWithOptions:0], [BleManager NSDataToHex:self.writeCache.data]]; } - + if (self.writerLactch == nil) { [self.logger e:@"peripheralManagerIsReadyToUpdateSubscribers error: writer latch is null"]; return ; } - + if (self.writeCache.device.peer == nil) { [self.logger e:@"peripheralManagerIsReadyToUpdateSubscribers error: peer object not found"]; [self.writerLactch countDown]; return ; } - + if (![self.writeCache.device.peer isServerReady]) { [self.logger e:@"peripheralManagerIsReadyToUpdateSubscribers error: server not connected"]; [self.writerLactch countDown]; return ; } - + self.writeStatus = [self.pManager updateValue:self.writeCache.data forCharacteristic:self.writerCharacteristic onSubscribedCentrals:@[self.writeCache.device.cbCentral]]; - + if (self.writeStatus) { [self.logger d:@"peripheralManagerIsReadyToUpdateSubscribers: device=%@: data sent", [self.logger SensitiveNSObject:[self.writeCache.device getIdentifier]]]; [self.writerLactch countDown]; @@ -699,23 +699,23 @@ - (void)peripheralManagerIsReadyToUpdateSubscribers:(CBPeripheralManager *)perip - (void)peripheralManager:(CBPeripheralManager *)peripheral didReceiveReadRequest:(CBATTRequest *)request { [self.logger d:@"didReceiveReadRequests called: device=%@ offset=%lu", [self.logger SensitiveNSObject:[request.central.identifier UUIDString]], request.offset]; - + if ([request.characteristic.UUID isEqual:self.peerUUID]) { [self.logger d:@"didReceiveReadRequests: device=%@: use peerID characteristic", [self.logger SensitiveNSObject:[request.central.identifier UUIDString]]]; - + BertyDevice *device = [self findPeripheralFromIdentifier:request.central.identifier]; if (device == nil || device.remotePeerID == nil) { [self.logger e:@"didReceiveReadRequests: device=%@: need writeRequest completed before readRequest", [self.logger SensitiveNSObject:[request.central.identifier UUIDString]]]; [peripheral respondToRequest:request withResult:CBATTErrorReadNotPermitted]; return ; } - + // Write PSM to big endian int psm = NSSwapHostIntToBig(self.psm); NSMutableData *toSend = [[NSMutableData alloc] initWithBytes:&psm length:sizeof(psm)]; [toSend appendData:[self.localPID dataUsingEncoding:NSUTF8StringEncoding]]; request.value = toSend; - + [peripheral respondToRequest:request withResult:CBATTErrorSuccess]; [toSend release]; } else { @@ -729,18 +729,18 @@ - (void)peripheralManager:(CBPeripheralManager *)peripheral didReceiveReadReques #pragma mark - write - (void)peripheralManager:(CBPeripheralManager *)peripheral didReceiveWriteRequests:(NSArray *)requests { - + BertyDevice *device; NSData *data = nil; - + for (CBATTRequest *request in requests) { [self.logger d:@"didReceiveWriteRequests: device=%@ base64=%@", [self.logger SensitiveNSObject:[request.central.identifier UUIDString]], [self.logger SensitiveNSObject:[data base64EncodedStringWithOptions:0]]]; if (self.logger.showSensitiveData) { [BleManager printLongLog:[BleManager NSDataToHex:data]]; } - + CBMutableCharacteristic *characteristic; - + @synchronized (self.bDevices) { // check if we hold a remote device of this type device = [self findPeripheralFromIdentifier:request.central.identifier]; @@ -751,7 +751,7 @@ - (void)peripheralManager:(CBPeripheralManager *)peripheral didReceiveWriteReque [self.logger d:@"didReceiveWriteRequests: device=%@ added to BleManager.bDevices", [self.logger SensitiveNSObject:[request.central.identifier UUIDString]]]; } } - + if ([request.characteristic.UUID isEqual:self.writerUUID]) { characteristic = self.writerCharacteristic; } @@ -763,16 +763,16 @@ - (void)peripheralManager:(CBPeripheralManager *)peripheral didReceiveWriteReque [peripheral respondToRequest:request withResult:CBATTErrorWriteNotPermitted]; return ; } - + data = request.value; - + BOOL(^handler)(NSData *) = [device.characteristicHandlers objectForKey:[request.characteristic.UUID UUIDString]]; if (!handler(data)) { [self.logger e:@"didReceiveWriteRequests error: device=%@: handle failed", [self.logger SensitiveNSObject:[request.central.identifier UUIDString]]]; [device closeBertyDevice]; [peripheral respondToRequest:request withResult:CBATTErrorWriteNotPermitted]; } - + // Process response back request.value = [self.localPID dataUsingEncoding:NSUTF8StringEncoding]; } @@ -792,36 +792,36 @@ - (void)peripheralManager:(CBPeripheralManager *)peripheral didPublishL2CAPChann - (void)peripheralManager:(CBPeripheralManager *)peripheral didUnpublishL2CAPChannel:(CBL2CAPPSM)PSM error:(NSError *)error { [self.logger d:@"peripheralManager didUnpublishL2CAPChannel called"]; - + self.psm = 0; } - (void)peripheralManager:(CBPeripheralManager *)peripheral didOpenL2CAPChannel:(CBL2CAPChannel *)channel error:(NSError *)error API_AVAILABLE(ios(11.0)) { [self.logger d:@"peripheralManager didOpenL2CAPChannel called: device=%@", [self.logger SensitiveNSObject:[channel.peer.identifier UUIDString]]]; - + if (error != nil) { [self.logger e:@"peripheralManager didOpenL2CAPChannel error=%@", error]; return ; } - + BertyDevice *device; if ((device = [self findPeripheralFromIdentifier:channel.peer.identifier]) == nil) { [self.logger e:@"peripheralManager didOpenL2CAPChannel error: device=%@ not found", [self.logger SensitiveNSObject:[channel.peer.identifier UUIDString]]]; return ; } - + device.l2capChannel = channel; - + device.l2capThread = [[NSThread alloc] initWithBlock:^{ [self.logger d:@"peripheralManager didOpenL2CAPChannel: device=%@: in thread", [self.logger SensitiveNSObject:[device getIdentifier]]]; - + channel.inputStream.delegate = device; [channel.inputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; [channel.inputStream open]; channel.outputStream.delegate = device; [channel.outputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; [channel.outputStream open]; - + @autoreleasepool { do { [[NSRunLoop currentRunLoop] run]; @@ -829,7 +829,7 @@ - (void)peripheralManager:(CBPeripheralManager *)peripheral didOpenL2CAPChannel: } }]; [device.l2capThread start]; - + device.l2capServerHandshakeRunning = TRUE; } diff --git a/pkg/ble-driver/BleQueue.m b/pkg/ble-driver/BleQueue.m index 7f0f7642..18901a41 100644 --- a/pkg/ble-driver/BleQueue.m +++ b/pkg/ble-driver/BleQueue.m @@ -1,4 +1,4 @@ -// +build darwin +// +build darwin,!noproximitytransport // // BleQueue.m // BertyBridgeDemo @@ -13,13 +13,13 @@ @implementation BleQueue - (instancetype __nullable) init:(dispatch_queue_t)queue logger:(Logger *__nonnull)logger { self = [super init]; - + if (self) { _tasks = [[NSMutableArray alloc] init]; _queue = [queue retain]; _logger = [logger retain]; } - + return self; } @@ -45,12 +45,12 @@ - (void) add:(void (^__nonnull)(void))block withCallback:(void (^__nullable)(NSE - (void) completedTask:(NSError *__nullable)error { @synchronized (self.tasks) { TaskDelay *currentTask; - + if ([self.tasks count] == 0) { [self.logger e:@"BleQueue: completedTask error: no task running"]; return ; } - + currentTask = [self.tasks objectAtIndex:0]; [self.logger d:@"BleQueue: completedTask at index=%d", currentTask.index]; if (currentTask.callback != nil) { @@ -58,7 +58,7 @@ - (void) completedTask:(NSError *__nullable)error { currentTask.callback(error); }); } - + self.isRetrying = FALSE; self.taskQueueBusy = FALSE; [self.tasks removeObjectAtIndex:0]; @@ -69,20 +69,20 @@ - (void) completedTask:(NSError *__nullable)error { - (void) nextTask { @synchronized (self.tasks) { TaskDelay *nextTask; - + if (self.taskQueueBusy) { [self.logger d:@"BleQueue: nextTask: another task is running"]; return ; } - + if ([self.tasks count] == 0 ) { [self.logger d:@"BleQueue: nextTask error: no task queued: count=%ld", [self.tasks count]]; return ; } - + nextTask = [self.tasks objectAtIndex:0]; [self.logger d:@"BleQueue: nextTask at index=%d with delay=%ld", nextTask.index, nextTask.delay]; - + self.taskQueueBusy = TRUE; if (!self.isRetrying) { self.nbTries = 0; @@ -95,7 +95,7 @@ - (void) nextTask { - (void) retryTask { @synchronized (self.tasks) { TaskDelay *currentTask; - + self.taskQueueBusy = FALSE; if ([self.tasks count] == 0) { @@ -110,7 +110,7 @@ - (void) retryTask { self.isRetrying = TRUE; } } - + [self nextTask]; } } diff --git a/pkg/ble-driver/CircularQueue.m b/pkg/ble-driver/CircularQueue.m index b0b64963..8fe99102 100644 --- a/pkg/ble-driver/CircularQueue.m +++ b/pkg/ble-driver/CircularQueue.m @@ -1,4 +1,4 @@ -// +build darwin +// +build darwin,!noproximitytransport #import "CircularQueue.h" @@ -6,7 +6,7 @@ @implementation CircularQueue - (instancetype __nonnull)initWithCapacity:(NSUInteger)capacity { self = [super init]; - + if (self) { _capacity = capacity < 1 ? DEFAULT_CAPACITY : capacity; _data = [[NSMutableArray alloc] initWithCapacity:_capacity]; @@ -17,13 +17,13 @@ - (instancetype __nonnull)initWithCapacity:(NSUInteger)capacity { [_data addObject:[NSNull null]]; } } - + return self; } - (void)dealloc { [_data release]; - + [super dealloc]; } @@ -31,7 +31,7 @@ - (void)offer:(id)obj { if ([self isNotFull]) { NSInteger nextWrite = (self.writeSequence + 1) % self.capacity; [self.data replaceObjectAtIndex:nextWrite withObject:obj]; - + self.writeSequence++; } else { @throw [[[NSException alloc] initWithName:NSRangeException reason:nil userInfo:nil] autorelease]; @@ -42,13 +42,13 @@ - (id)poll { if ([self isNotEmpty]) { NSInteger index = self.readSequence % self.capacity; id value = [[self.data objectAtIndex:index] retain]; - + [self.data replaceObjectAtIndex:index withObject:[NSNull null]]; self.readSequence++; - + return [value autorelease]; } - + return [NSNull null]; } @@ -57,7 +57,7 @@ - (id)element { NSInteger index = self.readSequence % self.capacity; return [self.data objectAtIndex:index]; } - + return [NSNull null]; } diff --git a/pkg/ble-driver/ConnectedPeer.m b/pkg/ble-driver/ConnectedPeer.m index bc7e7289..1c93a61a 100644 --- a/pkg/ble-driver/ConnectedPeer.m +++ b/pkg/ble-driver/ConnectedPeer.m @@ -1,4 +1,4 @@ -// +build darwin +// +build darwin,!noproximitytransport // // ConnectedPeer.m // BertyBridgeDemo diff --git a/pkg/ble-driver/CountDownLatch_darwin.m b/pkg/ble-driver/CountDownLatch_darwin.m index 9cfbde6f..e369ec8d 100644 --- a/pkg/ble-driver/CountDownLatch_darwin.m +++ b/pkg/ble-driver/CountDownLatch_darwin.m @@ -1,4 +1,4 @@ -// +build darwin +// +build darwin,!noproximitytransport // // CountDownLatch.m // ble diff --git a/pkg/ble-driver/Logger.m b/pkg/ble-driver/Logger.m index 9f0853c9..6c153b20 100644 --- a/pkg/ble-driver/Logger.m +++ b/pkg/ble-driver/Logger.m @@ -1,4 +1,4 @@ -// +build darwin +// +build darwin,!noproximitytransport // // Logger.m // BertyBridgeDemo @@ -14,31 +14,31 @@ @implementation Logger - (instancetype __nonnull)initLocalLoggerWithSubSystem:(const char *)subSystem andCategorie:(const char*)categorie showSensitiveData:(BOOL)showSensitiveData { self = [super init]; - + if (self) { _logger = os_log_create(subSystem, categorie); _useExternalLogger = FALSE; _showSensitiveData = showSensitiveData; } - + return self; } - (instancetype __nonnull)initWithExternalLoggerAndShowSensitiveData:(BOOL)showSensitiveData { self = [super init]; - + if (self) { _logger = nil; _useExternalLogger = TRUE; _showSensitiveData = showSensitiveData; } - + return self; } - (void)log:(enum level)level withFormat:(NSString *__nonnull)format withArgs:(va_list)args { NSString *message = [[NSString alloc] initWithFormat:format arguments:args]; - + if (self.useExternalLogger) { BLEBridgeLog(level, message); } else { @@ -60,11 +60,11 @@ - (void)log:(enum level)level withFormat:(NSString *__nonnull)format withArgs:(v osLevel = OS_LOG_TYPE_DEFAULT; break ; } - + os_log_with_type(self.logger, osLevel, "%@", message); } } - + [message release]; } @@ -101,7 +101,7 @@ - (NSString *__nonnull)SensitiveString:(const char *)data { if (data == nil) { return @""; } - + if (self.showSensitiveData) { return [NSString stringWithFormat:@"%s", data]; } else { diff --git a/pkg/ble-driver/PeerManager.m b/pkg/ble-driver/PeerManager.m index 20212002..e98407bc 100644 --- a/pkg/ble-driver/PeerManager.m +++ b/pkg/ble-driver/PeerManager.m @@ -1,4 +1,4 @@ -// +build darwin +// +build darwin,!noproximitytransport // // PeerManager.m // BertyBridgeDemo @@ -13,33 +13,33 @@ @implementation PeerManager - (instancetype __nonnull)initWithLogger:(Logger *__nonnull)logger { self = [super init]; - + if (self) { _logger = [logger retain]; _connectedPeers = [[NSMutableDictionary alloc] init]; } - + return self; } - (void)dealloc { [_connectedPeers release]; [_logger release]; - + [super dealloc]; } - (ConnectedPeer *__nonnull)getPeer:(NSString *__nonnull) peerID { [self.logger d:@"getPeer called: peerID=%@", [self.logger SensitiveNSObject:peerID]]; - + ConnectedPeer *peer; - + @synchronized (_connectedPeers) { if ((peer = [self.connectedPeers objectForKey:peerID]) != nil) { [self.logger d:@"getPeer: peerID=%@ alread created", [self.logger SensitiveNSObject:peerID]]; return peer; } - + [self.logger d:@"getPeer: peerID=%@ created", [self.logger SensitiveNSObject:peerID]]; peer = [[ConnectedPeer alloc] init]; [self.connectedPeers setObject:peer forKey:peerID]; @@ -50,9 +50,9 @@ - (ConnectedPeer *__nonnull)getPeer:(NSString *__nonnull) peerID { - (ConnectedPeer *__nullable)registerDevice:(BertyDevice *__nonnull)device withPeerID:(NSString *__nonnull)peerID isClient:(BOOL)isClient { [self.logger d:@"registerDevice called: identifier=%@ peer=%@ isClient=%d", [self.logger SensitiveNSObject:[device getIdentifier]], [self.logger SensitiveNSObject:peerID], isClient]; - + ConnectedPeer *peer; - + @synchronized (_connectedPeers) { peer = [self getPeer:peerID]; if (isClient) { @@ -60,46 +60,46 @@ - (ConnectedPeer *__nullable)registerDevice:(BertyDevice *__nonnull)device withP } else { peer.server = device; } - + device.peer = peer; - + peer.connected = TRUE; - + if (!BLEBridgeHandleFoundPeer(peerID)) { [self.logger e:@"registerDevice error: device=%@ peer=%@: HandleFoundPeer failed", [self.logger SensitiveNSObject:[device getIdentifier]], [self.logger SensitiveNSObject:peerID]]; return NULL; } - + [device flushCache]; } - + return peer; } - (void)unregisterDevice:(BertyDevice *)device { [self.logger d:@"unregisterDevice called: device=%@ peerID=%@", [self.logger SensitiveNSObject:[device getIdentifier]], [self.logger SensitiveNSObject:device.remotePeerID]]; - + ConnectedPeer *peer; - + @synchronized (_connectedPeers) { if ((peer = [self.connectedPeers objectForKey:device.remotePeerID]) == nil) { [self.logger e:@"unregisterDevice called: device=%@ peerID=%@: peerID not found", [self.logger SensitiveNSObject:[device getIdentifier]], [self.logger SensitiveNSObject:device.remotePeerID]]; return ; } - + if ([peer isConnected]) { [self.logger d:@"unregisterDevice called: device=%{public}@ peerID=%{public}@: calling HandleLostPeer", [self.logger SensitiveNSObject:[device getIdentifier]], [self.logger SensitiveNSObject:device.remotePeerID]]; BLEBridgeHandleLostPeer(device.remotePeerID); peer.connected = FALSE; } - + [self removePeer:device.remotePeerID]; } } - (void)removePeer:(NSString *__nonnull) peerID { [self.logger d:@"removePeer called: peerID=%{public}@", [self.logger SensitiveNSObject:peerID]]; - + @synchronized (_connectedPeers) { [self.connectedPeers removeObjectForKey:peerID]; } @@ -107,7 +107,7 @@ - (void)removePeer:(NSString *__nonnull) peerID { - (void)removeAllPeers { [self.logger d:@"removeAllPeers called"]; - + @synchronized (_connectedPeers) { [self.connectedPeers removeAllObjects]; } diff --git a/pkg/ble-driver/TaskDelay.m b/pkg/ble-driver/TaskDelay.m index 224be604..d49c0bd0 100644 --- a/pkg/ble-driver/TaskDelay.m +++ b/pkg/ble-driver/TaskDelay.m @@ -1,4 +1,4 @@ -// +build darwin +// +build darwin,!noproximitytransport // // TaskDelay.m // BertyBridgeDemo @@ -19,7 +19,7 @@ - (instancetype __nullable) initWithBlock:(void (^ __nonnull)(void))block withCa _delay = delay; _index = index; } - + return self; } diff --git a/pkg/ble-driver/WriteDataCache.m b/pkg/ble-driver/WriteDataCache.m index b4efb1c1..00661769 100644 --- a/pkg/ble-driver/WriteDataCache.m +++ b/pkg/ble-driver/WriteDataCache.m @@ -1,4 +1,4 @@ -// +build darwin +// +build darwin,!noproximitytransport // // WriteDataCache.m // BertyBridgeDemo @@ -13,19 +13,19 @@ @implementation WriteDataCache - (instancetype __nonnull) initWithDevice:(BertyDevice *__nonnull)device withData:(NSData *__nonnull)data { self = [super init]; - + if (self) { _device = [device retain]; _data = [data retain]; } - + return self; } - (void)dealloc { [_device release]; [_data release]; - + [super dealloc]; } diff --git a/pkg/ble-driver/bridge_android.go b/pkg/ble-driver/bridge_android.go index 4124769b..37d32a8d 100644 --- a/pkg/ble-driver/bridge_android.go +++ b/pkg/ble-driver/bridge_android.go @@ -1,5 +1,5 @@ -//go:build android -// +build android +//go:build android && !noproximitytransport +// +build android,!noproximitytransport package ble diff --git a/pkg/ble-driver/bridge_darwin.go b/pkg/ble-driver/bridge_darwin.go index 42035474..f9dddbec 100644 --- a/pkg/ble-driver/bridge_darwin.go +++ b/pkg/ble-driver/bridge_darwin.go @@ -1,5 +1,5 @@ -//go:build darwin && cgo -// +build darwin,cgo +//go:build darwin && cgo && !noproximitytransport +// +build darwin,cgo,!noproximitytransport package ble diff --git a/pkg/ble-driver/bridge_unsupported.go b/pkg/ble-driver/bridge_unsupported.go index 4e1a7a19..db74a689 100644 --- a/pkg/ble-driver/bridge_unsupported.go +++ b/pkg/ble-driver/bridge_unsupported.go @@ -1,5 +1,5 @@ -//go:build !darwin && !android -// +build !darwin,!android +//go:build (!darwin && !android) || noproximitytransport +// +build !darwin,!android noproximitytransport package ble diff --git a/pkg/multipeer-connectivity-driver/bridge_darwin.go b/pkg/multipeer-connectivity-driver/bridge_darwin.go index 3484041f..4db977d6 100644 --- a/pkg/multipeer-connectivity-driver/bridge_darwin.go +++ b/pkg/multipeer-connectivity-driver/bridge_darwin.go @@ -1,5 +1,5 @@ -//go:build darwin && cgo && !catalyst -// +build darwin,cgo,!catalyst +//go:build darwin && cgo && !catalyst && !noproximitytransport +// +build darwin,cgo,!catalyst,!noproximitytransport package mc diff --git a/pkg/multipeer-connectivity-driver/bridge_unsupported.go b/pkg/multipeer-connectivity-driver/bridge_unsupported.go index 4b0ca374..eca23bd2 100644 --- a/pkg/multipeer-connectivity-driver/bridge_unsupported.go +++ b/pkg/multipeer-connectivity-driver/bridge_unsupported.go @@ -1,5 +1,5 @@ -//go:build !darwin || (darwin && !cgo) || catalyst -// +build !darwin darwin,!cgo catalyst +//go:build !darwin || (darwin && !cgo) || catalyst || noproximitytransport +// +build !darwin darwin,!cgo catalyst noproximitytransport package mc diff --git a/pkg/multipeer-connectivity-driver/driver/Logger.m b/pkg/multipeer-connectivity-driver/driver/Logger.m index 6fc026e4..60378ee3 100644 --- a/pkg/multipeer-connectivity-driver/driver/Logger.m +++ b/pkg/multipeer-connectivity-driver/driver/Logger.m @@ -1,4 +1,4 @@ -// +build darwin +// +build darwin,!noproximitytransport // // Logger.m // BertyBridgeDemo @@ -14,31 +14,31 @@ @implementation Logger - (instancetype __nonnull)initLocalLoggerWithSubSystem:(const char *)subSystem andCategorie:(const char*)categorie showSensitiveData:(BOOL)showSensitiveData { self = [super init]; - + if (self) { _logger = os_log_create(subSystem, categorie); _useExternalLogger = FALSE; _showSensitiveData = showSensitiveData; } - + return self; } - (instancetype __nonnull)initWithExternalLoggerAndShowSensitiveData:(BOOL)showSensitiveData { self = [super init]; - + if (self) { _logger = nil; _useExternalLogger = TRUE; _showSensitiveData = showSensitiveData; } - + return self; } - (void)log:(enum level)level withFormat:(NSString *__nonnull)format withArgs:(va_list)args { NSString *message = [[NSString alloc] initWithFormat:format arguments:args]; - + if (self.useExternalLogger) { MCBridgeLog(level, message); } else { @@ -60,11 +60,11 @@ - (void)log:(enum level)level withFormat:(NSString *__nonnull)format withArgs:(v osLevel = OS_LOG_TYPE_DEFAULT; break ; } - + os_log_with_type(self.logger, osLevel, "%@", message); } } - + [message release]; } @@ -101,7 +101,7 @@ - (NSString *__nonnull)SensitiveString:(const char *)data { if (data == nil) { return @""; } - + if (self.showSensitiveData) { return [NSString stringWithFormat:@"%s", data]; } else { diff --git a/pkg/multipeer-connectivity-driver/driver/MCManager.m b/pkg/multipeer-connectivity-driver/driver/MCManager.m index a2578523..118ee5a0 100644 --- a/pkg/multipeer-connectivity-driver/driver/MCManager.m +++ b/pkg/multipeer-connectivity-driver/driver/MCManager.m @@ -1,4 +1,4 @@ -// +build darwin +// +build darwin,!noproximitytransport #import #import "MCManager.h" @@ -14,13 +14,13 @@ @implementation MCManager - (MCPeerID *)getMCPeerID:(NSString *)appPID { NSString *kAppPID = @"berty-peerID"; NSString *kPIDData = @"berty-PIDData"; - + NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; NSString *oldAppPID = [defaults stringForKey:kAppPID]; MCPeerID *peerID; NSData *peerIDData; NSError *error; - + if ([oldAppPID isEqualToString:appPID]) { peerIDData = [defaults dataForKey:kPIDData]; if ((peerID = [NSKeyedUnarchiver unarchivedObjectOfClass:[MCPeerID class] fromData:peerIDData error:&error])) { @@ -139,24 +139,24 @@ - (void)session:(MCSession *)session peer:(MCPeerID *)peerID didChangeState:(MCS break; } } - + - (void)session:(MCSession *)session didReceiveData:(NSData *)data fromPeer:(MCPeerID *)peerID{ BridgeReceiveFromPeer([peerID displayName], data); } - - + + - (void)session:(MCSession *)session didStartReceivingResourceWithName:(NSString *)resourceName fromPeer:(MCPeerID *)peerID withProgress:(NSProgress *)progress{ - + } - - + + - (void)session:(MCSession *)session didFinishReceivingResourceWithName:(NSString *)resourceName fromPeer:(MCPeerID *)peerID atURL:(NSURL *)localURL withError:(NSError *)error{ - + } - - + + - (void)session:(MCSession *)session didReceiveStream:(NSInputStream *)stream withName:(NSString *)streamName fromPeer:(MCPeerID *)peerID{ - + } /* diff --git a/pkg/multipeer-connectivity-driver/driver/cgo_bridge.go b/pkg/multipeer-connectivity-driver/driver/cgo_bridge.go index e0819ba1..a0bea046 100644 --- a/pkg/multipeer-connectivity-driver/driver/cgo_bridge.go +++ b/pkg/multipeer-connectivity-driver/driver/cgo_bridge.go @@ -1,5 +1,5 @@ -//go:build darwin && cgo && !catalyst -// +build darwin,cgo,!catalyst +//go:build darwin && cgo && !catalyst && !noproximitytransport +// +build darwin,cgo,!catalyst,!noproximitytransport package driver diff --git a/pkg/multipeer-connectivity-driver/driver/mc-driver.m b/pkg/multipeer-connectivity-driver/driver/mc-driver.m index 66477e55..777772dc 100644 --- a/pkg/multipeer-connectivity-driver/driver/mc-driver.m +++ b/pkg/multipeer-connectivity-driver/driver/mc-driver.m @@ -1,4 +1,4 @@ -// +build darwin +// +build darwin,!noproximitytransport #import #import "mc-driver.h" @@ -98,4 +98,4 @@ void BridgeReceiveFromPeer(NSString *remotePID, NSData *payload) { void MCBridgeLog(enum level level, NSString *message) { char *cMessage = (char *)[message UTF8String]; MCLog(level, cMessage); -} \ No newline at end of file +}