Beispiel #1
0
        private static StatelessResult OneOffUpdate(string sourceFilename,
                                                    ResourceTypeIdentifier typeId,
                                                    ResourceIdentifier nameId,
                                                    string dataFilename)
        {
            var source = ResourceSource.Open(sourceFilename, false, ResourceSourceLoadMode.LazyLoadData);

            // for each lang in name, update
            var name = source.GetName(typeId, nameId);

            if (name == null)
            {
                return(new StatelessResult("Could not find name " + GetResPath(typeId, nameId, null) + " to extract."));
            }

            foreach (var lang in name.Langs)
            {
                var newData = ResourceData.FromFileToUpdate(dataFilename, lang);
                lang.SwapData(newData);
            }

            source.CommitChanges();

            return(StatelessResult.Success);
        }
Beispiel #2
0
        private void LoadReplacement(String fileName)
        {
            __repFilename.Enabled = false;
            __repLoad.Enabled     = false;
            __browse.Enabled      = false;

            if (!System.IO.File.Exists(fileName))
            {
                __repSubclass.Text = "Specified file does not exist";
                return;
            }

            try {
                _replacement = ResourceData.FromFileToUpdate(fileName, _initial.Lang);

                _replacement.Tag["sourceFile"] = fileName;
            } catch (AnolisException ex) {
                __repSubclass.Text = "Unable to load file into a resource: " + ex.Message;
                return;
            }

            if (_replacement == null)
            {
                __repSubclass.Text = "Unable to load file into a resource";
            }
            else
            {
                __repSubclass.Text = _replacement.GetType().Name;
            }

            __ok.Enabled = true;
        }
Beispiel #3
0
        private static StatelessResult OneOffUpdate(String sourceFilename, ResourceTypeIdentifier typeId, ResourceIdentifier nameId, UInt16 langId, String dataFilename)
        {
            ResourceSource source = ResourceSource.Open(sourceFilename, false, ResourceSourceLoadMode.LazyLoadData);

            ResourceLang lang = source.GetLang(typeId, nameId, langId);

            if (lang == null)
            {
                return(new StatelessResult("Could not find lang " + GetResPath(typeId, nameId, langId) + " to update."));
            }

            ResourceData newData = ResourceData.FromFileToUpdate(dataFilename, lang);

            lang.SwapData(newData);

            source.CommitChanges();

            return(StatelessResult.Success);
        }
Beispiel #4
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;
            }
        }