mirror of
https://github.com/moonlight-stream/moonlight-ios.git
synced 2025-07-02 07:46:16 +00:00
139 lines
5.2 KiB
Objective-C
139 lines
5.2 KiB
Objective-C
//
|
|
// StreamManager.m
|
|
// Moonlight
|
|
//
|
|
// Created by Diego Waxemberg on 10/20/14.
|
|
// Copyright (c) 2014 Moonlight Stream. All rights reserved.
|
|
//
|
|
|
|
#import "StreamManager.h"
|
|
#import "CryptoManager.h"
|
|
#import "HttpManager.h"
|
|
#import "Utils.h"
|
|
|
|
#import "StreamView.h"
|
|
#import "ServerInfoResponse.h"
|
|
#import "HttpResponse.h"
|
|
#import "HttpRequest.h"
|
|
#import "IdManager.h"
|
|
|
|
@implementation StreamManager {
|
|
StreamConfiguration* _config;
|
|
|
|
OSView* _renderView;
|
|
id<ConnectionCallbacks> _callbacks;
|
|
Connection* _connection;
|
|
}
|
|
|
|
- (id) initWithConfig:(StreamConfiguration*)config renderView:(OSView*)view connectionCallbacks:(id<ConnectionCallbacks>)callbacks {
|
|
self = [super init];
|
|
_config = config;
|
|
_renderView = view;
|
|
_callbacks = callbacks;
|
|
_config.riKey = [Utils randomBytes:16];
|
|
_config.riKeyId = arc4random();
|
|
return self;
|
|
}
|
|
|
|
- (void)main {
|
|
[CryptoManager generateKeyPairUsingSSL];
|
|
NSString* uniqueId = [IdManager getUniqueId];
|
|
|
|
HttpManager* hMan = [[HttpManager alloc] initWithHost:_config.host
|
|
uniqueId:uniqueId
|
|
serverCert:_config.serverCert];
|
|
|
|
ServerInfoResponse* serverInfoResp = [[ServerInfoResponse alloc] init];
|
|
[hMan executeRequestSynchronously:[HttpRequest requestForResponse:serverInfoResp withUrlRequest:[hMan newServerInfoRequest:false]
|
|
fallbackError:401 fallbackRequest:[hMan newHttpServerInfoRequest]]];
|
|
NSString* pairStatus = [serverInfoResp getStringTag:@"PairStatus"];
|
|
NSString* appversion = [serverInfoResp getStringTag:@"appversion"];
|
|
NSString* gfeVersion = [serverInfoResp getStringTag:@"GfeVersion"];
|
|
NSString* serverState = [serverInfoResp getStringTag:@"state"];
|
|
if (![serverInfoResp isStatusOk] || pairStatus == NULL || appversion == NULL || serverState == NULL) {
|
|
[_callbacks launchFailed:@"Failed to connect to PC"];
|
|
return;
|
|
}
|
|
|
|
if (![pairStatus isEqualToString:@"1"]) {
|
|
// Not paired
|
|
[_callbacks launchFailed:@"Device not paired to PC"];
|
|
return;
|
|
}
|
|
|
|
// resumeApp and launchApp handle calling launchFailed
|
|
if ([serverState hasSuffix:@"_SERVER_BUSY"]) {
|
|
// App already running, resume it
|
|
if (![self resumeApp:hMan]) {
|
|
return;
|
|
}
|
|
} else {
|
|
// Start app
|
|
if (![self launchApp:hMan]) {
|
|
return;
|
|
}
|
|
}
|
|
|
|
#if TARGET_OS_IPHONE
|
|
// Set mouse delta factors from the screen resolution and stream size
|
|
CGFloat screenScale = [[UIScreen mainScreen] scale];
|
|
CGRect screenBounds = [[UIScreen mainScreen] bounds];
|
|
CGSize screenSize = CGSizeMake(screenBounds.size.width * screenScale, screenBounds.size.height * screenScale);
|
|
[((StreamView*)_renderView) setMouseDeltaFactors:_config.width / screenSize.width
|
|
y:_config.height / screenSize.height];
|
|
#endif
|
|
|
|
// Populate the config's version fields from serverinfo
|
|
_config.appVersion = appversion;
|
|
_config.gfeVersion = gfeVersion;
|
|
|
|
// Initializing the renderer must be done on the main thread
|
|
dispatch_async(dispatch_get_main_queue(), ^{
|
|
VideoDecoderRenderer* renderer = [[VideoDecoderRenderer alloc] initWithView:self->_renderView];
|
|
self->_connection = [[Connection alloc] initWithConfig:self->_config renderer:renderer connectionCallbacks:self->_callbacks];
|
|
NSOperationQueue* opQueue = [[NSOperationQueue alloc] init];
|
|
[opQueue addOperation:self->_connection];
|
|
});
|
|
}
|
|
|
|
- (void) stopStream
|
|
{
|
|
[_connection terminate];
|
|
}
|
|
|
|
- (BOOL) launchApp:(HttpManager*)hMan {
|
|
HttpResponse* launchResp = [[HttpResponse alloc] init];
|
|
[hMan executeRequestSynchronously:[HttpRequest requestForResponse:launchResp withUrlRequest:[hMan newLaunchRequest:_config]]];
|
|
NSString *gameSession = [launchResp getStringTag:@"gamesession"];
|
|
if (launchResp == NULL || ![launchResp isStatusOk]) {
|
|
[_callbacks launchFailed:@"Failed to launch app"];
|
|
Log(LOG_E, @"Failed Launch Response: %@", launchResp.statusMessage);
|
|
return FALSE;
|
|
} else if (gameSession == NULL || [gameSession isEqualToString:@"0"]) {
|
|
[_callbacks launchFailed:launchResp.statusMessage];
|
|
Log(LOG_E, @"Failed to parse game session. Code: %ld Response: %@", (long)launchResp.statusCode, launchResp.statusMessage);
|
|
return FALSE;
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
- (BOOL) resumeApp:(HttpManager*)hMan {
|
|
HttpResponse* resumeResp = [[HttpResponse alloc] init];
|
|
[hMan executeRequestSynchronously:[HttpRequest requestForResponse:resumeResp withUrlRequest:[hMan newResumeRequest:_config]]];
|
|
NSString* resume = [resumeResp getStringTag:@"resume"];
|
|
if (resumeResp == NULL || ![resumeResp isStatusOk]) {
|
|
[_callbacks launchFailed:@"Failed to resume app"];
|
|
Log(LOG_E, @"Failed Resume Response: %@", resumeResp.statusMessage);
|
|
return FALSE;
|
|
} else if (resume == NULL || [resume isEqualToString:@"0"]) {
|
|
[_callbacks launchFailed:resumeResp.statusMessage];
|
|
Log(LOG_E, @"Failed to parse resume response. Code: %ld Response: %@", (long)resumeResp.statusCode, resumeResp.statusMessage);
|
|
return FALSE;
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
@end
|