public override ArcFile TryOpen(ArcView file) { int type = file.View.ReadUInt16 (4); int count = file.View.ReadInt32 (6); if (!IsSaneCount (count)) return null; using (var enc = file.CreateStream()) using (var dec = new EncryptedStream (enc)) using (var index = new BinaryReader (dec)) { dec.Position = 0x4A; var offsets = new uint[count]; for (int i = 0; i < count; ++i) { offsets[i] = index.ReadUInt32(); } var name_buffer = new byte[0x100]; var dir = new List<Entry> (count); for (int i = 0; i < count; ++i) { index.BaseStream.Position = offsets[i]; uint signature = index.ReadUInt32(); if (signature != 0x41544144) // 'DATA' continue; int section_count = index.ReadInt32(); index.ReadInt16(); var entry = new Entry { Offset = offsets[i] }; for (int s = 0; s < section_count; ++s) { signature = index.ReadUInt32(); if (0x44474D49 == signature) // 'IMGD' { entry.Offset = index.BaseStream.Position - 4; uint imgd_size = index.ReadUInt32(); entry.Size = imgd_size + 0x10; index.BaseStream.Seek (imgd_size + 2, SeekOrigin.Current); } else if (0x454E4E46 == signature) // 'FNNE' { int name_length = index.ReadInt32()-2; index.ReadInt16(); if (name_length > name_buffer.Length) name_buffer = new byte[name_length]; index.Read (name_buffer, 0, name_length); entry.Name = Encodings.cp932.GetString (name_buffer, 0, name_length); entry.Type = FormatCatalog.Instance.GetTypeFromName (entry.Name); index.ReadInt16(); } else { var section_size = index.ReadUInt32(); // section not supported, skip index.BaseStream.Seek (section_size+2, SeekOrigin.Current); if (0x415A4F4D != signature) // 'MOZA' Trace.WriteLine (string.Format ("Unknown section 0x{0:X8}", signature), "[WAG/IAF]"); } } if (entry.Size > 0 && !string.IsNullOrEmpty (entry.Name)) dir.Add (entry); } if (0 == dir.Count) return null; return new ArcFile (file, this, dir); } }
public override ArcFile TryOpen(ArcView file) { int type = file.View.ReadUInt16(4); int count = file.View.ReadInt32(6); if (!IsSaneCount(count)) { return(null); } using (var enc = file.CreateStream()) using (var dec = new EncryptedStream(enc)) using (var index = new BinaryReader(dec)) { dec.Position = 0x4A; var offsets = new uint[count]; for (int i = 0; i < count; ++i) { offsets[i] = index.ReadUInt32(); } var name_buffer = new byte[0x100]; var dir = new List <Entry> (count); for (int i = 0; i < count; ++i) { index.BaseStream.Position = offsets[i]; uint signature = index.ReadUInt32(); if (signature != 0x41544144) // 'DATA' { continue; } int section_count = index.ReadInt32(); index.ReadInt16(); var entry = new Entry { Offset = offsets[i] }; for (int s = 0; s < section_count; ++s) { signature = index.ReadUInt32(); if (0x44474D49 == signature) // 'IMGD' { entry.Offset = index.BaseStream.Position - 4; uint imgd_size = index.ReadUInt32(); entry.Size = imgd_size + 0x10; index.BaseStream.Seek(imgd_size + 2, SeekOrigin.Current); } else if (0x454E4E46 == signature) // 'FNNE' { int name_length = index.ReadInt32() - 2; index.ReadInt16(); if (name_length > name_buffer.Length) { name_buffer = new byte[name_length]; } index.Read(name_buffer, 0, name_length); entry.Name = Encodings.cp932.GetString(name_buffer, 0, name_length); entry.Type = FormatCatalog.Instance.GetTypeFromName(entry.Name); index.ReadInt16(); } else { var section_size = index.ReadUInt32(); // section not supported, skip index.BaseStream.Seek(section_size + 2, SeekOrigin.Current); if (0x415A4F4D != signature) // 'MOZA' { Trace.WriteLine(string.Format("Unknown section 0x{0:X8}", signature), "[WAG/IAF]"); } } } if (entry.Size > 0 && !string.IsNullOrEmpty(entry.Name)) { dir.Add(entry); } } if (0 == dir.Count) { return(null); } return(new ArcFile(file, this, dir)); } }