public VersionitConsole(string[] args,IVersionRepository versionRepository)
     : base("Versionit")
 {
     _args = args;
     _versionRepository = versionRepository;
     _logger = new ConsoleUtility();
     _setupParameters = new SetupParameters();
     _fileUtility = new FileUtility();
     _sqlMessageUtility = new SqlMessageUtility();
 }
        /// <summary>
        ///     Used for make image url to be base64 url, single item single image
        /// </summary>
        /// <param name="item">Model has image</param>
        /// <param name="fileUtility">file utility helper</param>
        /// <param name="folderName">folder group name => Manufacturer, Product, Category</param>
        /// <param name="cancellationToken"></param>
        /// <returns>base64 format image model</returns>
        public static async Task <T> GetImageBase64UrlAsync(T item, IFileUtility fileUtility, string folderName,
                                                            CancellationToken cancellationToken)
        {
            var imageFileExtension = Path.GetExtension(item.ImageName);

            var buffer = await fileUtility.ReadFileAsync(folderName + "/" + item.Id, item.ImageName, cancellationToken);

            item.ImageUrl = "data:image/" + imageFileExtension.Substring(1) + ";base64," +
                            Convert.ToBase64String(buffer);
            return(item);
        }
Example #3
0
 public MediaService(IMediaRepository mediaRepository,
                     IWebHostEnvironment webHostEnvironment,
                     IConfiguration configuration,
                     IFileUtility fileUtility,
                     IFileSystem fileSystem)
 {
     _mediaRepository    = mediaRepository;
     _webHostEnvironment = webHostEnvironment;
     _configuration      = configuration;
     _fileUtility        = fileUtility;
     _fileSystem         = fileSystem;
 }
        public PermissionsStore(IFileUtility fileUtility, IConfiguration configuration)
        {
            _urlTemplateTable           = new UriTemplateTable();
            _scopesListTable            = new Dictionary <int, object>();
            _delegatedScopesInfoTable   = new Dictionary <string, ScopeInformation>();
            _applicationScopesInfoTable = new Dictionary <string, ScopeInformation>();
            _fileUtility          = fileUtility;
            _permissionsFilePaths = configuration.GetSection("Permissions:FilePaths").Get <List <string> >();
            _scopesInformation    = configuration["Permissions:ScopesInformationList"];

            SeedTables();
        }
Example #5
0
 public BasicSetupRepository(UserManager <ApplicationUser> userManager, IEmailService emailService,
                             IHostingEnvironment environment, IStringConstants stringConstants,
                             ConnectionString connectionString, EmailSettings emailSettings, IDbUtility dbUtility, IFileUtility fileUtility)
 {
     _userManager      = userManager;
     _emailService     = emailService;
     _environment      = environment;
     _stringConstants  = stringConstants;
     _connectionString = connectionString;
     _emailSettings    = emailSettings;
     _dbUtility        = dbUtility;
     _fileUtility      = fileUtility;
 }
Example #6
0
        private protected ExportedModuleBase(ILogger logger, AppSettings configuration, IFileUtility fileUtility, IGlobalCache globalCache, MbbsModule module, PointerDictionary <SessionBase> channelDictionary)
        {
            _logger        = logger;
            _configuration = configuration;
            _fileFinder    = fileUtility;
            _globalCache   = globalCache;

            Module            = module;
            ChannelDictionary = channelDictionary;

            FilePointerDictionary = new PointerDictionary <FileStream>(1, int.MaxValue);
            McvPointerDictionary  = new PointerDictionary <McvFile>();
        }
