public void Update(IPackage oldPackage, IPackage newPackage, IUpdateLogger logger)
        {
            Utils.LogDebug($"Updating package [{oldPackage.Name}]");

            foreach (var oldFile in oldPackage.Files)
            {
                var updater = GetUpdater(oldFile);
                if (updater is null)
                {
                    continue;
                }

                Utils.SafeWrap(() =>
                {
                    updater.Update(oldFile, newPackage.Files.FirstOrDefault(f => f.GetType() == oldFile.GetType()),
                                   logger);
                });
            }

            foreach (var file in newPackage.Files)
            {
                if (oldPackage.Files.All(f => f.GetType() != file.GetType()))
                {
                    oldPackage.AddFile(file);
                }
            }

            Utils.LogDebug($"Package [{oldPackage.Name}] updated.");
        }
Example #2
0
        internal void UpdateEntry(string key, IEntry oldEntry, IEntry newEntry, IUpdateLogger logger)
        {
            foreach (var prop in oldEntry.GetType().ModTranslationProp())
            {
                var o = prop.GetValue(oldEntry) as BaseEntry;
                var n = prop.GetValue(newEntry) as BaseEntry;

                if (o.Origin != n.Origin)
                {
                    logger.Change($"{key}'s {prop.Name}\r\n[Old: \"{o.Origin}\"]\r\n => \r\n[New: \"{n.Origin}\"]\r\n");

                    o.Origin = n.Origin;
                }
            }
        }
Example #3
0
        public void UpdateInternal(T oldFile, T newFile, IUpdateLogger logger)
        {
            if (oldFile.GetType() != typeof(T) || newFile.GetType() != typeof(T))
            {
                return;
            }

            foreach (var prop in typeof(T).ModTranslationOwnerField())
            {
                var oldEntries = (IDictionary)prop.GetValue(oldFile);
                var newEntries = (IDictionary)prop.GetValue(newFile);

                foreach (string newEntryKey in newEntries.Keys)
                {
                    if (oldEntries.Contains(newEntryKey))
                    {
                        UpdateEntry(newEntryKey, oldFile.GetValue(newEntryKey), newFile.GetValue(newEntryKey), logger);
                    }
                    else
                    {
                        logger.Add($"[{newEntryKey}]");
                        var entry = (newEntries[newEntryKey] as IEntry).Clone();
                        oldEntries.Add(newEntryKey, entry);
                    }
                }

                var removed = new List <string>();
                foreach (string k in oldEntries.Keys)
                {
                    if (!newEntries.Contains(k))
                    {
                        removed.Add(k);
                    }
                }

                foreach (var r in removed)
                {
                    logger.Remove($"[{r}]");
                }

                prop.SetValue(oldFile, oldEntries);
            }
        }
Example #4
0
        internal void CheckArgs(IFile oldFile, IFile newFile, IUpdateLogger logger)
        {
            if (oldFile is null)
            {
                throw new ArgumentNullException(nameof(oldFile));
            }
            if (newFile is null)
            {
                throw new ArgumentNullException(nameof(newFile));
            }
            if (logger is null)
            {
                throw new ArgumentNullException(nameof(logger));
            }

            if (oldFile.GetType() != newFile.GetType())
            {
                throw new Exception($"Different file type: [{oldFile.GetType().FullName}] and [{newFile.GetType().FullName}]");
            }
        }
Example #5
0
        public void UpdateInternal(LdstrFile oldFile, LdstrFile newFile, IUpdateLogger logger)
        {
            var oldEntries = oldFile.LdstrEntries;
            var newEntries = newFile.LdstrEntries;

            foreach (var newEntryKey in newEntries.Keys)
            {
                if (oldEntries.Keys.Contains(newEntryKey))
                {
                    var o = oldEntries[newEntryKey];
                    var n = newEntries[newEntryKey];
                    foreach (var newIns in n.Instructions)
                    {
                        if (o.Instructions.Exists(oi => oi.Origin == newIns.Origin))
                        {
                            continue;
                        }

                        o.Instructions.Add(newIns);
                        logger.Change($"New instruction of {newEntryKey}: [{newIns}]");
                    }
                }
                else
                {
                    logger.Add($"[{newEntryKey}]");
                    var entry = newEntries[newEntryKey];
                    oldEntries.Add(newEntryKey, entry);
                }
            }

            var removed = oldEntries.Keys.Where(k => !newEntries.ContainsKey(k));

            foreach (var r in removed)
            {
                logger.Remove($"[{r}]");
            }
        }
Example #6
0
 public override void Update(IFile oldFile, IFile newFile, IUpdateLogger logger)
 {
     CheckArgs(oldFile, newFile, logger);
     UpdateInternal((T)oldFile, (T)newFile, logger);
 }
Example #7
0
 public override void Update(IFile oldFile, IFile newFile, IUpdateLogger logger)
 {
     CheckArgs(oldFile, newFile, logger);
     UpdateInternal(oldFile as CustomModTranslationFile, newFile as CustomModTranslationFile, logger);
 }
Example #8
0
        public void UpdateInternal(CustomModTranslationFile oldFile, CustomModTranslationFile newFile, IUpdateLogger logger)
        {
            var oldEntries = oldFile.Translations;
            var newEntries = newFile.Translations;

            foreach (var newEntryKey in newEntries.Keys)
            {
                if (oldEntries.Keys.Contains(newEntryKey))
                {
                    var o = oldEntries[newEntryKey];
                    var n = newEntries[newEntryKey];
                    if (o.Origin != n.Origin)
                    {
                        logger.Change($"{newEntryKey}\r\n[Old: \"{o.Origin}\"]\r\n => \r\n[New: \"{n.Origin}\"]\r\n");

                        o.Origin      = n.Origin;
                        o.Translation = n.Translation;
                    }
                }
                else
                {
                    logger.Add($"[{newEntryKey}]");
                    var entry = newEntries[newEntryKey];
                    oldEntries.Add(newEntryKey, entry);
                }
            }

            var removed = oldEntries.Keys.Where(k => !newEntries.ContainsKey(k));

            foreach (var r in removed)
            {
                logger.Remove($"[{r}]");
            }
        }
Example #9
0
 /// <summary>
 ///     Compare two packages and merge differences into old one.
 ///     Generate reports with logger.
 /// </summary>
 /// <param name="oldFile"></param>
 /// <param name="newFile"></param>
 /// <param name="logger"></param>
 public abstract void Update(IFile oldFile, IFile newFile, IUpdateLogger logger);