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 string bagFilename;
readonly Stream s; readonly Stream s;
readonly int bagFilePriority; readonly int bagFilePriority;
readonly Dictionary<uint, IdxEntry> index; readonly Dictionary<string, IdxEntry> index;
readonly FileSystem context;
public BagFile(FileSystem context, string filename, int priority) public BagFile(FileSystem context, string filename, int priority)
{ {
bagFilename = filename; bagFilename = filename;
bagFilePriority = priority; bagFilePriority = priority;
this.context = context;
// A bag file is always accompanied with an .idx counterpart // A bag file is always accompanied with an .idx counterpart
// For example: audio.bag requires the audio.idx file // For example: audio.bag requires the audio.idx file
@@ -42,7 +40,7 @@ namespace OpenRA.FileSystem
using (var indexStream = context.Open(indexFilename)) using (var indexStream = context.Open(indexFilename))
entries = new IdxReader(indexStream).Entries; entries = new IdxReader(indexStream).Entries;
index = entries.ToDictionaryWithConflictLog(x => x.Hash, index = entries.ToDictionaryWithConflictLog(x => x.Filename,
"{0} (bag format)".F(filename), "{0} (bag format)".F(filename),
null, x => "(offs={0}, len={1})".F(x.Offset, x.Length)); 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 int Priority { get { return 1000 + bagFilePriority; } }
public string Name { get { return bagFilename; } } public string Name { get { return bagFilename; } }
public Stream GetContent(uint hash) public Stream GetContent(string filename)
{ {
IdxEntry entry; IdxEntry entry;
if (!index.TryGetValue(hash, out entry)) if (!index.TryGetValue(filename, out entry))
return null; return null;
s.Seek(entry.Offset, SeekOrigin.Begin); s.Seek(entry.Offset, SeekOrigin.Begin);
@@ -118,49 +116,14 @@ namespace OpenRA.FileSystem
return mergedStream; 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) public bool Exists(string filename)
{ {
return FindMatchingHash(filename).HasValue; return index.ContainsKey(filename);
} }
public IEnumerable<string> AllFileNames() public IEnumerable<string> AllFileNames()
{ {
var lookup = new Dictionary<uint, string>(); return index.Keys;
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));
} }
public void Dispose() public void Dispose()

View File

@@ -15,80 +15,31 @@ namespace OpenRA.FileSystem
{ {
public class IdxEntry public class IdxEntry
{ {
public const string DefaultExtension = "wav"; public readonly string Filename;
public readonly uint Hash;
public readonly string Name;
public readonly string Extension;
public readonly uint Offset; public readonly uint Offset;
public readonly uint Length; public readonly uint Length;
public readonly uint SampleRate; public readonly uint SampleRate;
public readonly uint Flags; public readonly uint Flags;
public readonly uint ChunkSize; public readonly uint ChunkSize;
public IdxEntry(uint hash, uint offset, uint length, uint sampleRate, uint flags, uint chuckSize)
{
Hash = hash;
Offset = offset;
Length = length;
SampleRate = sampleRate;
Flags = flags;
ChunkSize = chuckSize;
}
public IdxEntry(Stream s) public IdxEntry(Stream s)
{ {
var asciiname = s.ReadASCII(16); var name = s.ReadASCII(16);
var pos = name.IndexOf('\0');
var pos = asciiname.IndexOf('\0');
if (pos != 0) if (pos != 0)
asciiname = asciiname.Substring(0, pos); name = name.Substring(0, pos);
Name = asciiname; Filename = string.Concat(name, ".wav");
Extension = DefaultExtension;
Offset = s.ReadUInt32(); Offset = s.ReadUInt32();
Length = s.ReadUInt32(); Length = s.ReadUInt32();
SampleRate = s.ReadUInt32(); SampleRate = s.ReadUInt32();
Flags = s.ReadUInt32(); Flags = s.ReadUInt32();
ChunkSize = s.ReadUInt32(); ChunkSize = s.ReadUInt32();
Hash = HashFilename(string.Concat(Name, ".", Extension), PackageHashType.CRC32);
}
public void Write(BinaryWriter w)
{
w.Write(Name.PadRight(16, '\0'));
w.Write(Offset);
w.Write(Length);
w.Write(SampleRate);
w.Write(Flags);
w.Write(ChunkSize);
} }
public override string ToString() public override string ToString()
{ {
string filename; return "{0} - offset 0x{1:x8} - length 0x{2:x8}".F(Filename, Offset, Length);
if (names.TryGetValue(Hash, out filename))
return "{0} - offset 0x{1:x8} - length 0x{2:x8}".F(filename, Offset, Length);
else
return "0x{0:x8} - offset 0x{1:x8} - length 0x{2:x8}".F(Hash, Offset, Length);
}
public static uint HashFilename(string name, PackageHashType type)
{
return PackageEntry.HashFilename(name, type);
}
static Dictionary<uint, string> names = new Dictionary<uint, string>();
public static void AddStandardName(string s)
{
// RA1 and TD
var hash = HashFilename(s, PackageHashType.Classic);
names.Add(hash, s);
// TS
var crcHash = HashFilename(s, PackageHashType.CRC32);
names.Add(crcHash, s);
} }
} }
} }