public bool Load(string fpPSF, Func<Stream,int,byte[]> cbDeflater) { using(var fs = File.OpenRead(fpPSF)) { //not endian safe var br = new BinaryReader(fs); var sig = br.ReadStringFixedAscii(4); if (sig != "PSF\x1") return false; int reserved_size = br.ReadInt32(); int compressed_size = br.ReadInt32(); int compressed_crc32 = br.ReadInt32(); //load tags //tags run until the end of the file fs.Position = 16 + reserved_size + compressed_size; if (fs.Position + 5 > fs.Length) { //theres no space for tags, probably just no tags in the file } else { if (br.ReadStringFixedAscii(5) == "[TAG]") { var tagstring = br.ReadStringFixedAscii((int)(fs.Length - fs.Position)).Replace("\r\n", "\n"); foreach (var tag in tagstring.Split('\n', '\x0')) { if (tag.Trim() == "") continue; int eq = tag.IndexOf('='); if (eq != -1) TagsDictionary[tag.Substring(0, eq)] = tag.Substring(eq + 1); else LooseTags.Add(tag); } } } //load compressed section buffer fs.Position = 16 + reserved_size; Data = cbDeflater(fs, compressed_size); //load lib if needed if (TagsDictionary.ContainsKey("_lib")) { var fpLib = Path.Combine(Path.GetDirectoryName(fpPSF), TagsDictionary["_lib"]); if (!File.Exists(fpLib)) return false; PSF lib = new PSF(); if (!lib.Load(fpLib,cbDeflater)) return false; LibData = lib.Data; } } return true; }
public bool Load(string fpPSF, Func <Stream, int, byte[]> cbDeflater) { using (var fs = File.OpenRead(fpPSF)) { //not endian safe var br = new BinaryReader(fs); var sig = br.ReadStringFixedAscii(4); if (sig != "PSF\x1") { return(false); } int reserved_size = br.ReadInt32(); int compressed_size = br.ReadInt32(); int compressed_crc32 = br.ReadInt32(); //load tags //tags run until the end of the file fs.Position = 16 + reserved_size + compressed_size; if (fs.Position + 5 > fs.Length) { //theres no space for tags, probably just no tags in the file } else { if (br.ReadStringFixedAscii(5) == "[TAG]") { var tagstring = br.ReadStringFixedAscii((int)(fs.Length - fs.Position)).Replace("\r\n", "\n"); foreach (var tag in tagstring.Split('\n', '\x0')) { if (tag.Trim() == "") { continue; } int eq = tag.IndexOf('='); if (eq != -1) { TagsDictionary[tag.Substring(0, eq)] = tag.Substring(eq + 1); } else { LooseTags.Add(tag); } } } } //load compressed section buffer fs.Position = 16 + reserved_size; Data = cbDeflater(fs, compressed_size); //load lib if needed if (TagsDictionary.ContainsKey("_lib")) { var fpLib = Path.Combine(Path.GetDirectoryName(fpPSF), TagsDictionary["_lib"]); if (!File.Exists(fpLib)) { return(false); } PSF lib = new PSF(); if (!lib.Load(fpLib, cbDeflater)) { return(false); } LibData = lib.Data; } } return(true); }