Skip to content

Commit

Permalink
Don't rely on the utility for ra package extraction. Untested.
Browse files Browse the repository at this point in the history
  • Loading branch information
pchote committed May 4, 2011
1 parent 0102a9a commit 83c026e
Show file tree
Hide file tree
Showing 2 changed files with 60 additions and 56 deletions.
32 changes: 0 additions & 32 deletions OpenRA.Game/Utilities.cs
Expand Up @@ -23,11 +23,6 @@ public Utilities(string utility)
Utility = utility;
}

public void InstallRAFilesAsync(string cdPath, string path, Action<string> parseOutput, Action onComplete)
{
ExecuteUtilityAsync("--install-ra-packages \"{0}\" \"{1}\"".F(cdPath, path), parseOutput, onComplete);
}

public void PromptFilepathAsync(string title, Action<string> withPath)
{
ExecuteUtility("--display-filepicker \"{0}\"".F(title), withPath);
Expand All @@ -48,32 +43,5 @@ void ExecuteUtility(string args, Action<string> onComplete)
};
p.Start();
}

void ExecuteUtilityAsync(string args, Action<string> parseOutput, Action onComplete)
{
Process p = new Process();
p.StartInfo.FileName = Utility;
p.StartInfo.Arguments = "{0} --SupportDir \"{1}\"".F(args, Game.SupportDir);
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();
}
}
}
84 changes: 60 additions & 24 deletions OpenRA.Mods.RA/Widgets/Delegates/GameInitDelegate.cs
Expand Up @@ -91,38 +91,18 @@ bool PromptForCD()
void InstallFromCD(string path)
{
var window = Widget.OpenWindow("INIT_COPY");
var status = window.GetWidget<LabelWidget>("STATUS");
var progress = window.GetWidget<ProgressBarWidget>("PROGRESS");
progress.Indeterminate = true;

// TODO: Handle cancelling copy
window.GetWidget<ButtonWidget>("CANCEL").IsVisible = () => false;
window.GetWidget("CANCEL").OnMouseUp = mi => { ShowInstallMethodDialog(); return true; };
window.GetWidget("RETRY").OnMouseUp = mi => PromptForCD();

status.GetText = () => "Copying...";
var error = false;
Action<string> parseOutput = s =>
{
if (s.Substring(0,5) == "Error")
{
error = true;
ShowDownloadError(window, s);
}
if (s.Substring(0,6) == "Status")
window.GetWidget<LabelWidget>("STATUS").GetText = () => s.Substring(7).Trim();
};

Action onComplete = () =>
{
if (!error)
Game.RunAfterTick(ContinueLoading);
};

if (Info.InstallMode == "ra")
Game.Utilities.InstallRAFilesAsync(path, FileSystem.SpecialPackageRoot+Info.PackagePath, parseOutput, onComplete);
else
if (Info.InstallMode != "ra")
ShowDownloadError(window, "Installing from CD not supported");
else if (InstallRAPackages(window, path, FileSystem.SpecialPackageRoot+Info.PackagePath))
Game.RunAfterTick(ContinueLoading);
}

void ShowDownloadDialog()
Expand Down Expand Up @@ -213,6 +193,7 @@ bool ExtractZip(Widget window, string zipFile, string dest)
ShowDownloadError(window, "Invalid path: "+zipFile);
return false;
}

var status = window.GetWidget<LabelWidget>("STATUS");
List<string> extracted = new List<string>();
try
Expand All @@ -223,12 +204,67 @@ bool ExtractZip(Widget window, string zipFile, string dest)
{
foreach(var f in extracted)
File.Delete(f);
ShowDownloadError(window, "Archive corrupt: "+zipFile);
ShowDownloadError(window, "Archive corrupt");
return false;
}
status.GetText = () => "Extraction complete";
return true;
}

// TODO: The package should be mounted into its own context to avoid name collisions with installed files
bool ExtractFromPackage(Widget window, string srcPath, string package, string[] files, string destPath)
{
var status = window.GetWidget<LabelWidget>("STATUS");

if (!Directory.Exists(destPath))
Directory.CreateDirectory(destPath);

if (!Directory.Exists(srcPath)) { ShowDownloadError(window, "Cannot find "+package); return false; }
FileSystem.Mount(srcPath);
if (!FileSystem.Exists(package)) { ShowDownloadError(window, "Cannot find "+package); return false; }
FileSystem.Mount(package);

foreach (string s in files)
{
var destFile = Path.Combine(destPath, s);
using (var sourceStream = FileSystem.Open(s))
using (var destStream = File.Create(destFile))
{
status.GetText = () => "Extracting "+s;
destStream.Write(sourceStream.ReadAllBytes());
}
}

status.GetText = () => "Extraction complete";
return true;
}

bool CopyFiles(Widget window, string srcPath, string[] files, string destPath)
{
var status = window.GetWidget<LabelWidget>("STATUS");

foreach (var file in files)
{
var fromPath = Path.Combine(srcPath, file);
if (!File.Exists(fromPath))
{
ShowDownloadError(window, "Cannot find "+file);
return false;
}
status.GetText = () => "Extracting "+file.ToLowerInvariant();
File.Copy(fromPath, Path.Combine(destPath, Path.GetFileName(file).ToLowerInvariant()), true);
}
return true;
}

bool InstallRAPackages(Widget window, string source, string dest)
{
if (!CopyFiles(window, Path.Combine(source, "INSTALL"), new string[] {"REDALERT.MIX"}, dest))
return false;
return ExtractFromPackage(window, source, "MAIN.MIX",
new string[] { "conquer.mix", "russian.mix", "allies.mix", "sounds.mix",
"scores.mix", "snow.mix", "interior.mix", "temperat.mix" }, dest);
}
}

static class InstallUtils
Expand Down

0 comments on commit 83c026e

Please sign in to comment.