Have a single utility app per platform. Route zip extraction and ra package install to the .net utility app under osx.
This commit is contained in:
@@ -229,7 +229,7 @@ namespace OpenRA
|
|||||||
SupportDir = args.GetValue("SupportDir", defaultSupport);
|
SupportDir = args.GetValue("SupportDir", defaultSupport);
|
||||||
FileSystem.SpecialPackageRoot = args.GetValue("SpecialPackageRoot", "");
|
FileSystem.SpecialPackageRoot = args.GetValue("SpecialPackageRoot", "");
|
||||||
|
|
||||||
Utilities = new Utilities(args.GetValue("NativeUtilityPath", "."));
|
Utilities = new Utilities(args.GetValue("UtilityPath", "OpenRA.Utility.exe"));
|
||||||
|
|
||||||
Settings = new Settings(SupportDir + "settings.yaml", args);
|
Settings = new Settings(SupportDir + "settings.yaml", args);
|
||||||
Settings.Save();
|
Settings.Save();
|
||||||
|
|||||||
@@ -16,35 +16,34 @@ namespace OpenRA
|
|||||||
{
|
{
|
||||||
public class Utilities
|
public class Utilities
|
||||||
{
|
{
|
||||||
readonly string NativeUtility;
|
readonly string Utility;
|
||||||
readonly string Utility = "OpenRA.Utility.exe";
|
|
||||||
|
|
||||||
public Utilities(string nativeUtility)
|
public Utilities(string utility)
|
||||||
{
|
{
|
||||||
NativeUtility = nativeUtility;
|
Utility = utility;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void ExtractZipAsync(string zipFile, string path, Action<string> parseOutput, Action onComplete)
|
public void ExtractZipAsync(string zipFile, string path, Action<string> parseOutput, Action onComplete)
|
||||||
{
|
{
|
||||||
ExecuteUtilityAsync(Utility, "\"--extract-zip={0},{1}\"".F(zipFile, path), parseOutput, onComplete);
|
ExecuteUtilityAsync("\"--extract-zip {0} {1}\"".F(zipFile, path), parseOutput, onComplete);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void InstallRAFilesAsync(string cdPath, Action<string> parseOutput, Action onComplete)
|
public void InstallRAFilesAsync(string cdPath, Action<string> parseOutput, Action onComplete)
|
||||||
{
|
{
|
||||||
ExecuteUtilityAsync(Utility, "\"--install-ra-packages={0}\"".F(cdPath), parseOutput, onComplete);
|
ExecuteUtilityAsync("\"--install-ra-packages {0}\"".F(cdPath), parseOutput, onComplete);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void PromptFilepathAsync(string title, string message, bool directory, Action<string> withPath)
|
public void PromptFilepathAsync(string title, string message, bool directory, Action<string> withPath)
|
||||||
{
|
{
|
||||||
ExecuteUtility(NativeUtility,
|
ExecuteUtility("--display-filepicker --title \"{0}\" --message \"{1}\" {2} --button-text \"Select\""
|
||||||
"--filepicker --title \"{0}\" --message \"{1}\" {2} --button-text \"Select\"".F(title, message, directory ? "--require-directory" : ""),
|
.F(title, message, directory ? "--require-directory" : ""),
|
||||||
withPath);
|
withPath);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ExecuteUtility(string executable, string args, Action<string> onComplete)
|
void ExecuteUtility(string args, Action<string> onComplete)
|
||||||
{
|
{
|
||||||
Process p = new Process();
|
Process p = new Process();
|
||||||
p.StartInfo.FileName = executable;
|
p.StartInfo.FileName = Utility;
|
||||||
p.StartInfo.Arguments = args;
|
p.StartInfo.Arguments = args;
|
||||||
p.StartInfo.UseShellExecute = false;
|
p.StartInfo.UseShellExecute = false;
|
||||||
p.StartInfo.CreateNoWindow = true;
|
p.StartInfo.CreateNoWindow = true;
|
||||||
@@ -57,10 +56,10 @@ namespace OpenRA
|
|||||||
p.Start();
|
p.Start();
|
||||||
}
|
}
|
||||||
|
|
||||||
void ExecuteUtilityAsync(string executable, string args, Action<string> parseOutput, Action onComplete)
|
void ExecuteUtilityAsync(string args, Action<string> parseOutput, Action onComplete)
|
||||||
{
|
{
|
||||||
Process p = new Process();
|
Process p = new Process();
|
||||||
p.StartInfo.FileName = executable;
|
p.StartInfo.FileName = Utility;
|
||||||
p.StartInfo.Arguments = args;
|
p.StartInfo.Arguments = args;
|
||||||
p.StartInfo.UseShellExecute = false;
|
p.StartInfo.UseShellExecute = false;
|
||||||
p.StartInfo.CreateNoWindow = true;
|
p.StartInfo.CreateNoWindow = true;
|
||||||
|
|||||||
@@ -16,6 +16,10 @@
|
|||||||
IBOutlet NSWindow *window;
|
IBOutlet NSWindow *window;
|
||||||
}
|
}
|
||||||
- (void)launchFilePicker:(NSArray *)args;
|
- (void)launchFilePicker:(NSArray *)args;
|
||||||
|
- (void)extractZip:(NSArray *)args;
|
||||||
|
- (void)installRaPackages:(NSArray *)args;
|
||||||
- (void)launchMod:(NSString *)mod;
|
- (void)launchMod:(NSString *)mod;
|
||||||
- (BOOL)initMono;
|
- (BOOL)initMono;
|
||||||
|
- (void)runUtilityWithArg:(NSString *)arg;
|
||||||
|
- (void)utilityResponded:(NSNotification *)n;
|
||||||
@end
|
@end
|
||||||
|
|||||||
@@ -23,10 +23,10 @@
|
|||||||
NSArray *args = [[NSProcessInfo processInfo] arguments];
|
NSArray *args = [[NSProcessInfo processInfo] arguments];
|
||||||
|
|
||||||
// Ingame requests for native dialogs
|
// Ingame requests for native dialogs
|
||||||
if ([args containsObject:@"--filepicker"])
|
if ([args containsObject:@"--display-filepicker"])
|
||||||
[self launchFilePicker:args];
|
[self launchFilePicker:args];
|
||||||
|
|
||||||
|
|
||||||
// Try and launch the game
|
// Try and launch the game
|
||||||
if (![self initMono])
|
if (![self initMono])
|
||||||
{
|
{
|
||||||
@@ -42,10 +42,29 @@
|
|||||||
[[NSApplication sharedApplication] terminate:self];
|
[[NSApplication sharedApplication] terminate:self];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Extract a zip file
|
||||||
|
if ([args containsObject:@"--extract-zip"])
|
||||||
|
[self extractZip:args];
|
||||||
|
|
||||||
|
// Install ra packages from cd
|
||||||
|
if ([args containsObject:@"--install-ra-packages"])
|
||||||
|
[self installRaPackages:args];
|
||||||
|
|
||||||
|
|
||||||
[self launchMod:@"cnc"];
|
[self launchMod:@"cnc"];
|
||||||
[NSApp terminate: nil];
|
[NSApp terminate: nil];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
- (void)extractZip:(NSArray *)args
|
||||||
|
{
|
||||||
|
[self runUtilityWithArg:[NSString stringWithFormat:@"--extract-zip=%@,%@",[args objectAtIndex:2],[args objectAtIndex:3]]];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)installRaPackages:(NSArray *)args
|
||||||
|
{
|
||||||
|
[self runUtilityWithArg:[NSString stringWithFormat:@"--install-ra-packages=%@",[args objectAtIndex:2]]];
|
||||||
|
}
|
||||||
|
|
||||||
- (void)launchFilePicker:(NSArray *)args
|
- (void)launchFilePicker:(NSArray *)args
|
||||||
{
|
{
|
||||||
[NSApp activateIgnoringOtherApps:YES];
|
[NSApp activateIgnoringOtherApps:YES];
|
||||||
@@ -85,7 +104,7 @@
|
|||||||
[NSApp terminate: nil];
|
[NSApp terminate: nil];
|
||||||
}
|
}
|
||||||
|
|
||||||
-(void) launchMod:(NSString *)mod
|
-(void)launchMod:(NSString *)mod
|
||||||
{
|
{
|
||||||
// Use LaunchServices because neither NSTask or NSWorkspace support Info.plist _and_ arguments pre-10.6
|
// Use LaunchServices because neither NSTask or NSWorkspace support Info.plist _and_ arguments pre-10.6
|
||||||
|
|
||||||
@@ -169,6 +188,46 @@
|
|||||||
(major == 2 && minor == 6 && point >= 7));
|
(major == 2 && minor == 6 && point >= 7));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
- (void)runUtilityWithArg:(NSString *)arg
|
||||||
|
{
|
||||||
|
NSTask *task = [[[NSTask alloc] init] autorelease];
|
||||||
|
NSPipe *pipe = [NSPipe pipe];
|
||||||
|
|
||||||
|
NSMutableArray *taskArgs = [NSMutableArray arrayWithObject:@"OpenRA.Utility.exe"];
|
||||||
|
[taskArgs addObject:arg];
|
||||||
|
|
||||||
|
[task setCurrentDirectoryPath:gamePath];
|
||||||
|
[task setLaunchPath:monoPath];
|
||||||
|
[task setArguments:taskArgs];
|
||||||
|
[task setStandardOutput:pipe];
|
||||||
|
|
||||||
|
NSFileHandle *readHandle = [pipe fileHandleForReading];
|
||||||
|
NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
|
||||||
|
[nc addObserver:self
|
||||||
|
selector:@selector(utilityResponded:)
|
||||||
|
name:NSFileHandleReadCompletionNotification
|
||||||
|
object:readHandle];
|
||||||
|
[task launch];
|
||||||
|
[readHandle readInBackgroundAndNotify];
|
||||||
|
[task waitUntilExit];
|
||||||
|
|
||||||
|
[nc removeObserver:self name:NSFileHandleReadCompletionNotification object:[[task standardOutput] fileHandleForReading]];
|
||||||
|
[nc removeObserver:self name:NSTaskDidTerminateNotification object:task];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)utilityResponded:(NSNotification *)n
|
||||||
|
{
|
||||||
|
NSData *data = [[n userInfo] valueForKey:NSFileHandleNotificationDataItem];
|
||||||
|
NSString *response = [[[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding] autorelease];
|
||||||
|
printf("%s", [response UTF8String]);
|
||||||
|
|
||||||
|
// Keep reading
|
||||||
|
if ([n object] != nil)
|
||||||
|
[[n object] readInBackgroundAndNotify];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
- (void)dealloc
|
- (void)dealloc
|
||||||
{
|
{
|
||||||
[monoPath release]; monoPath = nil;
|
[monoPath release]; monoPath = nil;
|
||||||
|
|||||||
Binary file not shown.
Reference in New Issue
Block a user