Example #7
0
 /// <summary>
 /// Initializes a new instance of the <see cref="ConsoleValidator"/> class.
 /// </summary>
 /// <param name="logger">The logger.</param>
 /// <param name="settings">The settings.</param>
 /// <param name="fileUtility">The file utility.</param>
 /// <param name="directoryUtility">The directory utility.</param>
 /// <param name="pathUtility">The path utility.</param>
 public ConsoleValidator(
     ILogger logger,
     IHyperValidatorSettings settings,
     IFileUtility fileUtility,
     IDirectoryUtility directoryUtility,
     IPathUtility pathUtility)
 {
     Logger           = logger;
     Settings         = settings;
     FileUtility      = fileUtility;
     DirectoryUtility = directoryUtility;
     PathUtility      = pathUtility;
 }
Example #8
0
 public CloudProxyController(ILogger <TController> logger, IAdaptationServiceClient <AdaptationOutcomeProcessor> adaptationServiceClient, IFileUtility fileUtility,
                             ICloudSdkConfiguration cloudSdkConfiguration, IProcessingConfiguration processingConfiguration, IStoreConfiguration storeConfiguration, IZipUtility zipUtility,
                             IHttpService httpService)
 {
     _logger                  = logger ?? throw new ArgumentNullException(nameof(logger));
     _fileUtility             = fileUtility ?? throw new ArgumentNullException(nameof(fileUtility));
     _cloudSdkConfiguration   = cloudSdkConfiguration ?? throw new ArgumentNullException(nameof(cloudSdkConfiguration));
     _processingConfiguration = processingConfiguration ?? throw new ArgumentNullException(nameof(processingConfiguration));
     _storeConfiguration      = storeConfiguration ?? throw new ArgumentNullException(nameof(storeConfiguration));
     _adaptationServiceClient = adaptationServiceClient ?? throw new ArgumentNullException(nameof(adaptationServiceClient));
     _zipUtility              = zipUtility ?? throw new ArgumentNullException(nameof(zipUtility));
     _httpService             = httpService ?? throw new ArgumentNullException(nameof(httpService));
 }
Example #9
0
        public MsgFile(IFileUtility fileUtility, string modulePath, string msgName)
        {
            MsgValues    = new Dictionary <string, byte[]>();
            _modulePath  = modulePath;
            _moduleName  = msgName;
            _fileUtility = fileUtility;

            FileName          = $"{msgName.ToUpper()}.MSG";
            FileNameAtRuntime = $"{msgName.ToUpper()}.MCV";

            _logger.Debug($"({_moduleName}) Compiling MCV from {FileName}");
            BuildMCV();
        }
Example #10
0
        private protected static readonly byte[] NEW_LINE          = { (byte)'\r', (byte)'\n' }; //Just easier to read

        private protected ExportedModuleBase(MbbsModule module, PointerDictionary <SessionBase> channelDictionary)
        {
            _logger        = ServiceResolver.GetService <ILogger>();
            _configuration = ServiceResolver.GetService <IConfiguration>();
            _fileFinder    = ServiceResolver.GetService <IFileUtility>();
            _globalCache   = ServiceResolver.GetService <IGlobalCache>();

            Module            = module;
            ChannelDictionary = channelDictionary;

            FilePointerDictionary       = new PointerDictionary <FileStream>(1, int.MaxValue);
            McvPointerDictionary        = new PointerDictionary <McvFile>();
            BtrievePointerDictionaryNew = new Dictionary <IntPtr16, BtrieveFileProcessor>();
        }
Example #11
0
 /// <summary>
 /// Initializes a new instance of the <see cref="SystemRepository" /> class.
 /// </summary>
 /// <param name="settings">The settings.</param>
 /// <param name="logger">The logger.</param>
 /// <param name="directoryUtility">The directory utility.</param>
 /// <param name="fileUtility">The file utility.</param>
 /// <param name="pathUtility">The path utility.</param>
 /// <param name="consoleRepository">The console repository.</param>
 public SystemRepository(
     IHyperValidatorSettings settings,
     ILogger logger,
     IDirectoryUtility directoryUtility,
     IFileUtility fileUtility,
     IPathUtility pathUtility,
     IConsoleRepository consoleRepository)
 {
     Settings          = settings;
     Logger            = logger;
     DirectoryUtility  = directoryUtility;
     FileUtility       = fileUtility;
     PathUtility       = pathUtility;
     ConsoleRepository = consoleRepository;
 }
        public ScriptCommand(SetupParameters setupParameters, 
                             IVersionRepository versionRepository,
                            IFileUtility fileUtility,
                            IMessageUtility messageUtility)
        {
            _setupParameters = setupParameters;

            _utility = new ConsoleUtility();

            _versionRepository = versionRepository;

            _fileUtility = fileUtility;

            _messageUtility = messageUtility;
        }
