Don't dispose mod packages when returning to mod chooser.

This commit is contained in:
Paul Chote
2016-02-28 20:13:14 +00:00
parent 0eaa57c017
commit 5c32a77179

View File

@@ -32,6 +32,9 @@ namespace OpenRA.FileSystem
readonly Dictionary<IReadOnlyPackage, int> mountedPackages = new Dictionary<IReadOnlyPackage, int>(); readonly Dictionary<IReadOnlyPackage, int> mountedPackages = new Dictionary<IReadOnlyPackage, int>();
readonly Dictionary<string, IReadOnlyPackage> explicitMounts = new Dictionary<string, IReadOnlyPackage>(); readonly Dictionary<string, IReadOnlyPackage> explicitMounts = new Dictionary<string, IReadOnlyPackage>();
// Mod packages that should not be disposed
readonly List<IReadOnlyPackage> modPackages = new List<IReadOnlyPackage>();
Cache<string, List<IReadOnlyPackage>> fileIndex = new Cache<string, List<IReadOnlyPackage>>(_ => new List<IReadOnlyPackage>()); Cache<string, List<IReadOnlyPackage>> fileIndex = new Cache<string, List<IReadOnlyPackage>>(_ => new List<IReadOnlyPackage>());
public IReadOnlyPackage OpenPackage(string filename) public IReadOnlyPackage OpenPackage(string filename)
@@ -106,18 +109,25 @@ namespace OpenRA.FileSystem
if (optional) if (optional)
name = name.Substring(1); name = name.Substring(1);
var modPackage = name.StartsWith("$"); try
if (modPackage)
name = name.Substring(1);
Action a = () => Mount(modPackage ? ModMetadata.AllMods[name].Package : OpenPackage(name), explicitName);
if (optional)
{ {
try { a(); } IReadOnlyPackage package;
catch { } if (name.StartsWith("$"))
{
name = name.Substring(1);
package = ModMetadata.AllMods[name].Package;
modPackages.Add(package);
}
else
package = OpenPackage(name);
Mount(package, explicitName);
}
catch
{
if (!optional)
throw;
} }
else
a();
} }
public void Mount(IReadOnlyPackage package, string explicitName = null) public void Mount(IReadOnlyPackage package, string explicitName = null)
@@ -166,7 +176,11 @@ namespace OpenRA.FileSystem
foreach (var key in explicitKeys) foreach (var key in explicitKeys)
explicitMounts.Remove(key); explicitMounts.Remove(key);
package.Dispose(); // Mod packages aren't owned by us, so we shouldn't dispose them
if (modPackages.Contains(package))
modPackages.Remove(package);
else
package.Dispose();
} }
else else
mountedPackages[package] = mountCount; mountedPackages[package] = mountCount;
@@ -177,10 +191,13 @@ namespace OpenRA.FileSystem
public void UnmountAll() public void UnmountAll()
{ {
foreach (var package in mountedPackages.Keys) foreach (var package in mountedPackages.Keys)
package.Dispose(); if (!modPackages.Contains(package))
package.Dispose();
mountedPackages.Clear(); mountedPackages.Clear();
explicitMounts.Clear(); explicitMounts.Clear();
modPackages.Clear();
fileIndex = new Cache<string, List<IReadOnlyPackage>>(_ => new List<IReadOnlyPackage>()); fileIndex = new Cache<string, List<IReadOnlyPackage>>(_ => new List<IReadOnlyPackage>());
} }