private void DoApplyPatchISO(string inputFile, string outputFile, string patchData)
        {
            var patches = GetPatches(patchData);

            DiscUtils.Complete.SetupHelper.SetupComplete();

            var tempFolder    = "./temp";
            var tempFolderAFS = "./tempAFS";
            var deepSearch    = DeepSearchCheckbox.Checked;

            // cleanup previous work
            RecursivelyDeleteDirectory(tempFolder);
            RecursivelyDeleteDirectory(tempFolderAFS);

            // prepare directories
            Directory.CreateDirectory(tempFolder);
            Directory.CreateDirectory(tempFolderAFS);

            var volumeLabel = string.Empty;

            ExtractISO(inputFile, tempFolder, out volumeLabel);
            volumeLabel += "_PATCHED";

            // which archive files contain the bin files we care about?
            var patchingFiles = GetArchivePatchInfo(patches);

            // loop through, unpacking and repacking the archives as we go
            foreach (var entry in patchingFiles)
            {
                var unpackAFS        = entry.Key;
                var unpackExtensions = entry.Value;

                var inputArchiveFile    = string.Format("{0}/{1}", tempFolder, unpackAFS);
                var outputArchiveFolder = string.Format("{0}/{1}", tempFolderAFS, unpackAFS);

                var archive = ExtractFromAFS(inputArchiveFile, outputArchiveFolder);
                if (archive == null)
                {
                    Log($"Couldn't find {inputArchiveFile}");
                    continue;
                }

                // search for any archived files with the extensions we care about
                var unpackFiles = new List <string>();
                for (var d = 0; d < archive.directory.Length; ++d)
                {
                    var dir_entry = archive.directory[d];

                    for (var e = 0; e < unpackExtensions.Count; ++e)
                    {
                        var extension = unpackExtensions[e];

                        // not exactly strict
                        if (deepSearch || dir_entry.filename.Contains(extension))
                        {
                            unpackFiles.Add(dir_entry.filename);
                            break;
                        }
                    }
                }

                // uncompress, patch, recompress, reinject into AFS instance
                var metadata = new List <TempFileMetadata>();

                // update progress bar
                var max_progress = unpackFiles.Count * 3;
                var cur_progress = 0;

                // uncompress
                Log("Decompressing packed files.");

                for (var i = 0; i < unpackFiles.Count; ++i)
                {
                    UpdateProress(cur_progress, 0, max_progress);
                    cur_progress += 1;

                    var unpackFile                 = unpackFiles[i];
                    var targetFilenameFull         = string.Format("{0}/{1}", outputArchiveFolder, unpackFile);
                    var targetFilenameUnpackedFull = $"{targetFilenameFull}.unpacked";

                    var meta = new TempFileMetadata();
                    meta.originalFilename = targetFilenameFull;
                    meta.unpackedFilename = targetFilenameUnpackedFull;
                    metadata.Add(meta);

                    meta.uncompressed = UnpackAFS_File(targetFilenameFull);
                    if (!meta.uncompressed)
                    {
                        Log($"Failed to uncompress {targetFilenameFull}! Did crappack fail?");
                        continue;
                    }
                }

                Log("Patching uncompressed files.");
                for (var i = 0; i < unpackFiles.Count; ++i)
                {
                    UpdateProress(cur_progress, 0, max_progress);
                    cur_progress += 1;

                    var unpackFile = unpackFiles[i];
                    var meta       = metadata[i];

                    if (!meta.uncompressed)
                    {
                        continue;
                    }

                    meta.patched = PatchFile(meta.unpackedFilename, patches);
                }

                Log("Recompressing patched files. This may take awhile.");
                for (var i = 0; i < unpackFiles.Count; ++i)
                {
                    UpdateProress(cur_progress, 0, max_progress);
                    cur_progress += 1;

                    var unpackFile = unpackFiles[i];
                    var meta       = metadata[i];

                    if (!meta.uncompressed || !meta.patched)
                    {
                        continue;
                    }

                    meta.recompressed = RepackAFS_File(meta.originalFilename, meta.unpackedFilename);
                    if (!meta.recompressed)
                    {
                        Log($"Failed to recompressed {meta.originalFilename}! Did crappack fail?");
                        continue;
                    }

                    meta.reinjected = ReinjectInAFS(archive, meta.originalFilename);
                    if (!meta.reinjected)
                    {
                        Log($"Failed to reinject {meta.originalFilename}");
                        continue;
                    }
                }

                // possibly keep for reference
                // note: unless deleted it will get put into the ISO
                var keepOldArchives = KeepOldArchivesCheckBox.Checked;
                if (keepOldArchives)
                {
                    Log("Cloning previous AFS.");
                    CloneOldAFS(inputArchiveFile);
                }

                Log("Rebuilding fresh AFS.");
                RebuildAFS(archive, inputArchiveFile); // rebuilds from scratch, using the modified instance
            }

            Log("Rebuilding fresh ISO.");
            RepackISO(tempFolder, outputFile, volumeLabel);

            // if checked, delete all the temp stuff we made
            var cleanup = CleanupCheckbox.Checked;

            if (cleanup)
            {
                RecursivelyDeleteDirectory(tempFolder);
                RecursivelyDeleteDirectory(tempFolderAFS);
            }
        }
