private BinaryReader GetReader(RefFile fileNdx) { if (_readers[(int)fileNdx] != null) { return(_readers[(int)fileNdx]); } _readers[(int)fileNdx] = new BinaryReader(File.Open(_fileList[(int)fileNdx], FileMode.Open, FileAccess.Read)); return(_readers[(int)fileNdx]); }
private MemoryMappedViewAccessor GetMapReader(RefFile fileNdx) { if (_views[(int)fileNdx] == null) { if (_maps[(int)fileNdx] == null) { _maps[(int)fileNdx] = MemoryMappedFile.CreateFromFile(_fileList[(int)fileNdx], FileMode.Open, null); } _views[(int)fileNdx] = _maps[(int)fileNdx].CreateViewAccessor(); } return(_views[(int)fileNdx]); }
private long[] ReadOffsets(RefFile fileNdx, int count) { BinaryReader br = null; try { br = GetReader(fileNdx); long[] ary = new long[count]; for (int i = 0, icnt = count; i < icnt; ++i) { ary[i] = br.ReadInt64(); } return(ary); } finally { br?.Close(); _readers[(int)fileNdx] = null; } }
private long[] GetOffsets(RefFile fileNdx) { switch (fileNdx) { case RefFile.FwdOffsets: if (_fwdOffsets == null) { _fwdOffsets = ReadOffsets(fileNdx, _instances.Length + 1); } return(_fwdOffsets); case RefFile.BwdOffsets: if (_bwdOffsets == null) { _bwdOffsets = ReadOffsets(fileNdx, _instances.Length + 1); } return(_bwdOffsets); default: return(null); } }
public RefFileList(string filename) { Filename = filename; var refFilePath = Path.GetDirectoryName(Path.GetDirectoryName(filename)); var doc = XDocument.Load(filename, LoadOptions.None); var root = doc.Root; if (root?.Name != "FileList") { throw new InvalidOperationException(); } foreach (var attr in root.Attributes()) { switch (attr.Name.ToString()) { case "Redist": Redist = attr.Value; break; case "Name": Name = attr.Value; break; case "RuntimeVersion": RuntimeVersion = attr.Value; break; case "ToolsVersion": ToolsVersion = attr.Value; break; case "ShortName": ShortName = attr.Value; break; case "IncludeFramework": IncludeFramework = attr.Value; break; case "TargetFrameworkDirectory": TargetFrameworkDirectory = attr.Value; break; default: Debug.Fail("Unknown attr"); break; } } foreach (var sect in root.Elements()) { if (sect.Name == "File") { var file = new RefFile(sect, refFilePath); if (!string.IsNullOrEmpty(file.Filename)) { Files.Add(file); } } else { Debug.Fail("Unknown section"); } } var desc = CreateDescription(); if (string.IsNullOrWhiteSpace(Name)) { var d = desc; if (d.StartsWith(".NET", StringComparison.OrdinalIgnoreCase)) { d = d.Substring(0, 4) + " " + d.Substring(4); } Name = d; } TargetFilename = CreateTargetFilename(desc); }
private BinaryWriter GetWriter(RefFile fileNdx, FileMode mode) { return(new BinaryWriter(File.Open(_fileList[(int)fileNdx], mode, FileAccess.Write, FileShare.None))); }
private BinaryReader GetReader(RefFile fileNdx, FileMode mode) { return(new BinaryReader(File.Open(_fileList[(int)fileNdx], mode, FileAccess.Read))); }
/// <summary> /// This will build a SkinTone Replacement for the passed Skintone /// </summary> /// <param name="skintone">the skintone string</param> /// <param name="addtxtr">true, if you want to replace the default TXTR Files</param> /// <param name="addtxmt">true if you want to replace the default TXMT Files</param> /// <param name="sitem"></param> /// <param name="src"></param> /// <returns>the replacement package</returns> public SimPe.Packages.GeneratableFile BuildOverride(ScannerItem sitem, string skintone, string family, SimPe.Interfaces.Files.IPackageFile src, bool addtxmt, bool addtxtr, bool addref) { FileTable.FileIndex.Load(); SimPe.Packages.GeneratableFile pkg = SimPe.Packages.GeneratableFile.LoadFromStream((System.IO.BinaryReader)null); WaitingScreen.Wait(); //Save the old FileTable and the source File FileTable.FileIndex.Load(); FileTable.FileIndex.StoreCurrentState(); FileTable.FileIndex.AddIndexFromPackage(src); bool usefam = (skintone == "00000000-0000-0000-0000-000000000000"); try { //find al description Files that belong to the Skintone that should be replaced ArrayList basecpf = new ArrayList(); SimPe.Interfaces.Scenegraph.IScenegraphFileIndexItem[] items = FileTable.FileIndex.FindFile(Data.MetaData.GZPS, true); foreach (SimPe.Interfaces.Scenegraph.IScenegraphFileIndexItem item in items) { SimPe.PackedFiles.Wrapper.Cpf cpf = new Cpf(); cpf.ProcessData(item); if (cpf.GetSaveItem("skintone").StringValue != skintone) { continue; } //if (usefam) if (cpf.GetSaveItem("family").StringValue != family) { continue; } if (cpf.GetSaveItem("type").StringValue != "skin") { continue; } SimPe.Plugin.SkinChain sc = new SkinChain(cpf); basecpf.Add(sc); WaitingScreen.UpdateMessage(cpf.GetSaveItem("name").StringValue); } ArrayList compare = new ArrayList(); compare.Add("age"); //compare.Add("category"); compare.Add("fitness"); compare.Add("gender"); //compare.Add("outfit"); compare.Add("override0subset"); //compare.Add("override0resourcekeyidx"); //compare.Add("shapekeyidx"); //now select matching Files Interfaces.Files.IPackedFileDescriptor[] pfds = src.FindFiles(Data.MetaData.GZPS); #if DEBUG //we could add Debug Code here to see which cpfs were pulled :) /*SimPe.Packages.GeneratableFile f = SimPe.Packages.GeneratableFile.CreateNew(); * * foreach (SimPe.Plugin.SkinChain sc in basecpf) * { * sc.Cpf.SynchronizeUserData(); * f.Add(sc.Cpf.FileDescriptor); * * RefFile r = sc.ReferenceFile; * if (r!=null) * { * r.SynchronizeUserData(); * f.Add(r.FileDescriptor); * } * * //foreach (GenericRcol rcol in sc.TXTRs) * GenericRcol rcol = sc.TXTR; * if (rcol!=null) * { * rcol.SynchronizeUserData(); * f.Add(rcol.FileDescriptor); * } * * //foreach (GenericRcol rcol in sc.TXMTs) * rcol = sc.TXMT; * if (rcol!=null) * { * rcol.SynchronizeUserData(); * f.Add(rcol.FileDescriptor); * } * } * * f.Save(@"G:\skinbase.package"); * return f;*/ #endif foreach (Interfaces.Files.IPackedFileDescriptor pfd in pfds) { //load a description File for the new Skintone SimPe.PackedFiles.Wrapper.Cpf cpf = new Cpf(); cpf.ProcessData(pfd, src); int index = -1; int maxpoint = 0; //check if File is a match for (int i = 0; i < basecpf.Count; i++) { SimPe.Plugin.SkinChain sc = (SimPe.Plugin.SkinChain)basecpf[i]; int point = compare.Count; //scan for valid CPF Files foreach (string s in compare) { if (s == "age" || s == "category" || s == "outfit") { if ((sc.Cpf.GetSaveItem(s).UIntegerValue & cpf.GetSaveItem(s).UIntegerValue) == 0) { point--; } } else if (s == "override0subset") { string s1 = sc.Cpf.GetSaveItem(s).StringValue.Trim().ToLower(); string s2 = cpf.GetSaveItem(s).StringValue.Trim().ToLower(); if (s1 == "bottom") { s1 = "body"; } else if (s1 == "top") { s1 = "body"; } if (s2 == "bottom") { s2 = "body"; } else if (s2 == "top") { s2 = "body"; } if (s1 != s2) { point--; } } else if (sc.Cpf.GetSaveItem(s).UIntegerValue != cpf.GetSaveItem(s).UIntegerValue) { point--; } } if (point > maxpoint) { index = i; maxpoint = point; } } //yes, yes :D this is a match if (index >= 0 && maxpoint == compare.Count) { SimPe.Plugin.SkinChain sc = (SimPe.Plugin.SkinChain)basecpf[index]; SkinChain newsc = new SkinChain(cpf); if (sc.ReferenceFile != null && newsc.ReferenceFile != null && addref) { RefFile r = newsc.ReferenceFile; r.FileDescriptor = sc.ReferenceFile.FileDescriptor.Clone(); r.SynchronizeUserData(); if (pkg.FindFile(r.FileDescriptor) == null) { pkg.Add(r.FileDescriptor); } } if (sc.TXTR != null && newsc.TXTR != null && addtxtr) { SimPe.Plugin.GenericRcol txtr = newsc.TXTR; txtr.FileDescriptor = sc.TXTR.FileDescriptor.Clone(); #if DEBUG #else txtr.FileDescriptor.MarkForReCompress = true; #endif txtr.FileName = sc.TXTR.FileName; txtr.SynchronizeUserData(); if (pkg.FindFile(txtr.FileDescriptor) == null) { pkg.Add(txtr.FileDescriptor); } } if (sc.TXMT != null && newsc.TXMT != null && addtxmt) { SimPe.Plugin.GenericRcol txmt = newsc.TXMT; txmt.FileDescriptor = sc.TXMT.FileDescriptor.Clone(); #if DEBUG #else txmt.FileDescriptor.MarkForReCompress = true; #endif MaterialDefinition md = (MaterialDefinition)txmt.Blocks[0]; MaterialDefinition mdorg = (MaterialDefinition)sc.TXMT.Blocks[0]; txmt.FileName = sc.TXMT.FileName; md.FileDescription = mdorg.FileDescription; txmt.SynchronizeUserData(); if (pkg.FindFile(txmt.FileDescriptor) == null) { pkg.Add(txmt.FileDescriptor); } } } } SimPe.PackedFiles.Wrapper.Str str = new Str(); str.Add(new StrToken(0, 0, "SimPE Skin Override: " + skintone + " (from " + sitem.PackageCacheItem.Name + ")", "")); str.FileDescriptor = new SimPe.Packages.PackedFileDescriptor(); str.FileDescriptor.Type = Data.MetaData.STRING_FILE; str.FileDescriptor.Group = Data.MetaData.LOCAL_GROUP; str.FileDescriptor.LongInstance = 0; str.SynchronizeUserData(); pkg.Add(str.FileDescriptor); } finally { //restore the Previous FileTable FileTable.FileIndex.RestoreLastState(); WaitingScreen.Stop(); } return(pkg); }