public bool CanWrite(IWriteContent content, FileWrite write) { long contentLength = content.EndOffset.HasValue ? content.EndOffset.Value - content.StartOffset : 0; long contentEndOffset = content.StartOffset + contentLength; bool startsInRange = content.StartOffset > write.localStartOffset && content.StartOffset < write.localEndOffset; bool endsInRange = contentEndOffset > write.localStartOffset && contentEndOffset < write.localEndOffset; // We're attempting to write to a section of the file that has been modified by another if (startsInRange || (content.Replace && endsInRange)) { return(false); } return(true); }
public bool CanWrite(string targetFile, IWriteContent content) { // Check if we don't have any writes to the file yet if (!writeCache.TryGetValue(targetFile, out List <FileWrite> fileWrites)) { return(true); } foreach (var write in fileWrites) { if (!CanWrite(content, write)) { return(false); } } return(true); }
public static bool HasEditCollision(GameModification currentMod, string file, IWriteContent content, FileWriterUtility fileWriter, List <FileModification> modifications, out ModCollision collision) { var actions = new ActionCollection(file, currentMod.Config.ModID, modifications); if (actions.moveAction != null) { return(AddModCollision(currentMod, ModInstallActionEnum.Edit, FileModificationType.Moved, actions.moveAction.ModID, ModCollisionSeverity.Clash, out collision)); } if (actions.replaceAction != null) { return(AddModCollision(currentMod, ModInstallActionEnum.Edit, FileModificationType.Replaced, actions.replaceAction.ModID, ModCollisionSeverity.Clash, out collision)); } if (actions.editAction != null && !fileWriter.CanWrite(file, content)) { return(AddModCollision(currentMod, ModInstallActionEnum.Edit, FileModificationType.Edited, actions.editAction.ModID, ModCollisionSeverity.Clash, out collision)); } if (actions.deleteAction != null) { return(AddModCollision(currentMod, ModInstallActionEnum.Edit, FileModificationType.Deleted, actions.deleteAction.ModID, ModCollisionSeverity.Clash, out collision)); } collision = null; return(false); }