Don't rely on the utility for ra package extraction. Untested.
This commit is contained in:
@@ -23,11 +23,6 @@ namespace OpenRA
|
|||||||
Utility = 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)
|
public void PromptFilepathAsync(string title, Action<string> withPath)
|
||||||
{
|
{
|
||||||
ExecuteUtility("--display-filepicker \"{0}\"".F(title), withPath);
|
ExecuteUtility("--display-filepicker \"{0}\"".F(title), withPath);
|
||||||
@@ -48,32 +43,5 @@ namespace OpenRA
|
|||||||
};
|
};
|
||||||
p.Start();
|
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();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -91,7 +91,6 @@ namespace OpenRA.Mods.RA.Widgets.Delegates
|
|||||||
void InstallFromCD(string path)
|
void InstallFromCD(string path)
|
||||||
{
|
{
|
||||||
var window = Widget.OpenWindow("INIT_COPY");
|
var window = Widget.OpenWindow("INIT_COPY");
|
||||||
var status = window.GetWidget<LabelWidget>("STATUS");
|
|
||||||
var progress = window.GetWidget<ProgressBarWidget>("PROGRESS");
|
var progress = window.GetWidget<ProgressBarWidget>("PROGRESS");
|
||||||
progress.Indeterminate = true;
|
progress.Indeterminate = true;
|
||||||
|
|
||||||
@@ -100,29 +99,10 @@ namespace OpenRA.Mods.RA.Widgets.Delegates
|
|||||||
window.GetWidget("CANCEL").OnMouseUp = mi => { ShowInstallMethodDialog(); return true; };
|
window.GetWidget("CANCEL").OnMouseUp = mi => { ShowInstallMethodDialog(); return true; };
|
||||||
window.GetWidget("RETRY").OnMouseUp = mi => PromptForCD();
|
window.GetWidget("RETRY").OnMouseUp = mi => PromptForCD();
|
||||||
|
|
||||||
status.GetText = () => "Copying...";
|
if (Info.InstallMode != "ra")
|
||||||
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
|
|
||||||
ShowDownloadError(window, "Installing from CD not supported");
|
ShowDownloadError(window, "Installing from CD not supported");
|
||||||
|
else if (InstallRAPackages(window, path, FileSystem.SpecialPackageRoot+Info.PackagePath))
|
||||||
|
Game.RunAfterTick(ContinueLoading);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ShowDownloadDialog()
|
void ShowDownloadDialog()
|
||||||
@@ -213,6 +193,7 @@ namespace OpenRA.Mods.RA.Widgets.Delegates
|
|||||||
ShowDownloadError(window, "Invalid path: "+zipFile);
|
ShowDownloadError(window, "Invalid path: "+zipFile);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
var status = window.GetWidget<LabelWidget>("STATUS");
|
var status = window.GetWidget<LabelWidget>("STATUS");
|
||||||
List<string> extracted = new List<string>();
|
List<string> extracted = new List<string>();
|
||||||
try
|
try
|
||||||
@@ -223,12 +204,67 @@ namespace OpenRA.Mods.RA.Widgets.Delegates
|
|||||||
{
|
{
|
||||||
foreach(var f in extracted)
|
foreach(var f in extracted)
|
||||||
File.Delete(f);
|
File.Delete(f);
|
||||||
ShowDownloadError(window, "Archive corrupt: "+zipFile);
|
ShowDownloadError(window, "Archive corrupt");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
status.GetText = () => "Extraction complete";
|
status.GetText = () => "Extraction complete";
|
||||||
return true;
|
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
|
static class InstallUtils
|
||||||
|
|||||||
Reference in New Issue
Block a user