Ejemplo n.º 1
0
        protected override Boolean PatchFile(String fileName)
        {
            List <PatchResource> patchResources = new List <PatchResource>();

            foreach (PatchResourceSet set in _resourceSets)
            {
                if (EvaluatePatchResourceSet(set, fileName))
                {
                    // HACK: This just adds them together into a massive list. If the same name is mentioned it'll be overwritten several times
                    // fortunately it isnt' very expensive as only the last "final" one counts, but could do with filtering at this stage maybe?

                    patchResources.AddRange(set.Resources);
                }
                else
                {
                    Package.Log.Add(LogSeverity.Info, "Expression evaluation non-one: " + set.Condition.ExpressionString + ", did not process " + set.Resources.Count + " resources");
                }
            }

            if (patchResources.Count == 0)
            {
                Package.Log.Add(LogSeverity.Warning, "No resources to patch: " + fileName);
                return(false);
            }

            try {
                // for now, use lazy-load under all circumstances. In future analyse the Resources list to see if it's necessary or not
                // but the performance impact is minimal and it's the safest option, so keep it as it is
                using (ResourceSource source = ResourceSource.Open(fileName, false, ResourceSourceLoadMode.LazyLoadData)) {
                    List <String> tempFiles = new List <String>();

                    foreach (PatchResource res in patchResources)
                    {
                        if (res.Source.StartsWith("comp:", StringComparison.OrdinalIgnoreCase))
                        {
                            CompositedImage comp = new CompositedImage(res.Source, Package.RootDirectory);

                            DirectoryInfo packageTempDirectory = new DirectoryInfo(P.Combine(Package.RootDirectory.FullName, "Temp"));
                            if (!packageTempDirectory.Exists)
                            {
                                packageTempDirectory.Create();
                            }

                            // I think not using the *.bmp extension messes up Bitmap import
                            String tempFileName = PackageUtility.GetUnusedFileName(P.Combine(packageTempDirectory.FullName, P.GetFileName(Path) + res.Name) + ".bmp");

                            comp.Save(tempFileName, System.Drawing.Imaging.ImageFormat.Bmp);

                            res.File = tempFileName;
                            tempFiles.Add(tempFileName);
                        }
                        else
                        {
                            res.File = res.Source;
                        }

                        if (!File.Exists(res.File))
                        {
                            Package.Log.Add(LogSeverity.Error, "Data File not found: " + res.File);
                            continue;
                        }

                        ResourceTypeIdentifier typeId = ResourceTypeIdentifier.CreateFromString(res.Type, true);
                        ResourceIdentifier     nameId = ResourceIdentifier.CreateFromString(res.Name);
                        UInt16 langId = String.IsNullOrEmpty(res.Lang) ? UInt16.MaxValue : UInt16.Parse(res.Lang, System.Globalization.NumberStyles.Integer, System.Globalization.CultureInfo.InvariantCulture);


                        if (langId == UInt16.MaxValue)                                // if the lang="" attribute was not specified

                        {
                            ResourceName name = source.GetName(typeId, nameId);

                            if (name == null)                              // if the specified name does not exist

                            {
                                if (res.Add)
                                {
                                    UInt16 sysLang = (UInt16)CultureInfo.InvariantCulture.LCID;

                                    ResourceData data = ResourceData.FromFileToAdd(res.File, sysLang, source);
                                    source.Add(typeId, nameId, sysLang, data);
                                }
                                else
                                {
                                    // Error

                                    String sourcePath = source.Name;

                                    Anolis.Core.Source.FileResourceSource frs = source as Anolis.Core.Source.FileResourceSource;
                                    if (frs != null)
                                    {
                                        sourcePath = frs.FileInfo.FullName;
                                    }

                                    Package.Log.Add(LogSeverity.Warning, "Resource name not found: " + sourcePath + '\\' + typeId.ToString() + '\\' + nameId.FriendlyName);
                                }
                            }
                            else
                            {
                                foreach (ResourceLang lang in name.Langs)
                                {
                                    ResourceData data = ResourceData.FromFileToUpdate(res.File, lang);
                                    lang.SwapData(data);
                                }
                            }
                        }
                        else                             // if the lang="" attribute was specified

                        {
                            ResourceLang lang = source.GetLang(typeId, nameId, langId);
                            if (lang == null)
                            {
                                ResourceData data = ResourceData.FromFileToAdd(res.File, langId, source);
                                source.Add(typeId, nameId, langId, data);
                            }
                            else
                            {
                                ResourceData data = ResourceData.FromFileToUpdate(res.File, lang);
                                lang.SwapData(data);
                            }
                        }
                    }                    //foreach

                    // note that Win32ResourceSource now recomptues the PE checksum by itself
                    source.CommitChanges();

                    foreach (String tempFile in tempFiles)
                    {
                        File.Delete(tempFile);
                    }

                    return(true);
                }                //using source
            } catch (AnolisException aex) {
                Package.Log.Add(LogSeverity.Error, "Patch Exception: " + aex.Message);

                if (File.Exists(fileName))
                {
                    File.Delete(fileName);
                }

                throw;
            }
        }
Ejemplo n.º 2
0
        private void Populate()
        {
            ////////////////////////////////////////////////
            // Operations List

            __listOperations.BeginUpdate();

            __listOperations.Items.Clear();

            MainForm form = MainForm.LatestInstance;

            ResourceSource source = form.CurrentSource;

            foreach (ResourceLang lang in source.AllActiveLangs)
            {
                ListViewItem item = new ListViewItem(new String[] {
                    lang.Action.ToString(),
                    lang.ResourcePath
                });
                item.Tag = lang;

                __listOperations.Items.Add(item);
            }

            __listOperations.EndUpdate();

            ////////////////////////////////////////////////
            // Package XML

            StringBuilder sb = new StringBuilder();

            FileResourceSource fSource = source as FileResourceSource;

            if (fSource != null)
            {
                // I could do it all in 1 loop, but this is easier

                String patchElementA = @"<patch path=""{0}"">" + "\r\n";
                String patchElementB = @"</patch>";

                String resElement = '\t' + @"<res type=""{0}"" name=""{1}"" lang=""{2}"" src=""{3}"" {4}/>" + "\r\n";
                String addAttrib  = @"add=""true"" ";

                sb.AppendFormat(patchElementA, (source as FileResourceSource).FileInfo.FullName);

                foreach (ResourceLang lang in source.AllActiveLangs)
                {
                    if (lang.Action != Anolis.Core.Data.ResourceDataAction.Add && lang.Action != Anolis.Core.Data.ResourceDataAction.Update)
                    {
                        continue;
                    }

                    if (!lang.Data.Tag.ContainsKey("sourceFile"))
                    {
                        continue;                                                                // so skip things like IconImage that wouldn't have this attribute
                    }
                    String typeId = GetStringId(lang.Name.Type.Identifier);
                    String nameId = GetStringId(lang.Name.Identifier);
                    String langId = lang.LanguageId.ToString(Cult.InvariantCulture);
                    String src    = (String)lang.Data.Tag["sourceFile"];

                    String add = lang.Action == Anolis.Core.Data.ResourceDataAction.Add ? addAttrib : String.Empty;

                    sb.AppendFormat(resElement, typeId, nameId, langId, src, add);
                }

                sb.Append(patchElementB);

                __xmlText.Text = sb.ToString();
            }

            ////////////////////////////////////////////////
            // RC Script
        }