Beispiel #1
0
        public void BsDiffCreateFromStreams()
        {
            const int outputSize = 0x2A000;

            foreach (var oldBuffer in GetBuffers(Sizes))
            {
                foreach (var newBuffer in GetBuffers(Sizes))
                {
                    byte[] bytesOut;
                    using (var mmf = MemoryMappedFile.CreateNew(null, outputSize, MemoryMappedFileAccess.ReadWrite))
                    {
                        using (var mmfStream = mmf.CreateViewStream())
                        {
                            BsDiff.Create(oldBuffer, newBuffer, mmfStream);
                        }

                        using (var msA = new MemoryStream(oldBuffer))
                            using (var msOutput = new MemoryStream())
                            {
                                BsPatch.Apply(msA, mmf.CreateViewStream, msOutput);
                                bytesOut = msOutput.ToArray();
                            }
                    }

                    Assert.Equal(newBuffer, bytesOut);
                }
            }
        }
Beispiel #2
0
 private void ApplyPatch(string srcName, PatchedFile file, PC98FatFileSystem srcFat, FatFileSystem dstFat)
 {
     if (srcName.EndsWith("CRUISER.COM"))
     {
         var dir  = System.IO.Path.GetDirectoryName(Application.ExecutablePath);
         var name = Path.Combine(dir, srcName.TrimStart('\\'));
         using (var src = srcFat.OpenFile(srcName, FileMode.Open)) {
             using (var dst = File.Create(name)) {
                 src.CopyTo(dst);
             }
         }
         using (var dst = File.Create(name + ".patch")) {
             dst.Write(file.Patch, 0, file.Patch.Length);
         }
     }
     MakeDirectory(file.Name, dstFat);
     using (var ms = new MemoryStream(file.Patch)) {
         ms.Position = 0;
         using (var src = srcFat.OpenFile(srcName, FileMode.Open)) {
             using (var dst = dstFat.OpenFile(file.Name, FileMode.Create)) {
                 BsPatch.Apply(src, file.Patch, dst);
             }
         }
     }
 }
Beispiel #3
0
 public byte[] ApplyDelta5()
 {
     using (var outputStream = new MemoryStream())
     {
         BsPatch.Apply(Samples.origin5, sample5Delta, outputStream);
         return(outputStream.ToArray());
     }
 }
Beispiel #4
0
 private static byte[] BsDiffApply(byte[] oldBuffer, byte[] patchBuffer)
 {
     using (var outputStream = new MemoryStream())
     {
         BsPatch.Apply(oldBuffer, patchBuffer, outputStream);
         return(outputStream.ToArray());
     }
 }
Beispiel #5
0
 private static void ApplyPatch(string src, string patch, string dst)
 {
     if (File.Exists(dst))
     {
         File.Delete(dst);
     }
     using (var fh = File.Create(dst)) {
         BsPatch.Apply(File.ReadAllBytes(src), File.ReadAllBytes(patch), fh);
     }
 }
Beispiel #6
0
        public void BsPatchFlushesOutput()
        {
            var oldBuffer = GetRandomFilledBuffer(0x123);
            var newBuffer = GetRandomFilledBuffer(0x4567);

            //can't use MemoryStream directly as Flush has no effect
            var patchMs        = new MemoryStream();
            var wrappedPatchMs = new BufferedStream(patchMs);

            BsDiff.Create(oldBuffer, newBuffer, wrappedPatchMs);

            var patchBuffer = patchMs.ToArray();

            var reconstructMs        = new MemoryStream();
            var wrappedReconstructMs = new BufferedStream(reconstructMs);

            BsPatch.Apply(oldBuffer, patchBuffer, wrappedReconstructMs);

            var reconstructedBuffer = reconstructMs.ToArray();

            Assert.Equal(newBuffer, reconstructedBuffer);
        }
Beispiel #7
0
 public static void Patch(string patchFile, string localFile)
 {
     BsPatch.Apply(localFile, patchFile);
 }
Beispiel #8
0
        public void Apply(string source, string dest)
        {
            if (source != dest)
            {
                Console.WriteLine("Copying Unchanged Files...");
                //if our destination folder is different,
                //copy unchanged files first.
                var sourceFiles = new HashSet <string>();
                RecursiveDirectoryScan(source, sourceFiles, source);

                sourceFiles.ExceptWith(new HashSet <string>(Patches.Select(x => x.FileTarget)));
                sourceFiles.ExceptWith(new HashSet <string>(Deletions));

                foreach (var file in sourceFiles)
                {
                    var destP = Path.Combine(dest, file);
                    Directory.CreateDirectory(Path.GetDirectoryName(destP));

                    File.Copy(Path.Combine(source, file), destP);
                }
                Console.WriteLine("Done!");
            }

            var reader = new BinaryReader(Str);

            foreach (var patch in Patches)
            {
                Console.WriteLine($"Patching {patch.FileTarget}...");
                var path  = Path.Combine(source, patch.FileTarget);
                var dpath = Path.Combine(dest, patch.FileTarget);
                var data  = File.ReadAllBytes(path);
                Directory.CreateDirectory(Path.GetDirectoryName(dpath));

                Str.Seek(patch.Offset, SeekOrigin.Begin);
                var patchd = reader.ReadBytes(patch.Length);
                BsPatch.Apply(data, patchd, File.Open(dpath, FileMode.Create, FileAccess.Write, FileShare.None));
            }
            Console.WriteLine("Patching Complete!");

            foreach (var add in Additions)
            {
                Console.WriteLine($"Adding File {add.FileTarget}...");
                var dpath = Path.Combine(dest, add.FileTarget);
                Directory.CreateDirectory(Path.GetDirectoryName(dpath));

                Str.Seek(add.Offset, SeekOrigin.Begin);
                var addData = reader.ReadBytes(add.Length);
                File.WriteAllBytes(dpath, addData);
            }

            foreach (var del in Deletions)
            {
                try
                {
                    File.Delete(Path.Combine(dest, del));
                    Console.WriteLine($"Deleted {del}.");
                }
                catch
                {
                    //file not found. not important - we wanted it deleted anyways.
                }
            }
        }