Give folders higher priority than packages in FileSystem. Also fixes bug where folder contents were not being cached with the correct hash.

This commit is contained in:
Matthew Bowra-Dean
2010-10-19 02:59:39 +13:00
committed by Chris Forbes
parent f6df7a06f2
commit 2bcf33661a
4 changed files with 36 additions and 9 deletions

View File

@@ -41,5 +41,11 @@ namespace OpenRA.FileFormats
{ {
return hashes.Contains(PackageEntry.HashFilename(filename)); return hashes.Contains(PackageEntry.HashFilename(filename));
} }
public int Priority
{
get { return 1; }
}
} }
} }

View File

@@ -12,6 +12,7 @@ using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.IO; using System.IO;
using System.Reflection; using System.Reflection;
using System.Linq;
namespace OpenRA.FileFormats namespace OpenRA.FileFormats
{ {
@@ -73,9 +74,14 @@ namespace OpenRA.FileFormats
static Stream GetFromCache( Cache<uint, List<IFolder>> index, string filename ) static Stream GetFromCache( Cache<uint, List<IFolder>> index, string filename )
{ {
foreach( var folder in index[ PackageEntry.HashFilename( filename ) ] ) var folder = index[PackageEntry.HashFilename(filename)]
if (folder.Exists(filename)) .Where(x => x.Exists(filename))
return folder.GetContent(filename); .OrderByDescending(x => x.Priority)
.FirstOrDefault();
if (folder != null)
return folder.GetContent(filename);
return null; return null;
} }
@@ -88,11 +94,13 @@ namespace OpenRA.FileFormats
return ret; return ret;
} }
foreach( IFolder folder in mountedFolders ) var folder = mountedFolders
{ .Where(x => x.Exists(filename))
if (folder.Exists(filename)) .OrderByDescending(x => x.Priority)
return folder.GetContent(filename); .FirstOrDefault();
}
if (folder != null)
return folder.GetContent(filename);
throw new FileNotFoundException( string.Format( "File not found: {0}", filename ), filename ); throw new FileNotFoundException( string.Format( "File not found: {0}", filename ), filename );
} }

View File

@@ -28,12 +28,18 @@ namespace OpenRA.FileFormats
public IEnumerable<uint> AllFileHashes() public IEnumerable<uint> AllFileHashes()
{ {
foreach( var filename in Directory.GetFiles( path, "*", SearchOption.TopDirectoryOnly ) ) 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) public bool Exists(string filename)
{ {
return File.Exists(Path.Combine(path,filename)); return File.Exists(Path.Combine(path,filename));
} }
public int Priority
{
get { return 100; }
}
} }
} }

View File

@@ -20,6 +20,7 @@ namespace OpenRA.FileFormats
Stream GetContent(string filename); Stream GetContent(string filename);
bool Exists(string filename); bool Exists(string filename);
IEnumerable<uint> AllFileHashes(); IEnumerable<uint> AllFileHashes();
int Priority { get; }
} }
public class Package : IFolder public class Package : IFolder
@@ -149,6 +150,12 @@ namespace OpenRA.FileFormats
{ {
return index.ContainsKey(PackageEntry.HashFilename(filename)); return index.ContainsKey(PackageEntry.HashFilename(filename));
} }
public int Priority
{
get { return 0; }
}
} }
[Flags] [Flags]