예제 #1
0
        public static void AddFiles(IPackage package, List <string> sourceFilePaths)
        {
            List <TGIN> addedResourceKeys = new List <TGIN>();

            for (int sourceFilePathIndex = 0; sourceFilePathIndex < sourceFilePaths.Count; sourceFilePathIndex++)
            {
                string sourceInfoFilePath = sourceFilePaths[sourceFilePathIndex] + "." + SourceInfoFileExtension;

                TGIN targetResourceKeyTGIN = Path.GetFileName(sourceFilePaths[sourceFilePathIndex]);

                if (File.Exists(sourceInfoFilePath))
                {
                    try {
                        SourceInfo sourceInfo = (SourceInfo)Tools.ReadXML <SourceInfo>(sourceInfoFilePath);
                        targetResourceKeyTGIN = sourceInfo.ToTGIN();
                    } catch (Exception e) {
                        Console.Error.Write("Failed to read source info file.\n" + sourceInfoFilePath + "\n" + e.ToString());
                    }
                }

                AResourceKey targetResourceKey = targetResourceKeyTGIN;

                MemoryStream sourceStream       = new MemoryStream();
                BinaryWriter sourceStreamWriter = new BinaryWriter(sourceStream);

                using (BinaryReader sourceFileReader = new BinaryReader(new FileStream(sourceFilePaths[sourceFilePathIndex], FileMode.Open, FileAccess.Read))) {
                    sourceStreamWriter.Write(sourceFileReader.ReadBytes((int)sourceFileReader.BaseStream.Length));
                    sourceStreamWriter.Flush();
                }

                IResourceIndexEntry targetPreviousEntry = package.Find(targetResourceKey.Equals);

                while (targetPreviousEntry != null)
                {
                    package.DeleteResource(targetPreviousEntry);
                    targetPreviousEntry = package.Find(targetResourceKey.Equals);
                }

                IResourceIndexEntry targetEntry = package.AddResource(targetResourceKey, sourceStream, false);

                if (targetEntry == null)
                {
                    continue;
                }

                targetEntry.Compressed = 23106;
                addedResourceKeys.Add(targetResourceKeyTGIN);
            }

            GenerateNameMap(package, addedResourceKeys, null);
        }
예제 #2
0
        public IPackage CreatePackage()
        {
            IPackage  result = s3pi.Package.Package.NewPackage(0);
            GraphNode node;
            int       i, count = this.nodeLookupTable.Count;

            // Commit changes to resource data
            Diagnostics.Log("Committing Resource Data Changes...");
            for (i = 0; i < count; i++)
            {
                node = this.nodeLookupTable[i];
                if (!node.Core.CommitChanges())
                {
                    Diagnostics.Log("CommitChanges Failed for "
                                    + PrintRKTag(node.Key, node.ExtensionTag));
                }
            }

            // Write resource data and names to package
            Diagnostics.Log("Writing Resource Data To Package...");
            NameMap.PackagedNMap nmap = new NameMap.PackagedNMap(result, true);
            for (i = 0; i < count; i++)
            {
                node = this.nodeLookupTable[i];
                if ((node.NodeActions & ResourceDataActions.Write) == ResourceDataActions.None)
                {
                    continue;
                }
                // TODO: Ensure every resource is forced to update its stream
                result.AddResource(node.Key, node.Core.Resource.Stream, false);
                if (!nmap.SetName(node.Key.Instance, node.Name, false))
                {
                    Diagnostics.Log("Failed to set NameMap Entry for "
                                    + PrintRKTag(node.Key, node.ExtensionTag)
                                    + ": \"" + node.Name + "\"");
                }
            }
            Diagnostics.Log("Writing NameMap To Package...");
            nmap.CommitChanges();

            Diagnostics.Log("COMPLETE! Package is now ready to be saved.");

            return(result);
        }
예제 #3
0
        public Resource NewResource(uint resourceType, uint resourceGroup, ulong instance, string name = null)
        {
            IResource res = WrapperDealer.CreateNewResource(0, "0x" + resourceType.ToString("X8"));

            if (res == null)
            {
                return(default(Resource));
            }

            IResourceIndexEntry rie = _package.AddResource(new ResourceKey {
                ResourceType = resourceType, ResourceGroup = resourceGroup, Instance = instance
            }, res.Stream, true);

            if (name != null)
            {
                ResourceName(rie.Instance, name);
            }

            return(GetResource(rie));
        }
예제 #4
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));
                        }
                    }
                }
            }
