Example #1
0
        /// <summary>
        /// Returns all plugin DLLs found in the specified directories
        /// </summary>
        /// <param name="vstDirectories">The VST directories to scan</param>
        /// <param name="applicationProgress">The progress reporter</param>
        /// <returns></returns>
        public HashSet <string> GetPluginDlls(IList <VstDirectory> vstDirectories,
                                              ApplicationProgress applicationProgress)
        {
            var vstPluginDLLFiles = new HashSet <string>();

            var dllFiles          = new List <string>();
            var directoriesToScan = (from directory in vstDirectories where directory.Active select directory).ToList();

            var progressStatus = new CountProgress(directoriesToScan.Count);

            foreach (var i in directoriesToScan)
            {
                progressStatus.Current = directoriesToScan.IndexOf(i);
                progressStatus.Status  = i.Path;

                applicationProgress.Progress.Report(progressStatus);

                if (applicationProgress.CancellationToken.IsCancellationRequested)
                {
                    return(vstPluginDLLFiles);
                }

                try
                {
                    var vstPlugins = new List <string>();
                    foreach (var file in Directory.EnumerateFiles(
                                 i.Path, "*.dll", SearchOption.AllDirectories))
                    {
                        vstPlugins.Add(file);
                        progressStatus.Status = file;

                        applicationProgress.Progress.Report(progressStatus);
                    }

                    dllFiles = vstPlugins;
                }
                catch (Exception e)
                {
                    applicationProgress.LogReporter.Report(new LogEntry(LogLevel.Error,
                                                                        $"Unable to scan {i.Path} because of {e.Message}"));
                }

                if (dllFiles.Count > 0)
                {
                    vstPluginDLLFiles.AddRange(dllFiles);
                }
            }

            return(vstPluginDLLFiles);
        }
        // GET: Data/ApplicationProgressManagement/Delete/5
        public async Task <ActionResult> Delete(int?id)
        {
            if (id == null)
            {
                return(new HttpStatusCodeResult(HttpStatusCode.BadRequest));
            }
            ApplicationProgress applicationProgress = await _ctx.ApplicationProgress.FindAsync(id);

            if (applicationProgress == null)
            {
                return(HttpNotFound());
            }
            return(View(applicationProgress));
        }
Example #3
0
        /// <summary>
        /// Checks all plugins in the list if they are present and if their DLL hashes have changes
        /// </summary>
        /// <returns>List of newly created plugins which were created because their DLL hash has changed</returns>
        public async Task <List <Plugin> > VerifyPlugins(IList <Plugin> plugins, HashSet <string> dllPaths,
                                                         ApplicationProgress applicationProgress)
        {
            var remoteFileService = _remoteVstService.GetRemoteVstService();

            var pluginsToAdd   = new List <Plugin>();
            var progressStatus = new CountProgress(plugins.Count);

            foreach (var plugin in plugins.ToList())
            {
                if (applicationProgress.CancellationToken.IsCancellationRequested)
                {
                    return(pluginsToAdd);
                }

                try
                {
                    progressStatus.Status  = $"Verifying {plugin.DllPath}";
                    progressStatus.Current = plugins.IndexOf(plugin);

                    applicationProgress.Progress.Report(progressStatus);
                    await UpdatePluginLocations(plugin);

                    plugin.UpdateRequiresMetadataScanFlag(_globalService.PresetMagicianVersion);

                    if (plugin.PluginLocation != null && !plugin.PluginLocation.IsPresent)
                    {
                        var newPluginLocation =
                            (from p in plugin.PluginLocations where p.IsPresent select p).FirstOrDefault();
                        plugin.PluginLocation = newPluginLocation;
                    }

                    foreach (var pluginLocation in plugin.PluginLocations)
                    {
                        if (pluginLocation.IsPresent)
                        {
                            dllPaths.Remove(pluginLocation.DllPath);
                        }
                    }

                    plugin.NativeInstrumentsResource.Load(plugin);
                }
                catch (Exception e)
                {
                    plugin.LogPluginError("verifying plugin", e);
                }
            }

            foreach (var dllPath in dllPaths)
            {
                var newPlugin = new Plugin
                {
                    PluginLocation = new PluginLocation
                    {
                        DllPath = dllPath, DllHash = await GetDllHash(dllPath),
                        LastModifiedDateTime = remoteFileService.GetLastModifiedDate(dllPath), IsPresent = true
                    }
                };

                newPlugin.UpdateRequiresMetadataScanFlag(_globalService.PresetMagicianVersion);

                progressStatus.Status = $"Adding Plugin {newPlugin.PluginLocation.DllPath}";
                applicationProgress.Progress.Report(progressStatus);
                pluginsToAdd.Add(newPlugin);
            }

            return(pluginsToAdd);
        }
