Remove legacy hashing from BagFile.
This commit is contained in:
@@ -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()
|
||||||
|
|||||||
@@ -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);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user