void CreateNameMap() { if (pkg == null) { return; } if (nameMap != null) { return; } string oldLabel = pbLabel.Text; pbLabel.Text = "Loading name map resources..."; Application.DoEvents(); nameMap = new List <IResource>(); nameMapRIEs = new List <IResourceIndexEntry>(); IList <IResourceIndexEntry> lrie = pkg.FindAll(_key => _key.ResourceType == 0x0166038C); foreach (IResourceIndexEntry rie in lrie) { try { IResource res = s4pi.WrapperDealer.WrapperDealer.GetResource(0, pkg, rie); if (res == null) { continue; } if (!typeof(IDictionary <ulong, string>).IsAssignableFrom(res.GetType())) { continue; } nameMap.Add(res); nameMapRIEs.Add(rie); res.ResourceChanged += new EventHandler(nameMap_ResourceChanged); } catch (Exception ex) { MainForm.IssueException(ex, String.Format("Some resource names may not be displayed.\n\nError reading _KEY {0:X8}:{1:X8}:{2:X16}", rie.ResourceType, rie.ResourceGroup, rie.Instance)); } } pbLabel.Text = oldLabel; Application.DoEvents(); }
private void OnListElements(IPackage package) { try { sChanged = false; Application.UseWaitCursor = true; ContentList.BeginUpdate(); ContentList.Enabled = false; ContentList.Items.Clear(); IList <IResourceIndexEntry> list = package.FindAll(value => { return(true); }); foreach (IResourceIndexEntry entry in list) { ListItem item = ListItem.CreateHandler(entry, package); if (item == null) { continue; } ContentList.Items.Add(item); } } finally { ContentList.Enabled = true; ContentList.EndUpdate(); Application.UseWaitCursor = false; } }
private void openPackageFile(string pathToPackageFile) { imppkg = Package.OpenPackage(0, pathToPackageFile, true); lrie = imppkg.FindAll(x => { return(x.ResourceType == 0x220557DA); }); SelectSTBLfileinPackage f = new SelectSTBLfileinPackage(lrie, imppkg); f.ShowDialog(); packageElId = BigInteger.Parse(f.selectedElement.Replace("0x", ""), NumberStyles.AllowHexSpecifier); var el = lrie.Find(x => { return(x.Instance == packageElId); }); res = WrapperDealer.GetResource(0, imppkg, el, true); openedFromSTBL_File = false; ArrayList tempList = ReadAndAnalyzeStream(res.Stream); STBLToDataGridView(tempList); pathOpened = true; //MessageBox.Show(packageElId.ToString()); //imppkg.Dispose(); }
public void Search() { bool complete = false; try { updateProgress(true, "Retrieving resource index...", true, 0, true, 0); IList <IResourceIndexEntry> lrie = pkg.FindAll(match); if (stopSearch) { return; } updateProgress(true, "Starting search... 0%", true, lrie.Count, true, 0); int freq = Math.Max(1, lrie.Count / 100); int hits = 0; for (int i = 0; i < lrie.Count; i++) { if (stopSearch) { return; } if (search(lrie[i])) { Add(lrie[i]); hits++; } if (i % freq == 0) { updateProgress(true, String.Format("[Hits {0}] Searching... {1}%", hits, i * 100 / lrie.Count), false, -1, true, i); } } complete = true; } catch (ThreadInterruptedException) { } finally { updateProgress(true, "Search ended", true, 0, true, 0); searchComplete(complete); } }
public void openPackageFile(string pathToPackageFile) { if (imppkg != null) { imppkg.Dispose(); } imppkg = Package.OpenPackage(0, pathToPackageFile, true); lrie = imppkg.FindAll(x => { return(x.ResourceType == 0x220557DA); }); pathToOpenedPackageFile = pathToPackageFile; linkLabel1.Visible = true; pathOpened = true; openedFromSTBL_File = false; }
public PackagedNMap(IPackage package, bool create) { if (package == null) { throw new ArgumentNullException("package"); } this.package = package; IResource nmap; List <IResourceIndexEntry> rieList = package.FindAll(IsNameMap); if ((rieList == null || rieList.Count == 0) && create) { TGIBlock tgi = new TGIBlock(0, null, NameMapTID, 0u, 0ul); nmap = WrapperDealer.CreateNewResource(0, NameMapTIDStr); IResourceIndexEntry rie = package.AddResource(tgi, nmap.Stream, false); this.nmaps.Add(new KeyValuePair <IResourceIndexEntry, IResource>(rie, nmap)); } else { int i, count = rieList.Count; for (i = 0; i < count; i++) { nmap = null; try { nmap = WrapperDealer.GetResource(0, package, rieList[i]); } catch { } if (nmap != null) { this.nmaps.Add(new KeyValuePair <IResourceIndexEntry, IResource>(rieList[i], nmap)); } } } }
private void importPackagesCommon(string[] packageList, string title, DuplicateHandling dups, bool compress, bool useNames = false, bool rename = false, List <uint> dupsList = null, AutoSaveState autoSaveState = AutoSaveState.Ask, IList <IResourceIndexEntry> selection = null ) { bool CPuseNames = controlPanel1.UseNames; DateTime now = DateTime.UtcNow; bool autoSave = false; if (autoSaveState == AutoSaveState.Ask) { switch (CopyableMessageBox.Show("Auto-save current package after each package imported?", title, CopyableMessageBoxButtons.YesNoCancel, CopyableMessageBoxIcon.Question)) { case 0: autoSave = true; break; case 2: return; } } else { autoSave = autoSaveState == AutoSaveState.Always; } try { browserWidget1.Visible = false; controlPanel1.UseNames = false; bool skipAll = false; foreach (string filename in packageList) { if (Filename != null && Filename.Length > 0 && Path.GetFullPath(Filename).Equals(Path.GetFullPath(filename))) { CopyableMessageBox.Show("Skipping current package.", importPackagesDialog.Title); continue; } lbProgress.Text = "Importing " + Path.GetFileNameWithoutExtension(filename) + "..."; Application.DoEvents(); IPackage imppkg = null; try { imppkg = Package.OpenPackage(0, filename); } catch (InvalidDataException ex) { if (skipAll) { continue; } int btn = CopyableMessageBox.Show(String.Format("Could not open package {0}.\n{1}", Path.GetFileName(filename), ex.Message), title, CopyableMessageBoxIcon.Error, new List <string>(new string[] { "Skip this", "Skip all", "Abort" }), 0, 0); if (btn == 0) { continue; } if (btn == 1) { skipAll = true; continue; } break; } try { List <Tuple <myDataFormat, DuplicateHandling> > limp = new List <Tuple <myDataFormat, DuplicateHandling> >(); List <IResourceIndexEntry> lrie = selection == null ? imppkg.GetResourceList : imppkg.FindAll(rie => selection.Any(tgt => ((AResourceKey)tgt).Equals(rie))); progressBar1.Value = 0; progressBar1.Maximum = lrie.Count; foreach (IResourceIndexEntry rie in lrie) { try { if (rie.ResourceType == 0x0166038C)//NMAP { if (useNames) { browserWidget1.MergeNamemap(s4pi.WrapperDealer.WrapperDealer.GetResource(0, imppkg, rie) as IDictionary <ulong, string>, true, rename); } } else { IResource res = s4pi.WrapperDealer.WrapperDealer.GetResource(0, imppkg, rie, true); myDataFormat impres = new myDataFormat() { tgin = rie as AResourceIndexEntry, data = res.AsBytes, }; // dups Replace | Reject | Allow // dupsList null | list of allowable dup types DuplicateHandling dupThis = dups == DuplicateHandling.allow ? dupsList == null || dupsList.Contains(rie.ResourceType) ? DuplicateHandling.allow : DuplicateHandling.replace : dups; limp.Add(Tuple.Create(impres, dupThis)); progressBar1.Value++; if (now.AddMilliseconds(100) < DateTime.UtcNow) { Application.DoEvents(); now = DateTime.UtcNow; } } } catch (Exception ex) { string rk = ""; if (rie != null) { rk = "(RK: " + rie + ")\n"; } else { rk = "(RK is null)\n"; } CopyableMessageBox.IssueException(ex, "Could not import all resources - aborting.\n" + rk, title); throw new IgnoredException(ex); } } progressBar1.Value = 0; IEnumerable <IResourceIndexEntry> rieList = limp .Select(x => NewResource((AResourceKey)x.Item1.tgin, new MemoryStream(x.Item1.data), x.Item2, compress)) .Where(x => x != null); browserWidget1.AddRange(rieList); } catch (IgnoredException) { break; }//just the thrown exception, stop looping catch (Exception ex) { CopyableMessageBox.IssueException(ex, "Could not import all resources - aborting.\n", title); break; } finally { imppkg.Dispose(); }//Package.ClosePackage(0, imppkg); } if (autoSave) { if (!fileSave()) { break; } } } } finally { lbProgress.Text = ""; progressBar1.Value = 0; progressBar1.Maximum = 0; controlPanel1.UseNames = CPuseNames; browserWidget1.Visible = true; ForceFocus.Focus(Application.OpenForms[0]); Application.DoEvents(); } }
IEnumerable <Row> Comparer(IPackage pkgA, IPackage pkgB) { List <IResourceIndexEntry> leftRKs = pkgA.FindAll(x => true), rightRKs = pkgB.FindAll(x => true); int left = 0; int right = 0; leftRKs.Sort(); rightRKs.Sort(); while (true) { Row row = new Row(); if (left < leftRKs.Count) { if (right < rightRKs.Count) { // both exist switch (leftRKs[left].CompareTo(rightRKs[right])) { case -1: // left RK < right RK row.leftRK = leftRKs[left]; row.result = "<"; left++; break; case 0: // same RK row.leftRK = leftRKs[left]; row.rightRK = rightRKs[right]; row.result = Compare(pkgA, pkgB, leftRKs[left]); //seeing as they're the same left++; right++; break; case 1: // left RK > right RK row.rightRK = rightRKs[right]; row.result = ">"; right++; break; } } else { // left but no right row.leftRK = leftRKs[left]; row.result = "<"; left++; } } else { if (right < rightRKs.Count) { // right but no left row.rightRK = rightRKs[right]; row.result = ">"; right++; } else { // we're done yield break; } } yield return(row); } }
private void OnListElements(IPackage package) { try { sChanged = false; Application.UseWaitCursor = true; ContentList.BeginUpdate(); ContentList.Enabled = false; ContentList.Items.Clear(); IList<IResourceIndexEntry> list = package.FindAll(value => { return true; }); foreach (IResourceIndexEntry entry in list) { ListItem item = ListItem.CreateHandler(entry, package); if (item == null) continue; ContentList.Items.Add(item); } } finally { ContentList.Enabled = true; ContentList.EndUpdate(); Application.UseWaitCursor = false; } }
private void CompareFiles_Click(object sender, EventArgs e) { if (string.IsNullOrEmpty(LeftText.Text)) { System.Windows.Forms.MessageBox.Show("The Left File has not been selected.", "Compare", MessageBoxButtons.OK); return; } else if (string.IsNullOrEmpty(RightText.Text)) { System.Windows.Forms.MessageBox.Show("The Right File has not been selected.", "Compare", MessageBoxButtons.OK); return; } else if (string.IsNullOrEmpty(ResultsText.Text)) { System.Windows.Forms.MessageBox.Show("The Results File has not been selected.", "Compare", MessageBoxButtons.OK); return; } IPackage leftPackage = Package.OpenPackage(0, LeftText.Text); if (leftPackage == null) { System.Windows.Forms.MessageBox.Show("The Left File could not be opened.", "Compare", MessageBoxButtons.OK); return; } IPackage rightPackage = Package.OpenPackage(0, RightText.Text); if (rightPackage == null) { System.Windows.Forms.MessageBox.Show("The Right File could not be opened.", "Compare", MessageBoxButtons.OK); Package.ClosePackage(0, leftPackage); return; } IPackage resultsPackage = Package.NewPackage(0); if (resultsPackage == null) { System.Windows.Forms.MessageBox.Show("The Right File could not be opened.", "Compare", MessageBoxButtons.OK); Package.ClosePackage(0, leftPackage); Package.ClosePackage(0, rightPackage); return; } try { UseWaitCursor = true; NameMapResource.NameMapResource keyResource = null; IResourceIndexEntry leftKey = leftPackage.Find(key => key.ResourceType == (uint)ResourceType._KEY); if (leftKey != null) { NameMapResource.NameMapResource leftResource = ResourceHandlers.CreateResource(leftKey, leftPackage) as NameMapResource.NameMapResource; IResourceIndexEntry keyEntry = resultsPackage.AddResource(new AResource.TGIBlock(0, null, leftKey.ResourceType, leftKey.ResourceGroup, leftKey.Instance), leftResource.Stream, false); if (keyEntry != null) { keyResource = ResourceHandlers.CreateResource(keyEntry, resultsPackage) as NameMapResource.NameMapResource; } } IResourceIndexEntry rightKey = rightPackage.Find(key => key.ResourceType == (uint)ResourceType._KEY); if (rightKey != null) { NameMapResource.NameMapResource rightResource = ResourceHandlers.CreateResource(rightKey, rightPackage) as NameMapResource.NameMapResource; if (keyResource == null) { IResourceIndexEntry keyEntry = resultsPackage.AddResource(new AResource.TGIBlock(0, null, rightKey.ResourceType, rightKey.ResourceGroup, rightKey.Instance), rightResource.Stream, false); if (keyEntry != null) { keyResource = ResourceHandlers.CreateResource(keyEntry, resultsPackage) as NameMapResource.NameMapResource; } } else { foreach (KeyValuePair <ulong, string> element in rightResource) { if (keyResource.ContainsKey(element.Key)) { continue; } keyResource.Add(element.Key, element.Value); } } } IList <IResourceIndexEntry> leftList = leftPackage.FindAll(value => { return(true); }); foreach (IResourceIndexEntry left in leftList) { ResourceType type = (ResourceType)left.ResourceType; bool test = false; switch (type) { case ResourceType._XML: case ResourceType.ITUN: test = true; break; } if (!test) { continue; } IResourceIndexEntry right = rightPackage.Find(value => { return((value.Instance == left.Instance) && (value.ResourceGroup == left.ResourceGroup) && (value.ResourceType == left.ResourceType)); }); if (right == null) { if (CheckCopyMissing.Checked) { TextResource.TextResource leftResource = ResourceHandlers.CreateResource(left, leftPackage) as TextResource.TextResource; resultsPackage.AddResource(new AResource.TGIBlock(0, null, left.ResourceType, left.ResourceGroup, left.Instance), leftResource.Stream, false); } } else { TextResource.TextResource leftResource = ResourceHandlers.CreateResource(left, leftPackage) as TextResource.TextResource; StreamReader leftReader = leftResource.TextFileReader as StreamReader; leftReader.BaseStream.Position = 0; string leftText = leftReader.ReadToEnd(); TextResource.TextResource rightResource = ResourceHandlers.CreateResource(right, rightPackage) as TextResource.TextResource; StreamReader rightReader = rightResource.TextFileReader as StreamReader; rightReader.BaseStream.Position = 0; string rightText = rightReader.ReadToEnd(); if (!leftText.Equals(rightText)) { resultsPackage.AddResource(new AResource.TGIBlock(0, null, left.ResourceType, left.ResourceGroup, left.Instance), leftResource.Stream, false); } } } IList <IResourceIndexEntry> rightList = rightPackage.FindAll(value => { return(true); }); foreach (IResourceIndexEntry right in rightList) { ResourceType type = (ResourceType)right.ResourceType; bool test = false; switch (type) { case ResourceType._XML: case ResourceType.ITUN: test = true; break; } if (!test) { continue; } IResourceIndexEntry left = rightPackage.Find(value => { return((value.Instance == right.Instance) && (value.ResourceGroup == right.ResourceGroup) && (value.ResourceType == right.ResourceType)); }); if (left == null) { if (CheckCopyMissing.Checked) { TextResource.TextResource rightResource = ResourceHandlers.CreateResource(right, rightPackage) as TextResource.TextResource; resultsPackage.AddResource(new AResource.TGIBlock(0, null, right.ResourceType, right.ResourceGroup, right.Instance), rightResource.Stream, false); } } } resultsPackage.SaveAs(ResultsText.Text); } finally { Package.ClosePackage(0, leftPackage); Package.ClosePackage(0, rightPackage); Package.ClosePackage(0, resultsPackage); UseWaitCursor = false; } System.Windows.Forms.MessageBox.Show("Complete.", "Compare", MessageBoxButtons.OK); }
IEnumerable<Row> Comparer(IPackage pkgA, IPackage pkgB) { List<IResourceIndexEntry> leftRKs = pkgA.FindAll(x => true), rightRKs = pkgB.FindAll(x => true); int left = 0; int right = 0; leftRKs.Sort(); rightRKs.Sort(); while (true) { Row row = new Row(); if (left < leftRKs.Count) { if (right < rightRKs.Count) { // both exist switch (leftRKs[left].CompareTo(rightRKs[right])) { case -1: // left RK < right RK row.leftRK = leftRKs[left]; row.result = "<"; left++; break; case 0: // same RK row.leftRK = leftRKs[left]; row.rightRK = rightRKs[right]; row.result = Compare(pkgA, pkgB, leftRKs[left]);//seeing as they're the same left++; right++; break; case 1: // left RK > right RK row.rightRK = rightRKs[right]; row.result = ">"; right++; break; } } else { // left but no right row.leftRK = leftRKs[left]; row.result = "<"; left++; } } else { if (right < rightRKs.Count) { // right but no left row.rightRK = rightRKs[right]; row.result = ">"; right++; } else { // we're done yield break; } } yield return row; } }
public List <IResourceIndexEntry> FindAll(Predicate <IResourceKey> Match) { return(_package.FindAll(Match)); }