using System; using System.Collections; using System.Collections.Specialized; using System.ComponentModel; using System.Data; using System.Drawing; using System.IO; using System.Threading; using System.Windows.Forms; using HakInstaller.Utilities; using NWN; namespace HakInstaller { /// /// Class to contain the application's main method. /// public class MainContainer { #region private static fields/properties/methods private static bool consoleMode = false; private static bool installPathGiven = false; private static StringCollection hifStrings = new StringCollection(); private static StringCollection moduleStrings = new StringCollection(); /// /// Either displays the message in a message box or on the command line, /// depending on whether the application is running in console mode or not. /// /// The format string /// The format arguments private static void ShowMessage(string format, params object[] args) { System.Text.StringBuilder b = new System.Text.StringBuilder(); b.AppendFormat(format, args); if (consoleMode) Console.WriteLine(b.ToString()); else MessageBox.Show(b.ToString(), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); } /// /// Validates all of the files in the collection to make sure that they /// exist. /// /// The list of files to validate /// True if all files exist private static bool ValidateFiles(StringCollection files) { // Make sure all of the source files exist. foreach (string file in files) if (!File.Exists(Path.Combine(NWNInfo.GetPathForFile(file), file))) { ShowMessage("The file {0} does not exist", file); return false; } return true; } /// /// Runs the application in console mode, silently adding the haks to /// the modules given on the command line. /// /// 0 if successful, otherwise -1 private static int ConsoleMode() { // Validate the files, if we fail validation then exit now. if (!ValidateFiles(hifStrings) || !ValidateFiles(moduleStrings)) return -1; // Convert the string collections to arrays and install the haks // in the modules. string[] hifs = new string[hifStrings.Count]; hifStrings.CopyTo(hifs, 0); string[] modules = new string[moduleStrings.Count]; moduleStrings.CopyTo(modules, 0); try { HakInstaller.InstallHaks(hifs, modules, null); } catch (Exception e) { Console.WriteLine(e.Message); } return 0; } /// /// Terminates the application. /// /// True if help should be displayed. private static void Terminate(bool showHelp) { if (showHelp) Help(); throw new EntryPointNotFoundException(); } /// /// Displays help /// private static void Help() { Console.WriteLine("HakInstaller: install hak/erf/tlk files in modules"); Console.WriteLine("Usage: HakInstaller -n file.hif/mod ..."); Console.WriteLine(" -n:Specifies the NWN install path, if this is not given"); Console.WriteLine(" then it will be read from the registry."); Console.WriteLine(""); Console.WriteLine("One or more .hif and .mod files may be specified on the command"); Console.WriteLine("line, if none are given a UI will be displayed allowing you to"); Console.WriteLine("choose the hif/mod files. Paths should not be given on the files"); Console.WriteLine("they will be searched for in the appropriate subdirectories of"); Console.WriteLine("the NWN install path (as either given on the command line or read"); Console.WriteLine("from the registry)."); } /// /// Processes command line arguments. /// /// private static void ProcessArguments(string[] args) { foreach (string arg in args) { // Process any command line switches. if ('-' == arg[0] || '/' == arg[1]) { switch (arg[1]) { case 'n': case 'N': // The NWN install path was specified on the command line, // save it to override whatever is in the registry. installPathGiven = true; NWNInfo.InstallPath = arg.Substring(2); // Make sure that the directory exists. if (!Directory.Exists(NWNInfo.InstallPath)) { ShowMessage("The path '{0}' does not exist.", NWNInfo.InstallPath); Terminate(false); } break; default: Help(); break; } } else { // If we get a hif or module on the command line then we // are in console mode. consoleMode = true; string extension = Path.GetExtension(arg); if (0 == string.Compare(".hif", extension, true)) hifStrings.Add(arg); else if (0 == string.Compare(".mod", extension, true)) moduleStrings.Add(arg); else { Console.WriteLine("Unknown file {0}\n", arg); Terminate(true); } } } // We must have at least one hif and one mod if we are in console mode. if (consoleMode && (0 == hifStrings.Count || 0 == moduleStrings.Count)) { Console.WriteLine("Must specify at least one .mod and one .hif file\n"); Terminate(true); } } /// /// The main entry point for the application. /// [STAThread] static int Main(string[] args) { try { // Process command line arguments. ProcessArguments(args); // Make sure NWN is installed before doing anything. If the user // gave an install path on the command line we could be installing on // a remote machine, so do not check for an install on this machine. if (!installPathGiven && !NWNInfo.IsInstalled) { ShowMessage("Neverwinter Nights is not installed"); return -1; } if (consoleMode) return ConsoleMode(); else { // Requires .NET framework 1.1 //Application.EnableVisualStyles(); Application.Run(new InstallForm()); return 0; } } catch (EntryPointNotFoundException) { // Dummy exception thrown to terminate the application by Help(), // don't display anything just return -1. return -1; } catch (Exception e) { ShowMessage(e.Message); return -1; } } #endregion } }