From 935fb6ffe352fed1707c831d6e059ed105b59af6 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Fri, 10 Jul 2015 00:28:51 -0700 Subject: [PATCH] Fix streaming over the external IP address when discovered via mDNS --- Limelight/Database/Host.h | 1 + Limelight/Database/Host.m | 1 + Limelight/Network/AppAssetRetriever.m | 2 +- Limelight/Network/DiscoveryManager.m | 2 +- Limelight/Network/DiscoveryWorker.m | 11 ++++++++++- Limelight/Network/MDNSManager.m | 2 +- .../ViewControllers/MainFrameViewController.m | 18 ++++++++++++------ 7 files changed, 27 insertions(+), 10 deletions(-) diff --git a/Limelight/Database/Host.h b/Limelight/Database/Host.h index 95c8a92..576dd01 100644 --- a/Limelight/Database/Host.h +++ b/Limelight/Database/Host.h @@ -20,5 +20,6 @@ @property (nonatomic, retain) NSString * mac; @property (nonatomic) BOOL online; @property (nonatomic) PairState pairState; +@property (nonatomic) NSString * activeAddress; @end diff --git a/Limelight/Database/Host.m b/Limelight/Database/Host.m index a593729..d527c60 100644 --- a/Limelight/Database/Host.m +++ b/Limelight/Database/Host.m @@ -19,5 +19,6 @@ @dynamic mac; @dynamic pairState; @synthesize online; +@synthesize activeAddress; @end diff --git a/Limelight/Network/AppAssetRetriever.m b/Limelight/Network/AppAssetRetriever.m index 5554da0..8bd61c2 100644 --- a/Limelight/Network/AppAssetRetriever.m +++ b/Limelight/Network/AppAssetRetriever.m @@ -31,7 +31,7 @@ static const int MAX_ATTEMPTS = 5; } } if (appImage == nil) { - HttpManager* hMan = [[HttpManager alloc] initWithHost:_host.address uniqueId:[CryptoManager getUniqueID] deviceName:deviceName cert:[CryptoManager readCertFromFile]]; + HttpManager* hMan = [[HttpManager alloc] initWithHost:_host.activeAddress uniqueId:[CryptoManager getUniqueID] deviceName:deviceName cert:[CryptoManager readCertFromFile]]; AppAssetResponse* appAssetResp = [[AppAssetResponse alloc] init]; [hMan executeRequestSynchronously:[HttpRequest requestForResponse:appAssetResp withUrlRequest:[hMan newAppAssetRequestWithAppId:self.app.appId]]]; diff --git a/Limelight/Network/DiscoveryManager.m b/Limelight/Network/DiscoveryManager.m index de17574..9cd34b1 100644 --- a/Limelight/Network/DiscoveryManager.m +++ b/Limelight/Network/DiscoveryManager.m @@ -47,7 +47,7 @@ if ([serverInfoResponse isStatusOk]) { DataManager* dataMan = [[DataManager alloc] init]; host = [dataMan createHost]; - host.address = hostAddress; + host.activeAddress = host.address = hostAddress; host.online = YES; [serverInfoResponse populateHost:host]; if (![self addHostToDiscovery:host]) { diff --git a/Limelight/Network/DiscoveryWorker.m b/Limelight/Network/DiscoveryWorker.m index 9d9314e..8d80402 100644 --- a/Limelight/Network/DiscoveryWorker.m +++ b/Limelight/Network/DiscoveryWorker.m @@ -46,18 +46,27 @@ static const float POLL_RATE = 2.0f; // Poll every 2 seconds if (!self.cancelled && _host.localAddress != nil) { ServerInfoResponse* serverInfoResp = [self requestInfoAtAddress:_host.localAddress]; receivedResponse = [self checkResponse:serverInfoResp]; + if (receivedResponse) { + _host.activeAddress = _host.localAddress; + } } if (!self.cancelled && !receivedResponse && _host.externalAddress != nil) { ServerInfoResponse* serverInfoResp = [self requestInfoAtAddress:_host.externalAddress]; receivedResponse = [self checkResponse:serverInfoResp]; + if (receivedResponse) { + _host.activeAddress = _host.externalAddress; + } } if (!self.cancelled && !receivedResponse && _host.address != nil) { ServerInfoResponse* serverInfoResp = [self requestInfoAtAddress:_host.address]; receivedResponse = [self checkResponse:serverInfoResp]; + if (receivedResponse) { + _host.activeAddress = _host.address; + } } _host.online = receivedResponse; if (receivedResponse) { - Log(LOG_D, @"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); + Log(LOG_D, @"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\t activeAddress:%@ \n}", _host.name, _host.address, _host.localAddress, _host.externalAddress, _host.uuid, _host.mac, _host.pairState, _host.online, _host.activeAddress); } } diff --git a/Limelight/Network/MDNSManager.m b/Limelight/Network/MDNSManager.m index 53abc85..3f6681e 100644 --- a/Limelight/Network/MDNSManager.m +++ b/Limelight/Network/MDNSManager.m @@ -51,7 +51,7 @@ static NSString* NV_SERVICE_TYPE = @"_nvstream._tcp"; for (NSNetService* service in services) { if (service.hostName != nil) { Host* host = [dataMan createHost]; - host.address = service.hostName; + host.activeAddress = host.address = service.hostName; host.name = host.address; [hosts addObject:host]; } diff --git a/Limelight/ViewControllers/MainFrameViewController.m b/Limelight/ViewControllers/MainFrameViewController.m index f294a9b..dc63605 100644 --- a/Limelight/ViewControllers/MainFrameViewController.m +++ b/Limelight/ViewControllers/MainFrameViewController.m @@ -73,7 +73,7 @@ static NSArray* appList; - (void)alreadyPaired { dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ - HttpManager* hMan = [[HttpManager alloc] initWithHost:_selectedHost.address uniqueId:_uniqueId deviceName:deviceName cert:_cert]; + HttpManager* hMan = [[HttpManager alloc] initWithHost:_selectedHost.activeAddress uniqueId:_uniqueId deviceName:deviceName cert:_cert]; AppListResponse* appListResp = [[AppListResponse alloc] init]; [hMan executeRequestSynchronously:[HttpRequest requestForResponse:appListResp withUrlRequest:[hMan newAppListRequest]]]; @@ -138,7 +138,7 @@ static NSArray* appList; [self showLoadingFrame]; _selectedHost = host; dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ - HttpManager* hMan = [[HttpManager alloc] initWithHost:host.address uniqueId:_uniqueId deviceName:deviceName cert:_cert]; + HttpManager* hMan = [[HttpManager alloc] initWithHost:host.activeAddress uniqueId:_uniqueId deviceName:deviceName cert:_cert]; ServerInfoResponse* serverInfoResp = [[ServerInfoResponse alloc] init]; [hMan executeRequestSynchronously:[HttpRequest requestForResponse:serverInfoResp withUrlRequest:[hMan newServerInfoRequest] fallbackError:401 fallbackRequest:[hMan newHttpServerInfoRequest]]]; @@ -176,7 +176,7 @@ static NSArray* appList; if (host.online) { [longClickAlert addAction:[UIAlertAction actionWithTitle:@"Unpair" style:UIAlertActionStyleDefault handler:^(UIAlertAction* action){ dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ - HttpManager* hMan = [[HttpManager alloc] initWithHost:host.address uniqueId:_uniqueId deviceName:deviceName cert:_cert]; + HttpManager* hMan = [[HttpManager alloc] initWithHost:host.activeAddress uniqueId:_uniqueId deviceName:deviceName cert:_cert]; [hMan executeRequestSynchronously:[HttpRequest requestWithUrlRequest:[hMan newUnpairRequest]]]; }); }]]; @@ -253,7 +253,7 @@ static NSArray* appList; - (void) appClicked:(App *)app { Log(LOG_D, @"Clicked app: %@", app.appName); _streamConfig = [[StreamConfiguration alloc] init]; - _streamConfig.host = _selectedHost.address; + _streamConfig.host = _selectedHost.activeAddress; _streamConfig.appID = app.appId; DataManager* dataMan = [[DataManager alloc] init]; @@ -284,7 +284,7 @@ static NSArray* appList; [app.appId isEqualToString:currentApp.appId] ? @"Quit App" : @"Quit Running App and Start" style:UIAlertActionStyleDestructive handler:^(UIAlertAction* action){ Log(LOG_I, @"Quitting application: %@", currentApp.appName); dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ - HttpManager* hMan = [[HttpManager alloc] initWithHost:_selectedHost.address uniqueId:_uniqueId deviceName:deviceName cert:_cert]; + HttpManager* hMan = [[HttpManager alloc] initWithHost:_selectedHost.activeAddress uniqueId:_uniqueId deviceName:deviceName cert:_cert]; HttpResponse* quitResponse = [[HttpResponse alloc] init]; HttpRequest* quitRequest = [HttpRequest requestForResponse: quitResponse withUrlRequest:[hMan newQuitAppRequest]]; [hMan executeRequestSynchronously:quitRequest]; @@ -442,6 +442,12 @@ static NSArray* appList; NSArray* hosts = [dataMan retrieveHosts]; @synchronized(hostList) { [hostList addObjectsFromArray:hosts]; + + // Initialize the non-persistent host state + for (Host* host in hostList) { + host.online = NO; + host.activeAddress = host.address; + } } } @@ -449,7 +455,7 @@ static NSArray* appList; dispatch_async(dispatch_get_main_queue(), ^{ Log(LOG_D, @"New host list:"); for (Host* host in hosts) { - Log(LOG_D, @"Host: \n{\n\t name:%@ \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); + Log(LOG_D, @"Host: \n{\n\t name:%@ \n\t address:%@ \n\t localAddress:%@ \n\t externalAddress:%@ \n\t uuid:%@ \n\t mac:%@ \n\t pairState:%d \n\t online:%d \n\t activeAddress:%@ \n}", host.name, host.address, host.localAddress, host.externalAddress, host.uuid, host.mac, host.pairState, host.online, host.activeAddress); } @synchronized(hostList) { [hostList removeAllObjects];