From e7dc22bb1529eb205ed8ca7c0f770142c54ad823 Mon Sep 17 00:00:00 2001 From: Diego Waxemberg Date: Tue, 10 Feb 2015 17:40:49 -0500 Subject: [PATCH] Host discovery is much better now --- Limelight/Network/DiscoveryManager.h | 2 +- Limelight/Network/DiscoveryManager.m | 9 ++- Limelight/Network/DiscoveryWorker.m | 57 ++++++++++--------- Limelight/Network/ServerInfoResponse.h | 8 +++ Limelight/Network/ServerInfoResponse.m | 7 --- .../ViewControllers/MainFrameViewController.m | 4 +- 6 files changed, 49 insertions(+), 38 deletions(-) diff --git a/Limelight/Network/DiscoveryManager.h b/Limelight/Network/DiscoveryManager.h index 34ab10d..f0a75a9 100644 --- a/Limelight/Network/DiscoveryManager.h +++ b/Limelight/Network/DiscoveryManager.h @@ -24,6 +24,6 @@ - (void) stopDiscoveryBlocking; - (BOOL) addHostToDiscovery:(Host*)host; - (void) removeHostFromDiscovery:(Host*)host; -- (void) discoverHost:(NSString*)hostAddress withCallback:(void (^)(Host*))callback; +- (void) discoverHost:(NSString*)hostAddress withCallback:(void (^)(Host*, NSString*))callback; @end diff --git a/Limelight/Network/DiscoveryManager.m b/Limelight/Network/DiscoveryManager.m index 48c2fb7..968009e 100644 --- a/Limelight/Network/DiscoveryManager.m +++ b/Limelight/Network/DiscoveryManager.m @@ -38,7 +38,7 @@ return self; } -- (void) discoverHost:(NSString *)hostAddress withCallback:(void (^)(Host *))callback { +- (void) discoverHost:(NSString *)hostAddress withCallback:(void (^)(Host *, NSString*))callback { HttpManager* hMan = [[HttpManager alloc] initWithHost:hostAddress uniqueId:_uniqueId deviceName:deviceName cert:_cert]; ServerInfoResponse* serverInfoResponse = [[ServerInfoResponse alloc] init]; [hMan executeRequestSynchronously:[HttpRequest requestForResponse:serverInfoResponse withUrlRequest:[hMan newServerInfoRequest]]]; @@ -52,9 +52,14 @@ [serverInfoResponse populateHost:host]; if (![self addHostToDiscovery:host]) { [dataMan removeHost:host]; + callback(nil, @"Host already added"); + } else { + callback(host, nil); } + } else { + callback(nil, @"Could not connect to host"); } - callback(host); + } - (void) startDiscovery { diff --git a/Limelight/Network/DiscoveryWorker.m b/Limelight/Network/DiscoveryWorker.m index 53ac575..9d0c648 100644 --- a/Limelight/Network/DiscoveryWorker.m +++ b/Limelight/Network/DiscoveryWorker.m @@ -44,40 +44,45 @@ static const float POLL_RATE = 2.0f; // Poll every 2 seconds - (void) discoverHost { BOOL receivedResponse = NO; if (!self.cancelled && _host.localAddress != nil) { - HttpManager* hMan = [[HttpManager alloc] initWithHost:_host.localAddress uniqueId:_uniqueId deviceName:deviceName cert:_cert]; - - ServerInfoResponse* serverInfoResp = [[ServerInfoResponse alloc] init]; - [hMan executeRequestSynchronously:[HttpRequest requestForResponse:serverInfoResp withUrlRequest:[hMan newServerInfoRequest]]]; - if ([serverInfoResp isStatusOk]) { - [serverInfoResp populateHost:_host]; - _host.address = _host.localAddress; - receivedResponse = YES; - } + ServerInfoResponse* serverInfoResp = [self requestInfoAtAddress:_host.localAddress]; + receivedResponse = [self checkResponse:serverInfoResp]; } if (!self.cancelled && !receivedResponse && _host.externalAddress != nil) { - HttpManager* hMan = [[HttpManager alloc] initWithHost:_host.externalAddress uniqueId:_uniqueId deviceName:deviceName cert:_cert]; - ServerInfoResponse* serverInfoResp = [[ServerInfoResponse alloc]init]; - [hMan executeRequestSynchronously:[HttpRequest requestForResponse:serverInfoResp withUrlRequest:[hMan newServerInfoRequest]]]; - if ([serverInfoResp isStatusOk]) { - [serverInfoResp populateHost:_host]; - _host.address = _host.externalAddress; - receivedResponse = YES; - } + ServerInfoResponse* serverInfoResp = [self requestInfoAtAddress:_host.externalAddress]; + receivedResponse = [self checkResponse:serverInfoResp]; } - if (!self.cancelled && !receivedResponse && _host.address != nil) { - HttpManager* hMan = [[HttpManager alloc] initWithHost:_host.address uniqueId:_uniqueId deviceName:deviceName cert:_cert]; - ServerInfoResponse* serverInfoResp = [[ServerInfoResponse alloc] init]; - [hMan executeRequestSynchronously:[HttpRequest requestForResponse:serverInfoResp withUrlRequest:[hMan newServerInfoRequest]]]; - if ([serverInfoResp isStatusOk]) { - [serverInfoResp populateHost:_host]; - receivedResponse = YES; - } + ServerInfoResponse* serverInfoResp = [self requestInfoAtAddress:_host.address]; + receivedResponse = [self checkResponse:serverInfoResp]; } _host.online = receivedResponse; if (receivedResponse) { - NSLog(@"Received response from: %@\n{\n\t address:%@ \n\t localAddress:%@ \n\t externalAddress:%@ \n\t uuid:%@ \n\t mac:%@ \n\t pairState:%d \n\t online:%d \n}", _host.name, _host.address, _host.localAddress, _host.externalAddress, _host.uuid, _host.mac, _host.pairState, _host.online); + NSLog(@"Received response from: %@\n{\n\t address:%@ \n\t localAddress:%@ \n\t externalAddress:%@ \n\t uuid:%@ \n\t mac:%@ \n\t pairState:%d \n\t online:%d \n}", _host.name, _host.address, _host.localAddress, _host.externalAddress, _host.uuid, _host.mac, _host.pairState, _host.online); } } +- (ServerInfoResponse*) requestInfoAtAddress:(NSString*)address { + HttpManager* hMan = [[HttpManager alloc] initWithHost:address + uniqueId:_uniqueId + deviceName:deviceName + cert:_cert]; + ServerInfoResponse* response = [[ServerInfoResponse alloc] init]; + [hMan executeRequestSynchronously:[HttpRequest requestForResponse:response + withUrlRequest:[hMan newServerInfoRequest]]]; + return response; +} + +- (BOOL) checkResponse:(ServerInfoResponse*)response { + if ([response isStatusOk]) { + // If the response is from a different host then do not update this host + if ((_host.uuid == nil || [[response getStringTag:TAG_UNIQUE_ID] isEqualToString:_host.uuid])) { + [response populateHost:_host]; + return YES; + } else { + NSLog(@"Received response from incorrect host: %@ expected: %@", [response getStringTag:TAG_UNIQUE_ID], _host.uuid); + } + } + return NO; +} + @end diff --git a/Limelight/Network/ServerInfoResponse.h b/Limelight/Network/ServerInfoResponse.h index bae71d0..ec66371 100644 --- a/Limelight/Network/ServerInfoResponse.h +++ b/Limelight/Network/ServerInfoResponse.h @@ -8,9 +8,17 @@ #import "HttpResponse.h" +#define TAG_HOSTNAME @"hostname" +#define TAG_EXTERNAL_IP @"ExternalIP" +#define TAG_LOCAL_IP @"LocalIP" +#define TAG_UNIQUE_ID @"uniqueid" +#define TAG_MAC_ADDRESS @"mac" +#define TAG_PAIR_STATUS @"PairStatus" + @interface ServerInfoResponse : HttpResponse - (void) populateWithData:(NSData *)data; - (void) populateHost:(Host*)host; @end + diff --git a/Limelight/Network/ServerInfoResponse.m b/Limelight/Network/ServerInfoResponse.m index 5d07461..7095b52 100644 --- a/Limelight/Network/ServerInfoResponse.m +++ b/Limelight/Network/ServerInfoResponse.m @@ -12,13 +12,6 @@ @implementation ServerInfoResponse @synthesize data, statusCode, statusMessage; -static NSString* TAG_HOSTNAME = @"hostname"; -static NSString* TAG_EXTERNAL_IP = @"ExternalIP"; -static NSString* TAG_LOCAL_IP = @"LocalIP"; -static NSString* TAG_UNIQUE_ID = @"uniqueid"; -static NSString* TAG_MAC_ADDRESS = @"mac"; -static NSString* TAG_PAIR_STATUS = @"PairStatus"; - - (void) populateWithData:(NSData *)xml { self.data = xml; [super parseData]; diff --git a/Limelight/ViewControllers/MainFrameViewController.m b/Limelight/ViewControllers/MainFrameViewController.m index 24ec180..c329b02 100644 --- a/Limelight/ViewControllers/MainFrameViewController.m +++ b/Limelight/ViewControllers/MainFrameViewController.m @@ -190,7 +190,7 @@ static NSArray* appList; [alertController addAction:[UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault handler:^(UIAlertAction* action){ NSString* hostAddress = ((UITextField*)[[alertController textFields] objectAtIndex:0]).text; dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{ - [_discMan discoverHost:hostAddress withCallback:^(Host* host){ + [_discMan discoverHost:hostAddress withCallback:^(Host* host, NSString* error){ if (host != nil) { DataManager* dataMan = [[DataManager alloc] init]; [dataMan saveHosts]; @@ -201,7 +201,7 @@ static NSArray* appList; [self updateHosts]; }); } else { - UIAlertController* hostNotFoundAlert = [UIAlertController alertControllerWithTitle:@"Host Not Found" message:[NSString stringWithFormat:@"Unable to connect to host: \n%@", hostAddress] preferredStyle:UIAlertControllerStyleAlert]; + UIAlertController* hostNotFoundAlert = [UIAlertController alertControllerWithTitle:@"Add Host" message:error preferredStyle:UIAlertControllerStyleAlert]; [hostNotFoundAlert addAction:[UIAlertAction actionWithTitle:@"Ok" style:UIAlertActionStyleDestructive handler:nil]]; dispatch_async(dispatch_get_main_queue(), ^{ [self presentViewController:hostNotFoundAlert animated:YES completion:nil];