/// <summary> /// Compares two sets of file segments and the segment contents. /// </summary> /// <param name="originalSegments">The original set of file segments.</param> /// <param name="originalReader">The stream to use to read from the original file.</param> /// <param name="newSegments">The modified set of file segments.</param> /// <param name="newReader">The stream to use to read from the modified file.</param> /// <returns>The differences that were found.</returns> public static List <SegmentChange> CompareSegments(IEnumerable <FileSegment> originalSegments, IReader originalReader, IEnumerable <FileSegment> newSegments, IReader newReader) { List <FileSegment> originalList = originalSegments.ToList(); List <FileSegment> newList = newSegments.ToList(); if (originalList.Count != newList.Count) { throw new InvalidOperationException("The files have different segment counts"); } var results = new List <SegmentChange>(); for (int i = 0; i < originalList.Count; i++) { FileSegment originalSegment = originalList[i]; FileSegment newSegment = newList[i]; List <DataChange> changes = DataComparer.CompareData(originalReader, (uint)originalSegment.Offset, originalSegment.ActualSize, newReader, (uint)newSegment.Offset, newSegment.ActualSize, originalSegment.ResizeOrigin != SegmentResizeOrigin.Beginning); if (changes.Count > 0 || originalSegment.Size != newSegment.Size) { var change = new SegmentChange((uint)originalSegment.Offset, originalSegment.ActualSize, (uint)newSegment.Offset, newSegment.ActualSize, originalSegment.ResizeOrigin != SegmentResizeOrigin.Beginning); change.DataChanges.AddRange(changes); results.Add(change); } } return(results); }
public static Patch LoadPatch(IReader reader, bool isAlteration) { Patch patch = new Patch(); SegmentChange change = new SegmentChange(0, 0, 0, 0, true); patch.Author = "Ascension/Alteration Patch"; patch.Description = "Ascension/Alteration Patch"; if (isAlteration) { //do shitty alteration stuff byte authorLength = reader.ReadByte(); patch.Author = reader.ReadAscii((int)authorLength); byte descLength = reader.ReadByte(); patch.Description = reader.ReadAscii((int)descLength); } //create ascension patch object and change segment while (!reader.EOF) { //get valuable info var segmentOffset = reader.ReadUInt32(); var segmentSize = reader.ReadInt32(); var segmentData = reader.ReadBlock(segmentSize); //Add change data change.DataChanges.Add(new DataChange(segmentOffset, segmentData)); } patch.SegmentChanges.Add(change); return patch; }
/// <summary> /// Compares two sets of file segments and the segment contents. /// </summary> /// <param name="originalSegments">The original set of file segments.</param> /// <param name="originalReader">The stream to use to read from the original file.</param> /// <param name="newSegments">The modified set of file segments.</param> /// <param name="newReader">The stream to use to read from the modified file.</param> /// <returns>The differences that were found.</returns> public static List<SegmentChange> CompareSegments(IEnumerable<FileSegment> originalSegments, IReader originalReader, IEnumerable<FileSegment> newSegments, IReader newReader) { List<FileSegment> originalList = originalSegments.ToList(); List<FileSegment> newList = newSegments.ToList(); if (originalList.Count != newList.Count) throw new InvalidOperationException("The files have different segment counts"); var results = new List<SegmentChange>(); for (int i = 0; i < originalList.Count; i++) { FileSegment originalSegment = originalList[i]; FileSegment newSegment = newList[i]; List<DataChange> changes = DataComparer.CompareData(originalReader, (uint) originalSegment.Offset, originalSegment.ActualSize, newReader, (uint) newSegment.Offset, newSegment.ActualSize, originalSegment.ResizeOrigin != SegmentResizeOrigin.Beginning); if (changes.Count > 0 || originalSegment.Size != newSegment.Size) { var change = new SegmentChange((uint) originalSegment.Offset, originalSegment.ActualSize, (uint) newSegment.Offset, newSegment.ActualSize, originalSegment.ResizeOrigin != SegmentResizeOrigin.Beginning); change.DataChanges.AddRange(changes); results.Add(change); } } return results; }
public static Patch LoadPatch(IReader reader, bool isAlteration) { var patch = new Patch(); var change = new SegmentChange(0, 0, 0, 0, true); patch.Author = "Ascension/Alteration Patch"; patch.Description = "Ascension/Alteration Patch"; if (isAlteration) { //do shitty alteration stuff byte authorLength = reader.ReadByte(); patch.Author = reader.ReadAscii(authorLength); byte descLength = reader.ReadByte(); patch.Description = reader.ReadAscii(descLength); } //create ascension patch object and change segment while (!reader.EOF) { //get valuable info uint segmentOffset = reader.ReadUInt32(); int segmentSize = reader.ReadInt32(); byte[] segmentData = reader.ReadBlock(segmentSize); //Add change data change.DataChanges.Add(new DataChange(segmentOffset, segmentData)); } patch.SegmentChanges.Add(change); return(patch); }
private static void ReadSegmentChanges(IReader reader, Patch output) { // Version 0 (all versions) byte numChanges = reader.ReadByte(); for (int i = 0; i < numChanges; i++) { uint oldOffset = reader.ReadUInt32(); int oldSize = reader.ReadInt32(); uint newOffset = reader.ReadUInt32(); int newSize = reader.ReadInt32(); bool resizeAtEnd = Convert.ToBoolean(reader.ReadByte()); var segmentChange = new SegmentChange(oldOffset, oldSize, newOffset, newSize, resizeAtEnd); segmentChange.DataChanges.AddRange(ReadDataChanges(reader)); output.SegmentChanges.Add(segmentChange); } }
private static void ReadSegmentChanges(IReader reader, byte version, Patch output) { if (version > 0) { throw new NotSupportedException("Unrecognized \"segm\" block version"); } // Version 0 (all versions) byte numChanges = reader.ReadByte(); for (int i = 0; i < numChanges; i++) { uint oldOffset = reader.ReadUInt32(); int oldSize = reader.ReadInt32(); uint newOffset = reader.ReadUInt32(); int newSize = reader.ReadInt32(); bool resizeAtEnd = Convert.ToBoolean(reader.ReadByte()); var segmentChange = new SegmentChange(oldOffset, oldSize, newOffset, newSize, resizeAtEnd); segmentChange.DataChanges.AddRange(ReadDataChanges(reader)); output.SegmentChanges.Add(segmentChange); } }
private static void ReadSegmentChanges(IReader reader, Patch output) { // ReSharper disable UnusedVariable var version = reader.ReadByte(); // ReSharper restore UnusedVariable // Version 0 (all versions) var numChanges = reader.ReadByte(); for (var i = 0; i < numChanges; i++) { var oldOffset = reader.ReadUInt32(); var oldSize = reader.ReadInt32(); var newOffset = reader.ReadUInt32(); var newSize = reader.ReadInt32(); var resizeAtEnd = Convert.ToBoolean(reader.ReadByte()); var segmentChange = new SegmentChange(oldOffset, oldSize, newOffset, newSize, resizeAtEnd); segmentChange.DataChanges.AddRange(ReadDataChanges(reader)); output.SegmentChanges.Add(segmentChange); } }
private static void ReadSegmentChanges(IReader reader, Patch output) { // Version 0 (all versions) byte numChanges = reader.ReadByte(); for (int i = 0; i < numChanges; i++) { uint oldOffset = reader.ReadUInt32(); int oldSize = reader.ReadInt32(); uint newOffset = reader.ReadUInt32(); int newSize = reader.ReadInt32(); bool resizeAtEnd = Convert.ToBoolean(reader.ReadByte()); var segmentChange = new SegmentChange(oldOffset, oldSize, newOffset, newSize, resizeAtEnd); segmentChange.DataChanges.AddRange(ReadDataChanges(reader)); output.SegmentChanges.Add(segmentChange); } }