예제 #5
0
파일: ListItem.cs 프로젝트: yakoder/NRaas
        public bool AddNew(ulong instance, IPackage package, bool autoSet)
        {
            mPackage = package;

            string filename = GetFilename(autoSet, true);

            if (string.IsNullOrEmpty(filename))
            {
                return(false);
            }

            string name = CreateInstance(filename, ref instance);

            if (instance == 0)
            {
                return(false);
            }

            Set(mPackage.AddResource(new AResource.TGIBlock(0, null, (uint)Type, 0, instance), null, false), mPackage);
            if (mEntry == null)
            {
                return(false);
            }

            if (File.Exists(filename))
            {
                Filename = filename;
            }
            else
            {
                mPackage.ReplaceResource(mEntry, ResourceHandlers.CreateResource(mEntry, mPackage));
            }

            Name = name;

            return(true);
        }
예제 #6
0
        private void setEffectNameTSMI_Click(object sender, EventArgs e)
        {
            VisualEffectHandleContainer container = this.outputEffectLST.SelectedItem as VisualEffectHandleContainer;

            if (container != null)
            {
                container.SetEffectName(this.PromptForEffectName(container.Handle.EffectName));
                int index = this.outputEffectLST.SelectedIndex;
                this.outputEffectLST.Items.RemoveAt(index);
                this.outputEffectLST.Items.Insert(index, container);/**/
                //this.outputEffectLST.Invalidate();
            }
        }

        private void LocateMetaReferences(VisualEffectName handle, EffectResource resource,
                                          List <VisualEffectHandleContainer> references)
        {
            MetaparticleEffect[] metaEffects = EffectHelper.FindEffects <MetaparticleEffect>(handle, resource);
            if (metaEffects != null && metaEffects.Length > 0)
            {
                int i, j;
                VisualEffectName dep;
                string           effectName;
                bool             flag = false;
                for (i = 0; i < metaEffects.Length; i++)
                {
                    // compensate for variations in casing
                    effectName = metaEffects[i].ComponentName.ToLowerInvariant();
                    for (j = 0; j < references.Count && !flag; j++)
                    {
                        if (references[j].OriginalName == effectName)
                        {
                            //references[j].Dependents.Add(metaEffects[i]);
                            flag = true;
                        }
                    }
                    if (!flag)
                    {
                        dep = EffectHelper.FindVisualEffectHandle(effectName, resource);
                        if (dep != null)
                        {
                            references.Add(new VisualEffectHandleContainer(
                                               new VisualEffectName(0, null, dep), resource));
                            this.LocateMetaReferences(dep, resource, references);
                        }
                    }
                    flag = false;
                    // compensate for variations in casing
                    effectName = metaEffects[i].ComponentType.ToLowerInvariant();
                    for (j = 0; j < references.Count && !flag; j++)
                    {
                        if (references[j].OriginalName == effectName)
                        {
                            //references[j].Dependents.Add(metaEffects[i]);
                            flag = true;
                        }
                    }
                    if (!flag)
                    {
                        dep = EffectHelper.FindVisualEffectHandle(effectName, resource);
                        if (dep != null)
                        {
                            references.Add(new VisualEffectHandleContainer(
                                               new VisualEffectName(0, null, dep), resource));
                            this.LocateMetaReferences(dep, resource, references);
                        }
                    }
                    flag = false;
                }
            }
        }

        private void LocateSeqReferences(VisualEffectName handle, EffectResource resource,
                                         List <VisualEffectHandleContainer> references)
        {
            SequenceEffect[] seqEffects = EffectHelper.FindEffects <SequenceEffect>(handle, resource);
            if (seqEffects != null && seqEffects.Length > 0)
            {
                int i, j, k;
                VisualEffectName dep;
                SequenceEffect   seqEffect;
                string           effectName;
                bool             flag = false;
                for (i = 0; i < seqEffects.Length; i++)
                {
                    seqEffect = seqEffects[i];
                    for (j = 0; j < seqEffect.Elements.Count; j++)
                    {
                        // compensate for variations in casing
                        effectName = seqEffect.Elements[j].EffectName.ToLowerInvariant();
                        for (k = 0; k < references.Count && !flag; k++)
                        {
                            if (references[k].OriginalName == effectName)
                            {
                                //references[j].Dependents.Add(seqEffects[i]);
                                flag = true;
                            }
                        }
                        if (!flag)
                        {
                            dep = EffectHelper.FindVisualEffectHandle(effectName, resource);
                            if (dep != null)
                            {
                                references.Add(new VisualEffectHandleContainer(
                                                   new VisualEffectName(0, null, dep), resource));
                                this.LocateSeqReferences(dep, resource, references);
                            }
                        }
                        flag = false;
                    }
                }
            }
        }

        private void cloneEffect_Click(object sender, EventArgs e)
        {
            VisualEffectName handle = (this.inputEffectLST.SelectedItem as VisualEffectHandleContainer).Handle;
            EffectResource   owner  = (this.inputEffectLST.SelectedItem as VisualEffectHandleContainer).Owner;

            if (handle != null)
            {
                VisualEffectHandleContainer con;
                foreach (VisualEffectHandleContainer container in this.outputEffectLST.Items)
                {
                    if (container.Handle.Index == handle.Index)
                    {
                        MessageBox.Show("Selected effect has already been cloned.");
                        return;
                    }
                }
                con = new VisualEffectHandleContainer(new VisualEffectName(0, null, handle), owner);
                con.SetEffectName(this.PromptForEffectName(con.OriginalName));
                this.outputEffectLST.Items.Add(con);

                List <VisualEffectHandleContainer> references = new List <VisualEffectHandleContainer>();
                this.LocateMetaReferences(handle, owner, references);
                int metaCount = references.Count;
                this.LocateSeqReferences(handle, owner, references);
                int seqCount = references.Count - metaCount;
                if (references.Count > 0)
                {
                    string format;
                    if (metaCount > 0)
                    {
                        if (seqCount > 0)
                        {
                            format = "{0} has metaparticle and sequence effects.\n";
                        }
                        else
                        {
                            format = "{0} has metaparticle effects.\n";
                        }
                    }
                    else
                    {
                        format = "{0} has sequence effects.\n";
                    }
                    DialogResult result = MessageBox.Show(
                        //string.Concat(handle.EffectName, " has metaparticle and/or sequence effects.\n",
                        string.Concat(string.Format(format, handle.EffectName),
                                      "Would you like to clone all effects referenced by them?"),
                        "Clone Referenced Effects", MessageBoxButtons.YesNo);
                    if (result == System.Windows.Forms.DialogResult.Yes)
                    {
                        for (int i = 0; i < references.Count; i++)
                        {
                            con = references[i];
                            con.SetEffectName(this.PromptForEffectName(con.OriginalName));
                            this.outputEffectLST.Items.Add(con);
                        }
                    }
                }
                this.saveOutputBTN.Enabled  = true;
                this.printOutputBTN.Enabled = true;
            }
        }

        private void removeEffect_Click(object sender, EventArgs e)
        {
            int index = this.outputEffectLST.SelectedIndex;

            if (index >= 0)
            {
                this.outputEffectLST.Items.RemoveAt(index);
            }
            if (this.outputEffectLST.Items.Count == 0)
            {
                this.saveOutputBTN.Enabled  = false;
                this.printOutputBTN.Enabled = false;
            }
        }

        private void saveOutput_Click(object sender, EventArgs e)
        {
            /*if (this.mEffectResource == null)
             * {
             *  MessageBox.Show("Please open an effect file to clone effects from it.");
             *  return;
             * }
             * if (this.outputEffectLST.Items.Count == 0)
             * {
             *  MessageBox.Show("Please select at least one effect from the left list to clone.");
             *  return;
             * }/**/
            using (SaveFileDialog dialog = new SaveFileDialog())
            {
                dialog.Title           = "Save Effect Clone";
                dialog.Filter          = kEffectDialogFilter;
                dialog.AddExtension    = true;
                dialog.OverwritePrompt = true;
                DialogResult result = dialog.ShowDialog();
                if (result == DialogResult.OK)
                {
                    string resName = Path.GetFileNameWithoutExtension(dialog.FileName);
                    ulong  resHash = System.Security.Cryptography.FNV64.GetHash(resName);

                    string fileName  = dialog.FileName;
                    string extension = Path.GetExtension(fileName).ToLowerInvariant();

                    if (extension == ".effects")
                    {
                        resName = kEffectS3piNameHead + resHash.ToString("X16") + "_" + resName
                                  + kEffectS3piNameTail;
                        string prompt = "Would you like to save the effect file as:\n\n" + resName
                                        + "\n\ninstead of:\n\n" + Path.GetFileName(fileName);
                        result = MessageBox.Show(prompt, "Make S3PI File Name?", MessageBoxButtons.YesNo);
                        if (result == DialogResult.Yes)
                        {
                            fileName = dialog.FileName.Replace(Path.GetFileNameWithoutExtension(fileName), resName);
                        }
                        else
                        {
                            fileName = dialog.FileName;
                        }
                    }

                    VisualEffectHandleContainer con;
                    int i, count = this.outputEffectLST.Items.Count;
                    for (i = 0; i < count; i++)
                    {
                        con = this.outputEffectLST.Items[i] as VisualEffectHandleContainer;
                        this.mOutputEffectResBuilder.AddVisualEffect(con.Handle, con.Owner);
                    }
                    this.mOutputEffectResBuilder.FlushEffects();

                    for (i = 0; i < count; i++)
                    {
                        con = this.outputEffectLST.Items[i] as VisualEffectHandleContainer;
                        this.mOutputEffectResBuilder.SetAllEffectReferences(con.OriginalName, con.Handle.EffectName);
                    }
                    //EffectResource output = this.mInputEffectResBuilder.BuildResource();
                    //this.mInputEffectResBuilder.ResetOld();

                    if (extension == ".effects")
                    {
                        using (FileStream fileStream = new FileStream(fileName, FileMode.Create))
                        {
                            this.mOutputEffectResBuilder.UnParse(fileStream);

                            /*Stream stream = output.Stream;
                             * int length = (int)stream.Length;
                             * byte[] buffer = new byte[length];
                             * stream.Read(buffer, 0, length);
                             * fileStream.Write(buffer, 0, length);/**/
                        }
                    }
                    else if (extension == ".package")
                    {
                        // Fail-safe to prevent accidental collision with existing SWB resources
                        //resHash = System.Security.Cryptography.FNV64.GetHash(resName + DateTime.Now.ToString());
                        TGIBlock     effectKey = new TGIBlock(0, null, kEffectTID, kEffectGID, resHash);
                        MemoryStream mStream   = new MemoryStream();
                        this.mOutputEffectResBuilder.UnParse(mStream);

                        TGIBlock nameMapKey = new TGIBlock(0, null, 0x0166038C, 0, 0L);
                        NameMapResource.NameMapResource nameMap
                            = new NameMapResource.NameMapResource(0, null);
                        nameMap.Add(resHash, resName);

                        IPackage effectPackage = s3pi.Package.Package.NewPackage(0);
                        effectPackage.AddResource(effectKey, mStream, false);
                        effectPackage.AddResource(nameMapKey, nameMap.Stream, false);
                        effectPackage.SaveAs(fileName);
                    }
                    this.outputEffectLST.Items.Clear();
                    this.mOutputEffectResBuilder = new EffectResourceBuilder();
                }
            }
        }
