private string WritePackagedFileXml(Sims3PackFile.PackagedFile packagedFile, string indent)
        {
            if (packagedFile.isDisabled)
            {
                return("");
            }

            StringBuilder sb = new StringBuilder();

            sb.AppendLine(indent + "<PackagedFile>");
            if (!String.IsNullOrEmpty(packagedFile.Name))
            {
                sb.AppendLine(indent + "  <Name>" + packagedFile.Name + "</Name>");
            }
            if (packagedFile.Length > -1)
            {
                sb.AppendLine(indent + "  <Length>" + packagedFile.Length.ToString() + "</Length>");
            }
            if (packagedFile.Offset > -1)
            {
                sb.AppendLine(indent + "  <Offset>" + packagedFile.Offset.ToString() + "</Offset>");
            }
            if (!String.IsNullOrEmpty(packagedFile.Crc))
            {
                sb.AppendLine(indent + "  <Crc>" + packagedFile.Crc + "</Crc>");
            }
            if (!String.IsNullOrEmpty(packagedFile.Guid))
            {
                sb.AppendLine(indent + "  <Guid>" + packagedFile.Guid + "</Guid>");
            }
            if (!String.IsNullOrEmpty(packagedFile.ContentType))
            {
                sb.AppendLine(indent + "  <ContentType>" + packagedFile.ContentType + "</ContentType>");
            }
            if (!String.IsNullOrEmpty(packagedFile.EPFlags))
            {
                sb.AppendLine(indent + "  <EPFlags>" + packagedFile.EPFlags + "</EPFlags>");
            }
            if (!String.IsNullOrEmpty(packagedFile.Thumbnail))
            {
                sb.AppendLine(indent + "  <Thumbnail>" + packagedFile.Thumbnail + "</Thumbnail>");
            }
            else
            {
                sb.AppendLine(indent + "  <Thumbnail />");
            }
            if (!String.IsNullOrEmpty(packagedFile.MetaTags.name))
            {
                sb.Append(WriteMetaTagsXml(packagedFile.MetaTags, indent + "  "));
            }
            else
            {
                sb.AppendLine(indent + "  <metatags />");
            }
            sb.AppendLine(indent + "</PackagedFile>");

            return(sb.ToString());
        }
        /*
         * public Stream getFile(Sims3PackFileInfo file)
         * {
         *      if (String.IsNullOrEmpty(this.filename)) return new MemoryStream();
         *
         *      FileStream s3pfile = new FileStream(this.filename, FileMode.Open, FileAccess.Read, FileShare.Read);
         *      BinaryReader readFile = new BinaryReader(s3pfile);
         *
         *      uint version = readFile.ReadUInt32();
         *      string s3pack = Encoding.ASCII.GetString(readFile.ReadBytes(7));
         *      if (s3pack != "TS3Pack")
         *      {
         *              errorMessage = "Not a Sims3Pack file";
         *              readFile.Close();
         *              s3pfile.Close();
         *              return new MemoryStream();
         *      }
         *
         *      uint unknown = readFile.ReadUInt16();
         *
         *      int xmlLength = readFile.ReadInt32();
         *      s3pfile.Seek(xmlLength + file.offset, SeekOrigin.Current);
         *
         *      MemoryStream retStream = new MemoryStream(readFile.ReadBytes(file.length));
         *
         *      readFile.Close();
         *      s3pfile.Close();
         *
         *      return retStream;
         * }
         */

        public Sims3PackFile Load(string filename)
        {
            FileStream   s3pfile  = new FileStream(filename, FileMode.Open, FileAccess.Read, FileShare.Read);
            BinaryReader readFile = new BinaryReader(s3pfile);

            FileInfo f = new FileInfo(filename);

            this.cleanName = f.Name.Replace(f.Extension, "");

            uint   version = readFile.ReadUInt32();
            string s3pack  = Encoding.ASCII.GetString(readFile.ReadBytes(7));

            if (s3pack != "TS3Pack")
            {
                errorMessage = "Not a Sims3Pack file";
                readFile.Close();
                s3pfile.Close();
                return(new Sims3PackFile());
            }
            this.filename = filename;

            Sims3PackFile s3p = new Sims3PackFile();

            s3p.UnknownInt = readFile.ReadUInt16();

            int xmlLength = readFile.ReadInt32();

            byte[] xmlBytes = readFile.ReadBytes(xmlLength);

            s3p.rawXml = System.Text.UTF8Encoding.UTF8.GetString(xmlBytes);

            MemoryStream  mem = new MemoryStream(xmlBytes);
            XmlTextReader xtr = new XmlTextReader(mem);

            int    level   = 0;
            string curName = "";
            string parent  = "";
            string temp    = "";

            while (xtr.Read())
            {
                if (xtr.NodeType == XmlNodeType.Element)
                {
                    curName = xtr.Name;
                    switch (curName)
                    {
                    case "Sims3Package":
                        if (xtr.HasAttributes)
                        {
                            xtr.MoveToAttribute("Type");
                            s3p.Type = xtr.Value;
                            xtr.MoveToAttribute("SubType");
                            s3p.SubType = xtr.Value;
                        }
                        break;

                    case "Dependencies":
                        if (!xtr.IsEmptyElement)
                        {
                            level++;
                        }
                        break;

                    case "LocalizedNames":
                    case "LocalizedDescriptions":
                        if (!xtr.IsEmptyElement)
                        {
                            parent = curName;
                            level++;
                        }
                        break;

                    case "LocalizedName":
                    case "LocalizedDescription":
                        xtr.MoveToAttribute("Language");
                        temp = xtr.Value;
                        break;

                    case "PackagedFile":
                        Sims3PackFile.PackagedFile packagedFile = ReadPackagedFileXml(xtr, readFile, xmlLength);
                        s3p.PackagedFiles.Add(packagedFile);
                        break;
                    }
                }
                if (xtr.NodeType == XmlNodeType.CDATA)
                {
                    switch (curName)
                    {
                    case "LocalizedName":
                        if (level == 1 && parent == "LocalizedDescriptions")
                        {
                            Sims3PackFile.LocalisedString localizedName = new Sims3PackFile.LocalisedString();
                            localizedName.Language = temp;
                            localizedName.CDATA    = xtr.Value.ToString();
                            s3p.LocalizedDescriptions.Add(localizedName);
                        }
                        if (level == 1 && parent == "LocalizedNames")
                        {
                            Sims3PackFile.LocalisedString localizedName = new Sims3PackFile.LocalisedString();
                            localizedName.Language = temp;
                            localizedName.CDATA    = xtr.Value;
                            s3p.LocalizedNames.Add(localizedName);
                        }
                        break;

                    case "LocalizedDescription":
                        if (level == 1)
                        {
                            Sims3PackFile.LocalisedString localizedDesc = new Sims3PackFile.LocalisedString();
                            localizedDesc.Language = temp;
                            localizedDesc.CDATA    = xtr.Value;
                            localizedDesc.useDesc  = true;
                            s3p.LocalizedDescriptions.Add(localizedDesc);
                        }
                        break;
                    }
                }
                if (xtr.NodeType == XmlNodeType.Text)
                {
                    switch (curName.ToLower())
                    {
                    case "archiveversion":
                        s3p.ArchiveVersion = xtr.Value;
                        break;

                    case "codeversion":
                        s3p.CodeVersion = xtr.Value;
                        break;

                    case "gameversion":
                        s3p.GameVersion = xtr.Value;
                        break;

                    case "assetversion":
                        if (!String.IsNullOrEmpty(xtr.Value))
                        {
                            s3p.AssetVersion = Convert.ToInt32(xtr.Value);
                        }
                        break;

                    case "minreqversion":
                        s3p.MinReqVersion = xtr.Value;
                        break;

                    case "displayname":
                        s3p.DisplayName = xtr.Value;
                        break;

                    case "description":
                        if (level == 0)
                        {
                            s3p.Description = xtr.Value;
                        }
                        break;

                    case "packageid":
                        s3p.PackageId = xtr.Value;
                        break;

                    case "date":
                        s3p.Date = xtr.Value;
                        break;

                    case "dependency":
                        if (level == 1)
                        {
                            string dependency = xtr.Value;
                            s3p.Dependencies.Add(dependency);
                        }
                        break;
                    }
                }
                if (xtr.NodeType == XmlNodeType.EndElement)
                {
                    switch (xtr.Name.ToLower())
                    {
                    case "dependencies":
                    case "localizednames":
                    case "localizeddescriptions":
                        level--;
                        break;
                    }
                }
            }

            s3pfile.Close();
            return(s3p);
        }
        private Sims3PackFile.PackagedFile ReadPackagedFileXml(XmlTextReader xtr, BinaryReader reader, int xmlLength)
        {
            Sims3PackFile.PackagedFile packagedFile = new Sims3PackFile.PackagedFile();
            string curName = "";

            while (xtr.Read())
            {
                if (xtr.NodeType == XmlNodeType.Element)
                {
                    curName = xtr.Name;
                    switch (curName)
                    {
                    case "metatags":
                        if (!xtr.IsEmptyElement)
                        {
                            packagedFile.MetaTags = ReadMetaTagsXml(xtr);
                        }
                        break;
                    }
                }
                if (xtr.NodeType == XmlNodeType.Text)
                {
                    switch (curName.ToLower())
                    {
                    case "name":
                        packagedFile.Name = xtr.Value;
                        break;

                    case "length":
                        packagedFile.Length = Convert.ToInt32(xtr.Value);
                        break;

                    case "offset":
                        packagedFile.Offset = Convert.ToInt32(xtr.Value);
                        break;

                    case "crc":
                        packagedFile.Crc = xtr.Value;
                        break;

                    case "guid":
                        packagedFile.Guid = xtr.Value;
                        break;

                    case "thumbnail":
                        packagedFile.Thumbnail = xtr.Value;
                        break;

                    case "contenttype":
                        packagedFile.ContentType = xtr.Value;
                        break;

                    case "epflags":
                        packagedFile.EPFlags = xtr.Value;
                        break;
                    }
                }
                if (xtr.NodeType == XmlNodeType.EndElement && xtr.Name.ToLower() == "packagedfile")
                {
                    reader.BaseStream.Seek(7 + 4 + 2 + 4 + xmlLength + packagedFile.Offset, SeekOrigin.Begin);
                    packagedFile.DBPF = new MemoryStream(reader.ReadBytes(packagedFile.Length));
                    break;
                }
            }

            return(packagedFile);
        }
        private Sims3PackFile.PackagedFile ReadPackagedFileXml(XmlTextReader xtr, BinaryReader reader, int xmlLength)
        {
            Sims3PackFile.PackagedFile packagedFile = new Sims3PackFile.PackagedFile();
            string curName = "";

            while (xtr.Read())
            {
                if (xtr.NodeType == XmlNodeType.Element)
                {
                    curName = xtr.Name;
                    switch (curName)
                    {
                        case "metatags":
                            if (!xtr.IsEmptyElement)
                            {
                                packagedFile.MetaTags = ReadMetaTagsXml(xtr);
                            }
                            break;
                    }
                }
                if (xtr.NodeType == XmlNodeType.Text)
                {
                    switch (curName.ToLower())
                    {
                        case "name":
                            packagedFile.Name = xtr.Value;
                            break;
                        case "length":
                            packagedFile.Length = Convert.ToInt32(xtr.Value);
                            break;
                        case "offset":
                            packagedFile.Offset = Convert.ToInt32(xtr.Value);
                            break;
                        case "crc":
                            packagedFile.Crc = xtr.Value;
                            break;
                        case "guid":
                            packagedFile.Guid = xtr.Value;
                            break;
                        case "thumbnail":
                            packagedFile.Thumbnail = xtr.Value;
                            break;
                        case "contenttype":
                            packagedFile.ContentType = xtr.Value;
                            break;
                        case "epflags":
                            packagedFile.EPFlags = xtr.Value;
                            break;
                    }
                }
                if (xtr.NodeType == XmlNodeType.EndElement && xtr.Name.ToLower() == "packagedfile")
                {
                    reader.BaseStream.Seek(7 + 4 + 2 + 4 + xmlLength + packagedFile.Offset, SeekOrigin.Begin);
                    packagedFile.DBPF = new MemoryStream(reader.ReadBytes(packagedFile.Length));
                    break;
                }
            }

            return packagedFile;
        }