Example #13
0
 public SamplesStore(IConfiguration configuration, IHttpClientUtility httpClientUtility,
                     IFileUtility fileUtility, IMemoryCache samplesCache)
 {
     _configuration = configuration
                      ?? throw new ArgumentNullException(nameof(configuration), $"{ NullValueError }: { nameof(configuration) }");
     _httpClientUtility = httpClientUtility
                          ?? throw new ArgumentNullException(nameof(httpClientUtility), $"{ NullValueError }: { nameof(httpClientUtility) }");
     _fileUtility = fileUtility
                    ?? throw new ArgumentNullException(nameof(fileUtility), $"{ NullValueError }: { nameof(fileUtility) }");
     _samplesCache = samplesCache
                     ?? throw new ArgumentNullException(nameof(samplesCache), $"{ NullValueError }: { nameof(samplesCache) }");;
     _sampleQueriesContainerName = _configuration["BlobStorage:Containers:SampleQueries"];
     _sampleQueriesBlobName      = _configuration["BlobStorage:Blobs:SampleQueries"];
     _defaultRefreshTimeInHours  = FileServiceHelper.GetFileCacheRefreshTime(configuration["FileCacheRefreshTimeInHours:SampleQueries"]);
 }
Example #14
0
 /// <summary>
 /// Initializes a new instance of the <see cref="GameRepository"/> class.
 /// </summary>
 /// <param name="settings">The settings.</param>
 /// <param name="logger">The logger.</param>
 /// <param name="directoryUtility">The directory utility.</param>
 /// <param name="fileUtility">The file utility.</param>
 /// <param name="pathUtility">The path utility.</param>
 /// <param name="consoleSerializer">The console serializer.</param>
 public GameRepository(
     IHyperValidatorSettings settings,
     ILogger logger,
     IDirectoryUtility directoryUtility,
     IFileUtility fileUtility,
     IPathUtility pathUtility,
     IConsoleSerializer consoleSerializer)
 {
     Settings          = settings;
     Logger            = logger;
     DirectoryUtility  = directoryUtility;
     FileUtility       = fileUtility;
     PathUtility       = pathUtility;
     ConsoleSerializer = consoleSerializer;
 }
