From aa319ee403dcc3b3a3d44d820d032a347f063434 Mon Sep 17 00:00:00 2001 From: Paul Chote Date: Sat, 22 Jan 2011 11:10:14 +1300 Subject: [PATCH] Begin refactoring utility process launching. --- OpenRA.Game/Game.cs | 5 +- OpenRA.Game/OpenRA.Game.csproj | 1 + OpenRA.Game/Utilities.cs | 96 ++++++++++++++++++ OpenRA.Launcher.Mac/Controller.m | 6 +- .../Release/OpenRA.app/Contents/MacOS/OpenRA | Bin 72772 -> 76876 bytes OpenRA.Launcher.Mac/main.m | 5 +- .../Widgets/Delegates/GameInitDelegate.cs | 78 +------------- 7 files changed, 110 insertions(+), 81 deletions(-) create mode 100644 OpenRA.Game/Utilities.cs diff --git a/OpenRA.Game/Game.cs b/OpenRA.Game/Game.cs index 305ee751d1..13f40e383f 100755 --- a/OpenRA.Game/Game.cs +++ b/OpenRA.Game/Game.cs @@ -29,6 +29,8 @@ namespace OpenRA { public static class Game { + public static Utilities Utilities; + public static int CellSize { get { return modData.Manifest.TileSize; } } public static ModData modData; @@ -227,8 +229,9 @@ namespace OpenRA SupportDir = args.GetValue("SupportDir", defaultSupport); FileSystem.SpecialPackageRoot = args.GetValue("SpecialPackageRoot", ""); + Utilities = new Utilities(args.GetValue("NativeUtilityPath", ".")); + Settings = new Settings(SupportDir + "settings.yaml", args); - Settings.Save(); Log.LogPath = SupportDir + "Logs" + Path.DirectorySeparatorChar; diff --git a/OpenRA.Game/OpenRA.Game.csproj b/OpenRA.Game/OpenRA.Game.csproj index 7aec37fb59..2db036022d 100755 --- a/OpenRA.Game/OpenRA.Game.csproj +++ b/OpenRA.Game/OpenRA.Game.csproj @@ -182,6 +182,7 @@ + diff --git a/OpenRA.Game/Utilities.cs b/OpenRA.Game/Utilities.cs new file mode 100644 index 0000000000..96c88224b2 --- /dev/null +++ b/OpenRA.Game/Utilities.cs @@ -0,0 +1,96 @@ +#region Copyright & License Information +/* + * Copyright 2007-2010 The OpenRA Developers (see AUTHORS) + * This file is part of OpenRA, which is free software. It is made + * available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation. For more information, + * see LICENSE. + */ +#endregion + +using System; +using System.Diagnostics; +using System.Threading; + +namespace OpenRA +{ + public class Utilities + { + readonly string NativeUtility; + readonly string Utility = "OpenRA.Utility.exe"; + + public Utilities(string nativeUtility) + { + NativeUtility = nativeUtility; + } + + public void ExtractZip(string zipFile, string path, Action parseOutput, Action onComplete) + { + Process p = new Process(); + p.StartInfo.FileName = Utility; + p.StartInfo.Arguments = "\"--extract-zip={0},{1}\"".F(zipFile, path); + p.StartInfo.UseShellExecute = false; + p.StartInfo.CreateNoWindow = true; + p.StartInfo.RedirectStandardOutput = true; + p.Start(); + var t = new Thread( _ => + { + using (var reader = p.StandardOutput) + { + // This is wrong, chrisf knows why + while (!p.HasExited) + { + string s = reader.ReadLine(); + if (string.IsNullOrEmpty(s)) continue; + parseOutput(s); + } + } + onComplete(); + }) { IsBackground = true }; + t.Start(); + } + + public void CopyRAFiles(string cdPath, Action parseOutput, Action onComplete) + { + Process p = new Process(); + p.StartInfo.FileName = Utility; + p.StartInfo.Arguments = "\"--install-ra-packages={0}\"".F(cdPath); + p.StartInfo.UseShellExecute = false; + p.StartInfo.CreateNoWindow = true; + p.StartInfo.RedirectStandardOutput = true; + p.Start(); + + var t = new Thread( _ => + { + using (var reader = p.StandardOutput) + { + // This is wrong, chrisf knows why + while (!p.HasExited) + { + string s = reader.ReadLine(); + if (string.IsNullOrEmpty(s)) continue; + parseOutput(s); + } + } + onComplete(); + }) { IsBackground = true }; + t.Start(); + } + + public void PromptFilepathAsync(string title, string message, bool directory, Action withPath) + { + Process p = new Process(); + p.StartInfo.FileName = NativeUtility; + p.StartInfo.Arguments = "--filepicker --title \"{0}\" --message \"{1}\" {2} --button-text \"Select\"".F(title, message, directory ? "--require-directory" : ""); + p.StartInfo.UseShellExecute = false; + p.StartInfo.CreateNoWindow = true; + p.StartInfo.RedirectStandardOutput = true; + p.EnableRaisingEvents = true; + p.Exited += (_,e) => + { + withPath(p.StandardOutput.ReadToEnd().Trim()); + }; + p.Start(); + } + } +} diff --git a/OpenRA.Launcher.Mac/Controller.m b/OpenRA.Launcher.Mac/Controller.m index 93a0242e4f..e723e4079f 100644 --- a/OpenRA.Launcher.Mac/Controller.m +++ b/OpenRA.Launcher.Mac/Controller.m @@ -36,14 +36,13 @@ otherButton:nil informativeTextWithFormat:@"OpenRA requires the Mono Framework version 2.6.7 or later."]; - if ([alert runModal] == NSAlertDefaultReturn) [[NSWorkspace sharedWorkspace] openURL:[NSURL URLWithString:@"http://www.go-mono.com/mono-downloads/download.html"]]; [[NSApplication sharedApplication] terminate:self]; } - [self launchMod:@"ra"]; + [self launchMod:@"cnc"]; [NSApp terminate: nil]; } @@ -94,6 +93,7 @@ // Second...Nth arguments are passed to OpenRA.Game.exe // Launcher wrapper sets mono --debug, gl renderer and support dir. NSArray *args = [NSArray arrayWithObjects:@"--launch", gamePath, monoPath, + [NSString stringWithFormat:@"NativeUtilityPath=%@", [[[NSBundle mainBundle] executablePath] stringByAddingPercentEscapesUsingEncoding:NSASCIIStringEncoding]], [NSString stringWithFormat:@"SupportDir=%@",[@"~/Library/Application Support/OpenRA" stringByExpandingTildeInPath]], [NSString stringWithFormat:@"Game.Mods=%@",mod], nil]; @@ -113,7 +113,7 @@ ProcessSerialNumber psn; OSStatus err = LSOpenApplication(¶ms, &psn); - + // Bring the game window to the front if (err == noErr) SetFrontProcess(&psn); diff --git a/OpenRA.Launcher.Mac/build/Release/OpenRA.app/Contents/MacOS/OpenRA b/OpenRA.Launcher.Mac/build/Release/OpenRA.app/Contents/MacOS/OpenRA index 15581961d10980772af52ebd2dce0501d3200a51..818cd93a1002d0ce03b6b7cc236f2c68cdbac90e 100755 GIT binary patch delta 13596 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 QtdA}F*#3$|mePj*AFr%_kN^Mx delta 12854 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 V8o{OYO */ - if (argc >= 5 && strcmp(argv[1], "--launch") == 0) + * --launch */ + if (argc >= 6 && strcmp(argv[1], "--launch") == 0) { /* Change into the game dir */ chdir(argv[2]); @@ -26,6 +26,7 @@ int main(int argc, char *argv[]) "OpenRA.Game.exe", argv[4], argv[5], + argv[6], NULL }; diff --git a/OpenRA.Mods.RA/Widgets/Delegates/GameInitDelegate.cs b/OpenRA.Mods.RA/Widgets/Delegates/GameInitDelegate.cs index 06cdfc4f12..5f5fc4f5ef 100755 --- a/OpenRA.Mods.RA/Widgets/Delegates/GameInitDelegate.cs +++ b/OpenRA.Mods.RA/Widgets/Delegates/GameInitDelegate.cs @@ -77,7 +77,7 @@ namespace OpenRA.Mods.RA.Widgets.Delegates bool PromptForCD() { - PromptFilepathAsync("Select CD", "Select the {0} CD".F(Info.GameTitle), true, path => + Game.Utilities.PromptFilepathAsync("Select CD", "Select the {0} CD".F(Info.GameTitle), true, path => { if (!string.IsNullOrEmpty(path)) Game.RunAfterTick(() => InstallFromCD(path)); @@ -117,7 +117,7 @@ namespace OpenRA.Mods.RA.Widgets.Delegates }; if (Info.InstallMode == "ra") - CopyRAFiles(path, parseOutput, onComplete); + Game.Utilities.CopyRAFiles(path, parseOutput, onComplete); else ShowDownloadError("Installing from CD not supported"); } @@ -163,7 +163,7 @@ namespace OpenRA.Mods.RA.Widgets.Delegates Game.RunAfterTick(() => ContinueLoading(Info)); }; - Game.RunAfterTick(() => ExtractZip(file, Info.PackagePath, parseOutput, onComplete)); + Game.RunAfterTick(() => Game.Utilities.ExtractZip(file, Info.PackagePath, parseOutput, onComplete)); } }; @@ -186,7 +186,6 @@ namespace OpenRA.Mods.RA.Widgets.Delegates Widget.OpenWindow("MAINMENU_BG"); } - // General support methods public class Download { @@ -214,76 +213,5 @@ namespace OpenRA.Mods.RA.Widgets.Delegates cancelled = true; } } - - public static void ExtractZip(string zipFile, string path, Action parseOutput, Action onComplete) - { - Process p = new Process(); - p.StartInfo.FileName = "OpenRA.Utility.exe"; - p.StartInfo.Arguments = "\"--extract-zip={0},{1}\"".F(zipFile, path); - p.StartInfo.UseShellExecute = false; - p.StartInfo.CreateNoWindow = true; - p.StartInfo.RedirectStandardOutput = true; - p.Start(); - var t = new Thread( _ => - { - using (var reader = p.StandardOutput) - { - // This is wrong, chrisf knows why - while (!p.HasExited) - { - string s = reader.ReadLine(); - if (string.IsNullOrEmpty(s)) continue; - parseOutput(s); - } - } - onComplete(); - }) { IsBackground = true }; - t.Start(); - } - - public static void CopyRAFiles(string cdPath, Action parseOutput, Action onComplete) - { - - Process p = new Process(); - p.StartInfo.FileName = "OpenRA.Utility.exe"; - p.StartInfo.Arguments = "\"--install-ra-packages={0}\"".F(cdPath); - p.StartInfo.UseShellExecute = false; - p.StartInfo.CreateNoWindow = true; - p.StartInfo.RedirectStandardOutput = true; - p.Start(); - - var t = new Thread( _ => - { - using (var reader = p.StandardOutput) - { - // This is wrong, chrisf knows why - while (!p.HasExited) - { - string s = reader.ReadLine(); - if (string.IsNullOrEmpty(s)) continue; - parseOutput(s); - } - } - onComplete(); - }) { IsBackground = true }; - t.Start(); - - } - - public static void PromptFilepathAsync(string title, string message, bool directory, Action withPath) - { - Process p = new Process(); - p.StartInfo.FileName = "OpenRA.Launcher.Mac/build/Release/OpenRA.app/Contents/MacOS/OpenRA"; - p.StartInfo.Arguments = "--filepicker --title \"{0}\" --message \"{1}\" {2} --button-text \"Select\"".F(title, message, directory ? "--require-directory" : ""); - p.StartInfo.UseShellExecute = false; - p.StartInfo.CreateNoWindow = true; - p.StartInfo.RedirectStandardOutput = true; - p.EnableRaisingEvents = true; - p.Exited += (_,e) => - { - withPath(p.StandardOutput.ReadToEnd().Trim()); - }; - p.Start(); - } } }