예제 #1
0
        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();
        }
예제 #2
0
        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;
            }
        }
예제 #3
0
        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();
        }
예제 #4
0
            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);
                }
            }
예제 #5
0
        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;
        }
예제 #6
0
            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));
                        }
                    }
                }
            }
예제 #7
0
        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();
            }
        }
예제 #8
0
파일: Form1.cs 프로젝트: yakoder/sims3tools
        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);
            }
        }
예제 #9
0
        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;
            }
        }
예제 #10
0
        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);
        }
예제 #11
0
파일: Form1.cs 프로젝트: dd-dk/sims3tools
        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;
            }
        }
예제 #12
0
 public List <IResourceIndexEntry> FindAll(Predicate <IResourceKey> Match)
 {
     return(_package.FindAll(Match));
 }