From 862b8632e31cfe7c45afb03ac7d8e524849952c0 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Fri, 1 Jun 2018 19:50:32 -0700 Subject: [PATCH] Fix DiscoveryManager trying to start discovery again on all machines when any machine is discovered --- Limelight/Network/DiscoveryManager.m | 25 +++++++++++-------------- Limelight/Network/MDNSManager.h | 4 +++- Limelight/Network/MDNSManager.m | 20 ++++---------------- 3 files changed, 18 insertions(+), 31 deletions(-) diff --git a/Limelight/Network/DiscoveryManager.m b/Limelight/Network/DiscoveryManager.m index 91b8c10..db8781b 100644 --- a/Limelight/Network/DiscoveryManager.m +++ b/Limelight/Network/DiscoveryManager.m @@ -159,27 +159,24 @@ } // Override from MDNSCallback -- (void)updateHosts:(NSArray *)hosts { +- (void)updateHost:(TemporaryHost*)host { dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ // Discover the hosts before adding to eliminate duplicates - for (TemporaryHost* host in hosts) { - Log(LOG_I, @"Found host through MDNS: %@:", host.name); - // Since this is on a background thread, we do not need to use the opQueue - DiscoveryWorker* worker = (DiscoveryWorker*)[self createWorkerForHost:host]; - [worker discoverHost]; - if ([self addHostToDiscovery:host]) { - Log(LOG_D, @"Adding host to discovery: %@", host.name); - [self->_callback updateAllHosts:self->_hostQueue]; - } else { - Log(LOG_D, @"Not adding host to discovery: %@", host.name); - } + Log(LOG_I, @"Found host through MDNS: %@:", host.name); + // Since this is on a background thread, we do not need to use the opQueue + DiscoveryWorker* worker = (DiscoveryWorker*)[self createWorkerForHost:host]; + [worker discoverHost]; + if ([self addHostToDiscovery:host]) { + Log(LOG_D, @"Adding host to discovery: %@", host.name); + [self->_callback updateAllHosts:self->_hostQueue]; + } else { + Log(LOG_D, @"Not adding host to discovery: %@", host.name); } }); } - (TemporaryHost*) getHostInDiscovery:(NSString*)uuidString { - for (int i = 0; i < _hostQueue.count; i++) { - TemporaryHost* discoveredHost = [_hostQueue objectAtIndex:i]; + for (TemporaryHost* discoveredHost in _hostQueue) { if (discoveredHost.uuid.length > 0 && [discoveredHost.uuid isEqualToString:uuidString]) { return discoveredHost; } diff --git a/Limelight/Network/MDNSManager.h b/Limelight/Network/MDNSManager.h index 83c81d4..44cd447 100644 --- a/Limelight/Network/MDNSManager.h +++ b/Limelight/Network/MDNSManager.h @@ -6,9 +6,11 @@ // Copyright (c) 2014 Moonlight Stream. All rights reserved. // +#import "TemporaryHost.h" + @protocol MDNSCallback -- (void) updateHosts:(NSArray*)hosts; +- (void) updateHost:(TemporaryHost*)host; @end diff --git a/Limelight/Network/MDNSManager.m b/Limelight/Network/MDNSManager.m index 6a39cf7..b701071 100644 --- a/Limelight/Network/MDNSManager.m +++ b/Limelight/Network/MDNSManager.m @@ -11,7 +11,6 @@ @implementation MDNSManager { NSNetServiceBrowser* mDNSBrowser; - NSMutableArray* domains; NSMutableArray* services; BOOL scanActive; } @@ -28,7 +27,6 @@ static NSString* NV_SERVICE_TYPE = @"_nvstream._tcp"; mDNSBrowser = [[NSNetServiceBrowser alloc] init]; [mDNSBrowser setDelegate:self]; - domains = [[NSMutableArray alloc] init]; services = [[NSMutableArray alloc] init]; return self; @@ -54,22 +52,12 @@ static NSString* NV_SERVICE_TYPE = @"_nvstream._tcp"; [mDNSBrowser stop]; } -- (NSArray*) getFoundHosts { - NSMutableArray* hosts = [[NSMutableArray alloc] init]; - for (NSNetService* service in services) { - if (service.hostName != nil) { - TemporaryHost* host = [[TemporaryHost alloc] init]; - host.activeAddress = host.localAddress = service.hostName; - host.name = service.hostName; - [hosts addObject:host]; - } - } - return hosts; -} - - (void)netServiceDidResolveAddress:(NSNetService *)service { Log(LOG_D, @"Resolved address: %@ -> %@", service, service.hostName); - [self.callback updateHosts:[self getFoundHosts]]; + TemporaryHost* host = [[TemporaryHost alloc] init]; + host.activeAddress = host.localAddress = service.hostName; + host.name = service.hostName; + [self.callback updateHost:host]; } - (void)netService:(NSNetService *)sender didNotResolve:(NSDictionary *)errorDict {