Example #15
0
 public DocxGenerator(
     IConfiguration configuration,
     ITimeService timeService,
     IFileUtility fileUtility,
     IFileService fileService,
     IAzureStorageService azureStorageService,
     IOvertimeUtility overtimeUtility,
     ILogger <DocxGenerator> logger)
 {
     _configuration       = configuration;
     _timeService         = timeService;
     _fileUtility         = fileUtility;
     _fileService         = fileService;
     _azureStorageService = azureStorageService;
     _overtimeUtility     = overtimeUtility;
     _logger = logger;
 }
 public PermissionsStore(IConfiguration configuration, IHttpClientUtility httpClientUtility,
                         IFileUtility fileUtility, IMemoryCache permissionsCache)
 {
     _configuration = configuration
                      ?? throw new ArgumentNullException(nameof(configuration), $"{ NullValueError }: { nameof(configuration) }");
     _permissionsCache = permissionsCache
                         ?? throw new ArgumentNullException(nameof(permissionsCache), $"{ NullValueError }: { nameof(permissionsCache) }");
     _httpClientUtility = httpClientUtility
                          ?? throw new ArgumentNullException(nameof(httpClientUtility), $"{ NullValueError }: { nameof(httpClientUtility) }");
     _fileUtility = fileUtility
                    ?? throw new ArgumentNullException(nameof(fileUtility), $"{ NullValueError }: { nameof(fileUtility) }");
     _permissionsContainerName = configuration[PermissionsContainerBlobConfig]
                                 ?? throw new ArgumentNullException(nameof(PermissionsContainerBlobConfig), $"Config path missing: { PermissionsContainerBlobConfig }");
     _permissionsBlobNames = configuration.GetSection(PermissionsNamesBlobConfig).Get <List <string> >()
                             ?? throw new ArgumentNullException(nameof(PermissionsNamesBlobConfig), $"Config path missing: { PermissionsNamesBlobConfig }");
     _scopesInformation = configuration[ScopesInfoBlobConfig]
                          ?? throw new ArgumentNullException(nameof(ScopesInfoBlobConfig), $"Config path missing: { ScopesInfoBlobConfig }");
     _defaultRefreshTimeInHours = FileServiceHelper.GetFileCacheRefreshTime(configuration[CacheRefreshTimeConfig]);
 }
        /// <summary>
        ///     Constructor to load the specified Btrieve File at the given Path
        /// </summary>
        /// <param name="fileUtility"></param>
        /// <param name="path"></param>
        /// <param name="fileName"></param>
        public BtrieveFileProcessor(IFileUtility fileUtility, string path, string fileName)
        {
            _fileFinder = fileUtility;

            Keys = new Dictionary <ushort, BtrieveKey>();
            AutoincrementedKeys = new Dictionary <ushort, BtrieveKey>();

            if (string.IsNullOrEmpty(path))
            {
                path = Directory.GetCurrentDirectory();
            }

            if (!Path.EndsInDirectorySeparator(path))
            {
                path += Path.DirectorySeparatorChar;
            }

            var loadedFileName = _fileFinder.FindFile(path, fileName);

            // hack for MUTANTS which tries to load a DATT file
            if (Path.GetExtension(loadedFileName).ToUpper() == ".DATT")
            {
                loadedFileName = Path.ChangeExtension(loadedFileName, ".DAT");
            }

            // If a .DB version exists, load it over the .DAT file
            var dbFileName = loadedFileName.ToUpper().Replace(".DAT", ".DB");
            var fullPath   = Path.Combine(path, dbFileName);

            if (File.Exists(fullPath))
            {
                LoadSqlite(fullPath);
            }
            else
            {
                var btrieveFile = new BtrieveFile();
                btrieveFile.LoadFile(_logger, path, loadedFileName);
                CreateSqliteDB(fullPath, btrieveFile);
            }

            //Set Position to First Record
            StepFirst();
        }
Example #18
0
 /// <summary>
 /// Initializes a new instance of the <see cref="ConsoleRepository" /> class.
 /// </summary>
 /// <param name="settings">The settings.</param>
 /// <param name="logger">The logger.</param>
 /// <param name="directoryUtility">The directory utility.</param>
 /// <param name="fileUtility">The file utility.</param>
 /// <param name="pathUtility">The path utility.</param>
 /// <param name="consoleSerializer">The console serializer.</param>
 /// <param name="databaseSerializer">The database serializer.</param>
 /// <param name="gameValidator">The game validator.</param>
 /// <param name="consoleValidator">The console validator.</param>
 public ConsoleRepository(
     IHyperValidatorSettings settings,
     ILogger logger,
     IDirectoryUtility directoryUtility,
     IFileUtility fileUtility,
     IPathUtility pathUtility,
     IConsoleSerializer consoleSerializer,
     IDatabaseSerializer databaseSerializer,
     IGameValidator gameValidator,
     IConsoleValidator consoleValidator)
 {
     Settings           = settings;
     Logger             = logger;
     DirectoryUtility   = directoryUtility;
     FileUtility        = fileUtility;
     PathUtility        = pathUtility;
     ConsoleSerializer  = consoleSerializer;
     DatabaseSerializer = databaseSerializer;
     GameValidator      = gameValidator;
     ConsoleValidator   = consoleValidator;
 }
