private bool HandleCommandLineArgs(string[] args, out int exitCode) { if (args.Length < 2) { exitCode = 0; return false; } //automation try { if (args[1].Equals("-dlcinject")) { if (args.Length % 2 != 1 || args.Length < 5) { MessageBox.Show("Wrong number of arguments for the -dlcinject switch.:\nSyntax is: <exe> -dlcinject SFARPATH SEARCHTERM NEWFILEPATH [SEARCHTERM2 NEWFILEPATH2]...", "ME3 DLCEditor2 Error", MessageBoxButton.OK, MessageBoxImage.Error); exitCode = 1; return true; } string dlcFileName = args[2]; int numfiles = (args.Length - 3) / 2; string[] filesToReplace = new string[numfiles]; string[] newFiles = new string[numfiles]; int argnum = 3; //starts at 3 for (int i = 0; i < filesToReplace.Length; i++) { filesToReplace[i] = args[argnum]; argnum++; newFiles[i] = args[argnum]; argnum++; } if (File.Exists(dlcFileName)) { DLCPackage dlc = new DLCPackage(dlcFileName); for (int i = 0; i < numfiles; i++) { int idx = dlc.FindFileEntry(filesToReplace[i]); if (idx == -1) { MessageBox.Show("DLCEditor2 automator encountered an error: the file to replace does not exist.", "ME3 DLCEditor2 Error", MessageBoxButton.OK, MessageBoxImage.Error); exitCode = 1; return true; } dlc.ReplaceEntry(newFiles[i], idx); } exitCode = 0; return true; } MessageBox.Show("Failed to autoinject: DLC file does not exist: " + dlcFileName, "ME3Explorer DLCEditor2 Error", MessageBoxButton.OK, MessageBoxImage.Error); exitCode = 1; return true; } else if (args[1].Equals("-dlcextract")) { if (args.Length != 5) { //-2 for me3explorer & -dlcextract MessageBox.Show("Wrong number of arguments for the -dlcextract switch.:\nSyntax is: <exe> -dlcextract SFARPATH SEARCHTERM EXTRACTIONPATH", "ME3 DLCEditor2 Error", MessageBoxButton.OK, MessageBoxImage.Error); exitCode = 1; return true; } string dlcFileName = args[2]; string searchTerm = args[3]; string extractionPath = args[4]; if (File.Exists(dlcFileName)) { DLCPackage dlc = new DLCPackage(dlcFileName); int idx = dlc.FindFileEntry(searchTerm); if (idx == -1) { MessageBox.Show("DLCEditor2 extraction automator encountered an error:\nThe file to replace does not exist or the tree has not been initialized.", "DLCEditor2 Error", MessageBoxButton.OK, MessageBoxImage.Error); exitCode = 1; return true; } using (FileStream fs = new FileStream(extractionPath, FileMode.Create, FileAccess.Write, FileShare.None, 4096, useAsync: true)) { dlc.DecompressEntryAsync(idx, fs).Wait(); } exitCode = 0; return true; } MessageBox.Show("Failed to autoextract: DLC file does not exist: " + dlcFileName, "ME3Explorer DLCEditor2 Error", MessageBoxButton.OK, MessageBoxImage.Error); exitCode = 1; return true; } else if (args[1].Equals("-dlcaddfiles")) { if (args.Length % 2 != 1 || args.Length < 5) { MessageBox.Show("Wrong number of arguments for the -dlcaddfiles switch.:\nSyntax is: <exe> -dlcinject SFARPATH INTERNALPATH NEWFILEPATH [INTERNALPATH2 NEWFILEPATH2]...", "ME3 DLCEditor2 Error", MessageBoxButton.OK, MessageBoxImage.Error); exitCode = 1; return true; } string dlcFileName = args[2]; int numfiles = (args.Length - 3) / 2; string[] internalPaths = new string[numfiles]; string[] sourcePaths = new string[numfiles]; int argnum = 3; //starts at 3 for (int i = 0; i < internalPaths.Length; i++) { internalPaths[i] = args[argnum]; argnum++; sourcePaths[i] = args[argnum]; argnum++; } if (File.Exists(dlcFileName)) { DLCPackage dlc = new DLCPackage(dlcFileName); for (int i = 0; i < internalPaths.Length; i++) { dlc.AddFileQuick(sourcePaths[i], internalPaths[i]); } exitCode = 0; return true; } MessageBox.Show("Failed to autoadd: DLC file does not exist: " + dlcFileName, "ME3Explorer DLCEditor2 Error", MessageBoxButton.OK, MessageBoxImage.Error); exitCode = 1; return true; } else if (args[1].Equals("-dlcremovefiles")) { if (args.Length < 4) { //-2 for me3explorer & -dlcextract MessageBox.Show("Wrong number of arguments for the -dlcremovefiles switch.:\nSyntax is: <exe> -dlcinject SFARPATH INTERNALPATH [INTERNALPATH2]...", "ME3 DLCEditor2 Error", MessageBoxButton.OK, MessageBoxImage.Error); exitCode = 1; return true; } string dlcFileName = args[2]; int numfiles = (args.Length - 3); string[] filesToRemove = new string[numfiles]; int argnum = 3; //starts at 3 for (int i = 0; i < filesToRemove.Length; i++) { filesToRemove[i] = args[argnum]; argnum++; } if (File.Exists(dlcFileName)) { DLCPackage dlc = new DLCPackage(dlcFileName); for (int i = 0; i < filesToRemove.Length; i++) { int idx = dlc.FindFileEntry(filesToRemove[i]); if (idx == -1) { MessageBox.Show("DLCEditor2 file removal automator encountered an error:\nThe file to remove does not exist or the tree has not been initialized.", "DLCEditor2 Error", MessageBoxButton.OK, MessageBoxImage.Error); exitCode = 1; return true; } dlc.DeleteEntry(idx); } exitCode = 0; return true; } MessageBox.Show("Failed to autoremove: DLC file does not exist: " + dlcFileName, "ME3Explorer DLCEditor2 Error", MessageBoxButton.OK, MessageBoxImage.Error); exitCode = 1; return true; } else if (args[1].Equals("-dlcunpack") || args[1].Equals("-dlcunpack-nodebug")) { if (args.Length != 4) { MessageBox.Show("Wrong number of arguments for automated DLC unpacking:\nSyntax is: <exe> -dlcunpack SFARPATH EXTRACTIONPATH", "ME3 DLCEditor2 Error", MessageBoxButton.OK, MessageBoxImage.Error); exitCode = 1; return true; } string sfarPath = args[2]; string autoUnpackFolder = args[3]; if (File.Exists(sfarPath)) { DLCPackage dlc = new DLCPackage(sfarPath); if (args[1].Equals("-dlcunpack")) { //open debugging window since this operation takes a long time. KFreonLib.Debugging.DebugOutput.StartDebugger("DLC Editor 2"); } //Simulate Unpack operation click. SFAREditor2.unpackSFAR(dlc); exitCode = 0; return true; } else { MessageBox.Show("Failed to autounpack: DLC file does not exist: " + sfarPath, "ME3Explorer DLCEditor2 Error", MessageBoxButton.OK, MessageBoxImage.Error); exitCode = 1; return true; } } else if (args[1].Equals("-toceditorupdate")) { //Legacy command requested by FemShep TOCeditor toc = new TOCeditor(); exitCode = toc.updateTOCFromCommandLine(args.Skip(2).ToList()); return true; } else if (args[1].Equals("-autotoc")) { if (args.Length == 2) { AutoTOC.GenerateAllTOCs(); } else { AutoTOC.prepareToCreateTOC(args[2]); } exitCode = 0; return true; } else if (args[1].Equals("-sfarautotoc")) { if (args.Length != 3) { MessageBox.Show("-sfarautotoc command line argument requires at least 1 parameter:\nSFARFILE.sfar", "Automated SFAR TOC Update Fail", MessageBoxButton.OK, MessageBoxImage.Error); exitCode = 1; return true; } var result = Parallel.For(2, args.Length, i => { if (args[i].EndsWith(".sfar") && File.Exists(args[i])) { DLCPackage DLC = new DLCPackage(args[2]); DLC.UpdateTOCbin(true); } }); exitCode = result.IsCompleted ? 0 : 1; return true; } else if (args[1].Equals("-decompresspcc")) { if (args.Length != 4) { MessageBox.Show("-decompresspcc command line argument requires 2 parameters:\ninputfile.pcc outputfile.pcc\nBoth arguments can be the same.", "Auto Decompression Error", MessageBoxButton.OK, MessageBoxImage.Error); exitCode = 1; return true; } exitCode = PCCRepack.autoDecompressPcc(args[2], args[3]); return true; } else if (args[1].Equals("-compresspcc")) { if (args.Length != 4) { MessageBox.Show("-compresspcc command line argument requires 2 parameters:\ninputfile.pcc outputfile.pcc\nBoth arguments can be the same.", "Auto Compression Error", MessageBoxButton.OK, MessageBoxImage.Error); exitCode = 1; return true; } exitCode = PCCRepack.autoCompressPcc(args[2], args[3]); return true; } } catch { exitCode = 1; return true; } string ending = Path.GetExtension(args[1]).ToLower(); switch (ending) { case ".pcc": PackageEditor editor = new PackageEditor(); editor.Show(); editor.LoadFile(args[1]); break; } exitCode = 0; return false; }