mirror of
https://thingvellir.net/git/overte
synced 2025-03-27 23:52:03 +01: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)
|
||||
set(ENV{MACOSX_DEPLOYMENT_TARGET} 10.9)
|
||||
project(HQLauncher)
|
||||
set (CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules/")
|
||||
set(src_files
|
||||
|
@ -26,6 +27,8 @@ set(src_files
|
|||
src/LatestBuildRequest.m
|
||||
src/OrganizationRequest.m
|
||||
src/OrganizationRequest.h
|
||||
src/Interface.h
|
||||
src/Interface.m
|
||||
src/ErrorViewController.h
|
||||
src/ErrorViewController.m
|
||||
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}
|
||||
MACOSX_BUNDLE_BUNDLE_NAME ${APP_NAME})
|
||||
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")
|
||||
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 "Launcher.h"
|
||||
#import "Settings.h"
|
||||
#import "Interface.h"
|
||||
|
||||
@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 {
|
||||
NSMutableURLRequest *request = [NSMutableURLRequest new];
|
||||
[request setURL:[NSURL URLWithString:@"https://thunder.highfidelity.com/builds/api/tags/latest?format=json"]];
|
||||
[request setHTTPMethod:@"GET"];
|
||||
[request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
|
||||
|
||||
|
||||
NSURLSession* session = [NSURLSession sharedSession];
|
||||
// We're using an ephermeral session here to ensure the tags api response is never cached.
|
||||
NSURLSession * session = [NSURLSession sessionWithConfiguration:NSURLSessionConfiguration.ephemeralSessionConfiguration];
|
||||
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"]];
|
||||
|
||||
dispatch_async(dispatch_get_main_queue(), ^{
|
||||
Settings* settings = [Settings sharedSettings];
|
||||
NSInteger currentVersion = [settings latestBuildVersion];
|
||||
NSInteger currentVersion = [self getCurrentVersion];
|
||||
NSLog(@"Latest Build Request -> does build directory exist: %@", appDirectoryExist ? @"TRUE" : @"FALSE");
|
||||
NSLog(@"Latest Build Request -> current version: %ld", currentVersion);
|
||||
NSLog(@"Latest Build Request -> latest version: %ld", buildNumber.integerValue);
|
||||
|
@ -105,11 +117,10 @@
|
|||
NSDictionary* macInstallerObject = [installers objectForKey:@"mac"];
|
||||
NSString* macInstallerUrl = [macInstallerObject valueForKey:@"zip_url"];
|
||||
|
||||
BOOL appDirectoryExist = [fileManager fileExistsAtPath:[[sharedLauncher getAppPath] stringByAppendingString:@"interface.app"]];
|
||||
|
||||
Settings* settings = [Settings sharedSettings];
|
||||
NSInteger currentVersion = [settings latestBuildVersion];
|
||||
BOOL latestVersionAvailable = (currentVersion != buildNumber.integerValue);
|
||||
NSString* interfaceAppPath = [[sharedLauncher getAppPath] stringByAppendingString:@"interface.app"];
|
||||
BOOL appDirectoryExist = [fileManager fileExistsAtPath:interfaceAppPath];
|
||||
|
||||
BOOL latestVersionAvailable = ([self getCurrentVersion] != buildNumber.integerValue);
|
||||
[[Settings sharedSettings] buildVersion:buildNumber.integerValue];
|
||||
|
||||
BOOL shouldDownloadInterface = (latestVersionAvailable || !appDirectoryExist);
|
||||
|
|
Loading…
Reference in a new issue