Example #19
0
        public MbbsHost(ILogger logger, IGlobalCache globalCache, IFileUtility fileUtility, IEnumerable <IHostRoutine> mbbsRoutines, IConfiguration configuration, IEnumerable <IGlobalRoutine> globalRoutines)
        {
            _logger         = logger;
            _globalCache    = globalCache;
            _fileUtility    = fileUtility;
            _mbbsRoutines   = mbbsRoutines;
            _configuration  = configuration;
            _globalRoutines = globalRoutines;

            _logger.Info("Constructing MBBSEmu Host...");

            _channelDictionary = new PointerDictionary <SessionBase>();
            _modules           = new Dictionary <string, MbbsModule>();
            _exportedFunctions = new Dictionary <string, IExportedModule>();
            _realTimeStopwatch = Stopwatch.StartNew();
            _incomingSessions  = new Queue <SessionBase>();
            _cleanupTime       = ParseCleanupTime();
            _timer             = new Timer(unused => _performCleanup = true, this, NowUntil(_cleanupTime), TimeSpan.FromDays(1));

            _logger.Info("Constructed MBBSEmu Host!");
        }
Example #20
0
        /// <summary>
        /// Creates a mocked IPermissionsStore object.
        /// </summary>
        /// <param name="configFilePath">Optional: The path of the config file.</param>
        /// <param name="configuration">Optional: Mock <see cref="IConfigurationRoot"/> object.</param>
        /// <param name="fileUtility">Optional: Mock <see cref="IFileUtility"/> object.</param>
        /// <param name="httpClientUtility">Optional: Mock <see cref="IHttpClientUtility"/> object.</param>
        /// <param name="permissionsCache">Optional: Mock <see cref="IMemoryCache"/> object.</param>
        /// <returns>A mocked IPermissionsStore object.</returns>
        public static IPermissionsStore GetPermissionStore(string configFilePath                = null,
                                                           IConfigurationRoot configuration     = null,
                                                           IFileUtility fileUtility             = null,
                                                           IHttpClientUtility httpClientUtility = null,
                                                           IMemoryCache permissionsCache        = null)
        {
            if (string.IsNullOrEmpty(configFilePath) && configuration == null)
            {
                // Either the configFilePath or the configuration parameters needs to be specified,
                // that is, they can't both be null.
                throw new ArgumentNullException($"{nameof(configFilePath)} and {nameof(configuration)}",
                                                $"Specify values for either {nameof(configFilePath)} or {nameof(configuration)}");
            }

            fileUtility ??= new FileUtilityMock();
            httpClientUtility ??= new FileUtilityMock();
            permissionsCache ??= Create.MockedMemoryCache();
            configuration ??= new ConfigurationBuilder()
            .AddJsonFile(configFilePath)
            .Build();

            return(new PermissionsStore(configuration, httpClientUtility, fileUtility, permissionsCache));
        }
        public FileTypeDetectionController(IAdaptationServiceClient <AdaptationOutcomeProcessor> adaptationServiceClient, IStoreConfiguration storeConfiguration,
                                           IProcessingConfiguration processingConfiguration, ILogger <FileTypeDetectionController> logger, IFileUtility fileUtility, ITracer tracer) : base(logger)
        {
            _adaptationServiceClient = adaptationServiceClient ?? throw new ArgumentNullException(nameof(adaptationServiceClient));
            _fileUtility             = fileUtility ?? throw new ArgumentNullException(nameof(fileUtility));
            if (storeConfiguration == null)
            {
                throw new ArgumentNullException(nameof(storeConfiguration));
            }

            if (processingConfiguration == null)
            {
                throw new ArgumentNullException(nameof(processingConfiguration));
            }

            _processingTimeoutDuration         = processingConfiguration.ProcessingTimeoutDuration;
            _processingCancellationTokenSource = new CancellationTokenSource(_processingTimeoutDuration);

            _originalStorePath = storeConfiguration.OriginalStorePath;
            _rebuiltStorePath  = storeConfiguration.RebuiltStorePath;

            _tracer = tracer;
        }
