Remove legacy hashing from BagFile.

This commit is contained in:
Paul Chote
2016-01-16 20:28:59 +00:00
parent ccdbdebdb1
commit 7ed24ce6de
2 changed files with 12 additions and 98 deletions

View File

@@ -24,14 +24,12 @@ namespace OpenRA.FileSystem
readonly string bagFilename;
readonly Stream s;
readonly int bagFilePriority;
readonly Dictionary<uint, IdxEntry> index;
readonly FileSystem context;
readonly Dictionary<string, IdxEntry> index;
public BagFile(FileSystem context, string filename, int priority)
{
bagFilename = filename;
bagFilePriority = priority;
this.context = context;
// A bag file is always accompanied with an .idx counterpart
// For example: audio.bag requires the audio.idx file
@@ -42,7 +40,7 @@ namespace OpenRA.FileSystem
using (var indexStream = context.Open(indexFilename))
entries = new IdxReader(indexStream).Entries;
index = entries.ToDictionaryWithConflictLog(x => x.Hash,
index = entries.ToDictionaryWithConflictLog(x => x.Filename,
"{0} (bag format)".F(filename),
null, x => "(offs={0}, len={1})".F(x.Offset, x.Length));
@@ -52,10 +50,10 @@ namespace OpenRA.FileSystem
public int Priority { get { return 1000 + bagFilePriority; } }
public string Name { get { return bagFilename; } }
public Stream GetContent(uint hash)
public Stream GetContent(string filename)
{
IdxEntry entry;
if (!index.TryGetValue(hash, out entry))
if (!index.TryGetValue(filename, out entry))
return null;
s.Seek(entry.Offset, SeekOrigin.Begin);
@@ -118,49 +116,14 @@ namespace OpenRA.FileSystem
return mergedStream;
}
uint? FindMatchingHash(string filename)
{
var hash = IdxEntry.HashFilename(filename, PackageHashType.CRC32);
if (index.ContainsKey(hash))
return hash;
// Maybe we were given a raw hash?
uint raw;
if (!uint.TryParse(filename, NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture, out raw))
return null;
if ("{0:X}".F(raw) == filename && index.ContainsKey(raw))
return raw;
return null;
}
public Stream GetContent(string filename)
{
var hash = FindMatchingHash(filename);
return hash.HasValue ? GetContent(hash.Value) : null;
}
public bool Exists(string filename)
{
return FindMatchingHash(filename).HasValue;
return index.ContainsKey(filename);
}
public IEnumerable<string> AllFileNames()
{
var lookup = new Dictionary<uint, string>();
if (context.Exists("global mix database.dat"))
{
var db = new XccGlobalDatabase(context.Open("global mix database.dat"));
foreach (var e in db.Entries)
{
var hash = IdxEntry.HashFilename(e, PackageHashType.CRC32);
if (!lookup.ContainsKey(hash))
lookup.Add(hash, e);
}
}
return index.Keys.Select(k => lookup.ContainsKey(k) ? lookup[k] : "{0:X}".F(k));
return index.Keys;
}
public void Dispose()