using System;
using System.Collections.Generic;
using SabreTools.Library.Data;
using SabreTools.Library.Help;
using SabreTools.Library.Tools;
namespace RombaSharp
{
///
/// Entry class for the RombaSharp application
///
///
/// In the database, we want to enable "offline mode". That is, when a user does an operation
/// that needs to read from the depot themselves, if the depot folder cannot be found, the
/// user is prompted to reconnect the depot OR skip that depot entirely.
///
public partial class RombaSharp
{
// General settings
private static string _logdir; // Log folder location
private static string _tmpdir; // Temp folder location
private static string _webdir; // Web frontend location
private static string _baddir; // Fail-to-unpack file folder location
private static int _verbosity; // Verbosity of the output
private static int _cores; // Forced CPU cores
// DatRoot settings
private static string _dats; // DatRoot folder location
private static string _db; // Database name
// Depot settings
private static Dictionary> _depots; // Folder location, Max size
// Server settings
private static int _port; // Web server port
// Other private variables
private const string _config = "config.xml";
private const string _dbSchema = "rombasharp";
private static string _connectionString;
private static Help _help;
///
/// Entry class for the RombaSharp application
///
public static void Main(string[] args)
{
// Perform initial setup and verification
Globals.Logger = new Logger(true, "romba.log");
InitializeConfiguration();
DatabaseTools.EnsureDatabase(_dbSchema, _db, _connectionString);
// Create a new Help object for this program
_help = RombaSharp.RetrieveHelp();
// Get the location of the script tag, if it exists
int scriptLocation = (new List(args)).IndexOf("--script");
// If output is being redirected or we are in script mode, don't allow clear screens
if (!Console.IsOutputRedirected && scriptLocation == -1)
{
Console.Clear();
Build.PrepareConsole("RombaSharp");
}
// Now we remove the script tag because it messes things up
if (scriptLocation > -1)
{
List newargs = new List(args);
newargs.RemoveAt(scriptLocation);
args = newargs.ToArray();
}
// Credits take precidence over all
if ((new List(args)).Contains("--credits"))
{
_help.OutputCredits();
Globals.Logger.Close();
return;
}
// If there's no arguments, show help
if (args.Length == 0)
{
_help.OutputGenericHelp();
Globals.Logger.Close();
return;
}
// Get the first argument as a feature flag
string featureName = args[0];
// Verify that the flag is valid
if (!_help.TopLevelFlag(featureName))
{
Globals.Logger.User($"'{featureName}' is not valid feature flag");
_help.OutputIndividualFeature(featureName);
Globals.Logger.Close();
return;
}
// Get the proper name for the feature
featureName = _help.GetFeatureName(featureName);
// Get the associated feature
RombaSharpFeature feature = _help[featureName] as RombaSharpFeature;
// If we had the help feature first
if (featureName == HelpFeature.Value || featureName == DetailedHelpFeature.Value)
{
feature.ProcessArgs(args, _help);
Globals.Logger.Close();
return;
}
// Now verify that all other flags are valid
if (!feature.ProcessArgs(args, _help))
{
Globals.Logger.Close();
return;
}
// Now process the current feature
Dictionary features = _help.GetEnabledFeatures();
switch (featureName)
{
case DetailedHelpFeature.Value:
case HelpFeature.Value:
case ScriptFeature.Value:
// No-op as this should be caught
break;
// Require input verification
case ArchiveFeature.Value:
case BuildFeature.Value:
case DatStatsFeature.Value:
case FixdatFeature.Value:
case ImportFeature.Value:
case LookupFeature.Value:
case MergeFeature.Value:
case MissFeature.Value:
case RescanDepotsFeature.Value:
VerifyInputs(feature.Inputs, featureName);
feature.ProcessFeatures(features);
break;
// Requires no input verification
case CancelFeature.Value:
case DbStatsFeature.Value:
case DiffdatFeature.Value:
case Dir2DatFeature.Value:
case EDiffdatFeature.Value:
case ExportFeature.Value:
case MemstatsFeature.Value:
case ProgressFeature.Value:
case PurgeBackupFeature.Value:
case PurgeDeleteFeature.Value:
case RefreshDatsFeature.Value:
case ShutdownFeature.Value:
case VersionFeature.Value:
feature.ProcessFeatures(features);
break;
// If nothing is set, show the help
default:
_help.OutputGenericHelp();
break;
}
Globals.Logger.Close();
return;
}
private static void VerifyInputs(List inputs, string feature)
{
if (inputs.Count == 0)
{
Globals.Logger.Error("This feature requires at least one input");
_help.OutputIndividualFeature(feature);
Environment.Exit(0);
}
}
}
}