diff --git a/OpenRA.FileFormats/CompressedPackage.cs b/OpenRA.FileFormats/CompressedPackage.cs index 4b9f553b6b..fa04960878 100644 --- a/OpenRA.FileFormats/CompressedPackage.cs +++ b/OpenRA.FileFormats/CompressedPackage.cs @@ -41,5 +41,11 @@ namespace OpenRA.FileFormats { return hashes.Contains(PackageEntry.HashFilename(filename)); } + + + public int Priority + { + get { return 1; } + } } } diff --git a/OpenRA.FileFormats/FileSystem.cs b/OpenRA.FileFormats/FileSystem.cs index cd59b5eee0..5ab7e8d5f6 100644 --- a/OpenRA.FileFormats/FileSystem.cs +++ b/OpenRA.FileFormats/FileSystem.cs @@ -12,6 +12,7 @@ using System; using System.Collections.Generic; using System.IO; using System.Reflection; +using System.Linq; namespace OpenRA.FileFormats { @@ -73,9 +74,14 @@ namespace OpenRA.FileFormats static Stream GetFromCache( Cache> index, string filename ) { - foreach( var folder in index[ PackageEntry.HashFilename( filename ) ] ) - if (folder.Exists(filename)) - return folder.GetContent(filename); + var folder = index[PackageEntry.HashFilename(filename)] + .Where(x => x.Exists(filename)) + .OrderByDescending(x => x.Priority) + .FirstOrDefault(); + + if (folder != null) + return folder.GetContent(filename); + return null; } @@ -88,11 +94,13 @@ namespace OpenRA.FileFormats return ret; } - foreach( IFolder folder in mountedFolders ) - { - if (folder.Exists(filename)) - return folder.GetContent(filename); - } + var folder = mountedFolders + .Where(x => x.Exists(filename)) + .OrderByDescending(x => x.Priority) + .FirstOrDefault(); + + if (folder != null) + return folder.GetContent(filename); throw new FileNotFoundException( string.Format( "File not found: {0}", filename ), filename ); } diff --git a/OpenRA.FileFormats/Folder.cs b/OpenRA.FileFormats/Folder.cs index f76d41fa27..9666d86808 100644 --- a/OpenRA.FileFormats/Folder.cs +++ b/OpenRA.FileFormats/Folder.cs @@ -28,12 +28,18 @@ namespace OpenRA.FileFormats public IEnumerable AllFileHashes() { foreach( var filename in Directory.GetFiles( path, "*", SearchOption.TopDirectoryOnly ) ) - yield return PackageEntry.HashFilename( filename ); + yield return PackageEntry.HashFilename( Path.GetFileName(filename) ); } public bool Exists(string filename) { return File.Exists(Path.Combine(path,filename)); } + + + public int Priority + { + get { return 100; } + } } } diff --git a/OpenRA.FileFormats/Package.cs b/OpenRA.FileFormats/Package.cs index 0d847890a3..3ff551d4b3 100644 --- a/OpenRA.FileFormats/Package.cs +++ b/OpenRA.FileFormats/Package.cs @@ -20,6 +20,7 @@ namespace OpenRA.FileFormats Stream GetContent(string filename); bool Exists(string filename); IEnumerable AllFileHashes(); + int Priority { get; } } public class Package : IFolder @@ -149,6 +150,12 @@ namespace OpenRA.FileFormats { return index.ContainsKey(PackageEntry.HashFilename(filename)); } + + + public int Priority + { + get { return 0; } + } } [Flags]