Example #22
0
        /// <summary>
        ///     Constructor to load the specified Btrieve File at the given Path
        /// </summary>
        /// <param name="fileName"></param>
        /// <param name="path"></param>
        public BtrieveFileProcessor(string fileName, string path)
        {
            _fileFinder = DependencyInjection.ServiceResolver.GetService <IFileUtility>();

            if (string.IsNullOrEmpty(path))
            {
                path = Directory.GetCurrentDirectory();
            }

            if (!path.EndsWith(Path.DirectorySeparatorChar))
            {
                path += Path.DirectorySeparatorChar;
            }

            LoadedFilePath = path;
            LoadedFileName = _fileFinder.FindFile(path, fileName);

            //If a .EMU version exists, load it over the .DAT file
            var jsonFileName = LoadedFileName.ToUpper().Replace(".DAT", ".EMU");

            if (File.Exists($"{LoadedFilePath}{jsonFileName}"))
            {
                LoadedFileName = jsonFileName;
                LoadJson(LoadedFilePath, LoadedFileName);
            }
            else
            {
                LoadBtrieve(LoadedFilePath, LoadedFileName);
                SaveJson();
            }

            //Ensure loaded records (regardless of source) are in order by their offset within the Btrieve file
            LoadedFile.Records = LoadedFile.Records.OrderBy(x => x.Offset).ToList();

            //Set Position to First Record
            Position = LoadedFile.Records.OrderBy(x => x.Offset).FirstOrDefault()?.Offset ?? 0;
        }
Example #23
0
 internal Phapi(IClock clock, ILogger logger, AppSettings configuration, IFileUtility fileUtility, IGlobalCache globalCache, MbbsModule module, PointerDictionary <SessionBase> channelDictionary) : base(
         clock, logger, configuration, fileUtility, globalCache, module, channelDictionary)
 {
 }
 public GraphExplorerSamplesAdminController(IFileUtility fileUtility, IConfiguration configuration, IOptionsMonitor <SamplesAdministrators> administrators)
 {
     _fileUtility            = fileUtility;
     _policiesFilePathSource = configuration["Samples:SampleQueriesPoliciesFilePathName"]; // sets the path of the policies file
     _administrators         = administrators.CurrentValue;                                // sets the list of samples administrators
 }
Example #25
0
 public Worker(IFileUtility fileUtility)
 {
     _fileUtility = fileUtility;
 }
Example #26
0
 internal Doscalls(IClock clock, ILogger logger, AppSettings configuration, IFileUtility fileUtility, IGlobalCache globalCache, MbbsModule module, PointerDictionary <SessionBase> channelDictionary, ITextVariableService textVariableService) : base(
         clock, logger, configuration, fileUtility, globalCache, module, channelDictionary, textVariableService)
 {
 }
 public GraphExplorerSamplesController(IFileUtility fileUtility, IConfiguration configuration)
 {
     _fileUtility            = fileUtility;
     _queriesFilePathSource  = configuration["Samples:SampleQueriesFilePathName"];         // sets the path of the sample queries JSON file
     _policiesFilePathSource = configuration["Samples:SampleQueriesPoliciesFilePathName"]; // sets the path of the sample queries policies JSON file
 }
Example #28
0
 /// <summary>
 /// Creates a new repository.
 /// </summary>
 /// <param name="invoiceManager">The invoice manager to use</param>
 public RemoteRepository(IInvoiceManager invoiceManager, IContext context, IWebClientUtility webClientUtility, IFileUtility fileUtility)
 {
     this.invoiceManager   = invoiceManager;
     this.context          = context;
     this.webClientUtility = webClientUtility;
     this.fileUtility      = fileUtility;
 }
