├── .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 | [)](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 = "[91m13:21:22:ERROR:WU01:FS01:Exception: Server did not assign work unit[0m";
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
--------------------------------------------------------------------------------