├── .gitignore ├── doc ├── AutoMapper License.txt ├── Development │ └── Building HFM.NET.txt ├── GPLv2.TXT ├── Json.NET License.txt ├── LightInject License.txt ├── ZedGraph License.txt ├── protobuf-net Licence.txt └── protoc-license.txt ├── readme.md ├── src ├── .config │ └── dotnet-tools.json ├── .editorconfig ├── .nuget │ ├── NuGet.exe │ └── packages.config ├── AssemblyVersion.cs ├── Directory.Build.props ├── ExeAssemblyVersion.cs ├── HFM.All.sln ├── HFM.All.sln.DotSettings ├── HFM.ApplicationUpdate.Console │ ├── HFM.ApplicationUpdate.Console.csproj │ ├── Program.cs │ ├── Properties │ │ └── launchSettings.json │ └── packages.lock.json ├── HFM.Build.ps1 ├── HFM.Core.Data.Sqlite.Tests │ ├── HFM.Core.Data.Sqlite.Tests.csproj │ ├── ProteinBenchmarkRepositoryCachingDecoratorTests.cs │ ├── ProteinBenchmarkRepositoryTests.cs │ ├── TestFiles │ │ ├── TestData.db │ │ ├── TestData.db3 │ │ ├── TestData2.db │ │ ├── TestData2.db3 │ │ ├── TestData_1.db3 │ │ ├── WorkUnitBenchmarks.db │ │ └── WorkUnits.db │ ├── TestableProteinBenchmarkRepository.cs │ ├── TestableWorkUnitContextRepository.cs │ ├── WorkUnitContextRepositoryLegacyTests.cs │ ├── WorkUnitContextRepositoryReadOnlyTests.cs │ ├── WorkUnitContextRepositoryTests.cs │ ├── WorkUnitContextTests.cs │ ├── WorkUnitRepositoryReadOnlyTests.cs │ ├── WorkUnitRepositoryTests.cs │ ├── WorkUnitRowProfileTests.cs │ └── packages.lock.json ├── HFM.Core.Data.Sqlite │ ├── AssemblyAttributes.cs │ ├── CleanWorkUnitContextPlatforms.cs │ ├── HFM.Core.Data.Sqlite.csproj │ ├── Internal │ │ ├── DbDataReaderExtensions.cs │ │ └── SqliteCommandExtensions.cs │ ├── MigrateToWorkUnitContext.cs │ ├── Migrations │ │ ├── 20220501161232_InitialCreate.Designer.cs │ │ ├── 20220501161232_InitialCreate.cs │ │ └── WorkUnitContextModelSnapshot.cs │ ├── ProteinBenchmarkRepository.cs │ ├── ProteinBenchmarkRepositoryCachingDecorator.cs │ ├── SQLiteAddColumnCommand.cs │ ├── WorkUnitContext.Partial.cs │ ├── WorkUnitContext.cs │ ├── WorkUnitContextRepository.cs │ ├── WorkUnitEntity.cs │ ├── WorkUnitQueryable.cs │ ├── WorkUnitRepository.DuplicateDeleter.cs │ ├── WorkUnitRepository.ProteinDataUpdater.cs │ ├── WorkUnitRepository.cs │ ├── WorkUnitRowProfile.cs │ └── packages.lock.json ├── HFM.Core.Tests │ ├── .editorconfig │ ├── ApplicationTests.cs │ ├── ApplicationUpdates │ │ ├── ApplicationUpdateServiceTests.cs │ │ ├── ApplicationUpdateTests.cs │ │ └── Internal │ │ │ └── HashTests.cs │ ├── ArtifactFolder.cs │ ├── Client │ │ ├── ClientConfigurationTests.cs │ │ ├── ClientFactoryTests.cs │ │ ├── ClientIdentifierTests.cs │ │ ├── ClientProjectIsDuplicateValidationRuleTests.cs │ │ ├── ClientSettingsFileSerializerTests.cs │ │ ├── ClientSettingsTests.cs │ │ ├── ClientTests.cs │ │ ├── FahClientDataTests.cs │ │ ├── FahClientMessageActionTests.cs │ │ ├── FahClientMessagesTests.cs │ │ ├── FahClientTests.cs │ │ ├── GPUDeviceDescriptionTests.cs │ │ ├── Mocks │ │ │ ├── MockClient.cs │ │ │ ├── MockFahClient.cs │ │ │ └── MockFahClientConnection.cs │ │ ├── SlotDescriptionTests.cs │ │ ├── SlotIdentifierTests.cs │ │ ├── WorkUnitCollectionBuilderTests.cs │ │ └── WorkUnitQueueItemCollectionBuilderTests.cs │ ├── Data │ │ ├── WorkUnitQueryDataContainerTests.cs │ │ ├── WorkUnitQueryTests.cs │ │ └── WorkUnitRowCsvFileSerializerTests.cs │ ├── FileSystemPathTests.cs │ ├── HFM.Core.Tests.csproj │ ├── Internal │ │ └── FileSystemTests.cs │ ├── Logging │ │ ├── ConsoleLogger.cs │ │ ├── DebugLogger.cs │ │ └── TestLogger.cs │ ├── Net │ │ ├── HostNameTests.cs │ │ ├── HttpUrlTests.cs │ │ └── NetworkCredentialFactoryTests.cs │ ├── ScheduledTasks │ │ └── ScheduledTaskTests.cs │ ├── Services │ │ └── SendMailServiceTests.cs │ ├── SetUpFixture.cs │ ├── SlotXml │ │ ├── LogLineTests.cs │ │ ├── WebArtifactTests.cs │ │ ├── XmlBuilderProfileTests.cs │ │ └── XmlBuilderTests.cs │ ├── TestFiles │ │ ├── ClientSettings_0_9_11.hfmx │ │ ├── UnitInfoCache.dat │ │ ├── UserStatsCache.dat │ │ ├── WuHistoryQuery.dat │ │ └── sample.doc │ ├── UserStats │ │ ├── UserStatsDataContainerTests.cs │ │ └── UserStatsScheduledTaskTests.cs │ ├── WorkUnits │ │ ├── ProjectInfoExtensionsTests.cs │ │ ├── ProteinBenchmarkIdentifierTests.cs │ │ ├── ProteinServiceTests.cs │ │ ├── UnitInfoExtensions.cs │ │ ├── WorkUnitModelTests.cs │ │ └── WorkUnitTests.cs │ └── packages.lock.json ├── HFM.Core │ ├── Application.cs │ ├── ApplicationUpdates │ │ ├── ApplicationUpdate.cs │ │ ├── ApplicationUpdateSerializer.cs │ │ ├── ApplicationUpdateService.cs │ │ ├── HashProvider.cs │ │ └── Internal │ │ │ ├── ByteArrayExtensions.cs │ │ │ └── Hash.cs │ ├── AssemblyAttributes.cs │ ├── Client │ │ ├── Client.cs │ │ ├── ClientConfiguration.cs │ │ ├── ClientData.cs │ │ ├── ClientDataSortComparer.cs │ │ ├── ClientDataValidationRule.cs │ │ ├── ClientFactory.cs │ │ ├── ClientIdentifier.cs │ │ ├── ClientScheduledTasks.cs │ │ ├── ClientSettings.cs │ │ ├── ClientSettingsFileSerializer.cs │ │ ├── FahClient.cs │ │ ├── FahClientData.cs │ │ ├── FahClientLogFileWriter.cs │ │ ├── FahClientMessageAction.cs │ │ ├── FahClientMessages.cs │ │ ├── GPUDeviceDescription.cs │ │ ├── IFahClientCommand.cs │ │ ├── Internal │ │ │ └── StringBuilderReader.cs │ │ ├── NullClient.cs │ │ ├── NumberFormat.cs │ │ ├── SlotDescription.cs │ │ ├── SlotIdentifier.cs │ │ ├── SlotStatus.cs │ │ ├── SlotTotals.cs │ │ ├── SlotType.cs │ │ ├── WorkUnitCollectionBuilder.cs │ │ ├── WorkUnitQueueItem.cs │ │ └── WorkUnitQueueItemCollectionBuilder.cs │ ├── Collections │ │ ├── EnumerableExtensions.cs │ │ ├── QueueItemCollection.cs │ │ └── SortComparer.cs │ ├── Data │ │ ├── DataContainer.cs │ │ ├── IProteinBenchmarkRepository.cs │ │ ├── IWorkUnitRepository.cs │ │ ├── ProteinBenchmark.cs │ │ ├── ProteinBenchmarkFrameTime.cs │ │ ├── WorkUnitQuery.cs │ │ ├── WorkUnitQueryDataContainer.cs │ │ ├── WorkUnitRow.cs │ │ └── WorkUnitRowCsvFileSerializer.cs │ ├── FahUrl.cs │ ├── FileSystemPath.cs │ ├── HFM.Core.csproj │ ├── Internal │ │ ├── Cryptography.cs │ │ └── FileSystem.cs │ ├── Logging │ │ ├── ILogger.cs │ │ ├── ILoggerEvents.cs │ │ ├── Logger.cs │ │ ├── LoggerBase.cs │ │ ├── NullLogger.cs │ │ └── StopwatchExtensions.cs │ ├── Net │ │ ├── FtpMode.cs │ │ ├── HostName.cs │ │ ├── HttpUrl.cs │ │ ├── NetworkCredentialFactory.cs │ │ ├── TcpPort.cs │ │ ├── WebOperation.cs │ │ └── WebProxyFactory.cs │ ├── ProgressInfo.cs │ ├── ScheduledTasks │ │ ├── DelegateScheduledTask.cs │ │ ├── ScheduledTask.cs │ │ ├── ScheduledTaskChangedAction.cs │ │ └── ScheduledTaskChangedEventArgs.cs │ ├── Serializers │ │ ├── DataContractFileSerializer.cs │ │ ├── IFileSerializer.cs │ │ ├── IFileSerializerExtensions.cs │ │ ├── ISerializer.cs │ │ └── ProtoBufFileSerializer.cs │ ├── Services │ │ ├── FahUserService.cs │ │ ├── FtpService.cs │ │ └── SendMailService.cs │ ├── SlotXml │ │ ├── HtmlBuilder.cs │ │ ├── LogLine.cs │ │ ├── Protein.cs │ │ ├── SlotData.cs │ │ ├── SlotDetail.cs │ │ ├── SlotSummary.cs │ │ ├── WebArtifactBuilder.cs │ │ ├── WebArtifactDeployment.cs │ │ ├── XmlBuilder.cs │ │ └── XmlBuilderProfile.cs │ ├── Unknown.cs │ ├── UserStats │ │ ├── UserStatsData.cs │ │ ├── UserStatsDataContainer.cs │ │ ├── UserStatsScheduledTask.cs │ │ └── UserStatsService.cs │ ├── WorkUnits │ │ ├── BonusCalculation.cs │ │ ├── DateTimeExtensions.cs │ │ ├── PPDCalculation.cs │ │ ├── ProjectInfo.cs │ │ ├── ProjectInfoExtensions.cs │ │ ├── ProjectSummaryService.cs │ │ ├── ProteinBenchmarkIdentifier.cs │ │ ├── ProteinDataContainer.cs │ │ ├── ProteinService.cs │ │ ├── WorkUnit.cs │ │ ├── WorkUnitModel.cs │ │ └── WorkUnitResult.cs │ └── packages.lock.json ├── HFM.Forms.Tests │ ├── .editorconfig │ ├── AssemblyAttributes.cs │ ├── ClientSettingsManagerTests.cs │ ├── Controls │ │ └── RadioPanelTests.cs │ ├── HFM.Forms.Tests.csproj │ ├── Mocks │ │ ├── MethodInvocation.cs │ │ ├── MockWin32Dialog.cs │ │ └── MockWin32Form.cs │ ├── Models │ │ ├── ApplicationUpdateModelTests.cs │ │ ├── BenchmarksModelTests.cs │ │ ├── FahClientSettingsModelProfileTests.cs │ │ ├── FahClientSettingsModelTests.cs │ │ ├── MainModelTests.cs │ │ ├── MessagesModelTests.cs │ │ ├── PreferencesModelTests.cs │ │ ├── UserStatsDataModelProfileTests.cs │ │ └── WorkUnitHistoryModelTests.cs │ ├── Presenters │ │ ├── ApplicationUpdatePresenterTests.cs │ │ ├── BenchmarkPresenterTests.cs │ │ ├── ExceptionPresenterTests.cs │ │ ├── FahClientSettingsPresenterTests.cs │ │ ├── MainPresenterTests.cs │ │ ├── MessagesPresenterTests.cs │ │ ├── Mocks │ │ │ ├── MockColorDialogPresenter.cs │ │ │ ├── MockFileDialogPresenter.cs │ │ │ ├── MockFolderDialogPresenter.cs │ │ │ └── MockMessageBoxPresenter.cs │ │ └── PreferencesPresenterTests.cs │ ├── Services │ │ ├── Mocks │ │ │ └── MockLocalProcessService.cs │ │ └── RegistryAutoRunConfigurationTests.cs │ ├── SetUpFixture.cs │ ├── TestFiles │ │ └── ClientSettings_0_9_11.hfmx │ ├── WorkUnitHistoryPresenterTests.cs │ └── packages.lock.json ├── HFM.Forms │ ├── .editorconfig │ ├── AssemblyAttributes.cs │ ├── ClientDataSortableBindingList.cs │ ├── ClientSettingsManager.cs │ ├── Controls │ │ ├── BindableToolStripMenuItem.cs │ │ ├── BindableToolStripStatusLabel.cs │ │ ├── DataErrorTextBox.cs │ │ ├── DataGridViewCalendarEditingControl.cs │ │ ├── DataGridViewColumnSelector.cs │ │ ├── DataGridViewExt.Designer.cs │ │ ├── DataGridViewExt.cs │ │ ├── DataGridViewProgressColumn.cs │ │ ├── DataGridViewQueryValueColumn.cs │ │ ├── DataGridViewQueryValueTextBoxCell.cs │ │ ├── FormBase.Designer.cs │ │ ├── FormBase.cs │ │ ├── LogLineRichTextBox.Designer.cs │ │ ├── LogLineRichTextBox.cs │ │ ├── RadioPanel.cs │ │ ├── SlotsGridColumn.cs │ │ ├── WorkUnitQueueControl.Designer.cs │ │ ├── WorkUnitQueueControl.cs │ │ └── WorkUnitQueueControl.resx │ ├── HFM.Forms.csproj │ ├── Internal │ │ ├── ClipboardWrapper.cs │ │ ├── CollectionExtensions.cs │ │ ├── ControlBindingExtensions.cs │ │ ├── FileSystemPath.cs │ │ ├── ListSortDirectionExtensions.cs │ │ ├── NativeMethods.cs │ │ ├── ProteinBenchmarkIdentifierExtensions.cs │ │ ├── WindowPosition.cs │ │ └── WrapString.cs │ ├── ListItem.cs │ ├── ListItemCollection.cs │ ├── MinimizeToOption.cs │ ├── Models │ │ ├── ApplicationUpdateModel.cs │ │ ├── BenchmarksModel.cs │ │ ├── BenchmarksReport.cs │ │ ├── ClientsModel.cs │ │ ├── FahClientSettingsModel.cs │ │ ├── FahClientSettingsModelProfile.cs │ │ ├── MainModel.cs │ │ ├── MessagesModel.cs │ │ ├── OptionsModel.cs │ │ ├── PreferencesModel.cs │ │ ├── ProjectComparisonZedGraphBenchmarksReport.cs │ │ ├── ProteinCalculatorModel.cs │ │ ├── ReportingModel.cs │ │ ├── SlotCollectionModel.cs │ │ ├── TextBenchmarksReport.cs │ │ ├── UserStatsDataModel.cs │ │ ├── UserStatsDataModelProfile.cs │ │ ├── ViewModelBase.cs │ │ ├── WebGenerationModel.cs │ │ ├── WebProxyModel.cs │ │ ├── WebVisualStylesModel.cs │ │ ├── WorkUnitHistoryModel.cs │ │ └── ZedGraphBenchmarksReport.cs │ ├── Presenters │ │ ├── ApplicationUpdatePresenter.cs │ │ ├── BenchmarksPresenter.cs │ │ ├── ColorDialogPresenter.cs │ │ ├── DialogPresenter.cs │ │ ├── ExceptionPresenter.cs │ │ ├── FahClientSettingsPresenter.cs │ │ ├── FileDialogPresenter.cs │ │ ├── FolderDialogPresenter.cs │ │ ├── FormPresenter.cs │ │ ├── IDialogPresenter.cs │ │ ├── IFormPresenter.cs │ │ ├── MainPresenter.cs │ │ ├── MessageBoxPresenter.cs │ │ ├── MessagesPresenter.cs │ │ ├── NullServiceScopeFactory.cs │ │ ├── PreferencesPresenter.cs │ │ ├── WorkUnitHistoryPresenter.cs │ │ └── WorkUnitQueryPresenter.cs │ ├── Properties │ │ ├── Resources.Designer.cs │ │ ├── Resources.resx │ │ ├── Settings.Designer.cs │ │ └── Settings.settings │ ├── Resources │ │ ├── About.png │ │ ├── Color.png │ │ ├── Copy.png │ │ ├── DataContainer_MoveFirstHS.png │ │ ├── DataContainer_MoveLastHS.png │ │ ├── DataContainer_MoveNextHS.png │ │ ├── DataContainer_MovePreviousHS.png │ │ ├── Delete.png │ │ ├── DownArrow.png │ │ ├── HelpContents.png │ │ ├── Maximize.png │ │ ├── Minimize.png │ │ ├── New.png │ │ ├── Open.png │ │ ├── Quit.png │ │ ├── Restore.png │ │ ├── Save.png │ │ ├── SaveAs.png │ │ ├── UpArrow.png │ │ ├── hfm_48_48.ico │ │ ├── hfm_logo.png │ │ └── hfm_logo_large.png │ ├── Services │ │ ├── FahUserServiceExtensions.cs │ │ ├── IAutoRunConfiguration.cs │ │ ├── LocalProcessService.cs │ │ ├── LocalProcessServiceExtensions.cs │ │ └── RegistryAutoRunConfiguration.cs │ ├── SortableBindingList.cs │ ├── Views │ │ ├── AboutDialog.Designer.cs │ │ ├── AboutDialog.cs │ │ ├── AboutDialog.resx │ │ ├── ApplicationUpdateDialog.cs │ │ ├── ApplicationUpdateDialog.designer.cs │ │ ├── ApplicationUpdateDialog.resx │ │ ├── BenchmarksForm.Designer.cs │ │ ├── BenchmarksForm.cs │ │ ├── BenchmarksForm.resx │ │ ├── ExceptionDialog.Designer.cs │ │ ├── ExceptionDialog.cs │ │ ├── ExceptionDialog.resx │ │ ├── FahClientSettingsDialog.Designer.cs │ │ ├── FahClientSettingsDialog.cs │ │ ├── FahClientSettingsDialog.resx │ │ ├── IWin32Dialog.cs │ │ ├── IWin32Form.cs │ │ ├── MainForm.Designer.cs │ │ ├── MainForm.cs │ │ ├── MainForm.resx │ │ ├── MainFormGridHandlers.cs │ │ ├── MessagesForm.Designer.cs │ │ ├── MessagesForm.cs │ │ ├── MessagesForm.resx │ │ ├── PreferencesDialog.Designer.cs │ │ ├── PreferencesDialog.cs │ │ ├── PreferencesDialog.resx │ │ ├── ProgressDialog.cs │ │ ├── ProgressDialog.designer.cs │ │ ├── ProgressDialog.resx │ │ ├── ProteinCalculatorForm.Designer.cs │ │ ├── ProteinCalculatorForm.cs │ │ ├── ProteinCalculatorForm.resx │ │ ├── ProteinChangesDialog.Designer.cs │ │ ├── ProteinChangesDialog.cs │ │ ├── ProteinChangesDialog.resx │ │ ├── WorkUnitHistoryForm.Designer.cs │ │ ├── WorkUnitHistoryForm.cs │ │ ├── WorkUnitHistoryForm.resx │ │ ├── WorkUnitQueryDialog.Designer.cs │ │ ├── WorkUnitQueryDialog.cs │ │ └── WorkUnitQueryDialog.resx │ ├── WorkUnitRowSortableBindingList.cs │ ├── app.config │ └── packages.lock.json ├── HFM.Preferences.Tests │ ├── ArtifactFolder.cs │ ├── HFM.Preferences.Tests.csproj │ ├── Internal │ │ ├── CryptographyTests.cs │ │ └── ObjectExtensionsTests.cs │ ├── PreferencesProviderTests.Get.cs │ ├── PreferencesProviderTests.Set.cs │ ├── PreferencesProviderTests.cs │ ├── SetUpFixture.cs │ └── packages.lock.json ├── HFM.Preferences │ ├── AssemblyAttributes.cs │ ├── Data │ │ ├── PreferenceData.cs │ │ └── PreferenceTasks.cs │ ├── FormColumnPreference.cs │ ├── HFM.Preferences.csproj │ ├── IPreferences.cs │ ├── InMemoryPreferencesProvider.cs │ ├── Internal │ │ ├── Cryptography.cs │ │ ├── ExpressionExtensions.cs │ │ ├── Metadata.cs │ │ ├── ObjectExtensions.cs │ │ └── TypeExtensions.cs │ ├── Preference.cs │ ├── PreferencesProvider.cs │ ├── XmlPreferencesProvider.PreferenceUpgrade.cs │ ├── XmlPreferencesProvider.cs │ ├── app.config │ └── packages.lock.json ├── HFM.Setup.CustomActions │ ├── CustomAction.config │ ├── CustomAction.cs │ ├── HFM.Setup.CustomActions.csproj │ └── Properties │ │ └── AssemblyInfo.cs ├── HFM.Setup.sln ├── HFM.Setup │ ├── Background.bmp │ ├── Banner original.bmp │ ├── Banner.bmp │ ├── GPLv2.rtf │ ├── HFM.Setup.wixproj │ ├── HFM.wxs │ ├── HFM1.PARAFFIN │ └── WixFileVersionExtension.dll ├── HFM │ ├── Arguments.cs │ ├── AssemblyAttributes.cs │ ├── BootStrapper.cs │ ├── CSS │ │ ├── Blue.css │ │ ├── BlueTwo.css │ │ ├── Green.css │ │ ├── Grey.css │ │ ├── HFM.css │ │ ├── None.css │ │ ├── Orange.css │ │ ├── Purple.css │ │ ├── Red.css │ │ └── Yellow.css │ ├── Core │ │ ├── ApplicationUpdates │ │ │ └── CompositionRoot.cs │ │ ├── Client │ │ │ └── CompositionRoot.cs │ │ ├── Data │ │ │ ├── CompositionRoot.cs │ │ │ └── Sqlite │ │ │ │ └── CompositionRoot.cs │ │ ├── Logging │ │ │ └── CompositionRoot.cs │ │ ├── UserStats │ │ │ └── CompositionRoot.cs │ │ └── WorkUnits │ │ │ └── CompositionRoot.cs │ ├── Forms │ │ └── CompositionRoot.cs │ ├── HFM.csproj │ ├── Preferences │ │ └── CompositionRoot.cs │ ├── Program.cs │ ├── Properties │ │ ├── Resources.Designer.cs │ │ └── Resources.resx │ ├── ServiceRegistryExtensions.cs │ ├── SingleInstanceHelper.cs │ ├── StartupException.cs │ ├── WorkUnitContextMigration.cs │ ├── XSL │ │ ├── FormatDate.xslt │ │ ├── WebOverview.xslt │ │ ├── WebSlot.xslt │ │ └── WebSummary.xslt │ ├── app.config │ ├── hfm_48_48.ico │ ├── hfm_48_48_original.ico │ └── packages.lock.json ├── TestFiles │ ├── Client_v7_1 │ │ ├── heartbeat.txt │ │ ├── info.txt │ │ ├── log-restart.txt │ │ ├── log-update_1.txt │ │ ├── log-update_2.txt │ │ ├── log-update_3.txt │ │ ├── log-update_4.txt │ │ ├── log.txt │ │ ├── options.txt │ │ ├── partial-info.txt │ │ ├── simulation-info.txt │ │ ├── slot-options.txt │ │ ├── slots.txt │ │ └── units.txt │ ├── Client_v7_10 │ │ ├── info.txt │ │ ├── log.txt │ │ ├── options.txt │ │ ├── simulation-info1.txt │ │ ├── simulation-info2.txt │ │ ├── slot-options1.txt │ │ ├── slot-options2.txt │ │ ├── slots.txt │ │ └── units.txt │ ├── Client_v7_11 │ │ ├── info.txt │ │ ├── log.txt │ │ ├── options.txt │ │ ├── simulation-info1.txt │ │ ├── slot-options1.txt │ │ ├── slots.txt │ │ └── units.txt │ ├── Client_v7_12 │ │ ├── info.txt │ │ ├── options.txt │ │ ├── simulation-info1.txt │ │ ├── slot-options1.txt │ │ ├── slots.txt │ │ └── units.txt │ ├── Client_v7_13 │ │ └── log.txt │ ├── Client_v7_14 │ │ └── log.txt │ ├── Client_v7_15 │ │ └── log.txt │ ├── Client_v7_16 │ │ └── log.txt │ ├── Client_v7_17 │ │ └── log.txt │ ├── Client_v7_18 │ │ └── log.txt │ ├── Client_v7_19 │ │ ├── info-20210905T085332.txt │ │ ├── log-restart-20210905T085332.txt │ │ ├── log-update-20210905T085332.txt │ │ ├── log-update-20210905T085354.txt │ │ ├── log-update-20210905T085356.txt │ │ ├── options-20210905T085332.txt │ │ ├── simulation-info-20210905T085332.txt │ │ ├── slot-options-20210905T085332.txt │ │ ├── slots-20210905T085332.txt │ │ └── units-20210905T085332.txt │ ├── Client_v7_2 │ │ ├── info.txt │ │ ├── options.txt │ │ ├── simulation-info.txt │ │ ├── slot-options.txt │ │ ├── slots.txt │ │ └── units.txt │ ├── Client_v7_20 │ │ ├── info-20220518T051623.txt │ │ ├── log-restart-20220518T051625.txt │ │ ├── log-update-20220518T051625.txt │ │ ├── options-20220518T051623.txt │ │ ├── simulation-info-20220518T051625.txt │ │ ├── slot-options-20220518T051625.txt │ │ ├── slots-20220518T051623.txt │ │ └── units-20220518T051623.txt │ ├── Client_v7_3 │ │ ├── info.txt │ │ ├── options.txt │ │ ├── simulation-info.txt │ │ ├── slot-options.txt │ │ ├── slots.txt │ │ └── units.txt │ ├── Client_v7_4 │ │ ├── info.txt │ │ ├── options.txt │ │ ├── simulation-info1.txt │ │ ├── simulation-info2.txt │ │ ├── simulation-info3.txt │ │ ├── slot-options1.txt │ │ ├── slot-options2.txt │ │ ├── slot-options3.txt │ │ ├── slots.txt │ │ └── units.txt │ ├── Client_v7_5 │ │ ├── info.txt │ │ ├── simulation-info1.txt │ │ ├── simulation-info2.txt │ │ ├── slot-options1.txt │ │ ├── slot-options2.txt │ │ ├── slots.txt │ │ └── units.txt │ ├── Client_v7_6 │ │ ├── info.txt │ │ ├── options.txt │ │ ├── simulation-info1.txt │ │ ├── slot-options1.txt │ │ ├── slots.txt │ │ └── units.txt │ ├── Client_v7_7 │ │ ├── info.txt │ │ ├── log.txt │ │ ├── options.txt │ │ ├── simulation-info1.txt │ │ ├── simulation-info2.txt │ │ ├── slot-options1.txt │ │ ├── slot-options2.txt │ │ ├── slots.txt │ │ └── units.txt │ ├── Client_v7_8 │ │ └── log.txt │ ├── Client_v7_9 │ │ ├── info.txt │ │ ├── options.txt │ │ ├── simulation-info1.txt │ │ ├── slot-options1.txt │ │ ├── slots.txt │ │ └── units.txt │ ├── Client_v7_fr-FR │ │ ├── log-restart.txt │ │ └── log.txt │ ├── GPU2_1 │ │ └── FAHlog.txt │ ├── GPU2_2 │ │ └── FAHlog.txt │ ├── GPU2_3 │ │ └── FAHlog.txt │ ├── GPU2_4 │ │ ├── GPU2 6.23.txt │ │ └── queue.dat │ ├── GPU2_5 │ │ ├── FAHlog.txt │ │ ├── GPU2 6.23 ID Big Endian.txt │ │ ├── queue.dat │ │ └── unitinfo.txt │ ├── GPU2_6 │ │ ├── FAHlog.txt │ │ ├── queue.dat │ │ └── unitinfo.txt │ ├── GPU2_7 │ │ └── FAHlog.txt │ ├── GPU2_8 │ │ ├── FAHlog.txt │ │ └── queue.dat │ ├── GPU3_1 │ │ ├── FAHlog.txt │ │ ├── queue.dat │ │ └── unitinfo.txt │ ├── GPU3_2 │ │ └── FAHlog.txt │ ├── LegacyUnitinfo │ │ ├── unitinfo_DownloadDateFormat.txt │ │ ├── unitinfo_DueDateFormat.txt │ │ ├── unitinfo_DueTimeFormat.txt │ │ ├── unitinfo_ProgressOverflow.txt │ │ └── unitinfo_TagFormat.txt │ ├── SMP_1 │ │ └── FAHlog.txt │ ├── SMP_10 │ │ ├── FAHlog.txt │ │ ├── queue.dat │ │ └── unitinfo.txt │ ├── SMP_11 │ │ ├── FAHlog.txt │ │ ├── queue.dat │ │ └── unitinfo.txt │ ├── SMP_12 │ │ ├── FAHlog.txt │ │ ├── queue.dat │ │ └── unitinfo.txt │ ├── SMP_13 │ │ ├── FAHlog.txt │ │ ├── queue.dat │ │ └── unitinfo.txt │ ├── SMP_14 │ │ ├── FAHlog.txt │ │ └── queue.dat │ ├── SMP_15 │ │ ├── FAHlog.txt │ │ ├── queue.dat │ │ └── unitinfo.txt │ ├── SMP_16 │ │ └── queue.dat │ ├── SMP_17 │ │ └── FAHlog.txt │ ├── SMP_2 │ │ └── FAHlog.txt │ ├── SMP_3 │ │ └── FAHlog.txt │ ├── SMP_4 │ │ ├── WinSMP 6.24R3.txt │ │ └── queue.dat │ ├── SMP_5 │ │ ├── Linux SMP 6.24.txt │ │ └── queue.dat │ ├── SMP_6 │ │ ├── Linux SMP 6.24 Waiting Upload.txt │ │ └── queue.dat │ ├── SMP_7 │ │ ├── FAHlog.txt │ │ ├── queue.dat │ │ └── unitinfo.txt │ ├── SMP_8 │ │ ├── FAHlog.txt │ │ ├── queue.dat │ │ └── unitinfo.txt │ ├── SMP_9 │ │ ├── FAHlog.txt │ │ ├── queue.dat │ │ └── unitinfo.txt │ ├── Standard_1 │ │ └── FAHlog.txt │ ├── Standard_2 │ │ ├── Standard PPC 6.xx.txt │ │ └── queue.dat │ ├── Standard_3 │ │ ├── Standard PPC 5.01.txt │ │ └── queue.dat │ ├── Standard_4 │ │ ├── Standard x86 6.xx.txt │ │ └── queue.dat │ ├── Standard_5 │ │ ├── FAHlog.txt │ │ ├── queue.dat │ │ └── unitinfo.txt │ ├── Standard_6 │ │ └── FAHlog.txt │ ├── Standard_7 │ │ └── FAHlog.txt │ ├── Standard_8 │ │ └── FAHlog.txt │ ├── Standard_9 │ │ └── FAHlog.txt │ └── summary.json ├── azure-pipelines.yml ├── harlam357.snk └── harlam357public.snk └── tools ├── ILMerge ├── ILMerge License.rtf ├── ILMerge.doc └── ILMerge.exe └── Paraffin └── Paraffin.exe /.gitignore: -------------------------------------------------------------------------------- 1 | ################################################################################ 2 | # This .gitignore file was automatically created by Microsoft(R) Visual Studio. 3 | ################################################################################ 4 | 5 | *.user 6 | *.suo 7 | *.csproj.DotSettings 8 | .vs 9 | ___*.tmp 10 | /src/Artifacts 11 | /src/TestResults 12 | /src/*/bin 13 | /src/*/obj 14 | /src/packages 15 | -------------------------------------------------------------------------------- /doc/AutoMapper License.txt: -------------------------------------------------------------------------------- 1 | Copyright (c) 2010 Jimmy Bogard 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 4 | 5 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 6 | 7 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -------------------------------------------------------------------------------- /doc/Json.NET License.txt: -------------------------------------------------------------------------------- 1 | Copyright (c) 2007 James Newton-King 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 4 | 5 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 6 | 7 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -------------------------------------------------------------------------------- /doc/LightInject License.txt: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2017 Bernhard Richter 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /doc/protobuf-net Licence.txt: -------------------------------------------------------------------------------- 1 | The core Protocol Buffers technology is provided courtesy of Google. 2 | At the time of writing, this is released under the BSD license. 3 | Full details can be found here: 4 | 5 | http://code.google.com/p/protobuf/ 6 | 7 | 8 | This .NET implementation is Copyright 2008 Marc Gravell 9 | 10 | Licensed under the Apache License, Version 2.0 (the "License"); 11 | you may not use this file except in compliance with the License. 12 | You may obtain a copy of the License at 13 | 14 | http://www.apache.org/licenses/LICENSE-2.0 15 | 16 | Unless required by applicable law or agreed to in writing, software 17 | distributed under the License is distributed on an "AS IS" BASIS, 18 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 19 | See the License for the specific language governing permissions and 20 | limitations under the License. 21 | -------------------------------------------------------------------------------- /readme.md: -------------------------------------------------------------------------------- 1 | # HFM.NET - Client Monitoring Application for the Folding@Home Distributed Computing Project 2 | 3 | [![Build status](https://harlam357.visualstudio.com/hfm-net/_apis/build/status/hfm-net%20(master))](https://harlam357.visualstudio.com/hfm-net/_build/latest?definitionId=4) 4 | 5 | See the latest release notes and download here on GitHub - https://github.com/harlam357/hfm-net/releases 6 | -------------------------------------------------------------------------------- /src/.config/dotnet-tools.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": 1, 3 | "isRoot": true, 4 | "tools": { 5 | "dotnet-ef": { 6 | "version": "6.0.11", 7 | "commands": [ 8 | "dotnet-ef" 9 | ] 10 | } 11 | } 12 | } -------------------------------------------------------------------------------- /src/.nuget/NuGet.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harlam357/hfm-net/7a23cd3641a77c9a97b259c3c5412bdec23fd3e9/src/.nuget/NuGet.exe -------------------------------------------------------------------------------- /src/.nuget/packages.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | -------------------------------------------------------------------------------- /src/AssemblyVersion.cs: -------------------------------------------------------------------------------- 1 | //------------------------------------------------------------------------------ 2 | // 3 | // This code was generated by a tool. 4 | // Runtime Version:4.0.30319.34209 5 | // 6 | // Changes to this file may cause incorrect behavior and will be lost if 7 | // the code is regenerated. 8 | // 9 | //------------------------------------------------------------------------------ 10 | 11 | [assembly: System.Reflection.AssemblyCompany("harlam357")] 12 | [assembly: System.Reflection.AssemblyProduct("HFM.NET")] 13 | [assembly: System.Reflection.AssemblyCopyright("Copyright © Ryan Harlamert 2009-2023.")] 14 | [assembly: System.Reflection.AssemblyVersion("10.0.0.0")] 15 | [assembly: System.Reflection.AssemblyFileVersion("10.4.0.0")] 16 | 17 | 18 | -------------------------------------------------------------------------------- /src/Directory.Build.props: -------------------------------------------------------------------------------- 1 |  2 | 3 | enable 4 | true 5 | 6 | 7 | -------------------------------------------------------------------------------- /src/ExeAssemblyVersion.cs: -------------------------------------------------------------------------------- 1 | //------------------------------------------------------------------------------ 2 | // 3 | // This code was generated by a tool. 4 | // Runtime Version:4.0.30319.34209 5 | // 6 | // Changes to this file may cause incorrect behavior and will be lost if 7 | // the code is regenerated. 8 | // 9 | //------------------------------------------------------------------------------ 10 | 11 | [assembly: System.Reflection.AssemblyCompany("harlam357")] 12 | [assembly: System.Reflection.AssemblyProduct("HFM.NET")] 13 | [assembly: System.Reflection.AssemblyCopyright("Copyright © Ryan Harlamert 2009-2023.")] 14 | [assembly: System.Reflection.AssemblyVersion("10.4.0.0")] 15 | [assembly: System.Reflection.AssemblyFileVersion("10.4.0.0")] 16 | 17 | 18 | -------------------------------------------------------------------------------- /src/HFM.ApplicationUpdate.Console/HFM.ApplicationUpdate.Console.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Exe 5 | net6.0 6 | false 7 | hfm-app-update 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /src/HFM.ApplicationUpdate.Console/Properties/launchSettings.json: -------------------------------------------------------------------------------- 1 | { 2 | "profiles": { 3 | "HFM.ApplicationUpdate.Console": { 4 | "commandName": "Project", 5 | "commandLineArgs": "\"..\\..\\..\\..\\Artifacts\\net6.0-windows\\Packages\\HFM 9.27.0.0.msi\" \"Windows Installer\" \"..\\..\\..\\..\\Artifacts\\net6.0-windows\\Packages\\HFM 9.27.0.0.zip\" \"Zip Archive\"" 6 | } 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /src/HFM.Core.Data.Sqlite.Tests/TestFiles/TestData.db: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harlam357/hfm-net/7a23cd3641a77c9a97b259c3c5412bdec23fd3e9/src/HFM.Core.Data.Sqlite.Tests/TestFiles/TestData.db -------------------------------------------------------------------------------- /src/HFM.Core.Data.Sqlite.Tests/TestFiles/TestData.db3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harlam357/hfm-net/7a23cd3641a77c9a97b259c3c5412bdec23fd3e9/src/HFM.Core.Data.Sqlite.Tests/TestFiles/TestData.db3 -------------------------------------------------------------------------------- /src/HFM.Core.Data.Sqlite.Tests/TestFiles/TestData2.db: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harlam357/hfm-net/7a23cd3641a77c9a97b259c3c5412bdec23fd3e9/src/HFM.Core.Data.Sqlite.Tests/TestFiles/TestData2.db -------------------------------------------------------------------------------- /src/HFM.Core.Data.Sqlite.Tests/TestFiles/TestData2.db3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harlam357/hfm-net/7a23cd3641a77c9a97b259c3c5412bdec23fd3e9/src/HFM.Core.Data.Sqlite.Tests/TestFiles/TestData2.db3 -------------------------------------------------------------------------------- /src/HFM.Core.Data.Sqlite.Tests/TestFiles/TestData_1.db3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harlam357/hfm-net/7a23cd3641a77c9a97b259c3c5412bdec23fd3e9/src/HFM.Core.Data.Sqlite.Tests/TestFiles/TestData_1.db3 -------------------------------------------------------------------------------- /src/HFM.Core.Data.Sqlite.Tests/TestFiles/WorkUnitBenchmarks.db: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harlam357/hfm-net/7a23cd3641a77c9a97b259c3c5412bdec23fd3e9/src/HFM.Core.Data.Sqlite.Tests/TestFiles/WorkUnitBenchmarks.db -------------------------------------------------------------------------------- /src/HFM.Core.Data.Sqlite.Tests/TestFiles/WorkUnits.db: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harlam357/hfm-net/7a23cd3641a77c9a97b259c3c5412bdec23fd3e9/src/HFM.Core.Data.Sqlite.Tests/TestFiles/WorkUnits.db -------------------------------------------------------------------------------- /src/HFM.Core.Data.Sqlite.Tests/WorkUnitRowProfileTests.cs: -------------------------------------------------------------------------------- 1 |  2 | using AutoMapper; 3 | using NUnit.Framework; 4 | 5 | namespace HFM.Core.Data 6 | { 7 | [TestFixture] 8 | public class WorkUnitRowProfileTests 9 | { 10 | [Test] 11 | public void WorkUnitRowProfile_ConfigurationIsValid() 12 | { 13 | var config = new MapperConfiguration(cfg => cfg.AddProfile()); 14 | config.AssertConfigurationIsValid(); 15 | } 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/HFM.Core.Data.Sqlite/AssemblyAttributes.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Runtime.CompilerServices; 3 | 4 | [assembly: CLSCompliant(false)] 5 | [assembly: InternalsVisibleTo("HFM.Core.Data.Sqlite.Tests, PublicKey=0024000004800000940000000602000000240000525341310004000001000100e14183a4b02c8425c363ab94d0615ec82b061c1edd9e1258db3a9f13b1a4f099d8a4a7b50e1010f6efeb3c822f256c587000e474752d6dbda1ec27858c99ba4998183b857fc98d9dc5c8fd2bcf4a43ffeab5d2a37e52d71950dfbe106d472cc88382f491ee54827f024a535395d01a183394a4b6157b283d129402630b1ce3d5")] 6 | -------------------------------------------------------------------------------- /src/HFM.Core.Data.Sqlite/HFM.Core.Data.Sqlite.csproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | net6.0 5 | HFM.Core.Data 6 | true 7 | ..\harlam357.snk 8 | false 9 | true 10 | AllEnabledByDefault 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /src/HFM.Core.Data.Sqlite/Internal/DbDataReaderExtensions.cs: -------------------------------------------------------------------------------- 1 | using System.Data.Common; 2 | 3 | namespace HFM.Core.Data.Internal; 4 | 5 | internal static class DbDataReaderExtensions 6 | { 7 | internal static T GetFieldValueOrDefault(this DbDataReader reader, string name, T defaultValue = default) 8 | { 9 | int ordinal = reader.GetOrdinal(name); 10 | return reader.IsDBNull(ordinal) 11 | ? defaultValue 12 | : reader.GetFieldValue(ordinal); 13 | } 14 | 15 | } 16 | -------------------------------------------------------------------------------- /src/HFM.Core.Data.Sqlite/Internal/SqliteCommandExtensions.cs: -------------------------------------------------------------------------------- 1 | using System.Data; 2 | 3 | using Microsoft.Data.Sqlite; 4 | 5 | namespace HFM.Core.Data.Internal; 6 | 7 | internal static class SqliteCommandExtensions 8 | { 9 | internal static DataTable GetSchema(this SqliteCommand command, string tableName) 10 | { 11 | command.CommandText = $"PRAGMA table_info({tableName});"; 12 | using var reader = command.ExecuteReader(); 13 | 14 | var table = new DataTable(); 15 | var columnType = typeof(object); 16 | table.Columns.Add(new DataColumn("cid", columnType)); 17 | table.Columns.Add(new DataColumn("name", columnType)); 18 | table.Columns.Add(new DataColumn("type", columnType)); 19 | table.Columns.Add(new DataColumn("notnull", columnType)); 20 | table.Columns.Add(new DataColumn("dflt_value", columnType)); 21 | table.Columns.Add(new DataColumn("pk", columnType)); 22 | 23 | while (reader.Read()) 24 | { 25 | var row = table.NewRow(); 26 | for (int i = 0; i < reader.FieldCount; i++) 27 | { 28 | row[i] = reader.GetValue(i); 29 | } 30 | table.Rows.Add(row); 31 | } 32 | 33 | return table; 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /src/HFM.Core.Tests/.editorconfig: -------------------------------------------------------------------------------- 1 | # You can learn more about editorconfig here: https://docs.microsoft.com/en-us/visualstudio/ide/editorconfig-code-style-settings-reference 2 | 3 | [*.{cs,vb}] 4 | 5 | # CA2201: Do not raise reserved exception types 6 | dotnet_diagnostic.CA2201.severity = none -------------------------------------------------------------------------------- /src/HFM.Core.Tests/ApplicationTests.cs: -------------------------------------------------------------------------------- 1 | using NUnit.Framework; 2 | 3 | namespace HFM.Core 4 | { 5 | [TestFixture] 6 | public class ApplicationTests 7 | { 8 | [Test] 9 | public void Application_Version_IsNotNull() 10 | { 11 | Assert.IsNotNull(Application.Version); 12 | } 13 | 14 | [Test] 15 | public void Application_VersionNumber_HasThreeParts() 16 | { 17 | var version = Application.VersionNumber; 18 | Assert.AreNotEqual(0, version.Major); 19 | Assert.AreNotEqual(-1, version.Minor); 20 | Assert.AreNotEqual(-1, version.Build); 21 | Assert.AreEqual(-1, version.Revision); 22 | } 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /src/HFM.Core.Tests/ApplicationUpdates/ApplicationUpdateServiceTests.cs: -------------------------------------------------------------------------------- 1 | using NUnit.Framework; 2 | 3 | namespace HFM.Core.ApplicationUpdates 4 | { 5 | [TestFixture] 6 | public class ApplicationUpdateServiceTests 7 | { 8 | [Test] 9 | public void ApplicationUpdateService_GetApplicationUpdate_ReturnsObject() 10 | { 11 | // Arrange 12 | using (var artifacts = new ArtifactFolder()) 13 | { 14 | string path = artifacts.GetRandomFilePath(); 15 | var update = new ApplicationUpdate { Version = "1.2.3.4" }; 16 | 17 | using (FileStream stream = File.OpenWrite(path)) 18 | { 19 | new ApplicationUpdateSerializer().Serialize(stream, update); 20 | } 21 | var uri = new Uri(path); 22 | 23 | var service = new ApplicationUpdateService(null); 24 | // Act 25 | var result = service.GetApplicationUpdate(uri); 26 | // Assert 27 | Assert.IsNotNull(result); 28 | Assert.AreEqual("1.2.3.4", update.Version); 29 | } 30 | } 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /src/HFM.Core.Tests/ArtifactFolder.cs: -------------------------------------------------------------------------------- 1 | namespace HFM.Core; 2 | 3 | public sealed class ArtifactFolder : IDisposable 4 | { 5 | public string Path { get; } 6 | 7 | public ArtifactFolder() : this(Environment.CurrentDirectory) 8 | { 9 | 10 | } 11 | 12 | public ArtifactFolder(string basePath) 13 | { 14 | Path = System.IO.Path.Combine(basePath, System.IO.Path.GetRandomFileName()); 15 | Directory.CreateDirectory(Path); 16 | } 17 | 18 | public string GetRandomFilePath() => System.IO.Path.Combine(Path, System.IO.Path.GetRandomFileName()); 19 | 20 | public void Dispose() 21 | { 22 | try 23 | { 24 | if (Directory.Exists(Path)) 25 | { 26 | Directory.Delete(Path, true); 27 | } 28 | } 29 | catch (Exception) 30 | { 31 | // do nothing 32 | } 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /src/HFM.Core.Tests/Client/GPUDeviceDescriptionTests.cs: -------------------------------------------------------------------------------- 1 | using NUnit.Framework; 2 | 3 | namespace HFM.Core.Client; 4 | 5 | [TestFixture] 6 | public class GPUDeviceDescriptionTests 7 | { 8 | [Test] 9 | public void GPUDeviceDescription_Parse_ReturnsNullWhenInputIsNull() => 10 | Assert.IsNull(GPUDeviceDescription.Parse(null)); 11 | 12 | [Test] 13 | public void GPUDeviceDescription_Parse_ReturnsDescriptionForCUDA() 14 | { 15 | const string value = "Platform:0 Device:0 Bus:0 Slot:4 Compute:7.5 Driver:11.4"; 16 | var description = GPUDeviceDescription.Parse(value); 17 | Assert.AreEqual(0, description.Platform); 18 | Assert.AreEqual(0, description.Device); 19 | Assert.AreEqual(0, description.Bus); 20 | Assert.AreEqual(4, description.Slot); 21 | Assert.AreEqual("7.5", description.Compute); 22 | Assert.AreEqual("11.4", description.Driver); 23 | } 24 | 25 | [Test] 26 | public void GPUDeviceDescription_Parse_ReturnsDescriptionForOpenCL() 27 | { 28 | const string value = "Platform:0 Device:1 Bus:5 Slot:0 Compute:1.2 Driver:3004.8"; 29 | var description = GPUDeviceDescription.Parse(value); 30 | Assert.AreEqual(0, description.Platform); 31 | Assert.AreEqual(1, description.Device); 32 | Assert.AreEqual(5, description.Bus); 33 | Assert.AreEqual(0, description.Slot); 34 | Assert.AreEqual("1.2", description.Compute); 35 | Assert.AreEqual("3004.8", description.Driver); 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /src/HFM.Core.Tests/Client/Mocks/MockClient.cs: -------------------------------------------------------------------------------- 1 | using HFM.Core.Logging; 2 | 3 | namespace HFM.Core.Client.Mocks; 4 | 5 | public class MockClient : Client 6 | { 7 | public MockClient() : base(null, null) 8 | { 9 | 10 | } 11 | 12 | public MockClient(ILogger logger) : base(logger, null) 13 | { 14 | 15 | } 16 | 17 | public sealed override bool Connected { get; protected set; } 18 | 19 | protected override Task OnConnect() 20 | { 21 | Connected = true; 22 | return Task.CompletedTask; 23 | } 24 | 25 | public int RetrieveCount { get; private set; } 26 | 27 | protected override Task OnRetrieve() 28 | { 29 | RetrieveCount++; 30 | return Task.CompletedTask; 31 | } 32 | 33 | protected override void OnClose() 34 | { 35 | base.OnClose(); 36 | Connected = false; 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /src/HFM.Core.Tests/HFM.Core.Tests.csproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | net6.0 5 | HFM.Core 6 | false 7 | true 8 | $(NoWarn);0618 9 | ..\harlam357.snk 10 | false 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | Always 20 | 21 | 22 | 23 | 24 | 25 | all 26 | runtime; build; native; contentfiles; analyzers; buildtransitive 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | -------------------------------------------------------------------------------- /src/HFM.Core.Tests/Internal/FileSystemTests.cs: -------------------------------------------------------------------------------- 1 |  2 | using NUnit.Framework; 3 | 4 | namespace HFM.Core.Internal 5 | { 6 | [TestFixture] 7 | public class FileSystemTests 8 | { 9 | // TODO: Add TryFileOpen tests 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /src/HFM.Core.Tests/Logging/ConsoleLogger.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | 3 | namespace HFM.Core.Logging 4 | { 5 | public class ConsoleLogger : LoggerBase 6 | { 7 | public static ConsoleLogger Instance { get; } = new ConsoleLogger(); 8 | 9 | public ConsoleLogger() : base(LoggerLevel.Debug) 10 | { 11 | 12 | } 13 | 14 | protected override void Log(LoggerLevel loggerLevel, string message, Exception exception) 15 | { 16 | Console.WriteLine("[{0}] {1}", loggerLevel, message); 17 | if (exception is null) 18 | { 19 | return; 20 | } 21 | Console.WriteLine("[{0}] {1}: {2} {3}", loggerLevel, exception.GetType().FullName, exception.Message, exception.StackTrace); 22 | } 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /src/HFM.Core.Tests/Logging/DebugLogger.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | 3 | namespace HFM.Core.Logging 4 | { 5 | public class DebugLogger : LoggerBase 6 | { 7 | public static DebugLogger Instance { get; } = new DebugLogger(); 8 | 9 | public DebugLogger() : base(LoggerLevel.Debug) 10 | { 11 | 12 | } 13 | 14 | protected override void Log(LoggerLevel loggerLevel, string message, Exception exception) 15 | { 16 | System.Diagnostics.Debug.WriteLine("[{0}] {1}", loggerLevel, message); 17 | if (exception is null) 18 | { 19 | return; 20 | } 21 | System.Diagnostics.Debug.WriteLine("[{0}] {1}: {2} {3}", loggerLevel, exception.GetType().FullName, exception.Message, exception.StackTrace); 22 | } 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /src/HFM.Core.Tests/Logging/TestLogger.cs: -------------------------------------------------------------------------------- 1 | namespace HFM.Core.Logging 2 | { 3 | public static class TestLogger 4 | { 5 | #if DEBUG 6 | public static ILogger Instance { get; } = ConsoleLogger.Instance; 7 | #else 8 | public static ILogger Instance { get; } = NullLogger.Instance; 9 | #endif 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /src/HFM.Core.Tests/Net/HttpUrlTests.cs: -------------------------------------------------------------------------------- 1 |  2 | using NUnit.Framework; 3 | 4 | namespace HFM.Core.Net 5 | { 6 | [TestFixture] 7 | public class HttpUrlTests 8 | { 9 | [Test] 10 | public void HttpUrl_Validate_Tests() 11 | { 12 | Assert.IsTrue(HttpUrl.Validate(@"http://www.domain.com/somesite/index.html")); 13 | Assert.IsTrue(HttpUrl.Validate(@"https://some-server/serverfolder/dsfasfsdf")); 14 | Assert.IsTrue(HttpUrl.Validate(@"https://some-server/serverfolder/dsfasfsdf/")); 15 | Assert.IsTrue(HttpUrl.Validate(@"http://fah-web.stanford.edu/psummary.html")); 16 | 17 | Assert.IsFalse(HttpUrl.Validate(@"ftp://ftp.ftp.com/ftpfolder/")); 18 | Assert.IsFalse(HttpUrl.Validate(@"ftp://user:pass@ftp.ftp.com/ftpfolder/")); 19 | Assert.IsFalse(HttpUrl.Validate(@"file://c:/folder/subfolder")); 20 | Assert.IsFalse(HttpUrl.Validate(@"file://c:/folder/subfolder/")); 21 | Assert.IsFalse(HttpUrl.Validate(@"file://c:/folder/subfolder/myfile.txt")); 22 | } 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /src/HFM.Core.Tests/Net/NetworkCredentialFactoryTests.cs: -------------------------------------------------------------------------------- 1 |  2 | using System; 3 | 4 | using NUnit.Framework; 5 | 6 | namespace HFM.Core.Net 7 | { 8 | [TestFixture] 9 | public class NetworkCredentialFactoryTests 10 | { 11 | [Test] 12 | public void NetworkCredentialFactory_ValidateRequired_Tests() 13 | { 14 | Assert.IsTrue(NetworkCredentialFactory.ValidateRequired("Username", "Password", out _)); 15 | Assert.IsFalse(NetworkCredentialFactory.ValidateRequired("Username", String.Empty, out _)); 16 | Assert.IsFalse(NetworkCredentialFactory.ValidateRequired(String.Empty, "Password", out _)); 17 | Assert.IsFalse(NetworkCredentialFactory.ValidateRequired(String.Empty, String.Empty, out _)); 18 | } 19 | 20 | [Test] 21 | public void NetworkCredentialFactory_ValidateOrEmpty_Tests() 22 | { 23 | Assert.IsTrue(NetworkCredentialFactory.ValidateOrEmpty("Username", "Password", out _)); 24 | Assert.IsFalse(NetworkCredentialFactory.ValidateOrEmpty("Username", String.Empty, out _)); 25 | Assert.IsFalse(NetworkCredentialFactory.ValidateOrEmpty(String.Empty, "Password", out _)); 26 | Assert.IsTrue(NetworkCredentialFactory.ValidateOrEmpty(String.Empty, String.Empty, out _)); 27 | } 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /src/HFM.Core.Tests/Services/SendMailServiceTests.cs: -------------------------------------------------------------------------------- 1 |  2 | using System; 3 | 4 | using NUnit.Framework; 5 | 6 | namespace HFM.Core.Services 7 | { 8 | [TestFixture] 9 | public class SendMailServiceTests 10 | { 11 | [Test] 12 | public void SendMailService_ValidateEmail_Tests() 13 | { 14 | Assert.IsTrue(SendMailService.ValidateEmail("someone@home.co")); 15 | Assert.IsTrue(SendMailService.ValidateEmail("someone@home.com")); 16 | Assert.IsTrue(SendMailService.ValidateEmail("someone@home.comm")); 17 | Assert.IsTrue(SendMailService.ValidateEmail("a@home.com")); 18 | 19 | Assert.IsFalse(SendMailService.ValidateEmail("@home.com")); 20 | Assert.IsFalse(SendMailService.ValidateEmail("someone@home")); 21 | Assert.IsFalse(SendMailService.ValidateEmail("someone@home.c")); 22 | Assert.IsFalse(SendMailService.ValidateEmail("someelse@not.at.home..com")); 23 | 24 | Assert.IsFalse(SendMailService.ValidateEmail(String.Empty)); 25 | Assert.IsFalse(SendMailService.ValidateEmail(" ")); 26 | Assert.IsFalse(SendMailService.ValidateEmail(null)); 27 | } 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /src/HFM.Core.Tests/SetUpFixture.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | 3 | using NUnit.Framework; 4 | 5 | namespace HFM.Core 6 | { 7 | [SetUpFixture] 8 | public class SetUpFixture 9 | { 10 | [OneTimeSetUp] 11 | public void SetEnvironmentCurrentDirectory() 12 | { 13 | Environment.CurrentDirectory = TestContext.CurrentContext.TestDirectory; 14 | } 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /src/HFM.Core.Tests/SlotXml/LogLineTests.cs: -------------------------------------------------------------------------------- 1 | using NUnit.Framework; 2 | 3 | namespace HFM.Core.SlotXml 4 | { 5 | [TestFixture] 6 | public class LogLineTests 7 | { 8 | [Test] 9 | public void LogLine_RemoveInvalidXmlChars_RemovesInvalidCharacters() 10 | { 11 | const string value = "13:21:22:ERROR:WU01:FS01:Exception: Server did not assign work unit"; 12 | const string expected = "[91m13:21:22:ERROR:WU01:FS01:Exception: Server did not assign work unit[0m"; 13 | string actual = LogLine.RemoveInvalidXmlChars(value); 14 | Assert.AreEqual(expected, actual); 15 | } 16 | 17 | [Test] 18 | public void LogLine_RemoveInvalidXmlChars_ReturnsOriginalStringWhenNoInvalidCharacters() 19 | { 20 | const string expected = "13:21:21:WU01:FS01:Requesting new work unit for slot 01: RUNNING gpu:0:TU104GL [Tesla T4] 8141 from 207.53.233.146"; 21 | string actual = LogLine.RemoveInvalidXmlChars(expected); 22 | Assert.AreSame(expected, actual); 23 | } 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /src/HFM.Core.Tests/SlotXml/XmlBuilderProfileTests.cs: -------------------------------------------------------------------------------- 1 |  2 | using AutoMapper; 3 | using NUnit.Framework; 4 | 5 | namespace HFM.Core.SlotXml 6 | { 7 | [TestFixture] 8 | public class XmlBuilderProfileTests 9 | { 10 | [Test] 11 | public void XmlBuilderProfile_ConfigurationIsValid() 12 | { 13 | var config = new MapperConfiguration(cfg => cfg.AddProfile()); 14 | config.AssertConfigurationIsValid(); 15 | } 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/HFM.Core.Tests/TestFiles/ClientSettings_0_9_11.hfmx: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | FahClient 5 | None 6 | Client1 7 | 192.168.100.250 8 | 36330 9 | 10 | 0rwT9JW9tDv/4OiSz5SFcg== 11 | FAHlog.txt 12 | unitinfo.txt 13 | queue.dat 14 | 15 | Passive 16 | false 17 | 0 18 | 19 | 20 | -------------------------------------------------------------------------------- /src/HFM.Core.Tests/TestFiles/UnitInfoCache.dat: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harlam357/hfm-net/7a23cd3641a77c9a97b259c3c5412bdec23fd3e9/src/HFM.Core.Tests/TestFiles/UnitInfoCache.dat -------------------------------------------------------------------------------- /src/HFM.Core.Tests/TestFiles/UserStatsCache.dat: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harlam357/hfm-net/7a23cd3641a77c9a97b259c3c5412bdec23fd3e9/src/HFM.Core.Tests/TestFiles/UserStatsCache.dat -------------------------------------------------------------------------------- /src/HFM.Core.Tests/TestFiles/WuHistoryQuery.dat: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harlam357/hfm-net/7a23cd3641a77c9a97b259c3c5412bdec23fd3e9/src/HFM.Core.Tests/TestFiles/WuHistoryQuery.dat -------------------------------------------------------------------------------- /src/HFM.Core.Tests/TestFiles/sample.doc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harlam357/hfm-net/7a23cd3641a77c9a97b259c3c5412bdec23fd3e9/src/HFM.Core.Tests/TestFiles/sample.doc -------------------------------------------------------------------------------- /src/HFM.Core.Tests/WorkUnits/UnitInfoExtensions.cs: -------------------------------------------------------------------------------- 1 | using HFM.Log; 2 | 3 | namespace HFM.Core.WorkUnits; 4 | 5 | internal static class UnitInfoExtensions 6 | { 7 | internal static IDictionary With(this IDictionary frames, params LogLineFrameData[] framesToAdd) 8 | { 9 | foreach (var f in framesToAdd) 10 | { 11 | frames.Add(f.ID, f); 12 | } 13 | return frames; 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /src/HFM.Core/ApplicationUpdates/ApplicationUpdateSerializer.cs: -------------------------------------------------------------------------------- 1 | using System.IO; 2 | using System.Xml; 3 | using System.Xml.Serialization; 4 | 5 | using HFM.Core.Serializers; 6 | 7 | namespace HFM.Core.ApplicationUpdates 8 | { 9 | public class ApplicationUpdateSerializer : ISerializer 10 | { 11 | public void Serialize(Stream stream, ApplicationUpdate value) 12 | { 13 | var s = new XmlSerializer(typeof(ApplicationUpdate)); 14 | s.Serialize(stream, value); 15 | } 16 | 17 | public ApplicationUpdate Deserialize(Stream stream) 18 | { 19 | var s = new XmlSerializer(typeof(ApplicationUpdate)); 20 | using (var reader = XmlReader.Create(stream)) 21 | { 22 | return (ApplicationUpdate)s.Deserialize(reader); 23 | } 24 | } 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/HFM.Core/ApplicationUpdates/ApplicationUpdateService.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.IO; 3 | using System.Net.Cache; 4 | 5 | using HFM.Core.Net; 6 | using HFM.Preferences; 7 | 8 | namespace HFM.Core.ApplicationUpdates 9 | { 10 | public interface IApplicationUpdateService 11 | { 12 | ApplicationUpdate GetApplicationUpdate(Uri requestUri); 13 | } 14 | 15 | public class ApplicationUpdateService : IApplicationUpdateService 16 | { 17 | public IPreferences Preferences { get; } 18 | 19 | public ApplicationUpdateService(IPreferences preferences) 20 | { 21 | Preferences = preferences ?? new InMemoryPreferencesProvider(); 22 | } 23 | 24 | public ApplicationUpdate GetApplicationUpdate(Uri requestUri) 25 | { 26 | using (var stream = new MemoryStream()) 27 | { 28 | var webOperation = WebOperation.Create(requestUri); 29 | webOperation.WebRequest.CachePolicy = new RequestCachePolicy(RequestCacheLevel.NoCacheNoStore); 30 | webOperation.WebRequest.Proxy = WebProxyFactory.Create(Preferences); 31 | webOperation.Download(stream); 32 | 33 | stream.Position = 0; 34 | var serializer = new ApplicationUpdateSerializer(); 35 | return serializer.Deserialize(stream); 36 | } 37 | } 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /src/HFM.Core/ApplicationUpdates/HashProvider.cs: -------------------------------------------------------------------------------- 1 | namespace HFM.Core.ApplicationUpdates; 2 | 3 | /// 4 | /// Specifies the type of hash. 5 | /// 6 | public enum HashProvider 7 | { 8 | // ReSharper disable InconsistentNaming 9 | 10 | /// 11 | /// Secure Hashing Algorithm provider, SHA-1 variant, 160-bit. 12 | /// 13 | SHA1, 14 | /// 15 | /// Secure Hashing Algorithm provider, SHA-2 variant, 256-bit. 16 | /// 17 | SHA256, 18 | /// 19 | /// Secure Hashing Algorithm provider, SHA-2 variant, 384-bit. 20 | /// 21 | SHA384, 22 | /// 23 | /// Secure Hashing Algorithm provider, SHA-2 variant, 512-bit. 24 | /// 25 | SHA512, 26 | /// 27 | /// Message Digest algorithm 5, 128-bit. 28 | /// 29 | MD5 30 | 31 | // ReSharper restore InconsistentNaming 32 | } 33 | -------------------------------------------------------------------------------- /src/HFM.Core/ApplicationUpdates/Internal/ByteArrayExtensions.cs: -------------------------------------------------------------------------------- 1 | using System.Globalization; 2 | using System.Text; 3 | 4 | namespace HFM.Core.ApplicationUpdates.Internal; 5 | 6 | internal static class ByteArrayExtensions 7 | { 8 | /// 9 | /// Converts an array of bytes to a Hex string representation. 10 | /// 11 | internal static string ToHex(this byte[] value) 12 | { 13 | if (value == null || value.Length == 0) 14 | { 15 | return String.Empty; 16 | } 17 | 18 | const string hexFormat = "{0:X2}"; 19 | var sb = new StringBuilder(); 20 | foreach (byte b in value) 21 | { 22 | sb.Append(String.Format(CultureInfo.InvariantCulture, hexFormat, b)); 23 | } 24 | return sb.ToString(); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/HFM.Core/AssemblyAttributes.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Runtime.CompilerServices; 3 | 4 | [assembly: CLSCompliant(false)] 5 | [assembly: InternalsVisibleTo("HFM, PublicKey=0024000004800000940000000602000000240000525341310004000001000100e14183a4b02c8425c363ab94d0615ec82b061c1edd9e1258db3a9f13b1a4f099d8a4a7b50e1010f6efeb3c822f256c587000e474752d6dbda1ec27858c99ba4998183b857fc98d9dc5c8fd2bcf4a43ffeab5d2a37e52d71950dfbe106d472cc88382f491ee54827f024a535395d01a183394a4b6157b283d129402630b1ce3d5")] 6 | [assembly: InternalsVisibleTo("HFM.Core.Tests, PublicKey=0024000004800000940000000602000000240000525341310004000001000100e14183a4b02c8425c363ab94d0615ec82b061c1edd9e1258db3a9f13b1a4f099d8a4a7b50e1010f6efeb3c822f256c587000e474752d6dbda1ec27858c99ba4998183b857fc98d9dc5c8fd2bcf4a43ffeab5d2a37e52d71950dfbe106d472cc88382f491ee54827f024a535395d01a183394a4b6157b283d129402630b1ce3d5")] 7 | [assembly: InternalsVisibleTo("HFM.Forms.Tests, PublicKey=0024000004800000940000000602000000240000525341310004000001000100e14183a4b02c8425c363ab94d0615ec82b061c1edd9e1258db3a9f13b1a4f099d8a4a7b50e1010f6efeb3c822f256c587000e474752d6dbda1ec27858c99ba4998183b857fc98d9dc5c8fd2bcf4a43ffeab5d2a37e52d71950dfbe106d472cc88382f491ee54827f024a535395d01a183394a4b6157b283d129402630b1ce3d5")] 8 | -------------------------------------------------------------------------------- /src/HFM.Core/Client/FahClientLogFileWriter.cs: -------------------------------------------------------------------------------- 1 | using System.Text; 2 | 3 | namespace HFM.Core.Client; 4 | 5 | public interface IFahClientLogFileWriter 6 | { 7 | Task WriteAsync(string path, FileMode mode, StringBuilder logText); 8 | } 9 | 10 | public class FahClientLogFileWriter : IFahClientLogFileWriter 11 | { 12 | public async Task WriteAsync(string path, FileMode mode, StringBuilder logText) 13 | { 14 | const int sleep = 100; 15 | const int timeout = 60 * 1000; 16 | 17 | var directory = Path.GetDirectoryName(path); 18 | if (!Directory.Exists(directory)) 19 | { 20 | Directory.CreateDirectory(directory); 21 | } 22 | 23 | using (var stream = Core.Internal.FileSystem.TryFileOpen(path, mode, FileAccess.Write, FileShare.Read, sleep, timeout)) 24 | using (var writer = new StreamWriter(stream)) 25 | { 26 | foreach (var chunk in logText.GetChunks()) 27 | { 28 | await writer.WriteAsync(chunk).ConfigureAwait(false); 29 | } 30 | } 31 | } 32 | } 33 | 34 | public class NullFahClientLogFileWriter : IFahClientLogFileWriter 35 | { 36 | public static NullFahClientLogFileWriter Instance { get; } = new NullFahClientLogFileWriter(); 37 | 38 | public Task WriteAsync(string path, FileMode mode, StringBuilder logText) => Task.CompletedTask; 39 | } 40 | -------------------------------------------------------------------------------- /src/HFM.Core/Client/GPUDeviceDescription.cs: -------------------------------------------------------------------------------- 1 | using System.Text.RegularExpressions; 2 | 3 | namespace HFM.Core.Client; 4 | 5 | public class GPUDeviceDescription 6 | { 7 | public int Platform { get; set; } 8 | public int Device { get; set; } 9 | public int Bus { get; set; } 10 | public int Slot { get; set; } 11 | public string Compute { get; set; } 12 | public string Driver { get; set; } 13 | 14 | public static GPUDeviceDescription Parse(string value) 15 | { 16 | if (value is null) 17 | { 18 | return null; 19 | } 20 | 21 | var match = Regex.Match(value, @"Platform:(?\d+) Device:(?\d+) Bus:(?\d+) Slot:(?\d+) Compute:(?[\d\.]+) Driver:(?[\d\.]+)", RegexOptions.Singleline | RegexOptions.IgnoreCase); 22 | if (match.Success && 23 | Int32.TryParse(match.Groups["Platform"].Value, out var platform) && 24 | Int32.TryParse(match.Groups["Device"].Value, out var device) && 25 | Int32.TryParse(match.Groups["Bus"].Value, out var bus) && 26 | Int32.TryParse(match.Groups["Slot"].Value, out var slot)) 27 | { 28 | return new GPUDeviceDescription 29 | { 30 | Platform = platform, 31 | Device = device, 32 | Bus = bus, 33 | Slot = slot, 34 | Compute = match.Groups["Compute"].Value, 35 | Driver = match.Groups["Driver"].Value 36 | }; 37 | } 38 | 39 | return null; 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /src/HFM.Core/Client/IFahClientCommand.cs: -------------------------------------------------------------------------------- 1 | namespace HFM.Core.Client 2 | { 3 | public interface IFahClientCommand 4 | { 5 | /// 6 | /// Sends the Fold command to the FAH client. 7 | /// 8 | /// If not null, sends the command to the specified slot; otherwise, the command will be sent to all client slots. 9 | void Fold(int? slotID); 10 | 11 | /// 12 | /// Sends the Pause command to the FAH client. 13 | /// 14 | /// If not null, sends the command to the specified slot; otherwise, the command will be sent to all client slots. 15 | void Pause(int? slotID); 16 | 17 | /// 18 | /// Sends the Finish command to the FAH client. 19 | /// 20 | /// If not null, sends the command to the specified slot; otherwise, the command will be sent to all client slots. 21 | void Finish(int? slotID); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/HFM.Core/Client/NullClient.cs: -------------------------------------------------------------------------------- 1 | using HFM.Core.Logging; 2 | using HFM.Preferences; 3 | 4 | namespace HFM.Core.Client; 5 | 6 | public class NullClient : Client 7 | { 8 | public NullClient() : base(null, null) 9 | { 10 | } 11 | 12 | public NullClient(ILogger logger, IPreferences preferences) 13 | : base(logger, preferences) 14 | { 15 | } 16 | 17 | protected override Task OnRetrieve() => Task.CompletedTask; 18 | } 19 | -------------------------------------------------------------------------------- /src/HFM.Core/Client/NumberFormat.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Linq; 3 | 4 | namespace HFM.Core.Client 5 | { 6 | public static class NumberFormat 7 | { 8 | /// 9 | /// Gets the number format string using the given number of decimal places. 10 | /// 11 | public static string Get(int decimalPlaces) => BuildFormat(decimalPlaces, "#,0"); 12 | 13 | /// 14 | /// Gets the number format string using the given number of decimal places. 15 | /// 16 | public static string Get(int decimalPlaces, string format) => BuildFormat(decimalPlaces, format); 17 | 18 | private static string BuildFormat(int decimalPlaces, string format) => 19 | decimalPlaces <= 0 20 | ? format 21 | : String.Concat(format, ".", new String(Enumerable.Repeat('0', decimalPlaces).ToArray())); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/HFM.Core/Collections/EnumerableExtensions.cs: -------------------------------------------------------------------------------- 1 | namespace HFM.Core.Collections; 2 | 3 | public static class EnumerableExtensions 4 | { 5 | public static ICollection CastOrToCollection(this IEnumerable source) 6 | { 7 | ArgumentNullException.ThrowIfNull(source); 8 | return source as ICollection ?? source.ToList(); 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /src/HFM.Core/Collections/QueueItemCollection.cs: -------------------------------------------------------------------------------- 1 | using System.Collections; 2 | using System.Collections.ObjectModel; 3 | 4 | namespace HFM.Core.Collections 5 | { 6 | public interface IQueueItem 7 | { 8 | int ID { get; } 9 | } 10 | 11 | public abstract class QueueItemCollection : IEnumerable where T : IQueueItem 12 | { 13 | private readonly QueueItemKeyedCollection _inner = new(); 14 | 15 | public int DefaultID => _inner.Count > 0 ? _inner.First().ID : NoID; 16 | 17 | public const int NoID = -1; 18 | 19 | public int CurrentID { get; set; } = NoID; 20 | 21 | public T Current => (T)(_inner.Contains(CurrentID) ? _inner[CurrentID] : null); 22 | 23 | public void Add(T item) => _inner.Add(item); 24 | 25 | public int Count => _inner.Count; 26 | 27 | public T this[int id] => (T)(_inner.Contains(id) ? _inner[id] : null); 28 | 29 | public bool ContainsID(int id) => _inner.Contains(id); 30 | 31 | public IEnumerator GetEnumerator() => _inner.Cast().GetEnumerator(); 32 | 33 | IEnumerator IEnumerable.GetEnumerator() => GetEnumerator(); 34 | 35 | private class QueueItemKeyedCollection : KeyedCollection 36 | { 37 | public QueueItemKeyedCollection() : base(EqualityComparer.Default, 1) 38 | { 39 | 40 | } 41 | 42 | protected override int GetKeyForItem(IQueueItem item) => item.ID; 43 | } 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /src/HFM.Core/Data/IWorkUnitRepository.cs: -------------------------------------------------------------------------------- 1 | using HFM.Core.Client; 2 | using HFM.Core.WorkUnits; 3 | 4 | namespace HFM.Core.Data; 5 | 6 | public class Page 7 | { 8 | public long CurrentPage { get; set; } 9 | 10 | public long TotalPages { get; set; } 11 | 12 | public long TotalItems { get; set; } 13 | 14 | public long ItemsPerPage { get; set; } 15 | 16 | public IList Items { get; set; } 17 | } 18 | 19 | public interface IWorkUnitRepository 20 | { 21 | Task UpdateAsync(WorkUnitModel workUnitModel); 22 | 23 | Task DeleteAsync(WorkUnitRow row); 24 | 25 | Task> FetchAsync(WorkUnitQuery query, BonusCalculation bonusCalculation); 26 | 27 | Task> PageAsync(long page, long itemsPerPage, WorkUnitQuery query, BonusCalculation bonusCalculation); 28 | 29 | Task CountCompletedAsync(SlotIdentifier slotIdentifier, DateTime? clientStartTime); 30 | 31 | Task CountFailedAsync(SlotIdentifier slotIdentifier, DateTime? clientStartTime); 32 | } 33 | -------------------------------------------------------------------------------- /src/HFM.Core/Data/ProteinBenchmark.cs: -------------------------------------------------------------------------------- 1 | using HFM.Core.Client; 2 | using HFM.Core.WorkUnits; 3 | 4 | namespace HFM.Core.Data; 5 | 6 | public record ProteinBenchmark 7 | { 8 | public SlotIdentifier SlotIdentifier { get; init; } 9 | 10 | public ProteinBenchmarkIdentifier BenchmarkIdentifier { get; init; } 11 | 12 | public TimeSpan MinimumFrameTime { get; init; } 13 | 14 | public TimeSpan AverageFrameTime 15 | { 16 | get 17 | { 18 | if (FrameTimes.Count <= 0) return TimeSpan.Zero; 19 | 20 | TimeSpan totalTime = TimeSpan.Zero; 21 | totalTime = FrameTimes.Aggregate(totalTime, (current, frameTime) => current.Add(frameTime.Duration)); 22 | return TimeSpan.FromSeconds(Convert.ToInt32(totalTime.TotalSeconds) / FrameTimes.Count); 23 | } 24 | } 25 | 26 | public IReadOnlyList FrameTimes { get; init; } 27 | } 28 | -------------------------------------------------------------------------------- /src/HFM.Core/Data/ProteinBenchmarkFrameTime.cs: -------------------------------------------------------------------------------- 1 | using System.Diagnostics; 2 | 3 | namespace HFM.Core.Data; 4 | 5 | [DebuggerDisplay("{Duration}")] 6 | public class ProteinBenchmarkFrameTime 7 | { 8 | public ProteinBenchmarkFrameTime() 9 | { 10 | 11 | } 12 | 13 | public ProteinBenchmarkFrameTime(TimeSpan duration) 14 | { 15 | Duration = duration; 16 | } 17 | 18 | public TimeSpan Duration { get; set; } 19 | } 20 | -------------------------------------------------------------------------------- /src/HFM.Core/Data/WorkUnitQueryDataContainer.cs: -------------------------------------------------------------------------------- 1 | using HFM.Core.Logging; 2 | using HFM.Preferences; 3 | 4 | namespace HFM.Core.Data 5 | { 6 | public class WorkUnitQueryDataContainer : DataContainer> 7 | { 8 | public const string DefaultFileName = "WuHistoryQuery.dat"; 9 | 10 | public override Serializers.IFileSerializer> DefaultSerializer => new Serializers.ProtoBufFileSerializer>(); 11 | 12 | public WorkUnitQueryDataContainer() : this(null, null) 13 | { 14 | 15 | } 16 | 17 | public WorkUnitQueryDataContainer(ILogger logger, IPreferences preferences) : base(logger) 18 | { 19 | var path = preferences?.Get(Preference.ApplicationDataFolderPath); 20 | if (!String.IsNullOrEmpty(path)) 21 | { 22 | FilePath = Path.Combine(path, DefaultFileName); 23 | } 24 | } 25 | 26 | public override void Read() 27 | { 28 | base.Read(); 29 | // remove queries containing removed fields 30 | Data = Data.Where(x => !HasRemovedField(x)).ToList(); 31 | } 32 | 33 | private static bool HasRemovedField(WorkUnitQuery query) 34 | { 35 | var parameters = query?.Parameters; 36 | // 14 is WorkUnitName 37 | return parameters != null && parameters.Any(x => 14 == (int)x.Column); 38 | } 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /src/HFM.Core/FahUrl.cs: -------------------------------------------------------------------------------- 1 | namespace HFM.Core; 2 | 3 | public static class FahUrl 4 | { 5 | public const string UserBaseUrl = "https://stats.foldingathome.org/donor/"; 6 | public const string UserFindApiUrlTemplate = "https://api2.foldingathome.org/user/find?name={0}"; 7 | } 8 | -------------------------------------------------------------------------------- /src/HFM.Core/FileSystemPath.cs: -------------------------------------------------------------------------------- 1 | using System.Text.RegularExpressions; 2 | 3 | namespace HFM.Core; 4 | 5 | public static class FileSystemPath 6 | { 7 | private const string WindowsPattern = @"(?:\b[a-z]:|\\\\[a-z0-9.$_-]+\\[a-z0-9.`~!@#$%^&()_-]+)\\(?:[^\\/:*?""<>|\r\n]+\\)*"; 8 | private const string UnixPattern = @"^(?:(/|~)[a-z0-9\-\s._~%!$&'()*+,;=:@/]*)+$"; 9 | 10 | /// 11 | /// Validates a windows, UNC, or unix style path. 12 | /// 13 | public static bool Validate(string value) 14 | { 15 | if (String.IsNullOrWhiteSpace(value)) return false; 16 | 17 | return Regex.IsMatch(value, WindowsPattern, RegexOptions.Singleline | RegexOptions.IgnoreCase) || 18 | Regex.IsMatch(value, UnixPattern, RegexOptions.Singleline | RegexOptions.IgnoreCase); 19 | } 20 | 21 | /// 22 | /// Validates a unix style path. 23 | /// 24 | public static bool ValidateUnix(string value) 25 | { 26 | if (String.IsNullOrWhiteSpace(value)) return false; 27 | if (value == "/") return true; 28 | 29 | return Regex.IsMatch(value, UnixPattern, RegexOptions.Singleline | RegexOptions.IgnoreCase); 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /src/HFM.Core/HFM.Core.csproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | net6.0 5 | true 6 | ..\harlam357.snk 7 | false 8 | true 9 | AllEnabledByDefault 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /src/HFM.Core/Logging/ILogger.cs: -------------------------------------------------------------------------------- 1 |  2 | using System; 3 | 4 | namespace HFM.Core.Logging 5 | { 6 | public interface ILogger 7 | { 8 | bool IsDebugEnabled { get; } 9 | 10 | bool IsErrorEnabled { get; } 11 | 12 | bool IsInfoEnabled { get; } 13 | 14 | bool IsWarnEnabled { get; } 15 | 16 | void Debug(string message); 17 | 18 | void Debug(string message, Exception exception); 19 | 20 | void Error(string message); 21 | 22 | void Error(string message, Exception exception); 23 | 24 | void Info(string message); 25 | 26 | void Info(string message, Exception exception); 27 | 28 | void Warn(string message); 29 | 30 | void Warn(string message, Exception exception); 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /src/HFM.Core/Logging/ILoggerEvents.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | 3 | namespace HFM.Core.Logging 4 | { 5 | public interface ILoggerEvents 6 | { 7 | event EventHandler Logged; 8 | } 9 | 10 | public class NullLoggerEvents : ILoggerEvents 11 | { 12 | public static NullLoggerEvents Instance { get; } = new NullLoggerEvents(); 13 | 14 | #pragma warning disable 0067 15 | public event EventHandler Logged; 16 | #pragma warning restore 0067 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/HFM.Core/Logging/NullLogger.cs: -------------------------------------------------------------------------------- 1 |  2 | using System; 3 | 4 | namespace HFM.Core.Logging 5 | { 6 | public class NullLogger : LoggerBase 7 | { 8 | public static NullLogger Instance { get; } = new NullLogger(); 9 | 10 | private NullLogger() 11 | { 12 | 13 | } 14 | 15 | protected override void Log(LoggerLevel loggerLevel, string message, Exception exception) 16 | { 17 | 18 | } 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/HFM.Core/Logging/StopwatchExtensions.cs: -------------------------------------------------------------------------------- 1 | using System.Diagnostics; 2 | 3 | namespace HFM.Core.Logging; 4 | 5 | public static class StopwatchExtensions 6 | { 7 | public static string GetExecTime(this Stopwatch sw) => $"{sw.ElapsedMilliseconds:#,##0} ms"; 8 | } 9 | -------------------------------------------------------------------------------- /src/HFM.Core/Net/FtpMode.cs: -------------------------------------------------------------------------------- 1 |  2 | namespace HFM.Core.Net 3 | { 4 | public enum FtpMode 5 | { 6 | Passive, 7 | Active 8 | } 9 | } -------------------------------------------------------------------------------- /src/HFM.Core/Net/HostName.cs: -------------------------------------------------------------------------------- 1 |  2 | using System; 3 | using System.Text.RegularExpressions; 4 | 5 | namespace HFM.Core.Net 6 | { 7 | public static class HostName 8 | { 9 | private const string HostNamePattern = @"^[a-z0-9\-._%]+$"; 10 | 11 | /// 12 | /// Validates a host name or IP address. 13 | /// 14 | public static bool Validate(string hostName) 15 | { 16 | if (String.IsNullOrWhiteSpace(hostName)) return false; 17 | 18 | var validServer = new Regex(HostNamePattern, RegexOptions.Singleline | RegexOptions.IgnoreCase); 19 | return validServer.IsMatch(hostName); 20 | } 21 | 22 | /// 23 | /// Validates a host name or IP address and TCP port. 24 | /// 25 | public static bool ValidateNameAndPort(string hostName, int port, out string message) 26 | { 27 | if (!Validate(hostName) && !TcpPort.Validate(port)) 28 | { 29 | message = "Server and port are required."; 30 | return false; 31 | } 32 | 33 | if (!Validate(hostName)) 34 | { 35 | message = "Server is required when specifying Port."; 36 | return false; 37 | } 38 | 39 | if (!TcpPort.Validate(port)) 40 | { 41 | message = "Port is required when specifying Server."; 42 | return false; 43 | } 44 | 45 | message = null; 46 | return true; 47 | } 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /src/HFM.Core/Net/HttpUrl.cs: -------------------------------------------------------------------------------- 1 |  2 | using System; 3 | 4 | namespace HFM.Core.Net 5 | { 6 | public static class HttpUrl 7 | { 8 | [System.Diagnostics.CodeAnalysis.SuppressMessage("Design", "CA1054:URI-like parameters should not be strings", Justification = "Validating string input can be converted to Uri.")] 9 | public static bool Validate(string url) 10 | { 11 | return Uri.TryCreate(url, UriKind.Absolute, out var result) && (result.Scheme == Uri.UriSchemeHttp || result.Scheme == Uri.UriSchemeHttps); 12 | } 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /src/HFM.Core/Net/TcpPort.cs: -------------------------------------------------------------------------------- 1 |  2 | using System; 3 | 4 | namespace HFM.Core.Net 5 | { 6 | public static class TcpPort 7 | { 8 | public static bool Validate(int port) 9 | { 10 | return port > 0 && port < UInt16.MaxValue; 11 | } 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/HFM.Core/Net/WebProxyFactory.cs: -------------------------------------------------------------------------------- 1 |  2 | using System.Net; 3 | 4 | using HFM.Preferences; 5 | 6 | namespace HFM.Core.Net 7 | { 8 | public static class WebProxyFactory 9 | { 10 | /// 11 | /// Creates a WebProxy object based on preference settings. 12 | /// 13 | public static WebProxy Create(IPreferences preferences) 14 | { 15 | if (preferences == null || !preferences.Get(Preference.UseProxy)) 16 | { 17 | return null; 18 | } 19 | 20 | var proxy = new WebProxy( 21 | preferences.Get(Preference.ProxyServer), 22 | preferences.Get(Preference.ProxyPort)); 23 | 24 | if (preferences.Get(Preference.UseProxyAuth)) 25 | { 26 | proxy.Credentials = NetworkCredentialFactory.Create( 27 | preferences.Get(Preference.ProxyUser), 28 | preferences.Get(Preference.ProxyPass)); 29 | } 30 | return proxy; 31 | } 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /src/HFM.Core/ProgressInfo.cs: -------------------------------------------------------------------------------- 1 | namespace HFM.Core; 2 | 3 | /// 4 | /// Provides progress information data. 5 | /// 6 | public class ProgressInfo 7 | { 8 | /// 9 | /// Gets the task progress percentage. 10 | /// 11 | /// A percentage value indicating the task progress. 12 | public int ProgressPercentage { get; } 13 | 14 | /// 15 | /// Gets a message value indicating the task progress. 16 | /// 17 | /// A System.String message value indicating the task progress. 18 | public string Message { get; } 19 | 20 | /// 21 | /// Initializes a new instance of the ProgressInfo class with progress percentage and message values. 22 | /// 23 | /// The progress value. 24 | /// The text message value. 25 | public ProgressInfo(int progressPercentage, string message) 26 | { 27 | ProgressPercentage = progressPercentage; 28 | Message = message; 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /src/HFM.Core/ScheduledTasks/DelegateScheduledTask.cs: -------------------------------------------------------------------------------- 1 | namespace HFM.Core.ScheduledTasks; 2 | 3 | public class DelegateScheduledTask : ScheduledTask 4 | { 5 | public Action Action { get; } 6 | 7 | public DelegateScheduledTask(string name, Action action, double interval) : base(name, interval) 8 | { 9 | Action = action; 10 | } 11 | 12 | protected override void OnRun(CancellationToken ct) 13 | { 14 | Action(ct); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /src/HFM.Core/ScheduledTasks/ScheduledTaskChangedAction.cs: -------------------------------------------------------------------------------- 1 | namespace HFM.Core.ScheduledTasks; 2 | 3 | public enum ScheduledTaskChangedAction 4 | { 5 | Started, 6 | Stopped, 7 | Running, 8 | Canceled, 9 | Faulted, 10 | Finished, 11 | AlreadyInProgress 12 | } 13 | -------------------------------------------------------------------------------- /src/HFM.Core/Serializers/DataContractFileSerializer.cs: -------------------------------------------------------------------------------- 1 | using System.Runtime.Serialization; 2 | using System.Xml; 3 | 4 | namespace HFM.Core.Serializers 5 | { 6 | public class DataContractFileSerializer : IFileSerializer where T : class, new() 7 | { 8 | public string FileExtension => "xml"; 9 | 10 | public string FileTypeFilter => "Xml Files|*.xml"; 11 | 12 | public T Deserialize(string path) 13 | { 14 | using (var fileStream = new FileStream(path, FileMode.Open, FileAccess.Read)) 15 | { 16 | var serializer = new DataContractSerializer(typeof(T)); 17 | return (T)serializer.ReadObject(fileStream); 18 | } 19 | } 20 | 21 | public void Serialize(string path, T value) 22 | { 23 | using (var fileStream = new FileStream(path, FileMode.Create, FileAccess.Write)) 24 | using (var xmlWriter = XmlWriter.Create(fileStream, new XmlWriterSettings { Indent = true })) 25 | { 26 | var serializer = new DataContractSerializer(typeof(T)); 27 | serializer.WriteObject(xmlWriter, value); 28 | } 29 | } 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /src/HFM.Core/Serializers/IFileSerializer.cs: -------------------------------------------------------------------------------- 1 | namespace HFM.Core.Serializers 2 | { 3 | public interface IFileSerializer where T : class, new() 4 | { 5 | /// 6 | /// File Extension (no dot) 7 | /// 8 | string FileExtension { get; } 9 | 10 | /// 11 | /// File Type Filter for File Dialogs (example "Xml Files|*.xml") 12 | /// 13 | string FileTypeFilter { get; } 14 | 15 | /// 16 | /// Deserialize the file and return the value. 17 | /// 18 | /// A string specifying the path of the file to deserialize. 19 | T Deserialize(string path); 20 | 21 | /// 22 | /// Serialize the value to the file specified by the file name. 23 | /// 24 | /// A string specifying the path of the file to serialize. 25 | /// A value to serialize. 26 | void Serialize(string path, T value); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /src/HFM.Core/Serializers/IFileSerializerExtensions.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | 5 | namespace HFM.Core.Serializers 6 | { 7 | public static class IFileSerializerExtensions 8 | { 9 | public static string GetFileTypeFilters(this IEnumerable> serializers) where T : class, new() 10 | { 11 | return String.Join("|", serializers.Select(x => x.FileTypeFilter)); 12 | } 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /src/HFM.Core/Serializers/ISerializer.cs: -------------------------------------------------------------------------------- 1 | using System.IO; 2 | 3 | namespace HFM.Core.Serializers 4 | { 5 | public interface ISerializer 6 | { 7 | void Serialize(Stream stream, T value); 8 | 9 | T Deserialize(Stream stream); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /src/HFM.Core/Serializers/ProtoBufFileSerializer.cs: -------------------------------------------------------------------------------- 1 | using System.IO; 2 | 3 | namespace HFM.Core.Serializers 4 | { 5 | public class ProtoBufFileSerializer : IFileSerializer where T : class, new() 6 | { 7 | public string FileExtension => "dat"; 8 | 9 | public string FileTypeFilter => "HFM Data Files|*.dat"; 10 | 11 | public T Deserialize(string path) 12 | { 13 | using (var fileStream = new FileStream(path, FileMode.Open, FileAccess.Read)) 14 | { 15 | return ProtoBuf.Serializer.Deserialize(fileStream); 16 | } 17 | } 18 | 19 | public void Serialize(string path, T value) 20 | { 21 | using (var fileStream = new FileStream(path, FileMode.Create, FileAccess.Write)) 22 | { 23 | ProtoBuf.Serializer.Serialize(fileStream, value); 24 | } 25 | } 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/HFM.Core/Services/FahUserService.cs: -------------------------------------------------------------------------------- 1 | using System.Globalization; 2 | using System.Net.Http.Json; 3 | using System.Text.Json.Serialization; 4 | 5 | namespace HFM.Core.Services; 6 | 7 | public class FahUser 8 | { 9 | [JsonPropertyName("id")] 10 | public int ID { get; set; } 11 | 12 | [JsonPropertyName("name")] 13 | public string Name { get; set; } 14 | } 15 | 16 | public abstract class FahUserService 17 | { 18 | public static FahUserService Default { get; } = new DefaultFahUserService(); 19 | 20 | public abstract Task FindUser(string name); 21 | } 22 | 23 | public class DefaultFahUserService : FahUserService 24 | { 25 | private static readonly HttpClient _Client = new(); 26 | 27 | public override async Task FindUser(string name) 28 | { 29 | string uri = String.Format(CultureInfo.InvariantCulture, FahUrl.UserFindApiUrlTemplate, name); 30 | return await _Client.GetFromJsonAsync(uri).ConfigureAwait(false); 31 | } 32 | } 33 | 34 | public class NullFahUserService : FahUserService 35 | { 36 | public static NullFahUserService Instance { get; } = new(); 37 | 38 | public override Task FindUser(string name) => Task.FromResult(new FahUser()); 39 | } 40 | -------------------------------------------------------------------------------- /src/HFM.Core/SlotXml/LogLine.cs: -------------------------------------------------------------------------------- 1 | using System.Runtime.Serialization; 2 | using System.Text; 3 | using System.Xml; 4 | 5 | namespace HFM.Core.SlotXml 6 | { 7 | [DataContract(Namespace = "")] 8 | public class LogLine 9 | { 10 | [DataMember(Order = 1)] 11 | public int Index { get; set; } 12 | 13 | [DataMember(Order = 2)] 14 | public string Raw { get; set; } 15 | 16 | public override string ToString() => Raw; 17 | 18 | // https://stackoverflow.com/a/36885492/425465 19 | public static string RemoveInvalidXmlChars(string value) 20 | { 21 | if (String.IsNullOrEmpty(value)) return value; 22 | 23 | StringBuilder result = null; 24 | for (int i = 0; i < value.Length; i++) 25 | { 26 | var ch = value[i]; 27 | if (XmlConvert.IsXmlChar(ch)) 28 | { 29 | result?.Append(ch); 30 | } 31 | else if (result == null) 32 | { 33 | result = new StringBuilder(); 34 | result.Append(value.AsSpan(0, i)); 35 | } 36 | } 37 | 38 | return result == null ? value : result.ToString(); 39 | } 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /src/HFM.Core/SlotXml/Protein.cs: -------------------------------------------------------------------------------- 1 | using System.Runtime.Serialization; 2 | 3 | namespace HFM.Core.SlotXml 4 | { 5 | [DataContract(Namespace = "")] 6 | public class Protein 7 | { 8 | [DataMember(Order = 1)] 9 | public int ProjectNumber { get; set; } 10 | 11 | [DataMember(Order = 2)] 12 | public string ServerIP { get; set; } 13 | 14 | [DataMember(Order = 3)] 15 | public string WorkUnitName { get; set; } 16 | 17 | [DataMember(Order = 4)] 18 | public int NumberOfAtoms { get; set; } 19 | 20 | [DataMember(Order = 5)] 21 | public double PreferredDays { get; set; } 22 | 23 | [DataMember(Order = 6)] 24 | public double MaximumDays { get; set; } 25 | 26 | [DataMember(Order = 7)] 27 | public double Credit { get; set; } 28 | 29 | [DataMember(Order = 8)] 30 | public int Frames { get; set; } 31 | 32 | [DataMember(Order = 9)] 33 | public string Core { get; set; } 34 | 35 | [DataMember(Order = 10)] 36 | public string Description { get; set; } 37 | 38 | [DataMember(Order = 11)] 39 | public string Contact { get; set; } 40 | 41 | [DataMember(Order = 12)] 42 | public double KFactor { get; set; } 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /src/HFM.Core/SlotXml/SlotDetail.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Runtime.Serialization; 3 | 4 | namespace HFM.Core.SlotXml 5 | { 6 | [DataContract(Namespace = "")] 7 | public class SlotDetail 8 | { 9 | [DataMember(Order = 1)] 10 | public string HfmVersion { get; set; } 11 | 12 | [DataMember(Order = 2)] 13 | public string NumberFormat { get; set; } 14 | 15 | [DataMember(Order = 3)] 16 | public DateTime UpdateDateTime { get; set; } 17 | 18 | [DataMember(Order = 4)] 19 | public bool LogFileAvailable { get; set; } 20 | 21 | [DataMember(Order = 5)] 22 | public string LogFileName { get; set; } 23 | 24 | [DataMember(Order = 6)] 25 | public int TotalRunCompletedUnits { get; set; } 26 | 27 | [DataMember(Order = 7)] 28 | public int TotalCompletedUnits { get; set; } 29 | 30 | [DataMember(Order = 8)] 31 | public int TotalRunFailedUnits { get; set; } 32 | 33 | [DataMember(Order = 9)] 34 | public int TotalFailedUnits { get; set; } 35 | 36 | [DataMember(Order = 10)] 37 | public SlotData SlotData { get; set; } 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /src/HFM.Core/SlotXml/SlotSummary.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Runtime.Serialization; 4 | 5 | using HFM.Core.Client; 6 | 7 | namespace HFM.Core.SlotXml 8 | { 9 | [DataContract(Namespace = "")] 10 | public class SlotSummary 11 | { 12 | [DataMember(Order = 1)] 13 | public string HfmVersion { get; set; } 14 | 15 | [DataMember(Order = 2)] 16 | public string NumberFormat { get; set; } 17 | 18 | [DataMember(Order = 3)] 19 | public DateTime UpdateDateTime { get; set; } 20 | 21 | [DataMember(Order = 4)] 22 | public SlotTotals SlotTotals { get; set; } 23 | 24 | [DataMember(Order = 5)] 25 | public List Slots { get; set; } 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/HFM.Core/SlotXml/XmlBuilderProfile.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | 3 | using AutoMapper; 4 | 5 | namespace HFM.Core.SlotXml 6 | { 7 | public class XmlBuilderProfile : Profile 8 | { 9 | public XmlBuilderProfile() 10 | { 11 | CreateMap() 12 | .ForMember(dest => dest.Raw, opt => opt.MapFrom(src => LogLine.RemoveInvalidXmlChars(src.Raw))); 13 | CreateMap() 14 | .ForMember(dest => dest.ServerIP, opt => opt.MapFrom(src => src.ServerIP ?? String.Empty)) 15 | .ForMember(dest => dest.WorkUnitName, opt => opt.MapFrom(src => src.WorkUnitName ?? String.Empty)) 16 | .ForMember(dest => dest.Core, opt => opt.MapFrom(src => src.Core ?? String.Empty)) 17 | .ForMember(dest => dest.Description, opt => opt.MapFrom(src => src.Description ?? String.Empty)) 18 | .ForMember(dest => dest.Contact, opt => opt.MapFrom(src => src.Contact ?? String.Empty)); 19 | } 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /src/HFM.Core/Unknown.cs: -------------------------------------------------------------------------------- 1 | namespace HFM.Core; 2 | 3 | public static class Unknown 4 | { 5 | public const string Value = "Unknown"; 6 | } 7 | -------------------------------------------------------------------------------- /src/HFM.Core/UserStats/UserStatsDataContainer.cs: -------------------------------------------------------------------------------- 1 | using HFM.Core.Data; 2 | using HFM.Core.Logging; 3 | using HFM.Preferences; 4 | 5 | namespace HFM.Core.UserStats; 6 | 7 | public class UserStatsDataContainer : DataContainer 8 | { 9 | public const string DefaultFileName = "UserStatsCache.dat"; 10 | 11 | public override Serializers.IFileSerializer DefaultSerializer => new Serializers.ProtoBufFileSerializer(); 12 | 13 | public UserStatsDataContainer() : this(null, null) 14 | { 15 | 16 | } 17 | 18 | public UserStatsDataContainer(ILogger logger, IPreferences preferences) : base(logger) 19 | { 20 | var path = preferences?.Get(Preference.ApplicationDataFolderPath); 21 | if (!String.IsNullOrEmpty(path)) 22 | { 23 | FilePath = Path.Combine(path, DefaultFileName); 24 | } 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/HFM.Core/WorkUnits/BonusCalculation.cs: -------------------------------------------------------------------------------- 1 | 2 | namespace HFM.Core.WorkUnits 3 | { 4 | public enum BonusCalculation 5 | { 6 | DownloadTime, 7 | FrameTime, 8 | None 9 | } 10 | } -------------------------------------------------------------------------------- /src/HFM.Core/WorkUnits/DateTimeExtensions.cs: -------------------------------------------------------------------------------- 1 | namespace HFM.Core.WorkUnits; 2 | 3 | public static class DateTimeExtensions 4 | { 5 | public static bool IsMinValue(this DateTime dateTime) => dateTime.Equals(DateTime.MinValue); 6 | 7 | public static string ToShortStringOrEmpty(this DateTime dateTime) => 8 | ToStringOrEmpty(dateTime, $"{dateTime.ToShortDateString()} {dateTime.ToShortTimeString()}"); 9 | 10 | private static string ToStringOrEmpty(this IEquatable date, string formattedValue) => 11 | date.Equals(DateTime.MinValue) ? String.Empty : formattedValue; 12 | 13 | public static DateTime Normalize(this DateTime dateTime) => new(dateTime.Ticks / 10_000_000 * 10_000_000); 14 | } 15 | -------------------------------------------------------------------------------- /src/HFM.Core/WorkUnits/PPDCalculation.cs: -------------------------------------------------------------------------------- 1 | 2 | namespace HFM.Core.WorkUnits 3 | { 4 | public enum PPDCalculation 5 | { 6 | LastFrame, 7 | LastThreeFrames, 8 | AllFrames, 9 | EffectiveRate 10 | } 11 | } -------------------------------------------------------------------------------- /src/HFM.Core/WorkUnits/ProjectInfo.cs: -------------------------------------------------------------------------------- 1 | namespace HFM.Core.WorkUnits; 2 | 3 | public interface IProjectInfo 4 | { 5 | int ProjectID { get; } 6 | int ProjectRun { get; } 7 | int ProjectClone { get; } 8 | int ProjectGen { get; } 9 | } 10 | 11 | public class ProjectInfo : IProjectInfo 12 | { 13 | public int ProjectID { get; set; } 14 | public int ProjectRun { get; set; } 15 | public int ProjectClone { get; set; } 16 | public int ProjectGen { get; set; } 17 | 18 | public override string ToString() => this.ToProjectString(); 19 | } 20 | -------------------------------------------------------------------------------- /src/HFM.Forms.Tests/.editorconfig: -------------------------------------------------------------------------------- 1 | # You can learn more about editorconfig here: https://docs.microsoft.com/en-us/visualstudio/ide/editorconfig-code-style-settings-reference 2 | 3 | [*.{cs,vb}] 4 | 5 | # CA2201: Do not raise reserved exception types 6 | dotnet_diagnostic.CA2201.severity = none -------------------------------------------------------------------------------- /src/HFM.Forms.Tests/AssemblyAttributes.cs: -------------------------------------------------------------------------------- 1 | #if NET5_0 2 | using System.Runtime.Versioning; 3 | [assembly: SupportedOSPlatform("windows7.0")] 4 | #endif 5 | -------------------------------------------------------------------------------- /src/HFM.Forms.Tests/HFM.Forms.Tests.csproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | net6.0-windows 5 | HFM.Forms 6 | false 7 | true 8 | ..\harlam357.snk 9 | false 10 | 11 | 12 | 13 | 14 | 15 | ArtifactFolder.cs 16 | 17 | 18 | 19 | 20 | 21 | 22 | all 23 | runtime; build; native; contentfiles; analyzers; buildtransitive 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | -------------------------------------------------------------------------------- /src/HFM.Forms.Tests/Mocks/MethodInvocation.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Diagnostics; 3 | using System.Linq; 4 | 5 | namespace HFM.Forms.Mocks 6 | { 7 | [DebuggerDisplay("{Name} {ArgumentsString}")] 8 | public class MethodInvocation 9 | { 10 | public string Name { get; } 11 | public object[] Arguments { get; } 12 | public string ArgumentsString => Arguments is null ? null : String.Join(", ", Arguments.Where(x => x != null)); 13 | 14 | public MethodInvocation(string name, params object[] arguments) 15 | { 16 | Name = name; 17 | Arguments = arguments; 18 | } 19 | } 20 | 21 | [DebuggerDisplay("{ReturnValue} {Name} {ArgumentsString}")] 22 | public class MethodInvocationWithReturnValue : MethodInvocation 23 | { 24 | public object ReturnValue { get; } 25 | 26 | public MethodInvocationWithReturnValue(object returnValue, string name, params object[] arguments) : base(name, arguments) 27 | { 28 | ReturnValue = returnValue; 29 | } 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /src/HFM.Forms.Tests/Models/FahClientSettingsModelProfileTests.cs: -------------------------------------------------------------------------------- 1 |  2 | using AutoMapper; 3 | 4 | using NUnit.Framework; 5 | 6 | namespace HFM.Forms.Models 7 | { 8 | [TestFixture] 9 | public class FahClientSettingsModelProfileTests 10 | { 11 | [Test] 12 | public void FahClientSettingsModelProfile_ConfigurationIsValid() 13 | { 14 | var config = new MapperConfiguration(cfg => cfg.AddProfile()); 15 | config.AssertConfigurationIsValid(); 16 | } 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/HFM.Forms.Tests/Models/UserStatsDataModelProfileTests.cs: -------------------------------------------------------------------------------- 1 |  2 | using AutoMapper; 3 | 4 | using NUnit.Framework; 5 | 6 | namespace HFM.Forms.Models 7 | { 8 | [TestFixture] 9 | public class UserStatsDataModelProfileTests 10 | { 11 | [Test] 12 | public void UserStatsDataModelProfile_ConfigurationIsValid() 13 | { 14 | var config = new MapperConfiguration(cfg => cfg.AddProfile()); 15 | config.AssertConfigurationIsValid(); 16 | } 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/HFM.Forms.Tests/Presenters/Mocks/MockColorDialogPresenter.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Drawing; 3 | using System.Windows.Forms; 4 | 5 | namespace HFM.Forms.Presenters.Mocks 6 | { 7 | public class MockColorDialogPresenter : ColorDialogPresenter 8 | { 9 | private readonly Func _dialogResultProvider; 10 | 11 | public MockColorDialogPresenter(Func dialogResultProvider) 12 | { 13 | _dialogResultProvider = dialogResultProvider; 14 | } 15 | 16 | public override Color Color { get; set; } 17 | 18 | public override DialogResult ShowDialog(IWin32Window owner) => OnProvideDialogResult(owner); 19 | 20 | protected virtual DialogResult OnProvideDialogResult(IWin32Window owner) => _dialogResultProvider?.Invoke(owner) ?? default; 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/HFM.Forms.Tests/Presenters/Mocks/MockFileDialogPresenter.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Windows.Forms; 4 | 5 | using HFM.Forms.Mocks; 6 | 7 | namespace HFM.Forms.Presenters.Mocks 8 | { 9 | public class MockFileDialogPresenter : FileDialogPresenter 10 | { 11 | public ICollection Invocations { get; } = new List(); 12 | 13 | private readonly Func _dialogResultProvider; 14 | 15 | public MockFileDialogPresenter(Func dialogResultProvider) 16 | { 17 | _dialogResultProvider = dialogResultProvider; 18 | } 19 | 20 | public override DialogResult ShowDialog() 21 | { 22 | Invocations.Add(new MethodInvocation(nameof(ShowDialog))); 23 | return OnProvideDialogResult(null); 24 | } 25 | 26 | public override DialogResult ShowDialog(IWin32Window owner) 27 | { 28 | Invocations.Add(new MethodInvocation(nameof(ShowDialog), owner)); 29 | return OnProvideDialogResult(owner); 30 | } 31 | 32 | protected virtual DialogResult OnProvideDialogResult(IWin32Window owner) 33 | { 34 | return _dialogResultProvider?.Invoke(owner) ?? default; 35 | } 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /src/HFM.Forms.Tests/Presenters/Mocks/MockFolderDialogPresenter.cs: -------------------------------------------------------------------------------- 1 |  2 | using System; 3 | using System.Windows.Forms; 4 | 5 | namespace HFM.Forms.Presenters.Mocks 6 | { 7 | public class MockFolderDialogPresenter : FolderDialogPresenter 8 | { 9 | private readonly Func _dialogResultProvider; 10 | 11 | public MockFolderDialogPresenter(Func dialogResultProvider) 12 | { 13 | _dialogResultProvider = dialogResultProvider; 14 | } 15 | 16 | public override DialogResult ShowDialog() 17 | { 18 | return OnProvideDialogResult(null); 19 | } 20 | 21 | public override DialogResult ShowDialog(IWin32Window owner) 22 | { 23 | return OnProvideDialogResult(owner); 24 | } 25 | 26 | protected virtual DialogResult OnProvideDialogResult(IWin32Window owner) 27 | { 28 | return _dialogResultProvider?.Invoke(owner) ?? default; 29 | } 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /src/HFM.Forms.Tests/Services/Mocks/MockLocalProcessService.cs: -------------------------------------------------------------------------------- 1 | namespace HFM.Forms.Services.Mocks 2 | { 3 | public class MockLocalProcessService : LocalProcessService 4 | { 5 | public ICollection Invocations { get; } = new List(); 6 | 7 | public override LocalProcess Start(string fileName) 8 | { 9 | var process = MockLocalProcess.Start(fileName); 10 | Invocations.Add(process); 11 | return process; 12 | } 13 | 14 | public override LocalProcess Start(string fileName, string arguments) 15 | { 16 | var process = MockLocalProcess.Start(fileName, arguments); 17 | Invocations.Add(process); 18 | return process; 19 | } 20 | } 21 | 22 | public class MockLocalProcess : NullLocalProcess 23 | { 24 | public string FileName { get; } 25 | public string Arguments { get; } 26 | 27 | public MockLocalProcess(string fileName) 28 | { 29 | FileName = fileName; 30 | } 31 | 32 | public MockLocalProcess(string fileName, string arguments) 33 | { 34 | FileName = fileName; 35 | Arguments = arguments; 36 | } 37 | 38 | public static MockLocalProcess Start(string fileName) 39 | { 40 | return new MockLocalProcess(fileName); 41 | } 42 | 43 | public static MockLocalProcess Start(string fileName, string arguments) 44 | { 45 | return new MockLocalProcess(fileName, arguments); 46 | } 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /src/HFM.Forms.Tests/Services/RegistryAutoRunConfigurationTests.cs: -------------------------------------------------------------------------------- 1 | 2 | using System; 3 | 4 | using NUnit.Framework; 5 | 6 | using HFM.Core.Logging; 7 | 8 | namespace HFM.Forms 9 | { 10 | [TestFixture] 11 | public class RegistryAutoRunConfigurationTests 12 | { 13 | [Test] 14 | public void RegistryAutoRunConfiguration_Test() 15 | { 16 | var autoRun = new RegistryAutoRunConfiguration(NullLogger.Instance); 17 | autoRun.SetFilePath(System.Reflection.Assembly.GetExecutingAssembly().Location); 18 | Assert.AreEqual(true, autoRun.IsEnabled()); 19 | autoRun.SetFilePath(String.Empty); 20 | Assert.AreEqual(false, autoRun.IsEnabled()); 21 | } 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/HFM.Forms.Tests/SetUpFixture.cs: -------------------------------------------------------------------------------- 1 |  2 | using System; 3 | 4 | using NUnit.Framework; 5 | 6 | namespace HFM.Forms 7 | { 8 | [SetUpFixture] 9 | public class SetUpFixture 10 | { 11 | [OneTimeSetUp] 12 | public void SetEnvironmentCurrentDirectory() 13 | { 14 | Environment.CurrentDirectory = TestContext.CurrentContext.TestDirectory; 15 | } 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/HFM.Forms.Tests/TestFiles/ClientSettings_0_9_11.hfmx: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | FahClient 5 | None 6 | Client1 7 | 192.168.100.250 8 | 36330 9 | 10 | 11 | FAHlog.txt 12 | unitinfo.txt 13 | queue.dat 14 | 15 | Passive 16 | false 17 | 0 18 | 19 | 20 | -------------------------------------------------------------------------------- /src/HFM.Forms/.editorconfig: -------------------------------------------------------------------------------- 1 | [*.cs] 2 | 3 | # CA1416: Validate platform compatibility 4 | dotnet_diagnostic.CA1416.severity = none -------------------------------------------------------------------------------- /src/HFM.Forms/AssemblyAttributes.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Resources; 3 | using System.Runtime.CompilerServices; 4 | using System.Runtime.Versioning; 5 | 6 | [assembly: CLSCompliant(false)] 7 | [assembly: InternalsVisibleTo("HFM, PublicKey=0024000004800000940000000602000000240000525341310004000001000100e14183a4b02c8425c363ab94d0615ec82b061c1edd9e1258db3a9f13b1a4f099d8a4a7b50e1010f6efeb3c822f256c587000e474752d6dbda1ec27858c99ba4998183b857fc98d9dc5c8fd2bcf4a43ffeab5d2a37e52d71950dfbe106d472cc88382f491ee54827f024a535395d01a183394a4b6157b283d129402630b1ce3d5")] 8 | [assembly: InternalsVisibleTo("HFM.Forms.Tests, PublicKey=0024000004800000940000000602000000240000525341310004000001000100e14183a4b02c8425c363ab94d0615ec82b061c1edd9e1258db3a9f13b1a4f099d8a4a7b50e1010f6efeb3c822f256c587000e474752d6dbda1ec27858c99ba4998183b857fc98d9dc5c8fd2bcf4a43ffeab5d2a37e52d71950dfbe106d472cc88382f491ee54827f024a535395d01a183394a4b6157b283d129402630b1ce3d5")] 9 | [assembly: NeutralResourcesLanguage("en-US")] 10 | #if NET5_0 11 | [assembly: SupportedOSPlatform("windows7.0")] 12 | #endif 13 | -------------------------------------------------------------------------------- /src/HFM.Forms/ClientDataSortableBindingList.cs: -------------------------------------------------------------------------------- 1 | using System.ComponentModel; 2 | 3 | using HFM.Core.Client; 4 | 5 | namespace HFM.Forms 6 | { 7 | internal class ClientDataSortableBindingList : SortableBindingList 8 | { 9 | public bool OfflineClientsLast 10 | { 11 | get { return ((ClientDataSortComparer)SortComparer).OfflineClientsLast; } 12 | set { ((ClientDataSortComparer)SortComparer).OfflineClientsLast = value; } 13 | } 14 | 15 | public ClientDataSortableBindingList() 16 | { 17 | SortComparer = new ClientDataSortComparer(); 18 | } 19 | 20 | protected override bool SupportsSearchingCore => true; 21 | 22 | protected override int FindCore(PropertyDescriptor prop, object key) 23 | { 24 | // This key seems to always be null under Mono 25 | if (key == null) return -1; 26 | 27 | if (key is string) 28 | { 29 | if (Items is List list) 30 | { 31 | return list.FindIndex(item => prop.GetValue(item).Equals(key)); 32 | } 33 | 34 | return -1; 35 | } 36 | 37 | throw new NotSupportedException("Key must be of Type System.String."); 38 | } 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /src/HFM.Forms/Controls/BindableToolStripMenuItem.cs: -------------------------------------------------------------------------------- 1 | using System.Windows.Forms; 2 | using System.Windows.Forms.Design; 3 | 4 | namespace HFM.Forms.Controls 5 | { 6 | [ToolStripItemDesignerAvailability(ToolStripItemDesignerAvailability.StatusStrip)] 7 | public class BindableToolStripMenuItem : ToolStripMenuItem, IBindableComponent 8 | { 9 | private BindingContext _context; 10 | 11 | [System.Diagnostics.CodeAnalysis.SuppressMessage("Usage", "CA2227:Collection properties should be read only", Justification = "Satisfy IBindableComponent")] 12 | public BindingContext BindingContext 13 | { 14 | get => _context ?? (_context = new BindingContext()); 15 | set => _context = value; 16 | } 17 | 18 | private ControlBindingsCollection _bindings; 19 | 20 | public ControlBindingsCollection DataBindings => _bindings ?? (_bindings = new ControlBindingsCollection(this)); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/HFM.Forms/Controls/BindableToolStripStatusLabel.cs: -------------------------------------------------------------------------------- 1 | using System.Windows.Forms; 2 | using System.Windows.Forms.Design; 3 | 4 | namespace HFM.Forms.Controls 5 | { 6 | [ToolStripItemDesignerAvailability(ToolStripItemDesignerAvailability.StatusStrip)] 7 | public class BindableToolStripStatusLabel : ToolStripStatusLabel, IBindableComponent 8 | { 9 | private BindingContext _context; 10 | 11 | [System.Diagnostics.CodeAnalysis.SuppressMessage("Usage", "CA2227:Collection properties should be read only", Justification = "Satisfy IBindableComponent")] 12 | public BindingContext BindingContext 13 | { 14 | get => _context ?? (_context = new BindingContext()); 15 | set => _context = value; 16 | } 17 | 18 | private ControlBindingsCollection _bindings; 19 | 20 | public ControlBindingsCollection DataBindings => _bindings ?? (_bindings = new ControlBindingsCollection(this)); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/HFM.Forms/Controls/DataGridViewExt.Designer.cs: -------------------------------------------------------------------------------- 1 | namespace HFM.Forms.Controls 2 | { 3 | partial class DataGridViewExt 4 | { 5 | /// 6 | /// Required designer variable. 7 | /// 8 | private System.ComponentModel.IContainer components = null; 9 | 10 | /// 11 | /// Clean up any resources being used. 12 | /// 13 | /// true if managed resources should be disposed; otherwise, false. 14 | protected override void Dispose(bool disposing) 15 | { 16 | if (disposing && (components != null)) 17 | { 18 | components.Dispose(); 19 | } 20 | base.Dispose(disposing); 21 | } 22 | 23 | #region Component Designer generated code 24 | 25 | /// 26 | /// Required method for Designer support - do not modify 27 | /// the contents of this method with the code editor. 28 | /// 29 | private void InitializeComponent() 30 | { 31 | components = new System.ComponentModel.Container(); 32 | this.DoubleBuffered = true; 33 | } 34 | 35 | #endregion 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /src/HFM.Forms/Controls/DataGridViewExt.cs: -------------------------------------------------------------------------------- 1 | using System.Windows.Forms; 2 | 3 | namespace HFM.Forms.Controls 4 | { 5 | public partial class DataGridViewExt : DataGridView 6 | { 7 | public DataGridViewExt() 8 | { 9 | InitializeComponent(); 10 | } 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /src/HFM.Forms/Controls/DataGridViewQueryValueColumn.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Windows.Forms; 3 | 4 | namespace HFM.Forms.Controls 5 | { 6 | internal class DataGridViewQueryValueColumn : DataGridViewColumn 7 | { 8 | public DataGridViewQueryValueColumn() 9 | : base(new DataGridViewQueryValueTextBoxCell()) 10 | { 11 | 12 | } 13 | 14 | public override DataGridViewCell CellTemplate 15 | { 16 | get { return base.CellTemplate; } 17 | set 18 | { 19 | // Ensure that the cell used for the template is a DataGridViewQueryValueTextBoxCell. 20 | if (value != null && !value.GetType().IsAssignableFrom(typeof(DataGridViewQueryValueTextBoxCell))) 21 | { 22 | throw new InvalidCastException("Must be a ValueCell"); 23 | } 24 | base.CellTemplate = value; 25 | } 26 | } 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /src/HFM.Forms/Controls/FormBase.Designer.cs: -------------------------------------------------------------------------------- 1 | namespace HFM.Forms.Controls 2 | { 3 | partial class FormBase 4 | { 5 | /// 6 | /// Required designer variable. 7 | /// 8 | private System.ComponentModel.IContainer components = null; 9 | 10 | /// 11 | /// Clean up any resources being used. 12 | /// 13 | /// true if managed resources should be disposed; otherwise, false. 14 | protected override void Dispose(bool disposing) 15 | { 16 | if (disposing && (components != null)) 17 | { 18 | components.Dispose(); 19 | } 20 | base.Dispose(disposing); 21 | } 22 | 23 | #region Component Designer generated code 24 | 25 | /// 26 | /// Required method for Designer support - do not modify 27 | /// the contents of this method with the code editor. 28 | /// 29 | private void InitializeComponent() 30 | { 31 | components = new System.ComponentModel.Container(); 32 | // Removed in favor of CreateParams override 33 | //this.DoubleBuffered = true; 34 | } 35 | 36 | #endregion 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /src/HFM.Forms/Controls/LogLineRichTextBox.Designer.cs: -------------------------------------------------------------------------------- 1 | namespace HFM.Forms.Controls 2 | { 3 | partial class LogLineRichTextBox 4 | { 5 | /// 6 | /// Required designer variable. 7 | /// 8 | private System.ComponentModel.IContainer components = null; 9 | 10 | /// 11 | /// Clean up any resources being used. 12 | /// 13 | /// true if managed resources should be disposed; otherwise, false. 14 | protected override void Dispose(bool disposing) 15 | { 16 | if (disposing && (components != null)) 17 | { 18 | components.Dispose(); 19 | } 20 | base.Dispose(disposing); 21 | } 22 | 23 | #region Component Designer generated code 24 | 25 | /// 26 | /// Required method for Designer support - do not modify 27 | /// the contents of this method with the code editor. 28 | /// 29 | private void InitializeComponent() 30 | { 31 | components = new System.ComponentModel.Container(); 32 | DoubleBuffered = true; 33 | } 34 | 35 | #endregion 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /src/HFM.Forms/Internal/CollectionExtensions.cs: -------------------------------------------------------------------------------- 1 | namespace HFM.Forms.Internal; 2 | 3 | internal static class CollectionExtensions 4 | { 5 | /// 6 | /// Removes all existing items from the and adds the . 7 | /// 8 | internal static void Reset(this ICollection source, IEnumerable items) 9 | { 10 | source.Clear(); 11 | if (items != null) 12 | { 13 | // optimize for source List 14 | if (source is List list) 15 | { 16 | list.AddRange(items); 17 | } 18 | else 19 | { 20 | foreach (var item in items) 21 | { 22 | source.Add(item); 23 | } 24 | } 25 | } 26 | } 27 | 28 | internal static double MaxOrDefault(this ICollection source) => 29 | source.Count > 0 ? source.Max() : default; 30 | 31 | internal static double MaxOrDefault(this ICollection source, Func selector) => 32 | source.Count > 0 ? source.Max(selector) : default; 33 | } 34 | -------------------------------------------------------------------------------- /src/HFM.Forms/Internal/FileSystemPath.cs: -------------------------------------------------------------------------------- 1 | namespace HFM.Forms.Internal; 2 | 3 | internal static class FileSystemPath 4 | { 5 | /// 6 | /// Adds a trailing slash character to the path (Windows or Unix). 7 | /// 8 | internal static string AddTrailingSlash(string path) 9 | { 10 | if (path == null) return String.Empty; 11 | 12 | const char backSlash = '\\'; 13 | const char forwardSlash = '/'; 14 | 15 | char separatorChar = backSlash; 16 | if (path.TakeWhile(c => !c.Equals(backSlash)).Any(c => c.Equals(forwardSlash))) 17 | { 18 | separatorChar = forwardSlash; 19 | } 20 | 21 | // if the path is of sufficient length but does not 22 | // end with the detected directory separator character 23 | // then append the detected separator character 24 | if (path.Length > 2 && !path.EndsWith(separatorChar)) 25 | { 26 | path = String.Concat(path, separatorChar); 27 | } 28 | 29 | return path; 30 | } 31 | 32 | /// 33 | /// Adds a Unix trailing slash character to the path. 34 | /// 35 | internal static string AddUnixTrailingSlash(string path) 36 | { 37 | if (path == null) return String.Empty; 38 | 39 | if (!path.EndsWith('/')) 40 | { 41 | path = String.Concat(path, "/"); 42 | } 43 | 44 | return path; 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /src/HFM.Forms/Internal/ListSortDirectionExtensions.cs: -------------------------------------------------------------------------------- 1 | using System.ComponentModel; 2 | 3 | namespace HFM.Forms.Internal 4 | { 5 | internal static class ListSortDirectionExtensions 6 | { 7 | /// 8 | /// Returns "ASC" or "DESC". 9 | /// 10 | internal static string ToBindingSourceSortString(this ListSortDirection direction) 11 | { 12 | return direction.Equals(ListSortDirection.Descending) ? "DESC" : "ASC"; 13 | } 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /src/HFM.Forms/Internal/NativeMethods.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Runtime.InteropServices; 3 | 4 | namespace HFM.Forms.Internal 5 | { 6 | /// 7 | /// Contains P/Invoke methods for functions in the Windows API. 8 | /// 9 | internal static class NativeMethods 10 | { 11 | // ReSharper disable InconsistentNaming 12 | internal const int WM_VSCROLL = 277; 13 | //internal const int SB_LINEUP = 0; 14 | //internal const int SB_LINEDOWN = 1; 15 | //internal const int SB_TOP = 6; 16 | internal const int SB_BOTTOM = 7; 17 | //internal const int EM_LINESCROLL = 0x00B6; 18 | // ReSharper restore InconsistentNaming 19 | 20 | [DllImport("user32.dll", CharSet = CharSet.Auto)] 21 | [DefaultDllImportSearchPaths(DllImportSearchPath.System32)] 22 | internal static extern IntPtr SendMessage(IntPtr hWnd, uint msg, IntPtr wParam, IntPtr lParam); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /src/HFM.Forms/Internal/ProteinBenchmarkIdentifierExtensions.cs: -------------------------------------------------------------------------------- 1 |  2 | using System; 3 | 4 | using HFM.Core.Client; 5 | using HFM.Core.WorkUnits; 6 | 7 | namespace HFM.Forms.Internal 8 | { 9 | internal static class ProteinBenchmarkIdentifierExtensions 10 | { 11 | internal static string ToProcessorAndThreadsString(this ProteinBenchmarkIdentifier identifier, SlotType slotType) 12 | { 13 | return identifier.HasProcessor 14 | ? identifier.HasThreads 15 | ? $"{slotType}:{identifier.Threads} / {identifier.Processor}" 16 | : $"{slotType} / {identifier.Processor}" 17 | : String.Empty; 18 | } 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/HFM.Forms/Internal/WrapString.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Globalization; 3 | 4 | namespace HFM.Forms.Internal 5 | { 6 | internal static class WrapString 7 | { 8 | internal static string InQuotes(string value) => String.Format(CultureInfo.InvariantCulture, "\"{0}\"", value); 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /src/HFM.Forms/MinimizeToOption.cs: -------------------------------------------------------------------------------- 1 |  2 | namespace HFM.Forms 3 | { 4 | public enum MinimizeToOption 5 | { 6 | SystemTray, 7 | TaskBar, 8 | Both 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /src/HFM.Forms/Models/FahClientSettingsModelProfile.cs: -------------------------------------------------------------------------------- 1 |  2 | using AutoMapper; 3 | 4 | using HFM.Core.Client; 5 | 6 | namespace HFM.Forms.Models 7 | { 8 | public class FahClientSettingsModelProfile : Profile 9 | { 10 | public FahClientSettingsModelProfile() 11 | { 12 | CreateMap() 13 | .ForMember(dest => dest.ClientSettings, opt => opt.Ignore()) 14 | .ForMember(dest => dest.ConnectEnabled, opt => opt.Ignore()) 15 | .ForMember(dest => dest.Slots, opt => opt.Ignore()) 16 | .ReverseMap() 17 | .ForMember(dest => dest.ClientType, opt => opt.MapFrom(src => ClientType.FahClient)); 18 | } 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/HFM.Forms/Models/UserStatsDataModelProfile.cs: -------------------------------------------------------------------------------- 1 | using AutoMapper; 2 | 3 | using HFM.Core.UserStats; 4 | 5 | namespace HFM.Forms.Models; 6 | 7 | public class UserStatsDataModelProfile : Profile 8 | { 9 | public UserStatsDataModelProfile() 10 | { 11 | CreateMap() 12 | .DisableCtorValidation() 13 | .ForMember(dest => dest.ControlsVisible, opt => opt.Ignore()); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /src/HFM.Forms/Presenters/IDialogPresenter.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Windows.Forms; 3 | 4 | using HFM.Forms.Views; 5 | 6 | namespace HFM.Forms.Presenters 7 | { 8 | /// 9 | /// Defines a presenter that shows a modal dialog. 10 | /// 11 | public interface IDialogPresenter : IDisposable 12 | { 13 | IWin32Dialog Dialog { get; } 14 | 15 | DialogResult ShowDialog(IWin32Window owner); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/HFM.Forms/Presenters/IFormPresenter.cs: -------------------------------------------------------------------------------- 1 | using HFM.Forms.Views; 2 | 3 | namespace HFM.Forms.Presenters; 4 | 5 | /// 6 | /// Defines a presenter that shows a non-modal window. 7 | /// 8 | public interface IFormPresenter : IDisposable 9 | { 10 | IWin32Form Form { get; } 11 | 12 | void Show(); 13 | 14 | void Close(); 15 | 16 | event EventHandler Closed; 17 | } 18 | 19 | /// 20 | /// Defines a presenter that shows a non-modal window. 21 | /// 22 | public interface IAsyncFormPresenter : IDisposable 23 | { 24 | IWin32Form Form { get; } 25 | 26 | Task ShowAsync(); 27 | 28 | void Close(); 29 | 30 | event EventHandler Closed; 31 | } 32 | -------------------------------------------------------------------------------- /src/HFM.Forms/Presenters/MessagesPresenter.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Windows.Forms; 3 | 4 | using HFM.Forms.Models; 5 | using HFM.Forms.Views; 6 | 7 | namespace HFM.Forms.Presenters 8 | { 9 | public class MessagesPresenter : FormPresenter 10 | { 11 | public MessagesModel Model { get; } 12 | 13 | public MessagesPresenter(MessagesModel model) : base(model) 14 | { 15 | Model = model ?? throw new ArgumentNullException(nameof(model)); 16 | } 17 | 18 | public override void Show() 19 | { 20 | if (Form is null) 21 | { 22 | Model.Load(); 23 | 24 | Form = OnCreateForm(); 25 | Form.Closed += OnClosed; 26 | } 27 | 28 | Form.Show(); 29 | if (Form.WindowState == FormWindowState.Minimized) 30 | { 31 | Form.WindowState = FormWindowState.Normal; 32 | } 33 | else 34 | { 35 | Form.BringToFront(); 36 | } 37 | } 38 | 39 | protected override IWin32Form OnCreateForm() 40 | { 41 | return new MessagesForm(this); 42 | } 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /src/HFM.Forms/Presenters/NullServiceScopeFactory.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.Extensions.DependencyInjection; 2 | 3 | namespace HFM.Forms.Presenters 4 | { 5 | public class NullServiceScopeFactory : IServiceScopeFactory 6 | { 7 | public static NullServiceScopeFactory Instance { get; } = new NullServiceScopeFactory(); 8 | 9 | public IServiceScope CreateScope() => null; 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /src/HFM.Forms/Presenters/WorkUnitQueryPresenter.cs: -------------------------------------------------------------------------------- 1 | using System.Windows.Forms; 2 | 3 | using HFM.Core.Data; 4 | using HFM.Forms.Views; 5 | 6 | namespace HFM.Forms.Presenters 7 | { 8 | public class WorkUnitQueryPresenter : DialogPresenter 9 | { 10 | public WorkUnitQuery Query { get; set; } 11 | 12 | public WorkUnitQueryPresenter(WorkUnitQuery query) 13 | { 14 | Query = query; 15 | } 16 | 17 | protected override IWin32Dialog OnCreateDialog() => new WorkUnitQueryDialog(this); 18 | 19 | public void OKClicked() 20 | { 21 | Dialog.DialogResult = DialogResult.OK; 22 | Dialog.Close(); 23 | } 24 | 25 | public void CancelClicked() 26 | { 27 | Dialog.DialogResult = DialogResult.Cancel; 28 | Dialog.Close(); 29 | } 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /src/HFM.Forms/Properties/Settings.Designer.cs: -------------------------------------------------------------------------------- 1 | //------------------------------------------------------------------------------ 2 | // 3 | // This code was generated by a tool. 4 | // Runtime Version:4.0.30319.42000 5 | // 6 | // Changes to this file may cause incorrect behavior and will be lost if 7 | // the code is regenerated. 8 | // 9 | //------------------------------------------------------------------------------ 10 | 11 | namespace HFM.Forms.Properties { 12 | 13 | 14 | [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] 15 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "16.8.1.0")] 16 | internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { 17 | 18 | private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); 19 | 20 | public static Settings Default { 21 | get { 22 | return defaultInstance; 23 | } 24 | } 25 | 26 | [global::System.Configuration.ApplicationScopedSettingAttribute()] 27 | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] 28 | [global::System.Configuration.DefaultSettingValueAttribute("")] 29 | public string UpdateUrl { 30 | get { 31 | return ((string)(this["UpdateUrl"])); 32 | } 33 | } 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /src/HFM.Forms/Properties/Settings.settings: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /src/HFM.Forms/Resources/About.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harlam357/hfm-net/7a23cd3641a77c9a97b259c3c5412bdec23fd3e9/src/HFM.Forms/Resources/About.png -------------------------------------------------------------------------------- /src/HFM.Forms/Resources/Color.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harlam357/hfm-net/7a23cd3641a77c9a97b259c3c5412bdec23fd3e9/src/HFM.Forms/Resources/Color.png -------------------------------------------------------------------------------- /src/HFM.Forms/Resources/Copy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harlam357/hfm-net/7a23cd3641a77c9a97b259c3c5412bdec23fd3e9/src/HFM.Forms/Resources/Copy.png -------------------------------------------------------------------------------- /src/HFM.Forms/Resources/DataContainer_MoveFirstHS.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harlam357/hfm-net/7a23cd3641a77c9a97b259c3c5412bdec23fd3e9/src/HFM.Forms/Resources/DataContainer_MoveFirstHS.png -------------------------------------------------------------------------------- /src/HFM.Forms/Resources/DataContainer_MoveLastHS.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harlam357/hfm-net/7a23cd3641a77c9a97b259c3c5412bdec23fd3e9/src/HFM.Forms/Resources/DataContainer_MoveLastHS.png -------------------------------------------------------------------------------- /src/HFM.Forms/Resources/DataContainer_MoveNextHS.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harlam357/hfm-net/7a23cd3641a77c9a97b259c3c5412bdec23fd3e9/src/HFM.Forms/Resources/DataContainer_MoveNextHS.png -------------------------------------------------------------------------------- /src/HFM.Forms/Resources/DataContainer_MovePreviousHS.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harlam357/hfm-net/7a23cd3641a77c9a97b259c3c5412bdec23fd3e9/src/HFM.Forms/Resources/DataContainer_MovePreviousHS.png -------------------------------------------------------------------------------- /src/HFM.Forms/Resources/Delete.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harlam357/hfm-net/7a23cd3641a77c9a97b259c3c5412bdec23fd3e9/src/HFM.Forms/Resources/Delete.png -------------------------------------------------------------------------------- /src/HFM.Forms/Resources/DownArrow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harlam357/hfm-net/7a23cd3641a77c9a97b259c3c5412bdec23fd3e9/src/HFM.Forms/Resources/DownArrow.png -------------------------------------------------------------------------------- /src/HFM.Forms/Resources/HelpContents.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harlam357/hfm-net/7a23cd3641a77c9a97b259c3c5412bdec23fd3e9/src/HFM.Forms/Resources/HelpContents.png -------------------------------------------------------------------------------- /src/HFM.Forms/Resources/Maximize.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harlam357/hfm-net/7a23cd3641a77c9a97b259c3c5412bdec23fd3e9/src/HFM.Forms/Resources/Maximize.png -------------------------------------------------------------------------------- /src/HFM.Forms/Resources/Minimize.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harlam357/hfm-net/7a23cd3641a77c9a97b259c3c5412bdec23fd3e9/src/HFM.Forms/Resources/Minimize.png -------------------------------------------------------------------------------- /src/HFM.Forms/Resources/New.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harlam357/hfm-net/7a23cd3641a77c9a97b259c3c5412bdec23fd3e9/src/HFM.Forms/Resources/New.png -------------------------------------------------------------------------------- /src/HFM.Forms/Resources/Open.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harlam357/hfm-net/7a23cd3641a77c9a97b259c3c5412bdec23fd3e9/src/HFM.Forms/Resources/Open.png -------------------------------------------------------------------------------- /src/HFM.Forms/Resources/Quit.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harlam357/hfm-net/7a23cd3641a77c9a97b259c3c5412bdec23fd3e9/src/HFM.Forms/Resources/Quit.png -------------------------------------------------------------------------------- /src/HFM.Forms/Resources/Restore.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harlam357/hfm-net/7a23cd3641a77c9a97b259c3c5412bdec23fd3e9/src/HFM.Forms/Resources/Restore.png -------------------------------------------------------------------------------- /src/HFM.Forms/Resources/Save.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harlam357/hfm-net/7a23cd3641a77c9a97b259c3c5412bdec23fd3e9/src/HFM.Forms/Resources/Save.png -------------------------------------------------------------------------------- /src/HFM.Forms/Resources/SaveAs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harlam357/hfm-net/7a23cd3641a77c9a97b259c3c5412bdec23fd3e9/src/HFM.Forms/Resources/SaveAs.png -------------------------------------------------------------------------------- /src/HFM.Forms/Resources/UpArrow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harlam357/hfm-net/7a23cd3641a77c9a97b259c3c5412bdec23fd3e9/src/HFM.Forms/Resources/UpArrow.png -------------------------------------------------------------------------------- /src/HFM.Forms/Resources/hfm_48_48.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harlam357/hfm-net/7a23cd3641a77c9a97b259c3c5412bdec23fd3e9/src/HFM.Forms/Resources/hfm_48_48.ico -------------------------------------------------------------------------------- /src/HFM.Forms/Resources/hfm_logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harlam357/hfm-net/7a23cd3641a77c9a97b259c3c5412bdec23fd3e9/src/HFM.Forms/Resources/hfm_logo.png -------------------------------------------------------------------------------- /src/HFM.Forms/Resources/hfm_logo_large.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harlam357/hfm-net/7a23cd3641a77c9a97b259c3c5412bdec23fd3e9/src/HFM.Forms/Resources/hfm_logo_large.png -------------------------------------------------------------------------------- /src/HFM.Forms/Services/FahUserServiceExtensions.cs: -------------------------------------------------------------------------------- 1 | using HFM.Core.Logging; 2 | using HFM.Core.Services; 3 | 4 | namespace HFM.Forms.Services 5 | { 6 | internal static class FahUserServiceExtensions 7 | { 8 | internal static async Task FindUserAndLogError(this FahUserService userService, string name, ILogger logger) 9 | { 10 | try 11 | { 12 | return await userService.FindUser(name).ConfigureAwait(false); 13 | } 14 | catch (Exception ex) 15 | { 16 | logger.Error(ex.Message, ex); 17 | } 18 | 19 | return new FahUser(); 20 | } 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/HFM.Forms/Services/IAutoRunConfiguration.cs: -------------------------------------------------------------------------------- 1 | 2 | using System; 3 | 4 | namespace HFM.Forms 5 | { 6 | public interface IAutoRunConfiguration 7 | { 8 | /// 9 | /// Is auto run enabled? 10 | /// 11 | bool IsEnabled(); 12 | 13 | /// 14 | /// Sets the HFM.NET auto run value. 15 | /// 16 | /// The file path to HFM.exe executable. 17 | /// Auto run value cannot be set. 18 | void SetFilePath(string filePath); 19 | } 20 | 21 | public class InMemoryAutoRunConfiguration : IAutoRunConfiguration 22 | { 23 | public bool IsEnabled() 24 | { 25 | return !String.IsNullOrEmpty(_filePath); 26 | } 27 | 28 | private string _filePath; 29 | 30 | public void SetFilePath(string filePath) 31 | { 32 | _filePath = filePath; 33 | } 34 | } 35 | } -------------------------------------------------------------------------------- /src/HFM.Forms/Services/LocalProcessServiceExtensions.cs: -------------------------------------------------------------------------------- 1 | using HFM.Core.Logging; 2 | using HFM.Forms.Presenters; 3 | 4 | namespace HFM.Forms.Services 5 | { 6 | internal static class LocalProcessServiceExtensions 7 | { 8 | internal static void StartAndNotifyError(this LocalProcessService localProcess, string fileName, string errorMessage, ILogger logger, MessageBoxPresenter messageBox) 9 | { 10 | try 11 | { 12 | localProcess.Start(fileName); 13 | } 14 | catch (Exception ex) 15 | { 16 | logger.Error(ex.Message, ex); 17 | messageBox.ShowError(errorMessage, Core.Application.NameAndVersion); 18 | } 19 | } 20 | 21 | internal static void StartAndNotifyError(this LocalProcessService localProcess, string fileName, string arguments, string errorMessage, ILogger logger, MessageBoxPresenter messageBox) 22 | { 23 | try 24 | { 25 | localProcess.Start(fileName, arguments); 26 | } 27 | catch (Exception ex) 28 | { 29 | logger.Error(ex.Message, ex); 30 | messageBox.ShowError(errorMessage, Core.Application.NameAndVersion); 31 | } 32 | } 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /src/HFM.Forms/Views/ExceptionDialog.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Windows.Forms; 3 | 4 | using HFM.Forms.Presenters; 5 | 6 | namespace HFM.Forms.Views 7 | { 8 | public partial class ExceptionDialog : Form, IWin32Dialog 9 | { 10 | private readonly ExceptionPresenter _presenter; 11 | 12 | public ExceptionDialog(ExceptionPresenter presenter) 13 | { 14 | _presenter = presenter ?? throw new ArgumentNullException(nameof(presenter)); 15 | 16 | InitializeComponent(); 17 | 18 | if (_presenter.MustTerminate) 19 | { 20 | btnExit.Visible = false; 21 | btnContinue.Text = btnExit.Text; 22 | btnContinue.Left -= btnExit.Width - btnContinue.Width; 23 | btnContinue.Width = btnExit.Width; 24 | } 25 | 26 | exceptionTextBox.Text = _presenter.BuildExceptionText(); 27 | } 28 | 29 | private void btnReport_Click(object sender, EventArgs e) 30 | { 31 | _presenter.ReportClicked(copyErrorCheckBox.Checked); 32 | } 33 | 34 | private void btnContinue_Click(object sender, EventArgs e) 35 | { 36 | _presenter.ContinueClicked(); 37 | } 38 | 39 | private void btnExit_Click(object sender, EventArgs e) 40 | { 41 | _presenter.ExitClicked(); 42 | } 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /src/HFM.Forms/Views/IWin32Dialog.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Windows.Forms; 3 | 4 | namespace HFM.Forms.Views 5 | { 6 | public interface IWin32Dialog : IWin32Window, IDisposable 7 | { 8 | DialogResult DialogResult { get; set; } 9 | 10 | DialogResult ShowDialog(IWin32Window owner); 11 | 12 | void Close(); 13 | 14 | event EventHandler Closed; 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /src/HFM.Forms/Views/IWin32Form.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.ComponentModel; 3 | using System.Drawing; 4 | using System.Windows.Forms; 5 | 6 | namespace HFM.Forms.Views 7 | { 8 | public interface IWin32Form : IWin32Window, ISynchronizeInvoke, IDisposable 9 | { 10 | void Show(); 11 | 12 | void Close(); 13 | 14 | FormWindowState WindowState { get; set; } 15 | 16 | void BringToFront(); 17 | 18 | Point Location { get; set; } 19 | 20 | Size Size { get; set; } 21 | 22 | Size MinimumSize { get; } 23 | 24 | event EventHandler Closed; 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/HFM.Forms/Views/ProteinChangesDialog.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | 4 | using HFM.Forms.Controls; 5 | using HFM.Proteins; 6 | 7 | namespace HFM.Forms.Views 8 | { 9 | public partial class ProteinChangesDialog : FormBase 10 | { 11 | private readonly IEnumerable _proteinChanges; 12 | 13 | public ProteinChangesDialog(IEnumerable proteinChanges) 14 | { 15 | _proteinChanges = proteinChanges ?? throw new ArgumentNullException(nameof(proteinChanges)); 16 | 17 | InitializeComponent(); 18 | EscapeKeyReturnsCancelDialogResult(); 19 | } 20 | 21 | private void ProteinLoadResultsDialog_Load(object sender, EventArgs e) 22 | { 23 | LoadData(); 24 | } 25 | 26 | private void LoadData() 27 | { 28 | foreach (var change in _proteinChanges) 29 | { 30 | changesListBox.Items.Add(change.ToString()); 31 | } 32 | } 33 | 34 | private void okButton_Click(object sender, EventArgs e) 35 | { 36 | Close(); 37 | } 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /src/HFM.Forms/app.config: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 |
6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /src/HFM.Preferences.Tests/ArtifactFolder.cs: -------------------------------------------------------------------------------- 1 |  2 | using System; 3 | using System.IO; 4 | 5 | namespace HFM.Preferences 6 | { 7 | public class ArtifactFolder : IDisposable 8 | { 9 | public string Path { get; private set; } 10 | 11 | public ArtifactFolder() 12 | : this(Environment.CurrentDirectory) 13 | { 14 | 15 | } 16 | 17 | public ArtifactFolder(string basePath) 18 | { 19 | Path = System.IO.Path.Combine(basePath, System.IO.Path.GetRandomFileName()); 20 | Directory.CreateDirectory(Path); 21 | } 22 | 23 | public void Dispose() 24 | { 25 | TryDeleteDirectory(); 26 | GC.SuppressFinalize(this); 27 | } 28 | 29 | private void TryDeleteDirectory() 30 | { 31 | try 32 | { 33 | Directory.Delete(Path, true); 34 | } 35 | catch (Exception) 36 | { 37 | 38 | } 39 | } 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /src/HFM.Preferences.Tests/HFM.Preferences.Tests.csproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | net6.0 5 | HFM.Preferences 6 | false 7 | true 8 | ..\harlam357.snk 9 | false 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | all 19 | runtime; build; native; contentfiles; analyzers; buildtransitive 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /src/HFM.Preferences.Tests/SetUpFixture.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | 3 | using NUnit.Framework; 4 | 5 | namespace HFM.Preferences 6 | { 7 | [SetUpFixture] 8 | public class SetUpFixture 9 | { 10 | [OneTimeSetUp] 11 | public void SetEnvironmentCurrentDirectory() 12 | { 13 | Environment.CurrentDirectory = TestContext.CurrentContext.TestDirectory; 14 | } 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /src/HFM.Preferences/AssemblyAttributes.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Runtime.CompilerServices; 3 | 4 | [assembly: CLSCompliant(false)] 5 | [assembly: InternalsVisibleTo("HFM.Preferences.Tests, PublicKey=0024000004800000940000000602000000240000525341310004000001000100e14183a4b02c8425c363ab94d0615ec82b061c1edd9e1258db3a9f13b1a4f099d8a4a7b50e1010f6efeb3c822f256c587000e474752d6dbda1ec27858c99ba4998183b857fc98d9dc5c8fd2bcf4a43ffeab5d2a37e52d71950dfbe106d472cc88382f491ee54827f024a535395d01a183394a4b6157b283d129402630b1ce3d5")] 6 | -------------------------------------------------------------------------------- /src/HFM.Preferences/FormColumnPreference.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Globalization; 3 | 4 | namespace HFM.Preferences 5 | { 6 | public static class FormColumnPreference 7 | { 8 | public static (int DisplayIndex, int Width, bool Visible, int Index)? Parse(string value) 9 | { 10 | string[] tokens = value.Split(','); 11 | if (tokens.Length != 4) return null; 12 | return (Int32.Parse(tokens[0]), Int32.Parse(tokens[1]), Boolean.Parse(tokens[2]), Int32.Parse(tokens[3])); 13 | } 14 | 15 | public static string Format(int displayIndex, int width, bool visible, int index) 16 | { 17 | return String.Format(CultureInfo.InvariantCulture, 18 | "{0},{1},{2},{3}", 19 | displayIndex.ToString("D2"), 20 | width, 21 | visible, 22 | index); 23 | } 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /src/HFM.Preferences/HFM.Preferences.csproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | net6.0 5 | true 6 | ..\harlam357.snk 7 | false 8 | true 9 | AllEnabledByDefault 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /src/HFM.Preferences/IPreferences.cs: -------------------------------------------------------------------------------- 1 | namespace HFM.Preferences; 2 | 3 | public interface IPreferences 4 | { 5 | /// 6 | /// Resets the preferences to default values. 7 | /// 8 | void Reset(); 9 | 10 | /// 11 | /// Loads the preferences from the last saved values. 12 | /// 13 | void Load(); 14 | 15 | /// 16 | /// Saves the preferences. 17 | /// 18 | void Save(); 19 | 20 | /// 21 | /// Gets a preference value. 22 | /// 23 | /// The type of the preference value. 24 | /// The preference key. 25 | T Get(Preference key); 26 | 27 | /// 28 | /// Sets a preference value. 29 | /// 30 | /// The type of the preference value. 31 | /// The preference key. 32 | /// The preference value. 33 | void Set(Preference key, T value); 34 | 35 | /// 36 | /// Raised when a preference value is changed. 37 | /// 38 | event EventHandler PreferenceChanged; 39 | } 40 | 41 | public class PreferenceChangedEventArgs : EventArgs 42 | { 43 | public Preference Preference { get; } 44 | 45 | public PreferenceChangedEventArgs(Preference preference) 46 | { 47 | Preference = preference; 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /src/HFM.Preferences/InMemoryPreferencesProvider.cs: -------------------------------------------------------------------------------- 1 |  2 | namespace HFM.Preferences 3 | { 4 | public class InMemoryPreferencesProvider : PreferencesProvider 5 | { 6 | public InMemoryPreferencesProvider() : base(null, null, null) 7 | { 8 | 9 | } 10 | 11 | public InMemoryPreferencesProvider(string applicationPath, string applicationDataFolderPath, string applicationVersion) 12 | : base(applicationPath, applicationDataFolderPath, applicationVersion) 13 | { 14 | 15 | } 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/HFM.Preferences/Internal/ObjectExtensions.cs: -------------------------------------------------------------------------------- 1 |  2 | using System; 3 | 4 | namespace HFM.Preferences.Internal 5 | { 6 | internal static class ObjectExtensions 7 | { 8 | internal static T Copy(this T value) 9 | { 10 | if (null == (object)value) 11 | { 12 | return value; 13 | } 14 | return Copy(value, value.GetType()); 15 | } 16 | 17 | internal static T Copy(this T value, Type dataType) 18 | { 19 | if (dataType.IsValueType || dataType == typeof(string) || null == (object)value) 20 | { 21 | return value; 22 | } 23 | return (T)Activator.CreateInstance(dataType, value); 24 | } 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/HFM.Preferences/Internal/TypeExtensions.cs: -------------------------------------------------------------------------------- 1 |  2 | using System; 3 | using System.Collections.Generic; 4 | using System.Linq; 5 | 6 | namespace HFM.Preferences.Internal 7 | { 8 | internal static class TypeExtensions 9 | { 10 | private static bool IsGenericList(this Type type) 11 | { 12 | return type.IsGenericType && type.GetGenericTypeDefinition() == typeof(List<>); 13 | } 14 | 15 | private static bool IsGenericIEnumerable(this Type type) 16 | { 17 | return type.IsGenericType && type.GetGenericTypeDefinition() == typeof(IEnumerable<>); 18 | } 19 | 20 | private static bool ImplementsGenericIEnumerable(this Type type) 21 | { 22 | return type.GetInterfaces().Where(x => x.IsGenericType).Select(x => x.GetGenericTypeDefinition()).Contains(typeof(IEnumerable<>)); 23 | } 24 | 25 | private static bool GenericArgumentsEquals(this Type type1, Type type2) 26 | { 27 | return type1.GetGenericArguments().SequenceEqual(type2.GetGenericArguments()); 28 | } 29 | 30 | internal static bool CanBeCreatedFrom(this Type type1, Type type2) 31 | { 32 | // List 33 | return type1.IsGenericList() && 34 | (type2.IsGenericIEnumerable() || 35 | type2.ImplementsGenericIEnumerable()) && 36 | type1.GenericArgumentsEquals(type2); 37 | } 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /src/HFM.Preferences/app.config: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /src/HFM.Preferences/packages.lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": 1, 3 | "dependencies": { 4 | "net6.0": {} 5 | } 6 | } -------------------------------------------------------------------------------- /src/HFM.Setup.CustomActions/CustomAction.config: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 31 | 32 | 33 | -------------------------------------------------------------------------------- /src/HFM.Setup.CustomActions/CustomAction.cs: -------------------------------------------------------------------------------- 1 |  2 | using System.IO; 3 | 4 | using Microsoft.Deployment.WindowsInstaller; 5 | 6 | namespace HFM.Setup.CustomActions 7 | { 8 | public class CustomActions 9 | { 10 | [CustomAction] 11 | public static ActionResult DeleteAppDataFolderFilesAction(Session session) 12 | { 13 | string appDataFolderPath = session["AppDataFolder"]; 14 | string unitInfoCachePath = Path.Combine(appDataFolderPath, "HFM", "UnitInfoCache.dat"); 15 | if (File.Exists(unitInfoCachePath)) 16 | { 17 | session.Log("Deleting {0}", unitInfoCachePath); 18 | File.Delete(unitInfoCachePath); 19 | } 20 | return ActionResult.Success; 21 | } 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/HFM.Setup.CustomActions/Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using System.Runtime.CompilerServices; 3 | using System.Runtime.InteropServices; 4 | 5 | // General Information about an assembly is controlled through the following 6 | // set of attributes. Change these attribute values to modify the information 7 | // associated with an assembly. 8 | [assembly: AssemblyTitle("HFM.Setup.CustomActions")] 9 | [assembly: AssemblyDescription("")] 10 | [assembly: AssemblyCompany("")] 11 | [assembly: AssemblyProduct("HFM.Setup.CustomActions")] 12 | [assembly: AssemblyCopyright("Copyright © 2016")] 13 | [assembly: AssemblyTrademark("")] 14 | [assembly: AssemblyCulture("")] 15 | 16 | // Setting ComVisible to false makes the types in this assembly not visible 17 | // to COM components. If you need to access a type in this assembly from 18 | // COM, set the ComVisible attribute to true on that type. 19 | [assembly: ComVisible(false)] 20 | 21 | // The following GUID is for the ID of the typelib if this project is exposed to COM 22 | [assembly: Guid("b6c5b92f-e68b-4426-b3bd-5693d2c76e9a")] 23 | 24 | // Version information for an assembly consists of the following four values: 25 | // 26 | // Major Version 27 | // Minor Version 28 | // Build Number 29 | // Revision 30 | // 31 | // You can specify all the values or you can default the Build and Revision Numbers 32 | // by using the '*' as shown below: 33 | // [assembly: AssemblyVersion("1.0.*")] 34 | [assembly: AssemblyVersion("1.0.0.0")] 35 | [assembly: AssemblyFileVersion("1.0.0.0")] 36 | -------------------------------------------------------------------------------- /src/HFM.Setup.sln: -------------------------------------------------------------------------------- 1 |  2 | Microsoft Visual Studio Solution File, Format Version 12.00 3 | # Visual Studio 2013 4 | VisualStudioVersion = 12.0.40629.0 5 | MinimumVisualStudioVersion = 10.0.40219.1 6 | Project("{930C7802-8A8C-48F9-8165-68863BCCD9DD}") = "HFM.Setup", "HFM.Setup\HFM.Setup.wixproj", "{CCDB70B7-BC0F-4DC2-B7F8-CC7B3A98C7F1}" 7 | EndProject 8 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HFM.Setup.CustomActions", "HFM.Setup.CustomActions\HFM.Setup.CustomActions.csproj", "{390AE0A7-0235-425C-AEA0-575E8AC3DFB1}" 9 | EndProject 10 | Global 11 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 12 | Debug|x86 = Debug|x86 13 | Release|x86 = Release|x86 14 | EndGlobalSection 15 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 16 | {CCDB70B7-BC0F-4DC2-B7F8-CC7B3A98C7F1}.Debug|x86.ActiveCfg = Debug|x86 17 | {CCDB70B7-BC0F-4DC2-B7F8-CC7B3A98C7F1}.Debug|x86.Build.0 = Debug|x86 18 | {CCDB70B7-BC0F-4DC2-B7F8-CC7B3A98C7F1}.Release|x86.ActiveCfg = Release|x86 19 | {CCDB70B7-BC0F-4DC2-B7F8-CC7B3A98C7F1}.Release|x86.Build.0 = Release|x86 20 | {390AE0A7-0235-425C-AEA0-575E8AC3DFB1}.Debug|x86.ActiveCfg = Debug|x86 21 | {390AE0A7-0235-425C-AEA0-575E8AC3DFB1}.Debug|x86.Build.0 = Debug|x86 22 | {390AE0A7-0235-425C-AEA0-575E8AC3DFB1}.Release|x86.ActiveCfg = Release|x86 23 | {390AE0A7-0235-425C-AEA0-575E8AC3DFB1}.Release|x86.Build.0 = Release|x86 24 | EndGlobalSection 25 | GlobalSection(SolutionProperties) = preSolution 26 | HideSolutionNode = FALSE 27 | EndGlobalSection 28 | EndGlobal 29 | -------------------------------------------------------------------------------- /src/HFM.Setup/Background.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harlam357/hfm-net/7a23cd3641a77c9a97b259c3c5412bdec23fd3e9/src/HFM.Setup/Background.bmp -------------------------------------------------------------------------------- /src/HFM.Setup/Banner original.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harlam357/hfm-net/7a23cd3641a77c9a97b259c3c5412bdec23fd3e9/src/HFM.Setup/Banner original.bmp -------------------------------------------------------------------------------- /src/HFM.Setup/Banner.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harlam357/hfm-net/7a23cd3641a77c9a97b259c3c5412bdec23fd3e9/src/HFM.Setup/Banner.bmp -------------------------------------------------------------------------------- /src/HFM.Setup/WixFileVersionExtension.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harlam357/hfm-net/7a23cd3641a77c9a97b259c3c5412bdec23fd3e9/src/HFM.Setup/WixFileVersionExtension.dll -------------------------------------------------------------------------------- /src/HFM/AssemblyAttributes.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Resources; 3 | using System.Runtime.Versioning; 4 | 5 | [assembly: CLSCompliant(false)] 6 | [assembly: NeutralResourcesLanguage("en-US")] 7 | #if NET5_0 8 | [assembly: SupportedOSPlatform("windows7.0")] 9 | #endif 10 | -------------------------------------------------------------------------------- /src/HFM/CSS/Blue.css: -------------------------------------------------------------------------------- 1 | .table-heading { 2 | background-color: #005AFF; 3 | color: #FFFFFF; 4 | } 5 | 6 | .table-column { 7 | background-color: #EFF5FF; 8 | } 9 | 10 | .table-column-alt { 11 | background-color: #CCDEFF; 12 | } 13 | 14 | .column { 15 | background-color: #EFF5FF; 16 | } 17 | -------------------------------------------------------------------------------- /src/HFM/CSS/BlueTwo.css: -------------------------------------------------------------------------------- 1 | .table-heading { 2 | background-color: #2d5873; 3 | color: #FFFFFF; 4 | } 5 | 6 | .table-column { 7 | background-color: #d8f1ff; 8 | } 9 | 10 | .table-column-alt { 11 | background-color: #82b8d8; 12 | } 13 | 14 | .column { 15 | background-color: #d8f1ff; 16 | } 17 | -------------------------------------------------------------------------------- /src/HFM/CSS/Green.css: -------------------------------------------------------------------------------- 1 | .table-heading { 2 | background-color: #164A41; 3 | color: #FFFFFF; 4 | } 5 | 6 | .table-column { 7 | background-color: #e3ffd8; 8 | } 9 | 10 | .table-column-alt { 11 | background-color: #badabc; 12 | } 13 | 14 | .column { 15 | background-color: #e3ffd8; 16 | } 17 | -------------------------------------------------------------------------------- /src/HFM/CSS/Grey.css: -------------------------------------------------------------------------------- 1 | .table-heading { 2 | background-color: #111111; 3 | color: #FFFFFF; 4 | } 5 | 6 | .table-column { 7 | background-color: #F5F5F5; 8 | } 9 | 10 | .table-column-alt { 11 | background-color: #E5E5E5; 12 | } 13 | 14 | .column { 15 | background-color: #F5F5F5; 16 | } 17 | -------------------------------------------------------------------------------- /src/HFM/CSS/HFM.css: -------------------------------------------------------------------------------- 1 | body 2 | { 3 | font-size: 0.75rem; 4 | } 5 | 6 | .column { 7 | border: 1px solid #DEE2E6; 8 | } 9 | -------------------------------------------------------------------------------- /src/HFM/CSS/None.css: -------------------------------------------------------------------------------- 1 | .table-heading { 2 | background-color: #FFFFFF; 3 | color: #000000; 4 | } 5 | 6 | .table-column { 7 | background-color: #FFFFFF; 8 | } 9 | 10 | .table-column-alt { 11 | background-color: #FFFFFF; 12 | } 13 | 14 | .column { 15 | background-color: #FFFFFF; 16 | } -------------------------------------------------------------------------------- /src/HFM/CSS/Orange.css: -------------------------------------------------------------------------------- 1 | .table-heading { 2 | background-color: #F7882F; 3 | color: #FFFFFF; 4 | } 5 | 6 | .table-column { 7 | background-color: #fff3e5; 8 | } 9 | 10 | .table-column-alt { 11 | background-color: #ffd6a6; 12 | } 13 | 14 | .column { 15 | background-color: #fff3e5; 16 | } 17 | -------------------------------------------------------------------------------- /src/HFM/CSS/Purple.css: -------------------------------------------------------------------------------- 1 | .table-heading { 2 | background-color: #7700FF; 3 | color: #FFFFFF; 4 | } 5 | 6 | .table-column { 7 | background-color: #faf6ff; 8 | } 9 | 10 | .table-column-alt { 11 | background-color: #ead8ff; 12 | } 13 | 14 | .column { 15 | background-color: #faf6ff; 16 | } 17 | -------------------------------------------------------------------------------- /src/HFM/CSS/Red.css: -------------------------------------------------------------------------------- 1 | .table-heading { 2 | background-color: #7F0000; 3 | color: #FFFFFF; 4 | } 5 | 6 | .table-column { 7 | background-color: #f2e6e6; 8 | } 9 | 10 | .table-column-alt { 11 | background-color: #daa5a5; 12 | } 13 | 14 | .column { 15 | background-color: #f2e6e6; 16 | } 17 | -------------------------------------------------------------------------------- /src/HFM/CSS/Yellow.css: -------------------------------------------------------------------------------- 1 | .table-heading { 2 | background-color: #cdc129; 3 | color: #FFFFFF; 4 | } 5 | 6 | .table-column { 7 | background-color: #ffffe5; 8 | } 9 | 10 | .table-column-alt { 11 | background-color: #fff2b2; 12 | } 13 | 14 | .column { 15 | background-color: #ffffe5; 16 | } 17 | -------------------------------------------------------------------------------- /src/HFM/Core/ApplicationUpdates/CompositionRoot.cs: -------------------------------------------------------------------------------- 1 | using LightInject; 2 | 3 | namespace HFM.Core.ApplicationUpdates; 4 | 5 | internal class CompositionRoot : ICompositionRoot 6 | { 7 | public void Compose(IServiceRegistry serviceRegistry) 8 | { 9 | serviceRegistry.Register(new PerScopeLifetime()); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /src/HFM/Core/Client/CompositionRoot.cs: -------------------------------------------------------------------------------- 1 | using LightInject; 2 | 3 | namespace HFM.Core.Client; 4 | 5 | internal class CompositionRoot : ICompositionRoot 6 | { 7 | public void Compose(IServiceRegistry serviceRegistry) 8 | { 9 | serviceRegistry.Register(new PerContainerLifetime()); 10 | 11 | serviceRegistry.Register(factory => 12 | { 13 | var clientFactories = new Dictionary 14 | { 15 | { 16 | ClientType.FahClient, 17 | new FahClientTypeFactory(factory.GetInstance) 18 | } 19 | }; 20 | return new ClientFactory(clientFactories); 21 | }, new PerContainerLifetime()); 22 | 23 | serviceRegistry.Register(new PerRequestLifeTime()); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /src/HFM/Core/Data/CompositionRoot.cs: -------------------------------------------------------------------------------- 1 | using LightInject; 2 | 3 | namespace HFM.Core.Data; 4 | 5 | internal class CompositionRoot : ICompositionRoot 6 | { 7 | public void Compose(IServiceRegistry serviceRegistry) 8 | { 9 | serviceRegistry.Register(new PerContainerLifetime()); 10 | serviceRegistry.Initialize((_, instance) => instance.Read()); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /src/HFM/Core/Data/Sqlite/CompositionRoot.cs: -------------------------------------------------------------------------------- 1 | using LightInject; 2 | 3 | namespace HFM.Core.Data.Sqlite; 4 | 5 | internal class CompositionRoot : ICompositionRoot 6 | { 7 | public void Compose(IServiceRegistry serviceRegistry) 8 | { 9 | serviceRegistry.Register(new PerRequestLifeTime()); 10 | 11 | serviceRegistry.Register(new PerContainerLifetime()); 12 | serviceRegistry.Register(new PerContainerLifetime()); 13 | serviceRegistry.Decorate(); 14 | 15 | serviceRegistry.AddDbContext(CreateWorkUnitContext); 16 | } 17 | 18 | private static WorkUnitContext CreateWorkUnitContext(IServiceFactory factory) 19 | { 20 | var preferences = factory.GetInstance(); 21 | string appDataPath = preferences.Get(Preferences.Preference.ApplicationDataFolderPath); 22 | string connectionString = $"Data Source={Path.Combine(appDataPath, "WorkUnits.db")}"; 23 | return new WorkUnitContext(connectionString); 24 | } 25 | } 26 | 27 | internal static class ServiceRegistryExtensions 28 | { 29 | internal static IServiceRegistry AddDbContext(this IServiceRegistry serviceRegistry, Func factory) 30 | where TContext : Microsoft.EntityFrameworkCore.DbContext => 31 | serviceRegistry.Register(factory, new PerScopeLifetime()); 32 | } 33 | -------------------------------------------------------------------------------- /src/HFM/Core/Logging/CompositionRoot.cs: -------------------------------------------------------------------------------- 1 | using LightInject; 2 | 3 | namespace HFM.Core.Logging; 4 | 5 | internal class CompositionRoot : ICompositionRoot 6 | { 7 | public void Compose(IServiceRegistry serviceRegistry) 8 | { 9 | var logger = new Logger(Application.DataFolderPath); 10 | serviceRegistry.Register(_ => logger, new PerContainerLifetime()); 11 | serviceRegistry.Register(_ => logger, new PerContainerLifetime()); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/HFM/Core/UserStats/CompositionRoot.cs: -------------------------------------------------------------------------------- 1 | using LightInject; 2 | 3 | namespace HFM.Core.UserStats; 4 | 5 | internal class CompositionRoot : ICompositionRoot 6 | { 7 | public void Compose(IServiceRegistry serviceRegistry) 8 | { 9 | serviceRegistry.Register(new PerContainerLifetime()); 10 | serviceRegistry.Initialize((_, instance) => instance.Read()); 11 | serviceRegistry.Register(new PerContainerLifetime()); 12 | serviceRegistry.Register(new PerContainerLifetime()); 13 | serviceRegistry.Initialize((_, instance) => instance.RunOrStartIfEnabled()); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /src/HFM/Core/WorkUnits/CompositionRoot.cs: -------------------------------------------------------------------------------- 1 | using LightInject; 2 | 3 | namespace HFM.Core.WorkUnits; 4 | 5 | internal class CompositionRoot : ICompositionRoot 6 | { 7 | public void Compose(IServiceRegistry serviceRegistry) 8 | { 9 | serviceRegistry.Register(new PerContainerLifetime()); 10 | serviceRegistry.Initialize((_, instance) => instance.Read()); 11 | serviceRegistry.Register(new PerContainerLifetime()); 12 | serviceRegistry.Register(new PerContainerLifetime()); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /src/HFM/Preferences/CompositionRoot.cs: -------------------------------------------------------------------------------- 1 | using LightInject; 2 | 3 | using Application = HFM.Core.Application; 4 | 5 | namespace HFM.Preferences; 6 | 7 | internal class CompositionRoot : ICompositionRoot 8 | { 9 | public void Compose(IServiceRegistry serviceRegistry) 10 | { 11 | var provider = new XmlPreferencesProvider(Application.Path, Application.DataFolderPath, Application.Version); 12 | serviceRegistry.Register(_ => provider, new PerContainerLifetime()); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /src/HFM/ServiceRegistryExtensions.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | 3 | using LightInject; 4 | 5 | namespace HFM 6 | { 7 | public static class ServiceRegistryExtensions 8 | { 9 | /// Allows post-processing of a service instance. 10 | /// An action delegate that exposes the created service instance. 11 | /// The , for chaining calls. 12 | public static IServiceRegistry Initialize(this IServiceRegistry serviceRegistry, Action processor) 13 | { 14 | return serviceRegistry.Initialize(registration => registration.ServiceType == typeof(TService), 15 | (factory, instance) => processor(factory, (TService)instance)); 16 | } 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/HFM/SingleInstanceHelper.cs: -------------------------------------------------------------------------------- 1 | /* 2 | * Class based primarily on code from: http://www.codeproject.com/KB/threads/SingleInstancingWithIpc.aspx 3 | */ 4 | 5 | using System; 6 | using System.Globalization; 7 | using System.Reflection; 8 | using System.Threading; 9 | 10 | namespace HFM 11 | { 12 | internal static class SingleInstanceHelper 13 | { 14 | // ReSharper disable once NotAccessedField.Local 15 | #pragma warning disable IDE0052 // Remove unread private members 16 | private static Mutex _Mutex; 17 | #pragma warning restore IDE0052 // Remove unread private members 18 | 19 | private static readonly string _AssemblyGuid = GetAssemblyGuid(); 20 | private static readonly string _MutexName = String.Format(CultureInfo.InvariantCulture, "Global\\hfm-{0}-{1}", Environment.UserName, _AssemblyGuid); 21 | 22 | public static bool Start() 23 | { 24 | _Mutex = new Mutex(true, _MutexName, out bool onlyInstance); 25 | return onlyInstance; 26 | } 27 | 28 | private static string GetAssemblyGuid() 29 | { 30 | object[] attributes = Assembly.GetEntryAssembly().GetCustomAttributes(typeof(System.Runtime.InteropServices.GuidAttribute), false); 31 | if (attributes.Length == 0) 32 | { 33 | return String.Empty; 34 | } 35 | return ((System.Runtime.InteropServices.GuidAttribute)attributes[0]).Value; 36 | } 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /src/HFM/StartupException.cs: -------------------------------------------------------------------------------- 1 |  2 | using System; 3 | 4 | namespace HFM 5 | { 6 | [Serializable] 7 | public class StartupException : Exception 8 | { 9 | public StartupException() 10 | { 11 | } 12 | 13 | public StartupException(string message) : base(message) 14 | { 15 | } 16 | 17 | public StartupException(string message, Exception innerException) : base(message, innerException) 18 | { 19 | } 20 | 21 | protected StartupException(System.Runtime.Serialization.SerializationInfo info, System.Runtime.Serialization.StreamingContext context) 22 | : base(info, context) 23 | { 24 | } 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/HFM/app.config: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 |
6 | 7 | 8 | 9 | 10 | 11 | https://hfmnet.blob.core.windows.net/hfmnet/ApplicationUpdate.xml 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /src/HFM/hfm_48_48.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harlam357/hfm-net/7a23cd3641a77c9a97b259c3c5412bdec23fd3e9/src/HFM/hfm_48_48.ico -------------------------------------------------------------------------------- /src/HFM/hfm_48_48_original.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harlam357/hfm-net/7a23cd3641a77c9a97b259c3c5412bdec23fd3e9/src/HFM/hfm_48_48_original.ico -------------------------------------------------------------------------------- /src/TestFiles/Client_v7_1/heartbeat.txt: -------------------------------------------------------------------------------- 1 | PyON 1 heartbeat 2 | 12 3 | --- 4 | -------------------------------------------------------------------------------- /src/TestFiles/Client_v7_1/log-update_4.txt: -------------------------------------------------------------------------------- 1 | PyON 1 log-update 2 | "23:10:11:Unit 00:Completed 580000 out of 1000000 steps (58%)\n" 3 | --- 4 | -------------------------------------------------------------------------------- /src/TestFiles/Client_v7_1/partial-info.txt: -------------------------------------------------------------------------------- 1 | PyON 1 info 2 | [ 3 | [ 4 | "Folding@home Client", 5 | [ 6 | "Website", 7 | "http://folding.stanford.edu/" 8 | ], 9 | [ 10 | "Copyright", 11 | "(c) 2009,2010 Stanford University" 12 | ], -------------------------------------------------------------------------------- /src/TestFiles/Client_v7_1/simulation-info.txt: -------------------------------------------------------------------------------- 1 | PyON 1 simulation-info 2 | { 3 | "user": "harlam357", 4 | "team": "32", 5 | "project": 11020, 6 | "run": 0, 7 | "clone": 1921, 8 | "gen": 24, 9 | "core_type": 163, 10 | "core": "GROGBSMP", 11 | "description": "", 12 | "total_iterations": 1000, 13 | "iterations_done": 590, 14 | "energy": 0, 15 | "temperature": 0, 16 | "start_time": "27/May/2011-19:34:24", 17 | "timeout": 1307216064, 18 | "deadline": 1307561664, 19 | "run_time": 13028, 20 | "simulation_time": 0, 21 | "eta": 8844, 22 | "news": "" 23 | } 24 | --- 25 | -------------------------------------------------------------------------------- /src/TestFiles/Client_v7_1/slot-options.txt: -------------------------------------------------------------------------------- 1 | PyON 1 slot-options 2 | { 3 | "client-type": "normal", 4 | "client-subtype": "SMP", 5 | "machine-id": "0", 6 | "max-packet-size": "normal", 7 | "core-priority": "idle", 8 | "next-unit-percentage": "99", 9 | "max-units": "0", 10 | "checkpoint": "15", 11 | "pause-on-start": "true", 12 | "gpu-vendor-id": None, 13 | "gpu-device-id": None 14 | } 15 | --- 16 | -------------------------------------------------------------------------------- /src/TestFiles/Client_v7_1/slots.txt: -------------------------------------------------------------------------------- 1 | PyON 1 slots 2 | [ 3 | { 4 | "id": "00", 5 | "status": "RUNNING", 6 | "description": "smp:4", 7 | "options": { 8 | "pause-on-start": "true" 9 | } 10 | } 11 | ] 12 | --- 13 | -------------------------------------------------------------------------------- /src/TestFiles/Client_v7_1/units.txt: -------------------------------------------------------------------------------- 1 | PyON 1 units 2 | [ 3 | { 4 | "id": "00", 5 | "state": "RUNNING", 6 | "project": 11020, 7 | "run": 0, 8 | "clone": 1921, 9 | "gen": 24, 10 | "core": "0xa3", 11 | "unit": "0x000000210a3b1e5b4d824701aee79f1e", 12 | "percentdone": "59.00%", 13 | "totalframes": 1000, 14 | "framesdone": 590, 15 | "assigned": "27/May/2011-19:34:24", 16 | "timeout": "04/Jun/2011-19:34:24", 17 | "deadline": "08/Jun/2011-19:34:24", 18 | "ws": "171.64.65.55", 19 | "cs": "171.67.108.26", 20 | "waitingon": "", 21 | "attempts": 0, 22 | "nextattempt": "0.00 secs", 23 | "slot": 0, 24 | "eta": "2 hours 28 mins", 25 | "ppd": "1749.96", 26 | "tpf": "3 mins 38 secs", 27 | "basecredit": "443.00", 28 | "creditestimate": "443.00" 29 | } 30 | ] 31 | --- 32 | -------------------------------------------------------------------------------- /src/TestFiles/Client_v7_10/simulation-info1.txt: -------------------------------------------------------------------------------- 1 | PyON 1 simulation-info 2 | { 3 | "user": "harlam357", 4 | "team": "32", 5 | "project": 7610, 6 | "run": 630, 7 | "clone": 0, 8 | "gen": 59, 9 | "core_type": 164, 10 | "core": "GROGBA4", 11 | "description": "This project involves additional sampling of the FiP35 WW domain shot from the ultra-long trajectories run by DE Shaw on their new supercomputer ANTON. We are testing the differences between these new ultra-long trajectories and shorter ones from FAH, to test how simulations run on FAH stack up to more traditional methods. 12 | ", 13 | "total_iterations": 2000, 14 | "iterations_done": 660, 15 | "energy": 0, 16 | "temperature": 0, 17 | "start_time": "2012-01-10T23:20:27", 18 | "timeout": 1327249371, 19 | "deadline": 1327924155, 20 | "run_time": 4836, 21 | "simulation_time": 0, 22 | "eta": 8682, 23 | "news": "" 24 | } 25 | --- 26 | 27 | -------------------------------------------------------------------------------- /src/TestFiles/Client_v7_10/slot-options1.txt: -------------------------------------------------------------------------------- 1 | PyON 1 slot-options 2 | { 3 | "client-type": "normal", 4 | "client-subtype": "SMP", 5 | "machine-id": "0", 6 | "max-packet-size": "normal", 7 | "core-priority": "idle", 8 | "next-unit-percentage": "99", 9 | "max-units": "0", 10 | "checkpoint": "15", 11 | "pause-on-start": "true" 12 | } 13 | --- 14 | 15 | -------------------------------------------------------------------------------- /src/TestFiles/Client_v7_10/slot-options2.txt: -------------------------------------------------------------------------------- 1 | PyON 1 slot-options 2 | { 3 | "client-type": "normal", 4 | "client-subtype": "GPU", 5 | "machine-id": "1", 6 | "max-packet-size": "normal", 7 | "core-priority": "idle", 8 | "next-unit-percentage": "99", 9 | "max-units": "0", 10 | "checkpoint": "15", 11 | "pause-on-start": "true" 12 | } 13 | --- 14 | 15 | -------------------------------------------------------------------------------- /src/TestFiles/Client_v7_10/slots.txt: -------------------------------------------------------------------------------- 1 | PyON 1 slots 2 | [ 3 | { 4 | "id": "00", 5 | "status": "RUNNING", 6 | "description": "smp:4", 7 | "options": { 8 | "pause-on-start": "true" 9 | } 10 | }, 11 | { 12 | "id": "01", 13 | "status": "RUNNING", 14 | "description": "gpu:0:\"GT200b [GeForce GTX 285]\"", 15 | "options": { 16 | "pause-on-start": "true" 17 | } 18 | } 19 | ] 20 | --- 21 | 22 | -------------------------------------------------------------------------------- /src/TestFiles/Client_v7_11/simulation-info1.txt: -------------------------------------------------------------------------------- 1 | PyON 1 simulation-info 2 | { 3 | "user": "harlam357", 4 | "team": "32", 5 | "project": 7610, 6 | "run": 192, 7 | "clone": 0, 8 | "gen": 58, 9 | "core_type": 164, 10 | "core": "GROGBA4", 11 | "description": "This project involves additional sampling of the FiP35 WW domain shot from the ultra-long trajectories run by DE Shaw on their new supercomputer ANTON. We are testing the differences between these new ultra-long trajectories and shorter ones from FAH, to test how simulations run on FAH stack up to more traditional methods. 12 | ", 13 | "total_iterations": 2000, 14 | "iterations_done": 1900, 15 | "energy": 0, 16 | "temperature": 0, 17 | "start_time": "2012-02-17T21:48:22Z", 18 | "timeout": 1330527046, 19 | "deadline": 1331201830, 20 | "eta": 1379, 21 | "progress": 0.952612, 22 | "news": "" 23 | } 24 | --- 25 | 26 | -------------------------------------------------------------------------------- /src/TestFiles/Client_v7_11/slot-options1.txt: -------------------------------------------------------------------------------- 1 | PyON 1 slot-options 2 | { 3 | "client-type": "normal", 4 | "client-subtype": "SMP", 5 | "cpu-usage": "100", 6 | "machine-id": "0", 7 | "max-packet-size": "normal", 8 | "core-priority": "idle", 9 | "next-unit-percentage": "99", 10 | "max-units": "0", 11 | "checkpoint": "15", 12 | "pause-on-start": "true", 13 | "gpu-index": None, 14 | "gpu-usage": "100" 15 | } 16 | --- 17 | 18 | -------------------------------------------------------------------------------- /src/TestFiles/Client_v7_11/slots.txt: -------------------------------------------------------------------------------- 1 | PyON 1 slots 2 | [ 3 | { 4 | "id": "00", 5 | "status": "RUNNING", 6 | "description": "smp:8", 7 | "options": { 8 | "cpus": "-1", 9 | "pause-on-start": "true" 10 | } 11 | } 12 | ] 13 | --- 14 | 15 | -------------------------------------------------------------------------------- /src/TestFiles/Client_v7_11/units.txt: -------------------------------------------------------------------------------- 1 | PyON 1 units 2 | [ 3 | { 4 | "id": "01", 5 | "state": "RUNNING", 6 | "error": "OK", 7 | "project": 7610, 8 | "run": 192, 9 | "clone": 0, 10 | "gen": 58, 11 | "core": "0xa4", 12 | "unit": "0x0000004e664f2dd04de6d35869ac2ae3", 13 | "percentdone": "95.25%", 14 | "totalframes": 2000, 15 | "framesdone": 1900, 16 | "assigned": "2012-02-17T21:48:22Z", 17 | "timeout": "2012-02-29T14:50:46Z", 18 | "deadline": "2012-03-08T10:17:10Z", 19 | "ws": "171.64.65.104", 20 | "cs": "171.67.108.49", 21 | "waitingon": "", 22 | "attempts": 0, 23 | "nextattempt": "0.00 secs", 24 | "slot": "00", 25 | "eta": "23 mins 01 secs", 26 | "ppd": "14327.57", 27 | "tpf": "4 mins 51 secs", 28 | "basecredit": "788.00", 29 | "creditestimate": "4825.61", 30 | "description": "This project involves additional sampling of the FiP35 WW domain shot from the ultra-long trajectories run by DE Shaw on their new supercomputer ANTON. We are testing the differences between these new ultra-long trajectories and shorter ones from FAH, to test how simulations run on FAH stack up to more traditional methods. 31 | " 32 | } 33 | ] 34 | --- 35 | 36 | -------------------------------------------------------------------------------- /src/TestFiles/Client_v7_12/simulation-info1.txt: -------------------------------------------------------------------------------- 1 | PyON 1 simulation-info 2 | { 3 | "user": "harlam357", 4 | "team": "32", 5 | "project": 7006, 6 | "run": 1, 7 | "clone": 540, 8 | "gen": 6, 9 | "core_type": 164, 10 | "core": "GRO_A4", 11 | "total_iterations": 0, 12 | "iterations_done": 0, 13 | "energy": 0, 14 | "temperature": 0, 15 | "start_time": "2013-02-02T16:44:18Z", 16 | "timeout": 1360514658, 17 | "deadline": 1360773858, 18 | "eta": 9975, 19 | "progress": 0.43, 20 | "news": "", 21 | "slot": 0 22 | } 23 | --- 24 | 25 | -------------------------------------------------------------------------------- /src/TestFiles/Client_v7_12/slot-options1.txt: -------------------------------------------------------------------------------- 1 | PyON 1 slot-options 2 | { 3 | "client-type": "normal", 4 | "client-subtype": "STDCLI", 5 | "cpu-usage": "100", 6 | "machine-id": "0", 7 | "max-packet-size": "normal", 8 | "core-priority": "idle", 9 | "next-unit-percentage": "99", 10 | "max-units": "0", 11 | "checkpoint": "15", 12 | "pause-on-start": "true", 13 | "gpu-index": None, 14 | "gpu-usage": "100" 15 | } 16 | --- 17 | 18 | -------------------------------------------------------------------------------- /src/TestFiles/Client_v7_12/slots.txt: -------------------------------------------------------------------------------- 1 | PyON 1 slots 2 | [ 3 | { 4 | "id": "00", 5 | "status": "PAUSED", 6 | "description": "cpu:4", 7 | "options": { 8 | "cpus": "-1", 9 | "pause-on-start": "true" 10 | }, 11 | "reason": "paused" 12 | } 13 | ] 14 | --- 15 | 16 | -------------------------------------------------------------------------------- /src/TestFiles/Client_v7_12/units.txt: -------------------------------------------------------------------------------- 1 | PyON 1 units 2 | [ 3 | { 4 | "id": "00", 5 | "state": "READY", 6 | "error": "NO_ERROR", 7 | "project": 7006, 8 | "run": 1, 9 | "clone": 540, 10 | "gen": 6, 11 | "core": "0xa4", 12 | "unit": "0x0000000f0001329c4dfb8f31e319f044", 13 | "percentdone": "43.00%", 14 | "eta": "2 hours 46 mins", 15 | "ppd": "18686", 16 | "creditestimate": "3785", 17 | "waitingon": "", 18 | "nextattempt": "0.00 secs", 19 | "totalframes": 10000, 20 | "framesdone": 4300, 21 | "assigned": "2013-02-02T16:44:18Z", 22 | "timeout": "2013-02-10T16:44:18Z", 23 | "deadline": "2013-02-13T16:44:18Z", 24 | "ws": "129.74.85.15", 25 | "cs": "129.74.85.16", 26 | "attempts": 0, 27 | "slot": "00", 28 | "tpf": "2 mins 55 secs", 29 | "basecredit": "600" 30 | } 31 | ] 32 | --- 33 | 34 | -------------------------------------------------------------------------------- /src/TestFiles/Client_v7_19/log-update-20210905T085354.txt: -------------------------------------------------------------------------------- 1 | PyON 1 log-update 2 | "20:53:54:WU00:FS01:0x22:Completed 925000 out of 1250000 steps (74%)\n" 3 | --- 4 | -------------------------------------------------------------------------------- /src/TestFiles/Client_v7_19/log-update-20210905T085356.txt: -------------------------------------------------------------------------------- 1 | PyON 1 log-update 2 | "20:53:56:WU00:FS01:0x22:Checkpoint completed at step 925000\n" 3 | --- 4 | -------------------------------------------------------------------------------- /src/TestFiles/Client_v7_19/simulation-info-20210905T085332.txt: -------------------------------------------------------------------------------- 1 | PyON 1 simulation-info 2 | {"user": "harlam357", "team": "32", "project": 18201, "run": 44695, "clone": 3, "gen": 2, "core_type": 34, "core": "OPENMM_22", "total_iterations": 100, "iterations_done": 73, "energy": 0, "temperature": 0, "start_time": "2021-09-05T17:57:05Z", "timeout": 0, "deadline": 1631296625, "eta": 3766, "progress": 0.738472, "slot": 1} 3 | --- 4 | -------------------------------------------------------------------------------- /src/TestFiles/Client_v7_19/slot-options-20210905T085332.txt: -------------------------------------------------------------------------------- 1 | PyON 1 slot-options 2 | { 3 | "client-type": "normal", 4 | "client-subtype": "STDCLI", 5 | "cpu-usage": "100", 6 | "machine-id": "1", 7 | "max-packet-size": "big", 8 | "core-priority": "idle", 9 | "next-unit-percentage": "99", 10 | "max-units": "0", 11 | "checkpoint": "30", 12 | "pause-on-start": "true", 13 | "gpu-index": None, 14 | "gpu-usage": "100" 15 | } 16 | --- 17 | -------------------------------------------------------------------------------- /src/TestFiles/Client_v7_19/slots-20210905T085332.txt: -------------------------------------------------------------------------------- 1 | PyON 1 slots 2 | [ 3 | { 4 | "id": "00", 5 | "status": "PAUSED", 6 | "description": "cpu:15", 7 | "options": {"client-type": "advanced", "max-packet-size": "big", "pause-on-start": True}, 8 | "reason": "by user", 9 | "idle": False 10 | }, 11 | { 12 | "id": "01", 13 | "status": "RUNNING", 14 | "description": "gpu:13:0 TU106 [Geforce RTX 2060]", 15 | "options": {"max-packet-size": "big", "pause-on-start": True, "paused": False, "pci-bus": "13", "pci-slot": "0"}, 16 | "reason": "", 17 | "idle": False 18 | } 19 | ] 20 | --- 21 | -------------------------------------------------------------------------------- /src/TestFiles/Client_v7_19/units-20210905T085332.txt: -------------------------------------------------------------------------------- 1 | PyON 1 units 2 | [ 3 | {"id": "00", "state": "RUNNING", "error": "NO_ERROR", "project": 18201, "run": 44695, "clone": 3, "gen": 2, "core": "0x22", "unit": "0x0000000300000002000047190000ae97", "percentdone": "73.85%", "eta": "1 hours 02 mins", "ppd": "1931923", "creditestimate": "321987", "waitingon": "", "nextattempt": "0.00 secs", "timeremaining": "4.88 days", "totalframes": 100, "framesdone": 73, "assigned": "2021-09-05T17:57:05Z", "timeout": "2021-09-07T17:57:05Z", "deadline": "2021-09-10T17:57:05Z", "ws": "128.252.203.11", "cs": "128.252.203.13", "attempts": 0, "slot": "01", "tpf": "2 mins 24 secs", "basecredit": "67770"} 4 | ] 5 | --- 6 | -------------------------------------------------------------------------------- /src/TestFiles/Client_v7_2/simulation-info.txt: -------------------------------------------------------------------------------- 1 | PyON 1 simulation-info 2 | { 3 | "user": "Shelnutt2", 4 | "team": "32", 5 | "project": 10083, 6 | "run": 0, 7 | "clone": 17, 8 | "gen": 24, 9 | "core_type": 164, 10 | "core": "GROGBA4", 11 | "description": "", 12 | "total_iterations": 10000, 13 | "iterations_done": 0, 14 | "energy": 0, 15 | "temperature": 0, 16 | "start_time": "09/Aug/2011-02:54:54", 17 | "timeout": 1313549694, 18 | "deadline": 1313808894, 19 | "run_time": 210, 20 | "simulation_time": 0, 21 | "eta": 0, 22 | "news": "" 23 | } 24 | --- 25 | 26 | -------------------------------------------------------------------------------- /src/TestFiles/Client_v7_2/slot-options.txt: -------------------------------------------------------------------------------- 1 | PyON 1 slot-options 2 | { 3 | "client-type": "normal", 4 | "client-subtype": "LINUX", 5 | "machine-id": "0", 6 | "max-packet-size": "normal", 7 | "core-priority": "idle", 8 | "next-unit-percentage": "99", 9 | "max-units": "0", 10 | "checkpoint": "15", 11 | "pause-on-start": "false", 12 | "gpu-vendor-id": None, 13 | "gpu-device-id": None 14 | } 15 | --- 16 | 17 | -------------------------------------------------------------------------------- /src/TestFiles/Client_v7_2/slots.txt: -------------------------------------------------------------------------------- 1 | PyON 1 slots 2 | [ 3 | { 4 | "id": "00", 5 | "status": "RUNNING", 6 | "description": "uniprocessor", 7 | "options": {} 8 | } 9 | ] 10 | --- 11 | 12 | -------------------------------------------------------------------------------- /src/TestFiles/Client_v7_2/units.txt: -------------------------------------------------------------------------------- 1 | PyON 1 units 2 | [ 3 | { 4 | "id": "00", 5 | "state": "RUNNING", 6 | "project": 10083, 7 | "run": 0, 8 | "clone": 17, 9 | "gen": 24, 10 | "core": "0xa4", 11 | "unit": "0x000000480001329c4ddbf194abdd0077", 12 | "percentdone": "0.00%", 13 | "totalframes": 10000, 14 | "framesdone": 0, 15 | "assigned": "09/Aug/2011-02:54:54", 16 | "timeout": "17/Aug/2011-02:54:54", 17 | "deadline": "20/Aug/2011-02:54:54", 18 | "ws": "129.74.85.15", 19 | "cs": "129.74.85.16", 20 | "waitingon": "", 21 | "attempts": 0, 22 | "nextattempt": "0.00 secs", 23 | "slot": 0, 24 | "eta": "0.00 secs", 25 | "ppd": "0.00", 26 | "tpf": "0.00 secs", 27 | "basecredit": "600.00", 28 | "creditestimate": "600.00" 29 | } 30 | ] 31 | --- 32 | 33 | -------------------------------------------------------------------------------- /src/TestFiles/Client_v7_20/simulation-info-20220518T051625.txt: -------------------------------------------------------------------------------- 1 | PyON 1 simulation-info 2 | {"user": "toTOW", "team": "51", "project": 18041, "run": 4, "clone": 8, "gen": 59, "core_type": 34, "core": "OPENMM_22", "total_iterations": 100, "iterations_done": 50, "energy": 0, "temperature": 0, "start_time": "2022-05-18T11:22:28Z", "timeout": 0, "deadline": 1653045748, "eta": 20277, "progress": 0.50423, "slot": 1} 3 | --- 4 | -------------------------------------------------------------------------------- /src/TestFiles/Client_v7_20/slot-options-20220518T051625.txt: -------------------------------------------------------------------------------- 1 | PyON 1 slot-options 2 | { 3 | "client-type": "normal", 4 | "client-subtype": "LINUX", 5 | "cpu-usage": "100", 6 | "machine-id": "1", 7 | "max-packet-size": "normal", 8 | "core-priority": "idle", 9 | "next-unit-percentage": "99", 10 | "max-units": "0", 11 | "checkpoint": "15", 12 | "pause-on-start": "false", 13 | "gpu-index": "1", 14 | "gpu-usage": "100" 15 | } 16 | --- 17 | -------------------------------------------------------------------------------- /src/TestFiles/Client_v7_20/slots-20220518T051623.txt: -------------------------------------------------------------------------------- 1 | PyON 1 slots 2 | [ 3 | { 4 | "id": "00", 5 | "status": "RUNNING", 6 | "description": "gpu:0:TU104GL [Tesla T4]", 7 | "options": {}, 8 | "reason": "", 9 | "idle": False 10 | }, 11 | { 12 | "id": "01", 13 | "status": "RUNNING", 14 | "description": "gpu:1:TU104GL [Tesla T4]", 15 | "options": {}, 16 | "reason": "", 17 | "idle": False 18 | } 19 | ] 20 | --- 21 | -------------------------------------------------------------------------------- /src/TestFiles/Client_v7_20/units-20220518T051623.txt: -------------------------------------------------------------------------------- 1 | PyON 1 units 2 | [ 3 | {"id": "02", "state": "RUNNING", "error": "NO_ERROR", "project": 18041, "run": 4, "clone": 8, "gen": 59, "core": "0x22", "unit": "0x000000080000003b0000467900000004", "percentdone": "50.42%", "eta": "5 hours 37 mins", "ppd": "1250375", "creditestimate": "591902", "waitingon": "", "nextattempt": "0.00 secs", "timeremaining": "1.75 days", "totalframes": 100, "framesdone": 50, "assigned": "2022-05-18T11:22:28Z", "timeout": "2022-05-19T23:22:28Z", "deadline": "2022-05-20T11:22:28Z", "ws": "34.72.228.44", "cs": "128.252.203.14", "attempts": 0, "slot": "01", "tpf": "6 mins 49 secs", "basecredit": "335000"}, 4 | {"id": "01", "state": "RUNNING", "error": "NO_ERROR", "project": 18036, "run": 1, "clone": 48, "gen": 99, "core": "0x22", "unit": "0x00000030000000630000467400000001", "percentdone": "77.51%", "eta": "1 hours 12 mins", "ppd": "1131449", "creditestimate": "252743", "waitingon": "", "nextattempt": "0.00 secs", "timeremaining": "1.82 days", "totalframes": 100, "framesdone": 77, "assigned": "2022-05-18T13:04:00Z", "timeout": "2022-05-20T01:04:00Z", "deadline": "2022-05-20T13:04:00Z", "ws": "34.72.228.44", "cs": "128.252.203.14", "attempts": 0, "slot": "00", "tpf": "3 mins 13 secs", "basecredit": "98000"} 5 | ] 6 | --- 7 | -------------------------------------------------------------------------------- /src/TestFiles/Client_v7_3/simulation-info.txt: -------------------------------------------------------------------------------- 1 | PyON 1 simulation-info 2 | { 3 | "user": "Adak", 4 | "team": "32", 5 | "project": 7018, 6 | "run": 2, 7 | "clone": 76, 8 | "gen": 18, 9 | "core_type": 164, 10 | "core": "GROGBA4", 11 | "description": "", 12 | "total_iterations": 10000, 13 | "iterations_done": 300, 14 | "energy": 0, 15 | "temperature": 0, 16 | "start_time": "09/Aug/2011-05:40:17", 17 | "timeout": 1313559617, 18 | "deadline": 1313818817, 19 | "run_time": 436, 20 | "simulation_time": 0, 21 | "eta": 12730, 22 | "news": "" 23 | } 24 | --- 25 | 26 | -------------------------------------------------------------------------------- /src/TestFiles/Client_v7_3/slot-options.txt: -------------------------------------------------------------------------------- 1 | PyON 1 slot-options 2 | { 3 | "client-type": "normal", 4 | "client-subtype": "SMP", 5 | "machine-id": "0", 6 | "max-packet-size": "normal", 7 | "core-priority": "idle", 8 | "next-unit-percentage": "99", 9 | "max-units": "0", 10 | "checkpoint": "30", 11 | "pause-on-start": "false", 12 | "gpu-vendor-id": None, 13 | "gpu-device-id": None 14 | } 15 | --- 16 | 17 | -------------------------------------------------------------------------------- /src/TestFiles/Client_v7_3/slots.txt: -------------------------------------------------------------------------------- 1 | PyON 1 slots 2 | [ 3 | { 4 | "id": "00", 5 | "status": "RUNNING", 6 | "description": "smp:8", 7 | "options": {} 8 | } 9 | ] 10 | --- 11 | 12 | -------------------------------------------------------------------------------- /src/TestFiles/Client_v7_3/units.txt: -------------------------------------------------------------------------------- 1 | PyON 1 units 2 | [ 3 | { 4 | "id": "00", 5 | "state": "RUNNING", 6 | "project": 7018, 7 | "run": 2, 8 | "clone": 76, 9 | "gen": 18, 10 | "core": "0xa4", 11 | "unit": "0x0000002c0001329c4dfba21231353df5", 12 | "percentdone": "3.00%", 13 | "totalframes": 10000, 14 | "framesdone": 300, 15 | "assigned": "09/Aug/2011-05:40:17", 16 | "timeout": "17/Aug/2011-05:40:17", 17 | "deadline": "20/Aug/2011-05:40:17", 18 | "ws": "129.74.85.15", 19 | "cs": "129.74.85.16", 20 | "waitingon": "", 21 | "attempts": 0, 22 | "nextattempt": "0.00 secs", 23 | "slot": 0, 24 | "eta": "3 hours 32 mins", 25 | "ppd": "3937.41", 26 | "tpf": "2 mins 11 secs", 27 | "basecredit": "600.00", 28 | "creditestimate": "600.00" 29 | } 30 | ] 31 | --- 32 | 33 | -------------------------------------------------------------------------------- /src/TestFiles/Client_v7_4/simulation-info1.txt: -------------------------------------------------------------------------------- 1 | PyON 1 simulation-info 2 | { 3 | "user": "ChasR", 4 | "team": "32", 5 | "project": 7507, 6 | "run": 0, 7 | "clone": 34, 8 | "gen": 1, 9 | "core_type": 163, 10 | "core": "GROGBSMP", 11 | "description": "", 12 | "total_iterations": 500, 13 | "iterations_done": 180, 14 | "energy": 0, 15 | "temperature": 0, 16 | "start_time": "17/Aug/2011-15:14:58", 17 | "timeout": 1313931058, 18 | "deadline": 1314155698, 19 | "run_time": 18964, 20 | "simulation_time": 0, 21 | "eta": 33249, 22 | "news": "" 23 | } 24 | --- 25 | 26 | -------------------------------------------------------------------------------- /src/TestFiles/Client_v7_4/simulation-info2.txt: -------------------------------------------------------------------------------- 1 | PyON 1 simulation-info 2 | { 3 | "user": "ChasR", 4 | "team": "32", 5 | "project": 5788, 6 | "run": 9, 7 | "clone": 838, 8 | "gen": 9, 9 | "core_type": 17, 10 | "core": "GROGPU2", 11 | "description": "", 12 | "total_iterations": 20000, 13 | "iterations_done": 19200, 14 | "energy": 0, 15 | "temperature": 0, 16 | "start_time": "17/Aug/2011-18:18:47", 17 | "timeout": 0, 18 | "deadline": 2809677412044885000, 19 | "run_time": 7856, 20 | "simulation_time": 0, 21 | "eta": 262, 22 | "news": "" 23 | } 24 | --- 25 | 26 | -------------------------------------------------------------------------------- /src/TestFiles/Client_v7_4/simulation-info3.txt: -------------------------------------------------------------------------------- 1 | PyON 1 simulation-info 2 | { 3 | "user": "ChasR", 4 | "team": "32", 5 | "project": 5796, 6 | "run": 19, 7 | "clone": 79, 8 | "gen": 5, 9 | "core_type": 17, 10 | "core": "GROGPU2", 11 | "description": "", 12 | "total_iterations": 20000, 13 | "iterations_done": 800, 14 | "energy": 0, 15 | "temperature": 0, 16 | "start_time": "17/Aug/2011-20:29:43", 17 | "timeout": 0, 18 | "deadline": 6769090174612663300, 19 | "run_time": 496, 20 | "simulation_time": 0, 21 | "eta": 11079, 22 | "news": "" 23 | } 24 | --- 25 | 26 | -------------------------------------------------------------------------------- /src/TestFiles/Client_v7_4/slot-options1.txt: -------------------------------------------------------------------------------- 1 | PyON 1 slot-options 2 | { 3 | "client-type": "beta", 4 | "client-subtype": "SMP", 5 | "machine-id": "0", 6 | "max-packet-size": "big", 7 | "core-priority": "idle", 8 | "next-unit-percentage": "100", 9 | "max-units": "0", 10 | "checkpoint": "15", 11 | "pause-on-start": "false", 12 | "gpu-vendor-id": None, 13 | "gpu-device-id": None 14 | } 15 | --- 16 | 17 | -------------------------------------------------------------------------------- /src/TestFiles/Client_v7_4/slot-options2.txt: -------------------------------------------------------------------------------- 1 | PyON 1 slot-options 2 | { 3 | "client-type": "beta", 4 | "client-subtype": "GPU", 5 | "machine-id": "1", 6 | "max-packet-size": "normal", 7 | "core-priority": "low", 8 | "next-unit-percentage": "99", 9 | "max-units": "0", 10 | "checkpoint": "15", 11 | "pause-on-start": "false", 12 | "gpu-vendor-id": None, 13 | "gpu-device-id": None 14 | } 15 | --- 16 | 17 | -------------------------------------------------------------------------------- /src/TestFiles/Client_v7_4/slot-options3.txt: -------------------------------------------------------------------------------- 1 | PyON 1 slot-options 2 | { 3 | "client-type": "beta", 4 | "client-subtype": "GPU", 5 | "machine-id": "2", 6 | "max-packet-size": "normal", 7 | "core-priority": "low", 8 | "next-unit-percentage": "99", 9 | "max-units": "0", 10 | "checkpoint": "15", 11 | "pause-on-start": "false", 12 | "gpu-vendor-id": None, 13 | "gpu-device-id": None 14 | } 15 | --- 16 | 17 | -------------------------------------------------------------------------------- /src/TestFiles/Client_v7_4/slots.txt: -------------------------------------------------------------------------------- 1 | PyON 1 slots 2 | [ 3 | { 4 | "id": "00", 5 | "status": "RUNNING", 6 | "description": "smp:4", 7 | "options": { 8 | "client-type": "beta", 9 | "max-packet-size": "big", 10 | "next-unit-percentage": "100" 11 | } 12 | }, 13 | { 14 | "id": "01", 15 | "status": "RUNNING", 16 | "description": "gpu:0:\"GT200 [GeForce GTX 260]\"", 17 | "options": { 18 | "client-type": "beta", 19 | "core-priority": "low" 20 | } 21 | }, 22 | { 23 | "id": "02", 24 | "status": "RUNNING", 25 | "description": "gpu:1:\"G92 [GeForce 9800 GTX]\"", 26 | "options": { 27 | "client-type": "beta", 28 | "core-priority": "low" 29 | } 30 | } 31 | ] 32 | --- 33 | 34 | -------------------------------------------------------------------------------- /src/TestFiles/Client_v7_5/simulation-info1.txt: -------------------------------------------------------------------------------- 1 | PyON 1 simulation-info 2 | { 3 | "user": "The_Penguin", 4 | "team": "32", 5 | "project": 7611, 6 | "run": 0, 7 | "clone": 34, 8 | "gen": 21, 9 | "core_type": 164, 10 | "core": "GROGBA4", 11 | "description": "", 12 | "total_iterations": 2000, 13 | "iterations_done": 535, 14 | "energy": 0, 15 | "temperature": 0, 16 | "start_time": "08/Aug/2011-12:32:11", 17 | "timeout": 1313818475, 18 | "deadline": 1314493259, 19 | "run_time": 34641, 20 | "simulation_time": 0, 21 | "eta": 94379, 22 | "news": "" 23 | } 24 | --- 25 | 26 | -------------------------------------------------------------------------------- /src/TestFiles/Client_v7_5/simulation-info2.txt: -------------------------------------------------------------------------------- 1 | PyON 1 simulation-info 2 | { 3 | "user": "The_Penguin", 4 | "team": "32", 5 | "project": 11294, 6 | "run": 7, 7 | "clone": 243, 8 | "gen": 66, 9 | "core_type": 22, 10 | "core": "OPENMM_OPENCL", 11 | "description": "", 12 | "total_iterations": 50000, 13 | "iterations_done": 49000, 14 | "energy": 0, 15 | "temperature": 0, 16 | "start_time": "08/Aug/2011-16:21:25", 17 | "timeout": 1313338885, 18 | "deadline": 1313684485, 19 | "run_time": 22732, 20 | "simulation_time": 0, 21 | "eta": 329, 22 | "news": "" 23 | } 24 | --- 25 | 26 | -------------------------------------------------------------------------------- /src/TestFiles/Client_v7_5/slot-options1.txt: -------------------------------------------------------------------------------- 1 | PyON 1 slot-options 2 | { 3 | "client-type": "advanced", 4 | "client-subtype": "SMP", 5 | "machine-id": "0", 6 | "max-packet-size": "big", 7 | "core-priority": "idle", 8 | "next-unit-percentage": "99", 9 | "max-units": "0", 10 | "checkpoint": "30", 11 | "pause-on-start": "false", 12 | "gpu-vendor-id": None, 13 | "gpu-device-id": None 14 | } 15 | --- 16 | 17 | -------------------------------------------------------------------------------- /src/TestFiles/Client_v7_5/slot-options2.txt: -------------------------------------------------------------------------------- 1 | PyON 1 slot-options 2 | { 3 | "client-type": "advanced", 4 | "client-subtype": "GPU", 5 | "machine-id": "1", 6 | "max-packet-size": "big", 7 | "core-priority": "idle", 8 | "next-unit-percentage": "99", 9 | "max-units": "0", 10 | "checkpoint": "30", 11 | "pause-on-start": "false", 12 | "gpu-vendor-id": None, 13 | "gpu-device-id": None 14 | } 15 | --- 16 | 17 | -------------------------------------------------------------------------------- /src/TestFiles/Client_v7_5/slots.txt: -------------------------------------------------------------------------------- 1 | PyON 1 slots 2 | [ 3 | { 4 | "id": "00", 5 | "status": "RUNNING", 6 | "description": "smp:4", 7 | "options": {} 8 | }, 9 | { 10 | "id": "01", 11 | "status": "RUNNING", 12 | "description": "gpu:0:\"Radeon HD 5870 (Cypress)\"", 13 | "options": {} 14 | } 15 | ] 16 | --- 17 | 18 | -------------------------------------------------------------------------------- /src/TestFiles/Client_v7_6/simulation-info1.txt: -------------------------------------------------------------------------------- 1 | PyON 1 simulation-info 2 | { 3 | "user": "Bayna", 4 | "team": "32", 5 | "project": 7600, 6 | "run": 41, 7 | "clone": 65, 8 | "gen": 3, 9 | "core_type": 164, 10 | "core": "GROGBA4", 11 | "description": "", 12 | "total_iterations": 2000, 13 | "iterations_done": 1572, 14 | "energy": 0, 15 | "temperature": 0, 16 | "start_time": "09/Aug/2011-12:59:36", 17 | "timeout": 1314097464, 18 | "deadline": 1314899256, 19 | "run_time": 360111, 20 | "simulation_time": 0, 21 | "eta": 97134, 22 | "news": "" 23 | } 24 | --- 25 | 26 | -------------------------------------------------------------------------------- /src/TestFiles/Client_v7_6/slot-options1.txt: -------------------------------------------------------------------------------- 1 | PyON 1 slot-options 2 | { 3 | "client-type": "advanced", 4 | "client-subtype": "STDCLI", 5 | "machine-id": "0", 6 | "max-packet-size": "normal", 7 | "core-priority": "idle", 8 | "next-unit-percentage": "99", 9 | "max-units": "0", 10 | "checkpoint": "15", 11 | "pause-on-start": "false", 12 | "gpu-vendor-id": None, 13 | "gpu-device-id": None 14 | } 15 | --- 16 | 17 | -------------------------------------------------------------------------------- /src/TestFiles/Client_v7_6/slots.txt: -------------------------------------------------------------------------------- 1 | PyON 1 slots 2 | [ 3 | { 4 | "id": "00", 5 | "status": "RUNNING", 6 | "description": "uniprocessor", 7 | "options": {} 8 | } 9 | ] 10 | --- 11 | 12 | -------------------------------------------------------------------------------- /src/TestFiles/Client_v7_7/simulation-info1.txt: -------------------------------------------------------------------------------- 1 | PyON 1 simulation-info 2 | { 3 | "user": "HayesK", 4 | "team": "32", 5 | "project": 11051, 6 | "run": 0, 7 | "clone": 2, 8 | "gen": 39, 9 | "core_type": 163, 10 | "core": "GROGBSMP", 11 | "description": "", 12 | "total_iterations": 1000, 13 | "iterations_done": 910, 14 | "energy": 0, 15 | "temperature": 0, 16 | "start_time": "22/Aug/2011-18:29:03", 17 | "timeout": 1315074543, 18 | "deadline": 1316111343, 19 | "run_time": 27396, 20 | "simulation_time": 0, 21 | "eta": 2567, 22 | "news": "" 23 | } 24 | --- 25 | 26 | -------------------------------------------------------------------------------- /src/TestFiles/Client_v7_7/simulation-info2.txt: -------------------------------------------------------------------------------- 1 | PyON 1 simulation-info 2 | { 3 | "user": "HayesK", 4 | "team": "32", 5 | "project": 6801, 6 | "run": 6348, 7 | "clone": 0, 8 | "gen": 305, 9 | "core_type": 21, 10 | "core": "OPENMMGPU", 11 | "description": "", 12 | "total_iterations": 50000, 13 | "iterations_done": 20000, 14 | "energy": 0, 15 | "temperature": 0, 16 | "start_time": "23/Aug/2011-00:37:16", 17 | "timeout": 1314491836, 18 | "deadline": 1314923836, 19 | "run_time": 5325, 20 | "simulation_time": 0, 21 | "eta": 7807, 22 | "news": "" 23 | } 24 | --- 25 | 26 | -------------------------------------------------------------------------------- /src/TestFiles/Client_v7_7/slot-options1.txt: -------------------------------------------------------------------------------- 1 | PyON 1 slot-options 2 | { 3 | "client-type": "beta", 4 | "client-subtype": "SMP", 5 | "machine-id": "0", 6 | "max-packet-size": "big", 7 | "core-priority": "idle", 8 | "next-unit-percentage": "100", 9 | "max-units": "0", 10 | "checkpoint": "15", 11 | "pause-on-start": "false", 12 | "gpu-vendor-id": None, 13 | "gpu-device-id": None 14 | } 15 | --- 16 | 17 | -------------------------------------------------------------------------------- /src/TestFiles/Client_v7_7/slot-options2.txt: -------------------------------------------------------------------------------- 1 | PyON 1 slot-options 2 | { 3 | "client-type": "normal", 4 | "client-subtype": "GPU", 5 | "machine-id": "1", 6 | "max-packet-size": "normal", 7 | "core-priority": "idle", 8 | "next-unit-percentage": "99", 9 | "max-units": "0", 10 | "checkpoint": "15", 11 | "pause-on-start": "false", 12 | "gpu-vendor-id": None, 13 | "gpu-device-id": None 14 | } 15 | --- 16 | 17 | -------------------------------------------------------------------------------- /src/TestFiles/Client_v7_7/slots.txt: -------------------------------------------------------------------------------- 1 | PyON 1 slots 2 | [ 3 | { 4 | "id": "00", 5 | "status": "FINISHING", 6 | "description": "smp:4", 7 | "options": { 8 | "client-type": "beta", 9 | "max-packet-size": "big", 10 | "next-unit-percentage": "100" 11 | } 12 | }, 13 | { 14 | "id": "01", 15 | "status": "RUNNING", 16 | "description": "gpu:0:\"GF106 [GeForce 450 GTS]\"", 17 | "options": {} 18 | } 19 | ] 20 | --- 21 | 22 | -------------------------------------------------------------------------------- /src/TestFiles/Client_v7_9/simulation-info1.txt: -------------------------------------------------------------------------------- 1 | PyON 1 simulation-info 2 | { 3 | "user": "harlam357", 4 | "team": "32", 5 | "project": 7905, 6 | "run": 47, 7 | "clone": 37, 8 | "gen": 0, 9 | "core_type": 164, 10 | "core": "GROGBA4", 11 | "description": "", 12 | "total_iterations": 500, 13 | "iterations_done": 0, 14 | "energy": 0, 15 | "temperature": 0, 16 | "start_time": "2011-12-08T02:59:57", 17 | "timeout": 1324090797, 18 | "deadline": 1324954797, 19 | "run_time": 15, 20 | "simulation_time": 0, 21 | "eta": 0, 22 | "news": "" 23 | } 24 | --- 25 | 26 | -------------------------------------------------------------------------------- /src/TestFiles/Client_v7_9/slot-options1.txt: -------------------------------------------------------------------------------- 1 | PyON 1 slot-options 2 | { 3 | "client-type": "normal", 4 | "client-subtype": "SMP", 5 | "machine-id": "0", 6 | "max-packet-size": "normal", 7 | "core-priority": "idle", 8 | "next-unit-percentage": "99", 9 | "max-units": "0", 10 | "checkpoint": "15", 11 | "pause-on-start": "true" 12 | } 13 | --- 14 | 15 | -------------------------------------------------------------------------------- /src/TestFiles/Client_v7_9/slots.txt: -------------------------------------------------------------------------------- 1 | PyON 1 slots 2 | [ 3 | { 4 | "id": "00", 5 | "status": "RUNNING", 6 | "description": "smp:4", 7 | "options": { 8 | "pause-on-start": "true" 9 | } 10 | } 11 | ] 12 | --- 13 | 14 | -------------------------------------------------------------------------------- /src/TestFiles/Client_v7_9/units.txt: -------------------------------------------------------------------------------- 1 | PyON 1 units 2 | [ 3 | { 4 | "id": "00", 5 | "state": "RUNNING", 6 | "project": 7905, 7 | "run": 47, 8 | "clone": 37, 9 | "gen": 0, 10 | "core": "0xa4", 11 | "unit": "0x0000000000ac9c234ecff97c3e910a84", 12 | "percentdone": "0.00%", 13 | "totalframes": 500, 14 | "framesdone": 0, 15 | "assigned": "2011-12-08T02:59:57", 16 | "timeout": "2011-12-17T02:59:57", 17 | "deadline": "2011-12-27T02:59:57", 18 | "ws": "128.113.12.163", 19 | "cs": "129.74.85.16", 20 | "waitingon": "", 21 | "attempts": 0, 22 | "nextattempt": "0.00 secs", 23 | "slot": 0, 24 | "eta": "0.00 secs", 25 | "ppd": "0.00", 26 | "tpf": "0.00 secs", 27 | "basecredit": "487.00", 28 | "creditestimate": "487.00" 29 | } 30 | ] 31 | --- 32 | 33 | -------------------------------------------------------------------------------- /src/TestFiles/GPU2_4/GPU2 6.23.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harlam357/hfm-net/7a23cd3641a77c9a97b259c3c5412bdec23fd3e9/src/TestFiles/GPU2_4/GPU2 6.23.txt -------------------------------------------------------------------------------- /src/TestFiles/GPU2_4/queue.dat: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harlam357/hfm-net/7a23cd3641a77c9a97b259c3c5412bdec23fd3e9/src/TestFiles/GPU2_4/queue.dat -------------------------------------------------------------------------------- /src/TestFiles/GPU2_5/GPU2 6.23 ID Big Endian.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harlam357/hfm-net/7a23cd3641a77c9a97b259c3c5412bdec23fd3e9/src/TestFiles/GPU2_5/GPU2 6.23 ID Big Endian.txt -------------------------------------------------------------------------------- /src/TestFiles/GPU2_5/queue.dat: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harlam357/hfm-net/7a23cd3641a77c9a97b259c3c5412bdec23fd3e9/src/TestFiles/GPU2_5/queue.dat -------------------------------------------------------------------------------- /src/TestFiles/GPU2_5/unitinfo.txt: -------------------------------------------------------------------------------- 1 | Current Work Unit 2 | ----------------- 3 | Name: p4744_lam5w_300K 4 | Tag: - 5 | Download time: January 2 20:35:41 6 | Due time: January 5 20:35:41 7 | Progress: 73% [|||||||___] 8 | -------------------------------------------------------------------------------- /src/TestFiles/GPU2_6/queue.dat: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harlam357/hfm-net/7a23cd3641a77c9a97b259c3c5412bdec23fd3e9/src/TestFiles/GPU2_6/queue.dat -------------------------------------------------------------------------------- /src/TestFiles/GPU2_6/unitinfo.txt: -------------------------------------------------------------------------------- 1 | Current Work Unit 2 | ----------------- 3 | Name: Protein 4 | Tag: P5770R4C242G1366 5 | Download time: November 26 01:30:40 6 | Due time: November 29 01:30:40 7 | Progress: 100% [||||||||||] 8 | -------------------------------------------------------------------------------- /src/TestFiles/GPU2_8/queue.dat: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harlam357/hfm-net/7a23cd3641a77c9a97b259c3c5412bdec23fd3e9/src/TestFiles/GPU2_8/queue.dat -------------------------------------------------------------------------------- /src/TestFiles/GPU3_1/queue.dat: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harlam357/hfm-net/7a23cd3641a77c9a97b259c3c5412bdec23fd3e9/src/TestFiles/GPU3_1/queue.dat -------------------------------------------------------------------------------- /src/TestFiles/GPU3_1/unitinfo.txt: -------------------------------------------------------------------------------- 1 | Current Work Unit 2 | ----------------- 3 | Name: PEPTIDE (1-42) 4 | Tag: - 5 | Download time: November 19 05:56:56 6 | Due time: November 29 05:56:56 7 | Progress: 23% [||________] 8 | -------------------------------------------------------------------------------- /src/TestFiles/LegacyUnitinfo/unitinfo_DownloadDateFormat.txt: -------------------------------------------------------------------------------- 1 | Current Work Unit 2 | ----------------- 3 | Name: Gromacs 4 | Tag: P2683R6C12G21 5 | Download time: Dember 12 00:09:22 6 | Due time: December 18 00:09:22 7 | Progress: 1724900% [||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||] 8 | -------------------------------------------------------------------------------- /src/TestFiles/LegacyUnitinfo/unitinfo_DueDateFormat.txt: -------------------------------------------------------------------------------- 1 | Current Work Unit 2 | ----------------- 3 | Name: Gromacs 4 | Tag: P2683R6C12G21 5 | Download time: December 12 00:09:22 6 | Due time: December 00:09:22 7 | Progress: 1724900% [||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||] 8 | -------------------------------------------------------------------------------- /src/TestFiles/LegacyUnitinfo/unitinfo_DueTimeFormat.txt: -------------------------------------------------------------------------------- 1 | Current Work Unit 2 | ----------------- 3 | Name: Gromacs 4 | Tag: P2683R6C12G21 5 | Download time: December 12 00:09:22 6 | Due time: December 18 0:0:22 7 | Progress: 1724900% [||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||] 8 | -------------------------------------------------------------------------------- /src/TestFiles/LegacyUnitinfo/unitinfo_ProgressOverflow.txt: -------------------------------------------------------------------------------- 1 | Current Work Unit 2 | ----------------- 3 | Name: Gromacs 4 | Tag: P2683R6C12G21 5 | Download time: December 12 00:09:22 6 | Due time: December 18 00:09:22 7 | Progress: 3000000000% [||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||] 8 | -------------------------------------------------------------------------------- /src/TestFiles/LegacyUnitinfo/unitinfo_TagFormat.txt: -------------------------------------------------------------------------------- 1 | Current Work Unit 2 | ----------------- 3 | Name: Gromacs 4 | Tag: P2AA3R6C12G21 5 | Download time: December 12 00:09:22 6 | Due time: December 18 00:09:22 7 | Progress: 1724900% [||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||] 8 | -------------------------------------------------------------------------------- /src/TestFiles/SMP_10/queue.dat: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harlam357/hfm-net/7a23cd3641a77c9a97b259c3c5412bdec23fd3e9/src/TestFiles/SMP_10/queue.dat -------------------------------------------------------------------------------- /src/TestFiles/SMP_10/unitinfo.txt: -------------------------------------------------------------------------------- 1 | Current Work Unit 2 | ----------------- 3 | Name: Gromacs 4 | Tag: P2683R6C12G21 5 | Download time: December 12 00:09:22 6 | Due time: December 18 00:09:22 7 | Progress: 1724900% [||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||] 8 | -------------------------------------------------------------------------------- /src/TestFiles/SMP_11/queue.dat: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harlam357/hfm-net/7a23cd3641a77c9a97b259c3c5412bdec23fd3e9/src/TestFiles/SMP_11/queue.dat -------------------------------------------------------------------------------- /src/TestFiles/SMP_11/unitinfo.txt: -------------------------------------------------------------------------------- 1 | Current Work Unit 2 | ----------------- 3 | Name: Gromacs 4 | Tag: P2671R30C81G165 5 | Download time: December 29 09:07:48 6 | Due time: January 1 09:07:48 7 | Progress: 60% [||||||____] 8 | -------------------------------------------------------------------------------- /src/TestFiles/SMP_12/queue.dat: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harlam357/hfm-net/7a23cd3641a77c9a97b259c3c5412bdec23fd3e9/src/TestFiles/SMP_12/queue.dat -------------------------------------------------------------------------------- /src/TestFiles/SMP_12/unitinfo.txt: -------------------------------------------------------------------------------- 1 | Current Work Unit 2 | ----------------- 3 | Name: Gromacs 4 | Tag: P6024R0C9G78 5 | Download time: March 24 07:21:46 6 | Due time: March 30 07:21:46 7 | Progress: 97% [|||||||||_] 8 | -------------------------------------------------------------------------------- /src/TestFiles/SMP_13/queue.dat: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harlam357/hfm-net/7a23cd3641a77c9a97b259c3c5412bdec23fd3e9/src/TestFiles/SMP_13/queue.dat -------------------------------------------------------------------------------- /src/TestFiles/SMP_13/unitinfo.txt: -------------------------------------------------------------------------------- 1 | Current Work Unit 2 | ----------------- 3 | Name: Gromacs 4 | Tag: P6073R0C10G53 5 | Download time: May 27 12:04:26 6 | Due time: June 2 12:04:26 7 | Progress: 100% [||||||||||] 8 | -------------------------------------------------------------------------------- /src/TestFiles/SMP_14/queue.dat: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harlam357/hfm-net/7a23cd3641a77c9a97b259c3c5412bdec23fd3e9/src/TestFiles/SMP_14/queue.dat -------------------------------------------------------------------------------- /src/TestFiles/SMP_15/queue.dat: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harlam357/hfm-net/7a23cd3641a77c9a97b259c3c5412bdec23fd3e9/src/TestFiles/SMP_15/queue.dat -------------------------------------------------------------------------------- /src/TestFiles/SMP_15/unitinfo.txt: -------------------------------------------------------------------------------- 1 | Current Work Unit 2 | ----------------- 3 | Name: Gromacs 4 | Tag: P6071R0C39G70 5 | Download time: October 14 09:18:26 6 | Due time: October 20 09:18:26 7 | Progress: 0% [__________] 8 | -------------------------------------------------------------------------------- /src/TestFiles/SMP_16/queue.dat: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harlam357/hfm-net/7a23cd3641a77c9a97b259c3c5412bdec23fd3e9/src/TestFiles/SMP_16/queue.dat -------------------------------------------------------------------------------- /src/TestFiles/SMP_4/WinSMP 6.24R3.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harlam357/hfm-net/7a23cd3641a77c9a97b259c3c5412bdec23fd3e9/src/TestFiles/SMP_4/WinSMP 6.24R3.txt -------------------------------------------------------------------------------- /src/TestFiles/SMP_4/queue.dat: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harlam357/hfm-net/7a23cd3641a77c9a97b259c3c5412bdec23fd3e9/src/TestFiles/SMP_4/queue.dat -------------------------------------------------------------------------------- /src/TestFiles/SMP_5/Linux SMP 6.24.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harlam357/hfm-net/7a23cd3641a77c9a97b259c3c5412bdec23fd3e9/src/TestFiles/SMP_5/Linux SMP 6.24.txt -------------------------------------------------------------------------------- /src/TestFiles/SMP_5/queue.dat: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harlam357/hfm-net/7a23cd3641a77c9a97b259c3c5412bdec23fd3e9/src/TestFiles/SMP_5/queue.dat -------------------------------------------------------------------------------- /src/TestFiles/SMP_6/Linux SMP 6.24 Waiting Upload.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harlam357/hfm-net/7a23cd3641a77c9a97b259c3c5412bdec23fd3e9/src/TestFiles/SMP_6/Linux SMP 6.24 Waiting Upload.txt -------------------------------------------------------------------------------- /src/TestFiles/SMP_6/queue.dat: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harlam357/hfm-net/7a23cd3641a77c9a97b259c3c5412bdec23fd3e9/src/TestFiles/SMP_6/queue.dat -------------------------------------------------------------------------------- /src/TestFiles/SMP_7/queue.dat: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harlam357/hfm-net/7a23cd3641a77c9a97b259c3c5412bdec23fd3e9/src/TestFiles/SMP_7/queue.dat -------------------------------------------------------------------------------- /src/TestFiles/SMP_7/unitinfo.txt: -------------------------------------------------------------------------------- 1 | Current Work Unit 2 | ----------------- 3 | Name: Gromacs 4 | Tag: P2669R13C159G153 5 | Download time: October 3 07:52:07 6 | Due time: October 6 07:52:07 7 | Progress: 6871979% [||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||] 8 | -------------------------------------------------------------------------------- /src/TestFiles/SMP_8/queue.dat: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harlam357/hfm-net/7a23cd3641a77c9a97b259c3c5412bdec23fd3e9/src/TestFiles/SMP_8/queue.dat -------------------------------------------------------------------------------- /src/TestFiles/SMP_8/unitinfo.txt: -------------------------------------------------------------------------------- 1 | Current Work Unit 2 | ----------------- 3 | Name: Gromacs 4 | Tag: P2683R2C8G24 5 | Download time: November 24 21:53:46 6 | Due time: November 30 21:53:46 7 | Progress: 1718086% [||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||] 8 | -------------------------------------------------------------------------------- /src/TestFiles/SMP_9/queue.dat: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harlam357/hfm-net/7a23cd3641a77c9a97b259c3c5412bdec23fd3e9/src/TestFiles/SMP_9/queue.dat -------------------------------------------------------------------------------- /src/TestFiles/SMP_9/unitinfo.txt: -------------------------------------------------------------------------------- 1 | Current Work Unit 2 | ----------------- 3 | Name: Gromacs 4 | Tag: P2681R9C8G55 5 | Download time: January 22 04:37:17 6 | Due time: January 28 04:37:17 7 | Progress: 0% [__________] 8 | -------------------------------------------------------------------------------- /src/TestFiles/Standard_2/Standard PPC 6.xx.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harlam357/hfm-net/7a23cd3641a77c9a97b259c3c5412bdec23fd3e9/src/TestFiles/Standard_2/Standard PPC 6.xx.txt -------------------------------------------------------------------------------- /src/TestFiles/Standard_2/queue.dat: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harlam357/hfm-net/7a23cd3641a77c9a97b259c3c5412bdec23fd3e9/src/TestFiles/Standard_2/queue.dat -------------------------------------------------------------------------------- /src/TestFiles/Standard_3/Standard PPC 5.01.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harlam357/hfm-net/7a23cd3641a77c9a97b259c3c5412bdec23fd3e9/src/TestFiles/Standard_3/Standard PPC 5.01.txt -------------------------------------------------------------------------------- /src/TestFiles/Standard_3/queue.dat: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harlam357/hfm-net/7a23cd3641a77c9a97b259c3c5412bdec23fd3e9/src/TestFiles/Standard_3/queue.dat -------------------------------------------------------------------------------- /src/TestFiles/Standard_4/Standard x86 6.xx.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harlam357/hfm-net/7a23cd3641a77c9a97b259c3c5412bdec23fd3e9/src/TestFiles/Standard_4/Standard x86 6.xx.txt -------------------------------------------------------------------------------- /src/TestFiles/Standard_4/queue.dat: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harlam357/hfm-net/7a23cd3641a77c9a97b259c3c5412bdec23fd3e9/src/TestFiles/Standard_4/queue.dat -------------------------------------------------------------------------------- /src/TestFiles/Standard_5/queue.dat: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harlam357/hfm-net/7a23cd3641a77c9a97b259c3c5412bdec23fd3e9/src/TestFiles/Standard_5/queue.dat -------------------------------------------------------------------------------- /src/TestFiles/Standard_5/unitinfo.txt: -------------------------------------------------------------------------------- 1 | Current Work Unit 2 | ----------------- 3 | Name: ProtoMol p10002 4 | Tag: - 5 | Download time: March 23 22:41:07 6 | Due time: April 15 23:38:42 7 | Progress: 11% [|_________] 8 | -------------------------------------------------------------------------------- /src/harlam357.snk: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harlam357/hfm-net/7a23cd3641a77c9a97b259c3c5412bdec23fd3e9/src/harlam357.snk -------------------------------------------------------------------------------- /src/harlam357public.snk: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harlam357/hfm-net/7a23cd3641a77c9a97b259c3c5412bdec23fd3e9/src/harlam357public.snk -------------------------------------------------------------------------------- /tools/ILMerge/ILMerge.doc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harlam357/hfm-net/7a23cd3641a77c9a97b259c3c5412bdec23fd3e9/tools/ILMerge/ILMerge.doc -------------------------------------------------------------------------------- /tools/ILMerge/ILMerge.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harlam357/hfm-net/7a23cd3641a77c9a97b259c3c5412bdec23fd3e9/tools/ILMerge/ILMerge.exe -------------------------------------------------------------------------------- /tools/Paraffin/Paraffin.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harlam357/hfm-net/7a23cd3641a77c9a97b259c3c5412bdec23fd3e9/tools/Paraffin/Paraffin.exe --------------------------------------------------------------------------------