Example #4
0
        UpdateMetadata(IList <Plugin> pluginsToUpdate,
                       ApplicationProgress applicationProgress)
        {
            var pluginsToRemove = new List <Plugin>();
            var mergedPlugins   = new List <(Plugin oldPlugin, Plugin mergedIntoPlugin)>();
            var progressStatus  = new CountProgress(pluginsToUpdate.Count);

            foreach (var plugin in pluginsToUpdate)
            {
                if (applicationProgress.CancellationToken.IsCancellationRequested)
                {
                    return(pluginsToRemove, mergedPlugins);
                }

                try
                {
                    _globalFrontendService.SelectedPlugin = plugin;
                    progressStatus.Current = pluginsToUpdate.IndexOf(plugin);
                    progressStatus.Status  = $"Loading metadata for {plugin.DllFilename}";
                    applicationProgress.Progress.Report(progressStatus);

                    var originalPluginLocation = plugin.PluginLocation;
                    foreach (var pluginLocation in plugin.PluginLocations)
                    {
                        if (pluginLocation.IsPresent &&
                            plugin.RequiresMetadataScan

                            /*pluginLocation.LastMetadataAnalysisVersion != _globalService.PresetMagicianVersion &&
                             * (!pluginLocation.HasMetadata || plugin.RequiresMetadataScan || pluginLocation.PresetParser == null || (pluginLocation.PresetParser != null &&
                             *                               pluginLocation.PresetParser.RequiresRescan()))*/)
                        {
                            plugin.PluginLocation = pluginLocation;
                            pluginLocation.LastMetadataAnalysisVersion = _globalService.PresetMagicianVersion;

                            using (var remotePluginInstance =
                                       _remoteVstService.GetRemotePluginInstance(plugin, false))
                            {
                                try
                                {
                                    await remotePluginInstance.LoadPlugin();

                                    plugin.Logger.Debug($"Attempting to find presetParser for {plugin.PluginName}");
                                    pluginLocation.PresetParser = null;
                                    _vendorPresetParserService.DeterminatePresetParser(remotePluginInstance);
                                    remotePluginInstance.UnloadPlugin();
                                }
                                catch (Exception e)
                                {
                                    applicationProgress.LogReporter.Report(new LogEntry(LogLevel.Error,
                                                                                        $"Error while loading metadata for {plugin.DllPath}: {e.GetType().FullName} {e.Message}"));
                                    LogTo.Debug(e.StackTrace);
                                }
                            }
                        }
                    }

                    plugin.PluginLocation = originalPluginLocation;
                    plugin.EnsurePluginLocationIsPresent();
                    plugin.UpdateRequiresMetadataScanFlag(_globalService.PresetMagicianVersion);

                    if (!plugin.HasMetadata && plugin.PluginLocation == null && plugin.Presets.Count == 0)
                    {
                        // No metadata and still no plugin location dll => remove it

                        applicationProgress.LogReporter.Report(new LogEntry(LogLevel.Info,
                                                                            "Removing unknown plugin entry without metadata, without presets and without plugin dll"));
                        pluginsToRemove.Add(plugin);

                        continue;
                    }

                    if (!plugin.HasMetadata)
                    {
                        // Still no metadata, probably plugin loading failure. Try again in the next version.
                        continue;
                    }

                    if (_globalService.RuntimeConfiguration.StripBridgedPluginPrefix &&
                        plugin.PluginName.StartsWith("[jBridge]"))
                    {
                        plugin.OverridePluginName   = true;
                        plugin.OverriddenPluginName = plugin.PluginName.Replace("[jBridge]", "");
                    }


                    // We now got metadata - check if there's an existing plugin with the same plugin ID. If so,
                    // merge this plugin with the existing one if it has no presets.
                    var existingPlugin =
                        (from p in _globalService.Plugins
                         where p.VstPluginId == plugin.VstPluginId && p.PluginId != plugin.PluginId &&
                         plugin.IsPresent &&
                         !pluginsToRemove.Contains(p)
                         select p)
                        .FirstOrDefault();

                    if (existingPlugin == null)
                    {
                        continue;
                    }

                    if (plugin.Presets.Count == 0)
                    {
                        // There's an existing plugin which this plugin can be merged into. Schedule it for removal
                        pluginsToRemove.Add(plugin);
                        mergedPlugins.Add((oldPlugin: plugin, mergedIntoPlugin: existingPlugin));

                        if (existingPlugin.PluginLocation == null)
                        {
                            if (Core.UseDispatcher)
                            {
                                await _dispatcherService.InvokeAsync(() =>
                                {
                                    existingPlugin.PluginLocation = plugin.PluginLocation;
                                });
                            }
                            else
                            {
                                existingPlugin.PluginLocation = plugin.PluginLocation;
                            }
                        }
                        else
                        {
                            existingPlugin.PluginLocations.Add(plugin.PluginLocation);
                            existingPlugin.EnsurePluginLocationIsPresent();
                        }
                    }
                    else if (existingPlugin.Presets.Count == 0)
                    {
                        // The existing plugin has no presets - remove it!
                        pluginsToRemove.Add(existingPlugin);
                        mergedPlugins.Add((oldPlugin: existingPlugin, mergedIntoPlugin: plugin));
                        if (plugin.PluginLocation == null)
                        {
                            if (Core.UseDispatcher)
                            {
                                await _dispatcherService.InvokeAsync(() =>
                                {
                                    plugin.PluginLocation = existingPlugin.PluginLocation;
                                });
                            }
                            else
                            {
                                plugin.PluginLocation = existingPlugin.PluginLocation;
                            }
                        }
                        else
                        {
                            plugin.PluginLocations.Add(existingPlugin.PluginLocation);
                            existingPlugin.EnsurePluginLocationIsPresent();
                        }
                    }
                }
                catch (Exception e)
                {
                    applicationProgress.LogReporter.Report(new LogEntry(LogLevel.Error,
                                                                        $"Unable to load  metadata for {plugin.DllFilename} because of {e.GetType().FullName} {e.Message}"));
                }


                await _dispatcherService.InvokeAsync(() => { plugin.NativeInstrumentsResource.Load(plugin); });
            }

            return(pluginsToRemove, mergedPlugins);
        }
