public void Add(DBPFPackage Package, int Priority = 0) { Index.AddResources(Package.Resources, Priority); if (Package.FileName != null) PackageFilenames.Add(Package.FileName); Packages.Add(Package); }
public DBPFPackage Add(string FileName, int Prioirty = 0) { if (File.Exists(FileName)) { try { DBPFPackage Package = new DBPFPackage(FileName); Add(Package, Prioirty); return Package; } catch (InvalidDataException) { return null; } } else return null; }
private void Import() { BinaryReader Reader = new BinaryReader(DataStore); // Start by reading the magic int MagicLength = Reader.ReadInt32(); string Magic = new string(Reader.ReadChars(MagicLength)); if (Magic != "TS3Pack") throw new InvalidDataException(string.Format("Invalid Magic: Expected [TS3Pack], Found [{0}]", Magic)); UInt16 Version = Reader.ReadUInt16(); Int32 XMLLength = Reader.ReadInt32(); Manifest = new XmlDocument(); string Temp = Encoding.UTF8.GetString(Reader.ReadBytes(XMLLength)); // string Temp = new string(Reader.ReadChars(XMLLength)); MemoryStream test = new MemoryStream(Encoding.UTF8.GetBytes(Temp),false); //Manifest.LoadXml(Temp); Manifest.Load(test); test.Close(); long BaseOffset = DataStore.Position; // Now parse out the XML XmlNode Decl = Manifest.FirstChild; XmlElement Sims3Package = (XmlElement) Decl.NextSibling; dynamic Base = new ExpandoObject(); Base.Type = Sims3Package.GetAttribute("Type"); Base.SubType = Sims3Package.GetAttribute("SubType"); Type = Base.Type; SubType = Base.SubType; Base.Localized = new Dictionary<string, dynamic>(); Base.Packages = new List<dynamic>(); XmlElement Node = Sims3Package.FirstChild as XmlElement; while (Node != null) { if (Node.Name == "LocalizedNames") { XmlElement SubNode = Node.FirstChild as XmlElement; while (SubNode != null) { string Locale = SubNode.GetAttribute("Language"); if (!Base.Localized.ContainsKey(Locale)) { Base.Localized.Add(Locale, new ExpandoObject()); } Base.Localized[Locale].Name = SubNode.InnerText; SubNode = SubNode.NextSibling as XmlElement; } } else if (Node.Name == "LocalizedDescriptions") { XmlElement SubNode = Node.FirstChild as XmlElement; while (SubNode != null) { string Locale = SubNode.GetAttribute("Language"); if (!Base.Localized.ContainsKey(Locale)) { Base.Localized.Add(Locale, new ExpandoObject()); } Base.Localized[Locale].Description = SubNode.InnerText; SubNode = SubNode.NextSibling as XmlElement; } } else if (Node.Name == "PackagedFile") { XmlElement SubNode = Node.FirstChild as XmlElement; dynamic package = new ExpandoObject(); while (SubNode != null) { if (SubNode.Name == "Length") { package.Length = long.Parse(SubNode.InnerText); } else if (SubNode.Name == "Offset") { package.Offset = long.Parse(SubNode.InnerText); } else if (SubNode.Name == "Name") { package.Name = SubNode.InnerText; if ((package.Name as string).EndsWith(".package")) { package.IsPackage = true; } else { package.IsPackage = false; } } else { (package as IDictionary<string, Object>).Add(SubNode.Name, SubNode.InnerText); } SubNode = SubNode.NextSibling as XmlElement; } Base.Packages.Add(package); } else { // Add the node to the Base object dynamically. !! HOW COOL IS THAT !! :) (Base as IDictionary<string, Object>).Add(Node.Name, Node.InnerText); } Node = Node.NextSibling as XmlElement; } // Now we need to generate the actual DBPFPackage entries for these files IsCorrupt = false; DBPFPackage Pack = null; foreach (var entry in Base.Packages) { if (entry.IsPackage) { try { Pack = new DBPFPackage(); Pack.Import(new SubStream(DataStore, BaseOffset + entry.Offset, entry.Length), false); Pack.GUID = Path.GetFileNameWithoutExtension(entry.Name); if (BaseOffset + entry.Offset + entry.Length > DataStore.Length) { IsCorrupt = true; } } catch (InvalidDataException) { Pack = null; IsEncrypted = true; // what's up here? } if (Pack != null) { Packages.Add(Pack); } } else { Thumbnails.Add( new SubStream(DataStore, BaseOffset + entry.Offset, entry.Length)); } } }