예제 #7
0
        private void exportResourceToPackage(IPackage tgtpkg, IResourceIndexEntry srcrie, bool replace)
        {
            IResourceIndexEntry rie = tgtpkg.Find(x => ((IResourceKey)srcrie).Equals(x));
            if (rie != null)
            {
                if (!replace) return;
                tgtpkg.DeleteResource(rie);
            }

            rie = tgtpkg.AddResource(srcrie, null, true);
            if (rie == null) return;
            rie.Compressed = srcrie.Compressed;

            IResource srcres = s4pi.WrapperDealer.WrapperDealer.GetResource(0, CurrentPackage, srcrie, true);//Don't need wrapper
            tgtpkg.ReplaceResource(rie, srcres);
        }
예제 #8
0
        static void Translate(FileInfo inFile, String outPath, XmlDictionary dict)
        {
            if (!File.Exists(inFile.FullName))
            {
                throw new FileNotFoundException(inFile.FullName);
            }

            String _outFile = outPath + "\\" + inFile.Name;

            if (!Directory.Exists(outPath))
            {
                Directory.CreateDirectory(outPath);
            }

            IPackage _package = Package.OpenPackage(-1, inFile.FullName);

            Byte _targetCode     = 0;
            var  _stblIndexEntry = new List <KeyValuePair <IResourceIndexEntry, IResourceIndexEntry> >();

            {
                List <IResourceIndexEntry> _resourceEntry = _package.GetResourceList;
                var _stblRes = _resourceEntry.Where((o) => { return(o.ResourceType == 0x220557DA); });

                Byte _sourceCode = dict.To == TranslateTo.B ? dict.LanguageA : dict.LanguageB;
                IEnumerable <IResourceIndexEntry> _stblScoure = _stblRes.Where((o) => { return(GetLanguageCode(o.Instance) == _sourceCode); });

                _targetCode = dict.To == TranslateTo.A ? dict.LanguageA : dict.LanguageB;
                IEnumerable <IResourceIndexEntry> _stblTarget = _stblRes.Where((o) => { return(GetLanguageCode(o.Instance) == _targetCode); });

                foreach (var s in _stblScoure)
                {
                    Boolean hasTarget = false;
                    UInt64  _is       = s.Instance << (4 * 2);
                    foreach (var t in _stblTarget)
                    {
                        UInt64 _it = t.Instance << (4 * 2);
                        if (s.ResourceType == t.ResourceType &&
                            s.ResourceGroup == t.ResourceGroup &&
                            _is == _it)
                        {
                            hasTarget = true;
                            _stblIndexEntry.Add(new KeyValuePair <IResourceIndexEntry, IResourceIndexEntry>(s, t));
                            break;
                        }
                    }

                    if (!hasTarget)
                    {
                        _stblIndexEntry.Add(new KeyValuePair <IResourceIndexEntry, IResourceIndexEntry>(s, null));
                    }
                }
            }

            if (_stblIndexEntry.Count() == 0)
            {
                _package.SaveAs(_outFile);
                throw new ApplicationException($"源语言不存在,文件未修改。文件:{_outFile}");
            }
            else
            {
                var _newDict = new XmlDictionary(dict.LanguageA, dict.LanguageB, dict.To);

                Int32 _changedCount = 0;
                foreach (var item in _stblIndexEntry)
                {
                    IResource res = WrapperDealer.GetResource(-1, _package, item.Key, false);

                    Stream             _fs         = res.Stream;
                    List <StringEntry> _stringList = ReadStbl(inFile.Name, _fs, item.Key);

                    foreach (var str in _stringList)
                    {
                        if (dict.TryFind(str.Text, inFile.Name, str.Ident, out String s))
                        {
                            str.Text = s;
                            _changedCount++;
                        }
                        else
                        {
                            Entry _entry = new Entry(str.Text, str.Text, str.Ident, inFile.Name);
                            _newDict.Add(_entry);
                        }
                    }

                    var _ms = new MemoryStream();
                    StringListToStbl(_ms, _stringList);

                    if (item.Value == null)
                    {
                        var _rk = new TranslateResourceIndexEntry();
                        _rk.ResourceGroup = item.Key.ResourceGroup;
                        _rk.ResourceType  = item.Key.ResourceType;
                        _rk.Instance      = item.Key.Instance;
                        _rk.Instance      = _rk.Instance << (4 * 2);
                        _rk.Instance      = _rk.Instance >> (4 * 2);
                        _rk.Instance      = _rk.Instance + ((( UInt64 )_targetCode) << (4 * 14));

                        _package.AddResource(_rk, _ms, true);
                    }
                    else
                    {
                        var _st = new StblResource.StblResource(0, _ms);
                        _package.ReplaceResource(item.Value, _st);
                    }

                    _package.SaveAs(_outFile);
                }

                if (_newDict.Count != 0)
                {
                    throw new EntryNotFoundException(_newDict, _changedCount);
                }
            }
        }
