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; }