Пример #2
0
        private void DoApplyPatchISO(string inputFile, string outputFile, string patchData, string archiveData)
        {
            var patches = GetPatches(patchData);

            DiscUtils.Complete.SetupHelper.SetupComplete();

            var tempFolder    = "./temp";
            var tempFolderAFS = "./tempAFS";

            if (!Directory.Exists(tempFolder))
            {
                Directory.CreateDirectory(tempFolder);
            }

            if (!Directory.Exists(tempFolderAFS))
            {
                Directory.CreateDirectory(tempFolderAFS);
            }

            var volumeLabel = string.Empty;

            ExtractISO(inputFile, tempFolder, out volumeLabel);
            volumeLabel += "_PATCHED";

            // which archive files contain the bin files we care about?
            var patchingFiles = new Dictionary <string, List <string> >();

            var archives = archiveData.Split(',');

            foreach (var archive in archives)
            {
                var fileList = new List <string>();
                fileList.Add("sub_main.bin");

                patchingFiles.Add(archive, fileList);
            }

            // previously hard coded
            //patchingFiles.Add("AFS_DATA.AFS", new List<string>() { ".bin" });

            foreach (var entry in patchingFiles)
            {
                var unpackAFS        = entry.Key;
                var unpackExtensions = entry.Value;

                var inputDataFile    = string.Format("{0}/{1}", tempFolder, unpackAFS);
                var outputDataFolder = string.Format("{0}/{1}", tempFolderAFS, unpackAFS);

                var archive = ExtractFromAFS(inputDataFile, outputDataFolder);


                // search for any archived files with the extensions we care about
                var unpackFiles = new List <string>();
                for (var d = 0; d < archive.directory.Length; ++d)
                {
                    var dir_entry = archive.directory[d];

                    for (var e = 0; e < unpackExtensions.Count; ++e)
                    {
                        var extension = unpackExtensions[e];
                        if (dir_entry.filename.Contains(extension)) // not exactly strict
                        {
                            unpackFiles.Add(dir_entry.filename);
                            break;
                        }
                    }
                }

                // uncompress, patch, recompress, reinject into AFS instance
                var metadata = new List <TempFileMetadata>();

                // update progress bar
                var max_progress = unpackFiles.Count * 3;
                var cur_progress = 0;

                // uncompress
                Log("Decompressing packed files.");

                for (var i = 0; i < unpackFiles.Count; ++i)
                {
                    UpdateProress(cur_progress, 0, max_progress);
                    cur_progress += 1;

                    var unpackFile                 = unpackFiles[i];
                    var targetFilenameFull         = string.Format("{0}/{1}", outputDataFolder, unpackFile);
                    var targetFilenameUnpackedFull = $"{targetFilenameFull}.unpacked";

                    var meta = new TempFileMetadata();
                    meta.originalFilename = targetFilenameFull;
                    meta.unpackedFilename = targetFilenameUnpackedFull;
                    metadata.Add(meta);

                    meta.uncompressed = UnpackAFS_File(targetFilenameFull);
                    if (!meta.uncompressed)
                    {
                        Log($"Failed to uncompress {targetFilenameFull}! Did crappack fail?");
                        continue;
                    }
                }

                Log("Patching uncompressed files.");
                for (var i = 0; i < unpackFiles.Count; ++i)
                {
                    UpdateProress(cur_progress, 0, max_progress);
                    cur_progress += 1;

                    var unpackFile = unpackFiles[i];
                    var meta       = metadata[i];

                    if (!meta.uncompressed)
                    {
                        continue;
                    }

                    meta.patched = PatchFile(meta.unpackedFilename, patches);
                }

                Log("Recompressing patched files. This may take awhile.");
                for (var i = 0; i < unpackFiles.Count; ++i)
                {
                    UpdateProress(cur_progress, 0, max_progress);
                    cur_progress += 1;

                    var unpackFile = unpackFiles[i];
                    var meta       = metadata[i];

                    if (!meta.uncompressed || !meta.patched)
                    {
                        continue;
                    }

                    meta.recompressed = RepackAFS_File(meta.originalFilename, meta.unpackedFilename);
                    if (!meta.recompressed)
                    {
                        Log($"Failed to recompressed {meta.originalFilename}! Did crappack fail?");
                        continue;
                    }

                    meta.reinjected = ReinjectInAFS(archive, meta.originalFilename);
                    if (!meta.reinjected)
                    {
                        Log($"Failed to reinject {meta.originalFilename}");
                        continue;
                    }
                }

                Log("Cloning previous AFS.");
                CloneOldAFS(inputDataFile); // for reference (note: unless deleted it will get put into the ISO)

                Log("Rebuilding fresh AFS.");
                RebuildAFS(archive, inputDataFile); // rebuilds from scratch, using the modified instance
            }

            Log("Rebuilding fresh ISO.");
            RepackISO(tempFolder, outputFile, volumeLabel);
        }