예제 #9
0
        public bool MergeNamemap(IEnumerable <KeyValuePair <ulong, string> > newMap, bool create, bool replace)
        {
            if (nameMap == null)
            {
                CreateNameMap();
            }
            if (nameMap == null || nameMap.Count == 0 && create)
            {
                IResourceIndexEntry rie = pkg.AddResource(new TGIBlock(0, null, 0x0166038C, 0, 0), null, false);
                if (rie != null)
                {
                    Add(rie, false);
                }
                CreateNameMap();
                if (nameMap == null)
                {
                    string s = "Resource names cannot be added.  Other than that, you should be fine.  Carry on.";
                    CopyableMessageBox.Show(s, "s3pe", CopyableMessageBoxButtons.OK, CopyableMessageBoxIcon.Warning);
                    return(false);
                }
            }

            try
            {
                IDictionary <ulong, string> nmap = nameMap[0] as IDictionary <ulong, string>;
                if (nmap == null)
                {
                    return(false);
                }

                foreach (var kvp in newMap)
                {
                    if (nmap.ContainsKey(kvp.Key))
                    {
                        if (replace)
                        {
                            nmap[kvp.Key] = kvp.Value;
                        }
                    }
                    else
                    {
                        nmap.Add(kvp.Key, kvp.Value);
                    }
                }

                pkg.ReplaceResource(nameMapRIEs[0], nameMap[0]);

                if (selectedResource != null && selectedResource.Tag as IResourceIndexEntry == nameMapRIEs[0])
                {
                    OnSelectedResourceChanged(this, new ResourceChangedEventArgs(selectedResource));
                }
            }
            catch (Exception ex)
            {
                string s = "Resource names cannot be added.  Other than that, you should be fine.  Carry on.";
                s += String.Format("\n\nError updating _KEY {0}\n", "" + nameMapRIEs[0]);
                MainForm.IssueException(ex, s);
                return(false);
            }
            return(true);
        }
