Ejemplo n.º 1
0
        /// <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);
        }
Ejemplo n.º 2
0
        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;
        }
Ejemplo n.º 3
0
        /// <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;
        }
Ejemplo n.º 4
0
        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);
        }
Ejemplo n.º 5
0
        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);
            }
        }
Ejemplo n.º 6
0
        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);
            }
        }
Ejemplo n.º 7
0
        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);
            }
        }
Ejemplo n.º 8
0
		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);
			}
		}