mirror of
https://github.com/overte-org/overte.git
synced 2025-08-10 02:03:11 +02:00
Merge pull request #15824 from MattHardcastle/mac-hq-launcher
A couple macOS HQ Launcher bug fixes
This commit is contained in:
commit
bcdf409fd3
4 changed files with 122 additions and 10 deletions
|
@ -1,4 +1,5 @@
|
||||||
cmake_minimum_required(VERSION 3.0)
|
cmake_minimum_required(VERSION 3.0)
|
||||||
|
set(ENV{MACOSX_DEPLOYMENT_TARGET} 10.9)
|
||||||
project(HQLauncher)
|
project(HQLauncher)
|
||||||
set (CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules/")
|
set (CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules/")
|
||||||
set(src_files
|
set(src_files
|
||||||
|
@ -26,6 +27,8 @@ set(src_files
|
||||||
src/LatestBuildRequest.m
|
src/LatestBuildRequest.m
|
||||||
src/OrganizationRequest.m
|
src/OrganizationRequest.m
|
||||||
src/OrganizationRequest.h
|
src/OrganizationRequest.h
|
||||||
|
src/Interface.h
|
||||||
|
src/Interface.m
|
||||||
src/ErrorViewController.h
|
src/ErrorViewController.h
|
||||||
src/ErrorViewController.m
|
src/ErrorViewController.m
|
||||||
src/Settings.h
|
src/Settings.h
|
||||||
|
@ -67,7 +70,7 @@ add_executable(${PROJECT_NAME} MACOSX_BUNDLE ${src_files})
|
||||||
set_target_properties(${PROJECT_NAME} PROPERTIES OUTPUT_NAME ${APP_NAME}
|
set_target_properties(${PROJECT_NAME} PROPERTIES OUTPUT_NAME ${APP_NAME}
|
||||||
MACOSX_BUNDLE_BUNDLE_NAME ${APP_NAME})
|
MACOSX_BUNDLE_BUNDLE_NAME ${APP_NAME})
|
||||||
set_from_env(LAUNCHER_HMAC_SECRET LAUNCHER_HMAC_SECRET "")
|
set_from_env(LAUNCHER_HMAC_SECRET LAUNCHER_HMAC_SECRET "")
|
||||||
if (LAUNCHER_HMAC_SECRET STREQUAL "")
|
if ("${LAUNCHER_HMAC_SECRET}" STREQUAL "")
|
||||||
message(FATAL_ERROR "LAUNCHER_HMAC_SECRET is not set")
|
message(FATAL_ERROR "LAUNCHER_HMAC_SECRET is not set")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
|
8
launchers/darwin/src/Interface.h
Normal file
8
launchers/darwin/src/Interface.h
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
#import <Foundation/Foundation.h>
|
||||||
|
|
||||||
|
@interface Interface : NSObject
|
||||||
|
|
||||||
|
-(id _Nonnull) initWith:(NSString * _Nonnull) aPathToInterface;
|
||||||
|
-(NSInteger) getVersion:(out NSError * _Nullable * _Nonnull) anError;
|
||||||
|
|
||||||
|
@end
|
90
launchers/darwin/src/Interface.m
Normal file
90
launchers/darwin/src/Interface.m
Normal file
|
@ -0,0 +1,90 @@
|
||||||
|
#import "Interface.h"
|
||||||
|
|
||||||
|
@implementation Interface
|
||||||
|
{
|
||||||
|
NSString *pathTo;
|
||||||
|
}
|
||||||
|
|
||||||
|
-(id) initWith:(NSString*)aPathToInterface
|
||||||
|
{
|
||||||
|
[self init];
|
||||||
|
self->pathTo = [NSString stringWithFormat:@"%@/Contents/MacOS/interface", aPathToInterface];
|
||||||
|
return self;
|
||||||
|
}
|
||||||
|
|
||||||
|
-(NSInteger) getVersion:(out NSError * _Nullable *) outError
|
||||||
|
{
|
||||||
|
NSTask * interface = [[NSTask alloc] init];
|
||||||
|
NSPipe * standardOut = [NSPipe pipe];
|
||||||
|
|
||||||
|
interface.launchPath = self->pathTo;
|
||||||
|
interface.arguments = @[ @"--version" ];
|
||||||
|
interface.standardOutput = standardOut;
|
||||||
|
|
||||||
|
NSLog(@"calling interface at %@", self->pathTo);
|
||||||
|
|
||||||
|
NSError *error = nil;
|
||||||
|
[interface launch];
|
||||||
|
[interface waitUntilExit];
|
||||||
|
if (0 != [interface terminationStatus]) {
|
||||||
|
*outError = [NSError errorWithDomain:@"interface"
|
||||||
|
code:-1
|
||||||
|
userInfo:@{NSUnderlyingErrorKey: error}];
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
NSFileHandle * fh = [standardOut fileHandleForReading];
|
||||||
|
NSData * data = [fh readDataToEndOfFile];
|
||||||
|
NSString * output = [NSString stringWithUTF8String:[data bytes]];
|
||||||
|
if (output == nil) {
|
||||||
|
NSDictionary * userInfo = @{
|
||||||
|
NSLocalizedDescriptionKey: NSLocalizedString(@"Couldn't start interface", nil)
|
||||||
|
};
|
||||||
|
*outError = [NSError errorWithDomain:@"interface"
|
||||||
|
code:-1
|
||||||
|
userInfo:userInfo];
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Interface returns the build version as a string like this:
|
||||||
|
// "Interface 33333-DEADBEEF". This code grabs the substring
|
||||||
|
// between "Interface " and the hyphon ("-")
|
||||||
|
NSRange start = [output rangeOfString:@"Interface "];
|
||||||
|
if (start.length == 0) {
|
||||||
|
NSDictionary * userInfo = @{
|
||||||
|
NSLocalizedDescriptionKey: NSLocalizedString(@"Couldn't read interface's version", nil)
|
||||||
|
};
|
||||||
|
*outError = [NSError errorWithDomain:@"interface"
|
||||||
|
code:-2
|
||||||
|
userInfo:userInfo];
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
NSRange end = [output rangeOfString:@"-"];
|
||||||
|
if (end.length == 0) {
|
||||||
|
NSDictionary * userInfo = @{
|
||||||
|
NSLocalizedDescriptionKey: NSLocalizedString(@"Couldn't read interface's version", nil)
|
||||||
|
};
|
||||||
|
*outError = [NSError errorWithDomain:@"interface"
|
||||||
|
code:-2
|
||||||
|
userInfo:userInfo];
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
NSRange subRange = {start.length, end.location - start.length};
|
||||||
|
NSString * versionStr;
|
||||||
|
@try {
|
||||||
|
versionStr = [output substringWithRange:subRange];
|
||||||
|
}
|
||||||
|
@catch (NSException *) {
|
||||||
|
NSDictionary * userInfo = @{
|
||||||
|
NSLocalizedDescriptionKey: NSLocalizedString(@"Couldn't read interface's version", nil)
|
||||||
|
};
|
||||||
|
*outError = [NSError errorWithDomain:@"interface"
|
||||||
|
code:-2
|
||||||
|
userInfo:userInfo];
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return versionStr.integerValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
@end
|
|
@ -1,17 +1,30 @@
|
||||||
#import "LatestBuildRequest.h"
|
#import "LatestBuildRequest.h"
|
||||||
#import "Launcher.h"
|
#import "Launcher.h"
|
||||||
#import "Settings.h"
|
#import "Settings.h"
|
||||||
|
#import "Interface.h"
|
||||||
|
|
||||||
@implementation LatestBuildRequest
|
@implementation LatestBuildRequest
|
||||||
|
|
||||||
|
- (NSInteger) getCurrentVersion {
|
||||||
|
NSString* interfaceAppPath = [[Launcher.sharedLauncher getAppPath] stringByAppendingString:@"interface.app"];
|
||||||
|
NSError * error = nil;
|
||||||
|
Interface * interface = [[Interface alloc] initWith:interfaceAppPath];
|
||||||
|
NSInteger currentVersion = [interface getVersion:&error];
|
||||||
|
if (currentVersion == 0 && error != nil) {
|
||||||
|
NSLog(@"can't get version from interface, falling back to settings: %@", error);
|
||||||
|
currentVersion = [Settings.sharedSettings latestBuildVersion];
|
||||||
|
}
|
||||||
|
return currentVersion;
|
||||||
|
}
|
||||||
|
|
||||||
- (void) requestLatestBuildInfo {
|
- (void) requestLatestBuildInfo {
|
||||||
NSMutableURLRequest *request = [NSMutableURLRequest new];
|
NSMutableURLRequest *request = [NSMutableURLRequest new];
|
||||||
[request setURL:[NSURL URLWithString:@"https://thunder.highfidelity.com/builds/api/tags/latest?format=json"]];
|
[request setURL:[NSURL URLWithString:@"https://thunder.highfidelity.com/builds/api/tags/latest?format=json"]];
|
||||||
[request setHTTPMethod:@"GET"];
|
[request setHTTPMethod:@"GET"];
|
||||||
[request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
|
[request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
|
||||||
|
|
||||||
|
// We're using an ephermeral session here to ensure the tags api response is never cached.
|
||||||
NSURLSession* session = [NSURLSession sharedSession];
|
NSURLSession * session = [NSURLSession sessionWithConfiguration:NSURLSessionConfiguration.ephemeralSessionConfiguration];
|
||||||
NSURLSessionDataTask* dataTask = [session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
|
NSURLSessionDataTask* dataTask = [session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
|
||||||
|
|
||||||
|
|
||||||
|
@ -45,8 +58,7 @@
|
||||||
BOOL appDirectoryExist = [fileManager fileExistsAtPath:[[sharedLauncher getAppPath] stringByAppendingString:@"interface.app"]];
|
BOOL appDirectoryExist = [fileManager fileExistsAtPath:[[sharedLauncher getAppPath] stringByAppendingString:@"interface.app"]];
|
||||||
|
|
||||||
dispatch_async(dispatch_get_main_queue(), ^{
|
dispatch_async(dispatch_get_main_queue(), ^{
|
||||||
Settings* settings = [Settings sharedSettings];
|
NSInteger currentVersion = [self getCurrentVersion];
|
||||||
NSInteger currentVersion = [settings latestBuildVersion];
|
|
||||||
NSLog(@"Latest Build Request -> does build directory exist: %@", appDirectoryExist ? @"TRUE" : @"FALSE");
|
NSLog(@"Latest Build Request -> does build directory exist: %@", appDirectoryExist ? @"TRUE" : @"FALSE");
|
||||||
NSLog(@"Latest Build Request -> current version: %ld", currentVersion);
|
NSLog(@"Latest Build Request -> current version: %ld", currentVersion);
|
||||||
NSLog(@"Latest Build Request -> latest version: %ld", buildNumber.integerValue);
|
NSLog(@"Latest Build Request -> latest version: %ld", buildNumber.integerValue);
|
||||||
|
@ -105,11 +117,10 @@
|
||||||
NSDictionary* macInstallerObject = [installers objectForKey:@"mac"];
|
NSDictionary* macInstallerObject = [installers objectForKey:@"mac"];
|
||||||
NSString* macInstallerUrl = [macInstallerObject valueForKey:@"zip_url"];
|
NSString* macInstallerUrl = [macInstallerObject valueForKey:@"zip_url"];
|
||||||
|
|
||||||
BOOL appDirectoryExist = [fileManager fileExistsAtPath:[[sharedLauncher getAppPath] stringByAppendingString:@"interface.app"]];
|
NSString* interfaceAppPath = [[sharedLauncher getAppPath] stringByAppendingString:@"interface.app"];
|
||||||
|
BOOL appDirectoryExist = [fileManager fileExistsAtPath:interfaceAppPath];
|
||||||
Settings* settings = [Settings sharedSettings];
|
|
||||||
NSInteger currentVersion = [settings latestBuildVersion];
|
BOOL latestVersionAvailable = ([self getCurrentVersion] != buildNumber.integerValue);
|
||||||
BOOL latestVersionAvailable = (currentVersion != buildNumber.integerValue);
|
|
||||||
[[Settings sharedSettings] buildVersion:buildNumber.integerValue];
|
[[Settings sharedSettings] buildVersion:buildNumber.integerValue];
|
||||||
|
|
||||||
BOOL shouldDownloadInterface = (latestVersionAvailable || !appDirectoryExist);
|
BOOL shouldDownloadInterface = (latestVersionAvailable || !appDirectoryExist);
|
||||||
|
|
Loading…
Reference in a new issue