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;

        }
Esempio n. 3
0
        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));
                }
            }
        }