Ejemplo n.º 1
0
        private static string Print(this DeltaFragment delta)
        {
            int colLen = 36;
            var sb     = new StringBuilder();

            sb.AppendLine();

            sb.AppendLine("Delta Fragment:");
            PrintItem(sb, colLen, "Magic:", delta.Header.Magic);
            PrintItem(sb, colLen, "Base file size:", $"0x{delta.Header.OriginalSize:x12}");
            PrintItem(sb, colLen, "New file size:", $"0x{delta.Header.NewSize:x12}");
            PrintItem(sb, colLen, "Fragment header size:", $"0x{delta.Header.FragmentHeaderSize:x12}");
            PrintItem(sb, colLen, "Fragment body size:", $"0x{delta.Header.FragmentBodySize:x12}");

            return(sb.ToString());
        }
Ejemplo n.º 2
0
        public static void Process(Context ctx)
        {
            using (IStorage deltaFile = new LocalStorage(ctx.Options.InFile, FileAccess.Read))
            {
                IStorage    deltaStorage = deltaFile;
                Span <byte> magic        = stackalloc byte[4];
                deltaFile.Read(magic, 0);

                if (MemoryMarshal.Read <uint>(magic) != Ndv0Magic)
                {
                    try
                    {
                        var         nca = new Nca(ctx.Keyset, deltaStorage, true);
                        IFileSystem fs  = nca.OpenFileSystem(0, IntegrityCheckLevel.ErrorOnInvalid);

                        if (!fs.FileExists(FragmentFileName))
                        {
                            throw new FileNotFoundException("Specified NCA does not contain a delta fragment");
                        }

                        deltaStorage = fs.OpenFile(FragmentFileName, OpenMode.Read).AsStorage();
                    }
                    catch (InvalidDataException) { } // Ignore non-NCA3 files
                }

                var delta = new DeltaFragment(deltaStorage);

                if (ctx.Options.BaseFile != null)
                {
                    using (IStorage baseFile = new LocalStorage(ctx.Options.BaseFile, FileAccess.Read))
                    {
                        delta.SetBaseStorage(baseFile);

                        if (ctx.Options.OutFile != null)
                        {
                            using (var outFile = new FileStream(ctx.Options.OutFile, FileMode.OpenOrCreate, FileAccess.ReadWrite))
                            {
                                IStorage patchedStorage = delta.GetPatchedStorage();
                                patchedStorage.CopyToStream(outFile, patchedStorage.GetSize(), ctx.Logger);
                            }
                        }
                    }
                }

                ctx.Logger.LogMessage(delta.Print());
            }
        }