예제 #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
        public static void GenerateNameMap(IPackage package, List <TGIN> addedResourceKeys, List <TGIN> removedResourceKeys)
        {
            AResourceKey nameMapKey = new TGIBlock(0, null, 23462796u, 0u, 0uL);

            IResourceIndexEntry nameMapEntry = package.Find(nameMapKey.Equals);

            if (nameMapEntry == null)
            {
                nameMapEntry = package.AddResource(nameMapKey, null, false);
            }

            if (nameMapEntry != null)
            {
                NameMapResource.NameMapResource nameMapResource = (NameMapResource.NameMapResource)WrapperDealer.GetResource(0, package, nameMapEntry);

                if (nameMapResource == null || !typeof(IDictionary <ulong, string>).IsAssignableFrom(nameMapResource.GetType()))
                {
                    package.DeleteResource(nameMapEntry);
                    nameMapEntry    = package.AddResource(nameMapKey, null, false);
                    nameMapResource = (NameMapResource.NameMapResource)WrapperDealer.GetResource(0, package, nameMapEntry);
                }

                if (removedResourceKeys != null)
                {
                    for (int removedResourceKeyIndex = 0; removedResourceKeyIndex < removedResourceKeys.Count; removedResourceKeyIndex++)
                    {
                        if (nameMapResource.Contains(removedResourceKeys[removedResourceKeyIndex].ResInstance))
                        {
                            nameMapResource.Remove(removedResourceKeys[removedResourceKeyIndex].ResInstance);
                        }
                    }
                }

                if (addedResourceKeys != null)
                {
                    for (int addedResourceKeyIndex = 0; addedResourceKeyIndex < addedResourceKeys.Count; addedResourceKeyIndex++)
                    {
                        if (addedResourceKeys[addedResourceKeyIndex].ResName == null)
                        {
                            continue;
                        }

                        if (nameMapResource.Contains(addedResourceKeys[addedResourceKeyIndex].ResInstance))
                        {
                            nameMapResource[addedResourceKeys[addedResourceKeyIndex].ResInstance] = addedResourceKeys[addedResourceKeyIndex].ResName;
                        }
                        else
                        {
                            nameMapResource.Add(addedResourceKeys[addedResourceKeyIndex].ResInstance, addedResourceKeys[addedResourceKeyIndex].ResName);
                        }
                    }
                }

                List <KeyValuePair <ulong, string> > orderedNameMapResource = nameMapResource.ToList();
                orderedNameMapResource.Sort((pair1, pair2) => pair1.Value.CompareTo(pair2.Value));

                nameMapResource.Clear();

                for (int orderedNameMapResourceIndex = 0; orderedNameMapResourceIndex < orderedNameMapResource.Count; orderedNameMapResourceIndex++)
                {
                    nameMapResource.Add(orderedNameMapResource[orderedNameMapResourceIndex].Key, orderedNameMapResource[orderedNameMapResourceIndex].Value);
                }

                package.ReplaceResource(nameMapEntry, nameMapResource);
            }
        }
예제 #12
0
        public bool AddNew(ulong instance, IPackage package, bool autoSet)
        {
            mPackage = package;

            string filename = GetFilename(autoSet, true);
            if (string.IsNullOrEmpty(filename)) return false;

            string name = CreateInstance(filename, ref instance);
            if (instance == 0) return false;

            Set (mPackage.AddResource(new AResource.TGIBlock(0, null, (uint)Type, 0, instance), null, false), mPackage);
            if (mEntry == null) return false;

            if (File.Exists(filename))
            {
                Filename = filename;
            }
            else
            {
                mPackage.ReplaceResource(mEntry, ResourceHandlers.CreateResource(mEntry, mPackage));
            }

            Name = name;

            return true;
        }