Example #29
0
 /// <summary>
 /// Creates a new documentation manager.
 /// </summary>
 /// <param name="remoteRepository">The remote respository to download versions from.</param>
 /// <param name="fileUtility">The file utility to use.</param>
 /// <param name="installationDirectory">The directory to place DR documentation in.</param>
 public DocumentationManager(IRemoteRepository remoteRepository, IFileUtility fileUtility, string installationDirectory)
 {
     this.installationDirectory = installationDirectory;
     this.remoteRepository      = remoteRepository;
     this.fileUtility           = fileUtility;
 }
Example #30
0
 public Problem022(IFileUtility fileUtility)
 {
     FileUtility = fileUtility;
 }
Example #31
0
        public void WriteConversations(string sender, IList <FacebookConversation> conversations, string outputDirectory, IFileUtility fileUtility)
        {
            // Clean up the conversations which seem to be with a single person to include the sender.
            foreach (var conversation in conversations)
            {
                if (conversation.Participants.Count < 2 && conversation.Participants.First() != sender)
                {
                    conversation.Participants.Add(sender);
                }
            }

            foreach (var conversationGroup in conversations.GroupBy(g => g.Participants.OrderBy(o => o).Aggregate((a, b) => a.Trim() + b.Trim())))
            {
                var conversationList       = conversationGroup.ToList();
                var serializedConversation = JsonConvert.SerializeObject(conversationList);
                var filePath = Path.Combine(outputDirectory, (conversationList.First().Participants.Take(5).Aggregate((a, b) => a + "-" + b)).Replace("/", "-").Replace(":", "-").Replace("facebook.com", string.Empty));

                if (fileUtility.Exists(filePath))
                {
                    fileUtility.Delete(filePath);
                }

                fileUtility.WriteAllText(filePath, serializedConversation);
            }
        }
Example #32
0
 internal Doscalls(ILogger logger, AppSettings configuration, IFileUtility fileUtility, IGlobalCache globalCache, MbbsModule module, PointerDictionary <SessionBase> channelDictionary) : base(
         logger, configuration, fileUtility, globalCache, module, channelDictionary)
 {
 }