Example #5
0
        public async Task TestPluginUpdate()
        {
            var pluginTestFilename    = "Surge-new.dll";
            var newPluginTestFilename = "Surge-old.dll";
            var pluginTestDirectory   = Path.Combine(Directory.GetCurrentDirectory(),
                                                     @"TestData\VstPlugins");
            var pluginSourceDirectory = Path.Combine(Directory.GetCurrentDirectory(),
                                                     @"Resources");
            var pluginSourcePath    = Path.Combine(pluginSourceDirectory, pluginTestFilename);
            var newPluginSourcePath = Path.Combine(pluginSourceDirectory, newPluginTestFilename);

            var pluginTestPath = Path.Combine(pluginTestDirectory, pluginTestFilename);

            Directory.CreateDirectory(pluginTestDirectory);
            File.Delete(pluginTestPath);
            File.Copy(pluginSourcePath, pluginTestPath);

            var pluginService = Fixture.GetServiceLocator().ResolveType <PluginService>();
            var globalService = Fixture.GetServiceLocator().ResolveType <GlobalService>();

            globalService.Plugins.Clear();
            var applicationService = Fixture.GetServiceLocator().ResolveType <IApplicationService>();

            Fixture.StartPool();
            globalService.RuntimeConfiguration.VstDirectories.Add(new VstDirectory
            {
                Path = pluginTestDirectory, Active = true
            });


            _output.WriteLine("Refreshing plugins 1/2");
            await Fixture.GetServiceLocator().ResolveType <RefreshPluginsCommand>().ExecuteAsync();

            var progress = new ApplicationProgress
            {
                Progress          = new Progress <CountProgress>(),
                LogReporter       = new LogReporter(new MiniMemoryLogger()),
                CancellationToken = new CancellationTokenSource().Token
            };

            _output.WriteLine("Updating metadata 1/2");
            await pluginService.UpdateMetadata(globalService.Plugins, progress);


            applicationService.GetApplicationOperationErrors().Should().BeEmpty();
            globalService.Plugins.Count.Should().Be(1);
            globalService.Plugins.First().PluginLocations.Count.Should().Be(1);
            globalService.Plugins.First().PluginLocations.First().IsPresent.Should().BeTrue();
            globalService.Plugins.First().PluginLocations.First().LastMetadataAnalysisVersion.Should()
            .Be(globalService.PresetMagicianVersion);
            globalService.Plugins.First().PluginLocations.First().HasMetadata.Should().BeTrue();

            globalService.Plugins.First().IsPresent.Should().BeTrue();
            globalService.Plugins.First().HasMetadata.Should().BeTrue();

            Fixture.StopPool();
            await Task.Delay(5000);

            Fixture.StartPool();
            File.Delete(pluginTestPath);
            File.Copy(newPluginSourcePath, pluginTestPath);

            _output.WriteLine("Refreshing plugins 2/2");
            await Fixture.GetServiceLocator().ResolveType <RefreshPluginsCommand>().ExecuteAsync();


            applicationService.GetApplicationOperationErrors().Should().BeEmpty();
            globalService.Plugins.Count.Should().Be(2);
            globalService.Plugins.First().IsPresent.Should().BeFalse();
            globalService.Plugins[1].IsPresent.Should().BeTrue();

            _output.WriteLine("Updating metadata 2/2");
            var pluginsToRemove = await pluginService.UpdateMetadata(globalService.Plugins, progress);

            globalService.Plugins.RemoveItems(pluginsToRemove.removedPlugins);

            applicationService.GetApplicationOperationErrors().Should().BeEmpty();
            globalService.Plugins.Count.Should().Be(1);
            globalService.Plugins.First().IsPresent.Should().BeTrue();

            Fixture.StopPool();
        }
