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."); }
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; } } }
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); } }
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}]"); } }
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}]"); } }
public override void Update(IFile oldFile, IFile newFile, IUpdateLogger logger) { CheckArgs(oldFile, newFile, logger); UpdateInternal((T)oldFile, (T)newFile, logger); }
public override void Update(IFile oldFile, IFile newFile, IUpdateLogger logger) { CheckArgs(oldFile, newFile, logger); UpdateInternal(oldFile as CustomModTranslationFile, newFile as CustomModTranslationFile, logger); }
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}]"); } }
/// <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);