Don't rely on the utility for ra package extraction. Untested.

This commit is contained in:
Paul Chote
2011-05-04 13:41:27 +12:00
parent 0102a9ad93
commit 83c026e12b
2 changed files with 60 additions and 56 deletions

View File

@@ -23,11 +23,6 @@ namespace OpenRA
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);
@@ -48,32 +43,5 @@ namespace OpenRA
};
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();
}
}
}

View File

@@ -91,7 +91,6 @@ namespace OpenRA.Mods.RA.Widgets.Delegates
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;
@@ -100,29 +99,10 @@ namespace OpenRA.Mods.RA.Widgets.Delegates
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()
@@ -213,6 +193,7 @@ namespace OpenRA.Mods.RA.Widgets.Delegates
ShowDownloadError(window, "Invalid path: "+zipFile);
return false;
}
var status = window.GetWidget<LabelWidget>("STATUS");
List<string> extracted = new List<string>();
try
@@ -223,12 +204,67 @@ namespace OpenRA.Mods.RA.Widgets.Delegates
{
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