Example #6
0
        public async Task <bool> CreateApplicationProgressAsync(int applicationId, int profileId)
        {
            try
            {
                var userInfo = await _appDbContext.UserInfos.Include(k => k.User).FirstOrDefaultAsync(k => k.UserId == profileId);

                var profile = await _appDbContext.Profiles
                              .Include(k => k.ProfileEducations)
                              .Include(k => k.ProfileWorkExperiences)
                              .Include(k => k.ProfileAchievements)
                              .Include(k => k.ProfileTrainings)
                              .Include(k => k.ProfileAssessmentToolScores)
                              .Include(k => k.ProfileMemberships)
                              .FirstOrDefaultAsync(k => k.Id == profileId).ConfigureAwait(false);

                var application = await _appDbContext.Applications.FirstOrDefaultAsync(k => k.Id == applicationId);

                application.CompletionPercentage = 0;
                await _appDbContext.SaveChangesAsync();

                foreach (ApplicationSectionType sectionId in Enum.GetValues(typeof(ApplicationSectionType)))
                {
                    var applicationProgress = new ApplicationProgress
                    {
                        ApplicationId                  = applicationId,
                        ApplicationSectionItemId       = (int)sectionId,
                        ApplicationSectionStatusItemId = (int)ApplicationSectionStatus.InComplete,
                        Created    = DateTime.Now,
                        CreatedBy  = userInfo.Email,
                        Modified   = DateTime.Now,
                        ModifiedBy = userInfo.Email
                    };

                    switch (sectionId)
                    {
                    case ApplicationSectionType.Education:

                        if (profile.ProfileEducations.Any())
                        {
                            applicationProgress.ApplicationSectionStatusItemId = (int)ApplicationSectionStatus.Completed;
                            //application.CompletionPercentage += 10;
                        }

                        break;

                    case ApplicationSectionType.WorkExperience:

                        if (profile.ProfileWorkExperiences.Any())
                        {
                            applicationProgress.ApplicationSectionStatusItemId = (int)ApplicationSectionStatus.Completed;
                            //application.CompletionPercentage += 10;
                        }


                        break;

                    case ApplicationSectionType.Membership:
                        if (profile.ProfileMemberships.Any())
                        {
                            applicationProgress.ApplicationSectionStatusItemId = (int)ApplicationSectionStatus.Completed;
                            //application.CompletionPercentage += 10;
                        }

                        break;

                    case ApplicationSectionType.CandidateInformation:
                        if (profile.FirstNameEn != null && profile.SecondNameEn != null &&
                            profile.ThirdNameEn != null && profile.LastNameEn != null &&
                            profile.FirstNameAr != null && profile.SecondNameAr != null &&
                            profile.ThirdNameAr != null && profile.LastNameAr != null &&
                            profile.ResidenceCountryId.HasValue && profile.Address != null &&
                            profile.PassportNumber != null && profile.PassportIssueEmirateItemId.HasValue &&
                            profile.BirthDate.HasValue && userInfo.Mobile != null &&
                            profile.Eid != null && userInfo.User.OriginalImageFileId.HasValue)
                        {
                            applicationProgress.ApplicationSectionStatusItemId = (int)ApplicationSectionStatus.Completed;
                            //application.CompletionPercentage += 10;
                        }
                        break;

                    case ApplicationSectionType.Training:
                        if (profile.ProfileTrainings.Any())
                        {
                            applicationProgress.ApplicationSectionStatusItemId = (int)ApplicationSectionStatus.Pending;
                        }
                        break;

                    case ApplicationSectionType.Achievement:

                        if (profile.ProfileAchievements.Any())
                        {
                            applicationProgress.ApplicationSectionStatusItemId = (int)ApplicationSectionStatus.Completed;
                            //application.CompletionPercentage += 10;
                        }
                        break;

                    case ApplicationSectionType.ProgramDetails:
                        applicationProgress.ApplicationSectionStatusItemId = (int)ApplicationSectionStatus.Completed;
                        //application.CompletionPercentage += 10;
                        break;

                    case ApplicationSectionType.Attachment:
                        if (profile.LastEducationCertificateFileId.HasValue &&
                            profile.UaeidfileId.HasValue &&
                            profile.CvfileId.HasValue &&
                            profile.PassportFileId.HasValue &&
                            profile.FamilyBookFileId.HasValue)
                        {
                            applicationProgress.ApplicationSectionStatusItemId = (int)ApplicationSectionStatus.Completed;
                            //application.CompletionPercentage += 10;
                        }
                        break;

                    case ApplicationSectionType.AssessmentTools:

                        var assessmentTools = await _appDbContext.BatchAssessmentTools
                                              .Include(m => m.AssessmentTool).Where(m => m.BatchId == application.BatchId)
                                              .Select(y => y.AssessmentTool).ToListAsync();

                        if (assessmentTools.Select(assessment => assessment.ProfileAssessmentToolScores.Where(k => k.ProfileId == profileId).OrderByDescending(k => k.Order).FirstOrDefault()?.IsCompleted ?? false).All(isCompleted => isCompleted))
                        {
                            applicationProgress.ApplicationSectionStatusItemId = (int)ApplicationSectionStatus.Completed;
                            //application.CompletionPercentage += 10;
                        }

                        break;
                    }

                    await _appDbContext.ApplicationProgresses.AddAsync(applicationProgress);

                    await _appDbContext.SaveChangesAsync();
                }
                return(true);
            }
            catch (Exception e)
            {
                return(false);
            }
        }