Example #33
0
        /// <summary>
        ///     Constructor for MbbsModule
        ///
        ///     Pass in an empty/blank moduleIdentifier for a Unit Test/Fake Module
        /// </summary>
        /// <param name="logger"></param>
        /// <param name="moduleIdentifier">Will be null in a test</param>
        /// <param name="path"></param>
        /// <param name="memoryCore"></param>
        /// <param name="fileUtility"></param>
        public MbbsModule(IFileUtility fileUtility, IClock clock, ILogger logger, string moduleIdentifier, string path = "", MemoryCore memoryCore = null)
        {
            _fileUtility = fileUtility;
            _logger      = logger;
            _clock       = clock;

            ModuleIdentifier = moduleIdentifier;
            ModuleDlls       = new List <MbbsDll>();


            //Sanitize and setup Path
            if (string.IsNullOrEmpty(path))
            {
                path = Directory.GetCurrentDirectory();
            }

            if (!Path.EndsInDirectorySeparator(path))
            {
                path += Path.DirectorySeparatorChar;
            }

            ModulePath = path;

            // will be null in tests
            if (string.IsNullOrEmpty(ModuleIdentifier))
            {
                Mdf = MdfFile.createForTest();
                ModuleDlls.Add(new MbbsDll(fileUtility, logger)
                {
                    File = NEFile.createForTest()
                });
            }
            else
            {
                //Verify MDF File Exists
                var mdfFile         = fileUtility.FindFile(ModulePath, $"{ModuleIdentifier}.MDF");
                var fullMdfFilePath = Path.Combine(ModulePath, mdfFile);
                if (!System.IO.File.Exists(fullMdfFilePath))
                {
                    throw new FileNotFoundException($"Unable to locate Module: {fullMdfFilePath}");
                }

                Mdf = new MdfFile(fullMdfFilePath);
                var moduleDll = new MbbsDll(fileUtility, logger);
                moduleDll.Load(Mdf.DLLFiles[0].Trim(), ModulePath);
                ModuleDlls.Add(moduleDll);


                if (Mdf.Requires.Count > 0)
                {
                    foreach (var r in Mdf.Requires)
                    {
                        var requiredDll = new MbbsDll(fileUtility, logger);
                        if (requiredDll.Load(r.Trim(), ModulePath))
                        {
                            requiredDll.SegmentOffset = (ushort)(ModuleDlls.Sum(x => x.File.SegmentTable.Count) + 1);
                            ModuleDlls.Add(requiredDll);
                        }
                    }
                }

                if (Mdf.MSGFiles.Count > 0)
                {
                    Msgs = new List <MsgFile>(Mdf.MSGFiles.Count);
                    foreach (var m in Mdf.MSGFiles)
                    {
                        Msgs.Add(new MsgFile(ModulePath, m));
                    }
                }
            }

            //Set Initial Values
            RtkickRoutines           = new PointerDictionary <RealTimeRoutine>();
            RtihdlrRoutines          = new PointerDictionary <RealTimeRoutine>();
            TaskRoutines             = new PointerDictionary <RealTimeRoutine>();
            TextVariables            = new Dictionary <string, FarPtr>();
            GlobalCommandHandlers    = new List <FarPtr>();
            ExportedModuleDictionary = new Dictionary <ushort, IExportedModule>(6);
            ExecutionUnits           = new Queue <ExecutionUnit>(2);

            Memory = memoryCore ?? new MemoryCore();

            //Declare PSP Segment
            var psp = new PSPStruct {
                NextSegOffset = 0x9FFF, EnvSeg = 0xFFFF
            };

            Memory.AddSegment(0x4000);
            Memory.SetArray(0x4000, 0, psp.Data);

            Memory.AllocateVariable("Int21h-PSP", sizeof(ushort));
            Memory.SetWord("Int21h-PSP", 0x4000);

            //Find _INIT_ values if any
            foreach (var dll in ModuleDlls)
            {
                //If it's a Test, setup a fake _INIT_
                if (string.IsNullOrEmpty(ModuleIdentifier))
                {
                    dll.EntryPoints["_INIT_"] = null;
                    return;
                }

                //Setup _INIT_ Entrypoint
                FarPtr initEntryPointPointer;
                var    initResidentName = dll.File.ResidentNameTable.FirstOrDefault(x => x.Name.StartsWith("_INIT__"));
                if (initResidentName == null)
                {
                    //This only happens with MajorMUD -- I have no idea why it's a special little snowflake ¯\_(ツ)_/¯
                    _logger.Warn($"({moduleIdentifier}) Unable to locate _INIT_ in Resident Name Table, checking Non-Resident Name Table...");

                    var initNonResidentName = dll.File.NonResidentNameTable.FirstOrDefault(x => x.Name.StartsWith("_INIT__"));

                    if (initNonResidentName == null)
                    {
                        throw new Exception("Unable to locate _INIT__ entry in Resident Name Table");
                    }

                    var initEntryPoint = dll.File.EntryTable.First(x => x.Ordinal == initNonResidentName.IndexIntoEntryTable);

                    initEntryPointPointer = new FarPtr((ushort)(initEntryPoint.SegmentNumber + dll.SegmentOffset), initEntryPoint.Offset);
                }
                else
                {
                    var initEntryPoint = dll.File.EntryTable.First(x => x.Ordinal == initResidentName.IndexIntoEntryTable);
                    initEntryPointPointer = new FarPtr((ushort)(initEntryPoint.SegmentNumber + dll.SegmentOffset), initEntryPoint.Offset);
                }


                _logger.Debug($"({ModuleIdentifier}) Located _INIT__: {initEntryPointPointer}");
                dll.EntryPoints["_INIT_"] = initEntryPointPointer;
            }
        }