From 2897e88f8f7982c8dd365ebf00d72a505eadbd60 Mon Sep 17 00:00:00 2001 From: Evgeny Date: Wed, 15 Feb 2023 12:48:01 +0300 Subject: [PATCH 01/36] Bug: ServiceMusicLibraryUi.GetFiles not working --- src/Plugins/dotnet_musiclibrary/Directory.Build.targets | 2 +- src/SDK/aimp_dotnet/AIMPSDK/AIMP400/apiMusicLibrary.h | 2 +- .../aimp_dotnet/SDK/MusicLibrary/AimpServiceMusicLibraryUI.cpp | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Plugins/dotnet_musiclibrary/Directory.Build.targets b/src/Plugins/dotnet_musiclibrary/Directory.Build.targets index 9d8498b1..f2980577 100644 --- a/src/Plugins/dotnet_musiclibrary/Directory.Build.targets +++ b/src/Plugins/dotnet_musiclibrary/Directory.Build.targets @@ -1,7 +1,7 @@  $(SolutionDir)..\nuget\tools\CopyPlugin.ps1 - AIMP5.02.2369 + AIMP5.11.2421 diff --git a/src/SDK/aimp_dotnet/AIMPSDK/AIMP400/apiMusicLibrary.h b/src/SDK/aimp_dotnet/AIMPSDK/AIMP400/apiMusicLibrary.h index e8e09625..6ccdb3d5 100644 --- a/src/SDK/aimp_dotnet/AIMPSDK/AIMP400/apiMusicLibrary.h +++ b/src/SDK/aimp_dotnet/AIMPSDK/AIMP400/apiMusicLibrary.h @@ -602,7 +602,7 @@ class IAIMPServiceMusicLibrary : public IUnknown class IAIMPServiceMusicLibraryUI : public IUnknown { public: - virtual HRESULT WINAPI GetFiles(DWORD Flags, IAIMPMLFileList* List) = 0; + virtual HRESULT WINAPI GetFiles(DWORD Flags, IAIMPMLFileList** List) = 0; virtual HRESULT WINAPI GetGroupingFilter(IAIMPMLDataFilter** Filter) = 0; virtual HRESULT WINAPI GetGroupingFilterPath(IAIMPString** Path) = 0; virtual HRESULT WINAPI SetGroupingFilterPath(IAIMPString* Path) = 0; diff --git a/src/SDK/aimp_dotnet/SDK/MusicLibrary/AimpServiceMusicLibraryUI.cpp b/src/SDK/aimp_dotnet/SDK/MusicLibrary/AimpServiceMusicLibraryUI.cpp index e60c1cdc..215b62c1 100644 --- a/src/SDK/aimp_dotnet/SDK/MusicLibrary/AimpServiceMusicLibraryUI.cpp +++ b/src/SDK/aimp_dotnet/SDK/MusicLibrary/AimpServiceMusicLibraryUI.cpp @@ -26,7 +26,7 @@ AimpActionResult^ AimpServiceMusicLibraryUI::GetFiles(FilesType try { if (service != nullptr) { IAIMPMLFileList* l = nullptr; - result = CheckResult(service->GetFiles(static_cast(flags), l)); + result = CheckResult(service->GetFiles(static_cast(flags), &l)); if (result == ActionResultType::OK && l != nullptr) { list = gcnew AimpFileList(l); From 35b32506f05d404afdf5a77c700e043791f9c3e4 Mon Sep 17 00:00:00 2001 From: Evgeny Date: Wed, 15 Feb 2023 14:16:10 +0300 Subject: [PATCH 02/36] Fix sonarqube issue --- src/AssemblyInfo.cs | 13 +++++---- src/Plugins/dotnet_CustomFileSystem/Plugin.cs | 3 +- .../dotnet_ExtendDialogWindow/Plugin.cs | 2 +- src/Plugins/dotnet_SmartPlaylist/Plugin.cs | 2 +- src/Plugins/dotnet_demo/Plugin.cs | 6 +--- src/Plugins/dotnet_musiclibrary/Plugin.cs | 28 +++++++++++++++++++ src/Plugins/dotnet_threading/Plugin.cs | 3 +- src/Plugins/dotnet_visual/Plugin.cs | 2 +- 8 files changed, 42 insertions(+), 17 deletions(-) diff --git a/src/AssemblyInfo.cs b/src/AssemblyInfo.cs index c3cfc1a9..77bccfd7 100644 --- a/src/AssemblyInfo.cs +++ b/src/AssemblyInfo.cs @@ -9,16 +9,19 @@ using System.Reflection; -[assembly: AssemblyVersion(AdditionalInfo.Version)] -[assembly: AssemblyFileVersion(AdditionalInfo.Version)] +[assembly: AssemblyVersion(AIMP.SDK.AdditionalInfo.Version)] +[assembly: AssemblyFileVersion(AIMP.SDK.AdditionalInfo.Version)] [assembly: AssemblyInformationalVersion("")] [assembly: AssemblyCompany("")] -[assembly: AssemblyCopyright("Copyright © Evgeniy Bogdan 2022")] +[assembly: AssemblyCopyright("Copyright © Evgeniy Bogdan 2023")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] -internal static class AdditionalInfo +namespace AIMP.SDK { - public const string Version = "1.0.0.0"; + internal static class AdditionalInfo + { + public const string Version = "1.0.0.0"; + } } diff --git a/src/Plugins/dotnet_CustomFileSystem/Plugin.cs b/src/Plugins/dotnet_CustomFileSystem/Plugin.cs index 58da567a..bbc86149 100644 --- a/src/Plugins/dotnet_CustomFileSystem/Plugin.cs +++ b/src/Plugins/dotnet_CustomFileSystem/Plugin.cs @@ -16,8 +16,7 @@ namespace AIMP.SDK.CustomFileSystem { - [AimpPlugin("dotnet_CustomFileSystem", "AIMP DOTNET", "1.0.0.0", AimpPluginType = AimpPluginType.Addons, - RequireAppDomain = false)] + [AimpPlugin("dotnet_CustomFileSystem", "Evgeniy Bogdan", AdditionalInfo.Version, AimpPluginType = AimpPluginType.Addons)] [Serializable] // ReSharper disable UnusedMember.Global public class Plugin : AimpPlugin diff --git a/src/Plugins/dotnet_ExtendDialogWindow/Plugin.cs b/src/Plugins/dotnet_ExtendDialogWindow/Plugin.cs index 7a0fae7d..bd6a1e93 100644 --- a/src/Plugins/dotnet_ExtendDialogWindow/Plugin.cs +++ b/src/Plugins/dotnet_ExtendDialogWindow/Plugin.cs @@ -14,7 +14,7 @@ namespace dotnet_ExtendDialogWindow { - [AimpPlugin("dotnet_ExtendDialogWindow", "AIMP DOTNET", "1.0.0.0", AimpPluginType = AimpPluginType.Addons)] + [AimpPlugin("dotnet_ExtendDialogWindow", "Evgeniy Bogdan", AdditionalInfo.Version, AimpPluginType = AimpPluginType.Addons)] public class Plugin : AimpPlugin, IAimpExternalSettingsDialog { public void Show(IntPtr parentWindow) diff --git a/src/Plugins/dotnet_SmartPlaylist/Plugin.cs b/src/Plugins/dotnet_SmartPlaylist/Plugin.cs index 17fb24a8..f6acf0d1 100644 --- a/src/Plugins/dotnet_SmartPlaylist/Plugin.cs +++ b/src/Plugins/dotnet_SmartPlaylist/Plugin.cs @@ -13,7 +13,7 @@ namespace Aimp.DotNet.SmartPlaylist { - [AimpPlugin("SmartPlaylistDemoPlugin", "Martin", "1.0.0.0", AimpPluginType = AimpPluginType.Addons, + [AimpPlugin("SmartPlaylistDemoPlugin", "Evgeniy Bogdan", AdditionalInfo.Version, AimpPluginType = AimpPluginType.Addons, FullDescription = "Smart Playlist demo plugin")] public class Plugin : AimpPlugin { diff --git a/src/Plugins/dotnet_demo/Plugin.cs b/src/Plugins/dotnet_demo/Plugin.cs index c7c6937a..1f2e72b4 100644 --- a/src/Plugins/dotnet_demo/Plugin.cs +++ b/src/Plugins/dotnet_demo/Plugin.cs @@ -8,14 +8,10 @@ // ---------------------------------------------------- using System; -using System.Diagnostics; using System.Windows.Input; -using AIMP; -using AIMP.SDK.Actions; using AIMP.SDK.Actions.Objects; using AIMP.SDK.MenuManager.Objects; using AIMP.SDK.MessageDispatcher; -using AIMP.SDK.Playlist; using AIMP.SDK.Playlist.Extensions; using AIMP.SDK.Playlist.Objects; using DemoPlugin; @@ -58,7 +54,7 @@ public AimpActionResult OnPlaylistRemoved(IAimpPlaylist playlist) } } - [AimpPlugin("dotnet_demo", "Evgeniy Bogdan", "1.0.0.0", AimpPluginType = AimpPluginType.Addons)] + [AimpPlugin("dotnet_demo", "Evgeniy Bogdan", AdditionalInfo.Version, AimpPluginType = AimpPluginType.Addons)] public class Plugin : AimpPlugin { private bool _checked; diff --git a/src/Plugins/dotnet_musiclibrary/Plugin.cs b/src/Plugins/dotnet_musiclibrary/Plugin.cs index 6690e60e..a5f7555a 100644 --- a/src/Plugins/dotnet_musiclibrary/Plugin.cs +++ b/src/Plugins/dotnet_musiclibrary/Plugin.cs @@ -7,9 +7,13 @@ // Mail: mail4evgeniy@gmail.com // ---------------------------------------------------- +using System; + using AIMP.DotNet.MusicLibrary.Preimage; using AIMP.SDK; using AIMP.SDK.MenuManager; +using AIMP.SDK.MenuManager.Objects; +using AIMP.SDK.MusicLibrary; namespace AIMP.DotNet.MusicLibrary { @@ -31,6 +35,30 @@ public override void Initialize() CheckActionResult(Player.Core.RegisterExtension(plListner).ResultType); CheckActionResult(Player.Core.RegisterExtension(preimageFactory).ResultType); + + var menu = Player.Core.CreateAimpObject(); + menu.Result.Name = "Test"; + + menu.Result.OnShow += (sender, args) => + { + var storage = Player.ServiceMusicLibrary.GetActiveStorage(); + var name = storage.Result.Caption; + var p = storage.Result.GroupingPreset; + var id = storage.Result.Id; + + var focusedFiles = Player.ServiceMusicLibraryUi.GetFiles(FilesType.Focused); + }; + + Player.ServiceMenuManager.Add(ParentMenuType.MlTreeContextFunctions, menu.Result); + + var tableMenu = Player.Core.CreateAimpObject(); + menu.Result.Name = "Library Demo plugin"; + menu.Result.Id = Guid.NewGuid().ToString(); + menu.Result.OnExecute += (sender, args) => + { + var focusedFiles = Player.ServiceMusicLibraryUi.GetFiles(FilesType.Focused); + }; + Player.ServiceMenuManager.Add(ParentMenuType.MlTableContextFunctions, tableMenu.Result); } public override void Dispose() diff --git a/src/Plugins/dotnet_threading/Plugin.cs b/src/Plugins/dotnet_threading/Plugin.cs index ce185b82..3956092f 100644 --- a/src/Plugins/dotnet_threading/Plugin.cs +++ b/src/Plugins/dotnet_threading/Plugin.cs @@ -12,8 +12,7 @@ namespace dotnet_threading { - [AimpPlugin("ThreadinDemoPlugin", "Martin", "1.0.0.0", AimpPluginType = AimpPluginType.Addons, - FullDescription = "Threading demo plugin")] + [AimpPlugin("ThreadinDemoPlugin", "Evgeniy Bogdan", AdditionalInfo.Version, AimpPluginType = AimpPluginType.Addons, FullDescription = "Threading demo plugin")] public class Plugin : AimpPlugin { public override void Initialize() diff --git a/src/Plugins/dotnet_visual/Plugin.cs b/src/Plugins/dotnet_visual/Plugin.cs index 07dd8938..fc46600d 100644 --- a/src/Plugins/dotnet_visual/Plugin.cs +++ b/src/Plugins/dotnet_visual/Plugin.cs @@ -13,7 +13,7 @@ namespace dotnet_visual { - [AimpPlugin("dotnet_visual", "Evgeniy Bogdan", "1.0.0.0", AimpPluginType = AimpPluginType.Visuals)] + [AimpPlugin("dotnet_visual", "Evgeniy Bogdan", AdditionalInfo.Version, AimpPluginType = AimpPluginType.Visuals)] public class Plugin : AimpPlugin { private IAimpExtensionCustomVisualization _customVisualization; From ef6663d74850abe1c65c69625426b454197c6935 Mon Sep 17 00:00:00 2001 From: Evgeny Date: Wed, 15 Feb 2023 14:23:04 +0300 Subject: [PATCH 03/36] Update file header --- build/ApiProject.cs | 2 +- build/Build.Analyze.cs | 2 +- build/Build.Documentation.cs | 2 +- build/Build.IntegrationTest.cs | 2 +- build/Build.cs | 2 +- build/Configuration.cs | 2 +- build/DocFX/CustomDocFx.cs | 2 +- build/DocFX/CustomTocWriter.cs | 2 +- build/GhprSettings.cs | 2 +- build/SonarQube/SonarBeginSettings.cs | 2 +- build/SonarQube/SonarQubeBeginSettingsExtensions.cs | 2 +- src/AssemblyInfo.cs | 2 +- .../dotnet_CustomFileSystem/CustomFileSystem.cs | 2 +- src/Plugins/dotnet_CustomFileSystem/Plugin.cs | 2 +- .../Properties/PluginAssemblyInfo.cs | 2 +- src/Plugins/dotnet_ExtendDialogWindow/OptionsFrame.cs | 2 +- src/Plugins/dotnet_ExtendDialogWindow/Plugin.cs | 2 +- .../Properties/PluginAssemblyInfo.cs | 2 +- src/Plugins/dotnet_ExtendDialogWindow/SettingsForm.cs | 2 +- src/Plugins/dotnet_SmartPlaylist/FrmTestPreimage.cs | 2 +- src/Plugins/dotnet_SmartPlaylist/Plugin.cs | 2 +- .../Properties/PluginAssemblyInfo.cs | 2 +- src/Plugins/dotnet_SmartPlaylist/TestPreimage.cs | 2 +- .../dotnet_SmartPlaylist/TestPreimageFactory.cs | 2 +- .../dotnet_albumart/AimpExtensionAlbumArtCatalog.cs | 2 +- .../dotnet_albumart/AimpExtensionAlbumArtProvider.cs | 2 +- src/Plugins/dotnet_albumart/Plugin.cs | 2 +- .../dotnet_albumart/Properties/PluginAssemblyInfo.cs | 2 +- src/Plugins/dotnet_demo/Logger.cs | 2 +- src/Plugins/dotnet_demo/LoggerForm.cs | 2 +- .../OptionsFrame/AimpOptionsDialogFrame.cs | 2 +- src/Plugins/dotnet_demo/OptionsFrame/SettingsForm.cs | 2 +- src/Plugins/dotnet_demo/PlayListControl.cs | 2 +- src/Plugins/dotnet_demo/PlayerForm.cs | 2 +- src/Plugins/dotnet_demo/Plugin.cs | 2 +- .../dotnet_demo/Properties/PluginAssemblyInfo.cs | 2 +- src/Plugins/dotnet_demo/TagEditControl.cs | 2 +- src/Plugins/dotnet_demo/TagEditorForm.cs | 2 +- src/Plugins/dotnet_demo/UI/PlayListEditor.cs | 2 +- src/Plugins/dotnet_demo/Utils.cs | 2 +- .../AimpExtensionFileInfoProvider.cs | 2 +- .../dotnet_musiclibrary/DemoExtensionFileSystem.cs | 2 +- src/Plugins/dotnet_musiclibrary/DemoMusicLibrary.cs | 2 +- .../DataProviderGroupingTree.cs | 2 +- .../DataProviderGroupingTreeData.cs | 2 +- .../DataProviderGroupingTreeSelection.cs | 2 +- .../RootDataProviderSelection.cs | 2 +- .../CustomAimpGroupingTreeDataProvider.cs | 2 +- .../CustomAimpGroupingTreeDataProviderSelection.cs | 2 +- .../TDemoExplorerViewAbstractDataProviderSelection.cs | 2 +- .../MyExtensionFileInfoProvider.cs | 2 +- src/Plugins/dotnet_musiclibrary/Plugin.cs | 2 +- .../Preimage/MediaLibraryPreimageFactory.cs | 2 +- .../Preimage/PlaylistManagerListener.cs | 2 +- .../Preimage/TestMediaLibraryPreimage.cs | 2 +- .../Properties/PluginAssemblyInfo.cs | 2 +- src/Plugins/dotnet_threading/Plugin.cs | 2 +- .../dotnet_threading/Properties/PluginAssemblyInfo.cs | 2 +- src/Plugins/dotnet_threading/TestTask.cs | 2 +- src/Plugins/dotnet_visual/CustomVisualization.cs | 2 +- src/Plugins/dotnet_visual/EmbeddedVisualization.cs | 2 +- src/Plugins/dotnet_visual/Plugin.cs | 2 +- .../dotnet_visual/Properties/PluginAssemblyInfo.cs | 2 +- src/SDK/AIMP.SDK/AIMPPluginAttribute.cs | 2 +- src/SDK/AIMP.SDK/AimpInternalLogger.cs | 2 +- src/SDK/AIMP.SDK/AimpPlugin.cs | 2 +- src/SDK/AIMP.SDK/Loader/AimpDotNetPlugin.cs | 2 +- .../AIMP.SDK/Loader/AssemblyScanPluginLoadStrategy.cs | 2 +- src/SDK/AIMP.SDK/Loader/CustomAssemblyResolver.cs | 2 +- src/SDK/AIMP.SDK/Loader/DotNetPluginInfo.cs | 2 +- src/SDK/AIMP.SDK/Loader/PluginInfoLoader.cs | 2 +- src/SDK/AIMP.SDK/Loader/PluginInformation.cs | 2 +- src/SDK/AIMP.SDK/Loader/PluginLoadingStrategy.cs | 2 +- src/SDK/AIMP.SDK/Loader/PluginShortInfoForLoad.cs | 2 +- src/SDK/AIMP.SDK/Properties/Annotations.cs | 2 +- src/SDK/AIMP.SDK/Properties/PluginAssemblyInfo.cs | 2 +- .../AIMP.SDK/SDK/Actions/IAimpServiceActionManager.cs | 2 +- src/SDK/AIMP.SDK/SDK/Actions/Objects/IAimpAction.cs | 2 +- .../AIMP.SDK/SDK/Actions/Objects/IAimpActionEvent.cs | 2 +- src/SDK/AIMP.SDK/SDK/AimpActionException.cs | 2 +- src/SDK/AIMP.SDK/SDK/AimpActionResult.cs | 2 +- src/SDK/AIMP.SDK/SDK/AimpObjectType.cs | 2 +- .../AIMP.SDK/SDK/AlbumArt/AimpFindCovertArtType.cs | 2 +- .../AIMP.SDK/SDK/AlbumArt/AimpGetAlbumArtEventArgs.cs | 2 +- .../Extensions/AimpAlbumArtProviderCategory.cs | 2 +- .../Extensions/IAimpExtensionAlbumArtCatalog.cs | 2 +- .../Extensions/IAimpExtensionAlbumArtCatalog2.cs | 2 +- .../Extensions/IAimpExtensionAlbumArtProvider.cs | 2 +- .../Extensions/IAimpExtensionAlbumArtProvider2.cs | 2 +- .../Extensions/IAimpExtensionAlbumArtProvider3.cs | 2 +- src/SDK/AIMP.SDK/SDK/AlbumArt/IAimpAlbumArtRequest.cs | 2 +- .../SDK/AlbumArt/IAimpAlbumArtSearchOptions.cs | 2 +- .../SDK/AlbumArt/Services/IAimpServiceAlbumArt.cs | 2 +- .../AlbumArt/Services/IAimpServiceAlbumArtCache.cs | 2 +- .../AIMP.SDK/SDK/Configuration/IAimpServiceConfig.cs | 2 +- src/SDK/AIMP.SDK/SDK/Core/IAimpServiceShutdown.cs | 2 +- src/SDK/AIMP.SDK/SDK/Core/IAimpServiceVersionInfo.cs | 2 +- src/SDK/AIMP.SDK/SDK/Enums.cs | 2 +- src/SDK/AIMP.SDK/SDK/Extensions.cs | 2 +- .../AIMP.SDK/SDK/FileManager/AimpFileAttributes.cs | 2 +- .../FileManager/Commands/IAimpFileSystemCommand.cs | 2 +- .../Commands/IAimpFileSystemCommandCopyToClipboard.cs | 2 +- .../Commands/IAimpFileSystemCommandDelete.cs | 2 +- .../Commands/IAimpFileSystemCommandDropSource.cs | 2 +- .../Commands/IAimpFileSystemCommandFileInfo.cs | 2 +- .../Commands/IAimpFileSystemCommandOpenFileFolder.cs | 2 +- .../Commands/IAimpFileSystemCommandStreaming.cs | 2 +- .../Commands/IAimpFileSystemCustomFileCommand.cs | 2 +- .../Extensions/IAimpExtensionFileExpander.cs | 2 +- .../Extensions/IAimpExtensionFileFormat.cs | 2 +- .../Extensions/IAimpExtensionFileInfoProvider.cs | 2 +- .../Extensions/IAimpExtensionFileSystem.cs | 2 +- src/SDK/AIMP.SDK/SDK/FileManager/FileCommandType.cs | 2 +- .../SDK/FileManager/IAIMPServiceFileSystems.cs | 2 +- .../SDK/FileManager/IAimpServiceFileFormats.cs | 2 +- .../AIMP.SDK/SDK/FileManager/IAimpServiceFileInfo.cs | 2 +- .../SDK/FileManager/IAimpServiceFileInfoFormatter.cs | 2 +- .../FileManager/IAimpServiceFileInfoFormatterUtils.cs | 2 +- .../SDK/FileManager/IAimpServiceFileManager.cs | 2 +- .../SDK/FileManager/IAimpServiceFileStreaming.cs | 2 +- .../AIMP.SDK/SDK/FileManager/IAimpServiceFileURI.cs | 2 +- .../AIMP.SDK/SDK/FileManager/IAimpServiceFileURI2.cs | 2 +- .../AIMP.SDK/SDK/FileManager/Objects/IAimpFileInfo.cs | 2 +- .../SDK/FileManager/Objects/IAimpVirtualFile.cs | 2 +- src/SDK/AIMP.SDK/SDK/IAimpConfig.cs | 2 +- src/SDK/AIMP.SDK/SDK/IAimpCore.cs | 2 +- src/SDK/AIMP.SDK/SDK/IAimpDPIAware.cs | 2 +- src/SDK/AIMP.SDK/SDK/IAimpErrorInfo.cs | 2 +- src/SDK/AIMP.SDK/SDK/IAimpExtension.cs | 2 +- src/SDK/AIMP.SDK/SDK/IAimpExternalSettingsDialog.cs | 2 +- src/SDK/AIMP.SDK/SDK/IAimpObject.cs | 2 +- src/SDK/AIMP.SDK/SDK/IAimpObjectList.cs | 2 +- src/SDK/AIMP.SDK/SDK/IAimpPlayer.cs | 2 +- src/SDK/AIMP.SDK/SDK/IAimpProgressCallback.cs | 2 +- src/SDK/AIMP.SDK/SDK/IAimpService.cs | 2 +- .../Lyrics/Extensions/IAimpExtensionLyricsProvider.cs | 2 +- src/SDK/AIMP.SDK/SDK/Lyrics/IAimpServiceLyrics.cs | 2 +- src/SDK/AIMP.SDK/SDK/Lyrics/Objects/IAimpLyrics.cs | 2 +- src/SDK/AIMP.SDK/SDK/MUIManager/IAimpMUIManager.cs | 2 +- .../SDK/MenuManager/IAimpServiceMenuManager.cs | 2 +- .../AIMP.SDK/SDK/MenuManager/Objects/IAimpMenuItem.cs | 2 +- .../AIMP.SDK/SDK/MessageDispatcher/AimpMessages.cs | 2 +- .../SDK/MessageDispatcher/AimpQuickFileInfoParams.cs | 2 +- .../SDK/MessageDispatcher/IAimpMessageHook.cs | 2 +- .../IAimpServiceMessageDispatcher.cs | 2 +- .../SDK/MessageDispatcher/PointerExtension.cs | 2 +- .../MusicLibrary/DataFilter/IAimpDataFieldFilter.cs | 2 +- .../DataFilter/IAimpDataFieldFilterByArray.cs | 2 +- .../MusicLibrary/DataFilter/IAimpDataFilterGroup.cs | 2 +- .../SDK/MusicLibrary/DataStorage/AimpDataField.cs | 2 +- .../SDK/MusicLibrary/DataStorage/IAimpDataField.cs | 2 +- .../DataStorage/IAimpDataFieldDisplayValue.cs | 2 +- .../SDK/MusicLibrary/DataStorage/IAimpDataProvider.cs | 2 +- .../MusicLibrary/DataStorage/IAimpDataProvider2.cs | 2 +- .../SDK/MusicLibrary/DataStorage/IAimpDataStorage.cs | 2 +- .../SDK/MusicLibrary/DataStorage/IAimpDataStorage2.cs | 2 +- .../DataStorage/IAimpGroupingTreeDataProvider.cs | 2 +- .../IAimpGroupingTreeDataProviderSelection.cs | 2 +- .../DataStorage/IAimpGroupingTreeSelection.cs | 2 +- .../Command/IAimpDataStorageCommandAddFiles.cs | 2 +- .../Command/IAimpDataStorageCommandAddFilesDialog.cs | 2 +- .../Command/IAimpDataStorageCommandDeleteFiles.cs | 2 +- .../Command/IAimpDataStorageCommandDeleteFiles2.cs | 2 +- .../Command/IAimpDataStorageCommandDropData.cs | 2 +- .../Command/IAimpDataStorageCommandFindInLibrary.cs | 2 +- .../Command/IAimpDataStorageCommandReloadTags.cs | 2 +- .../Command/IAimpDataStorageCommandReportDialog.cs | 2 +- .../Command/IAimpDataStorageCommandUserMark.cs | 2 +- .../MusicLibrary/Extension/IAimpAlbumArtProvider.cs | 11 ++++++++++- .../MusicLibrary/Extension/IAimpAlbumArtProvider2.cs | 2 +- .../Extension/IAimpExtensionDataStorage.cs | 2 +- src/SDK/AIMP.SDK/SDK/MusicLibrary/IAimpDataFilter.cs | 2 +- .../SDK/MusicLibrary/IAimpDataProviderSelection.cs | 2 +- .../SDK/MusicLibrary/IAimpDataStorageManager.cs | 2 +- src/SDK/AIMP.SDK/SDK/MusicLibrary/IAimpFileList.cs | 2 +- .../SDK/MusicLibrary/IAimpLocalDataStorage.cs | 2 +- .../MusicLibrary/IAimpMusicLibraryPlaylistPreimage.cs | 2 +- .../SDK/MusicLibrary/IAimpServiceMusicLibrary.cs | 2 +- .../SDK/MusicLibrary/IAimpServiceMusicLibraryUI.cs | 2 +- .../AIMP.SDK/SDK/MusicLibrary/IAimpSortDirection.cs | 2 +- .../SDK/MusicLibrary/Presets/IAimpGroupingPreset.cs | 2 +- .../Presets/IAimpGroupingPresetStandard.cs | 2 +- .../SDK/MusicLibrary/Presets/IAimpGroupingPresets.cs | 2 +- .../AIMP.SDK/SDK/MusicLibrary/SortDirectionType.cs | 2 +- src/SDK/AIMP.SDK/SDK/Objects/IAimpFileStream.cs | 2 +- src/SDK/AIMP.SDK/SDK/Objects/IAimpHashCode.cs | 2 +- src/SDK/AIMP.SDK/SDK/Objects/IAimpImage.cs | 2 +- src/SDK/AIMP.SDK/SDK/Objects/IAimpImage2.cs | 2 +- src/SDK/AIMP.SDK/SDK/Objects/IAimpImageContainer.cs | 2 +- src/SDK/AIMP.SDK/SDK/Objects/IAimpMemoryStream.cs | 2 +- src/SDK/AIMP.SDK/SDK/Objects/IAimpPropertyList2.cs | 2 +- src/SDK/AIMP.SDK/SDK/Objects/IAimpStream.cs | 2 +- src/SDK/AIMP.SDK/SDK/Objects/IAimpString.cs | 2 +- .../AIMP.SDK/SDK/Options/IAimpOptionsDialogFrame.cs | 2 +- .../Options/IAimpOptionsDialogFrameKeyboardHelper.cs | 2 +- .../Options/IAimpOptionsDialogFrameKeyboardHelper2.cs | 2 +- .../AIMP.SDK/SDK/Options/IAimpServiceOptionsDialog.cs | 2 +- .../AIMP.SDK/SDK/PlayList/AimpPlayListEventArgs.cs | 2 +- src/SDK/AIMP.SDK/SDK/PlayList/Constants.cs | 2 +- .../IAimpExtensionPlaylistManagerListener.cs | 2 +- .../IAimpExtensionPlaylistPreimageFactory.cs | 2 +- src/SDK/AIMP.SDK/SDK/PlayList/IAimpPlayListManager.cs | 2 +- .../AIMP.SDK/SDK/PlayList/IAimpPlaylistListener.cs | 2 +- .../AIMP.SDK/SDK/PlayList/IAimpPlaylistManager2.cs | 2 +- .../SDK/PlayList/IAimpPlaylistPreimageDataProvider.cs | 2 +- .../SDK/PlayList/IAimpPlaylistPreimageFolders.cs | 2 +- .../SDK/PlayList/IAimpPlaylistPreimageListener.cs | 2 +- src/SDK/AIMP.SDK/SDK/PlayList/IAimpPlaylistQueue.cs | 2 +- .../SDK/PlayList/IAimpPlaylistQueueListener.cs | 2 +- .../SDK/PlayList/Objects/IAIMPPlaylistPreimage.cs | 2 +- .../SDK/PlayList/Objects/IAimpPlayListGroup.cs | 2 +- .../SDK/PlayList/Objects/IAimpPlayListItem.cs | 2 +- .../AIMP.SDK/SDK/PlayList/Objects/IAimpPlaylist.cs | 2 +- .../Player/Extensions/IAimpExtensionPlaybackQueue.cs | 2 +- .../Player/Extensions/IAimpExtensionPlaybackQueue2.cs | 2 +- .../SDK/Player/Extensions/IAimpExtensionPlayerHook.cs | 2 +- .../Extensions/IAimpExtensionWaveFormProvider.cs | 2 +- .../AIMP.SDK/SDK/Player/IAimpPlaybackQueueService.cs | 2 +- .../AIMP.SDK/SDK/Player/IAimpServicePlaybackQueue2.cs | 2 +- src/SDK/AIMP.SDK/SDK/Player/IAimpServicePlayer.cs | 2 +- src/SDK/AIMP.SDK/SDK/Player/IAimpServicePlayer2.cs | 2 +- .../SDK/Player/IAimpServicePlayerEqualizer.cs | 2 +- .../SDK/Player/IAimpServicePlayerEqualizerPresets.cs | 2 +- src/SDK/AIMP.SDK/SDK/Player/IAimpServiceWaveform.cs | 2 +- .../SDK/Player/Objects/IAimpEqualizerBands.cs | 2 +- .../SDK/Player/Objects/IAimpEqualizerPreset.cs | 2 +- .../SDK/Player/Objects/IAimpPlaybackQueueItem.cs | 2 +- .../SDK/Player/Objects/IAimpWaveformPeakInfo.cs | 2 +- src/SDK/AIMP.SDK/SDK/Player/PlayFlags.cs | 2 +- .../Extensions/IAimpExtensionTagsProvider.cs | 2 +- src/SDK/AIMP.SDK/SDK/TagEditor/IAimpFileTag.cs | 2 +- src/SDK/AIMP.SDK/SDK/TagEditor/IAimpFileTagEditor.cs | 2 +- .../SDK/TagEditor/IAimpServiceFileTagEditor.cs | 2 +- .../SDK/TagEditor/IAimpServiceFindTagsOnline.cs | 2 +- .../SDK/Threading/IAimpServiceSynchronizer.cs | 2 +- .../AIMP.SDK/SDK/Threading/IAimpServiceThreadPool.cs | 2 +- src/SDK/AIMP.SDK/SDK/Threading/IAimpServiceThreads.cs | 2 +- src/SDK/AIMP.SDK/SDK/Threading/IAimpTask.cs | 2 +- src/SDK/AIMP.SDK/SDK/Threading/IAimpTaskOwner.cs | 2 +- src/SDK/AIMP.SDK/SDK/Threading/IAimpTaskPriority.cs | 2 +- src/SDK/AIMP.SDK/SDK/Visuals/AimpVisualData.cs | 2 +- src/SDK/AIMP.SDK/SDK/Visuals/AimpVisualFlags.cs | 2 +- .../SDK/Visuals/IAimpExtensionCustomVisualization.cs | 2 +- .../Visuals/IAimpExtensionEmbeddedVisualization.cs | 2 +- .../SDK/Visuals/IAimpServiceVisualizations.cs | 2 +- src/SDK/AIMP.SDK/Win32/IWin32Manager.cs | 2 +- src/SDK/aimp_dotnet/AIMPSDK/AIMPSDK.h | 2 +- src/SDK/aimp_dotnet/AimpDotnetPlugin.cpp | 2 +- src/SDK/aimp_dotnet/AimpMemoryManager.cpp | 2 +- src/SDK/aimp_dotnet/AimpMemoryManager.h | 2 +- src/SDK/aimp_dotnet/AimpSdk.h | 2 +- src/SDK/aimp_dotnet/DotNetPlugin.cpp | 2 +- src/SDK/aimp_dotnet/DotNetPlugin.h | 2 +- src/SDK/aimp_dotnet/IUnknownInterfaceImpl.h | 2 +- src/SDK/aimp_dotnet/SDK/Action/AimpAction.cpp | 2 +- src/SDK/aimp_dotnet/SDK/Action/AimpAction.h | 2 +- src/SDK/aimp_dotnet/SDK/Action/AimpActionEvent.cpp | 2 +- src/SDK/aimp_dotnet/SDK/Action/AimpActionEvent.h | 2 +- .../SDK/Action/AimpServiceActionManager.cpp | 2 +- .../aimp_dotnet/SDK/Action/AimpServiceActionManager.h | 2 +- src/SDK/aimp_dotnet/SDK/AimpConfig.cpp | 2 +- src/SDK/aimp_dotnet/SDK/AimpConfig.h | 2 +- src/SDK/aimp_dotnet/SDK/AimpConverter.cpp | 2 +- src/SDK/aimp_dotnet/SDK/AimpConverter.h | 2 +- src/SDK/aimp_dotnet/SDK/AimpCore.h | 2 +- src/SDK/aimp_dotnet/SDK/AimpDPIAware.cpp | 2 +- src/SDK/aimp_dotnet/SDK/AimpDPIAware.h | 2 +- src/SDK/aimp_dotnet/SDK/AimpErrorInfo.cpp | 2 +- src/SDK/aimp_dotnet/SDK/AimpErrorInfo.h | 2 +- src/SDK/aimp_dotnet/SDK/AimpObject.h | 2 +- src/SDK/aimp_dotnet/SDK/AimpObjectList.cpp | 2 +- src/SDK/aimp_dotnet/SDK/AimpObjectList.h | 2 +- src/SDK/aimp_dotnet/SDK/AimpPlayer.cpp | 2 +- src/SDK/aimp_dotnet/SDK/AimpPlayer.h | 2 +- src/SDK/aimp_dotnet/SDK/AimpProgressCallback.cpp | 2 +- src/SDK/aimp_dotnet/SDK/AimpProgressCallback.h | 2 +- src/SDK/aimp_dotnet/SDK/AimpPropertyList.h | 2 +- .../aimp_dotnet/SDK/AlbumArt/AimpAlbumArtRequest.cpp | 2 +- .../aimp_dotnet/SDK/AlbumArt/AimpAlbumArtRequest.h | 2 +- .../SDK/AlbumArt/AimpAlbumArtSearchOptions.cpp | 2 +- .../SDK/AlbumArt/AimpAlbumArtSearchOptions.h | 2 +- .../SDK/AlbumArt/AimpExtensionAlbumArtCatalog.cpp | 2 +- .../SDK/AlbumArt/AimpExtensionAlbumArtCatalog.h | 2 +- .../SDK/AlbumArt/AimpExtensionAlbumArtProvider.cpp | 2 +- .../SDK/AlbumArt/AimpExtensionAlbumArtProvider.h | 2 +- .../SDK/AlbumArt/AimpExtensionAlbumArtProvider3.cpp | 2 +- .../SDK/AlbumArt/AimpExtensionAlbumArtProvider3.h | 2 +- .../aimp_dotnet/SDK/AlbumArt/AimpServiceAlbumArt.cpp | 2 +- .../aimp_dotnet/SDK/AlbumArt/AimpServiceAlbumArt.h | 2 +- .../SDK/AlbumArt/AimpServiceAlbumArtCache.cpp | 2 +- .../SDK/AlbumArt/AimpServiceAlbumArtCache.h | 2 +- src/SDK/aimp_dotnet/SDK/BaseAimpService.h | 2 +- .../SDK/Configuration/AimpConfigurationManager.cpp | 2 +- .../SDK/Configuration/AimpConfigurationManager.h | 2 +- src/SDK/aimp_dotnet/SDK/Core/AimpServiceShutdown.cpp | 2 +- src/SDK/aimp_dotnet/SDK/Core/AimpServiceShutdown.h | 2 +- .../aimp_dotnet/SDK/Core/AimpServiceVersionInfo.cpp | 2 +- src/SDK/aimp_dotnet/SDK/Core/AimpServiceVersionInfo.h | 2 +- src/SDK/aimp_dotnet/SDK/FileManager/AimpFileInfo.cpp | 2 +- src/SDK/aimp_dotnet/SDK/FileManager/AimpFileInfo.h | 2 +- .../SDK/FileManager/AimpServiceFileFormats.cpp | 2 +- .../SDK/FileManager/AimpServiceFileFormats.h | 2 +- .../SDK/FileManager/AimpServiceFileInfo.cpp | 2 +- .../aimp_dotnet/SDK/FileManager/AimpServiceFileInfo.h | 2 +- .../SDK/FileManager/AimpServiceFileInfoFormatter.cpp | 2 +- .../SDK/FileManager/AimpServiceFileInfoFormatter.h | 2 +- .../FileManager/AimpServiceFileInfoFormatterUtils.cpp | 2 +- .../FileManager/AimpServiceFileInfoFormatterUtils.h | 2 +- .../SDK/FileManager/AimpServiceFileStreaming.cpp | 2 +- .../SDK/FileManager/AimpServiceFileStreaming.h | 2 +- .../SDK/FileManager/AimpServiceFileSystems.cpp | 2 +- .../SDK/FileManager/AimpServiceFileSystems.h | 2 +- .../aimp_dotnet/SDK/FileManager/AimpVirtualFile.cpp | 2 +- src/SDK/aimp_dotnet/SDK/FileManager/AimpVirtualFile.h | 2 +- .../Commands/AimpFileSystemCommandCopyToClipboard.cpp | 2 +- .../Commands/AimpFileSystemCommandCopyToClipboard.h | 2 +- .../Commands/AimpFileSystemCommandDelete.cpp | 2 +- .../Commands/AimpFileSystemCommandDelete.h | 2 +- .../Commands/AimpFileSystemCommandDropSource.cpp | 2 +- .../Commands/AimpFileSystemCommandDropSource.h | 2 +- .../Commands/AimpFileSystemCommandFileInfo.cpp | 2 +- .../Commands/AimpFileSystemCommandFileInfo.h | 2 +- .../Commands/AimpFileSystemCommandOpenFileFolder.cpp | 2 +- .../Commands/AimpFileSystemCommandOpenFileFolder.h | 2 +- .../Commands/AimpFileSystemCommandStreaming.cpp | 2 +- .../Commands/AimpFileSystemCommandStreaming.h | 2 +- .../InternalAimpFileSystemCommandCopyToClipboard.cpp | 2 +- .../InternalAimpFileSystemCommandCopyToClipboard.h | 2 +- .../Internal/InternalAimpFileSystemCommandDelete.cpp | 2 +- .../Internal/InternalAimpFileSystemCommandDelete.h | 2 +- .../InternalAimpFileSystemCommandDropSource.cpp | 2 +- .../InternalAimpFileSystemCommandDropSource.h | 2 +- .../InternalAimpFileSystemCommandFileInfo.cpp | 2 +- .../Internal/InternalAimpFileSystemCommandFileInfo.h | 2 +- .../InternalAimpFileSystemCommandOpenFileFolder.cpp | 2 +- .../InternalAimpFileSystemCommandOpenFileFolder.h | 2 +- .../InternalAimpFileSystemCommandStreaming.cpp | 2 +- .../Internal/InternalAimpFileSystemCommandStreaming.h | 2 +- .../InternalAimpFileSystemCustomFileCommand.cpp | 2 +- .../InternalAimpFileSystemCustomFileCommand.h | 2 +- .../SDK/FileManager/Commands/Internal/Stdafx.h | 2 +- src/SDK/aimp_dotnet/SDK/FileManager/Commands/Stdafx.h | 2 +- .../Extensions/InternalAimpExtensionFileExpander.cpp | 2 +- .../Extensions/InternalAimpExtensionFileExpander.h | 2 +- .../Extensions/InternalAimpExtensionFileFormat.cpp | 2 +- .../Extensions/InternalAimpExtensionFileFormat.h | 2 +- .../InternalAimpExtensionFileInfoProvider.cpp | 2 +- .../InternalAimpExtensionFileInfoProvider.h | 2 +- .../Extensions/InternalAimpExtensionFileSystem.cpp | 2 +- .../Extensions/InternalAimpExtensionFileSystem.h | 2 +- .../SDK/FileManager/Services/AimpServiceFileURI.cpp | 2 +- .../SDK/FileManager/Services/AimpServiceFileURI.h | 2 +- .../SDK/FileManager/Services/AimpServiceFileURI2.cpp | 2 +- .../SDK/FileManager/Services/AimpServiceFileURI2.h | 2 +- .../SDK/Lyrics/AimpExtensionLyricsProvider.cpp | 2 +- .../SDK/Lyrics/AimpExtensionLyricsProvider.h | 2 +- src/SDK/aimp_dotnet/SDK/Lyrics/AimpLyrics.cpp | 2 +- src/SDK/aimp_dotnet/SDK/Lyrics/AimpLyrics.h | 2 +- src/SDK/aimp_dotnet/SDK/Lyrics/AimpServiceLyrics.cpp | 2 +- src/SDK/aimp_dotnet/SDK/Lyrics/AimpServiceLyrics.h | 2 +- src/SDK/aimp_dotnet/SDK/MUI/AimpMIUManager.h | 2 +- src/SDK/aimp_dotnet/SDK/MUI/AimpServiceMUI.cpp | 2 +- src/SDK/aimp_dotnet/SDK/MUI/AimpServiceMUI.h | 2 +- src/SDK/aimp_dotnet/SDK/ManagedAimpCore.cpp | 2 +- src/SDK/aimp_dotnet/SDK/ManagedAimpCore.h | 2 +- src/SDK/aimp_dotnet/SDK/Menu/AimpMenuItem.cpp | 2 +- src/SDK/aimp_dotnet/SDK/Menu/AimpMenuItem.h | 2 +- .../aimp_dotnet/SDK/Menu/AimpServiceMenuManager.cpp | 2 +- src/SDK/aimp_dotnet/SDK/Menu/AimpServiceMenuManager.h | 2 +- .../AimpServiceMessageDispatcher.cpp | 2 +- .../MessageDispatcher/AimpServiceMessageDispatcher.h | 2 +- .../SDK/MessageDispatcher/InternalAimpMessageHook.cpp | 2 +- .../SDK/MessageDispatcher/InternalAimpMessageHook.h | 2 +- .../aimp_dotnet/SDK/MusicLibrary/AimpDataStorage2.h | 2 +- .../SDK/MusicLibrary/AimpDataStorageManager.cpp | 2 +- .../SDK/MusicLibrary/AimpDataStorageManager.h | 2 +- src/SDK/aimp_dotnet/SDK/MusicLibrary/AimpFileList.cpp | 2 +- src/SDK/aimp_dotnet/SDK/MusicLibrary/AimpFileList.h | 2 +- .../SDK/MusicLibrary/AimpGroupingTreeSelection.cpp | 2 +- .../SDK/MusicLibrary/AimpGroupingTreeSelection.h | 2 +- .../SDK/MusicLibrary/AimpLocalDataStorage.cpp | 2 +- .../SDK/MusicLibrary/AimpLocalDataStorage.h | 2 +- .../SDK/MusicLibrary/AimpServiceMusicLibrary.cpp | 2 +- .../SDK/MusicLibrary/AimpServiceMusicLibrary.h | 2 +- .../SDK/MusicLibrary/AimpServiceMusicLibraryUI.cpp | 2 +- .../SDK/MusicLibrary/AimpServiceMusicLibraryUI.h | 2 +- .../MusicLibrary/DataFilter/AimpDataFieldFilter.cpp | 2 +- .../SDK/MusicLibrary/DataFilter/AimpDataFieldFilter.h | 2 +- .../DataFilter/AimpDataFieldFilterByArray.cpp | 2 +- .../DataFilter/AimpDataFieldFilterByArray.h | 2 +- .../SDK/MusicLibrary/DataFilter/AimpDataFilter.cpp | 2 +- .../SDK/MusicLibrary/DataFilter/AimpDataFilter.h | 2 +- .../MusicLibrary/DataFilter/AimpDataFilterGroup.cpp | 2 +- .../SDK/MusicLibrary/DataFilter/AimpDataFilterGroup.h | 2 +- .../DataFilter/InternalAimpDataFieldFilterByArray.h | 2 +- .../SDK/MusicLibrary/DataStorage/AimpDataField.cpp | 2 +- .../SDK/MusicLibrary/DataStorage/AimpDataField.h | 2 +- .../SDK/MusicLibrary/DataStorage/AimpDataStorage.cpp | 2 +- .../SDK/MusicLibrary/DataStorage/AimpDataStorage.h | 2 +- .../SDK/MusicLibrary/DataStorage/AimpDataStorage2.h | 2 +- .../MusicLibrary/DataStorage/BaseAimpDataStorage.h | 2 +- .../Extension/AimpExtensionDataStorage.cpp | 2 +- .../MusicLibrary/Extension/AimpExtensionDataStorage.h | 2 +- .../Command/AimpDataStorageCommandAddFiles.cpp | 2 +- .../Command/AimpDataStorageCommandAddFiles.h | 2 +- .../Command/AimpDataStorageCommandAddFilesDialog.cpp | 2 +- .../Command/AimpDataStorageCommandAddFilesDialog.h | 2 +- .../Command/AimpDataStorageCommandDeleteFiles.cpp | 2 +- .../Command/AimpDataStorageCommandDeleteFiles.h | 2 +- .../Command/AimpDataStorageCommandDeleteFiles2.cpp | 2 +- .../Command/AimpDataStorageCommandDeleteFiles2.h | 2 +- .../Command/AimpDataStorageCommandDropData.cpp | 2 +- .../Command/AimpDataStorageCommandDropData.h | 2 +- .../Command/AimpDataStorageCommandFindInLibrary.cpp | 2 +- .../Command/AimpDataStorageCommandFindInLibrary.h | 2 +- .../Command/AimpDataStorageCommandReloadTags.cpp | 2 +- .../Command/AimpDataStorageCommandReloadTags.h | 2 +- .../Command/AimpDataStorageCommandReportDialog.cpp | 2 +- .../Command/AimpDataStorageCommandReportDialog.h | 2 +- .../Command/AimpDataStorageCommandUserMark.cpp | 2 +- .../Command/AimpDataStorageCommandUserMark.h | 2 +- .../Extension/InternalAimpAlbumArtProvider.cpp | 11 ++++++++++- .../Extension/InternalAimpAlbumArtProvider.h | 11 ++++++++++- .../Extension/InternalAimpAlbumArtProvider2.cpp | 2 +- .../Extension/InternalAimpAlbumArtProvider2.h | 2 +- .../SDK/MusicLibrary/InternalAimpDataFilter.cpp | 2 +- .../SDK/MusicLibrary/InternalAimpDataFilter.h | 2 +- .../SDK/MusicLibrary/InternalAimpDataFilterGroup.cpp | 2 +- .../SDK/MusicLibrary/InternalAimpDataFilterGroup.h | 2 +- .../InternalAimpDataProviderSelection.cpp | 2 +- .../MusicLibrary/InternalAimpDataProviderSelection.h | 2 +- .../InternalAimpGroupingTreeDataProvider.cpp | 2 +- .../InternalAimpGroupingTreeDataProvider.h | 2 +- .../InternalAimpGroupingTreeDataProviderSelection.cpp | 2 +- .../InternalAimpGroupingTreeDataProviderSelection.h | 2 +- .../InternalAimpMusicLibraryPlaylistPreimage.cpp | 2 +- .../InternalAimpMusicLibraryPlaylistPreimage.h | 2 +- .../SDK/MusicLibrary/InternalDataFieldFilter.cpp | 2 +- .../SDK/MusicLibrary/InternalDataFieldFilter.h | 2 +- .../SDK/MusicLibrary/Presets/AimpGroupingPreset.cpp | 2 +- .../SDK/MusicLibrary/Presets/AimpGroupingPreset.h | 2 +- .../Presets/AimpGroupingPresetStandard.cpp | 2 +- .../MusicLibrary/Presets/AimpGroupingPresetStandard.h | 2 +- .../SDK/MusicLibrary/Presets/AimpGroupingPresets.cpp | 2 +- .../SDK/MusicLibrary/Presets/AimpGroupingPresets.h | 2 +- src/SDK/aimp_dotnet/SDK/Objects/AimpFileStream.cpp | 2 +- src/SDK/aimp_dotnet/SDK/Objects/AimpFileStream.h | 2 +- src/SDK/aimp_dotnet/SDK/Objects/AimpImage.cpp | 2 +- src/SDK/aimp_dotnet/SDK/Objects/AimpImage.h | 2 +- .../aimp_dotnet/SDK/Objects/AimpImageContainer.cpp | 2 +- src/SDK/aimp_dotnet/SDK/Objects/AimpImageContainer.h | 2 +- src/SDK/aimp_dotnet/SDK/Objects/AimpMemoryStream.cpp | 2 +- src/SDK/aimp_dotnet/SDK/Objects/AimpMemoryStream.h | 2 +- src/SDK/aimp_dotnet/SDK/Objects/AimpStream.cpp | 2 +- src/SDK/aimp_dotnet/SDK/Objects/AimpStream.h | 2 +- src/SDK/aimp_dotnet/SDK/Objects/AimpString.cpp | 2 +- src/SDK/aimp_dotnet/SDK/Objects/AimpString.h | 2 +- .../SDK/Objects/Collections/AimpOrderedObjectList.cpp | 2 +- .../SDK/Objects/Collections/AimpOrderedObjectList.h | 2 +- .../Objects/Collections/InternalOrderedListItem.cpp | 2 +- .../SDK/Objects/Collections/InternalOrderedListItem.h | 2 +- .../SDK/Objects/Collections/OrderedListItem.cpp | 2 +- .../SDK/Objects/Collections/OrderedListItem.h | 2 +- .../SDK/Options/AimpServiceOptionsDialog.cpp | 2 +- .../SDK/Options/AimpServiceOptionsDialog.h | 2 +- .../SDK/Options/OptionsDialogFrameExtension.cpp | 2 +- .../SDK/Options/OptionsDialogFrameExtension.h | 2 +- .../PlayList/AimpExtensionPlaylistManagerListener.cpp | 2 +- .../PlayList/AimpExtensionPlaylistManagerListener.h | 2 +- .../PlayList/AimpExtensionPlaylistPreimageFactory.cpp | 2 +- .../PlayList/AimpExtensionPlaylistPreimageFactory.h | 2 +- src/SDK/aimp_dotnet/SDK/PlayList/AimpPlayList.cpp | 2 +- src/SDK/aimp_dotnet/SDK/PlayList/AimpPlayList.h | 2 +- .../aimp_dotnet/SDK/PlayList/AimpPlayListGroup.cpp | 2 +- src/SDK/aimp_dotnet/SDK/PlayList/AimpPlayListGroup.h | 2 +- src/SDK/aimp_dotnet/SDK/PlayList/AimpPlayListItem.cpp | 2 +- src/SDK/aimp_dotnet/SDK/PlayList/AimpPlayListItem.h | 2 +- .../aimp_dotnet/SDK/PlayList/AimpPlayListQueue.cpp | 2 +- src/SDK/aimp_dotnet/SDK/PlayList/AimpPlayListQueue.h | 2 +- .../aimp_dotnet/SDK/PlayList/AimpPlaylistPreimage.cpp | 2 +- .../aimp_dotnet/SDK/PlayList/AimpPlaylistPreimage.h | 2 +- .../SDK/PlayList/AimpPlaylistPreimageFactory.cpp | 2 +- .../SDK/PlayList/AimpPlaylistPreimageFactory.h | 2 +- .../SDK/PlayList/AimpPlaylistPreimageFolders.cpp | 2 +- .../SDK/PlayList/AimpPlaylistPreimageFolders.h | 2 +- .../SDK/PlayList/AimpPlaylistPreimageListener.cpp | 2 +- .../SDK/PlayList/AimpPlaylistPreimageListener.h | 2 +- .../SDK/PlayList/AimpPlaylistQueueListener.cpp | 2 +- .../SDK/PlayList/AimpPlaylistQueueListener.h | 2 +- .../SDK/PlayList/AimpServicePlaylistManager.cpp | 2 +- .../SDK/PlayList/AimpServicePlaylistManager.h | 2 +- .../SDK/PlayList/IPlayListQueueEventExecutor.h | 2 +- .../InternalAimpExtensionPlaylistPreimageFactory.cpp | 2 +- .../InternalAimpExtensionPlaylistPreimageFactory.h | 2 +- .../Internal/InternalAimpMLPlaylistPreimage.cpp | 2 +- .../Internal/InternalAimpMLPlaylistPreimage.h | 2 +- .../Internal/InternalAimpPlaylistPreimage.cpp | 2 +- .../PlayList/Internal/InternalAimpPlaylistPreimage.h | 2 +- .../SDK/Playback/AimpExtensionPlayerHook.cpp | 2 +- .../SDK/Playback/AimpExtensionPlayerHook.h | 2 +- .../SDK/Playback/AimpPlaybackQueueItem.cpp | 2 +- .../aimp_dotnet/SDK/Playback/AimpPlaybackQueueItem.h | 2 +- .../SDK/Playback/AimpServicePlaybackQueue.cpp | 2 +- .../SDK/Playback/AimpServicePlaybackQueue.h | 2 +- src/SDK/aimp_dotnet/SDK/Player/AimpEqualizerBands.cpp | 2 +- src/SDK/aimp_dotnet/SDK/Player/AimpEqualizerBands.h | 2 +- .../aimp_dotnet/SDK/Player/AimpEqualizerPreset.cpp | 2 +- src/SDK/aimp_dotnet/SDK/Player/AimpEqualizerPreset.h | 2 +- src/SDK/aimp_dotnet/SDK/Player/AimpServicePlayer.cpp | 2 +- src/SDK/aimp_dotnet/SDK/Player/AimpServicePlayer.h | 2 +- .../SDK/Player/AimpServicePlayerEqualizer.cpp | 2 +- .../SDK/Player/AimpServicePlayerEqualizer.h | 2 +- .../SDK/Player/AimpServicePlayerEqualizerPresets.cpp | 2 +- .../SDK/Player/AimpServicePlayerEqualizerPresets.h | 2 +- .../aimp_dotnet/SDK/Player/AimpServiceWaveform.cpp | 2 +- src/SDK/aimp_dotnet/SDK/Player/AimpServiceWaveform.h | 2 +- .../Player/Extensions/AimpExtensionPlaybackQueue.cpp | 2 +- .../Player/Extensions/AimpExtensionPlaybackQueue.h | 2 +- .../Player/Extensions/AimpExtensionPlaybackQueue2.cpp | 2 +- .../Player/Extensions/AimpExtensionPlaybackQueue2.h | 2 +- .../InternalAimpExtensionWaveFormProvider.cpp | 2 +- .../InternalAimpExtensionWaveFormProvider.h | 2 +- .../SDK/Player/Primitives/AimpWaveformPeakInfo.h | 2 +- src/SDK/aimp_dotnet/SDK/PropertyListHelper.cpp | 2 +- src/SDK/aimp_dotnet/SDK/PropertyListHelper.h | 2 +- src/SDK/aimp_dotnet/SDK/TagEditor/AimpFileTag.cpp | 2 +- src/SDK/aimp_dotnet/SDK/TagEditor/AimpFileTag.h | 2 +- .../aimp_dotnet/SDK/TagEditor/AimpFileTagEditor.cpp | 2 +- src/SDK/aimp_dotnet/SDK/TagEditor/AimpFileTagEditor.h | 2 +- .../SDK/TagEditor/AimpServiceFileTagEditor.cpp | 2 +- .../SDK/TagEditor/AimpServiceFileTagEditor.h | 2 +- .../SDK/TagEditor/InternalExtensionTagsProvider.cpp | 2 +- .../SDK/TagEditor/InternalExtensionTagsProvider.h | 2 +- .../SDK/Threading/AimpServiceSynchronizer.cpp | 2 +- .../SDK/Threading/AimpServiceSynchronizer.h | 2 +- .../SDK/Threading/AimpServiceThreadPool.cpp | 2 +- .../aimp_dotnet/SDK/Threading/AimpServiceThreadPool.h | 2 +- .../aimp_dotnet/SDK/Threading/AimpServiceThreads.cpp | 2 +- .../aimp_dotnet/SDK/Threading/AimpServiceThreads.h | 2 +- src/SDK/aimp_dotnet/SDK/Threading/AimpTaskOwner.cpp | 2 +- src/SDK/aimp_dotnet/SDK/Threading/AimpTaskOwner.h | 2 +- .../aimp_dotnet/SDK/Threading/InternalAimpTask.cpp | 2 +- src/SDK/aimp_dotnet/SDK/Threading/InternalAimpTask.h | 2 +- .../SDK/Visuals/AimpExtensionCustomVisualization.cpp | 2 +- .../SDK/Visuals/AimpExtensionCustomVisualization.h | 2 +- .../Visuals/AimpExtensionEmbeddedVisualization.cpp | 2 +- .../SDK/Visuals/AimpExtensionEmbeddedVisualization.h | 2 +- .../SDK/Visuals/AimpServiceVisualizations.cpp | 2 +- .../SDK/Visuals/AimpServiceVisualizations.h | 2 +- src/SDK/aimp_dotnet/SDK/Win32/Win32Manager.cpp | 2 +- src/SDK/aimp_dotnet/SDK/Win32/Win32Manager.h | 2 +- src/SDK/aimp_dotnet/Stdafx.cpp | 2 +- src/SDK/aimp_dotnet/Stdafx.h | 2 +- src/SDK/aimp_dotnet/Utils.h | 2 +- src/SDK/aimp_dotnet/resource.h | 2 +- src/Tests/IntegrationTests/AimpTestRunner.cs | 2 +- .../Engine/AimpNUnit3FrameworkDriver.cs | 2 +- .../Engine/AimpNUnitFrameworkDriver.cs | 2 +- src/Tests/IntegrationTests/Engine/ColorStyle.cs | 2 +- .../IntegrationTests/Engine/ConsoleTestResult.cs | 2 +- .../IntegrationTests/Engine/ExtendedTextWrapper.cs | 2 +- .../IntegrationTests/Engine/ExtendedTextWriter.cs | 2 +- src/Tests/IntegrationTests/Engine/ResultReporter.cs | 2 +- src/Tests/IntegrationTests/Engine/ResultSummary.cs | 2 +- .../IntegrationTests/Properties/PluginAssemblyInfo.cs | 2 +- .../TestFramework/AimpIntegrationTest.cs | 2 +- .../TestFramework/Assert/EqualAssert.cs | 2 +- .../TestFramework/Assert/FalseAssert.cs | 2 +- .../TestFramework/Assert/MemberAssert.cs | 2 +- .../TestFramework/Assert/NotEqualAssert.cs | 2 +- .../TestFramework/Assert/NotNullAssert.cs | 2 +- .../TestFramework/Assert/NullAssert.cs | 2 +- .../TestFramework/Assert/ThrowAssert.cs | 2 +- .../TestFramework/Assert/TrueAssert.cs | 2 +- .../TestFramework/IntegrationTestExtension.cs | 2 +- .../ActionManager/AimpServiceActionManagerTests.cs | 2 +- src/Tests/IntegrationTests/UnitTests/AimpCoreTests.cs | 2 +- .../IntegrationTests/UnitTests/AimpErrorInfoTests.cs | 2 +- .../AimpServiceConfig/AimpServiceConfigTests.cs | 2 +- .../IntegrationTests/UnitTests/AimpTestContext.cs | 2 +- .../AlbumArtManager/AimpServiceAlbumArtCacheTests.cs | 2 +- .../AlbumArtManager/AimpServiceAlbumArtTests.cs | 2 +- .../Extension/AimpExtensionAlbumArtProviderTests.cs | 2 +- .../UnitTests/Core/AimpServiceVersionInfoTests.cs | 2 +- .../UnitTests/FileManager/AimpFileInfoUnitTests.cs | 2 +- .../FileManager/AimpServiceFileStreamingUnitTests.cs | 2 +- .../Extensions/AimpExtensionFileExpanderUnitTests.cs | 2 +- .../Extensions/AimpExtensionFileFormatUnitTests.cs | 2 +- .../FileManager/IAimpServiceFileURI2UnitTests.cs | 2 +- .../FileManager/IAimpServiceFileURIUnitTests.cs | 2 +- .../UnitTests/Lyrics/AimpLyricsTests.cs | 2 +- .../UnitTests/Lyrics/AimpServiceLyricsTests.cs | 2 +- .../UnitTests/MenuManager/AimpMenuItemTests.cs | 2 +- .../MenuManager/AimpServiceMenuManagerTests.cs | 2 +- .../AimpServiceMessageDispatcherTests.cs | 2 +- .../MusicLibrary/AimpServiceMusicLibraryTests.cs | 2 +- .../UnitTests/Objects/AimpFileStreamUnitTests.cs | 2 +- .../UnitTests/Objects/AimpImageUnitTests.cs | 2 +- .../UnitTests/Objects/AimpOrderedListTests.cs | 2 +- .../UnitTests/Objects/AimpStreamUnitTests.cs | 2 +- .../UnitTests/Objects/AimpStringUnitTests.cs | 2 +- .../Playback/AimpPlaybackQueueServiceTests.cs | 2 +- .../UnitTests/Playback/PlayerHookTests.cs | 2 +- .../UnitTests/Player/AimpEqualizerPresetTests.cs | 2 +- .../Player/AimpExtensionPlaybackQueue2Tests.cs | 2 +- .../Player/AimpExtensionPlaybackQueueTests.cs | 2 +- .../Player/AimpExtensionWaveFormProviderTests.cs | 2 +- .../UnitTests/Player/AimpPlayerTests.cs | 2 +- .../Player/AimpServicePlayerEqualizerPresetsTests.cs | 2 +- .../Player/AimpServicePlayerEqualizerTests.cs | 2 +- .../UnitTests/Player/AimpServicePlayerTests.cs | 2 +- .../UnitTests/Playlist/AimpPlaylistManagerTests.cs | 2 +- .../UnitTests/Playlist/AimpPlaylistQueueTests.cs | 2 +- .../UnitTests/Playlist/AimpPlaylistTests.cs | 2 +- .../TagEditor/AimpServiceFileTagEditorTests.cs | 2 +- .../UnitTests/Threading/AimpServiceThreadsTests.cs | 2 +- 616 files changed, 643 insertions(+), 616 deletions(-) diff --git a/build/ApiProject.cs b/build/ApiProject.cs index fb1f217f..2f7c4d54 100644 --- a/build/ApiProject.cs +++ b/build/ApiProject.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/build/Build.Analyze.cs b/build/Build.Analyze.cs index 97a11beb..a8d63530 100644 --- a/build/Build.Analyze.cs +++ b/build/Build.Analyze.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/build/Build.Documentation.cs b/build/Build.Documentation.cs index 91487436..70882e49 100644 --- a/build/Build.Documentation.cs +++ b/build/Build.Documentation.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/build/Build.IntegrationTest.cs b/build/Build.IntegrationTest.cs index 450612fc..ff946fc3 100644 --- a/build/Build.IntegrationTest.cs +++ b/build/Build.IntegrationTest.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/build/Build.cs b/build/Build.cs index 1645aec1..fd1ca985 100644 --- a/build/Build.cs +++ b/build/Build.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/build/Configuration.cs b/build/Configuration.cs index 2a9faba6..9435fb83 100644 --- a/build/Configuration.cs +++ b/build/Configuration.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/build/DocFX/CustomDocFx.cs b/build/DocFX/CustomDocFx.cs index 4a106693..2f54831c 100644 --- a/build/DocFX/CustomDocFx.cs +++ b/build/DocFX/CustomDocFx.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/build/DocFX/CustomTocWriter.cs b/build/DocFX/CustomTocWriter.cs index c07430ef..ec0eefa0 100644 --- a/build/DocFX/CustomTocWriter.cs +++ b/build/DocFX/CustomTocWriter.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/build/GhprSettings.cs b/build/GhprSettings.cs index 56395bcb..a9bf0b11 100644 --- a/build/GhprSettings.cs +++ b/build/GhprSettings.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/build/SonarQube/SonarBeginSettings.cs b/build/SonarQube/SonarBeginSettings.cs index 82a0be4f..d59e0dbd 100644 --- a/build/SonarQube/SonarBeginSettings.cs +++ b/build/SonarQube/SonarBeginSettings.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/build/SonarQube/SonarQubeBeginSettingsExtensions.cs b/build/SonarQube/SonarQubeBeginSettingsExtensions.cs index 756b02ad..521e2368 100644 --- a/build/SonarQube/SonarQubeBeginSettingsExtensions.cs +++ b/build/SonarQube/SonarQubeBeginSettingsExtensions.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/AssemblyInfo.cs b/src/AssemblyInfo.cs index 77bccfd7..649c85d3 100644 --- a/src/AssemblyInfo.cs +++ b/src/AssemblyInfo.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/Plugins/dotnet_CustomFileSystem/CustomFileSystem.cs b/src/Plugins/dotnet_CustomFileSystem/CustomFileSystem.cs index aa67c325..cb77f9a1 100644 --- a/src/Plugins/dotnet_CustomFileSystem/CustomFileSystem.cs +++ b/src/Plugins/dotnet_CustomFileSystem/CustomFileSystem.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/Plugins/dotnet_CustomFileSystem/Plugin.cs b/src/Plugins/dotnet_CustomFileSystem/Plugin.cs index bbc86149..2d3e9c94 100644 --- a/src/Plugins/dotnet_CustomFileSystem/Plugin.cs +++ b/src/Plugins/dotnet_CustomFileSystem/Plugin.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/Plugins/dotnet_CustomFileSystem/Properties/PluginAssemblyInfo.cs b/src/Plugins/dotnet_CustomFileSystem/Properties/PluginAssemblyInfo.cs index 66889a38..b2ac84d5 100644 --- a/src/Plugins/dotnet_CustomFileSystem/Properties/PluginAssemblyInfo.cs +++ b/src/Plugins/dotnet_CustomFileSystem/Properties/PluginAssemblyInfo.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/Plugins/dotnet_ExtendDialogWindow/OptionsFrame.cs b/src/Plugins/dotnet_ExtendDialogWindow/OptionsFrame.cs index f344df9c..1d1ff352 100644 --- a/src/Plugins/dotnet_ExtendDialogWindow/OptionsFrame.cs +++ b/src/Plugins/dotnet_ExtendDialogWindow/OptionsFrame.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/Plugins/dotnet_ExtendDialogWindow/Plugin.cs b/src/Plugins/dotnet_ExtendDialogWindow/Plugin.cs index bd6a1e93..1b15463d 100644 --- a/src/Plugins/dotnet_ExtendDialogWindow/Plugin.cs +++ b/src/Plugins/dotnet_ExtendDialogWindow/Plugin.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/Plugins/dotnet_ExtendDialogWindow/Properties/PluginAssemblyInfo.cs b/src/Plugins/dotnet_ExtendDialogWindow/Properties/PluginAssemblyInfo.cs index d384ecfb..6b9a1df1 100644 --- a/src/Plugins/dotnet_ExtendDialogWindow/Properties/PluginAssemblyInfo.cs +++ b/src/Plugins/dotnet_ExtendDialogWindow/Properties/PluginAssemblyInfo.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/Plugins/dotnet_ExtendDialogWindow/SettingsForm.cs b/src/Plugins/dotnet_ExtendDialogWindow/SettingsForm.cs index 3cff7210..978bc390 100644 --- a/src/Plugins/dotnet_ExtendDialogWindow/SettingsForm.cs +++ b/src/Plugins/dotnet_ExtendDialogWindow/SettingsForm.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/Plugins/dotnet_SmartPlaylist/FrmTestPreimage.cs b/src/Plugins/dotnet_SmartPlaylist/FrmTestPreimage.cs index 751fe360..a0eab752 100644 --- a/src/Plugins/dotnet_SmartPlaylist/FrmTestPreimage.cs +++ b/src/Plugins/dotnet_SmartPlaylist/FrmTestPreimage.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/Plugins/dotnet_SmartPlaylist/Plugin.cs b/src/Plugins/dotnet_SmartPlaylist/Plugin.cs index f6acf0d1..0919ca85 100644 --- a/src/Plugins/dotnet_SmartPlaylist/Plugin.cs +++ b/src/Plugins/dotnet_SmartPlaylist/Plugin.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/Plugins/dotnet_SmartPlaylist/Properties/PluginAssemblyInfo.cs b/src/Plugins/dotnet_SmartPlaylist/Properties/PluginAssemblyInfo.cs index 006dd3be..4032ba83 100644 --- a/src/Plugins/dotnet_SmartPlaylist/Properties/PluginAssemblyInfo.cs +++ b/src/Plugins/dotnet_SmartPlaylist/Properties/PluginAssemblyInfo.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/Plugins/dotnet_SmartPlaylist/TestPreimage.cs b/src/Plugins/dotnet_SmartPlaylist/TestPreimage.cs index bc80f943..895f4c91 100644 --- a/src/Plugins/dotnet_SmartPlaylist/TestPreimage.cs +++ b/src/Plugins/dotnet_SmartPlaylist/TestPreimage.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/Plugins/dotnet_SmartPlaylist/TestPreimageFactory.cs b/src/Plugins/dotnet_SmartPlaylist/TestPreimageFactory.cs index 0e842cdd..29cf1ca9 100644 --- a/src/Plugins/dotnet_SmartPlaylist/TestPreimageFactory.cs +++ b/src/Plugins/dotnet_SmartPlaylist/TestPreimageFactory.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/Plugins/dotnet_albumart/AimpExtensionAlbumArtCatalog.cs b/src/Plugins/dotnet_albumart/AimpExtensionAlbumArtCatalog.cs index dd8c964b..4348373a 100644 --- a/src/Plugins/dotnet_albumart/AimpExtensionAlbumArtCatalog.cs +++ b/src/Plugins/dotnet_albumart/AimpExtensionAlbumArtCatalog.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/Plugins/dotnet_albumart/AimpExtensionAlbumArtProvider.cs b/src/Plugins/dotnet_albumart/AimpExtensionAlbumArtProvider.cs index 232fbd34..8eeb692d 100644 --- a/src/Plugins/dotnet_albumart/AimpExtensionAlbumArtProvider.cs +++ b/src/Plugins/dotnet_albumart/AimpExtensionAlbumArtProvider.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/Plugins/dotnet_albumart/Plugin.cs b/src/Plugins/dotnet_albumart/Plugin.cs index 4aaf0c51..a682c9fa 100644 --- a/src/Plugins/dotnet_albumart/Plugin.cs +++ b/src/Plugins/dotnet_albumart/Plugin.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/Plugins/dotnet_albumart/Properties/PluginAssemblyInfo.cs b/src/Plugins/dotnet_albumart/Properties/PluginAssemblyInfo.cs index d59f389d..e377cc0d 100644 --- a/src/Plugins/dotnet_albumart/Properties/PluginAssemblyInfo.cs +++ b/src/Plugins/dotnet_albumart/Properties/PluginAssemblyInfo.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/Plugins/dotnet_demo/Logger.cs b/src/Plugins/dotnet_demo/Logger.cs index b483e736..75d4d09a 100644 --- a/src/Plugins/dotnet_demo/Logger.cs +++ b/src/Plugins/dotnet_demo/Logger.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/Plugins/dotnet_demo/LoggerForm.cs b/src/Plugins/dotnet_demo/LoggerForm.cs index 5ac0ebc6..8b371600 100644 --- a/src/Plugins/dotnet_demo/LoggerForm.cs +++ b/src/Plugins/dotnet_demo/LoggerForm.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/Plugins/dotnet_demo/OptionsFrame/AimpOptionsDialogFrame.cs b/src/Plugins/dotnet_demo/OptionsFrame/AimpOptionsDialogFrame.cs index 4bcfe82e..9820e3aa 100644 --- a/src/Plugins/dotnet_demo/OptionsFrame/AimpOptionsDialogFrame.cs +++ b/src/Plugins/dotnet_demo/OptionsFrame/AimpOptionsDialogFrame.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/Plugins/dotnet_demo/OptionsFrame/SettingsForm.cs b/src/Plugins/dotnet_demo/OptionsFrame/SettingsForm.cs index 677e5b7d..eb97c5da 100644 --- a/src/Plugins/dotnet_demo/OptionsFrame/SettingsForm.cs +++ b/src/Plugins/dotnet_demo/OptionsFrame/SettingsForm.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/Plugins/dotnet_demo/PlayListControl.cs b/src/Plugins/dotnet_demo/PlayListControl.cs index 77019b1b..fa89e4fb 100644 --- a/src/Plugins/dotnet_demo/PlayListControl.cs +++ b/src/Plugins/dotnet_demo/PlayListControl.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/Plugins/dotnet_demo/PlayerForm.cs b/src/Plugins/dotnet_demo/PlayerForm.cs index 73e06c72..e004d6e6 100644 --- a/src/Plugins/dotnet_demo/PlayerForm.cs +++ b/src/Plugins/dotnet_demo/PlayerForm.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/Plugins/dotnet_demo/Plugin.cs b/src/Plugins/dotnet_demo/Plugin.cs index 1f2e72b4..b92295b9 100644 --- a/src/Plugins/dotnet_demo/Plugin.cs +++ b/src/Plugins/dotnet_demo/Plugin.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/Plugins/dotnet_demo/Properties/PluginAssemblyInfo.cs b/src/Plugins/dotnet_demo/Properties/PluginAssemblyInfo.cs index da41bec4..cb4e5144 100644 --- a/src/Plugins/dotnet_demo/Properties/PluginAssemblyInfo.cs +++ b/src/Plugins/dotnet_demo/Properties/PluginAssemblyInfo.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/Plugins/dotnet_demo/TagEditControl.cs b/src/Plugins/dotnet_demo/TagEditControl.cs index c48600fb..1df98ffc 100644 --- a/src/Plugins/dotnet_demo/TagEditControl.cs +++ b/src/Plugins/dotnet_demo/TagEditControl.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/Plugins/dotnet_demo/TagEditorForm.cs b/src/Plugins/dotnet_demo/TagEditorForm.cs index a4c45670..e9a3926e 100644 --- a/src/Plugins/dotnet_demo/TagEditorForm.cs +++ b/src/Plugins/dotnet_demo/TagEditorForm.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/Plugins/dotnet_demo/UI/PlayListEditor.cs b/src/Plugins/dotnet_demo/UI/PlayListEditor.cs index 315ab32a..704832ba 100644 --- a/src/Plugins/dotnet_demo/UI/PlayListEditor.cs +++ b/src/Plugins/dotnet_demo/UI/PlayListEditor.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/Plugins/dotnet_demo/Utils.cs b/src/Plugins/dotnet_demo/Utils.cs index a8a89c06..12ae854f 100644 --- a/src/Plugins/dotnet_demo/Utils.cs +++ b/src/Plugins/dotnet_demo/Utils.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/Plugins/dotnet_musiclibrary/AimpExtensionFileInfoProvider.cs b/src/Plugins/dotnet_musiclibrary/AimpExtensionFileInfoProvider.cs index 5c183173..dcde75f0 100644 --- a/src/Plugins/dotnet_musiclibrary/AimpExtensionFileInfoProvider.cs +++ b/src/Plugins/dotnet_musiclibrary/AimpExtensionFileInfoProvider.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/Plugins/dotnet_musiclibrary/DemoExtensionFileSystem.cs b/src/Plugins/dotnet_musiclibrary/DemoExtensionFileSystem.cs index 50cefa2f..68f76f94 100644 --- a/src/Plugins/dotnet_musiclibrary/DemoExtensionFileSystem.cs +++ b/src/Plugins/dotnet_musiclibrary/DemoExtensionFileSystem.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/Plugins/dotnet_musiclibrary/DemoMusicLibrary.cs b/src/Plugins/dotnet_musiclibrary/DemoMusicLibrary.cs index ffa16126..8c061a7c 100644 --- a/src/Plugins/dotnet_musiclibrary/DemoMusicLibrary.cs +++ b/src/Plugins/dotnet_musiclibrary/DemoMusicLibrary.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/Plugins/dotnet_musiclibrary/ExplorerGroupingProvider/DataProviderGroupingTree.cs b/src/Plugins/dotnet_musiclibrary/ExplorerGroupingProvider/DataProviderGroupingTree.cs index 6555f7a5..c93b3a7e 100644 --- a/src/Plugins/dotnet_musiclibrary/ExplorerGroupingProvider/DataProviderGroupingTree.cs +++ b/src/Plugins/dotnet_musiclibrary/ExplorerGroupingProvider/DataProviderGroupingTree.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/Plugins/dotnet_musiclibrary/ExplorerGroupingProvider/DataProviderGroupingTreeData.cs b/src/Plugins/dotnet_musiclibrary/ExplorerGroupingProvider/DataProviderGroupingTreeData.cs index afff5283..fa5a946e 100644 --- a/src/Plugins/dotnet_musiclibrary/ExplorerGroupingProvider/DataProviderGroupingTreeData.cs +++ b/src/Plugins/dotnet_musiclibrary/ExplorerGroupingProvider/DataProviderGroupingTreeData.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/Plugins/dotnet_musiclibrary/ExplorerGroupingProvider/DataProviderGroupingTreeSelection.cs b/src/Plugins/dotnet_musiclibrary/ExplorerGroupingProvider/DataProviderGroupingTreeSelection.cs index 48ba5bd3..71de027b 100644 --- a/src/Plugins/dotnet_musiclibrary/ExplorerGroupingProvider/DataProviderGroupingTreeSelection.cs +++ b/src/Plugins/dotnet_musiclibrary/ExplorerGroupingProvider/DataProviderGroupingTreeSelection.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/Plugins/dotnet_musiclibrary/ExplorerGroupingProvider/RootDataProviderSelection.cs b/src/Plugins/dotnet_musiclibrary/ExplorerGroupingProvider/RootDataProviderSelection.cs index c07d5068..96553120 100644 --- a/src/Plugins/dotnet_musiclibrary/ExplorerGroupingProvider/RootDataProviderSelection.cs +++ b/src/Plugins/dotnet_musiclibrary/ExplorerGroupingProvider/RootDataProviderSelection.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/Plugins/dotnet_musiclibrary/ExplorerMusicProvider/CustomAimpGroupingTreeDataProvider.cs b/src/Plugins/dotnet_musiclibrary/ExplorerMusicProvider/CustomAimpGroupingTreeDataProvider.cs index ecf02e42..93d2a520 100644 --- a/src/Plugins/dotnet_musiclibrary/ExplorerMusicProvider/CustomAimpGroupingTreeDataProvider.cs +++ b/src/Plugins/dotnet_musiclibrary/ExplorerMusicProvider/CustomAimpGroupingTreeDataProvider.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/Plugins/dotnet_musiclibrary/ExplorerMusicProvider/CustomAimpGroupingTreeDataProviderSelection.cs b/src/Plugins/dotnet_musiclibrary/ExplorerMusicProvider/CustomAimpGroupingTreeDataProviderSelection.cs index d861b6d2..e91e4220 100644 --- a/src/Plugins/dotnet_musiclibrary/ExplorerMusicProvider/CustomAimpGroupingTreeDataProviderSelection.cs +++ b/src/Plugins/dotnet_musiclibrary/ExplorerMusicProvider/CustomAimpGroupingTreeDataProviderSelection.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/Plugins/dotnet_musiclibrary/ExplorerMusicProvider/TDemoExplorerViewAbstractDataProviderSelection.cs b/src/Plugins/dotnet_musiclibrary/ExplorerMusicProvider/TDemoExplorerViewAbstractDataProviderSelection.cs index a2ec7f7b..1ed17f39 100644 --- a/src/Plugins/dotnet_musiclibrary/ExplorerMusicProvider/TDemoExplorerViewAbstractDataProviderSelection.cs +++ b/src/Plugins/dotnet_musiclibrary/ExplorerMusicProvider/TDemoExplorerViewAbstractDataProviderSelection.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/Plugins/dotnet_musiclibrary/MyExtensionFileInfoProvider.cs b/src/Plugins/dotnet_musiclibrary/MyExtensionFileInfoProvider.cs index 3332c334..06eb407d 100644 --- a/src/Plugins/dotnet_musiclibrary/MyExtensionFileInfoProvider.cs +++ b/src/Plugins/dotnet_musiclibrary/MyExtensionFileInfoProvider.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/Plugins/dotnet_musiclibrary/Plugin.cs b/src/Plugins/dotnet_musiclibrary/Plugin.cs index a5f7555a..a1fe76c9 100644 --- a/src/Plugins/dotnet_musiclibrary/Plugin.cs +++ b/src/Plugins/dotnet_musiclibrary/Plugin.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/Plugins/dotnet_musiclibrary/Preimage/MediaLibraryPreimageFactory.cs b/src/Plugins/dotnet_musiclibrary/Preimage/MediaLibraryPreimageFactory.cs index 9f426787..580dc4cc 100644 --- a/src/Plugins/dotnet_musiclibrary/Preimage/MediaLibraryPreimageFactory.cs +++ b/src/Plugins/dotnet_musiclibrary/Preimage/MediaLibraryPreimageFactory.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/Plugins/dotnet_musiclibrary/Preimage/PlaylistManagerListener.cs b/src/Plugins/dotnet_musiclibrary/Preimage/PlaylistManagerListener.cs index 6f1b50ab..b2491271 100644 --- a/src/Plugins/dotnet_musiclibrary/Preimage/PlaylistManagerListener.cs +++ b/src/Plugins/dotnet_musiclibrary/Preimage/PlaylistManagerListener.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/Plugins/dotnet_musiclibrary/Preimage/TestMediaLibraryPreimage.cs b/src/Plugins/dotnet_musiclibrary/Preimage/TestMediaLibraryPreimage.cs index 8a6438b5..d7a2e91a 100644 --- a/src/Plugins/dotnet_musiclibrary/Preimage/TestMediaLibraryPreimage.cs +++ b/src/Plugins/dotnet_musiclibrary/Preimage/TestMediaLibraryPreimage.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/Plugins/dotnet_musiclibrary/Properties/PluginAssemblyInfo.cs b/src/Plugins/dotnet_musiclibrary/Properties/PluginAssemblyInfo.cs index 861ed22e..3ccdba82 100644 --- a/src/Plugins/dotnet_musiclibrary/Properties/PluginAssemblyInfo.cs +++ b/src/Plugins/dotnet_musiclibrary/Properties/PluginAssemblyInfo.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/Plugins/dotnet_threading/Plugin.cs b/src/Plugins/dotnet_threading/Plugin.cs index 3956092f..b20ac428 100644 --- a/src/Plugins/dotnet_threading/Plugin.cs +++ b/src/Plugins/dotnet_threading/Plugin.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/Plugins/dotnet_threading/Properties/PluginAssemblyInfo.cs b/src/Plugins/dotnet_threading/Properties/PluginAssemblyInfo.cs index 0aa1f14c..f66086c7 100644 --- a/src/Plugins/dotnet_threading/Properties/PluginAssemblyInfo.cs +++ b/src/Plugins/dotnet_threading/Properties/PluginAssemblyInfo.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/Plugins/dotnet_threading/TestTask.cs b/src/Plugins/dotnet_threading/TestTask.cs index 8c04d099..56f3924b 100644 --- a/src/Plugins/dotnet_threading/TestTask.cs +++ b/src/Plugins/dotnet_threading/TestTask.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/Plugins/dotnet_visual/CustomVisualization.cs b/src/Plugins/dotnet_visual/CustomVisualization.cs index e1396b40..4690edc9 100644 --- a/src/Plugins/dotnet_visual/CustomVisualization.cs +++ b/src/Plugins/dotnet_visual/CustomVisualization.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/Plugins/dotnet_visual/EmbeddedVisualization.cs b/src/Plugins/dotnet_visual/EmbeddedVisualization.cs index b55ea35f..dff22615 100644 --- a/src/Plugins/dotnet_visual/EmbeddedVisualization.cs +++ b/src/Plugins/dotnet_visual/EmbeddedVisualization.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/Plugins/dotnet_visual/Plugin.cs b/src/Plugins/dotnet_visual/Plugin.cs index fc46600d..08c3b0f6 100644 --- a/src/Plugins/dotnet_visual/Plugin.cs +++ b/src/Plugins/dotnet_visual/Plugin.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/Plugins/dotnet_visual/Properties/PluginAssemblyInfo.cs b/src/Plugins/dotnet_visual/Properties/PluginAssemblyInfo.cs index ba2dfcb5..6c51155c 100644 --- a/src/Plugins/dotnet_visual/Properties/PluginAssemblyInfo.cs +++ b/src/Plugins/dotnet_visual/Properties/PluginAssemblyInfo.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/AIMP.SDK/AIMPPluginAttribute.cs b/src/SDK/AIMP.SDK/AIMPPluginAttribute.cs index d174ef92..ae513c86 100644 --- a/src/SDK/AIMP.SDK/AIMPPluginAttribute.cs +++ b/src/SDK/AIMP.SDK/AIMPPluginAttribute.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/AIMP.SDK/AimpInternalLogger.cs b/src/SDK/AIMP.SDK/AimpInternalLogger.cs index 035511b2..be93f79b 100644 --- a/src/SDK/AIMP.SDK/AimpInternalLogger.cs +++ b/src/SDK/AIMP.SDK/AimpInternalLogger.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/AIMP.SDK/AimpPlugin.cs b/src/SDK/AIMP.SDK/AimpPlugin.cs index 5874466f..2566aa2d 100644 --- a/src/SDK/AIMP.SDK/AimpPlugin.cs +++ b/src/SDK/AIMP.SDK/AimpPlugin.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/AIMP.SDK/Loader/AimpDotNetPlugin.cs b/src/SDK/AIMP.SDK/Loader/AimpDotNetPlugin.cs index c0d73a44..4da5ff9a 100644 --- a/src/SDK/AIMP.SDK/Loader/AimpDotNetPlugin.cs +++ b/src/SDK/AIMP.SDK/Loader/AimpDotNetPlugin.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/AIMP.SDK/Loader/AssemblyScanPluginLoadStrategy.cs b/src/SDK/AIMP.SDK/Loader/AssemblyScanPluginLoadStrategy.cs index 8c935b29..85857531 100644 --- a/src/SDK/AIMP.SDK/Loader/AssemblyScanPluginLoadStrategy.cs +++ b/src/SDK/AIMP.SDK/Loader/AssemblyScanPluginLoadStrategy.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/AIMP.SDK/Loader/CustomAssemblyResolver.cs b/src/SDK/AIMP.SDK/Loader/CustomAssemblyResolver.cs index d1f73807..3af1ac37 100644 --- a/src/SDK/AIMP.SDK/Loader/CustomAssemblyResolver.cs +++ b/src/SDK/AIMP.SDK/Loader/CustomAssemblyResolver.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/AIMP.SDK/Loader/DotNetPluginInfo.cs b/src/SDK/AIMP.SDK/Loader/DotNetPluginInfo.cs index 67dcac72..84a6dba6 100644 --- a/src/SDK/AIMP.SDK/Loader/DotNetPluginInfo.cs +++ b/src/SDK/AIMP.SDK/Loader/DotNetPluginInfo.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/AIMP.SDK/Loader/PluginInfoLoader.cs b/src/SDK/AIMP.SDK/Loader/PluginInfoLoader.cs index c7ead8cf..bcc17c02 100644 --- a/src/SDK/AIMP.SDK/Loader/PluginInfoLoader.cs +++ b/src/SDK/AIMP.SDK/Loader/PluginInfoLoader.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/AIMP.SDK/Loader/PluginInformation.cs b/src/SDK/AIMP.SDK/Loader/PluginInformation.cs index 57e7e0e6..9d01b8d8 100644 --- a/src/SDK/AIMP.SDK/Loader/PluginInformation.cs +++ b/src/SDK/AIMP.SDK/Loader/PluginInformation.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/AIMP.SDK/Loader/PluginLoadingStrategy.cs b/src/SDK/AIMP.SDK/Loader/PluginLoadingStrategy.cs index 71c3e792..c0e02a8a 100644 --- a/src/SDK/AIMP.SDK/Loader/PluginLoadingStrategy.cs +++ b/src/SDK/AIMP.SDK/Loader/PluginLoadingStrategy.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/AIMP.SDK/Loader/PluginShortInfoForLoad.cs b/src/SDK/AIMP.SDK/Loader/PluginShortInfoForLoad.cs index df459a17..d4f2e672 100644 --- a/src/SDK/AIMP.SDK/Loader/PluginShortInfoForLoad.cs +++ b/src/SDK/AIMP.SDK/Loader/PluginShortInfoForLoad.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/AIMP.SDK/Properties/Annotations.cs b/src/SDK/AIMP.SDK/Properties/Annotations.cs index 85550c90..74af24a9 100644 --- a/src/SDK/AIMP.SDK/Properties/Annotations.cs +++ b/src/SDK/AIMP.SDK/Properties/Annotations.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/AIMP.SDK/Properties/PluginAssemblyInfo.cs b/src/SDK/AIMP.SDK/Properties/PluginAssemblyInfo.cs index d591fd4e..731386b8 100644 --- a/src/SDK/AIMP.SDK/Properties/PluginAssemblyInfo.cs +++ b/src/SDK/AIMP.SDK/Properties/PluginAssemblyInfo.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/AIMP.SDK/SDK/Actions/IAimpServiceActionManager.cs b/src/SDK/AIMP.SDK/SDK/Actions/IAimpServiceActionManager.cs index 27696a21..b30b1cf1 100644 --- a/src/SDK/AIMP.SDK/SDK/Actions/IAimpServiceActionManager.cs +++ b/src/SDK/AIMP.SDK/SDK/Actions/IAimpServiceActionManager.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/AIMP.SDK/SDK/Actions/Objects/IAimpAction.cs b/src/SDK/AIMP.SDK/SDK/Actions/Objects/IAimpAction.cs index ef3899d8..6c4f1389 100644 --- a/src/SDK/AIMP.SDK/SDK/Actions/Objects/IAimpAction.cs +++ b/src/SDK/AIMP.SDK/SDK/Actions/Objects/IAimpAction.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/AIMP.SDK/SDK/Actions/Objects/IAimpActionEvent.cs b/src/SDK/AIMP.SDK/SDK/Actions/Objects/IAimpActionEvent.cs index 26271a48..490eb0ee 100644 --- a/src/SDK/AIMP.SDK/SDK/Actions/Objects/IAimpActionEvent.cs +++ b/src/SDK/AIMP.SDK/SDK/Actions/Objects/IAimpActionEvent.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/AIMP.SDK/SDK/AimpActionException.cs b/src/SDK/AIMP.SDK/SDK/AimpActionException.cs index a0fffe6d..cfa9893c 100644 --- a/src/SDK/AIMP.SDK/SDK/AimpActionException.cs +++ b/src/SDK/AIMP.SDK/SDK/AimpActionException.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/AIMP.SDK/SDK/AimpActionResult.cs b/src/SDK/AIMP.SDK/SDK/AimpActionResult.cs index c27c959b..23796b5f 100644 --- a/src/SDK/AIMP.SDK/SDK/AimpActionResult.cs +++ b/src/SDK/AIMP.SDK/SDK/AimpActionResult.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/AIMP.SDK/SDK/AimpObjectType.cs b/src/SDK/AIMP.SDK/SDK/AimpObjectType.cs index 7fde94ae..5af16051 100644 --- a/src/SDK/AIMP.SDK/SDK/AimpObjectType.cs +++ b/src/SDK/AIMP.SDK/SDK/AimpObjectType.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/AIMP.SDK/SDK/AlbumArt/AimpFindCovertArtType.cs b/src/SDK/AIMP.SDK/SDK/AlbumArt/AimpFindCovertArtType.cs index a7991641..19358c44 100644 --- a/src/SDK/AIMP.SDK/SDK/AlbumArt/AimpFindCovertArtType.cs +++ b/src/SDK/AIMP.SDK/SDK/AlbumArt/AimpFindCovertArtType.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/AIMP.SDK/SDK/AlbumArt/AimpGetAlbumArtEventArgs.cs b/src/SDK/AIMP.SDK/SDK/AlbumArt/AimpGetAlbumArtEventArgs.cs index 4b4d109b..44983124 100644 --- a/src/SDK/AIMP.SDK/SDK/AlbumArt/AimpGetAlbumArtEventArgs.cs +++ b/src/SDK/AIMP.SDK/SDK/AlbumArt/AimpGetAlbumArtEventArgs.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/AIMP.SDK/SDK/AlbumArt/Extensions/AimpAlbumArtProviderCategory.cs b/src/SDK/AIMP.SDK/SDK/AlbumArt/Extensions/AimpAlbumArtProviderCategory.cs index bdf9fa9f..14f09702 100644 --- a/src/SDK/AIMP.SDK/SDK/AlbumArt/Extensions/AimpAlbumArtProviderCategory.cs +++ b/src/SDK/AIMP.SDK/SDK/AlbumArt/Extensions/AimpAlbumArtProviderCategory.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/AIMP.SDK/SDK/AlbumArt/Extensions/IAimpExtensionAlbumArtCatalog.cs b/src/SDK/AIMP.SDK/SDK/AlbumArt/Extensions/IAimpExtensionAlbumArtCatalog.cs index f241ac9f..529ef81b 100644 --- a/src/SDK/AIMP.SDK/SDK/AlbumArt/Extensions/IAimpExtensionAlbumArtCatalog.cs +++ b/src/SDK/AIMP.SDK/SDK/AlbumArt/Extensions/IAimpExtensionAlbumArtCatalog.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/AIMP.SDK/SDK/AlbumArt/Extensions/IAimpExtensionAlbumArtCatalog2.cs b/src/SDK/AIMP.SDK/SDK/AlbumArt/Extensions/IAimpExtensionAlbumArtCatalog2.cs index 12b1d2cc..5955ae72 100644 --- a/src/SDK/AIMP.SDK/SDK/AlbumArt/Extensions/IAimpExtensionAlbumArtCatalog2.cs +++ b/src/SDK/AIMP.SDK/SDK/AlbumArt/Extensions/IAimpExtensionAlbumArtCatalog2.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/AIMP.SDK/SDK/AlbumArt/Extensions/IAimpExtensionAlbumArtProvider.cs b/src/SDK/AIMP.SDK/SDK/AlbumArt/Extensions/IAimpExtensionAlbumArtProvider.cs index bf204cf3..c951fde6 100644 --- a/src/SDK/AIMP.SDK/SDK/AlbumArt/Extensions/IAimpExtensionAlbumArtProvider.cs +++ b/src/SDK/AIMP.SDK/SDK/AlbumArt/Extensions/IAimpExtensionAlbumArtProvider.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/AIMP.SDK/SDK/AlbumArt/Extensions/IAimpExtensionAlbumArtProvider2.cs b/src/SDK/AIMP.SDK/SDK/AlbumArt/Extensions/IAimpExtensionAlbumArtProvider2.cs index 6e2a0fe8..cc759771 100644 --- a/src/SDK/AIMP.SDK/SDK/AlbumArt/Extensions/IAimpExtensionAlbumArtProvider2.cs +++ b/src/SDK/AIMP.SDK/SDK/AlbumArt/Extensions/IAimpExtensionAlbumArtProvider2.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/AIMP.SDK/SDK/AlbumArt/Extensions/IAimpExtensionAlbumArtProvider3.cs b/src/SDK/AIMP.SDK/SDK/AlbumArt/Extensions/IAimpExtensionAlbumArtProvider3.cs index 125be385..be9498b8 100644 --- a/src/SDK/AIMP.SDK/SDK/AlbumArt/Extensions/IAimpExtensionAlbumArtProvider3.cs +++ b/src/SDK/AIMP.SDK/SDK/AlbumArt/Extensions/IAimpExtensionAlbumArtProvider3.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/AIMP.SDK/SDK/AlbumArt/IAimpAlbumArtRequest.cs b/src/SDK/AIMP.SDK/SDK/AlbumArt/IAimpAlbumArtRequest.cs index 18a02a3d..67417e1e 100644 --- a/src/SDK/AIMP.SDK/SDK/AlbumArt/IAimpAlbumArtRequest.cs +++ b/src/SDK/AIMP.SDK/SDK/AlbumArt/IAimpAlbumArtRequest.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/AIMP.SDK/SDK/AlbumArt/IAimpAlbumArtSearchOptions.cs b/src/SDK/AIMP.SDK/SDK/AlbumArt/IAimpAlbumArtSearchOptions.cs index 099f2dca..d449538e 100644 --- a/src/SDK/AIMP.SDK/SDK/AlbumArt/IAimpAlbumArtSearchOptions.cs +++ b/src/SDK/AIMP.SDK/SDK/AlbumArt/IAimpAlbumArtSearchOptions.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/AIMP.SDK/SDK/AlbumArt/Services/IAimpServiceAlbumArt.cs b/src/SDK/AIMP.SDK/SDK/AlbumArt/Services/IAimpServiceAlbumArt.cs index 2b635ec6..3ebcd24a 100644 --- a/src/SDK/AIMP.SDK/SDK/AlbumArt/Services/IAimpServiceAlbumArt.cs +++ b/src/SDK/AIMP.SDK/SDK/AlbumArt/Services/IAimpServiceAlbumArt.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/AIMP.SDK/SDK/AlbumArt/Services/IAimpServiceAlbumArtCache.cs b/src/SDK/AIMP.SDK/SDK/AlbumArt/Services/IAimpServiceAlbumArtCache.cs index 2e9c621a..758220e6 100644 --- a/src/SDK/AIMP.SDK/SDK/AlbumArt/Services/IAimpServiceAlbumArtCache.cs +++ b/src/SDK/AIMP.SDK/SDK/AlbumArt/Services/IAimpServiceAlbumArtCache.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/AIMP.SDK/SDK/Configuration/IAimpServiceConfig.cs b/src/SDK/AIMP.SDK/SDK/Configuration/IAimpServiceConfig.cs index 69491008..2b244fa4 100644 --- a/src/SDK/AIMP.SDK/SDK/Configuration/IAimpServiceConfig.cs +++ b/src/SDK/AIMP.SDK/SDK/Configuration/IAimpServiceConfig.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/AIMP.SDK/SDK/Core/IAimpServiceShutdown.cs b/src/SDK/AIMP.SDK/SDK/Core/IAimpServiceShutdown.cs index f541076c..91a504c6 100644 --- a/src/SDK/AIMP.SDK/SDK/Core/IAimpServiceShutdown.cs +++ b/src/SDK/AIMP.SDK/SDK/Core/IAimpServiceShutdown.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/AIMP.SDK/SDK/Core/IAimpServiceVersionInfo.cs b/src/SDK/AIMP.SDK/SDK/Core/IAimpServiceVersionInfo.cs index 4c93193a..83567b78 100644 --- a/src/SDK/AIMP.SDK/SDK/Core/IAimpServiceVersionInfo.cs +++ b/src/SDK/AIMP.SDK/SDK/Core/IAimpServiceVersionInfo.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/AIMP.SDK/SDK/Enums.cs b/src/SDK/AIMP.SDK/SDK/Enums.cs index dd30d298..a1efe36f 100644 --- a/src/SDK/AIMP.SDK/SDK/Enums.cs +++ b/src/SDK/AIMP.SDK/SDK/Enums.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/AIMP.SDK/SDK/Extensions.cs b/src/SDK/AIMP.SDK/SDK/Extensions.cs index cc22236f..d8990d73 100644 --- a/src/SDK/AIMP.SDK/SDK/Extensions.cs +++ b/src/SDK/AIMP.SDK/SDK/Extensions.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/AIMP.SDK/SDK/FileManager/AimpFileAttributes.cs b/src/SDK/AIMP.SDK/SDK/FileManager/AimpFileAttributes.cs index 89747b0c..cbf6f909 100644 --- a/src/SDK/AIMP.SDK/SDK/FileManager/AimpFileAttributes.cs +++ b/src/SDK/AIMP.SDK/SDK/FileManager/AimpFileAttributes.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/AIMP.SDK/SDK/FileManager/Commands/IAimpFileSystemCommand.cs b/src/SDK/AIMP.SDK/SDK/FileManager/Commands/IAimpFileSystemCommand.cs index 04ad2d33..d3546f30 100644 --- a/src/SDK/AIMP.SDK/SDK/FileManager/Commands/IAimpFileSystemCommand.cs +++ b/src/SDK/AIMP.SDK/SDK/FileManager/Commands/IAimpFileSystemCommand.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/AIMP.SDK/SDK/FileManager/Commands/IAimpFileSystemCommandCopyToClipboard.cs b/src/SDK/AIMP.SDK/SDK/FileManager/Commands/IAimpFileSystemCommandCopyToClipboard.cs index 5d876bbd..a6e65df3 100644 --- a/src/SDK/AIMP.SDK/SDK/FileManager/Commands/IAimpFileSystemCommandCopyToClipboard.cs +++ b/src/SDK/AIMP.SDK/SDK/FileManager/Commands/IAimpFileSystemCommandCopyToClipboard.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/AIMP.SDK/SDK/FileManager/Commands/IAimpFileSystemCommandDelete.cs b/src/SDK/AIMP.SDK/SDK/FileManager/Commands/IAimpFileSystemCommandDelete.cs index db05d8da..34d6bbbb 100644 --- a/src/SDK/AIMP.SDK/SDK/FileManager/Commands/IAimpFileSystemCommandDelete.cs +++ b/src/SDK/AIMP.SDK/SDK/FileManager/Commands/IAimpFileSystemCommandDelete.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/AIMP.SDK/SDK/FileManager/Commands/IAimpFileSystemCommandDropSource.cs b/src/SDK/AIMP.SDK/SDK/FileManager/Commands/IAimpFileSystemCommandDropSource.cs index 8b95ee19..5519f67a 100644 --- a/src/SDK/AIMP.SDK/SDK/FileManager/Commands/IAimpFileSystemCommandDropSource.cs +++ b/src/SDK/AIMP.SDK/SDK/FileManager/Commands/IAimpFileSystemCommandDropSource.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/AIMP.SDK/SDK/FileManager/Commands/IAimpFileSystemCommandFileInfo.cs b/src/SDK/AIMP.SDK/SDK/FileManager/Commands/IAimpFileSystemCommandFileInfo.cs index 69527d6c..d18841d1 100644 --- a/src/SDK/AIMP.SDK/SDK/FileManager/Commands/IAimpFileSystemCommandFileInfo.cs +++ b/src/SDK/AIMP.SDK/SDK/FileManager/Commands/IAimpFileSystemCommandFileInfo.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/AIMP.SDK/SDK/FileManager/Commands/IAimpFileSystemCommandOpenFileFolder.cs b/src/SDK/AIMP.SDK/SDK/FileManager/Commands/IAimpFileSystemCommandOpenFileFolder.cs index 7c47684b..789adb8f 100644 --- a/src/SDK/AIMP.SDK/SDK/FileManager/Commands/IAimpFileSystemCommandOpenFileFolder.cs +++ b/src/SDK/AIMP.SDK/SDK/FileManager/Commands/IAimpFileSystemCommandOpenFileFolder.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/AIMP.SDK/SDK/FileManager/Commands/IAimpFileSystemCommandStreaming.cs b/src/SDK/AIMP.SDK/SDK/FileManager/Commands/IAimpFileSystemCommandStreaming.cs index 15a72db9..273d5c40 100644 --- a/src/SDK/AIMP.SDK/SDK/FileManager/Commands/IAimpFileSystemCommandStreaming.cs +++ b/src/SDK/AIMP.SDK/SDK/FileManager/Commands/IAimpFileSystemCommandStreaming.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/AIMP.SDK/SDK/FileManager/Commands/IAimpFileSystemCustomFileCommand.cs b/src/SDK/AIMP.SDK/SDK/FileManager/Commands/IAimpFileSystemCustomFileCommand.cs index 4383417c..86946b9e 100644 --- a/src/SDK/AIMP.SDK/SDK/FileManager/Commands/IAimpFileSystemCustomFileCommand.cs +++ b/src/SDK/AIMP.SDK/SDK/FileManager/Commands/IAimpFileSystemCustomFileCommand.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/AIMP.SDK/SDK/FileManager/Extensions/IAimpExtensionFileExpander.cs b/src/SDK/AIMP.SDK/SDK/FileManager/Extensions/IAimpExtensionFileExpander.cs index 508ea32c..6010f665 100644 --- a/src/SDK/AIMP.SDK/SDK/FileManager/Extensions/IAimpExtensionFileExpander.cs +++ b/src/SDK/AIMP.SDK/SDK/FileManager/Extensions/IAimpExtensionFileExpander.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/AIMP.SDK/SDK/FileManager/Extensions/IAimpExtensionFileFormat.cs b/src/SDK/AIMP.SDK/SDK/FileManager/Extensions/IAimpExtensionFileFormat.cs index b19ce9c8..c87eb445 100644 --- a/src/SDK/AIMP.SDK/SDK/FileManager/Extensions/IAimpExtensionFileFormat.cs +++ b/src/SDK/AIMP.SDK/SDK/FileManager/Extensions/IAimpExtensionFileFormat.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/AIMP.SDK/SDK/FileManager/Extensions/IAimpExtensionFileInfoProvider.cs b/src/SDK/AIMP.SDK/SDK/FileManager/Extensions/IAimpExtensionFileInfoProvider.cs index 52656a64..d46672ca 100644 --- a/src/SDK/AIMP.SDK/SDK/FileManager/Extensions/IAimpExtensionFileInfoProvider.cs +++ b/src/SDK/AIMP.SDK/SDK/FileManager/Extensions/IAimpExtensionFileInfoProvider.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/AIMP.SDK/SDK/FileManager/Extensions/IAimpExtensionFileSystem.cs b/src/SDK/AIMP.SDK/SDK/FileManager/Extensions/IAimpExtensionFileSystem.cs index f41f5c00..6c50f3f4 100644 --- a/src/SDK/AIMP.SDK/SDK/FileManager/Extensions/IAimpExtensionFileSystem.cs +++ b/src/SDK/AIMP.SDK/SDK/FileManager/Extensions/IAimpExtensionFileSystem.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/AIMP.SDK/SDK/FileManager/FileCommandType.cs b/src/SDK/AIMP.SDK/SDK/FileManager/FileCommandType.cs index 6598018c..f27b3c17 100644 --- a/src/SDK/AIMP.SDK/SDK/FileManager/FileCommandType.cs +++ b/src/SDK/AIMP.SDK/SDK/FileManager/FileCommandType.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/AIMP.SDK/SDK/FileManager/IAIMPServiceFileSystems.cs b/src/SDK/AIMP.SDK/SDK/FileManager/IAIMPServiceFileSystems.cs index fdf3ae6d..cc25e503 100644 --- a/src/SDK/AIMP.SDK/SDK/FileManager/IAIMPServiceFileSystems.cs +++ b/src/SDK/AIMP.SDK/SDK/FileManager/IAIMPServiceFileSystems.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/AIMP.SDK/SDK/FileManager/IAimpServiceFileFormats.cs b/src/SDK/AIMP.SDK/SDK/FileManager/IAimpServiceFileFormats.cs index 1f7d91ca..56cdc992 100644 --- a/src/SDK/AIMP.SDK/SDK/FileManager/IAimpServiceFileFormats.cs +++ b/src/SDK/AIMP.SDK/SDK/FileManager/IAimpServiceFileFormats.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/AIMP.SDK/SDK/FileManager/IAimpServiceFileInfo.cs b/src/SDK/AIMP.SDK/SDK/FileManager/IAimpServiceFileInfo.cs index caa9cd45..4ca04742 100644 --- a/src/SDK/AIMP.SDK/SDK/FileManager/IAimpServiceFileInfo.cs +++ b/src/SDK/AIMP.SDK/SDK/FileManager/IAimpServiceFileInfo.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/AIMP.SDK/SDK/FileManager/IAimpServiceFileInfoFormatter.cs b/src/SDK/AIMP.SDK/SDK/FileManager/IAimpServiceFileInfoFormatter.cs index 9e8b1c05..225af03f 100644 --- a/src/SDK/AIMP.SDK/SDK/FileManager/IAimpServiceFileInfoFormatter.cs +++ b/src/SDK/AIMP.SDK/SDK/FileManager/IAimpServiceFileInfoFormatter.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/AIMP.SDK/SDK/FileManager/IAimpServiceFileInfoFormatterUtils.cs b/src/SDK/AIMP.SDK/SDK/FileManager/IAimpServiceFileInfoFormatterUtils.cs index 5d782948..f3ca4355 100644 --- a/src/SDK/AIMP.SDK/SDK/FileManager/IAimpServiceFileInfoFormatterUtils.cs +++ b/src/SDK/AIMP.SDK/SDK/FileManager/IAimpServiceFileInfoFormatterUtils.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/AIMP.SDK/SDK/FileManager/IAimpServiceFileManager.cs b/src/SDK/AIMP.SDK/SDK/FileManager/IAimpServiceFileManager.cs index a69bb6b7..942a7f46 100644 --- a/src/SDK/AIMP.SDK/SDK/FileManager/IAimpServiceFileManager.cs +++ b/src/SDK/AIMP.SDK/SDK/FileManager/IAimpServiceFileManager.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/AIMP.SDK/SDK/FileManager/IAimpServiceFileStreaming.cs b/src/SDK/AIMP.SDK/SDK/FileManager/IAimpServiceFileStreaming.cs index 5c690114..cdc53474 100644 --- a/src/SDK/AIMP.SDK/SDK/FileManager/IAimpServiceFileStreaming.cs +++ b/src/SDK/AIMP.SDK/SDK/FileManager/IAimpServiceFileStreaming.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/AIMP.SDK/SDK/FileManager/IAimpServiceFileURI.cs b/src/SDK/AIMP.SDK/SDK/FileManager/IAimpServiceFileURI.cs index 5ae137e6..19abeee2 100644 --- a/src/SDK/AIMP.SDK/SDK/FileManager/IAimpServiceFileURI.cs +++ b/src/SDK/AIMP.SDK/SDK/FileManager/IAimpServiceFileURI.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/AIMP.SDK/SDK/FileManager/IAimpServiceFileURI2.cs b/src/SDK/AIMP.SDK/SDK/FileManager/IAimpServiceFileURI2.cs index 388396c6..449a93eb 100644 --- a/src/SDK/AIMP.SDK/SDK/FileManager/IAimpServiceFileURI2.cs +++ b/src/SDK/AIMP.SDK/SDK/FileManager/IAimpServiceFileURI2.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/AIMP.SDK/SDK/FileManager/Objects/IAimpFileInfo.cs b/src/SDK/AIMP.SDK/SDK/FileManager/Objects/IAimpFileInfo.cs index e15f2a8d..47fe2d3b 100644 --- a/src/SDK/AIMP.SDK/SDK/FileManager/Objects/IAimpFileInfo.cs +++ b/src/SDK/AIMP.SDK/SDK/FileManager/Objects/IAimpFileInfo.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/AIMP.SDK/SDK/FileManager/Objects/IAimpVirtualFile.cs b/src/SDK/AIMP.SDK/SDK/FileManager/Objects/IAimpVirtualFile.cs index 06f129ac..988e2169 100644 --- a/src/SDK/AIMP.SDK/SDK/FileManager/Objects/IAimpVirtualFile.cs +++ b/src/SDK/AIMP.SDK/SDK/FileManager/Objects/IAimpVirtualFile.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/AIMP.SDK/SDK/IAimpConfig.cs b/src/SDK/AIMP.SDK/SDK/IAimpConfig.cs index 6c4360e0..a8653310 100644 --- a/src/SDK/AIMP.SDK/SDK/IAimpConfig.cs +++ b/src/SDK/AIMP.SDK/SDK/IAimpConfig.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/AIMP.SDK/SDK/IAimpCore.cs b/src/SDK/AIMP.SDK/SDK/IAimpCore.cs index fe82e95d..21185de5 100644 --- a/src/SDK/AIMP.SDK/SDK/IAimpCore.cs +++ b/src/SDK/AIMP.SDK/SDK/IAimpCore.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/AIMP.SDK/SDK/IAimpDPIAware.cs b/src/SDK/AIMP.SDK/SDK/IAimpDPIAware.cs index 04decbe6..1c8ac4ce 100644 --- a/src/SDK/AIMP.SDK/SDK/IAimpDPIAware.cs +++ b/src/SDK/AIMP.SDK/SDK/IAimpDPIAware.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/AIMP.SDK/SDK/IAimpErrorInfo.cs b/src/SDK/AIMP.SDK/SDK/IAimpErrorInfo.cs index 5d727036..8cfa6cdf 100644 --- a/src/SDK/AIMP.SDK/SDK/IAimpErrorInfo.cs +++ b/src/SDK/AIMP.SDK/SDK/IAimpErrorInfo.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/AIMP.SDK/SDK/IAimpExtension.cs b/src/SDK/AIMP.SDK/SDK/IAimpExtension.cs index 6ff951a1..7f9509c9 100644 --- a/src/SDK/AIMP.SDK/SDK/IAimpExtension.cs +++ b/src/SDK/AIMP.SDK/SDK/IAimpExtension.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/AIMP.SDK/SDK/IAimpExternalSettingsDialog.cs b/src/SDK/AIMP.SDK/SDK/IAimpExternalSettingsDialog.cs index 53539b39..ee645eba 100644 --- a/src/SDK/AIMP.SDK/SDK/IAimpExternalSettingsDialog.cs +++ b/src/SDK/AIMP.SDK/SDK/IAimpExternalSettingsDialog.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/AIMP.SDK/SDK/IAimpObject.cs b/src/SDK/AIMP.SDK/SDK/IAimpObject.cs index 74064656..0f8be248 100644 --- a/src/SDK/AIMP.SDK/SDK/IAimpObject.cs +++ b/src/SDK/AIMP.SDK/SDK/IAimpObject.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/AIMP.SDK/SDK/IAimpObjectList.cs b/src/SDK/AIMP.SDK/SDK/IAimpObjectList.cs index cec85449..f8cdc6ef 100644 --- a/src/SDK/AIMP.SDK/SDK/IAimpObjectList.cs +++ b/src/SDK/AIMP.SDK/SDK/IAimpObjectList.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/AIMP.SDK/SDK/IAimpPlayer.cs b/src/SDK/AIMP.SDK/SDK/IAimpPlayer.cs index 739b9ae2..0e7c5948 100644 --- a/src/SDK/AIMP.SDK/SDK/IAimpPlayer.cs +++ b/src/SDK/AIMP.SDK/SDK/IAimpPlayer.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/AIMP.SDK/SDK/IAimpProgressCallback.cs b/src/SDK/AIMP.SDK/SDK/IAimpProgressCallback.cs index 992a49ff..ed6e5d8e 100644 --- a/src/SDK/AIMP.SDK/SDK/IAimpProgressCallback.cs +++ b/src/SDK/AIMP.SDK/SDK/IAimpProgressCallback.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/AIMP.SDK/SDK/IAimpService.cs b/src/SDK/AIMP.SDK/SDK/IAimpService.cs index eb6a6ddc..07de7467 100644 --- a/src/SDK/AIMP.SDK/SDK/IAimpService.cs +++ b/src/SDK/AIMP.SDK/SDK/IAimpService.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/AIMP.SDK/SDK/Lyrics/Extensions/IAimpExtensionLyricsProvider.cs b/src/SDK/AIMP.SDK/SDK/Lyrics/Extensions/IAimpExtensionLyricsProvider.cs index 77164502..af7ab21e 100644 --- a/src/SDK/AIMP.SDK/SDK/Lyrics/Extensions/IAimpExtensionLyricsProvider.cs +++ b/src/SDK/AIMP.SDK/SDK/Lyrics/Extensions/IAimpExtensionLyricsProvider.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/AIMP.SDK/SDK/Lyrics/IAimpServiceLyrics.cs b/src/SDK/AIMP.SDK/SDK/Lyrics/IAimpServiceLyrics.cs index e215acbb..f027377e 100644 --- a/src/SDK/AIMP.SDK/SDK/Lyrics/IAimpServiceLyrics.cs +++ b/src/SDK/AIMP.SDK/SDK/Lyrics/IAimpServiceLyrics.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/AIMP.SDK/SDK/Lyrics/Objects/IAimpLyrics.cs b/src/SDK/AIMP.SDK/SDK/Lyrics/Objects/IAimpLyrics.cs index a503f65a..8727f01c 100644 --- a/src/SDK/AIMP.SDK/SDK/Lyrics/Objects/IAimpLyrics.cs +++ b/src/SDK/AIMP.SDK/SDK/Lyrics/Objects/IAimpLyrics.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/AIMP.SDK/SDK/MUIManager/IAimpMUIManager.cs b/src/SDK/AIMP.SDK/SDK/MUIManager/IAimpMUIManager.cs index 1dc049ab..4533ff6f 100644 --- a/src/SDK/AIMP.SDK/SDK/MUIManager/IAimpMUIManager.cs +++ b/src/SDK/AIMP.SDK/SDK/MUIManager/IAimpMUIManager.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/AIMP.SDK/SDK/MenuManager/IAimpServiceMenuManager.cs b/src/SDK/AIMP.SDK/SDK/MenuManager/IAimpServiceMenuManager.cs index fda77333..4e07d444 100644 --- a/src/SDK/AIMP.SDK/SDK/MenuManager/IAimpServiceMenuManager.cs +++ b/src/SDK/AIMP.SDK/SDK/MenuManager/IAimpServiceMenuManager.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/AIMP.SDK/SDK/MenuManager/Objects/IAimpMenuItem.cs b/src/SDK/AIMP.SDK/SDK/MenuManager/Objects/IAimpMenuItem.cs index a8787e12..1be29cae 100644 --- a/src/SDK/AIMP.SDK/SDK/MenuManager/Objects/IAimpMenuItem.cs +++ b/src/SDK/AIMP.SDK/SDK/MenuManager/Objects/IAimpMenuItem.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/AIMP.SDK/SDK/MessageDispatcher/AimpMessages.cs b/src/SDK/AIMP.SDK/SDK/MessageDispatcher/AimpMessages.cs index 79244838..37661779 100644 --- a/src/SDK/AIMP.SDK/SDK/MessageDispatcher/AimpMessages.cs +++ b/src/SDK/AIMP.SDK/SDK/MessageDispatcher/AimpMessages.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/AIMP.SDK/SDK/MessageDispatcher/AimpQuickFileInfoParams.cs b/src/SDK/AIMP.SDK/SDK/MessageDispatcher/AimpQuickFileInfoParams.cs index 0a6b7a44..e9cda8c1 100644 --- a/src/SDK/AIMP.SDK/SDK/MessageDispatcher/AimpQuickFileInfoParams.cs +++ b/src/SDK/AIMP.SDK/SDK/MessageDispatcher/AimpQuickFileInfoParams.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/AIMP.SDK/SDK/MessageDispatcher/IAimpMessageHook.cs b/src/SDK/AIMP.SDK/SDK/MessageDispatcher/IAimpMessageHook.cs index 895028f1..fe8fdfb5 100644 --- a/src/SDK/AIMP.SDK/SDK/MessageDispatcher/IAimpMessageHook.cs +++ b/src/SDK/AIMP.SDK/SDK/MessageDispatcher/IAimpMessageHook.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/AIMP.SDK/SDK/MessageDispatcher/IAimpServiceMessageDispatcher.cs b/src/SDK/AIMP.SDK/SDK/MessageDispatcher/IAimpServiceMessageDispatcher.cs index 141766c6..64cd8fea 100644 --- a/src/SDK/AIMP.SDK/SDK/MessageDispatcher/IAimpServiceMessageDispatcher.cs +++ b/src/SDK/AIMP.SDK/SDK/MessageDispatcher/IAimpServiceMessageDispatcher.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/AIMP.SDK/SDK/MessageDispatcher/PointerExtension.cs b/src/SDK/AIMP.SDK/SDK/MessageDispatcher/PointerExtension.cs index 65710c65..003e220a 100644 --- a/src/SDK/AIMP.SDK/SDK/MessageDispatcher/PointerExtension.cs +++ b/src/SDK/AIMP.SDK/SDK/MessageDispatcher/PointerExtension.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/AIMP.SDK/SDK/MusicLibrary/DataFilter/IAimpDataFieldFilter.cs b/src/SDK/AIMP.SDK/SDK/MusicLibrary/DataFilter/IAimpDataFieldFilter.cs index c2356c38..b0f1304b 100644 --- a/src/SDK/AIMP.SDK/SDK/MusicLibrary/DataFilter/IAimpDataFieldFilter.cs +++ b/src/SDK/AIMP.SDK/SDK/MusicLibrary/DataFilter/IAimpDataFieldFilter.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/AIMP.SDK/SDK/MusicLibrary/DataFilter/IAimpDataFieldFilterByArray.cs b/src/SDK/AIMP.SDK/SDK/MusicLibrary/DataFilter/IAimpDataFieldFilterByArray.cs index b55d729e..0ca4255c 100644 --- a/src/SDK/AIMP.SDK/SDK/MusicLibrary/DataFilter/IAimpDataFieldFilterByArray.cs +++ b/src/SDK/AIMP.SDK/SDK/MusicLibrary/DataFilter/IAimpDataFieldFilterByArray.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/AIMP.SDK/SDK/MusicLibrary/DataFilter/IAimpDataFilterGroup.cs b/src/SDK/AIMP.SDK/SDK/MusicLibrary/DataFilter/IAimpDataFilterGroup.cs index 3c8aea30..f3a3654c 100644 --- a/src/SDK/AIMP.SDK/SDK/MusicLibrary/DataFilter/IAimpDataFilterGroup.cs +++ b/src/SDK/AIMP.SDK/SDK/MusicLibrary/DataFilter/IAimpDataFilterGroup.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/AIMP.SDK/SDK/MusicLibrary/DataStorage/AimpDataField.cs b/src/SDK/AIMP.SDK/SDK/MusicLibrary/DataStorage/AimpDataField.cs index bddfe052..f57a7f8e 100644 --- a/src/SDK/AIMP.SDK/SDK/MusicLibrary/DataStorage/AimpDataField.cs +++ b/src/SDK/AIMP.SDK/SDK/MusicLibrary/DataStorage/AimpDataField.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/AIMP.SDK/SDK/MusicLibrary/DataStorage/IAimpDataField.cs b/src/SDK/AIMP.SDK/SDK/MusicLibrary/DataStorage/IAimpDataField.cs index a7e3a417..f25d1f22 100644 --- a/src/SDK/AIMP.SDK/SDK/MusicLibrary/DataStorage/IAimpDataField.cs +++ b/src/SDK/AIMP.SDK/SDK/MusicLibrary/DataStorage/IAimpDataField.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/AIMP.SDK/SDK/MusicLibrary/DataStorage/IAimpDataFieldDisplayValue.cs b/src/SDK/AIMP.SDK/SDK/MusicLibrary/DataStorage/IAimpDataFieldDisplayValue.cs index 7f260859..739545c3 100644 --- a/src/SDK/AIMP.SDK/SDK/MusicLibrary/DataStorage/IAimpDataFieldDisplayValue.cs +++ b/src/SDK/AIMP.SDK/SDK/MusicLibrary/DataStorage/IAimpDataFieldDisplayValue.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/AIMP.SDK/SDK/MusicLibrary/DataStorage/IAimpDataProvider.cs b/src/SDK/AIMP.SDK/SDK/MusicLibrary/DataStorage/IAimpDataProvider.cs index 9a0a1e28..a694b78b 100644 --- a/src/SDK/AIMP.SDK/SDK/MusicLibrary/DataStorage/IAimpDataProvider.cs +++ b/src/SDK/AIMP.SDK/SDK/MusicLibrary/DataStorage/IAimpDataProvider.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/AIMP.SDK/SDK/MusicLibrary/DataStorage/IAimpDataProvider2.cs b/src/SDK/AIMP.SDK/SDK/MusicLibrary/DataStorage/IAimpDataProvider2.cs index 1e49135b..128c8f17 100644 --- a/src/SDK/AIMP.SDK/SDK/MusicLibrary/DataStorage/IAimpDataProvider2.cs +++ b/src/SDK/AIMP.SDK/SDK/MusicLibrary/DataStorage/IAimpDataProvider2.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/AIMP.SDK/SDK/MusicLibrary/DataStorage/IAimpDataStorage.cs b/src/SDK/AIMP.SDK/SDK/MusicLibrary/DataStorage/IAimpDataStorage.cs index 2f2ca993..1996757f 100644 --- a/src/SDK/AIMP.SDK/SDK/MusicLibrary/DataStorage/IAimpDataStorage.cs +++ b/src/SDK/AIMP.SDK/SDK/MusicLibrary/DataStorage/IAimpDataStorage.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/AIMP.SDK/SDK/MusicLibrary/DataStorage/IAimpDataStorage2.cs b/src/SDK/AIMP.SDK/SDK/MusicLibrary/DataStorage/IAimpDataStorage2.cs index 300cd407..78d8c98f 100644 --- a/src/SDK/AIMP.SDK/SDK/MusicLibrary/DataStorage/IAimpDataStorage2.cs +++ b/src/SDK/AIMP.SDK/SDK/MusicLibrary/DataStorage/IAimpDataStorage2.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/AIMP.SDK/SDK/MusicLibrary/DataStorage/IAimpGroupingTreeDataProvider.cs b/src/SDK/AIMP.SDK/SDK/MusicLibrary/DataStorage/IAimpGroupingTreeDataProvider.cs index 5a2518e8..12bf4fda 100644 --- a/src/SDK/AIMP.SDK/SDK/MusicLibrary/DataStorage/IAimpGroupingTreeDataProvider.cs +++ b/src/SDK/AIMP.SDK/SDK/MusicLibrary/DataStorage/IAimpGroupingTreeDataProvider.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/AIMP.SDK/SDK/MusicLibrary/DataStorage/IAimpGroupingTreeDataProviderSelection.cs b/src/SDK/AIMP.SDK/SDK/MusicLibrary/DataStorage/IAimpGroupingTreeDataProviderSelection.cs index a0ff0026..a84f0eb7 100644 --- a/src/SDK/AIMP.SDK/SDK/MusicLibrary/DataStorage/IAimpGroupingTreeDataProviderSelection.cs +++ b/src/SDK/AIMP.SDK/SDK/MusicLibrary/DataStorage/IAimpGroupingTreeDataProviderSelection.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/AIMP.SDK/SDK/MusicLibrary/DataStorage/IAimpGroupingTreeSelection.cs b/src/SDK/AIMP.SDK/SDK/MusicLibrary/DataStorage/IAimpGroupingTreeSelection.cs index 8b0cc4a5..c5e487f8 100644 --- a/src/SDK/AIMP.SDK/SDK/MusicLibrary/DataStorage/IAimpGroupingTreeSelection.cs +++ b/src/SDK/AIMP.SDK/SDK/MusicLibrary/DataStorage/IAimpGroupingTreeSelection.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/AIMP.SDK/SDK/MusicLibrary/Extension/Command/IAimpDataStorageCommandAddFiles.cs b/src/SDK/AIMP.SDK/SDK/MusicLibrary/Extension/Command/IAimpDataStorageCommandAddFiles.cs index cf287e43..8c271a7a 100644 --- a/src/SDK/AIMP.SDK/SDK/MusicLibrary/Extension/Command/IAimpDataStorageCommandAddFiles.cs +++ b/src/SDK/AIMP.SDK/SDK/MusicLibrary/Extension/Command/IAimpDataStorageCommandAddFiles.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/AIMP.SDK/SDK/MusicLibrary/Extension/Command/IAimpDataStorageCommandAddFilesDialog.cs b/src/SDK/AIMP.SDK/SDK/MusicLibrary/Extension/Command/IAimpDataStorageCommandAddFilesDialog.cs index 4729b39e..1d9d57b0 100644 --- a/src/SDK/AIMP.SDK/SDK/MusicLibrary/Extension/Command/IAimpDataStorageCommandAddFilesDialog.cs +++ b/src/SDK/AIMP.SDK/SDK/MusicLibrary/Extension/Command/IAimpDataStorageCommandAddFilesDialog.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/AIMP.SDK/SDK/MusicLibrary/Extension/Command/IAimpDataStorageCommandDeleteFiles.cs b/src/SDK/AIMP.SDK/SDK/MusicLibrary/Extension/Command/IAimpDataStorageCommandDeleteFiles.cs index 9e4721f2..9e319df8 100644 --- a/src/SDK/AIMP.SDK/SDK/MusicLibrary/Extension/Command/IAimpDataStorageCommandDeleteFiles.cs +++ b/src/SDK/AIMP.SDK/SDK/MusicLibrary/Extension/Command/IAimpDataStorageCommandDeleteFiles.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/AIMP.SDK/SDK/MusicLibrary/Extension/Command/IAimpDataStorageCommandDeleteFiles2.cs b/src/SDK/AIMP.SDK/SDK/MusicLibrary/Extension/Command/IAimpDataStorageCommandDeleteFiles2.cs index e8b96a80..3ebc725f 100644 --- a/src/SDK/AIMP.SDK/SDK/MusicLibrary/Extension/Command/IAimpDataStorageCommandDeleteFiles2.cs +++ b/src/SDK/AIMP.SDK/SDK/MusicLibrary/Extension/Command/IAimpDataStorageCommandDeleteFiles2.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/AIMP.SDK/SDK/MusicLibrary/Extension/Command/IAimpDataStorageCommandDropData.cs b/src/SDK/AIMP.SDK/SDK/MusicLibrary/Extension/Command/IAimpDataStorageCommandDropData.cs index 37211791..7c356204 100644 --- a/src/SDK/AIMP.SDK/SDK/MusicLibrary/Extension/Command/IAimpDataStorageCommandDropData.cs +++ b/src/SDK/AIMP.SDK/SDK/MusicLibrary/Extension/Command/IAimpDataStorageCommandDropData.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/AIMP.SDK/SDK/MusicLibrary/Extension/Command/IAimpDataStorageCommandFindInLibrary.cs b/src/SDK/AIMP.SDK/SDK/MusicLibrary/Extension/Command/IAimpDataStorageCommandFindInLibrary.cs index 4c6c70d9..6167ee0c 100644 --- a/src/SDK/AIMP.SDK/SDK/MusicLibrary/Extension/Command/IAimpDataStorageCommandFindInLibrary.cs +++ b/src/SDK/AIMP.SDK/SDK/MusicLibrary/Extension/Command/IAimpDataStorageCommandFindInLibrary.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/AIMP.SDK/SDK/MusicLibrary/Extension/Command/IAimpDataStorageCommandReloadTags.cs b/src/SDK/AIMP.SDK/SDK/MusicLibrary/Extension/Command/IAimpDataStorageCommandReloadTags.cs index 354090c0..0b214b85 100644 --- a/src/SDK/AIMP.SDK/SDK/MusicLibrary/Extension/Command/IAimpDataStorageCommandReloadTags.cs +++ b/src/SDK/AIMP.SDK/SDK/MusicLibrary/Extension/Command/IAimpDataStorageCommandReloadTags.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/AIMP.SDK/SDK/MusicLibrary/Extension/Command/IAimpDataStorageCommandReportDialog.cs b/src/SDK/AIMP.SDK/SDK/MusicLibrary/Extension/Command/IAimpDataStorageCommandReportDialog.cs index 868d227f..8cafab67 100644 --- a/src/SDK/AIMP.SDK/SDK/MusicLibrary/Extension/Command/IAimpDataStorageCommandReportDialog.cs +++ b/src/SDK/AIMP.SDK/SDK/MusicLibrary/Extension/Command/IAimpDataStorageCommandReportDialog.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/AIMP.SDK/SDK/MusicLibrary/Extension/Command/IAimpDataStorageCommandUserMark.cs b/src/SDK/AIMP.SDK/SDK/MusicLibrary/Extension/Command/IAimpDataStorageCommandUserMark.cs index 885ab607..fdab616d 100644 --- a/src/SDK/AIMP.SDK/SDK/MusicLibrary/Extension/Command/IAimpDataStorageCommandUserMark.cs +++ b/src/SDK/AIMP.SDK/SDK/MusicLibrary/Extension/Command/IAimpDataStorageCommandUserMark.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/AIMP.SDK/SDK/MusicLibrary/Extension/IAimpAlbumArtProvider.cs b/src/SDK/AIMP.SDK/SDK/MusicLibrary/Extension/IAimpAlbumArtProvider.cs index dc91b348..6fffdca8 100644 --- a/src/SDK/AIMP.SDK/SDK/MusicLibrary/Extension/IAimpAlbumArtProvider.cs +++ b/src/SDK/AIMP.SDK/SDK/MusicLibrary/Extension/IAimpAlbumArtProvider.cs @@ -1,4 +1,13 @@ -using AIMP.SDK.Objects; +// ---------------------------------------------------- +// AIMP DotNet SDK +// +// Copyright (c) 2014 - 2023 Evgeniy Bogdan +// https://github.com/martin211/aimp_dotnet +// +// Mail: mail4evgeniy@gmail.com +// ---------------------------------------------------- + +using AIMP.SDK.Objects; namespace AIMP.SDK.MusicLibrary.Extension; diff --git a/src/SDK/AIMP.SDK/SDK/MusicLibrary/Extension/IAimpAlbumArtProvider2.cs b/src/SDK/AIMP.SDK/SDK/MusicLibrary/Extension/IAimpAlbumArtProvider2.cs index 163a3b9d..9ca14232 100644 --- a/src/SDK/AIMP.SDK/SDK/MusicLibrary/Extension/IAimpAlbumArtProvider2.cs +++ b/src/SDK/AIMP.SDK/SDK/MusicLibrary/Extension/IAimpAlbumArtProvider2.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/AIMP.SDK/SDK/MusicLibrary/Extension/IAimpExtensionDataStorage.cs b/src/SDK/AIMP.SDK/SDK/MusicLibrary/Extension/IAimpExtensionDataStorage.cs index 232f202c..b02e5fba 100644 --- a/src/SDK/AIMP.SDK/SDK/MusicLibrary/Extension/IAimpExtensionDataStorage.cs +++ b/src/SDK/AIMP.SDK/SDK/MusicLibrary/Extension/IAimpExtensionDataStorage.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/AIMP.SDK/SDK/MusicLibrary/IAimpDataFilter.cs b/src/SDK/AIMP.SDK/SDK/MusicLibrary/IAimpDataFilter.cs index de25af07..fbb3950d 100644 --- a/src/SDK/AIMP.SDK/SDK/MusicLibrary/IAimpDataFilter.cs +++ b/src/SDK/AIMP.SDK/SDK/MusicLibrary/IAimpDataFilter.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/AIMP.SDK/SDK/MusicLibrary/IAimpDataProviderSelection.cs b/src/SDK/AIMP.SDK/SDK/MusicLibrary/IAimpDataProviderSelection.cs index edbd7d32..ac9963b2 100644 --- a/src/SDK/AIMP.SDK/SDK/MusicLibrary/IAimpDataProviderSelection.cs +++ b/src/SDK/AIMP.SDK/SDK/MusicLibrary/IAimpDataProviderSelection.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/AIMP.SDK/SDK/MusicLibrary/IAimpDataStorageManager.cs b/src/SDK/AIMP.SDK/SDK/MusicLibrary/IAimpDataStorageManager.cs index 546d274e..eda33202 100644 --- a/src/SDK/AIMP.SDK/SDK/MusicLibrary/IAimpDataStorageManager.cs +++ b/src/SDK/AIMP.SDK/SDK/MusicLibrary/IAimpDataStorageManager.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/AIMP.SDK/SDK/MusicLibrary/IAimpFileList.cs b/src/SDK/AIMP.SDK/SDK/MusicLibrary/IAimpFileList.cs index f014642a..b56f8c70 100644 --- a/src/SDK/AIMP.SDK/SDK/MusicLibrary/IAimpFileList.cs +++ b/src/SDK/AIMP.SDK/SDK/MusicLibrary/IAimpFileList.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/AIMP.SDK/SDK/MusicLibrary/IAimpLocalDataStorage.cs b/src/SDK/AIMP.SDK/SDK/MusicLibrary/IAimpLocalDataStorage.cs index c97294fb..2c843c5b 100644 --- a/src/SDK/AIMP.SDK/SDK/MusicLibrary/IAimpLocalDataStorage.cs +++ b/src/SDK/AIMP.SDK/SDK/MusicLibrary/IAimpLocalDataStorage.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/AIMP.SDK/SDK/MusicLibrary/IAimpMusicLibraryPlaylistPreimage.cs b/src/SDK/AIMP.SDK/SDK/MusicLibrary/IAimpMusicLibraryPlaylistPreimage.cs index 4c94a1ec..2931dc3a 100644 --- a/src/SDK/AIMP.SDK/SDK/MusicLibrary/IAimpMusicLibraryPlaylistPreimage.cs +++ b/src/SDK/AIMP.SDK/SDK/MusicLibrary/IAimpMusicLibraryPlaylistPreimage.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/AIMP.SDK/SDK/MusicLibrary/IAimpServiceMusicLibrary.cs b/src/SDK/AIMP.SDK/SDK/MusicLibrary/IAimpServiceMusicLibrary.cs index 720364dc..bb38bb11 100644 --- a/src/SDK/AIMP.SDK/SDK/MusicLibrary/IAimpServiceMusicLibrary.cs +++ b/src/SDK/AIMP.SDK/SDK/MusicLibrary/IAimpServiceMusicLibrary.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/AIMP.SDK/SDK/MusicLibrary/IAimpServiceMusicLibraryUI.cs b/src/SDK/AIMP.SDK/SDK/MusicLibrary/IAimpServiceMusicLibraryUI.cs index 81ea4596..059ac6ac 100644 --- a/src/SDK/AIMP.SDK/SDK/MusicLibrary/IAimpServiceMusicLibraryUI.cs +++ b/src/SDK/AIMP.SDK/SDK/MusicLibrary/IAimpServiceMusicLibraryUI.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/AIMP.SDK/SDK/MusicLibrary/IAimpSortDirection.cs b/src/SDK/AIMP.SDK/SDK/MusicLibrary/IAimpSortDirection.cs index 310015cc..03b24ce8 100644 --- a/src/SDK/AIMP.SDK/SDK/MusicLibrary/IAimpSortDirection.cs +++ b/src/SDK/AIMP.SDK/SDK/MusicLibrary/IAimpSortDirection.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/AIMP.SDK/SDK/MusicLibrary/Presets/IAimpGroupingPreset.cs b/src/SDK/AIMP.SDK/SDK/MusicLibrary/Presets/IAimpGroupingPreset.cs index e4ea6124..c3e9e938 100644 --- a/src/SDK/AIMP.SDK/SDK/MusicLibrary/Presets/IAimpGroupingPreset.cs +++ b/src/SDK/AIMP.SDK/SDK/MusicLibrary/Presets/IAimpGroupingPreset.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/AIMP.SDK/SDK/MusicLibrary/Presets/IAimpGroupingPresetStandard.cs b/src/SDK/AIMP.SDK/SDK/MusicLibrary/Presets/IAimpGroupingPresetStandard.cs index d8e2de33..f32c4ad3 100644 --- a/src/SDK/AIMP.SDK/SDK/MusicLibrary/Presets/IAimpGroupingPresetStandard.cs +++ b/src/SDK/AIMP.SDK/SDK/MusicLibrary/Presets/IAimpGroupingPresetStandard.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/AIMP.SDK/SDK/MusicLibrary/Presets/IAimpGroupingPresets.cs b/src/SDK/AIMP.SDK/SDK/MusicLibrary/Presets/IAimpGroupingPresets.cs index cd245761..0ca0e8ac 100644 --- a/src/SDK/AIMP.SDK/SDK/MusicLibrary/Presets/IAimpGroupingPresets.cs +++ b/src/SDK/AIMP.SDK/SDK/MusicLibrary/Presets/IAimpGroupingPresets.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/AIMP.SDK/SDK/MusicLibrary/SortDirectionType.cs b/src/SDK/AIMP.SDK/SDK/MusicLibrary/SortDirectionType.cs index a74a421c..de6119a2 100644 --- a/src/SDK/AIMP.SDK/SDK/MusicLibrary/SortDirectionType.cs +++ b/src/SDK/AIMP.SDK/SDK/MusicLibrary/SortDirectionType.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/AIMP.SDK/SDK/Objects/IAimpFileStream.cs b/src/SDK/AIMP.SDK/SDK/Objects/IAimpFileStream.cs index 3968c716..4a26c9d7 100644 --- a/src/SDK/AIMP.SDK/SDK/Objects/IAimpFileStream.cs +++ b/src/SDK/AIMP.SDK/SDK/Objects/IAimpFileStream.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/AIMP.SDK/SDK/Objects/IAimpHashCode.cs b/src/SDK/AIMP.SDK/SDK/Objects/IAimpHashCode.cs index 0d77a95d..94f87b01 100644 --- a/src/SDK/AIMP.SDK/SDK/Objects/IAimpHashCode.cs +++ b/src/SDK/AIMP.SDK/SDK/Objects/IAimpHashCode.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/AIMP.SDK/SDK/Objects/IAimpImage.cs b/src/SDK/AIMP.SDK/SDK/Objects/IAimpImage.cs index e2ab2066..8d09e26b 100644 --- a/src/SDK/AIMP.SDK/SDK/Objects/IAimpImage.cs +++ b/src/SDK/AIMP.SDK/SDK/Objects/IAimpImage.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/AIMP.SDK/SDK/Objects/IAimpImage2.cs b/src/SDK/AIMP.SDK/SDK/Objects/IAimpImage2.cs index 8ea7bf0f..696b34c1 100644 --- a/src/SDK/AIMP.SDK/SDK/Objects/IAimpImage2.cs +++ b/src/SDK/AIMP.SDK/SDK/Objects/IAimpImage2.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/AIMP.SDK/SDK/Objects/IAimpImageContainer.cs b/src/SDK/AIMP.SDK/SDK/Objects/IAimpImageContainer.cs index 7459687d..c9924cb9 100644 --- a/src/SDK/AIMP.SDK/SDK/Objects/IAimpImageContainer.cs +++ b/src/SDK/AIMP.SDK/SDK/Objects/IAimpImageContainer.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/AIMP.SDK/SDK/Objects/IAimpMemoryStream.cs b/src/SDK/AIMP.SDK/SDK/Objects/IAimpMemoryStream.cs index eedbe985..980d0525 100644 --- a/src/SDK/AIMP.SDK/SDK/Objects/IAimpMemoryStream.cs +++ b/src/SDK/AIMP.SDK/SDK/Objects/IAimpMemoryStream.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/AIMP.SDK/SDK/Objects/IAimpPropertyList2.cs b/src/SDK/AIMP.SDK/SDK/Objects/IAimpPropertyList2.cs index f1cee119..99840525 100644 --- a/src/SDK/AIMP.SDK/SDK/Objects/IAimpPropertyList2.cs +++ b/src/SDK/AIMP.SDK/SDK/Objects/IAimpPropertyList2.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/AIMP.SDK/SDK/Objects/IAimpStream.cs b/src/SDK/AIMP.SDK/SDK/Objects/IAimpStream.cs index 55df13fb..aa9a2121 100644 --- a/src/SDK/AIMP.SDK/SDK/Objects/IAimpStream.cs +++ b/src/SDK/AIMP.SDK/SDK/Objects/IAimpStream.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/AIMP.SDK/SDK/Objects/IAimpString.cs b/src/SDK/AIMP.SDK/SDK/Objects/IAimpString.cs index 88570706..58f946d5 100644 --- a/src/SDK/AIMP.SDK/SDK/Objects/IAimpString.cs +++ b/src/SDK/AIMP.SDK/SDK/Objects/IAimpString.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/AIMP.SDK/SDK/Options/IAimpOptionsDialogFrame.cs b/src/SDK/AIMP.SDK/SDK/Options/IAimpOptionsDialogFrame.cs index d6eabe8b..e4ce5be9 100644 --- a/src/SDK/AIMP.SDK/SDK/Options/IAimpOptionsDialogFrame.cs +++ b/src/SDK/AIMP.SDK/SDK/Options/IAimpOptionsDialogFrame.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/AIMP.SDK/SDK/Options/IAimpOptionsDialogFrameKeyboardHelper.cs b/src/SDK/AIMP.SDK/SDK/Options/IAimpOptionsDialogFrameKeyboardHelper.cs index d8ad6808..1d1c8d00 100644 --- a/src/SDK/AIMP.SDK/SDK/Options/IAimpOptionsDialogFrameKeyboardHelper.cs +++ b/src/SDK/AIMP.SDK/SDK/Options/IAimpOptionsDialogFrameKeyboardHelper.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/AIMP.SDK/SDK/Options/IAimpOptionsDialogFrameKeyboardHelper2.cs b/src/SDK/AIMP.SDK/SDK/Options/IAimpOptionsDialogFrameKeyboardHelper2.cs index ab8082eb..c6d59b98 100644 --- a/src/SDK/AIMP.SDK/SDK/Options/IAimpOptionsDialogFrameKeyboardHelper2.cs +++ b/src/SDK/AIMP.SDK/SDK/Options/IAimpOptionsDialogFrameKeyboardHelper2.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/AIMP.SDK/SDK/Options/IAimpServiceOptionsDialog.cs b/src/SDK/AIMP.SDK/SDK/Options/IAimpServiceOptionsDialog.cs index 3117aa47..4f3c1d1b 100644 --- a/src/SDK/AIMP.SDK/SDK/Options/IAimpServiceOptionsDialog.cs +++ b/src/SDK/AIMP.SDK/SDK/Options/IAimpServiceOptionsDialog.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/AIMP.SDK/SDK/PlayList/AimpPlayListEventArgs.cs b/src/SDK/AIMP.SDK/SDK/PlayList/AimpPlayListEventArgs.cs index 241a6e2b..d3f436f4 100644 --- a/src/SDK/AIMP.SDK/SDK/PlayList/AimpPlayListEventArgs.cs +++ b/src/SDK/AIMP.SDK/SDK/PlayList/AimpPlayListEventArgs.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/AIMP.SDK/SDK/PlayList/Constants.cs b/src/SDK/AIMP.SDK/SDK/PlayList/Constants.cs index 55b4f847..e1ad015d 100644 --- a/src/SDK/AIMP.SDK/SDK/PlayList/Constants.cs +++ b/src/SDK/AIMP.SDK/SDK/PlayList/Constants.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/AIMP.SDK/SDK/PlayList/Extensions/IAimpExtensionPlaylistManagerListener.cs b/src/SDK/AIMP.SDK/SDK/PlayList/Extensions/IAimpExtensionPlaylistManagerListener.cs index b8ccc010..d1fd2ec7 100644 --- a/src/SDK/AIMP.SDK/SDK/PlayList/Extensions/IAimpExtensionPlaylistManagerListener.cs +++ b/src/SDK/AIMP.SDK/SDK/PlayList/Extensions/IAimpExtensionPlaylistManagerListener.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/AIMP.SDK/SDK/PlayList/Extensions/IAimpExtensionPlaylistPreimageFactory.cs b/src/SDK/AIMP.SDK/SDK/PlayList/Extensions/IAimpExtensionPlaylistPreimageFactory.cs index 73571477..c5d28c1b 100644 --- a/src/SDK/AIMP.SDK/SDK/PlayList/Extensions/IAimpExtensionPlaylistPreimageFactory.cs +++ b/src/SDK/AIMP.SDK/SDK/PlayList/Extensions/IAimpExtensionPlaylistPreimageFactory.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/AIMP.SDK/SDK/PlayList/IAimpPlayListManager.cs b/src/SDK/AIMP.SDK/SDK/PlayList/IAimpPlayListManager.cs index fbb0ecc6..4591bfc2 100644 --- a/src/SDK/AIMP.SDK/SDK/PlayList/IAimpPlayListManager.cs +++ b/src/SDK/AIMP.SDK/SDK/PlayList/IAimpPlayListManager.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/AIMP.SDK/SDK/PlayList/IAimpPlaylistListener.cs b/src/SDK/AIMP.SDK/SDK/PlayList/IAimpPlaylistListener.cs index 97e16d85..8ac642fa 100644 --- a/src/SDK/AIMP.SDK/SDK/PlayList/IAimpPlaylistListener.cs +++ b/src/SDK/AIMP.SDK/SDK/PlayList/IAimpPlaylistListener.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/AIMP.SDK/SDK/PlayList/IAimpPlaylistManager2.cs b/src/SDK/AIMP.SDK/SDK/PlayList/IAimpPlaylistManager2.cs index 9713c393..bec912f5 100644 --- a/src/SDK/AIMP.SDK/SDK/PlayList/IAimpPlaylistManager2.cs +++ b/src/SDK/AIMP.SDK/SDK/PlayList/IAimpPlaylistManager2.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/AIMP.SDK/SDK/PlayList/IAimpPlaylistPreimageDataProvider.cs b/src/SDK/AIMP.SDK/SDK/PlayList/IAimpPlaylistPreimageDataProvider.cs index c2fd3e6b..31f7dc64 100644 --- a/src/SDK/AIMP.SDK/SDK/PlayList/IAimpPlaylistPreimageDataProvider.cs +++ b/src/SDK/AIMP.SDK/SDK/PlayList/IAimpPlaylistPreimageDataProvider.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/AIMP.SDK/SDK/PlayList/IAimpPlaylistPreimageFolders.cs b/src/SDK/AIMP.SDK/SDK/PlayList/IAimpPlaylistPreimageFolders.cs index 2df83a0a..391412fe 100644 --- a/src/SDK/AIMP.SDK/SDK/PlayList/IAimpPlaylistPreimageFolders.cs +++ b/src/SDK/AIMP.SDK/SDK/PlayList/IAimpPlaylistPreimageFolders.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/AIMP.SDK/SDK/PlayList/IAimpPlaylistPreimageListener.cs b/src/SDK/AIMP.SDK/SDK/PlayList/IAimpPlaylistPreimageListener.cs index a8193997..6c7c1d44 100644 --- a/src/SDK/AIMP.SDK/SDK/PlayList/IAimpPlaylistPreimageListener.cs +++ b/src/SDK/AIMP.SDK/SDK/PlayList/IAimpPlaylistPreimageListener.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/AIMP.SDK/SDK/PlayList/IAimpPlaylistQueue.cs b/src/SDK/AIMP.SDK/SDK/PlayList/IAimpPlaylistQueue.cs index b5a5077b..093ef2d1 100644 --- a/src/SDK/AIMP.SDK/SDK/PlayList/IAimpPlaylistQueue.cs +++ b/src/SDK/AIMP.SDK/SDK/PlayList/IAimpPlaylistQueue.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/AIMP.SDK/SDK/PlayList/IAimpPlaylistQueueListener.cs b/src/SDK/AIMP.SDK/SDK/PlayList/IAimpPlaylistQueueListener.cs index c65a7f29..c4e74ea8 100644 --- a/src/SDK/AIMP.SDK/SDK/PlayList/IAimpPlaylistQueueListener.cs +++ b/src/SDK/AIMP.SDK/SDK/PlayList/IAimpPlaylistQueueListener.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/AIMP.SDK/SDK/PlayList/Objects/IAIMPPlaylistPreimage.cs b/src/SDK/AIMP.SDK/SDK/PlayList/Objects/IAIMPPlaylistPreimage.cs index b2e53ebf..7d8df2fa 100644 --- a/src/SDK/AIMP.SDK/SDK/PlayList/Objects/IAIMPPlaylistPreimage.cs +++ b/src/SDK/AIMP.SDK/SDK/PlayList/Objects/IAIMPPlaylistPreimage.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/AIMP.SDK/SDK/PlayList/Objects/IAimpPlayListGroup.cs b/src/SDK/AIMP.SDK/SDK/PlayList/Objects/IAimpPlayListGroup.cs index 10971635..8ad2c845 100644 --- a/src/SDK/AIMP.SDK/SDK/PlayList/Objects/IAimpPlayListGroup.cs +++ b/src/SDK/AIMP.SDK/SDK/PlayList/Objects/IAimpPlayListGroup.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/AIMP.SDK/SDK/PlayList/Objects/IAimpPlayListItem.cs b/src/SDK/AIMP.SDK/SDK/PlayList/Objects/IAimpPlayListItem.cs index 67d0becb..60f93df3 100644 --- a/src/SDK/AIMP.SDK/SDK/PlayList/Objects/IAimpPlayListItem.cs +++ b/src/SDK/AIMP.SDK/SDK/PlayList/Objects/IAimpPlayListItem.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/AIMP.SDK/SDK/PlayList/Objects/IAimpPlaylist.cs b/src/SDK/AIMP.SDK/SDK/PlayList/Objects/IAimpPlaylist.cs index ae0b5d60..9e20a5ec 100644 --- a/src/SDK/AIMP.SDK/SDK/PlayList/Objects/IAimpPlaylist.cs +++ b/src/SDK/AIMP.SDK/SDK/PlayList/Objects/IAimpPlaylist.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/AIMP.SDK/SDK/Player/Extensions/IAimpExtensionPlaybackQueue.cs b/src/SDK/AIMP.SDK/SDK/Player/Extensions/IAimpExtensionPlaybackQueue.cs index 1c9ed40f..ac339e01 100644 --- a/src/SDK/AIMP.SDK/SDK/Player/Extensions/IAimpExtensionPlaybackQueue.cs +++ b/src/SDK/AIMP.SDK/SDK/Player/Extensions/IAimpExtensionPlaybackQueue.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/AIMP.SDK/SDK/Player/Extensions/IAimpExtensionPlaybackQueue2.cs b/src/SDK/AIMP.SDK/SDK/Player/Extensions/IAimpExtensionPlaybackQueue2.cs index 655c8e29..8c71878a 100644 --- a/src/SDK/AIMP.SDK/SDK/Player/Extensions/IAimpExtensionPlaybackQueue2.cs +++ b/src/SDK/AIMP.SDK/SDK/Player/Extensions/IAimpExtensionPlaybackQueue2.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/AIMP.SDK/SDK/Player/Extensions/IAimpExtensionPlayerHook.cs b/src/SDK/AIMP.SDK/SDK/Player/Extensions/IAimpExtensionPlayerHook.cs index e5521265..a5c08471 100644 --- a/src/SDK/AIMP.SDK/SDK/Player/Extensions/IAimpExtensionPlayerHook.cs +++ b/src/SDK/AIMP.SDK/SDK/Player/Extensions/IAimpExtensionPlayerHook.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/AIMP.SDK/SDK/Player/Extensions/IAimpExtensionWaveFormProvider.cs b/src/SDK/AIMP.SDK/SDK/Player/Extensions/IAimpExtensionWaveFormProvider.cs index 5d65d511..7d646ce5 100644 --- a/src/SDK/AIMP.SDK/SDK/Player/Extensions/IAimpExtensionWaveFormProvider.cs +++ b/src/SDK/AIMP.SDK/SDK/Player/Extensions/IAimpExtensionWaveFormProvider.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/AIMP.SDK/SDK/Player/IAimpPlaybackQueueService.cs b/src/SDK/AIMP.SDK/SDK/Player/IAimpPlaybackQueueService.cs index aedaa59b..a56f6f90 100644 --- a/src/SDK/AIMP.SDK/SDK/Player/IAimpPlaybackQueueService.cs +++ b/src/SDK/AIMP.SDK/SDK/Player/IAimpPlaybackQueueService.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/AIMP.SDK/SDK/Player/IAimpServicePlaybackQueue2.cs b/src/SDK/AIMP.SDK/SDK/Player/IAimpServicePlaybackQueue2.cs index 6efae692..4c4598d3 100644 --- a/src/SDK/AIMP.SDK/SDK/Player/IAimpServicePlaybackQueue2.cs +++ b/src/SDK/AIMP.SDK/SDK/Player/IAimpServicePlaybackQueue2.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/AIMP.SDK/SDK/Player/IAimpServicePlayer.cs b/src/SDK/AIMP.SDK/SDK/Player/IAimpServicePlayer.cs index 0442b796..da038e8b 100644 --- a/src/SDK/AIMP.SDK/SDK/Player/IAimpServicePlayer.cs +++ b/src/SDK/AIMP.SDK/SDK/Player/IAimpServicePlayer.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/AIMP.SDK/SDK/Player/IAimpServicePlayer2.cs b/src/SDK/AIMP.SDK/SDK/Player/IAimpServicePlayer2.cs index 951afccb..654d8c3f 100644 --- a/src/SDK/AIMP.SDK/SDK/Player/IAimpServicePlayer2.cs +++ b/src/SDK/AIMP.SDK/SDK/Player/IAimpServicePlayer2.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/AIMP.SDK/SDK/Player/IAimpServicePlayerEqualizer.cs b/src/SDK/AIMP.SDK/SDK/Player/IAimpServicePlayerEqualizer.cs index a43a46c8..0762c810 100644 --- a/src/SDK/AIMP.SDK/SDK/Player/IAimpServicePlayerEqualizer.cs +++ b/src/SDK/AIMP.SDK/SDK/Player/IAimpServicePlayerEqualizer.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/AIMP.SDK/SDK/Player/IAimpServicePlayerEqualizerPresets.cs b/src/SDK/AIMP.SDK/SDK/Player/IAimpServicePlayerEqualizerPresets.cs index 2e792d14..07c8b00a 100644 --- a/src/SDK/AIMP.SDK/SDK/Player/IAimpServicePlayerEqualizerPresets.cs +++ b/src/SDK/AIMP.SDK/SDK/Player/IAimpServicePlayerEqualizerPresets.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/AIMP.SDK/SDK/Player/IAimpServiceWaveform.cs b/src/SDK/AIMP.SDK/SDK/Player/IAimpServiceWaveform.cs index 4dcda25c..17f09cd2 100644 --- a/src/SDK/AIMP.SDK/SDK/Player/IAimpServiceWaveform.cs +++ b/src/SDK/AIMP.SDK/SDK/Player/IAimpServiceWaveform.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/AIMP.SDK/SDK/Player/Objects/IAimpEqualizerBands.cs b/src/SDK/AIMP.SDK/SDK/Player/Objects/IAimpEqualizerBands.cs index 22a08da2..9a7b3a6f 100644 --- a/src/SDK/AIMP.SDK/SDK/Player/Objects/IAimpEqualizerBands.cs +++ b/src/SDK/AIMP.SDK/SDK/Player/Objects/IAimpEqualizerBands.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/AIMP.SDK/SDK/Player/Objects/IAimpEqualizerPreset.cs b/src/SDK/AIMP.SDK/SDK/Player/Objects/IAimpEqualizerPreset.cs index dc47451b..818cced2 100644 --- a/src/SDK/AIMP.SDK/SDK/Player/Objects/IAimpEqualizerPreset.cs +++ b/src/SDK/AIMP.SDK/SDK/Player/Objects/IAimpEqualizerPreset.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/AIMP.SDK/SDK/Player/Objects/IAimpPlaybackQueueItem.cs b/src/SDK/AIMP.SDK/SDK/Player/Objects/IAimpPlaybackQueueItem.cs index ec0dfc11..49fc79e3 100644 --- a/src/SDK/AIMP.SDK/SDK/Player/Objects/IAimpPlaybackQueueItem.cs +++ b/src/SDK/AIMP.SDK/SDK/Player/Objects/IAimpPlaybackQueueItem.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/AIMP.SDK/SDK/Player/Objects/IAimpWaveformPeakInfo.cs b/src/SDK/AIMP.SDK/SDK/Player/Objects/IAimpWaveformPeakInfo.cs index 82f36066..8545b16f 100644 --- a/src/SDK/AIMP.SDK/SDK/Player/Objects/IAimpWaveformPeakInfo.cs +++ b/src/SDK/AIMP.SDK/SDK/Player/Objects/IAimpWaveformPeakInfo.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/AIMP.SDK/SDK/Player/PlayFlags.cs b/src/SDK/AIMP.SDK/SDK/Player/PlayFlags.cs index f335a0c8..c58b605f 100644 --- a/src/SDK/AIMP.SDK/SDK/Player/PlayFlags.cs +++ b/src/SDK/AIMP.SDK/SDK/Player/PlayFlags.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/AIMP.SDK/SDK/TagEditor/Extensions/IAimpExtensionTagsProvider.cs b/src/SDK/AIMP.SDK/SDK/TagEditor/Extensions/IAimpExtensionTagsProvider.cs index 1fb1acad..ece99799 100644 --- a/src/SDK/AIMP.SDK/SDK/TagEditor/Extensions/IAimpExtensionTagsProvider.cs +++ b/src/SDK/AIMP.SDK/SDK/TagEditor/Extensions/IAimpExtensionTagsProvider.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/AIMP.SDK/SDK/TagEditor/IAimpFileTag.cs b/src/SDK/AIMP.SDK/SDK/TagEditor/IAimpFileTag.cs index d12fb147..48472aaa 100644 --- a/src/SDK/AIMP.SDK/SDK/TagEditor/IAimpFileTag.cs +++ b/src/SDK/AIMP.SDK/SDK/TagEditor/IAimpFileTag.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/AIMP.SDK/SDK/TagEditor/IAimpFileTagEditor.cs b/src/SDK/AIMP.SDK/SDK/TagEditor/IAimpFileTagEditor.cs index f09915a7..c763b6e2 100644 --- a/src/SDK/AIMP.SDK/SDK/TagEditor/IAimpFileTagEditor.cs +++ b/src/SDK/AIMP.SDK/SDK/TagEditor/IAimpFileTagEditor.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/AIMP.SDK/SDK/TagEditor/IAimpServiceFileTagEditor.cs b/src/SDK/AIMP.SDK/SDK/TagEditor/IAimpServiceFileTagEditor.cs index c8fe181e..a235f677 100644 --- a/src/SDK/AIMP.SDK/SDK/TagEditor/IAimpServiceFileTagEditor.cs +++ b/src/SDK/AIMP.SDK/SDK/TagEditor/IAimpServiceFileTagEditor.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/AIMP.SDK/SDK/TagEditor/IAimpServiceFindTagsOnline.cs b/src/SDK/AIMP.SDK/SDK/TagEditor/IAimpServiceFindTagsOnline.cs index 09aa9afb..d92e00e3 100644 --- a/src/SDK/AIMP.SDK/SDK/TagEditor/IAimpServiceFindTagsOnline.cs +++ b/src/SDK/AIMP.SDK/SDK/TagEditor/IAimpServiceFindTagsOnline.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/AIMP.SDK/SDK/Threading/IAimpServiceSynchronizer.cs b/src/SDK/AIMP.SDK/SDK/Threading/IAimpServiceSynchronizer.cs index 3327be42..82340756 100644 --- a/src/SDK/AIMP.SDK/SDK/Threading/IAimpServiceSynchronizer.cs +++ b/src/SDK/AIMP.SDK/SDK/Threading/IAimpServiceSynchronizer.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/AIMP.SDK/SDK/Threading/IAimpServiceThreadPool.cs b/src/SDK/AIMP.SDK/SDK/Threading/IAimpServiceThreadPool.cs index a66100f9..a58a7b92 100644 --- a/src/SDK/AIMP.SDK/SDK/Threading/IAimpServiceThreadPool.cs +++ b/src/SDK/AIMP.SDK/SDK/Threading/IAimpServiceThreadPool.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/AIMP.SDK/SDK/Threading/IAimpServiceThreads.cs b/src/SDK/AIMP.SDK/SDK/Threading/IAimpServiceThreads.cs index 0e8bf5a9..467e60e6 100644 --- a/src/SDK/AIMP.SDK/SDK/Threading/IAimpServiceThreads.cs +++ b/src/SDK/AIMP.SDK/SDK/Threading/IAimpServiceThreads.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/AIMP.SDK/SDK/Threading/IAimpTask.cs b/src/SDK/AIMP.SDK/SDK/Threading/IAimpTask.cs index 41db7c07..07c9f61b 100644 --- a/src/SDK/AIMP.SDK/SDK/Threading/IAimpTask.cs +++ b/src/SDK/AIMP.SDK/SDK/Threading/IAimpTask.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/AIMP.SDK/SDK/Threading/IAimpTaskOwner.cs b/src/SDK/AIMP.SDK/SDK/Threading/IAimpTaskOwner.cs index d57cd911..e3715923 100644 --- a/src/SDK/AIMP.SDK/SDK/Threading/IAimpTaskOwner.cs +++ b/src/SDK/AIMP.SDK/SDK/Threading/IAimpTaskOwner.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/AIMP.SDK/SDK/Threading/IAimpTaskPriority.cs b/src/SDK/AIMP.SDK/SDK/Threading/IAimpTaskPriority.cs index a3e304ad..837f4d42 100644 --- a/src/SDK/AIMP.SDK/SDK/Threading/IAimpTaskPriority.cs +++ b/src/SDK/AIMP.SDK/SDK/Threading/IAimpTaskPriority.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/AIMP.SDK/SDK/Visuals/AimpVisualData.cs b/src/SDK/AIMP.SDK/SDK/Visuals/AimpVisualData.cs index de36a7d0..c55722bc 100644 --- a/src/SDK/AIMP.SDK/SDK/Visuals/AimpVisualData.cs +++ b/src/SDK/AIMP.SDK/SDK/Visuals/AimpVisualData.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/AIMP.SDK/SDK/Visuals/AimpVisualFlags.cs b/src/SDK/AIMP.SDK/SDK/Visuals/AimpVisualFlags.cs index 4c1ab29f..4af2124d 100644 --- a/src/SDK/AIMP.SDK/SDK/Visuals/AimpVisualFlags.cs +++ b/src/SDK/AIMP.SDK/SDK/Visuals/AimpVisualFlags.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/AIMP.SDK/SDK/Visuals/IAimpExtensionCustomVisualization.cs b/src/SDK/AIMP.SDK/SDK/Visuals/IAimpExtensionCustomVisualization.cs index e32b2677..8f21d956 100644 --- a/src/SDK/AIMP.SDK/SDK/Visuals/IAimpExtensionCustomVisualization.cs +++ b/src/SDK/AIMP.SDK/SDK/Visuals/IAimpExtensionCustomVisualization.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/AIMP.SDK/SDK/Visuals/IAimpExtensionEmbeddedVisualization.cs b/src/SDK/AIMP.SDK/SDK/Visuals/IAimpExtensionEmbeddedVisualization.cs index 287cbc30..cb299fb0 100644 --- a/src/SDK/AIMP.SDK/SDK/Visuals/IAimpExtensionEmbeddedVisualization.cs +++ b/src/SDK/AIMP.SDK/SDK/Visuals/IAimpExtensionEmbeddedVisualization.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/AIMP.SDK/SDK/Visuals/IAimpServiceVisualizations.cs b/src/SDK/AIMP.SDK/SDK/Visuals/IAimpServiceVisualizations.cs index 36315882..d591676e 100644 --- a/src/SDK/AIMP.SDK/SDK/Visuals/IAimpServiceVisualizations.cs +++ b/src/SDK/AIMP.SDK/SDK/Visuals/IAimpServiceVisualizations.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/AIMP.SDK/Win32/IWin32Manager.cs b/src/SDK/AIMP.SDK/Win32/IWin32Manager.cs index 80f88e8b..97097b99 100644 --- a/src/SDK/AIMP.SDK/Win32/IWin32Manager.cs +++ b/src/SDK/AIMP.SDK/Win32/IWin32Manager.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/AIMPSDK/AIMPSDK.h b/src/SDK/aimp_dotnet/AIMPSDK/AIMPSDK.h index 631fb3ac..1ba01eb5 100644 --- a/src/SDK/aimp_dotnet/AIMPSDK/AIMPSDK.h +++ b/src/SDK/aimp_dotnet/AIMPSDK/AIMPSDK.h @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/AimpDotnetPlugin.cpp b/src/SDK/aimp_dotnet/AimpDotnetPlugin.cpp index 8ad372a4..625e671e 100644 --- a/src/SDK/aimp_dotnet/AimpDotnetPlugin.cpp +++ b/src/SDK/aimp_dotnet/AimpDotnetPlugin.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/AimpMemoryManager.cpp b/src/SDK/aimp_dotnet/AimpMemoryManager.cpp index ebd98d05..16681eed 100644 --- a/src/SDK/aimp_dotnet/AimpMemoryManager.cpp +++ b/src/SDK/aimp_dotnet/AimpMemoryManager.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/AimpMemoryManager.h b/src/SDK/aimp_dotnet/AimpMemoryManager.h index c3807e6a..259b64ab 100644 --- a/src/SDK/aimp_dotnet/AimpMemoryManager.h +++ b/src/SDK/aimp_dotnet/AimpMemoryManager.h @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/AimpSdk.h b/src/SDK/aimp_dotnet/AimpSdk.h index 0c9f0ae9..c9fee387 100644 --- a/src/SDK/aimp_dotnet/AimpSdk.h +++ b/src/SDK/aimp_dotnet/AimpSdk.h @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/DotNetPlugin.cpp b/src/SDK/aimp_dotnet/DotNetPlugin.cpp index b2bf94e8..23f6fd8e 100644 --- a/src/SDK/aimp_dotnet/DotNetPlugin.cpp +++ b/src/SDK/aimp_dotnet/DotNetPlugin.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/DotNetPlugin.h b/src/SDK/aimp_dotnet/DotNetPlugin.h index c0eccd53..fb74863f 100644 --- a/src/SDK/aimp_dotnet/DotNetPlugin.h +++ b/src/SDK/aimp_dotnet/DotNetPlugin.h @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/IUnknownInterfaceImpl.h b/src/SDK/aimp_dotnet/IUnknownInterfaceImpl.h index 88637dbf..db07859b 100644 --- a/src/SDK/aimp_dotnet/IUnknownInterfaceImpl.h +++ b/src/SDK/aimp_dotnet/IUnknownInterfaceImpl.h @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/Action/AimpAction.cpp b/src/SDK/aimp_dotnet/SDK/Action/AimpAction.cpp index 3275f98a..72a26577 100644 --- a/src/SDK/aimp_dotnet/SDK/Action/AimpAction.cpp +++ b/src/SDK/aimp_dotnet/SDK/Action/AimpAction.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/Action/AimpAction.h b/src/SDK/aimp_dotnet/SDK/Action/AimpAction.h index eebbcf5a..d218a5c6 100644 --- a/src/SDK/aimp_dotnet/SDK/Action/AimpAction.h +++ b/src/SDK/aimp_dotnet/SDK/Action/AimpAction.h @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/Action/AimpActionEvent.cpp b/src/SDK/aimp_dotnet/SDK/Action/AimpActionEvent.cpp index 16562ca0..f0ee1f96 100644 --- a/src/SDK/aimp_dotnet/SDK/Action/AimpActionEvent.cpp +++ b/src/SDK/aimp_dotnet/SDK/Action/AimpActionEvent.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/Action/AimpActionEvent.h b/src/SDK/aimp_dotnet/SDK/Action/AimpActionEvent.h index e9190d5a..369edc7b 100644 --- a/src/SDK/aimp_dotnet/SDK/Action/AimpActionEvent.h +++ b/src/SDK/aimp_dotnet/SDK/Action/AimpActionEvent.h @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/Action/AimpServiceActionManager.cpp b/src/SDK/aimp_dotnet/SDK/Action/AimpServiceActionManager.cpp index 8accb759..92add4e0 100644 --- a/src/SDK/aimp_dotnet/SDK/Action/AimpServiceActionManager.cpp +++ b/src/SDK/aimp_dotnet/SDK/Action/AimpServiceActionManager.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/Action/AimpServiceActionManager.h b/src/SDK/aimp_dotnet/SDK/Action/AimpServiceActionManager.h index 722ee4e1..6b89958f 100644 --- a/src/SDK/aimp_dotnet/SDK/Action/AimpServiceActionManager.h +++ b/src/SDK/aimp_dotnet/SDK/Action/AimpServiceActionManager.h @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/AimpConfig.cpp b/src/SDK/aimp_dotnet/SDK/AimpConfig.cpp index 32aa399d..9aed1adb 100644 --- a/src/SDK/aimp_dotnet/SDK/AimpConfig.cpp +++ b/src/SDK/aimp_dotnet/SDK/AimpConfig.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/AimpConfig.h b/src/SDK/aimp_dotnet/SDK/AimpConfig.h index 76e66408..18441c57 100644 --- a/src/SDK/aimp_dotnet/SDK/AimpConfig.h +++ b/src/SDK/aimp_dotnet/SDK/AimpConfig.h @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/AimpConverter.cpp b/src/SDK/aimp_dotnet/SDK/AimpConverter.cpp index 3cbc11be..85299ecc 100644 --- a/src/SDK/aimp_dotnet/SDK/AimpConverter.cpp +++ b/src/SDK/aimp_dotnet/SDK/AimpConverter.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/AimpConverter.h b/src/SDK/aimp_dotnet/SDK/AimpConverter.h index a1425800..1cc62763 100644 --- a/src/SDK/aimp_dotnet/SDK/AimpConverter.h +++ b/src/SDK/aimp_dotnet/SDK/AimpConverter.h @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/AimpCore.h b/src/SDK/aimp_dotnet/SDK/AimpCore.h index 7e6476e9..e1c0c68e 100644 --- a/src/SDK/aimp_dotnet/SDK/AimpCore.h +++ b/src/SDK/aimp_dotnet/SDK/AimpCore.h @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/AimpDPIAware.cpp b/src/SDK/aimp_dotnet/SDK/AimpDPIAware.cpp index 5ca4e9f3..a574ed13 100644 --- a/src/SDK/aimp_dotnet/SDK/AimpDPIAware.cpp +++ b/src/SDK/aimp_dotnet/SDK/AimpDPIAware.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/AimpDPIAware.h b/src/SDK/aimp_dotnet/SDK/AimpDPIAware.h index f45c6793..83882fbf 100644 --- a/src/SDK/aimp_dotnet/SDK/AimpDPIAware.h +++ b/src/SDK/aimp_dotnet/SDK/AimpDPIAware.h @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/AimpErrorInfo.cpp b/src/SDK/aimp_dotnet/SDK/AimpErrorInfo.cpp index dccab5ae..a41f2a02 100644 --- a/src/SDK/aimp_dotnet/SDK/AimpErrorInfo.cpp +++ b/src/SDK/aimp_dotnet/SDK/AimpErrorInfo.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/AimpErrorInfo.h b/src/SDK/aimp_dotnet/SDK/AimpErrorInfo.h index 3ebd27a7..0aa367a0 100644 --- a/src/SDK/aimp_dotnet/SDK/AimpErrorInfo.h +++ b/src/SDK/aimp_dotnet/SDK/AimpErrorInfo.h @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/AimpObject.h b/src/SDK/aimp_dotnet/SDK/AimpObject.h index d837d05d..97af0188 100644 --- a/src/SDK/aimp_dotnet/SDK/AimpObject.h +++ b/src/SDK/aimp_dotnet/SDK/AimpObject.h @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/AimpObjectList.cpp b/src/SDK/aimp_dotnet/SDK/AimpObjectList.cpp index 97661d8c..498b493b 100644 --- a/src/SDK/aimp_dotnet/SDK/AimpObjectList.cpp +++ b/src/SDK/aimp_dotnet/SDK/AimpObjectList.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/AimpObjectList.h b/src/SDK/aimp_dotnet/SDK/AimpObjectList.h index 2537a588..056b6d86 100644 --- a/src/SDK/aimp_dotnet/SDK/AimpObjectList.h +++ b/src/SDK/aimp_dotnet/SDK/AimpObjectList.h @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/AimpPlayer.cpp b/src/SDK/aimp_dotnet/SDK/AimpPlayer.cpp index c62b11d6..20057527 100644 --- a/src/SDK/aimp_dotnet/SDK/AimpPlayer.cpp +++ b/src/SDK/aimp_dotnet/SDK/AimpPlayer.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/AimpPlayer.h b/src/SDK/aimp_dotnet/SDK/AimpPlayer.h index d79438d1..4e0f3878 100644 --- a/src/SDK/aimp_dotnet/SDK/AimpPlayer.h +++ b/src/SDK/aimp_dotnet/SDK/AimpPlayer.h @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/AimpProgressCallback.cpp b/src/SDK/aimp_dotnet/SDK/AimpProgressCallback.cpp index 9fd0a05a..5bd050e6 100644 --- a/src/SDK/aimp_dotnet/SDK/AimpProgressCallback.cpp +++ b/src/SDK/aimp_dotnet/SDK/AimpProgressCallback.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/AimpProgressCallback.h b/src/SDK/aimp_dotnet/SDK/AimpProgressCallback.h index e3c18386..fb040423 100644 --- a/src/SDK/aimp_dotnet/SDK/AimpProgressCallback.h +++ b/src/SDK/aimp_dotnet/SDK/AimpProgressCallback.h @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/AimpPropertyList.h b/src/SDK/aimp_dotnet/SDK/AimpPropertyList.h index 6f40f6c3..4936a76d 100644 --- a/src/SDK/aimp_dotnet/SDK/AimpPropertyList.h +++ b/src/SDK/aimp_dotnet/SDK/AimpPropertyList.h @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/AlbumArt/AimpAlbumArtRequest.cpp b/src/SDK/aimp_dotnet/SDK/AlbumArt/AimpAlbumArtRequest.cpp index 518610a4..c0ece131 100644 --- a/src/SDK/aimp_dotnet/SDK/AlbumArt/AimpAlbumArtRequest.cpp +++ b/src/SDK/aimp_dotnet/SDK/AlbumArt/AimpAlbumArtRequest.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/AlbumArt/AimpAlbumArtRequest.h b/src/SDK/aimp_dotnet/SDK/AlbumArt/AimpAlbumArtRequest.h index 44de6f2b..844190ab 100644 --- a/src/SDK/aimp_dotnet/SDK/AlbumArt/AimpAlbumArtRequest.h +++ b/src/SDK/aimp_dotnet/SDK/AlbumArt/AimpAlbumArtRequest.h @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/AlbumArt/AimpAlbumArtSearchOptions.cpp b/src/SDK/aimp_dotnet/SDK/AlbumArt/AimpAlbumArtSearchOptions.cpp index f0ee6a73..414a5831 100644 --- a/src/SDK/aimp_dotnet/SDK/AlbumArt/AimpAlbumArtSearchOptions.cpp +++ b/src/SDK/aimp_dotnet/SDK/AlbumArt/AimpAlbumArtSearchOptions.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/AlbumArt/AimpAlbumArtSearchOptions.h b/src/SDK/aimp_dotnet/SDK/AlbumArt/AimpAlbumArtSearchOptions.h index e81c823b..638c4eee 100644 --- a/src/SDK/aimp_dotnet/SDK/AlbumArt/AimpAlbumArtSearchOptions.h +++ b/src/SDK/aimp_dotnet/SDK/AlbumArt/AimpAlbumArtSearchOptions.h @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/AlbumArt/AimpExtensionAlbumArtCatalog.cpp b/src/SDK/aimp_dotnet/SDK/AlbumArt/AimpExtensionAlbumArtCatalog.cpp index ff1a0e1d..9c90e509 100644 --- a/src/SDK/aimp_dotnet/SDK/AlbumArt/AimpExtensionAlbumArtCatalog.cpp +++ b/src/SDK/aimp_dotnet/SDK/AlbumArt/AimpExtensionAlbumArtCatalog.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/AlbumArt/AimpExtensionAlbumArtCatalog.h b/src/SDK/aimp_dotnet/SDK/AlbumArt/AimpExtensionAlbumArtCatalog.h index de9c9ca0..e39a92c4 100644 --- a/src/SDK/aimp_dotnet/SDK/AlbumArt/AimpExtensionAlbumArtCatalog.h +++ b/src/SDK/aimp_dotnet/SDK/AlbumArt/AimpExtensionAlbumArtCatalog.h @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/AlbumArt/AimpExtensionAlbumArtProvider.cpp b/src/SDK/aimp_dotnet/SDK/AlbumArt/AimpExtensionAlbumArtProvider.cpp index 4902cfb8..117ea5fc 100644 --- a/src/SDK/aimp_dotnet/SDK/AlbumArt/AimpExtensionAlbumArtProvider.cpp +++ b/src/SDK/aimp_dotnet/SDK/AlbumArt/AimpExtensionAlbumArtProvider.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/AlbumArt/AimpExtensionAlbumArtProvider.h b/src/SDK/aimp_dotnet/SDK/AlbumArt/AimpExtensionAlbumArtProvider.h index 9dde4215..94963f8d 100644 --- a/src/SDK/aimp_dotnet/SDK/AlbumArt/AimpExtensionAlbumArtProvider.h +++ b/src/SDK/aimp_dotnet/SDK/AlbumArt/AimpExtensionAlbumArtProvider.h @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/AlbumArt/AimpExtensionAlbumArtProvider3.cpp b/src/SDK/aimp_dotnet/SDK/AlbumArt/AimpExtensionAlbumArtProvider3.cpp index cf99ca84..e62c76bf 100644 --- a/src/SDK/aimp_dotnet/SDK/AlbumArt/AimpExtensionAlbumArtProvider3.cpp +++ b/src/SDK/aimp_dotnet/SDK/AlbumArt/AimpExtensionAlbumArtProvider3.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/AlbumArt/AimpExtensionAlbumArtProvider3.h b/src/SDK/aimp_dotnet/SDK/AlbumArt/AimpExtensionAlbumArtProvider3.h index f33aa524..79e1100a 100644 --- a/src/SDK/aimp_dotnet/SDK/AlbumArt/AimpExtensionAlbumArtProvider3.h +++ b/src/SDK/aimp_dotnet/SDK/AlbumArt/AimpExtensionAlbumArtProvider3.h @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/AlbumArt/AimpServiceAlbumArt.cpp b/src/SDK/aimp_dotnet/SDK/AlbumArt/AimpServiceAlbumArt.cpp index 7257efb2..ac5edbfd 100644 --- a/src/SDK/aimp_dotnet/SDK/AlbumArt/AimpServiceAlbumArt.cpp +++ b/src/SDK/aimp_dotnet/SDK/AlbumArt/AimpServiceAlbumArt.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/AlbumArt/AimpServiceAlbumArt.h b/src/SDK/aimp_dotnet/SDK/AlbumArt/AimpServiceAlbumArt.h index 55656050..7c02c98e 100644 --- a/src/SDK/aimp_dotnet/SDK/AlbumArt/AimpServiceAlbumArt.h +++ b/src/SDK/aimp_dotnet/SDK/AlbumArt/AimpServiceAlbumArt.h @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/AlbumArt/AimpServiceAlbumArtCache.cpp b/src/SDK/aimp_dotnet/SDK/AlbumArt/AimpServiceAlbumArtCache.cpp index 87d0ec1d..84069e55 100644 --- a/src/SDK/aimp_dotnet/SDK/AlbumArt/AimpServiceAlbumArtCache.cpp +++ b/src/SDK/aimp_dotnet/SDK/AlbumArt/AimpServiceAlbumArtCache.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/AlbumArt/AimpServiceAlbumArtCache.h b/src/SDK/aimp_dotnet/SDK/AlbumArt/AimpServiceAlbumArtCache.h index 51ca78e7..07466cac 100644 --- a/src/SDK/aimp_dotnet/SDK/AlbumArt/AimpServiceAlbumArtCache.h +++ b/src/SDK/aimp_dotnet/SDK/AlbumArt/AimpServiceAlbumArtCache.h @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/BaseAimpService.h b/src/SDK/aimp_dotnet/SDK/BaseAimpService.h index e0f6ae1a..10cb5256 100644 --- a/src/SDK/aimp_dotnet/SDK/BaseAimpService.h +++ b/src/SDK/aimp_dotnet/SDK/BaseAimpService.h @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/Configuration/AimpConfigurationManager.cpp b/src/SDK/aimp_dotnet/SDK/Configuration/AimpConfigurationManager.cpp index 371d6455..354dbe32 100644 --- a/src/SDK/aimp_dotnet/SDK/Configuration/AimpConfigurationManager.cpp +++ b/src/SDK/aimp_dotnet/SDK/Configuration/AimpConfigurationManager.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/Configuration/AimpConfigurationManager.h b/src/SDK/aimp_dotnet/SDK/Configuration/AimpConfigurationManager.h index 40221e1c..13c60faf 100644 --- a/src/SDK/aimp_dotnet/SDK/Configuration/AimpConfigurationManager.h +++ b/src/SDK/aimp_dotnet/SDK/Configuration/AimpConfigurationManager.h @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/Core/AimpServiceShutdown.cpp b/src/SDK/aimp_dotnet/SDK/Core/AimpServiceShutdown.cpp index 3b84921b..e865ce4d 100644 --- a/src/SDK/aimp_dotnet/SDK/Core/AimpServiceShutdown.cpp +++ b/src/SDK/aimp_dotnet/SDK/Core/AimpServiceShutdown.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/Core/AimpServiceShutdown.h b/src/SDK/aimp_dotnet/SDK/Core/AimpServiceShutdown.h index 75653b9d..3a27d3d0 100644 --- a/src/SDK/aimp_dotnet/SDK/Core/AimpServiceShutdown.h +++ b/src/SDK/aimp_dotnet/SDK/Core/AimpServiceShutdown.h @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/Core/AimpServiceVersionInfo.cpp b/src/SDK/aimp_dotnet/SDK/Core/AimpServiceVersionInfo.cpp index ec852b8e..45c1ae8b 100644 --- a/src/SDK/aimp_dotnet/SDK/Core/AimpServiceVersionInfo.cpp +++ b/src/SDK/aimp_dotnet/SDK/Core/AimpServiceVersionInfo.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/Core/AimpServiceVersionInfo.h b/src/SDK/aimp_dotnet/SDK/Core/AimpServiceVersionInfo.h index 6b41c604..548ff900 100644 --- a/src/SDK/aimp_dotnet/SDK/Core/AimpServiceVersionInfo.h +++ b/src/SDK/aimp_dotnet/SDK/Core/AimpServiceVersionInfo.h @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/FileManager/AimpFileInfo.cpp b/src/SDK/aimp_dotnet/SDK/FileManager/AimpFileInfo.cpp index 06604bab..4c7c6d07 100644 --- a/src/SDK/aimp_dotnet/SDK/FileManager/AimpFileInfo.cpp +++ b/src/SDK/aimp_dotnet/SDK/FileManager/AimpFileInfo.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/FileManager/AimpFileInfo.h b/src/SDK/aimp_dotnet/SDK/FileManager/AimpFileInfo.h index 31f4667e..c2acb2b0 100644 --- a/src/SDK/aimp_dotnet/SDK/FileManager/AimpFileInfo.h +++ b/src/SDK/aimp_dotnet/SDK/FileManager/AimpFileInfo.h @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/FileManager/AimpServiceFileFormats.cpp b/src/SDK/aimp_dotnet/SDK/FileManager/AimpServiceFileFormats.cpp index 9149f82a..322c4c9b 100644 --- a/src/SDK/aimp_dotnet/SDK/FileManager/AimpServiceFileFormats.cpp +++ b/src/SDK/aimp_dotnet/SDK/FileManager/AimpServiceFileFormats.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/FileManager/AimpServiceFileFormats.h b/src/SDK/aimp_dotnet/SDK/FileManager/AimpServiceFileFormats.h index f4ea7b01..47fc170c 100644 --- a/src/SDK/aimp_dotnet/SDK/FileManager/AimpServiceFileFormats.h +++ b/src/SDK/aimp_dotnet/SDK/FileManager/AimpServiceFileFormats.h @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/FileManager/AimpServiceFileInfo.cpp b/src/SDK/aimp_dotnet/SDK/FileManager/AimpServiceFileInfo.cpp index 5dc3dabd..d6908be3 100644 --- a/src/SDK/aimp_dotnet/SDK/FileManager/AimpServiceFileInfo.cpp +++ b/src/SDK/aimp_dotnet/SDK/FileManager/AimpServiceFileInfo.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/FileManager/AimpServiceFileInfo.h b/src/SDK/aimp_dotnet/SDK/FileManager/AimpServiceFileInfo.h index a12f4a18..2eb0dff8 100644 --- a/src/SDK/aimp_dotnet/SDK/FileManager/AimpServiceFileInfo.h +++ b/src/SDK/aimp_dotnet/SDK/FileManager/AimpServiceFileInfo.h @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/FileManager/AimpServiceFileInfoFormatter.cpp b/src/SDK/aimp_dotnet/SDK/FileManager/AimpServiceFileInfoFormatter.cpp index b1f08e7b..1b6b43ae 100644 --- a/src/SDK/aimp_dotnet/SDK/FileManager/AimpServiceFileInfoFormatter.cpp +++ b/src/SDK/aimp_dotnet/SDK/FileManager/AimpServiceFileInfoFormatter.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/FileManager/AimpServiceFileInfoFormatter.h b/src/SDK/aimp_dotnet/SDK/FileManager/AimpServiceFileInfoFormatter.h index ef7a4047..474d48d6 100644 --- a/src/SDK/aimp_dotnet/SDK/FileManager/AimpServiceFileInfoFormatter.h +++ b/src/SDK/aimp_dotnet/SDK/FileManager/AimpServiceFileInfoFormatter.h @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/FileManager/AimpServiceFileInfoFormatterUtils.cpp b/src/SDK/aimp_dotnet/SDK/FileManager/AimpServiceFileInfoFormatterUtils.cpp index 460fbf3c..5f700a75 100644 --- a/src/SDK/aimp_dotnet/SDK/FileManager/AimpServiceFileInfoFormatterUtils.cpp +++ b/src/SDK/aimp_dotnet/SDK/FileManager/AimpServiceFileInfoFormatterUtils.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/FileManager/AimpServiceFileInfoFormatterUtils.h b/src/SDK/aimp_dotnet/SDK/FileManager/AimpServiceFileInfoFormatterUtils.h index 0a40439e..3ee24fdb 100644 --- a/src/SDK/aimp_dotnet/SDK/FileManager/AimpServiceFileInfoFormatterUtils.h +++ b/src/SDK/aimp_dotnet/SDK/FileManager/AimpServiceFileInfoFormatterUtils.h @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/FileManager/AimpServiceFileStreaming.cpp b/src/SDK/aimp_dotnet/SDK/FileManager/AimpServiceFileStreaming.cpp index f913dec7..cec237a5 100644 --- a/src/SDK/aimp_dotnet/SDK/FileManager/AimpServiceFileStreaming.cpp +++ b/src/SDK/aimp_dotnet/SDK/FileManager/AimpServiceFileStreaming.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/FileManager/AimpServiceFileStreaming.h b/src/SDK/aimp_dotnet/SDK/FileManager/AimpServiceFileStreaming.h index eaefca45..cab964bb 100644 --- a/src/SDK/aimp_dotnet/SDK/FileManager/AimpServiceFileStreaming.h +++ b/src/SDK/aimp_dotnet/SDK/FileManager/AimpServiceFileStreaming.h @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/FileManager/AimpServiceFileSystems.cpp b/src/SDK/aimp_dotnet/SDK/FileManager/AimpServiceFileSystems.cpp index 0bab423d..9343d9f2 100644 --- a/src/SDK/aimp_dotnet/SDK/FileManager/AimpServiceFileSystems.cpp +++ b/src/SDK/aimp_dotnet/SDK/FileManager/AimpServiceFileSystems.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/FileManager/AimpServiceFileSystems.h b/src/SDK/aimp_dotnet/SDK/FileManager/AimpServiceFileSystems.h index f092a5f1..f15c1862 100644 --- a/src/SDK/aimp_dotnet/SDK/FileManager/AimpServiceFileSystems.h +++ b/src/SDK/aimp_dotnet/SDK/FileManager/AimpServiceFileSystems.h @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/FileManager/AimpVirtualFile.cpp b/src/SDK/aimp_dotnet/SDK/FileManager/AimpVirtualFile.cpp index b3dfd6e2..3965beab 100644 --- a/src/SDK/aimp_dotnet/SDK/FileManager/AimpVirtualFile.cpp +++ b/src/SDK/aimp_dotnet/SDK/FileManager/AimpVirtualFile.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/FileManager/AimpVirtualFile.h b/src/SDK/aimp_dotnet/SDK/FileManager/AimpVirtualFile.h index ceed5ca0..7285f664 100644 --- a/src/SDK/aimp_dotnet/SDK/FileManager/AimpVirtualFile.h +++ b/src/SDK/aimp_dotnet/SDK/FileManager/AimpVirtualFile.h @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/FileManager/Commands/AimpFileSystemCommandCopyToClipboard.cpp b/src/SDK/aimp_dotnet/SDK/FileManager/Commands/AimpFileSystemCommandCopyToClipboard.cpp index 621042ee..920b3e02 100644 --- a/src/SDK/aimp_dotnet/SDK/FileManager/Commands/AimpFileSystemCommandCopyToClipboard.cpp +++ b/src/SDK/aimp_dotnet/SDK/FileManager/Commands/AimpFileSystemCommandCopyToClipboard.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/FileManager/Commands/AimpFileSystemCommandCopyToClipboard.h b/src/SDK/aimp_dotnet/SDK/FileManager/Commands/AimpFileSystemCommandCopyToClipboard.h index f803c264..fe9b4d5f 100644 --- a/src/SDK/aimp_dotnet/SDK/FileManager/Commands/AimpFileSystemCommandCopyToClipboard.h +++ b/src/SDK/aimp_dotnet/SDK/FileManager/Commands/AimpFileSystemCommandCopyToClipboard.h @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/FileManager/Commands/AimpFileSystemCommandDelete.cpp b/src/SDK/aimp_dotnet/SDK/FileManager/Commands/AimpFileSystemCommandDelete.cpp index 28380304..46704bd6 100644 --- a/src/SDK/aimp_dotnet/SDK/FileManager/Commands/AimpFileSystemCommandDelete.cpp +++ b/src/SDK/aimp_dotnet/SDK/FileManager/Commands/AimpFileSystemCommandDelete.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/FileManager/Commands/AimpFileSystemCommandDelete.h b/src/SDK/aimp_dotnet/SDK/FileManager/Commands/AimpFileSystemCommandDelete.h index 712435ce..f3675af4 100644 --- a/src/SDK/aimp_dotnet/SDK/FileManager/Commands/AimpFileSystemCommandDelete.h +++ b/src/SDK/aimp_dotnet/SDK/FileManager/Commands/AimpFileSystemCommandDelete.h @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/FileManager/Commands/AimpFileSystemCommandDropSource.cpp b/src/SDK/aimp_dotnet/SDK/FileManager/Commands/AimpFileSystemCommandDropSource.cpp index ecfa6125..f3f46718 100644 --- a/src/SDK/aimp_dotnet/SDK/FileManager/Commands/AimpFileSystemCommandDropSource.cpp +++ b/src/SDK/aimp_dotnet/SDK/FileManager/Commands/AimpFileSystemCommandDropSource.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/FileManager/Commands/AimpFileSystemCommandDropSource.h b/src/SDK/aimp_dotnet/SDK/FileManager/Commands/AimpFileSystemCommandDropSource.h index 42d138d7..44e927e0 100644 --- a/src/SDK/aimp_dotnet/SDK/FileManager/Commands/AimpFileSystemCommandDropSource.h +++ b/src/SDK/aimp_dotnet/SDK/FileManager/Commands/AimpFileSystemCommandDropSource.h @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/FileManager/Commands/AimpFileSystemCommandFileInfo.cpp b/src/SDK/aimp_dotnet/SDK/FileManager/Commands/AimpFileSystemCommandFileInfo.cpp index 3311ecff..8d6c20bb 100644 --- a/src/SDK/aimp_dotnet/SDK/FileManager/Commands/AimpFileSystemCommandFileInfo.cpp +++ b/src/SDK/aimp_dotnet/SDK/FileManager/Commands/AimpFileSystemCommandFileInfo.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/FileManager/Commands/AimpFileSystemCommandFileInfo.h b/src/SDK/aimp_dotnet/SDK/FileManager/Commands/AimpFileSystemCommandFileInfo.h index cc181428..6e4c9190 100644 --- a/src/SDK/aimp_dotnet/SDK/FileManager/Commands/AimpFileSystemCommandFileInfo.h +++ b/src/SDK/aimp_dotnet/SDK/FileManager/Commands/AimpFileSystemCommandFileInfo.h @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/FileManager/Commands/AimpFileSystemCommandOpenFileFolder.cpp b/src/SDK/aimp_dotnet/SDK/FileManager/Commands/AimpFileSystemCommandOpenFileFolder.cpp index a74c2cb2..bfc62e0b 100644 --- a/src/SDK/aimp_dotnet/SDK/FileManager/Commands/AimpFileSystemCommandOpenFileFolder.cpp +++ b/src/SDK/aimp_dotnet/SDK/FileManager/Commands/AimpFileSystemCommandOpenFileFolder.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/FileManager/Commands/AimpFileSystemCommandOpenFileFolder.h b/src/SDK/aimp_dotnet/SDK/FileManager/Commands/AimpFileSystemCommandOpenFileFolder.h index c18c90d6..7c6fc163 100644 --- a/src/SDK/aimp_dotnet/SDK/FileManager/Commands/AimpFileSystemCommandOpenFileFolder.h +++ b/src/SDK/aimp_dotnet/SDK/FileManager/Commands/AimpFileSystemCommandOpenFileFolder.h @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/FileManager/Commands/AimpFileSystemCommandStreaming.cpp b/src/SDK/aimp_dotnet/SDK/FileManager/Commands/AimpFileSystemCommandStreaming.cpp index 49dda09e..8db590c4 100644 --- a/src/SDK/aimp_dotnet/SDK/FileManager/Commands/AimpFileSystemCommandStreaming.cpp +++ b/src/SDK/aimp_dotnet/SDK/FileManager/Commands/AimpFileSystemCommandStreaming.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/FileManager/Commands/AimpFileSystemCommandStreaming.h b/src/SDK/aimp_dotnet/SDK/FileManager/Commands/AimpFileSystemCommandStreaming.h index bf7d0f0d..427e8120 100644 --- a/src/SDK/aimp_dotnet/SDK/FileManager/Commands/AimpFileSystemCommandStreaming.h +++ b/src/SDK/aimp_dotnet/SDK/FileManager/Commands/AimpFileSystemCommandStreaming.h @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/FileManager/Commands/Internal/InternalAimpFileSystemCommandCopyToClipboard.cpp b/src/SDK/aimp_dotnet/SDK/FileManager/Commands/Internal/InternalAimpFileSystemCommandCopyToClipboard.cpp index 8c9c75f3..13333814 100644 --- a/src/SDK/aimp_dotnet/SDK/FileManager/Commands/Internal/InternalAimpFileSystemCommandCopyToClipboard.cpp +++ b/src/SDK/aimp_dotnet/SDK/FileManager/Commands/Internal/InternalAimpFileSystemCommandCopyToClipboard.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/FileManager/Commands/Internal/InternalAimpFileSystemCommandCopyToClipboard.h b/src/SDK/aimp_dotnet/SDK/FileManager/Commands/Internal/InternalAimpFileSystemCommandCopyToClipboard.h index 3965a847..123833c1 100644 --- a/src/SDK/aimp_dotnet/SDK/FileManager/Commands/Internal/InternalAimpFileSystemCommandCopyToClipboard.h +++ b/src/SDK/aimp_dotnet/SDK/FileManager/Commands/Internal/InternalAimpFileSystemCommandCopyToClipboard.h @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/FileManager/Commands/Internal/InternalAimpFileSystemCommandDelete.cpp b/src/SDK/aimp_dotnet/SDK/FileManager/Commands/Internal/InternalAimpFileSystemCommandDelete.cpp index a446c5b5..b2c972e2 100644 --- a/src/SDK/aimp_dotnet/SDK/FileManager/Commands/Internal/InternalAimpFileSystemCommandDelete.cpp +++ b/src/SDK/aimp_dotnet/SDK/FileManager/Commands/Internal/InternalAimpFileSystemCommandDelete.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/FileManager/Commands/Internal/InternalAimpFileSystemCommandDelete.h b/src/SDK/aimp_dotnet/SDK/FileManager/Commands/Internal/InternalAimpFileSystemCommandDelete.h index 94eaff31..75f6116d 100644 --- a/src/SDK/aimp_dotnet/SDK/FileManager/Commands/Internal/InternalAimpFileSystemCommandDelete.h +++ b/src/SDK/aimp_dotnet/SDK/FileManager/Commands/Internal/InternalAimpFileSystemCommandDelete.h @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/FileManager/Commands/Internal/InternalAimpFileSystemCommandDropSource.cpp b/src/SDK/aimp_dotnet/SDK/FileManager/Commands/Internal/InternalAimpFileSystemCommandDropSource.cpp index 21c97676..975de16f 100644 --- a/src/SDK/aimp_dotnet/SDK/FileManager/Commands/Internal/InternalAimpFileSystemCommandDropSource.cpp +++ b/src/SDK/aimp_dotnet/SDK/FileManager/Commands/Internal/InternalAimpFileSystemCommandDropSource.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/FileManager/Commands/Internal/InternalAimpFileSystemCommandDropSource.h b/src/SDK/aimp_dotnet/SDK/FileManager/Commands/Internal/InternalAimpFileSystemCommandDropSource.h index f38e15b4..32642f3b 100644 --- a/src/SDK/aimp_dotnet/SDK/FileManager/Commands/Internal/InternalAimpFileSystemCommandDropSource.h +++ b/src/SDK/aimp_dotnet/SDK/FileManager/Commands/Internal/InternalAimpFileSystemCommandDropSource.h @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/FileManager/Commands/Internal/InternalAimpFileSystemCommandFileInfo.cpp b/src/SDK/aimp_dotnet/SDK/FileManager/Commands/Internal/InternalAimpFileSystemCommandFileInfo.cpp index 21d494ed..d5a68e46 100644 --- a/src/SDK/aimp_dotnet/SDK/FileManager/Commands/Internal/InternalAimpFileSystemCommandFileInfo.cpp +++ b/src/SDK/aimp_dotnet/SDK/FileManager/Commands/Internal/InternalAimpFileSystemCommandFileInfo.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/FileManager/Commands/Internal/InternalAimpFileSystemCommandFileInfo.h b/src/SDK/aimp_dotnet/SDK/FileManager/Commands/Internal/InternalAimpFileSystemCommandFileInfo.h index dc10d1a5..3d8491af 100644 --- a/src/SDK/aimp_dotnet/SDK/FileManager/Commands/Internal/InternalAimpFileSystemCommandFileInfo.h +++ b/src/SDK/aimp_dotnet/SDK/FileManager/Commands/Internal/InternalAimpFileSystemCommandFileInfo.h @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/FileManager/Commands/Internal/InternalAimpFileSystemCommandOpenFileFolder.cpp b/src/SDK/aimp_dotnet/SDK/FileManager/Commands/Internal/InternalAimpFileSystemCommandOpenFileFolder.cpp index bb99dd42..5f937a46 100644 --- a/src/SDK/aimp_dotnet/SDK/FileManager/Commands/Internal/InternalAimpFileSystemCommandOpenFileFolder.cpp +++ b/src/SDK/aimp_dotnet/SDK/FileManager/Commands/Internal/InternalAimpFileSystemCommandOpenFileFolder.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/FileManager/Commands/Internal/InternalAimpFileSystemCommandOpenFileFolder.h b/src/SDK/aimp_dotnet/SDK/FileManager/Commands/Internal/InternalAimpFileSystemCommandOpenFileFolder.h index 73ca20a2..6e1d8437 100644 --- a/src/SDK/aimp_dotnet/SDK/FileManager/Commands/Internal/InternalAimpFileSystemCommandOpenFileFolder.h +++ b/src/SDK/aimp_dotnet/SDK/FileManager/Commands/Internal/InternalAimpFileSystemCommandOpenFileFolder.h @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/FileManager/Commands/Internal/InternalAimpFileSystemCommandStreaming.cpp b/src/SDK/aimp_dotnet/SDK/FileManager/Commands/Internal/InternalAimpFileSystemCommandStreaming.cpp index 0356fce7..c86d4ff6 100644 --- a/src/SDK/aimp_dotnet/SDK/FileManager/Commands/Internal/InternalAimpFileSystemCommandStreaming.cpp +++ b/src/SDK/aimp_dotnet/SDK/FileManager/Commands/Internal/InternalAimpFileSystemCommandStreaming.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/FileManager/Commands/Internal/InternalAimpFileSystemCommandStreaming.h b/src/SDK/aimp_dotnet/SDK/FileManager/Commands/Internal/InternalAimpFileSystemCommandStreaming.h index 3d0d5c82..fc3be686 100644 --- a/src/SDK/aimp_dotnet/SDK/FileManager/Commands/Internal/InternalAimpFileSystemCommandStreaming.h +++ b/src/SDK/aimp_dotnet/SDK/FileManager/Commands/Internal/InternalAimpFileSystemCommandStreaming.h @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/FileManager/Commands/Internal/InternalAimpFileSystemCustomFileCommand.cpp b/src/SDK/aimp_dotnet/SDK/FileManager/Commands/Internal/InternalAimpFileSystemCustomFileCommand.cpp index 6bdced34..e314383f 100644 --- a/src/SDK/aimp_dotnet/SDK/FileManager/Commands/Internal/InternalAimpFileSystemCustomFileCommand.cpp +++ b/src/SDK/aimp_dotnet/SDK/FileManager/Commands/Internal/InternalAimpFileSystemCustomFileCommand.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/FileManager/Commands/Internal/InternalAimpFileSystemCustomFileCommand.h b/src/SDK/aimp_dotnet/SDK/FileManager/Commands/Internal/InternalAimpFileSystemCustomFileCommand.h index 8b7f883c..27042b29 100644 --- a/src/SDK/aimp_dotnet/SDK/FileManager/Commands/Internal/InternalAimpFileSystemCustomFileCommand.h +++ b/src/SDK/aimp_dotnet/SDK/FileManager/Commands/Internal/InternalAimpFileSystemCustomFileCommand.h @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/FileManager/Commands/Internal/Stdafx.h b/src/SDK/aimp_dotnet/SDK/FileManager/Commands/Internal/Stdafx.h index 1da2b4d1..f36c9702 100644 --- a/src/SDK/aimp_dotnet/SDK/FileManager/Commands/Internal/Stdafx.h +++ b/src/SDK/aimp_dotnet/SDK/FileManager/Commands/Internal/Stdafx.h @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/FileManager/Commands/Stdafx.h b/src/SDK/aimp_dotnet/SDK/FileManager/Commands/Stdafx.h index 1da2b4d1..f36c9702 100644 --- a/src/SDK/aimp_dotnet/SDK/FileManager/Commands/Stdafx.h +++ b/src/SDK/aimp_dotnet/SDK/FileManager/Commands/Stdafx.h @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/FileManager/Extensions/InternalAimpExtensionFileExpander.cpp b/src/SDK/aimp_dotnet/SDK/FileManager/Extensions/InternalAimpExtensionFileExpander.cpp index e2459b02..77a89ff2 100644 --- a/src/SDK/aimp_dotnet/SDK/FileManager/Extensions/InternalAimpExtensionFileExpander.cpp +++ b/src/SDK/aimp_dotnet/SDK/FileManager/Extensions/InternalAimpExtensionFileExpander.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/FileManager/Extensions/InternalAimpExtensionFileExpander.h b/src/SDK/aimp_dotnet/SDK/FileManager/Extensions/InternalAimpExtensionFileExpander.h index 4f64c68a..c321a067 100644 --- a/src/SDK/aimp_dotnet/SDK/FileManager/Extensions/InternalAimpExtensionFileExpander.h +++ b/src/SDK/aimp_dotnet/SDK/FileManager/Extensions/InternalAimpExtensionFileExpander.h @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/FileManager/Extensions/InternalAimpExtensionFileFormat.cpp b/src/SDK/aimp_dotnet/SDK/FileManager/Extensions/InternalAimpExtensionFileFormat.cpp index ead87d56..3896a40f 100644 --- a/src/SDK/aimp_dotnet/SDK/FileManager/Extensions/InternalAimpExtensionFileFormat.cpp +++ b/src/SDK/aimp_dotnet/SDK/FileManager/Extensions/InternalAimpExtensionFileFormat.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/FileManager/Extensions/InternalAimpExtensionFileFormat.h b/src/SDK/aimp_dotnet/SDK/FileManager/Extensions/InternalAimpExtensionFileFormat.h index b56ea84e..9eaeb9a7 100644 --- a/src/SDK/aimp_dotnet/SDK/FileManager/Extensions/InternalAimpExtensionFileFormat.h +++ b/src/SDK/aimp_dotnet/SDK/FileManager/Extensions/InternalAimpExtensionFileFormat.h @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/FileManager/Extensions/InternalAimpExtensionFileInfoProvider.cpp b/src/SDK/aimp_dotnet/SDK/FileManager/Extensions/InternalAimpExtensionFileInfoProvider.cpp index 4d010e62..73d6ba0a 100644 --- a/src/SDK/aimp_dotnet/SDK/FileManager/Extensions/InternalAimpExtensionFileInfoProvider.cpp +++ b/src/SDK/aimp_dotnet/SDK/FileManager/Extensions/InternalAimpExtensionFileInfoProvider.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/FileManager/Extensions/InternalAimpExtensionFileInfoProvider.h b/src/SDK/aimp_dotnet/SDK/FileManager/Extensions/InternalAimpExtensionFileInfoProvider.h index af998ccc..aad8224c 100644 --- a/src/SDK/aimp_dotnet/SDK/FileManager/Extensions/InternalAimpExtensionFileInfoProvider.h +++ b/src/SDK/aimp_dotnet/SDK/FileManager/Extensions/InternalAimpExtensionFileInfoProvider.h @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/FileManager/Extensions/InternalAimpExtensionFileSystem.cpp b/src/SDK/aimp_dotnet/SDK/FileManager/Extensions/InternalAimpExtensionFileSystem.cpp index f869e5d5..d786153a 100644 --- a/src/SDK/aimp_dotnet/SDK/FileManager/Extensions/InternalAimpExtensionFileSystem.cpp +++ b/src/SDK/aimp_dotnet/SDK/FileManager/Extensions/InternalAimpExtensionFileSystem.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/FileManager/Extensions/InternalAimpExtensionFileSystem.h b/src/SDK/aimp_dotnet/SDK/FileManager/Extensions/InternalAimpExtensionFileSystem.h index fafa9741..20f1fb76 100644 --- a/src/SDK/aimp_dotnet/SDK/FileManager/Extensions/InternalAimpExtensionFileSystem.h +++ b/src/SDK/aimp_dotnet/SDK/FileManager/Extensions/InternalAimpExtensionFileSystem.h @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/FileManager/Services/AimpServiceFileURI.cpp b/src/SDK/aimp_dotnet/SDK/FileManager/Services/AimpServiceFileURI.cpp index 09d82eb6..a3cade6a 100644 --- a/src/SDK/aimp_dotnet/SDK/FileManager/Services/AimpServiceFileURI.cpp +++ b/src/SDK/aimp_dotnet/SDK/FileManager/Services/AimpServiceFileURI.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/FileManager/Services/AimpServiceFileURI.h b/src/SDK/aimp_dotnet/SDK/FileManager/Services/AimpServiceFileURI.h index 9189599c..84bef273 100644 --- a/src/SDK/aimp_dotnet/SDK/FileManager/Services/AimpServiceFileURI.h +++ b/src/SDK/aimp_dotnet/SDK/FileManager/Services/AimpServiceFileURI.h @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/FileManager/Services/AimpServiceFileURI2.cpp b/src/SDK/aimp_dotnet/SDK/FileManager/Services/AimpServiceFileURI2.cpp index bb083cfc..772b009e 100644 --- a/src/SDK/aimp_dotnet/SDK/FileManager/Services/AimpServiceFileURI2.cpp +++ b/src/SDK/aimp_dotnet/SDK/FileManager/Services/AimpServiceFileURI2.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/FileManager/Services/AimpServiceFileURI2.h b/src/SDK/aimp_dotnet/SDK/FileManager/Services/AimpServiceFileURI2.h index ce10006f..c6e71a1e 100644 --- a/src/SDK/aimp_dotnet/SDK/FileManager/Services/AimpServiceFileURI2.h +++ b/src/SDK/aimp_dotnet/SDK/FileManager/Services/AimpServiceFileURI2.h @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/Lyrics/AimpExtensionLyricsProvider.cpp b/src/SDK/aimp_dotnet/SDK/Lyrics/AimpExtensionLyricsProvider.cpp index d98bed91..b4244798 100644 --- a/src/SDK/aimp_dotnet/SDK/Lyrics/AimpExtensionLyricsProvider.cpp +++ b/src/SDK/aimp_dotnet/SDK/Lyrics/AimpExtensionLyricsProvider.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/Lyrics/AimpExtensionLyricsProvider.h b/src/SDK/aimp_dotnet/SDK/Lyrics/AimpExtensionLyricsProvider.h index 4b6f9be9..61641a81 100644 --- a/src/SDK/aimp_dotnet/SDK/Lyrics/AimpExtensionLyricsProvider.h +++ b/src/SDK/aimp_dotnet/SDK/Lyrics/AimpExtensionLyricsProvider.h @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/Lyrics/AimpLyrics.cpp b/src/SDK/aimp_dotnet/SDK/Lyrics/AimpLyrics.cpp index c7282d40..5babc079 100644 --- a/src/SDK/aimp_dotnet/SDK/Lyrics/AimpLyrics.cpp +++ b/src/SDK/aimp_dotnet/SDK/Lyrics/AimpLyrics.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/Lyrics/AimpLyrics.h b/src/SDK/aimp_dotnet/SDK/Lyrics/AimpLyrics.h index dafd8f03..777cb526 100644 --- a/src/SDK/aimp_dotnet/SDK/Lyrics/AimpLyrics.h +++ b/src/SDK/aimp_dotnet/SDK/Lyrics/AimpLyrics.h @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/Lyrics/AimpServiceLyrics.cpp b/src/SDK/aimp_dotnet/SDK/Lyrics/AimpServiceLyrics.cpp index 0c931e59..3b23e358 100644 --- a/src/SDK/aimp_dotnet/SDK/Lyrics/AimpServiceLyrics.cpp +++ b/src/SDK/aimp_dotnet/SDK/Lyrics/AimpServiceLyrics.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/Lyrics/AimpServiceLyrics.h b/src/SDK/aimp_dotnet/SDK/Lyrics/AimpServiceLyrics.h index 679a5b69..4480a1a5 100644 --- a/src/SDK/aimp_dotnet/SDK/Lyrics/AimpServiceLyrics.h +++ b/src/SDK/aimp_dotnet/SDK/Lyrics/AimpServiceLyrics.h @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/MUI/AimpMIUManager.h b/src/SDK/aimp_dotnet/SDK/MUI/AimpMIUManager.h index c0bc07c0..bf6a7ce4 100644 --- a/src/SDK/aimp_dotnet/SDK/MUI/AimpMIUManager.h +++ b/src/SDK/aimp_dotnet/SDK/MUI/AimpMIUManager.h @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/MUI/AimpServiceMUI.cpp b/src/SDK/aimp_dotnet/SDK/MUI/AimpServiceMUI.cpp index c84524db..864685bd 100644 --- a/src/SDK/aimp_dotnet/SDK/MUI/AimpServiceMUI.cpp +++ b/src/SDK/aimp_dotnet/SDK/MUI/AimpServiceMUI.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/MUI/AimpServiceMUI.h b/src/SDK/aimp_dotnet/SDK/MUI/AimpServiceMUI.h index c0b1e6e1..78def84d 100644 --- a/src/SDK/aimp_dotnet/SDK/MUI/AimpServiceMUI.h +++ b/src/SDK/aimp_dotnet/SDK/MUI/AimpServiceMUI.h @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/ManagedAimpCore.cpp b/src/SDK/aimp_dotnet/SDK/ManagedAimpCore.cpp index 7ebadbc2..bea27b0b 100644 --- a/src/SDK/aimp_dotnet/SDK/ManagedAimpCore.cpp +++ b/src/SDK/aimp_dotnet/SDK/ManagedAimpCore.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/ManagedAimpCore.h b/src/SDK/aimp_dotnet/SDK/ManagedAimpCore.h index c775b256..56eb31c2 100644 --- a/src/SDK/aimp_dotnet/SDK/ManagedAimpCore.h +++ b/src/SDK/aimp_dotnet/SDK/ManagedAimpCore.h @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/Menu/AimpMenuItem.cpp b/src/SDK/aimp_dotnet/SDK/Menu/AimpMenuItem.cpp index a3152b6a..f22abfdb 100644 --- a/src/SDK/aimp_dotnet/SDK/Menu/AimpMenuItem.cpp +++ b/src/SDK/aimp_dotnet/SDK/Menu/AimpMenuItem.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/Menu/AimpMenuItem.h b/src/SDK/aimp_dotnet/SDK/Menu/AimpMenuItem.h index aa07b777..0a6c6105 100644 --- a/src/SDK/aimp_dotnet/SDK/Menu/AimpMenuItem.h +++ b/src/SDK/aimp_dotnet/SDK/Menu/AimpMenuItem.h @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/Menu/AimpServiceMenuManager.cpp b/src/SDK/aimp_dotnet/SDK/Menu/AimpServiceMenuManager.cpp index 3fdd0551..b001fd78 100644 --- a/src/SDK/aimp_dotnet/SDK/Menu/AimpServiceMenuManager.cpp +++ b/src/SDK/aimp_dotnet/SDK/Menu/AimpServiceMenuManager.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/Menu/AimpServiceMenuManager.h b/src/SDK/aimp_dotnet/SDK/Menu/AimpServiceMenuManager.h index bd616669..c054c23a 100644 --- a/src/SDK/aimp_dotnet/SDK/Menu/AimpServiceMenuManager.h +++ b/src/SDK/aimp_dotnet/SDK/Menu/AimpServiceMenuManager.h @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/MessageDispatcher/AimpServiceMessageDispatcher.cpp b/src/SDK/aimp_dotnet/SDK/MessageDispatcher/AimpServiceMessageDispatcher.cpp index 1491bcf9..523a5c97 100644 --- a/src/SDK/aimp_dotnet/SDK/MessageDispatcher/AimpServiceMessageDispatcher.cpp +++ b/src/SDK/aimp_dotnet/SDK/MessageDispatcher/AimpServiceMessageDispatcher.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/MessageDispatcher/AimpServiceMessageDispatcher.h b/src/SDK/aimp_dotnet/SDK/MessageDispatcher/AimpServiceMessageDispatcher.h index 5dfeb15f..7028d141 100644 --- a/src/SDK/aimp_dotnet/SDK/MessageDispatcher/AimpServiceMessageDispatcher.h +++ b/src/SDK/aimp_dotnet/SDK/MessageDispatcher/AimpServiceMessageDispatcher.h @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/MessageDispatcher/InternalAimpMessageHook.cpp b/src/SDK/aimp_dotnet/SDK/MessageDispatcher/InternalAimpMessageHook.cpp index 01f96384..d9f9105f 100644 --- a/src/SDK/aimp_dotnet/SDK/MessageDispatcher/InternalAimpMessageHook.cpp +++ b/src/SDK/aimp_dotnet/SDK/MessageDispatcher/InternalAimpMessageHook.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/MessageDispatcher/InternalAimpMessageHook.h b/src/SDK/aimp_dotnet/SDK/MessageDispatcher/InternalAimpMessageHook.h index f72830c1..d8988272 100644 --- a/src/SDK/aimp_dotnet/SDK/MessageDispatcher/InternalAimpMessageHook.h +++ b/src/SDK/aimp_dotnet/SDK/MessageDispatcher/InternalAimpMessageHook.h @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/MusicLibrary/AimpDataStorage2.h b/src/SDK/aimp_dotnet/SDK/MusicLibrary/AimpDataStorage2.h index 25d31613..0983df70 100644 --- a/src/SDK/aimp_dotnet/SDK/MusicLibrary/AimpDataStorage2.h +++ b/src/SDK/aimp_dotnet/SDK/MusicLibrary/AimpDataStorage2.h @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/MusicLibrary/AimpDataStorageManager.cpp b/src/SDK/aimp_dotnet/SDK/MusicLibrary/AimpDataStorageManager.cpp index a1ebc69c..8a621e2a 100644 --- a/src/SDK/aimp_dotnet/SDK/MusicLibrary/AimpDataStorageManager.cpp +++ b/src/SDK/aimp_dotnet/SDK/MusicLibrary/AimpDataStorageManager.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/MusicLibrary/AimpDataStorageManager.h b/src/SDK/aimp_dotnet/SDK/MusicLibrary/AimpDataStorageManager.h index 79932755..76e9d46e 100644 --- a/src/SDK/aimp_dotnet/SDK/MusicLibrary/AimpDataStorageManager.h +++ b/src/SDK/aimp_dotnet/SDK/MusicLibrary/AimpDataStorageManager.h @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/MusicLibrary/AimpFileList.cpp b/src/SDK/aimp_dotnet/SDK/MusicLibrary/AimpFileList.cpp index 1a686542..81989c3b 100644 --- a/src/SDK/aimp_dotnet/SDK/MusicLibrary/AimpFileList.cpp +++ b/src/SDK/aimp_dotnet/SDK/MusicLibrary/AimpFileList.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/MusicLibrary/AimpFileList.h b/src/SDK/aimp_dotnet/SDK/MusicLibrary/AimpFileList.h index 93bf8649..13332645 100644 --- a/src/SDK/aimp_dotnet/SDK/MusicLibrary/AimpFileList.h +++ b/src/SDK/aimp_dotnet/SDK/MusicLibrary/AimpFileList.h @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/MusicLibrary/AimpGroupingTreeSelection.cpp b/src/SDK/aimp_dotnet/SDK/MusicLibrary/AimpGroupingTreeSelection.cpp index fc7f2d92..c3386528 100644 --- a/src/SDK/aimp_dotnet/SDK/MusicLibrary/AimpGroupingTreeSelection.cpp +++ b/src/SDK/aimp_dotnet/SDK/MusicLibrary/AimpGroupingTreeSelection.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/MusicLibrary/AimpGroupingTreeSelection.h b/src/SDK/aimp_dotnet/SDK/MusicLibrary/AimpGroupingTreeSelection.h index a356714a..06a0d6ae 100644 --- a/src/SDK/aimp_dotnet/SDK/MusicLibrary/AimpGroupingTreeSelection.h +++ b/src/SDK/aimp_dotnet/SDK/MusicLibrary/AimpGroupingTreeSelection.h @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/MusicLibrary/AimpLocalDataStorage.cpp b/src/SDK/aimp_dotnet/SDK/MusicLibrary/AimpLocalDataStorage.cpp index dabc0078..548aed93 100644 --- a/src/SDK/aimp_dotnet/SDK/MusicLibrary/AimpLocalDataStorage.cpp +++ b/src/SDK/aimp_dotnet/SDK/MusicLibrary/AimpLocalDataStorage.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/MusicLibrary/AimpLocalDataStorage.h b/src/SDK/aimp_dotnet/SDK/MusicLibrary/AimpLocalDataStorage.h index b795dcdf..46504379 100644 --- a/src/SDK/aimp_dotnet/SDK/MusicLibrary/AimpLocalDataStorage.h +++ b/src/SDK/aimp_dotnet/SDK/MusicLibrary/AimpLocalDataStorage.h @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/MusicLibrary/AimpServiceMusicLibrary.cpp b/src/SDK/aimp_dotnet/SDK/MusicLibrary/AimpServiceMusicLibrary.cpp index 1eac9f70..934e1b9f 100644 --- a/src/SDK/aimp_dotnet/SDK/MusicLibrary/AimpServiceMusicLibrary.cpp +++ b/src/SDK/aimp_dotnet/SDK/MusicLibrary/AimpServiceMusicLibrary.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/MusicLibrary/AimpServiceMusicLibrary.h b/src/SDK/aimp_dotnet/SDK/MusicLibrary/AimpServiceMusicLibrary.h index 3e7bf12b..027465e4 100644 --- a/src/SDK/aimp_dotnet/SDK/MusicLibrary/AimpServiceMusicLibrary.h +++ b/src/SDK/aimp_dotnet/SDK/MusicLibrary/AimpServiceMusicLibrary.h @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/MusicLibrary/AimpServiceMusicLibraryUI.cpp b/src/SDK/aimp_dotnet/SDK/MusicLibrary/AimpServiceMusicLibraryUI.cpp index 215b62c1..fb485712 100644 --- a/src/SDK/aimp_dotnet/SDK/MusicLibrary/AimpServiceMusicLibraryUI.cpp +++ b/src/SDK/aimp_dotnet/SDK/MusicLibrary/AimpServiceMusicLibraryUI.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/MusicLibrary/AimpServiceMusicLibraryUI.h b/src/SDK/aimp_dotnet/SDK/MusicLibrary/AimpServiceMusicLibraryUI.h index 4a7aa907..143cbd71 100644 --- a/src/SDK/aimp_dotnet/SDK/MusicLibrary/AimpServiceMusicLibraryUI.h +++ b/src/SDK/aimp_dotnet/SDK/MusicLibrary/AimpServiceMusicLibraryUI.h @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/MusicLibrary/DataFilter/AimpDataFieldFilter.cpp b/src/SDK/aimp_dotnet/SDK/MusicLibrary/DataFilter/AimpDataFieldFilter.cpp index 6b0f482e..e051c253 100644 --- a/src/SDK/aimp_dotnet/SDK/MusicLibrary/DataFilter/AimpDataFieldFilter.cpp +++ b/src/SDK/aimp_dotnet/SDK/MusicLibrary/DataFilter/AimpDataFieldFilter.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/MusicLibrary/DataFilter/AimpDataFieldFilter.h b/src/SDK/aimp_dotnet/SDK/MusicLibrary/DataFilter/AimpDataFieldFilter.h index 10e5036b..5fbcc5c7 100644 --- a/src/SDK/aimp_dotnet/SDK/MusicLibrary/DataFilter/AimpDataFieldFilter.h +++ b/src/SDK/aimp_dotnet/SDK/MusicLibrary/DataFilter/AimpDataFieldFilter.h @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/MusicLibrary/DataFilter/AimpDataFieldFilterByArray.cpp b/src/SDK/aimp_dotnet/SDK/MusicLibrary/DataFilter/AimpDataFieldFilterByArray.cpp index 0c6db7aa..6024edcb 100644 --- a/src/SDK/aimp_dotnet/SDK/MusicLibrary/DataFilter/AimpDataFieldFilterByArray.cpp +++ b/src/SDK/aimp_dotnet/SDK/MusicLibrary/DataFilter/AimpDataFieldFilterByArray.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/MusicLibrary/DataFilter/AimpDataFieldFilterByArray.h b/src/SDK/aimp_dotnet/SDK/MusicLibrary/DataFilter/AimpDataFieldFilterByArray.h index 33eeb61a..9aaccfba 100644 --- a/src/SDK/aimp_dotnet/SDK/MusicLibrary/DataFilter/AimpDataFieldFilterByArray.h +++ b/src/SDK/aimp_dotnet/SDK/MusicLibrary/DataFilter/AimpDataFieldFilterByArray.h @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/MusicLibrary/DataFilter/AimpDataFilter.cpp b/src/SDK/aimp_dotnet/SDK/MusicLibrary/DataFilter/AimpDataFilter.cpp index 9117b874..ee20c097 100644 --- a/src/SDK/aimp_dotnet/SDK/MusicLibrary/DataFilter/AimpDataFilter.cpp +++ b/src/SDK/aimp_dotnet/SDK/MusicLibrary/DataFilter/AimpDataFilter.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/MusicLibrary/DataFilter/AimpDataFilter.h b/src/SDK/aimp_dotnet/SDK/MusicLibrary/DataFilter/AimpDataFilter.h index 18682c83..8a3b6d24 100644 --- a/src/SDK/aimp_dotnet/SDK/MusicLibrary/DataFilter/AimpDataFilter.h +++ b/src/SDK/aimp_dotnet/SDK/MusicLibrary/DataFilter/AimpDataFilter.h @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/MusicLibrary/DataFilter/AimpDataFilterGroup.cpp b/src/SDK/aimp_dotnet/SDK/MusicLibrary/DataFilter/AimpDataFilterGroup.cpp index c278553f..438357d1 100644 --- a/src/SDK/aimp_dotnet/SDK/MusicLibrary/DataFilter/AimpDataFilterGroup.cpp +++ b/src/SDK/aimp_dotnet/SDK/MusicLibrary/DataFilter/AimpDataFilterGroup.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/MusicLibrary/DataFilter/AimpDataFilterGroup.h b/src/SDK/aimp_dotnet/SDK/MusicLibrary/DataFilter/AimpDataFilterGroup.h index 9f279492..84988f63 100644 --- a/src/SDK/aimp_dotnet/SDK/MusicLibrary/DataFilter/AimpDataFilterGroup.h +++ b/src/SDK/aimp_dotnet/SDK/MusicLibrary/DataFilter/AimpDataFilterGroup.h @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/MusicLibrary/DataFilter/InternalAimpDataFieldFilterByArray.h b/src/SDK/aimp_dotnet/SDK/MusicLibrary/DataFilter/InternalAimpDataFieldFilterByArray.h index f815fa67..beac8830 100644 --- a/src/SDK/aimp_dotnet/SDK/MusicLibrary/DataFilter/InternalAimpDataFieldFilterByArray.h +++ b/src/SDK/aimp_dotnet/SDK/MusicLibrary/DataFilter/InternalAimpDataFieldFilterByArray.h @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/MusicLibrary/DataStorage/AimpDataField.cpp b/src/SDK/aimp_dotnet/SDK/MusicLibrary/DataStorage/AimpDataField.cpp index 72afe778..8f23a248 100644 --- a/src/SDK/aimp_dotnet/SDK/MusicLibrary/DataStorage/AimpDataField.cpp +++ b/src/SDK/aimp_dotnet/SDK/MusicLibrary/DataStorage/AimpDataField.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/MusicLibrary/DataStorage/AimpDataField.h b/src/SDK/aimp_dotnet/SDK/MusicLibrary/DataStorage/AimpDataField.h index 7fcd4151..488e74de 100644 --- a/src/SDK/aimp_dotnet/SDK/MusicLibrary/DataStorage/AimpDataField.h +++ b/src/SDK/aimp_dotnet/SDK/MusicLibrary/DataStorage/AimpDataField.h @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/MusicLibrary/DataStorage/AimpDataStorage.cpp b/src/SDK/aimp_dotnet/SDK/MusicLibrary/DataStorage/AimpDataStorage.cpp index 2aa4442b..26f422de 100644 --- a/src/SDK/aimp_dotnet/SDK/MusicLibrary/DataStorage/AimpDataStorage.cpp +++ b/src/SDK/aimp_dotnet/SDK/MusicLibrary/DataStorage/AimpDataStorage.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/MusicLibrary/DataStorage/AimpDataStorage.h b/src/SDK/aimp_dotnet/SDK/MusicLibrary/DataStorage/AimpDataStorage.h index 458d9709..eb3b01cd 100644 --- a/src/SDK/aimp_dotnet/SDK/MusicLibrary/DataStorage/AimpDataStorage.h +++ b/src/SDK/aimp_dotnet/SDK/MusicLibrary/DataStorage/AimpDataStorage.h @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/MusicLibrary/DataStorage/AimpDataStorage2.h b/src/SDK/aimp_dotnet/SDK/MusicLibrary/DataStorage/AimpDataStorage2.h index 09a4747e..ee3dae26 100644 --- a/src/SDK/aimp_dotnet/SDK/MusicLibrary/DataStorage/AimpDataStorage2.h +++ b/src/SDK/aimp_dotnet/SDK/MusicLibrary/DataStorage/AimpDataStorage2.h @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/MusicLibrary/DataStorage/BaseAimpDataStorage.h b/src/SDK/aimp_dotnet/SDK/MusicLibrary/DataStorage/BaseAimpDataStorage.h index aed2e396..a9928462 100644 --- a/src/SDK/aimp_dotnet/SDK/MusicLibrary/DataStorage/BaseAimpDataStorage.h +++ b/src/SDK/aimp_dotnet/SDK/MusicLibrary/DataStorage/BaseAimpDataStorage.h @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/MusicLibrary/Extension/AimpExtensionDataStorage.cpp b/src/SDK/aimp_dotnet/SDK/MusicLibrary/Extension/AimpExtensionDataStorage.cpp index 9f0a1c06..23c64131 100644 --- a/src/SDK/aimp_dotnet/SDK/MusicLibrary/Extension/AimpExtensionDataStorage.cpp +++ b/src/SDK/aimp_dotnet/SDK/MusicLibrary/Extension/AimpExtensionDataStorage.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/MusicLibrary/Extension/AimpExtensionDataStorage.h b/src/SDK/aimp_dotnet/SDK/MusicLibrary/Extension/AimpExtensionDataStorage.h index 7c292c81..24b8c69f 100644 --- a/src/SDK/aimp_dotnet/SDK/MusicLibrary/Extension/AimpExtensionDataStorage.h +++ b/src/SDK/aimp_dotnet/SDK/MusicLibrary/Extension/AimpExtensionDataStorage.h @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/MusicLibrary/Extension/Command/AimpDataStorageCommandAddFiles.cpp b/src/SDK/aimp_dotnet/SDK/MusicLibrary/Extension/Command/AimpDataStorageCommandAddFiles.cpp index 628630b9..df2cbfb0 100644 --- a/src/SDK/aimp_dotnet/SDK/MusicLibrary/Extension/Command/AimpDataStorageCommandAddFiles.cpp +++ b/src/SDK/aimp_dotnet/SDK/MusicLibrary/Extension/Command/AimpDataStorageCommandAddFiles.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/MusicLibrary/Extension/Command/AimpDataStorageCommandAddFiles.h b/src/SDK/aimp_dotnet/SDK/MusicLibrary/Extension/Command/AimpDataStorageCommandAddFiles.h index 74347088..d5efb4d0 100644 --- a/src/SDK/aimp_dotnet/SDK/MusicLibrary/Extension/Command/AimpDataStorageCommandAddFiles.h +++ b/src/SDK/aimp_dotnet/SDK/MusicLibrary/Extension/Command/AimpDataStorageCommandAddFiles.h @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/MusicLibrary/Extension/Command/AimpDataStorageCommandAddFilesDialog.cpp b/src/SDK/aimp_dotnet/SDK/MusicLibrary/Extension/Command/AimpDataStorageCommandAddFilesDialog.cpp index 55fb187d..d905e7df 100644 --- a/src/SDK/aimp_dotnet/SDK/MusicLibrary/Extension/Command/AimpDataStorageCommandAddFilesDialog.cpp +++ b/src/SDK/aimp_dotnet/SDK/MusicLibrary/Extension/Command/AimpDataStorageCommandAddFilesDialog.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/MusicLibrary/Extension/Command/AimpDataStorageCommandAddFilesDialog.h b/src/SDK/aimp_dotnet/SDK/MusicLibrary/Extension/Command/AimpDataStorageCommandAddFilesDialog.h index 7d9addb5..6b7e1401 100644 --- a/src/SDK/aimp_dotnet/SDK/MusicLibrary/Extension/Command/AimpDataStorageCommandAddFilesDialog.h +++ b/src/SDK/aimp_dotnet/SDK/MusicLibrary/Extension/Command/AimpDataStorageCommandAddFilesDialog.h @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/MusicLibrary/Extension/Command/AimpDataStorageCommandDeleteFiles.cpp b/src/SDK/aimp_dotnet/SDK/MusicLibrary/Extension/Command/AimpDataStorageCommandDeleteFiles.cpp index c2f3c4e1..892c72be 100644 --- a/src/SDK/aimp_dotnet/SDK/MusicLibrary/Extension/Command/AimpDataStorageCommandDeleteFiles.cpp +++ b/src/SDK/aimp_dotnet/SDK/MusicLibrary/Extension/Command/AimpDataStorageCommandDeleteFiles.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/MusicLibrary/Extension/Command/AimpDataStorageCommandDeleteFiles.h b/src/SDK/aimp_dotnet/SDK/MusicLibrary/Extension/Command/AimpDataStorageCommandDeleteFiles.h index d0eb47d2..0d304563 100644 --- a/src/SDK/aimp_dotnet/SDK/MusicLibrary/Extension/Command/AimpDataStorageCommandDeleteFiles.h +++ b/src/SDK/aimp_dotnet/SDK/MusicLibrary/Extension/Command/AimpDataStorageCommandDeleteFiles.h @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/MusicLibrary/Extension/Command/AimpDataStorageCommandDeleteFiles2.cpp b/src/SDK/aimp_dotnet/SDK/MusicLibrary/Extension/Command/AimpDataStorageCommandDeleteFiles2.cpp index 254ffc2d..c9476f32 100644 --- a/src/SDK/aimp_dotnet/SDK/MusicLibrary/Extension/Command/AimpDataStorageCommandDeleteFiles2.cpp +++ b/src/SDK/aimp_dotnet/SDK/MusicLibrary/Extension/Command/AimpDataStorageCommandDeleteFiles2.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/MusicLibrary/Extension/Command/AimpDataStorageCommandDeleteFiles2.h b/src/SDK/aimp_dotnet/SDK/MusicLibrary/Extension/Command/AimpDataStorageCommandDeleteFiles2.h index 441d5bae..d940e8e5 100644 --- a/src/SDK/aimp_dotnet/SDK/MusicLibrary/Extension/Command/AimpDataStorageCommandDeleteFiles2.h +++ b/src/SDK/aimp_dotnet/SDK/MusicLibrary/Extension/Command/AimpDataStorageCommandDeleteFiles2.h @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/MusicLibrary/Extension/Command/AimpDataStorageCommandDropData.cpp b/src/SDK/aimp_dotnet/SDK/MusicLibrary/Extension/Command/AimpDataStorageCommandDropData.cpp index 817184ab..8d9992eb 100644 --- a/src/SDK/aimp_dotnet/SDK/MusicLibrary/Extension/Command/AimpDataStorageCommandDropData.cpp +++ b/src/SDK/aimp_dotnet/SDK/MusicLibrary/Extension/Command/AimpDataStorageCommandDropData.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/MusicLibrary/Extension/Command/AimpDataStorageCommandDropData.h b/src/SDK/aimp_dotnet/SDK/MusicLibrary/Extension/Command/AimpDataStorageCommandDropData.h index 85a6f379..af0a29af 100644 --- a/src/SDK/aimp_dotnet/SDK/MusicLibrary/Extension/Command/AimpDataStorageCommandDropData.h +++ b/src/SDK/aimp_dotnet/SDK/MusicLibrary/Extension/Command/AimpDataStorageCommandDropData.h @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/MusicLibrary/Extension/Command/AimpDataStorageCommandFindInLibrary.cpp b/src/SDK/aimp_dotnet/SDK/MusicLibrary/Extension/Command/AimpDataStorageCommandFindInLibrary.cpp index 73d107b3..f705541a 100644 --- a/src/SDK/aimp_dotnet/SDK/MusicLibrary/Extension/Command/AimpDataStorageCommandFindInLibrary.cpp +++ b/src/SDK/aimp_dotnet/SDK/MusicLibrary/Extension/Command/AimpDataStorageCommandFindInLibrary.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/MusicLibrary/Extension/Command/AimpDataStorageCommandFindInLibrary.h b/src/SDK/aimp_dotnet/SDK/MusicLibrary/Extension/Command/AimpDataStorageCommandFindInLibrary.h index 6a4d263f..bc7cf6fa 100644 --- a/src/SDK/aimp_dotnet/SDK/MusicLibrary/Extension/Command/AimpDataStorageCommandFindInLibrary.h +++ b/src/SDK/aimp_dotnet/SDK/MusicLibrary/Extension/Command/AimpDataStorageCommandFindInLibrary.h @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/MusicLibrary/Extension/Command/AimpDataStorageCommandReloadTags.cpp b/src/SDK/aimp_dotnet/SDK/MusicLibrary/Extension/Command/AimpDataStorageCommandReloadTags.cpp index 2a08900a..cfb86ca5 100644 --- a/src/SDK/aimp_dotnet/SDK/MusicLibrary/Extension/Command/AimpDataStorageCommandReloadTags.cpp +++ b/src/SDK/aimp_dotnet/SDK/MusicLibrary/Extension/Command/AimpDataStorageCommandReloadTags.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/MusicLibrary/Extension/Command/AimpDataStorageCommandReloadTags.h b/src/SDK/aimp_dotnet/SDK/MusicLibrary/Extension/Command/AimpDataStorageCommandReloadTags.h index cc5800c7..2a04372c 100644 --- a/src/SDK/aimp_dotnet/SDK/MusicLibrary/Extension/Command/AimpDataStorageCommandReloadTags.h +++ b/src/SDK/aimp_dotnet/SDK/MusicLibrary/Extension/Command/AimpDataStorageCommandReloadTags.h @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/MusicLibrary/Extension/Command/AimpDataStorageCommandReportDialog.cpp b/src/SDK/aimp_dotnet/SDK/MusicLibrary/Extension/Command/AimpDataStorageCommandReportDialog.cpp index 7c60dde3..c1d323e5 100644 --- a/src/SDK/aimp_dotnet/SDK/MusicLibrary/Extension/Command/AimpDataStorageCommandReportDialog.cpp +++ b/src/SDK/aimp_dotnet/SDK/MusicLibrary/Extension/Command/AimpDataStorageCommandReportDialog.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/MusicLibrary/Extension/Command/AimpDataStorageCommandReportDialog.h b/src/SDK/aimp_dotnet/SDK/MusicLibrary/Extension/Command/AimpDataStorageCommandReportDialog.h index 7c1b0583..a49eabe5 100644 --- a/src/SDK/aimp_dotnet/SDK/MusicLibrary/Extension/Command/AimpDataStorageCommandReportDialog.h +++ b/src/SDK/aimp_dotnet/SDK/MusicLibrary/Extension/Command/AimpDataStorageCommandReportDialog.h @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/MusicLibrary/Extension/Command/AimpDataStorageCommandUserMark.cpp b/src/SDK/aimp_dotnet/SDK/MusicLibrary/Extension/Command/AimpDataStorageCommandUserMark.cpp index 53147c1c..a2a17656 100644 --- a/src/SDK/aimp_dotnet/SDK/MusicLibrary/Extension/Command/AimpDataStorageCommandUserMark.cpp +++ b/src/SDK/aimp_dotnet/SDK/MusicLibrary/Extension/Command/AimpDataStorageCommandUserMark.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/MusicLibrary/Extension/Command/AimpDataStorageCommandUserMark.h b/src/SDK/aimp_dotnet/SDK/MusicLibrary/Extension/Command/AimpDataStorageCommandUserMark.h index adc77c94..b60729e7 100644 --- a/src/SDK/aimp_dotnet/SDK/MusicLibrary/Extension/Command/AimpDataStorageCommandUserMark.h +++ b/src/SDK/aimp_dotnet/SDK/MusicLibrary/Extension/Command/AimpDataStorageCommandUserMark.h @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/MusicLibrary/Extension/InternalAimpAlbumArtProvider.cpp b/src/SDK/aimp_dotnet/SDK/MusicLibrary/Extension/InternalAimpAlbumArtProvider.cpp index 1489144b..5515f149 100644 --- a/src/SDK/aimp_dotnet/SDK/MusicLibrary/Extension/InternalAimpAlbumArtProvider.cpp +++ b/src/SDK/aimp_dotnet/SDK/MusicLibrary/Extension/InternalAimpAlbumArtProvider.cpp @@ -1,4 +1,13 @@ -#include "stdafx.h" +// ---------------------------------------------------- +// AIMP DotNet SDK +// +// Copyright (c) 2014 - 2023 Evgeniy Bogdan +// https://github.com/martin211/aimp_dotnet +// +// Mail: mail4evgeniy@gmail.com +// ---------------------------------------------------- + +#include "stdafx.h" #include "InternalAimpAlbumArtProvider.h" #include "SDK/AimpObjectList.h" diff --git a/src/SDK/aimp_dotnet/SDK/MusicLibrary/Extension/InternalAimpAlbumArtProvider.h b/src/SDK/aimp_dotnet/SDK/MusicLibrary/Extension/InternalAimpAlbumArtProvider.h index 855c2885..9a9fdd52 100644 --- a/src/SDK/aimp_dotnet/SDK/MusicLibrary/Extension/InternalAimpAlbumArtProvider.h +++ b/src/SDK/aimp_dotnet/SDK/MusicLibrary/Extension/InternalAimpAlbumArtProvider.h @@ -1,4 +1,13 @@ -#pragma once +// ---------------------------------------------------- +// AIMP DotNet SDK +// +// Copyright (c) 2014 - 2023 Evgeniy Bogdan +// https://github.com/martin211/aimp_dotnet +// +// Mail: mail4evgeniy@gmail.com +// ---------------------------------------------------- + +#pragma once class InternalAimpAlbumArtProvider : public IUnknownInterfaceImpl { private: diff --git a/src/SDK/aimp_dotnet/SDK/MusicLibrary/Extension/InternalAimpAlbumArtProvider2.cpp b/src/SDK/aimp_dotnet/SDK/MusicLibrary/Extension/InternalAimpAlbumArtProvider2.cpp index b8260b77..9994e4ad 100644 --- a/src/SDK/aimp_dotnet/SDK/MusicLibrary/Extension/InternalAimpAlbumArtProvider2.cpp +++ b/src/SDK/aimp_dotnet/SDK/MusicLibrary/Extension/InternalAimpAlbumArtProvider2.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/MusicLibrary/Extension/InternalAimpAlbumArtProvider2.h b/src/SDK/aimp_dotnet/SDK/MusicLibrary/Extension/InternalAimpAlbumArtProvider2.h index 827756c4..963e35ab 100644 --- a/src/SDK/aimp_dotnet/SDK/MusicLibrary/Extension/InternalAimpAlbumArtProvider2.h +++ b/src/SDK/aimp_dotnet/SDK/MusicLibrary/Extension/InternalAimpAlbumArtProvider2.h @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/MusicLibrary/InternalAimpDataFilter.cpp b/src/SDK/aimp_dotnet/SDK/MusicLibrary/InternalAimpDataFilter.cpp index 36be1b18..d3d977c4 100644 --- a/src/SDK/aimp_dotnet/SDK/MusicLibrary/InternalAimpDataFilter.cpp +++ b/src/SDK/aimp_dotnet/SDK/MusicLibrary/InternalAimpDataFilter.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/MusicLibrary/InternalAimpDataFilter.h b/src/SDK/aimp_dotnet/SDK/MusicLibrary/InternalAimpDataFilter.h index 954795ec..851ecbcd 100644 --- a/src/SDK/aimp_dotnet/SDK/MusicLibrary/InternalAimpDataFilter.h +++ b/src/SDK/aimp_dotnet/SDK/MusicLibrary/InternalAimpDataFilter.h @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/MusicLibrary/InternalAimpDataFilterGroup.cpp b/src/SDK/aimp_dotnet/SDK/MusicLibrary/InternalAimpDataFilterGroup.cpp index f1695731..be33be95 100644 --- a/src/SDK/aimp_dotnet/SDK/MusicLibrary/InternalAimpDataFilterGroup.cpp +++ b/src/SDK/aimp_dotnet/SDK/MusicLibrary/InternalAimpDataFilterGroup.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/MusicLibrary/InternalAimpDataFilterGroup.h b/src/SDK/aimp_dotnet/SDK/MusicLibrary/InternalAimpDataFilterGroup.h index 9d79f51e..cd728649 100644 --- a/src/SDK/aimp_dotnet/SDK/MusicLibrary/InternalAimpDataFilterGroup.h +++ b/src/SDK/aimp_dotnet/SDK/MusicLibrary/InternalAimpDataFilterGroup.h @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/MusicLibrary/InternalAimpDataProviderSelection.cpp b/src/SDK/aimp_dotnet/SDK/MusicLibrary/InternalAimpDataProviderSelection.cpp index 792a9ba5..978abaa6 100644 --- a/src/SDK/aimp_dotnet/SDK/MusicLibrary/InternalAimpDataProviderSelection.cpp +++ b/src/SDK/aimp_dotnet/SDK/MusicLibrary/InternalAimpDataProviderSelection.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/MusicLibrary/InternalAimpDataProviderSelection.h b/src/SDK/aimp_dotnet/SDK/MusicLibrary/InternalAimpDataProviderSelection.h index d11b310e..bfed3f6a 100644 --- a/src/SDK/aimp_dotnet/SDK/MusicLibrary/InternalAimpDataProviderSelection.h +++ b/src/SDK/aimp_dotnet/SDK/MusicLibrary/InternalAimpDataProviderSelection.h @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/MusicLibrary/InternalAimpGroupingTreeDataProvider.cpp b/src/SDK/aimp_dotnet/SDK/MusicLibrary/InternalAimpGroupingTreeDataProvider.cpp index 4b8930d9..67872362 100644 --- a/src/SDK/aimp_dotnet/SDK/MusicLibrary/InternalAimpGroupingTreeDataProvider.cpp +++ b/src/SDK/aimp_dotnet/SDK/MusicLibrary/InternalAimpGroupingTreeDataProvider.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/MusicLibrary/InternalAimpGroupingTreeDataProvider.h b/src/SDK/aimp_dotnet/SDK/MusicLibrary/InternalAimpGroupingTreeDataProvider.h index 7a0a141f..a0f547c2 100644 --- a/src/SDK/aimp_dotnet/SDK/MusicLibrary/InternalAimpGroupingTreeDataProvider.h +++ b/src/SDK/aimp_dotnet/SDK/MusicLibrary/InternalAimpGroupingTreeDataProvider.h @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/MusicLibrary/InternalAimpGroupingTreeDataProviderSelection.cpp b/src/SDK/aimp_dotnet/SDK/MusicLibrary/InternalAimpGroupingTreeDataProviderSelection.cpp index 85bb4aec..233035a5 100644 --- a/src/SDK/aimp_dotnet/SDK/MusicLibrary/InternalAimpGroupingTreeDataProviderSelection.cpp +++ b/src/SDK/aimp_dotnet/SDK/MusicLibrary/InternalAimpGroupingTreeDataProviderSelection.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/MusicLibrary/InternalAimpGroupingTreeDataProviderSelection.h b/src/SDK/aimp_dotnet/SDK/MusicLibrary/InternalAimpGroupingTreeDataProviderSelection.h index 278abaa1..7a27234d 100644 --- a/src/SDK/aimp_dotnet/SDK/MusicLibrary/InternalAimpGroupingTreeDataProviderSelection.h +++ b/src/SDK/aimp_dotnet/SDK/MusicLibrary/InternalAimpGroupingTreeDataProviderSelection.h @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/MusicLibrary/InternalAimpMusicLibraryPlaylistPreimage.cpp b/src/SDK/aimp_dotnet/SDK/MusicLibrary/InternalAimpMusicLibraryPlaylistPreimage.cpp index 50aef2a3..e8135bc8 100644 --- a/src/SDK/aimp_dotnet/SDK/MusicLibrary/InternalAimpMusicLibraryPlaylistPreimage.cpp +++ b/src/SDK/aimp_dotnet/SDK/MusicLibrary/InternalAimpMusicLibraryPlaylistPreimage.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/MusicLibrary/InternalAimpMusicLibraryPlaylistPreimage.h b/src/SDK/aimp_dotnet/SDK/MusicLibrary/InternalAimpMusicLibraryPlaylistPreimage.h index 93458f18..c3f4bc2e 100644 --- a/src/SDK/aimp_dotnet/SDK/MusicLibrary/InternalAimpMusicLibraryPlaylistPreimage.h +++ b/src/SDK/aimp_dotnet/SDK/MusicLibrary/InternalAimpMusicLibraryPlaylistPreimage.h @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/MusicLibrary/InternalDataFieldFilter.cpp b/src/SDK/aimp_dotnet/SDK/MusicLibrary/InternalDataFieldFilter.cpp index fc7120b8..0a8ed4ec 100644 --- a/src/SDK/aimp_dotnet/SDK/MusicLibrary/InternalDataFieldFilter.cpp +++ b/src/SDK/aimp_dotnet/SDK/MusicLibrary/InternalDataFieldFilter.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/MusicLibrary/InternalDataFieldFilter.h b/src/SDK/aimp_dotnet/SDK/MusicLibrary/InternalDataFieldFilter.h index 3d02c556..e0fdbb0d 100644 --- a/src/SDK/aimp_dotnet/SDK/MusicLibrary/InternalDataFieldFilter.h +++ b/src/SDK/aimp_dotnet/SDK/MusicLibrary/InternalDataFieldFilter.h @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/MusicLibrary/Presets/AimpGroupingPreset.cpp b/src/SDK/aimp_dotnet/SDK/MusicLibrary/Presets/AimpGroupingPreset.cpp index db738a80..47fc1932 100644 --- a/src/SDK/aimp_dotnet/SDK/MusicLibrary/Presets/AimpGroupingPreset.cpp +++ b/src/SDK/aimp_dotnet/SDK/MusicLibrary/Presets/AimpGroupingPreset.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/MusicLibrary/Presets/AimpGroupingPreset.h b/src/SDK/aimp_dotnet/SDK/MusicLibrary/Presets/AimpGroupingPreset.h index f71758de..feb265c5 100644 --- a/src/SDK/aimp_dotnet/SDK/MusicLibrary/Presets/AimpGroupingPreset.h +++ b/src/SDK/aimp_dotnet/SDK/MusicLibrary/Presets/AimpGroupingPreset.h @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/MusicLibrary/Presets/AimpGroupingPresetStandard.cpp b/src/SDK/aimp_dotnet/SDK/MusicLibrary/Presets/AimpGroupingPresetStandard.cpp index 84684b79..92df50fa 100644 --- a/src/SDK/aimp_dotnet/SDK/MusicLibrary/Presets/AimpGroupingPresetStandard.cpp +++ b/src/SDK/aimp_dotnet/SDK/MusicLibrary/Presets/AimpGroupingPresetStandard.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/MusicLibrary/Presets/AimpGroupingPresetStandard.h b/src/SDK/aimp_dotnet/SDK/MusicLibrary/Presets/AimpGroupingPresetStandard.h index 197b7652..efea2dfc 100644 --- a/src/SDK/aimp_dotnet/SDK/MusicLibrary/Presets/AimpGroupingPresetStandard.h +++ b/src/SDK/aimp_dotnet/SDK/MusicLibrary/Presets/AimpGroupingPresetStandard.h @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/MusicLibrary/Presets/AimpGroupingPresets.cpp b/src/SDK/aimp_dotnet/SDK/MusicLibrary/Presets/AimpGroupingPresets.cpp index 33e78857..4b8fa96c 100644 --- a/src/SDK/aimp_dotnet/SDK/MusicLibrary/Presets/AimpGroupingPresets.cpp +++ b/src/SDK/aimp_dotnet/SDK/MusicLibrary/Presets/AimpGroupingPresets.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/MusicLibrary/Presets/AimpGroupingPresets.h b/src/SDK/aimp_dotnet/SDK/MusicLibrary/Presets/AimpGroupingPresets.h index b07a1cb6..61de37de 100644 --- a/src/SDK/aimp_dotnet/SDK/MusicLibrary/Presets/AimpGroupingPresets.h +++ b/src/SDK/aimp_dotnet/SDK/MusicLibrary/Presets/AimpGroupingPresets.h @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/Objects/AimpFileStream.cpp b/src/SDK/aimp_dotnet/SDK/Objects/AimpFileStream.cpp index 08f0e890..9f230b9d 100644 --- a/src/SDK/aimp_dotnet/SDK/Objects/AimpFileStream.cpp +++ b/src/SDK/aimp_dotnet/SDK/Objects/AimpFileStream.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/Objects/AimpFileStream.h b/src/SDK/aimp_dotnet/SDK/Objects/AimpFileStream.h index 3ac57ce3..be0758bc 100644 --- a/src/SDK/aimp_dotnet/SDK/Objects/AimpFileStream.h +++ b/src/SDK/aimp_dotnet/SDK/Objects/AimpFileStream.h @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/Objects/AimpImage.cpp b/src/SDK/aimp_dotnet/SDK/Objects/AimpImage.cpp index 8ff61da9..c228f14f 100644 --- a/src/SDK/aimp_dotnet/SDK/Objects/AimpImage.cpp +++ b/src/SDK/aimp_dotnet/SDK/Objects/AimpImage.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/Objects/AimpImage.h b/src/SDK/aimp_dotnet/SDK/Objects/AimpImage.h index 47cd1efd..d451d2a8 100644 --- a/src/SDK/aimp_dotnet/SDK/Objects/AimpImage.h +++ b/src/SDK/aimp_dotnet/SDK/Objects/AimpImage.h @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/Objects/AimpImageContainer.cpp b/src/SDK/aimp_dotnet/SDK/Objects/AimpImageContainer.cpp index c42c6cea..69741e35 100644 --- a/src/SDK/aimp_dotnet/SDK/Objects/AimpImageContainer.cpp +++ b/src/SDK/aimp_dotnet/SDK/Objects/AimpImageContainer.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/Objects/AimpImageContainer.h b/src/SDK/aimp_dotnet/SDK/Objects/AimpImageContainer.h index 03f86892..0153ad09 100644 --- a/src/SDK/aimp_dotnet/SDK/Objects/AimpImageContainer.h +++ b/src/SDK/aimp_dotnet/SDK/Objects/AimpImageContainer.h @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/Objects/AimpMemoryStream.cpp b/src/SDK/aimp_dotnet/SDK/Objects/AimpMemoryStream.cpp index 4316f239..55ab48e7 100644 --- a/src/SDK/aimp_dotnet/SDK/Objects/AimpMemoryStream.cpp +++ b/src/SDK/aimp_dotnet/SDK/Objects/AimpMemoryStream.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/Objects/AimpMemoryStream.h b/src/SDK/aimp_dotnet/SDK/Objects/AimpMemoryStream.h index e64c0980..1fa1164b 100644 --- a/src/SDK/aimp_dotnet/SDK/Objects/AimpMemoryStream.h +++ b/src/SDK/aimp_dotnet/SDK/Objects/AimpMemoryStream.h @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/Objects/AimpStream.cpp b/src/SDK/aimp_dotnet/SDK/Objects/AimpStream.cpp index 16fd59c8..4b051f2c 100644 --- a/src/SDK/aimp_dotnet/SDK/Objects/AimpStream.cpp +++ b/src/SDK/aimp_dotnet/SDK/Objects/AimpStream.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/Objects/AimpStream.h b/src/SDK/aimp_dotnet/SDK/Objects/AimpStream.h index c4b7aecd..5cb09f98 100644 --- a/src/SDK/aimp_dotnet/SDK/Objects/AimpStream.h +++ b/src/SDK/aimp_dotnet/SDK/Objects/AimpStream.h @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/Objects/AimpString.cpp b/src/SDK/aimp_dotnet/SDK/Objects/AimpString.cpp index 773682dc..2d6aa4c1 100644 --- a/src/SDK/aimp_dotnet/SDK/Objects/AimpString.cpp +++ b/src/SDK/aimp_dotnet/SDK/Objects/AimpString.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/Objects/AimpString.h b/src/SDK/aimp_dotnet/SDK/Objects/AimpString.h index 591f0f4c..2186356e 100644 --- a/src/SDK/aimp_dotnet/SDK/Objects/AimpString.h +++ b/src/SDK/aimp_dotnet/SDK/Objects/AimpString.h @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/Objects/Collections/AimpOrderedObjectList.cpp b/src/SDK/aimp_dotnet/SDK/Objects/Collections/AimpOrderedObjectList.cpp index 2f625a15..7275e407 100644 --- a/src/SDK/aimp_dotnet/SDK/Objects/Collections/AimpOrderedObjectList.cpp +++ b/src/SDK/aimp_dotnet/SDK/Objects/Collections/AimpOrderedObjectList.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/Objects/Collections/AimpOrderedObjectList.h b/src/SDK/aimp_dotnet/SDK/Objects/Collections/AimpOrderedObjectList.h index 8e6a0a5a..8ae143f2 100644 --- a/src/SDK/aimp_dotnet/SDK/Objects/Collections/AimpOrderedObjectList.h +++ b/src/SDK/aimp_dotnet/SDK/Objects/Collections/AimpOrderedObjectList.h @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/Objects/Collections/InternalOrderedListItem.cpp b/src/SDK/aimp_dotnet/SDK/Objects/Collections/InternalOrderedListItem.cpp index 522a02b0..3b8ffa5c 100644 --- a/src/SDK/aimp_dotnet/SDK/Objects/Collections/InternalOrderedListItem.cpp +++ b/src/SDK/aimp_dotnet/SDK/Objects/Collections/InternalOrderedListItem.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/Objects/Collections/InternalOrderedListItem.h b/src/SDK/aimp_dotnet/SDK/Objects/Collections/InternalOrderedListItem.h index bb0843f4..9795ea62 100644 --- a/src/SDK/aimp_dotnet/SDK/Objects/Collections/InternalOrderedListItem.h +++ b/src/SDK/aimp_dotnet/SDK/Objects/Collections/InternalOrderedListItem.h @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/Objects/Collections/OrderedListItem.cpp b/src/SDK/aimp_dotnet/SDK/Objects/Collections/OrderedListItem.cpp index fb6b98a5..0fb31b2b 100644 --- a/src/SDK/aimp_dotnet/SDK/Objects/Collections/OrderedListItem.cpp +++ b/src/SDK/aimp_dotnet/SDK/Objects/Collections/OrderedListItem.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/Objects/Collections/OrderedListItem.h b/src/SDK/aimp_dotnet/SDK/Objects/Collections/OrderedListItem.h index c27f5e8b..da03a48f 100644 --- a/src/SDK/aimp_dotnet/SDK/Objects/Collections/OrderedListItem.h +++ b/src/SDK/aimp_dotnet/SDK/Objects/Collections/OrderedListItem.h @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/Options/AimpServiceOptionsDialog.cpp b/src/SDK/aimp_dotnet/SDK/Options/AimpServiceOptionsDialog.cpp index 14ee693a..beb495a5 100644 --- a/src/SDK/aimp_dotnet/SDK/Options/AimpServiceOptionsDialog.cpp +++ b/src/SDK/aimp_dotnet/SDK/Options/AimpServiceOptionsDialog.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/Options/AimpServiceOptionsDialog.h b/src/SDK/aimp_dotnet/SDK/Options/AimpServiceOptionsDialog.h index f8db677d..da4d486b 100644 --- a/src/SDK/aimp_dotnet/SDK/Options/AimpServiceOptionsDialog.h +++ b/src/SDK/aimp_dotnet/SDK/Options/AimpServiceOptionsDialog.h @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/Options/OptionsDialogFrameExtension.cpp b/src/SDK/aimp_dotnet/SDK/Options/OptionsDialogFrameExtension.cpp index 85d7341f..4b9a70db 100644 --- a/src/SDK/aimp_dotnet/SDK/Options/OptionsDialogFrameExtension.cpp +++ b/src/SDK/aimp_dotnet/SDK/Options/OptionsDialogFrameExtension.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/Options/OptionsDialogFrameExtension.h b/src/SDK/aimp_dotnet/SDK/Options/OptionsDialogFrameExtension.h index a53c1d48..a0cdebb9 100644 --- a/src/SDK/aimp_dotnet/SDK/Options/OptionsDialogFrameExtension.h +++ b/src/SDK/aimp_dotnet/SDK/Options/OptionsDialogFrameExtension.h @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/PlayList/AimpExtensionPlaylistManagerListener.cpp b/src/SDK/aimp_dotnet/SDK/PlayList/AimpExtensionPlaylistManagerListener.cpp index a423ade7..25d88241 100644 --- a/src/SDK/aimp_dotnet/SDK/PlayList/AimpExtensionPlaylistManagerListener.cpp +++ b/src/SDK/aimp_dotnet/SDK/PlayList/AimpExtensionPlaylistManagerListener.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/PlayList/AimpExtensionPlaylistManagerListener.h b/src/SDK/aimp_dotnet/SDK/PlayList/AimpExtensionPlaylistManagerListener.h index 2fee1b7e..afe6a5f5 100644 --- a/src/SDK/aimp_dotnet/SDK/PlayList/AimpExtensionPlaylistManagerListener.h +++ b/src/SDK/aimp_dotnet/SDK/PlayList/AimpExtensionPlaylistManagerListener.h @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/PlayList/AimpExtensionPlaylistPreimageFactory.cpp b/src/SDK/aimp_dotnet/SDK/PlayList/AimpExtensionPlaylistPreimageFactory.cpp index eeb4ee9e..d472a8fa 100644 --- a/src/SDK/aimp_dotnet/SDK/PlayList/AimpExtensionPlaylistPreimageFactory.cpp +++ b/src/SDK/aimp_dotnet/SDK/PlayList/AimpExtensionPlaylistPreimageFactory.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/PlayList/AimpExtensionPlaylistPreimageFactory.h b/src/SDK/aimp_dotnet/SDK/PlayList/AimpExtensionPlaylistPreimageFactory.h index 2ede57c7..39b65521 100644 --- a/src/SDK/aimp_dotnet/SDK/PlayList/AimpExtensionPlaylistPreimageFactory.h +++ b/src/SDK/aimp_dotnet/SDK/PlayList/AimpExtensionPlaylistPreimageFactory.h @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/PlayList/AimpPlayList.cpp b/src/SDK/aimp_dotnet/SDK/PlayList/AimpPlayList.cpp index b2116188..64b3cb6c 100644 --- a/src/SDK/aimp_dotnet/SDK/PlayList/AimpPlayList.cpp +++ b/src/SDK/aimp_dotnet/SDK/PlayList/AimpPlayList.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/PlayList/AimpPlayList.h b/src/SDK/aimp_dotnet/SDK/PlayList/AimpPlayList.h index 17c24ffc..d2c1bfb3 100644 --- a/src/SDK/aimp_dotnet/SDK/PlayList/AimpPlayList.h +++ b/src/SDK/aimp_dotnet/SDK/PlayList/AimpPlayList.h @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/PlayList/AimpPlayListGroup.cpp b/src/SDK/aimp_dotnet/SDK/PlayList/AimpPlayListGroup.cpp index 522d185a..f5a133a4 100644 --- a/src/SDK/aimp_dotnet/SDK/PlayList/AimpPlayListGroup.cpp +++ b/src/SDK/aimp_dotnet/SDK/PlayList/AimpPlayListGroup.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/PlayList/AimpPlayListGroup.h b/src/SDK/aimp_dotnet/SDK/PlayList/AimpPlayListGroup.h index 93cb90fe..546581d0 100644 --- a/src/SDK/aimp_dotnet/SDK/PlayList/AimpPlayListGroup.h +++ b/src/SDK/aimp_dotnet/SDK/PlayList/AimpPlayListGroup.h @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/PlayList/AimpPlayListItem.cpp b/src/SDK/aimp_dotnet/SDK/PlayList/AimpPlayListItem.cpp index d95aaaff..63010b5a 100644 --- a/src/SDK/aimp_dotnet/SDK/PlayList/AimpPlayListItem.cpp +++ b/src/SDK/aimp_dotnet/SDK/PlayList/AimpPlayListItem.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/PlayList/AimpPlayListItem.h b/src/SDK/aimp_dotnet/SDK/PlayList/AimpPlayListItem.h index 039bf0e7..9f1db25b 100644 --- a/src/SDK/aimp_dotnet/SDK/PlayList/AimpPlayListItem.h +++ b/src/SDK/aimp_dotnet/SDK/PlayList/AimpPlayListItem.h @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/PlayList/AimpPlayListQueue.cpp b/src/SDK/aimp_dotnet/SDK/PlayList/AimpPlayListQueue.cpp index 19faf80e..f260015e 100644 --- a/src/SDK/aimp_dotnet/SDK/PlayList/AimpPlayListQueue.cpp +++ b/src/SDK/aimp_dotnet/SDK/PlayList/AimpPlayListQueue.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/PlayList/AimpPlayListQueue.h b/src/SDK/aimp_dotnet/SDK/PlayList/AimpPlayListQueue.h index 27cfeb73..f95c1e23 100644 --- a/src/SDK/aimp_dotnet/SDK/PlayList/AimpPlayListQueue.h +++ b/src/SDK/aimp_dotnet/SDK/PlayList/AimpPlayListQueue.h @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/PlayList/AimpPlaylistPreimage.cpp b/src/SDK/aimp_dotnet/SDK/PlayList/AimpPlaylistPreimage.cpp index 008bc675..b9f6b8ac 100644 --- a/src/SDK/aimp_dotnet/SDK/PlayList/AimpPlaylistPreimage.cpp +++ b/src/SDK/aimp_dotnet/SDK/PlayList/AimpPlaylistPreimage.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/PlayList/AimpPlaylistPreimage.h b/src/SDK/aimp_dotnet/SDK/PlayList/AimpPlaylistPreimage.h index 5b12b965..80692568 100644 --- a/src/SDK/aimp_dotnet/SDK/PlayList/AimpPlaylistPreimage.h +++ b/src/SDK/aimp_dotnet/SDK/PlayList/AimpPlaylistPreimage.h @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/PlayList/AimpPlaylistPreimageFactory.cpp b/src/SDK/aimp_dotnet/SDK/PlayList/AimpPlaylistPreimageFactory.cpp index 684235e4..e17dcfdc 100644 --- a/src/SDK/aimp_dotnet/SDK/PlayList/AimpPlaylistPreimageFactory.cpp +++ b/src/SDK/aimp_dotnet/SDK/PlayList/AimpPlaylistPreimageFactory.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/PlayList/AimpPlaylistPreimageFactory.h b/src/SDK/aimp_dotnet/SDK/PlayList/AimpPlaylistPreimageFactory.h index 71987854..70bb4aa8 100644 --- a/src/SDK/aimp_dotnet/SDK/PlayList/AimpPlaylistPreimageFactory.h +++ b/src/SDK/aimp_dotnet/SDK/PlayList/AimpPlaylistPreimageFactory.h @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/PlayList/AimpPlaylistPreimageFolders.cpp b/src/SDK/aimp_dotnet/SDK/PlayList/AimpPlaylistPreimageFolders.cpp index e19476e4..3ee8a2c3 100644 --- a/src/SDK/aimp_dotnet/SDK/PlayList/AimpPlaylistPreimageFolders.cpp +++ b/src/SDK/aimp_dotnet/SDK/PlayList/AimpPlaylistPreimageFolders.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/PlayList/AimpPlaylistPreimageFolders.h b/src/SDK/aimp_dotnet/SDK/PlayList/AimpPlaylistPreimageFolders.h index bfc96d72..1f32929b 100644 --- a/src/SDK/aimp_dotnet/SDK/PlayList/AimpPlaylistPreimageFolders.h +++ b/src/SDK/aimp_dotnet/SDK/PlayList/AimpPlaylistPreimageFolders.h @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/PlayList/AimpPlaylistPreimageListener.cpp b/src/SDK/aimp_dotnet/SDK/PlayList/AimpPlaylistPreimageListener.cpp index 97201805..66e5d6b3 100644 --- a/src/SDK/aimp_dotnet/SDK/PlayList/AimpPlaylistPreimageListener.cpp +++ b/src/SDK/aimp_dotnet/SDK/PlayList/AimpPlaylistPreimageListener.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/PlayList/AimpPlaylistPreimageListener.h b/src/SDK/aimp_dotnet/SDK/PlayList/AimpPlaylistPreimageListener.h index 6b3a809f..98d50e0d 100644 --- a/src/SDK/aimp_dotnet/SDK/PlayList/AimpPlaylistPreimageListener.h +++ b/src/SDK/aimp_dotnet/SDK/PlayList/AimpPlaylistPreimageListener.h @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/PlayList/AimpPlaylistQueueListener.cpp b/src/SDK/aimp_dotnet/SDK/PlayList/AimpPlaylistQueueListener.cpp index 830971fd..5b5d433e 100644 --- a/src/SDK/aimp_dotnet/SDK/PlayList/AimpPlaylistQueueListener.cpp +++ b/src/SDK/aimp_dotnet/SDK/PlayList/AimpPlaylistQueueListener.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/PlayList/AimpPlaylistQueueListener.h b/src/SDK/aimp_dotnet/SDK/PlayList/AimpPlaylistQueueListener.h index e7db2a62..d8692d09 100644 --- a/src/SDK/aimp_dotnet/SDK/PlayList/AimpPlaylistQueueListener.h +++ b/src/SDK/aimp_dotnet/SDK/PlayList/AimpPlaylistQueueListener.h @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/PlayList/AimpServicePlaylistManager.cpp b/src/SDK/aimp_dotnet/SDK/PlayList/AimpServicePlaylistManager.cpp index e631636d..9a2e8760 100644 --- a/src/SDK/aimp_dotnet/SDK/PlayList/AimpServicePlaylistManager.cpp +++ b/src/SDK/aimp_dotnet/SDK/PlayList/AimpServicePlaylistManager.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/PlayList/AimpServicePlaylistManager.h b/src/SDK/aimp_dotnet/SDK/PlayList/AimpServicePlaylistManager.h index 74af3975..baf74af8 100644 --- a/src/SDK/aimp_dotnet/SDK/PlayList/AimpServicePlaylistManager.h +++ b/src/SDK/aimp_dotnet/SDK/PlayList/AimpServicePlaylistManager.h @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/PlayList/IPlayListQueueEventExecutor.h b/src/SDK/aimp_dotnet/SDK/PlayList/IPlayListQueueEventExecutor.h index d10e038c..63046855 100644 --- a/src/SDK/aimp_dotnet/SDK/PlayList/IPlayListQueueEventExecutor.h +++ b/src/SDK/aimp_dotnet/SDK/PlayList/IPlayListQueueEventExecutor.h @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/PlayList/Internal/InternalAimpExtensionPlaylistPreimageFactory.cpp b/src/SDK/aimp_dotnet/SDK/PlayList/Internal/InternalAimpExtensionPlaylistPreimageFactory.cpp index 67d9e910..ddcc2fb1 100644 --- a/src/SDK/aimp_dotnet/SDK/PlayList/Internal/InternalAimpExtensionPlaylistPreimageFactory.cpp +++ b/src/SDK/aimp_dotnet/SDK/PlayList/Internal/InternalAimpExtensionPlaylistPreimageFactory.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/PlayList/Internal/InternalAimpExtensionPlaylistPreimageFactory.h b/src/SDK/aimp_dotnet/SDK/PlayList/Internal/InternalAimpExtensionPlaylistPreimageFactory.h index 02e6e4fa..fe26565f 100644 --- a/src/SDK/aimp_dotnet/SDK/PlayList/Internal/InternalAimpExtensionPlaylistPreimageFactory.h +++ b/src/SDK/aimp_dotnet/SDK/PlayList/Internal/InternalAimpExtensionPlaylistPreimageFactory.h @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/PlayList/Internal/InternalAimpMLPlaylistPreimage.cpp b/src/SDK/aimp_dotnet/SDK/PlayList/Internal/InternalAimpMLPlaylistPreimage.cpp index 75a5c9d0..c206c889 100644 --- a/src/SDK/aimp_dotnet/SDK/PlayList/Internal/InternalAimpMLPlaylistPreimage.cpp +++ b/src/SDK/aimp_dotnet/SDK/PlayList/Internal/InternalAimpMLPlaylistPreimage.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/PlayList/Internal/InternalAimpMLPlaylistPreimage.h b/src/SDK/aimp_dotnet/SDK/PlayList/Internal/InternalAimpMLPlaylistPreimage.h index ef189bd9..be610c3a 100644 --- a/src/SDK/aimp_dotnet/SDK/PlayList/Internal/InternalAimpMLPlaylistPreimage.h +++ b/src/SDK/aimp_dotnet/SDK/PlayList/Internal/InternalAimpMLPlaylistPreimage.h @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/PlayList/Internal/InternalAimpPlaylistPreimage.cpp b/src/SDK/aimp_dotnet/SDK/PlayList/Internal/InternalAimpPlaylistPreimage.cpp index 982319d1..12e2a7c6 100644 --- a/src/SDK/aimp_dotnet/SDK/PlayList/Internal/InternalAimpPlaylistPreimage.cpp +++ b/src/SDK/aimp_dotnet/SDK/PlayList/Internal/InternalAimpPlaylistPreimage.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/PlayList/Internal/InternalAimpPlaylistPreimage.h b/src/SDK/aimp_dotnet/SDK/PlayList/Internal/InternalAimpPlaylistPreimage.h index 4bc44ebd..263f294c 100644 --- a/src/SDK/aimp_dotnet/SDK/PlayList/Internal/InternalAimpPlaylistPreimage.h +++ b/src/SDK/aimp_dotnet/SDK/PlayList/Internal/InternalAimpPlaylistPreimage.h @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/Playback/AimpExtensionPlayerHook.cpp b/src/SDK/aimp_dotnet/SDK/Playback/AimpExtensionPlayerHook.cpp index 364a9de9..e734cbb2 100644 --- a/src/SDK/aimp_dotnet/SDK/Playback/AimpExtensionPlayerHook.cpp +++ b/src/SDK/aimp_dotnet/SDK/Playback/AimpExtensionPlayerHook.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/Playback/AimpExtensionPlayerHook.h b/src/SDK/aimp_dotnet/SDK/Playback/AimpExtensionPlayerHook.h index b1070282..2c5d477f 100644 --- a/src/SDK/aimp_dotnet/SDK/Playback/AimpExtensionPlayerHook.h +++ b/src/SDK/aimp_dotnet/SDK/Playback/AimpExtensionPlayerHook.h @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/Playback/AimpPlaybackQueueItem.cpp b/src/SDK/aimp_dotnet/SDK/Playback/AimpPlaybackQueueItem.cpp index eed23090..fa220c63 100644 --- a/src/SDK/aimp_dotnet/SDK/Playback/AimpPlaybackQueueItem.cpp +++ b/src/SDK/aimp_dotnet/SDK/Playback/AimpPlaybackQueueItem.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/Playback/AimpPlaybackQueueItem.h b/src/SDK/aimp_dotnet/SDK/Playback/AimpPlaybackQueueItem.h index ab0dcd4e..7ccff6f5 100644 --- a/src/SDK/aimp_dotnet/SDK/Playback/AimpPlaybackQueueItem.h +++ b/src/SDK/aimp_dotnet/SDK/Playback/AimpPlaybackQueueItem.h @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/Playback/AimpServicePlaybackQueue.cpp b/src/SDK/aimp_dotnet/SDK/Playback/AimpServicePlaybackQueue.cpp index 2af7de94..6483c28d 100644 --- a/src/SDK/aimp_dotnet/SDK/Playback/AimpServicePlaybackQueue.cpp +++ b/src/SDK/aimp_dotnet/SDK/Playback/AimpServicePlaybackQueue.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/Playback/AimpServicePlaybackQueue.h b/src/SDK/aimp_dotnet/SDK/Playback/AimpServicePlaybackQueue.h index 5bb1c4e9..80c69b8a 100644 --- a/src/SDK/aimp_dotnet/SDK/Playback/AimpServicePlaybackQueue.h +++ b/src/SDK/aimp_dotnet/SDK/Playback/AimpServicePlaybackQueue.h @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/Player/AimpEqualizerBands.cpp b/src/SDK/aimp_dotnet/SDK/Player/AimpEqualizerBands.cpp index fcef2a7b..08a1f6f8 100644 --- a/src/SDK/aimp_dotnet/SDK/Player/AimpEqualizerBands.cpp +++ b/src/SDK/aimp_dotnet/SDK/Player/AimpEqualizerBands.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/Player/AimpEqualizerBands.h b/src/SDK/aimp_dotnet/SDK/Player/AimpEqualizerBands.h index cb6369d1..ec3f09aa 100644 --- a/src/SDK/aimp_dotnet/SDK/Player/AimpEqualizerBands.h +++ b/src/SDK/aimp_dotnet/SDK/Player/AimpEqualizerBands.h @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/Player/AimpEqualizerPreset.cpp b/src/SDK/aimp_dotnet/SDK/Player/AimpEqualizerPreset.cpp index 26687ae8..60d66887 100644 --- a/src/SDK/aimp_dotnet/SDK/Player/AimpEqualizerPreset.cpp +++ b/src/SDK/aimp_dotnet/SDK/Player/AimpEqualizerPreset.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/Player/AimpEqualizerPreset.h b/src/SDK/aimp_dotnet/SDK/Player/AimpEqualizerPreset.h index 556049ea..9cbdf6f3 100644 --- a/src/SDK/aimp_dotnet/SDK/Player/AimpEqualizerPreset.h +++ b/src/SDK/aimp_dotnet/SDK/Player/AimpEqualizerPreset.h @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/Player/AimpServicePlayer.cpp b/src/SDK/aimp_dotnet/SDK/Player/AimpServicePlayer.cpp index d47ef70a..1b4938f3 100644 --- a/src/SDK/aimp_dotnet/SDK/Player/AimpServicePlayer.cpp +++ b/src/SDK/aimp_dotnet/SDK/Player/AimpServicePlayer.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/Player/AimpServicePlayer.h b/src/SDK/aimp_dotnet/SDK/Player/AimpServicePlayer.h index 6257ee2a..401a07c8 100644 --- a/src/SDK/aimp_dotnet/SDK/Player/AimpServicePlayer.h +++ b/src/SDK/aimp_dotnet/SDK/Player/AimpServicePlayer.h @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/Player/AimpServicePlayerEqualizer.cpp b/src/SDK/aimp_dotnet/SDK/Player/AimpServicePlayerEqualizer.cpp index b9e3ceb4..842ee8d7 100644 --- a/src/SDK/aimp_dotnet/SDK/Player/AimpServicePlayerEqualizer.cpp +++ b/src/SDK/aimp_dotnet/SDK/Player/AimpServicePlayerEqualizer.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/Player/AimpServicePlayerEqualizer.h b/src/SDK/aimp_dotnet/SDK/Player/AimpServicePlayerEqualizer.h index a3803054..39da570e 100644 --- a/src/SDK/aimp_dotnet/SDK/Player/AimpServicePlayerEqualizer.h +++ b/src/SDK/aimp_dotnet/SDK/Player/AimpServicePlayerEqualizer.h @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/Player/AimpServicePlayerEqualizerPresets.cpp b/src/SDK/aimp_dotnet/SDK/Player/AimpServicePlayerEqualizerPresets.cpp index 19f1db01..3eb19127 100644 --- a/src/SDK/aimp_dotnet/SDK/Player/AimpServicePlayerEqualizerPresets.cpp +++ b/src/SDK/aimp_dotnet/SDK/Player/AimpServicePlayerEqualizerPresets.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/Player/AimpServicePlayerEqualizerPresets.h b/src/SDK/aimp_dotnet/SDK/Player/AimpServicePlayerEqualizerPresets.h index 656c7f0e..6e96e573 100644 --- a/src/SDK/aimp_dotnet/SDK/Player/AimpServicePlayerEqualizerPresets.h +++ b/src/SDK/aimp_dotnet/SDK/Player/AimpServicePlayerEqualizerPresets.h @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/Player/AimpServiceWaveform.cpp b/src/SDK/aimp_dotnet/SDK/Player/AimpServiceWaveform.cpp index 1fd5b863..98a6f718 100644 --- a/src/SDK/aimp_dotnet/SDK/Player/AimpServiceWaveform.cpp +++ b/src/SDK/aimp_dotnet/SDK/Player/AimpServiceWaveform.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/Player/AimpServiceWaveform.h b/src/SDK/aimp_dotnet/SDK/Player/AimpServiceWaveform.h index 88cc6fff..056514fd 100644 --- a/src/SDK/aimp_dotnet/SDK/Player/AimpServiceWaveform.h +++ b/src/SDK/aimp_dotnet/SDK/Player/AimpServiceWaveform.h @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/Player/Extensions/AimpExtensionPlaybackQueue.cpp b/src/SDK/aimp_dotnet/SDK/Player/Extensions/AimpExtensionPlaybackQueue.cpp index a0dfcdc4..507a0f20 100644 --- a/src/SDK/aimp_dotnet/SDK/Player/Extensions/AimpExtensionPlaybackQueue.cpp +++ b/src/SDK/aimp_dotnet/SDK/Player/Extensions/AimpExtensionPlaybackQueue.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/Player/Extensions/AimpExtensionPlaybackQueue.h b/src/SDK/aimp_dotnet/SDK/Player/Extensions/AimpExtensionPlaybackQueue.h index 4c55e994..afe09e17 100644 --- a/src/SDK/aimp_dotnet/SDK/Player/Extensions/AimpExtensionPlaybackQueue.h +++ b/src/SDK/aimp_dotnet/SDK/Player/Extensions/AimpExtensionPlaybackQueue.h @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/Player/Extensions/AimpExtensionPlaybackQueue2.cpp b/src/SDK/aimp_dotnet/SDK/Player/Extensions/AimpExtensionPlaybackQueue2.cpp index 7b23b548..b0eee982 100644 --- a/src/SDK/aimp_dotnet/SDK/Player/Extensions/AimpExtensionPlaybackQueue2.cpp +++ b/src/SDK/aimp_dotnet/SDK/Player/Extensions/AimpExtensionPlaybackQueue2.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/Player/Extensions/AimpExtensionPlaybackQueue2.h b/src/SDK/aimp_dotnet/SDK/Player/Extensions/AimpExtensionPlaybackQueue2.h index 682a76e4..910859b8 100644 --- a/src/SDK/aimp_dotnet/SDK/Player/Extensions/AimpExtensionPlaybackQueue2.h +++ b/src/SDK/aimp_dotnet/SDK/Player/Extensions/AimpExtensionPlaybackQueue2.h @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/Player/Extensions/InternalAimpExtensionWaveFormProvider.cpp b/src/SDK/aimp_dotnet/SDK/Player/Extensions/InternalAimpExtensionWaveFormProvider.cpp index 62214f87..18ea417d 100644 --- a/src/SDK/aimp_dotnet/SDK/Player/Extensions/InternalAimpExtensionWaveFormProvider.cpp +++ b/src/SDK/aimp_dotnet/SDK/Player/Extensions/InternalAimpExtensionWaveFormProvider.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/Player/Extensions/InternalAimpExtensionWaveFormProvider.h b/src/SDK/aimp_dotnet/SDK/Player/Extensions/InternalAimpExtensionWaveFormProvider.h index e8e4567e..7f89c994 100644 --- a/src/SDK/aimp_dotnet/SDK/Player/Extensions/InternalAimpExtensionWaveFormProvider.h +++ b/src/SDK/aimp_dotnet/SDK/Player/Extensions/InternalAimpExtensionWaveFormProvider.h @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/Player/Primitives/AimpWaveformPeakInfo.h b/src/SDK/aimp_dotnet/SDK/Player/Primitives/AimpWaveformPeakInfo.h index a9ba0ecd..34eacdc5 100644 --- a/src/SDK/aimp_dotnet/SDK/Player/Primitives/AimpWaveformPeakInfo.h +++ b/src/SDK/aimp_dotnet/SDK/Player/Primitives/AimpWaveformPeakInfo.h @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/PropertyListHelper.cpp b/src/SDK/aimp_dotnet/SDK/PropertyListHelper.cpp index 7e627935..fca96159 100644 --- a/src/SDK/aimp_dotnet/SDK/PropertyListHelper.cpp +++ b/src/SDK/aimp_dotnet/SDK/PropertyListHelper.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/PropertyListHelper.h b/src/SDK/aimp_dotnet/SDK/PropertyListHelper.h index 03611599..40c762c2 100644 --- a/src/SDK/aimp_dotnet/SDK/PropertyListHelper.h +++ b/src/SDK/aimp_dotnet/SDK/PropertyListHelper.h @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/TagEditor/AimpFileTag.cpp b/src/SDK/aimp_dotnet/SDK/TagEditor/AimpFileTag.cpp index 28e3e005..0e8cc5c7 100644 --- a/src/SDK/aimp_dotnet/SDK/TagEditor/AimpFileTag.cpp +++ b/src/SDK/aimp_dotnet/SDK/TagEditor/AimpFileTag.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/TagEditor/AimpFileTag.h b/src/SDK/aimp_dotnet/SDK/TagEditor/AimpFileTag.h index b26b6029..7498ad94 100644 --- a/src/SDK/aimp_dotnet/SDK/TagEditor/AimpFileTag.h +++ b/src/SDK/aimp_dotnet/SDK/TagEditor/AimpFileTag.h @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/TagEditor/AimpFileTagEditor.cpp b/src/SDK/aimp_dotnet/SDK/TagEditor/AimpFileTagEditor.cpp index 7045c5dc..60994edd 100644 --- a/src/SDK/aimp_dotnet/SDK/TagEditor/AimpFileTagEditor.cpp +++ b/src/SDK/aimp_dotnet/SDK/TagEditor/AimpFileTagEditor.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/TagEditor/AimpFileTagEditor.h b/src/SDK/aimp_dotnet/SDK/TagEditor/AimpFileTagEditor.h index 1a3b1217..307f9068 100644 --- a/src/SDK/aimp_dotnet/SDK/TagEditor/AimpFileTagEditor.h +++ b/src/SDK/aimp_dotnet/SDK/TagEditor/AimpFileTagEditor.h @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/TagEditor/AimpServiceFileTagEditor.cpp b/src/SDK/aimp_dotnet/SDK/TagEditor/AimpServiceFileTagEditor.cpp index 90013171..b8521ff7 100644 --- a/src/SDK/aimp_dotnet/SDK/TagEditor/AimpServiceFileTagEditor.cpp +++ b/src/SDK/aimp_dotnet/SDK/TagEditor/AimpServiceFileTagEditor.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/TagEditor/AimpServiceFileTagEditor.h b/src/SDK/aimp_dotnet/SDK/TagEditor/AimpServiceFileTagEditor.h index a544de6a..2b8bd907 100644 --- a/src/SDK/aimp_dotnet/SDK/TagEditor/AimpServiceFileTagEditor.h +++ b/src/SDK/aimp_dotnet/SDK/TagEditor/AimpServiceFileTagEditor.h @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/TagEditor/InternalExtensionTagsProvider.cpp b/src/SDK/aimp_dotnet/SDK/TagEditor/InternalExtensionTagsProvider.cpp index 3cd66639..20183a2b 100644 --- a/src/SDK/aimp_dotnet/SDK/TagEditor/InternalExtensionTagsProvider.cpp +++ b/src/SDK/aimp_dotnet/SDK/TagEditor/InternalExtensionTagsProvider.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/TagEditor/InternalExtensionTagsProvider.h b/src/SDK/aimp_dotnet/SDK/TagEditor/InternalExtensionTagsProvider.h index 7f629408..e2db35f7 100644 --- a/src/SDK/aimp_dotnet/SDK/TagEditor/InternalExtensionTagsProvider.h +++ b/src/SDK/aimp_dotnet/SDK/TagEditor/InternalExtensionTagsProvider.h @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/Threading/AimpServiceSynchronizer.cpp b/src/SDK/aimp_dotnet/SDK/Threading/AimpServiceSynchronizer.cpp index 67ace82e..cc9836a9 100644 --- a/src/SDK/aimp_dotnet/SDK/Threading/AimpServiceSynchronizer.cpp +++ b/src/SDK/aimp_dotnet/SDK/Threading/AimpServiceSynchronizer.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/Threading/AimpServiceSynchronizer.h b/src/SDK/aimp_dotnet/SDK/Threading/AimpServiceSynchronizer.h index 8c42bba9..2008f1fb 100644 --- a/src/SDK/aimp_dotnet/SDK/Threading/AimpServiceSynchronizer.h +++ b/src/SDK/aimp_dotnet/SDK/Threading/AimpServiceSynchronizer.h @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/Threading/AimpServiceThreadPool.cpp b/src/SDK/aimp_dotnet/SDK/Threading/AimpServiceThreadPool.cpp index 9ea3c375..f113cace 100644 --- a/src/SDK/aimp_dotnet/SDK/Threading/AimpServiceThreadPool.cpp +++ b/src/SDK/aimp_dotnet/SDK/Threading/AimpServiceThreadPool.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/Threading/AimpServiceThreadPool.h b/src/SDK/aimp_dotnet/SDK/Threading/AimpServiceThreadPool.h index 75a28537..57c33ac7 100644 --- a/src/SDK/aimp_dotnet/SDK/Threading/AimpServiceThreadPool.h +++ b/src/SDK/aimp_dotnet/SDK/Threading/AimpServiceThreadPool.h @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/Threading/AimpServiceThreads.cpp b/src/SDK/aimp_dotnet/SDK/Threading/AimpServiceThreads.cpp index 8f01b07f..ea43a95a 100644 --- a/src/SDK/aimp_dotnet/SDK/Threading/AimpServiceThreads.cpp +++ b/src/SDK/aimp_dotnet/SDK/Threading/AimpServiceThreads.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/Threading/AimpServiceThreads.h b/src/SDK/aimp_dotnet/SDK/Threading/AimpServiceThreads.h index 832337c6..f1fcb537 100644 --- a/src/SDK/aimp_dotnet/SDK/Threading/AimpServiceThreads.h +++ b/src/SDK/aimp_dotnet/SDK/Threading/AimpServiceThreads.h @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/Threading/AimpTaskOwner.cpp b/src/SDK/aimp_dotnet/SDK/Threading/AimpTaskOwner.cpp index c4d5ef6d..6cf8b911 100644 --- a/src/SDK/aimp_dotnet/SDK/Threading/AimpTaskOwner.cpp +++ b/src/SDK/aimp_dotnet/SDK/Threading/AimpTaskOwner.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/Threading/AimpTaskOwner.h b/src/SDK/aimp_dotnet/SDK/Threading/AimpTaskOwner.h index 04e9e6df..daf395b5 100644 --- a/src/SDK/aimp_dotnet/SDK/Threading/AimpTaskOwner.h +++ b/src/SDK/aimp_dotnet/SDK/Threading/AimpTaskOwner.h @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/Threading/InternalAimpTask.cpp b/src/SDK/aimp_dotnet/SDK/Threading/InternalAimpTask.cpp index 5bddbad4..7ad0d3e1 100644 --- a/src/SDK/aimp_dotnet/SDK/Threading/InternalAimpTask.cpp +++ b/src/SDK/aimp_dotnet/SDK/Threading/InternalAimpTask.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/Threading/InternalAimpTask.h b/src/SDK/aimp_dotnet/SDK/Threading/InternalAimpTask.h index 974e5f31..14d60bc9 100644 --- a/src/SDK/aimp_dotnet/SDK/Threading/InternalAimpTask.h +++ b/src/SDK/aimp_dotnet/SDK/Threading/InternalAimpTask.h @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/Visuals/AimpExtensionCustomVisualization.cpp b/src/SDK/aimp_dotnet/SDK/Visuals/AimpExtensionCustomVisualization.cpp index b698afc5..423cd836 100644 --- a/src/SDK/aimp_dotnet/SDK/Visuals/AimpExtensionCustomVisualization.cpp +++ b/src/SDK/aimp_dotnet/SDK/Visuals/AimpExtensionCustomVisualization.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/Visuals/AimpExtensionCustomVisualization.h b/src/SDK/aimp_dotnet/SDK/Visuals/AimpExtensionCustomVisualization.h index 42796a9b..d21ea43a 100644 --- a/src/SDK/aimp_dotnet/SDK/Visuals/AimpExtensionCustomVisualization.h +++ b/src/SDK/aimp_dotnet/SDK/Visuals/AimpExtensionCustomVisualization.h @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/Visuals/AimpExtensionEmbeddedVisualization.cpp b/src/SDK/aimp_dotnet/SDK/Visuals/AimpExtensionEmbeddedVisualization.cpp index 751af31b..5e5a36b5 100644 --- a/src/SDK/aimp_dotnet/SDK/Visuals/AimpExtensionEmbeddedVisualization.cpp +++ b/src/SDK/aimp_dotnet/SDK/Visuals/AimpExtensionEmbeddedVisualization.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/Visuals/AimpExtensionEmbeddedVisualization.h b/src/SDK/aimp_dotnet/SDK/Visuals/AimpExtensionEmbeddedVisualization.h index ada8cd2c..05dd777e 100644 --- a/src/SDK/aimp_dotnet/SDK/Visuals/AimpExtensionEmbeddedVisualization.h +++ b/src/SDK/aimp_dotnet/SDK/Visuals/AimpExtensionEmbeddedVisualization.h @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/Visuals/AimpServiceVisualizations.cpp b/src/SDK/aimp_dotnet/SDK/Visuals/AimpServiceVisualizations.cpp index f5f0c668..3f42d8be 100644 --- a/src/SDK/aimp_dotnet/SDK/Visuals/AimpServiceVisualizations.cpp +++ b/src/SDK/aimp_dotnet/SDK/Visuals/AimpServiceVisualizations.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/Visuals/AimpServiceVisualizations.h b/src/SDK/aimp_dotnet/SDK/Visuals/AimpServiceVisualizations.h index a0262319..660d9e4c 100644 --- a/src/SDK/aimp_dotnet/SDK/Visuals/AimpServiceVisualizations.h +++ b/src/SDK/aimp_dotnet/SDK/Visuals/AimpServiceVisualizations.h @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/Win32/Win32Manager.cpp b/src/SDK/aimp_dotnet/SDK/Win32/Win32Manager.cpp index 6825e6a6..44e78571 100644 --- a/src/SDK/aimp_dotnet/SDK/Win32/Win32Manager.cpp +++ b/src/SDK/aimp_dotnet/SDK/Win32/Win32Manager.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/SDK/Win32/Win32Manager.h b/src/SDK/aimp_dotnet/SDK/Win32/Win32Manager.h index 0149d913..91a7ed06 100644 --- a/src/SDK/aimp_dotnet/SDK/Win32/Win32Manager.h +++ b/src/SDK/aimp_dotnet/SDK/Win32/Win32Manager.h @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/Stdafx.cpp b/src/SDK/aimp_dotnet/Stdafx.cpp index 1e1d441a..d5c73b99 100644 --- a/src/SDK/aimp_dotnet/Stdafx.cpp +++ b/src/SDK/aimp_dotnet/Stdafx.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/Stdafx.h b/src/SDK/aimp_dotnet/Stdafx.h index 9e72cb61..11c40925 100644 --- a/src/SDK/aimp_dotnet/Stdafx.h +++ b/src/SDK/aimp_dotnet/Stdafx.h @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/Utils.h b/src/SDK/aimp_dotnet/Utils.h index 260614ca..6b44aba8 100644 --- a/src/SDK/aimp_dotnet/Utils.h +++ b/src/SDK/aimp_dotnet/Utils.h @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/SDK/aimp_dotnet/resource.h b/src/SDK/aimp_dotnet/resource.h index 8e44bb82..74364456 100644 --- a/src/SDK/aimp_dotnet/resource.h +++ b/src/SDK/aimp_dotnet/resource.h @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/Tests/IntegrationTests/AimpTestRunner.cs b/src/Tests/IntegrationTests/AimpTestRunner.cs index 7483b283..02a2005f 100644 --- a/src/Tests/IntegrationTests/AimpTestRunner.cs +++ b/src/Tests/IntegrationTests/AimpTestRunner.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/Tests/IntegrationTests/Engine/AimpNUnit3FrameworkDriver.cs b/src/Tests/IntegrationTests/Engine/AimpNUnit3FrameworkDriver.cs index 074f0853..9230eb8a 100644 --- a/src/Tests/IntegrationTests/Engine/AimpNUnit3FrameworkDriver.cs +++ b/src/Tests/IntegrationTests/Engine/AimpNUnit3FrameworkDriver.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/Tests/IntegrationTests/Engine/AimpNUnitFrameworkDriver.cs b/src/Tests/IntegrationTests/Engine/AimpNUnitFrameworkDriver.cs index 5f3d576a..658d1233 100644 --- a/src/Tests/IntegrationTests/Engine/AimpNUnitFrameworkDriver.cs +++ b/src/Tests/IntegrationTests/Engine/AimpNUnitFrameworkDriver.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/Tests/IntegrationTests/Engine/ColorStyle.cs b/src/Tests/IntegrationTests/Engine/ColorStyle.cs index 18f84141..33dac276 100644 --- a/src/Tests/IntegrationTests/Engine/ColorStyle.cs +++ b/src/Tests/IntegrationTests/Engine/ColorStyle.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/Tests/IntegrationTests/Engine/ConsoleTestResult.cs b/src/Tests/IntegrationTests/Engine/ConsoleTestResult.cs index 25e6d9eb..0413ee87 100644 --- a/src/Tests/IntegrationTests/Engine/ConsoleTestResult.cs +++ b/src/Tests/IntegrationTests/Engine/ConsoleTestResult.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/Tests/IntegrationTests/Engine/ExtendedTextWrapper.cs b/src/Tests/IntegrationTests/Engine/ExtendedTextWrapper.cs index d8fafdb1..6cb01acf 100644 --- a/src/Tests/IntegrationTests/Engine/ExtendedTextWrapper.cs +++ b/src/Tests/IntegrationTests/Engine/ExtendedTextWrapper.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/Tests/IntegrationTests/Engine/ExtendedTextWriter.cs b/src/Tests/IntegrationTests/Engine/ExtendedTextWriter.cs index d46ab21f..87a1c294 100644 --- a/src/Tests/IntegrationTests/Engine/ExtendedTextWriter.cs +++ b/src/Tests/IntegrationTests/Engine/ExtendedTextWriter.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/Tests/IntegrationTests/Engine/ResultReporter.cs b/src/Tests/IntegrationTests/Engine/ResultReporter.cs index df679f82..c931c819 100644 --- a/src/Tests/IntegrationTests/Engine/ResultReporter.cs +++ b/src/Tests/IntegrationTests/Engine/ResultReporter.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/Tests/IntegrationTests/Engine/ResultSummary.cs b/src/Tests/IntegrationTests/Engine/ResultSummary.cs index 6744954d..aab27d24 100644 --- a/src/Tests/IntegrationTests/Engine/ResultSummary.cs +++ b/src/Tests/IntegrationTests/Engine/ResultSummary.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/Tests/IntegrationTests/Properties/PluginAssemblyInfo.cs b/src/Tests/IntegrationTests/Properties/PluginAssemblyInfo.cs index 746dbbf4..8f0398b6 100644 --- a/src/Tests/IntegrationTests/Properties/PluginAssemblyInfo.cs +++ b/src/Tests/IntegrationTests/Properties/PluginAssemblyInfo.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/Tests/IntegrationTests/TestFramework/AimpIntegrationTest.cs b/src/Tests/IntegrationTests/TestFramework/AimpIntegrationTest.cs index 0f410e65..22d4a6e6 100644 --- a/src/Tests/IntegrationTests/TestFramework/AimpIntegrationTest.cs +++ b/src/Tests/IntegrationTests/TestFramework/AimpIntegrationTest.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/Tests/IntegrationTests/TestFramework/Assert/EqualAssert.cs b/src/Tests/IntegrationTests/TestFramework/Assert/EqualAssert.cs index 44ac62fd..3aacae82 100644 --- a/src/Tests/IntegrationTests/TestFramework/Assert/EqualAssert.cs +++ b/src/Tests/IntegrationTests/TestFramework/Assert/EqualAssert.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/Tests/IntegrationTests/TestFramework/Assert/FalseAssert.cs b/src/Tests/IntegrationTests/TestFramework/Assert/FalseAssert.cs index 6c666cd0..72717642 100644 --- a/src/Tests/IntegrationTests/TestFramework/Assert/FalseAssert.cs +++ b/src/Tests/IntegrationTests/TestFramework/Assert/FalseAssert.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/Tests/IntegrationTests/TestFramework/Assert/MemberAssert.cs b/src/Tests/IntegrationTests/TestFramework/Assert/MemberAssert.cs index 19f79b76..0ecdbac1 100644 --- a/src/Tests/IntegrationTests/TestFramework/Assert/MemberAssert.cs +++ b/src/Tests/IntegrationTests/TestFramework/Assert/MemberAssert.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/Tests/IntegrationTests/TestFramework/Assert/NotEqualAssert.cs b/src/Tests/IntegrationTests/TestFramework/Assert/NotEqualAssert.cs index 02de77d2..3350f7eb 100644 --- a/src/Tests/IntegrationTests/TestFramework/Assert/NotEqualAssert.cs +++ b/src/Tests/IntegrationTests/TestFramework/Assert/NotEqualAssert.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/Tests/IntegrationTests/TestFramework/Assert/NotNullAssert.cs b/src/Tests/IntegrationTests/TestFramework/Assert/NotNullAssert.cs index eab826d7..d68b3a2a 100644 --- a/src/Tests/IntegrationTests/TestFramework/Assert/NotNullAssert.cs +++ b/src/Tests/IntegrationTests/TestFramework/Assert/NotNullAssert.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/Tests/IntegrationTests/TestFramework/Assert/NullAssert.cs b/src/Tests/IntegrationTests/TestFramework/Assert/NullAssert.cs index 7bbb26f1..cd36e3a7 100644 --- a/src/Tests/IntegrationTests/TestFramework/Assert/NullAssert.cs +++ b/src/Tests/IntegrationTests/TestFramework/Assert/NullAssert.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/Tests/IntegrationTests/TestFramework/Assert/ThrowAssert.cs b/src/Tests/IntegrationTests/TestFramework/Assert/ThrowAssert.cs index 5820da74..3c1435a3 100644 --- a/src/Tests/IntegrationTests/TestFramework/Assert/ThrowAssert.cs +++ b/src/Tests/IntegrationTests/TestFramework/Assert/ThrowAssert.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/Tests/IntegrationTests/TestFramework/Assert/TrueAssert.cs b/src/Tests/IntegrationTests/TestFramework/Assert/TrueAssert.cs index 31a91e08..92cedd61 100644 --- a/src/Tests/IntegrationTests/TestFramework/Assert/TrueAssert.cs +++ b/src/Tests/IntegrationTests/TestFramework/Assert/TrueAssert.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/Tests/IntegrationTests/TestFramework/IntegrationTestExtension.cs b/src/Tests/IntegrationTests/TestFramework/IntegrationTestExtension.cs index a104f0e0..e083c38a 100644 --- a/src/Tests/IntegrationTests/TestFramework/IntegrationTestExtension.cs +++ b/src/Tests/IntegrationTests/TestFramework/IntegrationTestExtension.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/Tests/IntegrationTests/UnitTests/ActionManager/AimpServiceActionManagerTests.cs b/src/Tests/IntegrationTests/UnitTests/ActionManager/AimpServiceActionManagerTests.cs index f640bfc4..bf8bae40 100644 --- a/src/Tests/IntegrationTests/UnitTests/ActionManager/AimpServiceActionManagerTests.cs +++ b/src/Tests/IntegrationTests/UnitTests/ActionManager/AimpServiceActionManagerTests.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/Tests/IntegrationTests/UnitTests/AimpCoreTests.cs b/src/Tests/IntegrationTests/UnitTests/AimpCoreTests.cs index 78ba573e..89b02f46 100644 --- a/src/Tests/IntegrationTests/UnitTests/AimpCoreTests.cs +++ b/src/Tests/IntegrationTests/UnitTests/AimpCoreTests.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/Tests/IntegrationTests/UnitTests/AimpErrorInfoTests.cs b/src/Tests/IntegrationTests/UnitTests/AimpErrorInfoTests.cs index 8d00d6e1..140a5a8e 100644 --- a/src/Tests/IntegrationTests/UnitTests/AimpErrorInfoTests.cs +++ b/src/Tests/IntegrationTests/UnitTests/AimpErrorInfoTests.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/Tests/IntegrationTests/UnitTests/AimpServiceConfig/AimpServiceConfigTests.cs b/src/Tests/IntegrationTests/UnitTests/AimpServiceConfig/AimpServiceConfigTests.cs index 8cbe9124..c140b0c3 100644 --- a/src/Tests/IntegrationTests/UnitTests/AimpServiceConfig/AimpServiceConfigTests.cs +++ b/src/Tests/IntegrationTests/UnitTests/AimpServiceConfig/AimpServiceConfigTests.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/Tests/IntegrationTests/UnitTests/AimpTestContext.cs b/src/Tests/IntegrationTests/UnitTests/AimpTestContext.cs index e8427505..8ac6dcee 100644 --- a/src/Tests/IntegrationTests/UnitTests/AimpTestContext.cs +++ b/src/Tests/IntegrationTests/UnitTests/AimpTestContext.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/Tests/IntegrationTests/UnitTests/AlbumArtManager/AimpServiceAlbumArtCacheTests.cs b/src/Tests/IntegrationTests/UnitTests/AlbumArtManager/AimpServiceAlbumArtCacheTests.cs index e7fec14b..2a47e8c2 100644 --- a/src/Tests/IntegrationTests/UnitTests/AlbumArtManager/AimpServiceAlbumArtCacheTests.cs +++ b/src/Tests/IntegrationTests/UnitTests/AlbumArtManager/AimpServiceAlbumArtCacheTests.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/Tests/IntegrationTests/UnitTests/AlbumArtManager/AimpServiceAlbumArtTests.cs b/src/Tests/IntegrationTests/UnitTests/AlbumArtManager/AimpServiceAlbumArtTests.cs index 29f9aaca..4d3ca0c3 100644 --- a/src/Tests/IntegrationTests/UnitTests/AlbumArtManager/AimpServiceAlbumArtTests.cs +++ b/src/Tests/IntegrationTests/UnitTests/AlbumArtManager/AimpServiceAlbumArtTests.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/Tests/IntegrationTests/UnitTests/AlbumArtManager/Extension/AimpExtensionAlbumArtProviderTests.cs b/src/Tests/IntegrationTests/UnitTests/AlbumArtManager/Extension/AimpExtensionAlbumArtProviderTests.cs index 8c6d2b16..af77ab32 100644 --- a/src/Tests/IntegrationTests/UnitTests/AlbumArtManager/Extension/AimpExtensionAlbumArtProviderTests.cs +++ b/src/Tests/IntegrationTests/UnitTests/AlbumArtManager/Extension/AimpExtensionAlbumArtProviderTests.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/Tests/IntegrationTests/UnitTests/Core/AimpServiceVersionInfoTests.cs b/src/Tests/IntegrationTests/UnitTests/Core/AimpServiceVersionInfoTests.cs index 9b0af570..1845476d 100644 --- a/src/Tests/IntegrationTests/UnitTests/Core/AimpServiceVersionInfoTests.cs +++ b/src/Tests/IntegrationTests/UnitTests/Core/AimpServiceVersionInfoTests.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/Tests/IntegrationTests/UnitTests/FileManager/AimpFileInfoUnitTests.cs b/src/Tests/IntegrationTests/UnitTests/FileManager/AimpFileInfoUnitTests.cs index f763f40d..28543b3d 100644 --- a/src/Tests/IntegrationTests/UnitTests/FileManager/AimpFileInfoUnitTests.cs +++ b/src/Tests/IntegrationTests/UnitTests/FileManager/AimpFileInfoUnitTests.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/Tests/IntegrationTests/UnitTests/FileManager/AimpServiceFileStreamingUnitTests.cs b/src/Tests/IntegrationTests/UnitTests/FileManager/AimpServiceFileStreamingUnitTests.cs index d25d10e1..f449041d 100644 --- a/src/Tests/IntegrationTests/UnitTests/FileManager/AimpServiceFileStreamingUnitTests.cs +++ b/src/Tests/IntegrationTests/UnitTests/FileManager/AimpServiceFileStreamingUnitTests.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/Tests/IntegrationTests/UnitTests/FileManager/Extensions/AimpExtensionFileExpanderUnitTests.cs b/src/Tests/IntegrationTests/UnitTests/FileManager/Extensions/AimpExtensionFileExpanderUnitTests.cs index 0b6b7a54..ff7f5dc4 100644 --- a/src/Tests/IntegrationTests/UnitTests/FileManager/Extensions/AimpExtensionFileExpanderUnitTests.cs +++ b/src/Tests/IntegrationTests/UnitTests/FileManager/Extensions/AimpExtensionFileExpanderUnitTests.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/Tests/IntegrationTests/UnitTests/FileManager/Extensions/AimpExtensionFileFormatUnitTests.cs b/src/Tests/IntegrationTests/UnitTests/FileManager/Extensions/AimpExtensionFileFormatUnitTests.cs index 5495698f..a9b0f1b0 100644 --- a/src/Tests/IntegrationTests/UnitTests/FileManager/Extensions/AimpExtensionFileFormatUnitTests.cs +++ b/src/Tests/IntegrationTests/UnitTests/FileManager/Extensions/AimpExtensionFileFormatUnitTests.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/Tests/IntegrationTests/UnitTests/FileManager/IAimpServiceFileURI2UnitTests.cs b/src/Tests/IntegrationTests/UnitTests/FileManager/IAimpServiceFileURI2UnitTests.cs index ae4ca608..bcd80db1 100644 --- a/src/Tests/IntegrationTests/UnitTests/FileManager/IAimpServiceFileURI2UnitTests.cs +++ b/src/Tests/IntegrationTests/UnitTests/FileManager/IAimpServiceFileURI2UnitTests.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/Tests/IntegrationTests/UnitTests/FileManager/IAimpServiceFileURIUnitTests.cs b/src/Tests/IntegrationTests/UnitTests/FileManager/IAimpServiceFileURIUnitTests.cs index e34f0f86..a6360ec1 100644 --- a/src/Tests/IntegrationTests/UnitTests/FileManager/IAimpServiceFileURIUnitTests.cs +++ b/src/Tests/IntegrationTests/UnitTests/FileManager/IAimpServiceFileURIUnitTests.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/Tests/IntegrationTests/UnitTests/Lyrics/AimpLyricsTests.cs b/src/Tests/IntegrationTests/UnitTests/Lyrics/AimpLyricsTests.cs index a23026b2..2e996d52 100644 --- a/src/Tests/IntegrationTests/UnitTests/Lyrics/AimpLyricsTests.cs +++ b/src/Tests/IntegrationTests/UnitTests/Lyrics/AimpLyricsTests.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/Tests/IntegrationTests/UnitTests/Lyrics/AimpServiceLyricsTests.cs b/src/Tests/IntegrationTests/UnitTests/Lyrics/AimpServiceLyricsTests.cs index d8e3e35c..975bf594 100644 --- a/src/Tests/IntegrationTests/UnitTests/Lyrics/AimpServiceLyricsTests.cs +++ b/src/Tests/IntegrationTests/UnitTests/Lyrics/AimpServiceLyricsTests.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/Tests/IntegrationTests/UnitTests/MenuManager/AimpMenuItemTests.cs b/src/Tests/IntegrationTests/UnitTests/MenuManager/AimpMenuItemTests.cs index 9bdb285d..39d7fadb 100644 --- a/src/Tests/IntegrationTests/UnitTests/MenuManager/AimpMenuItemTests.cs +++ b/src/Tests/IntegrationTests/UnitTests/MenuManager/AimpMenuItemTests.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/Tests/IntegrationTests/UnitTests/MenuManager/AimpServiceMenuManagerTests.cs b/src/Tests/IntegrationTests/UnitTests/MenuManager/AimpServiceMenuManagerTests.cs index 97022d3e..6b78c641 100644 --- a/src/Tests/IntegrationTests/UnitTests/MenuManager/AimpServiceMenuManagerTests.cs +++ b/src/Tests/IntegrationTests/UnitTests/MenuManager/AimpServiceMenuManagerTests.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/Tests/IntegrationTests/UnitTests/MessageDispatcher/AimpServiceMessageDispatcherTests.cs b/src/Tests/IntegrationTests/UnitTests/MessageDispatcher/AimpServiceMessageDispatcherTests.cs index ebb3d460..251191cb 100644 --- a/src/Tests/IntegrationTests/UnitTests/MessageDispatcher/AimpServiceMessageDispatcherTests.cs +++ b/src/Tests/IntegrationTests/UnitTests/MessageDispatcher/AimpServiceMessageDispatcherTests.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/Tests/IntegrationTests/UnitTests/MusicLibrary/AimpServiceMusicLibraryTests.cs b/src/Tests/IntegrationTests/UnitTests/MusicLibrary/AimpServiceMusicLibraryTests.cs index 9cb7d41b..ec676e5f 100644 --- a/src/Tests/IntegrationTests/UnitTests/MusicLibrary/AimpServiceMusicLibraryTests.cs +++ b/src/Tests/IntegrationTests/UnitTests/MusicLibrary/AimpServiceMusicLibraryTests.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/Tests/IntegrationTests/UnitTests/Objects/AimpFileStreamUnitTests.cs b/src/Tests/IntegrationTests/UnitTests/Objects/AimpFileStreamUnitTests.cs index 8d55c44c..81e60d46 100644 --- a/src/Tests/IntegrationTests/UnitTests/Objects/AimpFileStreamUnitTests.cs +++ b/src/Tests/IntegrationTests/UnitTests/Objects/AimpFileStreamUnitTests.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/Tests/IntegrationTests/UnitTests/Objects/AimpImageUnitTests.cs b/src/Tests/IntegrationTests/UnitTests/Objects/AimpImageUnitTests.cs index 88ca1706..4c2a6de0 100644 --- a/src/Tests/IntegrationTests/UnitTests/Objects/AimpImageUnitTests.cs +++ b/src/Tests/IntegrationTests/UnitTests/Objects/AimpImageUnitTests.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/Tests/IntegrationTests/UnitTests/Objects/AimpOrderedListTests.cs b/src/Tests/IntegrationTests/UnitTests/Objects/AimpOrderedListTests.cs index 6dc19829..45fb866a 100644 --- a/src/Tests/IntegrationTests/UnitTests/Objects/AimpOrderedListTests.cs +++ b/src/Tests/IntegrationTests/UnitTests/Objects/AimpOrderedListTests.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/Tests/IntegrationTests/UnitTests/Objects/AimpStreamUnitTests.cs b/src/Tests/IntegrationTests/UnitTests/Objects/AimpStreamUnitTests.cs index 926c7c40..c39fc3fa 100644 --- a/src/Tests/IntegrationTests/UnitTests/Objects/AimpStreamUnitTests.cs +++ b/src/Tests/IntegrationTests/UnitTests/Objects/AimpStreamUnitTests.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/Tests/IntegrationTests/UnitTests/Objects/AimpStringUnitTests.cs b/src/Tests/IntegrationTests/UnitTests/Objects/AimpStringUnitTests.cs index 79344049..6775ade8 100644 --- a/src/Tests/IntegrationTests/UnitTests/Objects/AimpStringUnitTests.cs +++ b/src/Tests/IntegrationTests/UnitTests/Objects/AimpStringUnitTests.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/Tests/IntegrationTests/UnitTests/Playback/AimpPlaybackQueueServiceTests.cs b/src/Tests/IntegrationTests/UnitTests/Playback/AimpPlaybackQueueServiceTests.cs index 032d13a6..c26826ab 100644 --- a/src/Tests/IntegrationTests/UnitTests/Playback/AimpPlaybackQueueServiceTests.cs +++ b/src/Tests/IntegrationTests/UnitTests/Playback/AimpPlaybackQueueServiceTests.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/Tests/IntegrationTests/UnitTests/Playback/PlayerHookTests.cs b/src/Tests/IntegrationTests/UnitTests/Playback/PlayerHookTests.cs index d397cc9e..93a13b46 100644 --- a/src/Tests/IntegrationTests/UnitTests/Playback/PlayerHookTests.cs +++ b/src/Tests/IntegrationTests/UnitTests/Playback/PlayerHookTests.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/Tests/IntegrationTests/UnitTests/Player/AimpEqualizerPresetTests.cs b/src/Tests/IntegrationTests/UnitTests/Player/AimpEqualizerPresetTests.cs index af54f4d9..c83f402f 100644 --- a/src/Tests/IntegrationTests/UnitTests/Player/AimpEqualizerPresetTests.cs +++ b/src/Tests/IntegrationTests/UnitTests/Player/AimpEqualizerPresetTests.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/Tests/IntegrationTests/UnitTests/Player/AimpExtensionPlaybackQueue2Tests.cs b/src/Tests/IntegrationTests/UnitTests/Player/AimpExtensionPlaybackQueue2Tests.cs index 692edf52..df8911ab 100644 --- a/src/Tests/IntegrationTests/UnitTests/Player/AimpExtensionPlaybackQueue2Tests.cs +++ b/src/Tests/IntegrationTests/UnitTests/Player/AimpExtensionPlaybackQueue2Tests.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/Tests/IntegrationTests/UnitTests/Player/AimpExtensionPlaybackQueueTests.cs b/src/Tests/IntegrationTests/UnitTests/Player/AimpExtensionPlaybackQueueTests.cs index 1e91cad7..e3a8ce6d 100644 --- a/src/Tests/IntegrationTests/UnitTests/Player/AimpExtensionPlaybackQueueTests.cs +++ b/src/Tests/IntegrationTests/UnitTests/Player/AimpExtensionPlaybackQueueTests.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/Tests/IntegrationTests/UnitTests/Player/AimpExtensionWaveFormProviderTests.cs b/src/Tests/IntegrationTests/UnitTests/Player/AimpExtensionWaveFormProviderTests.cs index 945f1b45..ab5e9a07 100644 --- a/src/Tests/IntegrationTests/UnitTests/Player/AimpExtensionWaveFormProviderTests.cs +++ b/src/Tests/IntegrationTests/UnitTests/Player/AimpExtensionWaveFormProviderTests.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/Tests/IntegrationTests/UnitTests/Player/AimpPlayerTests.cs b/src/Tests/IntegrationTests/UnitTests/Player/AimpPlayerTests.cs index 661555fa..53dd87a5 100644 --- a/src/Tests/IntegrationTests/UnitTests/Player/AimpPlayerTests.cs +++ b/src/Tests/IntegrationTests/UnitTests/Player/AimpPlayerTests.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/Tests/IntegrationTests/UnitTests/Player/AimpServicePlayerEqualizerPresetsTests.cs b/src/Tests/IntegrationTests/UnitTests/Player/AimpServicePlayerEqualizerPresetsTests.cs index a8b3dea0..76698aaa 100644 --- a/src/Tests/IntegrationTests/UnitTests/Player/AimpServicePlayerEqualizerPresetsTests.cs +++ b/src/Tests/IntegrationTests/UnitTests/Player/AimpServicePlayerEqualizerPresetsTests.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/Tests/IntegrationTests/UnitTests/Player/AimpServicePlayerEqualizerTests.cs b/src/Tests/IntegrationTests/UnitTests/Player/AimpServicePlayerEqualizerTests.cs index 4927b305..599a2179 100644 --- a/src/Tests/IntegrationTests/UnitTests/Player/AimpServicePlayerEqualizerTests.cs +++ b/src/Tests/IntegrationTests/UnitTests/Player/AimpServicePlayerEqualizerTests.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/Tests/IntegrationTests/UnitTests/Player/AimpServicePlayerTests.cs b/src/Tests/IntegrationTests/UnitTests/Player/AimpServicePlayerTests.cs index a0aca1c7..1ab50abb 100644 --- a/src/Tests/IntegrationTests/UnitTests/Player/AimpServicePlayerTests.cs +++ b/src/Tests/IntegrationTests/UnitTests/Player/AimpServicePlayerTests.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/Tests/IntegrationTests/UnitTests/Playlist/AimpPlaylistManagerTests.cs b/src/Tests/IntegrationTests/UnitTests/Playlist/AimpPlaylistManagerTests.cs index 467ed8e9..47021274 100644 --- a/src/Tests/IntegrationTests/UnitTests/Playlist/AimpPlaylistManagerTests.cs +++ b/src/Tests/IntegrationTests/UnitTests/Playlist/AimpPlaylistManagerTests.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/Tests/IntegrationTests/UnitTests/Playlist/AimpPlaylistQueueTests.cs b/src/Tests/IntegrationTests/UnitTests/Playlist/AimpPlaylistQueueTests.cs index 597b1e5d..65a81cf1 100644 --- a/src/Tests/IntegrationTests/UnitTests/Playlist/AimpPlaylistQueueTests.cs +++ b/src/Tests/IntegrationTests/UnitTests/Playlist/AimpPlaylistQueueTests.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/Tests/IntegrationTests/UnitTests/Playlist/AimpPlaylistTests.cs b/src/Tests/IntegrationTests/UnitTests/Playlist/AimpPlaylistTests.cs index ccbd37de..1f7763ec 100644 --- a/src/Tests/IntegrationTests/UnitTests/Playlist/AimpPlaylistTests.cs +++ b/src/Tests/IntegrationTests/UnitTests/Playlist/AimpPlaylistTests.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/Tests/IntegrationTests/UnitTests/TagEditor/AimpServiceFileTagEditorTests.cs b/src/Tests/IntegrationTests/UnitTests/TagEditor/AimpServiceFileTagEditorTests.cs index 1edefd85..2abfcaa1 100644 --- a/src/Tests/IntegrationTests/UnitTests/TagEditor/AimpServiceFileTagEditorTests.cs +++ b/src/Tests/IntegrationTests/UnitTests/TagEditor/AimpServiceFileTagEditorTests.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com diff --git a/src/Tests/IntegrationTests/UnitTests/Threading/AimpServiceThreadsTests.cs b/src/Tests/IntegrationTests/UnitTests/Threading/AimpServiceThreadsTests.cs index f9eefe60..b4eae4a2 100644 --- a/src/Tests/IntegrationTests/UnitTests/Threading/AimpServiceThreadsTests.cs +++ b/src/Tests/IntegrationTests/UnitTests/Threading/AimpServiceThreadsTests.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------- // AIMP DotNet SDK // -// Copyright (c) 2014 - 2022 Evgeniy Bogdan +// Copyright (c) 2014 - 2023 Evgeniy Bogdan // https://github.com/martin211/aimp_dotnet // // Mail: mail4evgeniy@gmail.com From c720f9b92a540b90b00163809b86827ee7c6f5aa Mon Sep 17 00:00:00 2001 From: Evgeny Date: Wed, 15 Feb 2023 22:18:30 +0300 Subject: [PATCH 04/36] Fix build --- .nuke/build.schema.json | 2 -- GitVersion.yml | 6 +++--- build/Build.cs | 16 +++++++++++++--- 3 files changed, 16 insertions(+), 8 deletions(-) diff --git a/.nuke/build.schema.json b/.nuke/build.schema.json index ac5cc631..010232d4 100644 --- a/.nuke/build.schema.json +++ b/.nuke/build.schema.json @@ -118,7 +118,6 @@ "PrepareIntegrationTests", "PrepareTestConfiguration", "PrintBuildParameters", - "PrintDefaultBuildParameters", "Publish", "PublishDocumentation", "PushDocumentation", @@ -168,7 +167,6 @@ "PrepareIntegrationTests", "PrepareTestConfiguration", "PrintBuildParameters", - "PrintDefaultBuildParameters", "Publish", "PublishDocumentation", "PushDocumentation", diff --git a/GitVersion.yml b/GitVersion.yml index 28da06f2..478ee36e 100644 --- a/GitVersion.yml +++ b/GitVersion.yml @@ -2,10 +2,10 @@ assembly-versioning-scheme: MajorMinorPatchTag assembly-file-versioning-scheme: MajorMinorPatchTag continuous-delivery-fallback-tag: '' branches: - master: - regex: ^master + develop: + regex: ^develop mode: ContinuousDeployment - tag: '' + tag: 'preview' increment: None prevent-increment-of-merged-branch-version: true track-merge-target: false diff --git a/build/Build.cs b/build/Build.cs index 1645aec1..efb944be 100644 --- a/build/Build.cs +++ b/build/Build.cs @@ -13,6 +13,7 @@ using System.IO.Compression; using System.Linq; using System.Reflection; +using Microsoft.Build.Tasks; using Nuke.Common; using Nuke.Common.CI.GitLab; using Nuke.Common.CI.TeamCity; @@ -26,6 +27,7 @@ using Nuke.Common.Tools.NuGet; using Nuke.Common.Utilities; using Nuke.Common.Utilities.Collections; +using Octokit; using Serilog; using static Nuke.Common.IO.FileSystemTasks; using static Nuke.Common.IO.PathConstruction; @@ -397,17 +399,25 @@ void GetVersion() } else { - var tag = GitRepository.Tags.LastOrDefault(); + var localBranch = GitRepository.FromLocalDirectory(GitRepository.LocalDirectory); + var tagsDirectory = (AbsolutePath)localBranch.LocalDirectory / ".git" / "refs" / "tags"; + var localTags = tagsDirectory + .GlobFiles("**/*") + .Select(x => tagsDirectory.GetUnixRelativePathTo(x).ToString()); + + var tag = localTags.LastOrDefault(); if (tag != null) { - _buildNumber = $"{tag}.{GitVersion.BuildMetaData}"; - _version = tag; + _version = tag.Substring(0, tag.LastIndexOf(".") - 1); + _buildNumber = $"{_version}{GitVersion.PreReleaseTagWithDash}"; } else { _version = BuildNumber; } + + return; } _buildNumber = $"{_version}{(!string.IsNullOrWhiteSpace(GitVersion.BuildMetaData) ? "." : string.Empty)}{GitVersion.BuildMetaData}"; From ae662f5e2f8c1ff97cf56328bde71f7db0f6a4e3 Mon Sep 17 00:00:00 2001 From: Evgeny Date: Wed, 15 Feb 2023 22:46:24 +0300 Subject: [PATCH 05/36] Fix build --- build/Build.cs | 33 +++++++++++++++++++++++---------- 1 file changed, 23 insertions(+), 10 deletions(-) diff --git a/build/Build.cs b/build/Build.cs index efb944be..9e98cdbd 100644 --- a/build/Build.cs +++ b/build/Build.cs @@ -387,40 +387,53 @@ void PrintParameters(string prefix) void GetVersion() { + Log.Information("Current branch: {Branch}", GitRepository.Branch); + if (GitRepository.Branch.StartsWith(MailstoneBranch)) { _version = GitRepository.Branch .Replace($"{MailstoneBranch}_", string.Empty) .Replace("_", "."); + + _buildNumber = $"{_version}{(!string.IsNullOrWhiteSpace(GitVersion.BuildMetaData) ? "." : string.Empty)}{GitVersion.BuildMetaData}"; } else if (GitRepository.Branch.StartsWith(ReleaseBranchPrefix)) { _version = GitRepository.Branch.Split("/")[1]; + _buildNumber = $"{_version}{(!string.IsNullOrWhiteSpace(GitVersion.BuildMetaData) ? "." : string.Empty)}{GitVersion.BuildMetaData}"; } else { - var localBranch = GitRepository.FromLocalDirectory(GitRepository.LocalDirectory); - var tagsDirectory = (AbsolutePath)localBranch.LocalDirectory / ".git" / "refs" / "tags"; - var localTags = tagsDirectory - .GlobFiles("**/*") - .Select(x => tagsDirectory.GetUnixRelativePathTo(x).ToString()); + string tag = string.Empty; - var tag = localTags.LastOrDefault(); + if (IsLocalBuild) + { + var localBranch = GitRepository.FromLocalDirectory(GitRepository.LocalDirectory); + var tagsDirectory = (AbsolutePath)localBranch.LocalDirectory / ".git" / "refs" / "tags"; + var localTags = tagsDirectory + .GlobFiles("**/*") + .Select(x => tagsDirectory.GetUnixRelativePathTo(x).ToString()); + + tag = localTags.LastOrDefault(); + } + else + { + tag = GitRepository.Tags.LastOrDefault(); + } if (tag != null) { - _version = tag.Substring(0, tag.LastIndexOf(".") - 1); + _version = tag.Substring(0, tag.LastIndexOf(".")); _buildNumber = $"{_version}{GitVersion.PreReleaseTagWithDash}"; } else { _version = BuildNumber; + _buildNumber = $"{_version}{(!string.IsNullOrWhiteSpace(GitVersion.BuildMetaData) ? "." : string.Empty)}{GitVersion.BuildMetaData}"; } - return; + Log.Information("Version: {version}", _version); } - - _buildNumber = $"{_version}{(!string.IsNullOrWhiteSpace(GitVersion.BuildMetaData) ? "." : string.Empty)}{GitVersion.BuildMetaData}"; } Target UpdateBuildNumber => _ => _ From 4cef43174836c4d4fd1bb555a6b8bb4938ae7d93 Mon Sep 17 00:00:00 2001 From: Evgeny Date: Wed, 15 Feb 2023 23:02:28 +0300 Subject: [PATCH 06/36] Fix build --- build/Build.cs | 19 ++++++------------- 1 file changed, 6 insertions(+), 13 deletions(-) diff --git a/build/Build.cs b/build/Build.cs index 9e98cdbd..02d0c157 100644 --- a/build/Build.cs +++ b/build/Build.cs @@ -406,20 +406,13 @@ void GetVersion() { string tag = string.Empty; - if (IsLocalBuild) - { - var localBranch = GitRepository.FromLocalDirectory(GitRepository.LocalDirectory); - var tagsDirectory = (AbsolutePath)localBranch.LocalDirectory / ".git" / "refs" / "tags"; - var localTags = tagsDirectory - .GlobFiles("**/*") - .Select(x => tagsDirectory.GetUnixRelativePathTo(x).ToString()); + var localBranch = GitRepository.FromLocalDirectory(GitRepository.LocalDirectory); + var tagsDirectory = (AbsolutePath)localBranch.LocalDirectory / ".git" / "refs" / "tags"; + var localTags = tagsDirectory + .GlobFiles("**/*") + .Select(x => tagsDirectory.GetUnixRelativePathTo(x).ToString()); - tag = localTags.LastOrDefault(); - } - else - { - tag = GitRepository.Tags.LastOrDefault(); - } + tag = localTags.LastOrDefault(); if (tag != null) { From 52e61c1033cd2150ed24d548ebeec82b862f9bae Mon Sep 17 00:00:00 2001 From: Evgeny Date: Thu, 16 Feb 2023 00:30:52 +0300 Subject: [PATCH 07/36] Fix build --- build/Build.cs | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/build/Build.cs b/build/Build.cs index 02d0c157..999c0233 100644 --- a/build/Build.cs +++ b/build/Build.cs @@ -22,6 +22,7 @@ using Nuke.Common.IO; using Nuke.Common.ProjectModel; using Nuke.Common.Tooling; +using Nuke.Common.Tools.Git; using Nuke.Common.Tools.GitVersion; using Nuke.Common.Tools.MSBuild; using Nuke.Common.Tools.NuGet; @@ -387,8 +388,6 @@ void PrintParameters(string prefix) void GetVersion() { - Log.Information("Current branch: {Branch}", GitRepository.Branch); - if (GitRepository.Branch.StartsWith(MailstoneBranch)) { _version = GitRepository.Branch @@ -406,26 +405,27 @@ void GetVersion() { string tag = string.Empty; - var localBranch = GitRepository.FromLocalDirectory(GitRepository.LocalDirectory); - var tagsDirectory = (AbsolutePath)localBranch.LocalDirectory / ".git" / "refs" / "tags"; - var localTags = tagsDirectory - .GlobFiles("**/*") - .Select(x => tagsDirectory.GetUnixRelativePathTo(x).ToString()); + var process = ProcessTasks.StartProcess("git", "ls-remote --tags --sort=-committerdate ./."); + process.WaitForExit(); + var output = process.Output; - tag = localTags.LastOrDefault(); + if (output.Count > 0) + { + var outText = output.First().Text; + tag = outText.Substring(outText.LastIndexOf("/") + 1, outText.Length - outText.LastIndexOf("/") - 1); + } - if (tag != null) + if (!string.IsNullOrWhiteSpace(tag)) { - _version = tag.Substring(0, tag.LastIndexOf(".")); + var patchVersion = int.Parse(tag.Split(".").Last()) + 1; + _version = tag.Substring(0, tag.LastIndexOf(".")) + $".{patchVersion}"; _buildNumber = $"{_version}{GitVersion.PreReleaseTagWithDash}"; } else { - _version = BuildNumber; _buildNumber = $"{_version}{(!string.IsNullOrWhiteSpace(GitVersion.BuildMetaData) ? "." : string.Empty)}{GitVersion.BuildMetaData}"; + _version = BuildNumber; } - - Log.Information("Version: {version}", _version); } } From 3a5ceff28c29138690d8cfcfdcd11eb8e991036a Mon Sep 17 00:00:00 2001 From: Evgeny Date: Thu, 16 Feb 2023 00:40:51 +0300 Subject: [PATCH 08/36] Fix build --- build/Build.cs | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/build/Build.cs b/build/Build.cs index 999c0233..42a8dae3 100644 --- a/build/Build.cs +++ b/build/Build.cs @@ -212,12 +212,7 @@ string BuildNumber if (GitRepository.Branch != null && !GitRepository.Branch.Contains(ReleaseBranchPrefix)) { - config = config.SetSuffix($"preview.{GitVersion.BuildMetaData}"); - } - - if (Configuration == Configuration.Debug) - { - config = config.SetSuffix($"debug.{GitVersion.BuildMetaData}"); + config = config.SetSuffix(GitVersion.PreReleaseTagWithDash); } if (TargetPlatform == MSBuildTargetPlatform.x86) @@ -231,7 +226,6 @@ string BuildNumber if (TargetPlatform == MSBuildTargetPlatform.x64) { - Log.Information("Pack X64 package"); NuGetTasks.NuGetPack(config.SetTargetPath(nugetFolder / "AimpSDK-x64.nuspec")); } From a51cd439c27e9b445b845bd4e2562baa748c1c0a Mon Sep 17 00:00:00 2001 From: Evgeny Date: Thu, 16 Feb 2023 00:45:56 +0300 Subject: [PATCH 09/36] Fix build --- build/Build.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/Build.cs b/build/Build.cs index 42a8dae3..b5738a89 100644 --- a/build/Build.cs +++ b/build/Build.cs @@ -212,7 +212,7 @@ string BuildNumber if (GitRepository.Branch != null && !GitRepository.Branch.Contains(ReleaseBranchPrefix)) { - config = config.SetSuffix(GitVersion.PreReleaseTagWithDash); + config = config.SetSuffix(GitVersion.PreReleaseLabel); } if (TargetPlatform == MSBuildTargetPlatform.x86) From 1c73af99c4ca927420c65792243108ee2453f5c3 Mon Sep 17 00:00:00 2001 From: Evgeny Date: Thu, 16 Feb 2023 00:50:37 +0300 Subject: [PATCH 10/36] Fix build --- build/Build.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/Build.cs b/build/Build.cs index b5738a89..9b74673b 100644 --- a/build/Build.cs +++ b/build/Build.cs @@ -212,7 +212,7 @@ string BuildNumber if (GitRepository.Branch != null && !GitRepository.Branch.Contains(ReleaseBranchPrefix)) { - config = config.SetSuffix(GitVersion.PreReleaseLabel); + config = config.SetSuffix(GitVersion.PreReleaseTag); } if (TargetPlatform == MSBuildTargetPlatform.x86) From 45b6a41a75466ccf68df5030a53078d45d356651 Mon Sep 17 00:00:00 2001 From: Evgeny Date: Thu, 16 Feb 2023 00:57:17 +0300 Subject: [PATCH 11/36] Fix build --- build/Build.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/build/Build.cs b/build/Build.cs index 9b74673b..56528fa7 100644 --- a/build/Build.cs +++ b/build/Build.cs @@ -202,6 +202,8 @@ string BuildNumber { Log.Information("Start build Nuget packages"); + EnsureCleanDirectory(OutputDirectory); + var nugetFolder = RootDirectory / "Nuget"; var config = new NuGetPackSettings() From 572cb6bf1ba33d257796d22bd5e70972de35f5fd Mon Sep 17 00:00:00 2001 From: Evgeny Date: Fri, 3 Mar 2023 00:18:14 +0300 Subject: [PATCH 12/36] =?UTF-8?q?#73=20=D0=94=D0=BE=D0=B1=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=B0=20=D0=BF=D0=BE=D0=B4=D0=B4=D0=B5=D1=80?= =?UTF-8?q?=D0=B6=D0=BA=D0=B0=20user=20data=20=D0=B4=D0=BB=D1=8F=20AimpSer?= =?UTF-8?q?viceAlbumArt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dotnet_albumart/Directory.Build.targets | 2 +- .../SDK/AlbumArt/AimpGetAlbumArtEventArgs.cs | 30 ++++++++++-- .../aimp_dotnet/AIMPSDK/AIMP400/apiAlbumArt.h | 2 +- src/SDK/aimp_dotnet/Aimp_DotNetPlugin.vcxproj | 1 + .../Aimp_DotNetPlugin.vcxproj.filters | 1 + .../SDK/AlbumArt/AimpServiceAlbumArt.cpp | 49 ++++++++++++++----- .../SDK/AlbumArt/AimpServiceAlbumArt.h | 7 ++- src/SDK/aimp_dotnet/SDK/CustomUserData.h | 35 +++++++++++++ 8 files changed, 105 insertions(+), 22 deletions(-) create mode 100644 src/SDK/aimp_dotnet/SDK/CustomUserData.h diff --git a/src/Plugins/dotnet_albumart/Directory.Build.targets b/src/Plugins/dotnet_albumart/Directory.Build.targets index 9d8498b1..f2980577 100644 --- a/src/Plugins/dotnet_albumart/Directory.Build.targets +++ b/src/Plugins/dotnet_albumart/Directory.Build.targets @@ -1,7 +1,7 @@  $(SolutionDir)..\nuget\tools\CopyPlugin.ps1 - AIMP5.02.2369 + AIMP5.11.2421 diff --git a/src/SDK/AIMP.SDK/SDK/AlbumArt/AimpGetAlbumArtEventArgs.cs b/src/SDK/AIMP.SDK/SDK/AlbumArt/AimpGetAlbumArtEventArgs.cs index 44983124..2920c411 100644 --- a/src/SDK/AIMP.SDK/SDK/AlbumArt/AimpGetAlbumArtEventArgs.cs +++ b/src/SDK/AIMP.SDK/SDK/AlbumArt/AimpGetAlbumArtEventArgs.cs @@ -10,6 +10,8 @@ using System; using System.Drawing; +using AIMP.SDK.Objects; + namespace AIMP.SDK.AlbumArt { /// @@ -19,10 +21,32 @@ namespace AIMP.SDK.AlbumArt /// public class AimpGetAlbumArtEventArgs : EventArgs { + public AimpGetAlbumArtEventArgs(IAimpImage image, object userData = null) + { + UserData = userData; + Image = image; + } + + public AimpGetAlbumArtEventArgs(IAimpImage image, IAimpImageContainer imageContainer, object userData = null) + { + UserData = userData; + Image = image; + ImageContainer = imageContainer; + } + + /// + /// Gets or sets the user data. + /// + public object UserData { get; } + + /// + /// Gets or sets the image. + /// + public IAimpImage Image { get; } + /// - /// Gets or sets the cover image. + /// Gets or sets the image container. /// - /// The cover image. - public Bitmap CoverImage { get; set; } + public IAimpImageContainer ImageContainer { get; } } } diff --git a/src/SDK/aimp_dotnet/AIMPSDK/AIMP400/apiAlbumArt.h b/src/SDK/aimp_dotnet/AIMPSDK/AIMP400/apiAlbumArt.h index 4225ee6b..ea84456d 100644 --- a/src/SDK/aimp_dotnet/AIMPSDK/AIMP400/apiAlbumArt.h +++ b/src/SDK/aimp_dotnet/AIMPSDK/AIMP400/apiAlbumArt.h @@ -48,7 +48,7 @@ const int AIMP_SERVICE_ALBUMART_FLAGS_ORIGINAL = 2; const int AIMP_SERVICE_ALBUMART_FLAGS_WAITFOR = 4; const int AIMP_SERVICE_ALBUMART_FLAGS_OFFLINE = 8; -typedef void (CALLBACK TAIMPServiceAlbumArtReceiveProc)(IAIMPImage *image, IAIMPImageContainer *imageContainer, void *UserData); +typedef void (CALLBACK TAIMPServiceAlbumArtReceiveProc)(IAIMPImage2 *image, IAIMPImageContainer *imageContainer, void *UserData); /* IAIMPAlbumArtRequest */ diff --git a/src/SDK/aimp_dotnet/Aimp_DotNetPlugin.vcxproj b/src/SDK/aimp_dotnet/Aimp_DotNetPlugin.vcxproj index fe73dd71..3152ab0a 100644 --- a/src/SDK/aimp_dotnet/Aimp_DotNetPlugin.vcxproj +++ b/src/SDK/aimp_dotnet/Aimp_DotNetPlugin.vcxproj @@ -313,6 +313,7 @@ + diff --git a/src/SDK/aimp_dotnet/Aimp_DotNetPlugin.vcxproj.filters b/src/SDK/aimp_dotnet/Aimp_DotNetPlugin.vcxproj.filters index 5527280b..e18f75ab 100644 --- a/src/SDK/aimp_dotnet/Aimp_DotNetPlugin.vcxproj.filters +++ b/src/SDK/aimp_dotnet/Aimp_DotNetPlugin.vcxproj.filters @@ -342,6 +342,7 @@ + diff --git a/src/SDK/aimp_dotnet/SDK/AlbumArt/AimpServiceAlbumArt.cpp b/src/SDK/aimp_dotnet/SDK/AlbumArt/AimpServiceAlbumArt.cpp index ac5edbfd..06a71a08 100644 --- a/src/SDK/aimp_dotnet/SDK/AlbumArt/AimpServiceAlbumArt.cpp +++ b/src/SDK/aimp_dotnet/SDK/AlbumArt/AimpServiceAlbumArt.cpp @@ -10,6 +10,10 @@ #include "Stdafx.h" #include "AimpServiceAlbumArt.h" +#include "SDK/CustomUserData.h" +#include "SDK/Objects/AimpImage.h" +#include "SDK/Objects/AimpImageContainer.h" + using namespace AIMP::SDK; AimpServiceAlbumArt::AimpServiceAlbumArt(ManagedAimpCore^ core) : BaseAimpService(core) { @@ -219,25 +223,38 @@ void AimpServiceAlbumArt::MaxFileSize::set(int value) { } } -void AimpServiceAlbumArt::OnAlbumArtReceive(IAIMPImage* image, IAIMPImageContainer* image_container, void* user_data) { - AimpGetAlbumArtEventArgs^ args = gcnew AimpGetAlbumArtEventArgs(); - if (image == nullptr && image_container == nullptr) { - Completed(this, args); - return; +void AimpServiceAlbumArt::OnAlbumArtReceive(IAIMPImage2* image, IAIMPImageContainer* image_container, void* user_data) { + IAimpImage^ img = nullptr; + IAimpImageContainer^ container = nullptr; + Object^ userData = nullptr; + + if (image != nullptr) { + img = gcnew AimpImage(image); } - if (image_container != nullptr && image == nullptr) { - args->CoverImage = AimpConverter::ToManagedBitmap(image_container); + if (image_container != nullptr) { + container = gcnew AimpImageContainer(image_container); } - else if (image != nullptr) { - args->CoverImage = AimpConverter::ToManagedBitmap(image); + + if (user_data != nullptr) { + auto customData = static_cast(user_data); + userData = customData->CustomObject(); + customData->Release(); } + AimpGetAlbumArtEventArgs^ args = gcnew AimpGetAlbumArtEventArgs(img, container, userData); + + //if (image_container != nullptr && image == nullptr) { + // args->CoverImage = AimpConverter::ToManagedBitmap(image_container); + //} + //else if (image != nullptr) { + // args->CoverImage = AimpConverter::ToManagedBitmap(image); + //} + Completed(this, args); } -IntResult AimpServiceAlbumArt::Get(String^ fileUrl, String^ artist, String^ album, AimpFindCovertArtType flags, - Object^ userData) { +IntResult AimpServiceAlbumArt::Get(String^ fileUrl, String^ artist, String^ album, AimpFindCovertArtType flags, Object^ userData) { if (String::IsNullOrEmpty(fileUrl)) { ARGUMENT_NULL("fileUrl", "Parameter fileUrl cannot be empty") } @@ -253,13 +270,20 @@ IntResult AimpServiceAlbumArt::Get(String^ fileUrl, String^ artist, String^ albu IAIMPServiceAlbumArt* service = GetAimpService(); try { if (service != nullptr) { + + CustomUserData* customData = nullptr; + + if (userData != nullptr) { + customData = new CustomUserData(userData); + } + result = CheckResult(service->Get( sFileUrl, sArtist, sAlbum, DWORD(flags), static_cast(thunk.ToPointer()), - reinterpret_cast(&userData), &taskId)); + customData, &taskId)); } } finally { @@ -270,7 +294,6 @@ IntResult AimpServiceAlbumArt::Get(String^ fileUrl, String^ artist, String^ albu } return INT_RESULT(result, reinterpret_cast(taskId)); - //return INT_RESULT(result, IntPtr(taskId).ToInt32()); } IntResult AimpServiceAlbumArt::Get2(IAimpFileInfo^ fileInfo, AimpFindCovertArtType flags, Object^ userData) { diff --git a/src/SDK/aimp_dotnet/SDK/AlbumArt/AimpServiceAlbumArt.h b/src/SDK/aimp_dotnet/SDK/AlbumArt/AimpServiceAlbumArt.h index 7c02c98e..67c68f4e 100644 --- a/src/SDK/aimp_dotnet/SDK/AlbumArt/AimpServiceAlbumArt.h +++ b/src/SDK/aimp_dotnet/SDK/AlbumArt/AimpServiceAlbumArt.h @@ -77,10 +77,9 @@ namespace AIMP { void set(int val); } - void OnAlbumArtReceive(IAIMPImage* image, IAIMPImageContainer* image_container, void* user_data); + void OnAlbumArtReceive(IAIMPImage2* image, IAIMPImageContainer* image_container, void* user_data); - virtual IntResult Get(String^ fileUrl, String^ artist, String^ album, AimpFindCovertArtType flags, - Object^ userData); + virtual IntResult Get(String^ fileUrl, String^ artist, String^ album, AimpFindCovertArtType flags, Object^ userData); virtual IntResult Get2(IAimpFileInfo^ fileInfo, AimpFindCovertArtType flags, Object^ userData); @@ -88,7 +87,7 @@ namespace AIMP { protected: IAIMPServiceAlbumArt* GetAimpService() override; private: - delegate void OnFindCoverCallback(IAIMPImage* image, IAIMPImageContainer* imageContainer, void* UserData); + delegate void OnFindCoverCallback(IAIMPImage2* image, IAIMPImageContainer* imageContainer, void* UserData); OnFindCoverCallback^ _findCallback; EventHandler^ _onComplete; }; diff --git a/src/SDK/aimp_dotnet/SDK/CustomUserData.h b/src/SDK/aimp_dotnet/SDK/CustomUserData.h new file mode 100644 index 00000000..43e96578 --- /dev/null +++ b/src/SDK/aimp_dotnet/SDK/CustomUserData.h @@ -0,0 +1,35 @@ +// ---------------------------------------------------- +// AIMP DotNet SDK +// +// Copyright (c) 2014 - 2023 Evgeniy Bogdan +// https://github.com/martin211/aimp_dotnet +// +// Mail: mail4evgeniy@gmail.com +// ---------------------------------------------------- + +#pragma once + +public class CustomUserData : IUnknownInterfaceImpl { +private: + gcroot _customObjectHandle; +public: + gcroot CustomObject() { + return _customObjectHandle; + } + + explicit CustomUserData(gcroot data) + : _customObjectHandle(data) { + } + + virtual HRESULT WINAPI QueryInterface(REFIID riid, LPVOID* ppvObject) { + return IUnknownInterfaceImpl::QueryInterface(riid, ppvObject); + } + + virtual ULONG WINAPI AddRef(void) { + return IUnknownInterfaceImpl::AddRef(); + } + + virtual ULONG WINAPI Release(void) { + return IUnknownInterfaceImpl::Release(); + } +}; \ No newline at end of file From 46bed5e10f15c6200d21113efb46e508b3867558 Mon Sep 17 00:00:00 2001 From: Evgeny Date: Mon, 20 Mar 2023 17:45:22 +0300 Subject: [PATCH 13/36] Resolve "Add IAIMPServiceConnectionSettings" --- src/SDK/AIMP.SDK/AIMP.SDK.csproj | 2 + src/SDK/AIMP.SDK/SDK/IAimpPlayer.cs | 6 + .../IAimpServiceConnectionSettings.cs | 34 +++ src/SDK/aimp_dotnet/Aimp_DotNetPlugin.vcxproj | 2 + .../Aimp_DotNetPlugin.vcxproj.filters | 2 + src/SDK/aimp_dotnet/SDK/AimpObject.h | 4 + src/SDK/aimp_dotnet/SDK/AimpPlayer.cpp | 9 + src/SDK/aimp_dotnet/SDK/AimpPlayer.h | 5 + .../SDK/AlbumArt/AimpServiceAlbumArt.cpp | 7 - .../AimpServiceConnectionSettings.cpp | 240 ++++++++++++++++++ .../Internet/AimpServiceConnectionSettings.h | 65 +++++ .../SDK/Objects/AimpImageContainer.cpp | 1 + .../IntegrationTests/AimpTestRunner.csproj | 1 + ...IAimpServiceConnectionSettingsUnitTests.cs | 100 ++++++++ 14 files changed, 471 insertions(+), 7 deletions(-) create mode 100644 src/SDK/AIMP.SDK/SDK/Internet/IAimpServiceConnectionSettings.cs create mode 100644 src/SDK/aimp_dotnet/SDK/Internet/AimpServiceConnectionSettings.cpp create mode 100644 src/SDK/aimp_dotnet/SDK/Internet/AimpServiceConnectionSettings.h create mode 100644 src/Tests/IntegrationTests/UnitTests/Internet/IAimpServiceConnectionSettingsUnitTests.cs diff --git a/src/SDK/AIMP.SDK/AIMP.SDK.csproj b/src/SDK/AIMP.SDK/AIMP.SDK.csproj index ce5748cf..493a66ec 100644 --- a/src/SDK/AIMP.SDK/AIMP.SDK.csproj +++ b/src/SDK/AIMP.SDK/AIMP.SDK.csproj @@ -124,6 +124,7 @@ + @@ -283,6 +284,7 @@ + diff --git a/src/SDK/AIMP.SDK/SDK/IAimpPlayer.cs b/src/SDK/AIMP.SDK/SDK/IAimpPlayer.cs index 0e7c5948..ac0f85cd 100644 --- a/src/SDK/AIMP.SDK/SDK/IAimpPlayer.cs +++ b/src/SDK/AIMP.SDK/SDK/IAimpPlayer.cs @@ -13,6 +13,7 @@ using AIMP.SDK.Configuration; using AIMP.SDK.Core; using AIMP.SDK.FileManager; +using AIMP.SDK.Internet; using AIMP.SDK.Lyrics; using AIMP.SDK.MenuManager; using AIMP.SDK.MessageDispatcher; @@ -212,5 +213,10 @@ public interface IAimpPlayer : IDisposable IAimpServiceFileURI ServiceFileUri { get; } IAimpServiceFileURI2 ServiceFileUri2 { get; } + + /// + /// Gets the service connection settings. + /// + IAimpServiceConnectionSettings ServiceConnectionSettings { get; } } } diff --git a/src/SDK/AIMP.SDK/SDK/Internet/IAimpServiceConnectionSettings.cs b/src/SDK/AIMP.SDK/SDK/Internet/IAimpServiceConnectionSettings.cs new file mode 100644 index 00000000..d5efa741 --- /dev/null +++ b/src/SDK/AIMP.SDK/SDK/Internet/IAimpServiceConnectionSettings.cs @@ -0,0 +1,34 @@ +// ---------------------------------------------------- +// AIMP DotNet SDK +// +// Copyright (c) 2014 - 2023 Evgeniy Bogdan +// https://github.com/martin211/aimp_dotnet +// +// Mail: mail4evgeniy@gmail.com +// ---------------------------------------------------- + +namespace AIMP.SDK.Internet; + +public enum ConnectionType +{ + Direct, + Proxy, + SystemDefaults +} + +public interface IAimpServiceConnectionSettings +{ + ConnectionType ConnectionType { get; set; } + + string ProxyServer { get; set; } + + string ProxyPort { get; set; } + + string ProxyUserName { get; set; } + + string ProxyUserPass { get; set; } + + int TimeOut { get; set; } + + string UserAgent { get; set; } +} \ No newline at end of file diff --git a/src/SDK/aimp_dotnet/Aimp_DotNetPlugin.vcxproj b/src/SDK/aimp_dotnet/Aimp_DotNetPlugin.vcxproj index 3152ab0a..4938dab5 100644 --- a/src/SDK/aimp_dotnet/Aimp_DotNetPlugin.vcxproj +++ b/src/SDK/aimp_dotnet/Aimp_DotNetPlugin.vcxproj @@ -61,6 +61,7 @@ + @@ -217,6 +218,7 @@ + diff --git a/src/SDK/aimp_dotnet/Aimp_DotNetPlugin.vcxproj.filters b/src/SDK/aimp_dotnet/Aimp_DotNetPlugin.vcxproj.filters index e18f75ab..70572fb3 100644 --- a/src/SDK/aimp_dotnet/Aimp_DotNetPlugin.vcxproj.filters +++ b/src/SDK/aimp_dotnet/Aimp_DotNetPlugin.vcxproj.filters @@ -150,6 +150,7 @@ + @@ -343,6 +344,7 @@ + diff --git a/src/SDK/aimp_dotnet/SDK/AimpObject.h b/src/SDK/aimp_dotnet/SDK/AimpObject.h index 97af0188..ec5e15ab 100644 --- a/src/SDK/aimp_dotnet/SDK/AimpObject.h +++ b/src/SDK/aimp_dotnet/SDK/AimpObject.h @@ -27,6 +27,7 @@ public ref class AimpObject : public IAimpObject { AimpObject(TAimpObject* aimpObject) : _aimpObject(aimpObject) { RegisterAtMemoryManager(); + //ComObject->AddRef(); } !AimpObject() { @@ -55,6 +56,9 @@ public ref class AimpObject : public IAimpObject { virtual void ReleaseFromMemoryManager() { AimpMemoryManager::getInstance().Release(this->GetHashCode()); + if (InternalAimpObject != nullptr) { + InternalAimpObject->Release(); + } } public: diff --git a/src/SDK/aimp_dotnet/SDK/AimpPlayer.cpp b/src/SDK/aimp_dotnet/SDK/AimpPlayer.cpp index 20057527..28955a6f 100644 --- a/src/SDK/aimp_dotnet/SDK/AimpPlayer.cpp +++ b/src/SDK/aimp_dotnet/SDK/AimpPlayer.cpp @@ -18,6 +18,7 @@ #include "FileManager/AimpServiceFileInfoFormatterUtils.h" #include "FileManager/Services/AimpServiceFileURI.h" #include "FileManager/Services/AimpServiceFileURI2.h" +#include "Internet/AimpServiceConnectionSettings.h" #include "MUI/AimpServiceMUI.h" #include "Menu/AimpServiceMenuManager.h" #include "Player/AimpServicePlayer.h" @@ -59,6 +60,14 @@ AimpPlayer::~AimpPlayer() { delete _serviceFileTagEditor; } +Internet::IAimpServiceConnectionSettings^ AimpPlayer::ServiceConnectionSettings::get() { + if (_serviceConnectionSettings == nullptr) { + _serviceConnectionSettings = gcnew AimpServiceConnectionSettings(_managedAimpCore); + } + + return _serviceConnectionSettings; +} + IAimpServiceFileInfoFormatterUtils^ AimpPlayer::ServiceFileInfoFormatterUtils::get() { if (_serviceFileInfoFormatterUtils == nullptr) { _serviceFileInfoFormatterUtils = gcnew AimpServiceFileInfoFormatterUtils(_managedAimpCore); diff --git a/src/SDK/aimp_dotnet/SDK/AimpPlayer.h b/src/SDK/aimp_dotnet/SDK/AimpPlayer.h index 4e0f3878..433d2119 100644 --- a/src/SDK/aimp_dotnet/SDK/AimpPlayer.h +++ b/src/SDK/aimp_dotnet/SDK/AimpPlayer.h @@ -90,6 +90,7 @@ namespace AIMP { IAimpServiceFileInfoFormatterUtils^ _serviceFileInfoFormatterUtils; IAimpServiceFileURI^ _serviceFileURI; IAimpServiceFileURI2^ _serviceFileURI2; + Internet::IAimpServiceConnectionSettings^ _serviceConnectionSettings; public: /// /// Initializes a new instance of the class. @@ -101,6 +102,10 @@ namespace AIMP { AimpPlayer(ManagedAimpCore^ core, int pluginId, int applicationDomainId, bool isCrossDomain); ~AimpPlayer(); + property Internet::IAimpServiceConnectionSettings^ ServiceConnectionSettings + { + virtual Internet::IAimpServiceConnectionSettings^ get(); + } property IAimpServiceFileInfoFormatterUtils^ ServiceFileInfoFormatterUtils { diff --git a/src/SDK/aimp_dotnet/SDK/AlbumArt/AimpServiceAlbumArt.cpp b/src/SDK/aimp_dotnet/SDK/AlbumArt/AimpServiceAlbumArt.cpp index 06a71a08..dec511a0 100644 --- a/src/SDK/aimp_dotnet/SDK/AlbumArt/AimpServiceAlbumArt.cpp +++ b/src/SDK/aimp_dotnet/SDK/AlbumArt/AimpServiceAlbumArt.cpp @@ -244,13 +244,6 @@ void AimpServiceAlbumArt::OnAlbumArtReceive(IAIMPImage2* image, IAIMPImageContai AimpGetAlbumArtEventArgs^ args = gcnew AimpGetAlbumArtEventArgs(img, container, userData); - //if (image_container != nullptr && image == nullptr) { - // args->CoverImage = AimpConverter::ToManagedBitmap(image_container); - //} - //else if (image != nullptr) { - // args->CoverImage = AimpConverter::ToManagedBitmap(image); - //} - Completed(this, args); } diff --git a/src/SDK/aimp_dotnet/SDK/Internet/AimpServiceConnectionSettings.cpp b/src/SDK/aimp_dotnet/SDK/Internet/AimpServiceConnectionSettings.cpp new file mode 100644 index 00000000..566b5f42 --- /dev/null +++ b/src/SDK/aimp_dotnet/SDK/Internet/AimpServiceConnectionSettings.cpp @@ -0,0 +1,240 @@ +#include "stdafx.h" +#include "AimpServiceConnectionSettings.h" + +using namespace AIMP::SDK; + +AimpServiceConnectionSettings::AimpServiceConnectionSettings(ManagedAimpCore^ core) : BaseAimpService(core) { +} + +AimpServiceConnectionSettings::~AimpServiceConnectionSettings() { +} + +Internet::ConnectionType AimpServiceConnectionSettings::ConnectionType::get() { + IAIMPServiceConnectionSettings* service = GetAimpService(); + IAIMPPropertyList* prop = nullptr; + + try { + if (service != nullptr) { + service->QueryInterface(IID_IAIMPPropertyList, reinterpret_cast(&prop)); + return static_cast(PropertyListExtension::GetInt32(prop, AIMP_SERVICE_CONSET_PROPID_CONNECTION_TYPE)); + } + } + finally { + ReleaseObject(prop); + ReleaseObject(service); + } +} + +void AimpServiceConnectionSettings::ConnectionType::set(Internet::ConnectionType value) { + IAIMPServiceConnectionSettings* service = GetAimpService(); + IAIMPPropertyList* prop = nullptr; + + try { + if (service != nullptr) { + service->QueryInterface(IID_IAIMPPropertyList, reinterpret_cast(&prop)); + PropertyListExtension::SetInt32(prop, AIMP_SERVICE_CONSET_PROPID_CONNECTION_TYPE, static_cast(value)); + } + } + finally { + ReleaseObject(prop); + ReleaseObject(service); + } +} + +String^ AimpServiceConnectionSettings::ProxyServer::get() { + IAIMPServiceConnectionSettings* service = GetAimpService(); + IAIMPPropertyList* prop = nullptr; + + try { + if (service != nullptr) { + service->QueryInterface(IID_IAIMPPropertyList, reinterpret_cast(&prop)); + return PropertyListExtension::GetString(prop, AIMP_SERVICE_CONSET_PROPID_PROXY_SERVER); + } + } + finally { + ReleaseObject(prop); + ReleaseObject(service); + } +} + +void AimpServiceConnectionSettings::ProxyServer::set(String^ value) { + IAIMPServiceConnectionSettings* service = GetAimpService(); + IAIMPPropertyList* prop = nullptr; + + try { + if (service != nullptr) { + service->QueryInterface(IID_IAIMPPropertyList, reinterpret_cast(&prop)); + PropertyListExtension::SetString(prop, AIMP_SERVICE_CONSET_PROPID_PROXY_SERVER, value); + } + } + finally { + ReleaseObject(prop); + ReleaseObject(service); + } +} + +String^ AimpServiceConnectionSettings::ProxyPort::get() { + IAIMPServiceConnectionSettings* service = GetAimpService(); + IAIMPPropertyList* prop = nullptr; + + try { + if (service != nullptr) { + service->QueryInterface(IID_IAIMPPropertyList, reinterpret_cast(&prop)); + return PropertyListExtension::GetString(prop, AIMP_SERVICE_CONSET_PROPID_PROXY_PORT); + } + } + finally { + ReleaseObject(prop); + ReleaseObject(service); + } +} + +void AimpServiceConnectionSettings::ProxyPort::set(String^ value) { + IAIMPServiceConnectionSettings* service = GetAimpService(); + IAIMPPropertyList* prop = nullptr; + + try { + if (service != nullptr) { + service->QueryInterface(IID_IAIMPPropertyList, reinterpret_cast(&prop)); + PropertyListExtension::SetString(prop, AIMP_SERVICE_CONSET_PROPID_PROXY_PORT, value); + } + } + finally { + ReleaseObject(prop); + ReleaseObject(service); + } +} + +String^ AimpServiceConnectionSettings::ProxyUserName::get() { + IAIMPServiceConnectionSettings* service = GetAimpService(); + IAIMPPropertyList* prop = nullptr; + + try { + if (service != nullptr) { + service->QueryInterface(IID_IAIMPPropertyList, reinterpret_cast(&prop)); + return PropertyListExtension::GetString(prop, AIMP_SERVICE_CONSET_PROPID_PROXY_USERNAME); + } + } + finally { + ReleaseObject(prop); + ReleaseObject(service); + } +} + +void AimpServiceConnectionSettings::ProxyUserName::set(String^ value) { + IAIMPServiceConnectionSettings* service = GetAimpService(); + IAIMPPropertyList* prop = nullptr; + + try { + if (service != nullptr) { + service->QueryInterface(IID_IAIMPPropertyList, reinterpret_cast(&prop)); + PropertyListExtension::SetString(prop, AIMP_SERVICE_CONSET_PROPID_PROXY_USERNAME, value); + } + } + finally { + ReleaseObject(prop); + ReleaseObject(service); + } +} + +String^ AimpServiceConnectionSettings::ProxyUserPass::get() { + IAIMPServiceConnectionSettings* service = GetAimpService(); + IAIMPPropertyList* prop = nullptr; + + try { + if (service != nullptr) { + service->QueryInterface(IID_IAIMPPropertyList, reinterpret_cast(&prop)); + return PropertyListExtension::GetString(prop, AIMP_SERVICE_CONSET_PROPID_PROXY_USERPASS); + } + } + finally { + ReleaseObject(prop); + ReleaseObject(service); + } +} + +void AimpServiceConnectionSettings::ProxyUserPass::set(String^ value) { + IAIMPServiceConnectionSettings* service = GetAimpService(); + IAIMPPropertyList* prop = nullptr; + + try { + if (service != nullptr) { + service->QueryInterface(IID_IAIMPPropertyList, reinterpret_cast(&prop)); + PropertyListExtension::SetString(prop, AIMP_SERVICE_CONSET_PROPID_PROXY_USERPASS, value); + } + } + finally { + ReleaseObject(prop); + ReleaseObject(service); + } +} + +int AimpServiceConnectionSettings::TimeOut::get() { + IAIMPServiceConnectionSettings* service = GetAimpService(); + IAIMPPropertyList* prop = nullptr; + + try { + if (service != nullptr) { + service->QueryInterface(IID_IAIMPPropertyList, reinterpret_cast(&prop)); + return PropertyListExtension::GetInt32(prop, AIMP_SERVICE_CONSET_PROPID_TIMEOUT); + } + } + finally { + ReleaseObject(prop); + ReleaseObject(service); + } +} + +void AimpServiceConnectionSettings::TimeOut::set(int value) { + IAIMPServiceConnectionSettings* service = GetAimpService(); + IAIMPPropertyList* prop = nullptr; + + try { + if (service != nullptr) { + service->QueryInterface(IID_IAIMPPropertyList, reinterpret_cast(&prop)); + PropertyListExtension::SetInt32(prop, AIMP_SERVICE_CONSET_PROPID_TIMEOUT, value); + } + } + finally { + ReleaseObject(prop); + ReleaseObject(service); + } +} + +String^ AimpServiceConnectionSettings::UserAgent::get() { + IAIMPServiceConnectionSettings* service = GetAimpService(); + IAIMPPropertyList* prop = nullptr; + + try { + if (service != nullptr) { + service->QueryInterface(IID_IAIMPPropertyList, reinterpret_cast(&prop)); + return PropertyListExtension::GetString(prop, AIMP_SERVICE_CONSET_PROPID_USERAGENT); + } + } + finally { + ReleaseObject(prop); + ReleaseObject(service); + } +} + +void AimpServiceConnectionSettings::UserAgent::set(String^ value) { + IAIMPServiceConnectionSettings* service = GetAimpService(); + IAIMPPropertyList* prop = nullptr; + + try { + if (service != nullptr) { + service->QueryInterface(IID_IAIMPPropertyList, reinterpret_cast(&prop)); + PropertyListExtension::SetString(prop, AIMP_SERVICE_CONSET_PROPID_USERAGENT, value); + } + } + finally { + ReleaseObject(prop); + ReleaseObject(service); + } +} + +IAIMPServiceConnectionSettings* AimpServiceConnectionSettings::GetAimpService() { + IAIMPServiceConnectionSettings* service = nullptr; + GetService(IID_IAIMPServiceConnectionSettings, &service); + return service; +} diff --git a/src/SDK/aimp_dotnet/SDK/Internet/AimpServiceConnectionSettings.h b/src/SDK/aimp_dotnet/SDK/Internet/AimpServiceConnectionSettings.h new file mode 100644 index 00000000..a9ad1bde --- /dev/null +++ b/src/SDK/aimp_dotnet/SDK/Internet/AimpServiceConnectionSettings.h @@ -0,0 +1,65 @@ +// ---------------------------------------------------- +// AIMP DotNet SDK +// +// Copyright (c) 2014 - 2023 Evgeniy Bogdan +// https://github.com/martin211/aimp_dotnet +// +// Mail: mail4evgeniy@gmail.com +// ---------------------------------------------------- + +#pragma once + +#include "SDK/BaseAimpService.h" +#include "AIMPSDK/AIMP400/apiInternet.h" + +namespace AIMP { + namespace SDK { + using namespace Internet; + + public ref class AimpServiceConnectionSettings : + public BaseAimpService, + public IAimpServiceConnectionSettings { + public: + explicit AimpServiceConnectionSettings(ManagedAimpCore^ core); + + ~AimpServiceConnectionSettings(); + + virtual property ConnectionType ConnectionType { + Internet::ConnectionType get(); + void set(Internet::ConnectionType value); + } + + virtual property String^ ProxyServer { + String^ get(); + void set(String^ value); + } + + virtual property String^ ProxyPort { + String^ get(); + void set(String^ value); + } + + virtual property String^ ProxyUserName { + String^ get(); + void set(String^ value); + } + + virtual property String^ ProxyUserPass { + String^ get(); + void set(String^ value); + } + + virtual property int TimeOut { + int get(); + void set(int value); + } + + virtual property String^ UserAgent { + String^ get(); + void set(String^ value); + } + protected: + IAIMPServiceConnectionSettings* GetAimpService() override; + }; + } +} diff --git a/src/SDK/aimp_dotnet/SDK/Objects/AimpImageContainer.cpp b/src/SDK/aimp_dotnet/SDK/Objects/AimpImageContainer.cpp index 69741e35..77b6fcbc 100644 --- a/src/SDK/aimp_dotnet/SDK/Objects/AimpImageContainer.cpp +++ b/src/SDK/aimp_dotnet/SDK/Objects/AimpImageContainer.cpp @@ -11,6 +11,7 @@ #include "AimpImageContainer.h" AimpImageContainer::AimpImageContainer(IAIMPImageContainer* container) : AimpObject(container) { + container->AddRef(); } AimpActionResult^ AimpImageContainer::CreateImage() { diff --git a/src/Tests/IntegrationTests/AimpTestRunner.csproj b/src/Tests/IntegrationTests/AimpTestRunner.csproj index d6cfd094..6ae618e2 100644 --- a/src/Tests/IntegrationTests/AimpTestRunner.csproj +++ b/src/Tests/IntegrationTests/AimpTestRunner.csproj @@ -127,6 +127,7 @@ + diff --git a/src/Tests/IntegrationTests/UnitTests/Internet/IAimpServiceConnectionSettingsUnitTests.cs b/src/Tests/IntegrationTests/UnitTests/Internet/IAimpServiceConnectionSettingsUnitTests.cs new file mode 100644 index 00000000..29147372 --- /dev/null +++ b/src/Tests/IntegrationTests/UnitTests/Internet/IAimpServiceConnectionSettingsUnitTests.cs @@ -0,0 +1,100 @@ +// ---------------------------------------------------- +// AIMP DotNet SDK +// +// Copyright (c) 2014 - 2023 Evgeniy Bogdan +// https://github.com/martin211/aimp_dotnet +// +// Mail: mail4evgeniy@gmail.com +// ---------------------------------------------------- + +using AIMP.SDK.Internet; + +using Aimp.TestRunner.TestFramework; +using NUnit.Framework; + +namespace Aimp.TestRunner.UnitTests.Internet; + +[TestFixture(Category = "ServiceConnectionSettings")] +public class IAimpServiceConnectionSettingsUnitTests : AimpIntegrationTest +{ + [Test] + public void ConnectionType_ShouldChange() + { + Player.ServiceConnectionSettings.ConnectionType = ConnectionType.Proxy; + + var actual = Player.ServiceConnectionSettings.ConnectionType; + AimpAssert.AreEqual(ConnectionType.Proxy, actual); + } + + [Test] + public void ProxyServer_ShouldChange() + { + const string expected = "localhost"; + + Player.ServiceConnectionSettings.ProxyServer = expected; + + var actual = Player.ServiceConnectionSettings.ProxyServer; + + AimpAssert.AreEqual(expected, actual); + } + + [Test] + public void ProxyPort_ShouldChange() + { + const string expected = "8888"; + + Player.ServiceConnectionSettings.ProxyPort = expected; + + var actual = Player.ServiceConnectionSettings.ProxyPort; + + AimpAssert.AreEqual(expected, actual); + } + + [Test] + public void ProxyUserName_ShouldChange() + { + const string expected = "User"; + + Player.ServiceConnectionSettings.ProxyUserName = expected; + + var actual = Player.ServiceConnectionSettings.ProxyUserName; + + AimpAssert.AreEqual(expected, actual); + } + + [Test] + public void ProxyUserPass_ShouldChange() + { + const string expected = "ProxyUserPass"; + + Player.ServiceConnectionSettings.ProxyUserPass = expected; + + var actual = Player.ServiceConnectionSettings.ProxyUserPass; + + AimpAssert.AreEqual(expected, actual); + } + + [Test] + public void UserAgent_ShouldChange() + { + const string expected = "UserAgent"; + + Player.ServiceConnectionSettings.UserAgent = expected; + + var actual = Player.ServiceConnectionSettings.UserAgent; + + AimpAssert.AreEqual(expected, actual); + } + + [Test] + public void TimeOut_ShouldChange() + { + const int expected = 20000; + + Player.ServiceConnectionSettings.TimeOut = expected; + + var actual = Player.ServiceConnectionSettings.TimeOut; + + AimpAssert.AreEqual(expected, actual); + } +} \ No newline at end of file From 0a97d35c923533e3ebac70084667ca7c027f1672 Mon Sep 17 00:00:00 2001 From: Evgeny Date: Tue, 21 Mar 2023 00:55:30 +0300 Subject: [PATCH 14/36] release 5.03.2394.4 --- .nuke/build.schema.json | 2 - GitVersion.yml | 6 +- build/Build.cs | 38 ++- .../dotnet_albumart/Directory.Build.targets | 2 +- src/SDK/AIMP.SDK/AIMP.SDK.csproj | 2 + .../SDK/AlbumArt/AimpGetAlbumArtEventArgs.cs | 30 ++- src/SDK/AIMP.SDK/SDK/IAimpPlayer.cs | 6 + .../IAimpServiceConnectionSettings.cs | 34 +++ .../aimp_dotnet/AIMPSDK/AIMP400/apiAlbumArt.h | 2 +- src/SDK/aimp_dotnet/Aimp_DotNetPlugin.vcxproj | 3 + .../Aimp_DotNetPlugin.vcxproj.filters | 3 + src/SDK/aimp_dotnet/SDK/AimpObject.h | 4 + src/SDK/aimp_dotnet/SDK/AimpPlayer.cpp | 9 + src/SDK/aimp_dotnet/SDK/AimpPlayer.h | 5 + .../SDK/AlbumArt/AimpServiceAlbumArt.cpp | 42 ++- .../SDK/AlbumArt/AimpServiceAlbumArt.h | 7 +- src/SDK/aimp_dotnet/SDK/CustomUserData.h | 35 +++ .../AimpServiceConnectionSettings.cpp | 240 ++++++++++++++++++ .../Internet/AimpServiceConnectionSettings.h | 65 +++++ .../SDK/Objects/AimpImageContainer.cpp | 1 + .../IntegrationTests/AimpTestRunner.csproj | 1 + ...IAimpServiceConnectionSettingsUnitTests.cs | 100 ++++++++ 22 files changed, 597 insertions(+), 40 deletions(-) create mode 100644 src/SDK/AIMP.SDK/SDK/Internet/IAimpServiceConnectionSettings.cs create mode 100644 src/SDK/aimp_dotnet/SDK/CustomUserData.h create mode 100644 src/SDK/aimp_dotnet/SDK/Internet/AimpServiceConnectionSettings.cpp create mode 100644 src/SDK/aimp_dotnet/SDK/Internet/AimpServiceConnectionSettings.h create mode 100644 src/Tests/IntegrationTests/UnitTests/Internet/IAimpServiceConnectionSettingsUnitTests.cs diff --git a/.nuke/build.schema.json b/.nuke/build.schema.json index ac5cc631..010232d4 100644 --- a/.nuke/build.schema.json +++ b/.nuke/build.schema.json @@ -118,7 +118,6 @@ "PrepareIntegrationTests", "PrepareTestConfiguration", "PrintBuildParameters", - "PrintDefaultBuildParameters", "Publish", "PublishDocumentation", "PushDocumentation", @@ -168,7 +167,6 @@ "PrepareIntegrationTests", "PrepareTestConfiguration", "PrintBuildParameters", - "PrintDefaultBuildParameters", "Publish", "PublishDocumentation", "PushDocumentation", diff --git a/GitVersion.yml b/GitVersion.yml index 28da06f2..478ee36e 100644 --- a/GitVersion.yml +++ b/GitVersion.yml @@ -2,10 +2,10 @@ assembly-versioning-scheme: MajorMinorPatchTag assembly-file-versioning-scheme: MajorMinorPatchTag continuous-delivery-fallback-tag: '' branches: - master: - regex: ^master + develop: + regex: ^develop mode: ContinuousDeployment - tag: '' + tag: 'preview' increment: None prevent-increment-of-merged-branch-version: true track-merge-target: false diff --git a/build/Build.cs b/build/Build.cs index fd1ca985..77a9a13e 100644 --- a/build/Build.cs +++ b/build/Build.cs @@ -13,6 +13,7 @@ using System.IO.Compression; using System.Linq; using System.Reflection; +using Microsoft.Build.Tasks; using Nuke.Common; using Nuke.Common.CI.GitLab; using Nuke.Common.CI.TeamCity; @@ -21,11 +22,13 @@ using Nuke.Common.IO; using Nuke.Common.ProjectModel; using Nuke.Common.Tooling; +using Nuke.Common.Tools.Git; using Nuke.Common.Tools.GitVersion; using Nuke.Common.Tools.MSBuild; using Nuke.Common.Tools.NuGet; using Nuke.Common.Utilities; using Nuke.Common.Utilities.Collections; +using Octokit; using Serilog; using static Nuke.Common.IO.FileSystemTasks; using static Nuke.Common.IO.PathConstruction; @@ -199,6 +202,8 @@ string BuildNumber { Log.Information("Start build Nuget packages"); + EnsureCleanDirectory(OutputDirectory); + var nugetFolder = RootDirectory / "Nuget"; var config = new NuGetPackSettings() @@ -209,12 +214,7 @@ string BuildNumber if (GitRepository.Branch != null && !GitRepository.Branch.Contains(ReleaseBranchPrefix)) { - config = config.SetSuffix($"preview.{GitVersion.BuildMetaData}"); - } - - if (Configuration == Configuration.Debug) - { - config = config.SetSuffix($"debug.{GitVersion.BuildMetaData}"); + config = config.SetSuffix(GitVersion.PreReleaseTag); } if (TargetPlatform == MSBuildTargetPlatform.x86) @@ -228,7 +228,6 @@ string BuildNumber if (TargetPlatform == MSBuildTargetPlatform.x64) { - Log.Information("Pack X64 package"); NuGetTasks.NuGetPack(config.SetTargetPath(nugetFolder / "AimpSDK-x64.nuspec")); } @@ -390,27 +389,40 @@ void GetVersion() _version = GitRepository.Branch .Replace($"{MailstoneBranch}_", string.Empty) .Replace("_", "."); + + _buildNumber = $"{_version}{(!string.IsNullOrWhiteSpace(GitVersion.BuildMetaData) ? "." : string.Empty)}{GitVersion.BuildMetaData}"; } else if (GitRepository.Branch.StartsWith(ReleaseBranchPrefix)) { _version = GitRepository.Branch.Split("/")[1]; + _buildNumber = $"{_version}{(!string.IsNullOrWhiteSpace(GitVersion.BuildMetaData) ? "." : string.Empty)}{GitVersion.BuildMetaData}"; } else { - var tag = GitRepository.Tags.LastOrDefault(); + string tag = string.Empty; + + var process = ProcessTasks.StartProcess("git", "ls-remote --tags --sort=-committerdate ./."); + process.WaitForExit(); + var output = process.Output; + + if (output.Count > 0) + { + var outText = output.First().Text; + tag = outText.Substring(outText.LastIndexOf("/") + 1, outText.Length - outText.LastIndexOf("/") - 1); + } - if (tag != null) + if (!string.IsNullOrWhiteSpace(tag)) { - _buildNumber = $"{tag}.{GitVersion.BuildMetaData}"; - _version = tag; + var patchVersion = int.Parse(tag.Split(".").Last()) + 1; + _version = tag.Substring(0, tag.LastIndexOf(".")) + $".{patchVersion}"; + _buildNumber = $"{_version}{GitVersion.PreReleaseTagWithDash}"; } else { + _buildNumber = $"{_version}{(!string.IsNullOrWhiteSpace(GitVersion.BuildMetaData) ? "." : string.Empty)}{GitVersion.BuildMetaData}"; _version = BuildNumber; } } - - _buildNumber = $"{_version}{(!string.IsNullOrWhiteSpace(GitVersion.BuildMetaData) ? "." : string.Empty)}{GitVersion.BuildMetaData}"; } Target UpdateBuildNumber => _ => _ diff --git a/src/Plugins/dotnet_albumart/Directory.Build.targets b/src/Plugins/dotnet_albumart/Directory.Build.targets index 9d8498b1..f2980577 100644 --- a/src/Plugins/dotnet_albumart/Directory.Build.targets +++ b/src/Plugins/dotnet_albumart/Directory.Build.targets @@ -1,7 +1,7 @@  $(SolutionDir)..\nuget\tools\CopyPlugin.ps1 - AIMP5.02.2369 + AIMP5.11.2421 diff --git a/src/SDK/AIMP.SDK/AIMP.SDK.csproj b/src/SDK/AIMP.SDK/AIMP.SDK.csproj index ce5748cf..493a66ec 100644 --- a/src/SDK/AIMP.SDK/AIMP.SDK.csproj +++ b/src/SDK/AIMP.SDK/AIMP.SDK.csproj @@ -124,6 +124,7 @@ + @@ -283,6 +284,7 @@ + diff --git a/src/SDK/AIMP.SDK/SDK/AlbumArt/AimpGetAlbumArtEventArgs.cs b/src/SDK/AIMP.SDK/SDK/AlbumArt/AimpGetAlbumArtEventArgs.cs index 44983124..2920c411 100644 --- a/src/SDK/AIMP.SDK/SDK/AlbumArt/AimpGetAlbumArtEventArgs.cs +++ b/src/SDK/AIMP.SDK/SDK/AlbumArt/AimpGetAlbumArtEventArgs.cs @@ -10,6 +10,8 @@ using System; using System.Drawing; +using AIMP.SDK.Objects; + namespace AIMP.SDK.AlbumArt { /// @@ -19,10 +21,32 @@ namespace AIMP.SDK.AlbumArt /// public class AimpGetAlbumArtEventArgs : EventArgs { + public AimpGetAlbumArtEventArgs(IAimpImage image, object userData = null) + { + UserData = userData; + Image = image; + } + + public AimpGetAlbumArtEventArgs(IAimpImage image, IAimpImageContainer imageContainer, object userData = null) + { + UserData = userData; + Image = image; + ImageContainer = imageContainer; + } + + /// + /// Gets or sets the user data. + /// + public object UserData { get; } + + /// + /// Gets or sets the image. + /// + public IAimpImage Image { get; } + /// - /// Gets or sets the cover image. + /// Gets or sets the image container. /// - /// The cover image. - public Bitmap CoverImage { get; set; } + public IAimpImageContainer ImageContainer { get; } } } diff --git a/src/SDK/AIMP.SDK/SDK/IAimpPlayer.cs b/src/SDK/AIMP.SDK/SDK/IAimpPlayer.cs index 0e7c5948..ac0f85cd 100644 --- a/src/SDK/AIMP.SDK/SDK/IAimpPlayer.cs +++ b/src/SDK/AIMP.SDK/SDK/IAimpPlayer.cs @@ -13,6 +13,7 @@ using AIMP.SDK.Configuration; using AIMP.SDK.Core; using AIMP.SDK.FileManager; +using AIMP.SDK.Internet; using AIMP.SDK.Lyrics; using AIMP.SDK.MenuManager; using AIMP.SDK.MessageDispatcher; @@ -212,5 +213,10 @@ public interface IAimpPlayer : IDisposable IAimpServiceFileURI ServiceFileUri { get; } IAimpServiceFileURI2 ServiceFileUri2 { get; } + + /// + /// Gets the service connection settings. + /// + IAimpServiceConnectionSettings ServiceConnectionSettings { get; } } } diff --git a/src/SDK/AIMP.SDK/SDK/Internet/IAimpServiceConnectionSettings.cs b/src/SDK/AIMP.SDK/SDK/Internet/IAimpServiceConnectionSettings.cs new file mode 100644 index 00000000..d5efa741 --- /dev/null +++ b/src/SDK/AIMP.SDK/SDK/Internet/IAimpServiceConnectionSettings.cs @@ -0,0 +1,34 @@ +// ---------------------------------------------------- +// AIMP DotNet SDK +// +// Copyright (c) 2014 - 2023 Evgeniy Bogdan +// https://github.com/martin211/aimp_dotnet +// +// Mail: mail4evgeniy@gmail.com +// ---------------------------------------------------- + +namespace AIMP.SDK.Internet; + +public enum ConnectionType +{ + Direct, + Proxy, + SystemDefaults +} + +public interface IAimpServiceConnectionSettings +{ + ConnectionType ConnectionType { get; set; } + + string ProxyServer { get; set; } + + string ProxyPort { get; set; } + + string ProxyUserName { get; set; } + + string ProxyUserPass { get; set; } + + int TimeOut { get; set; } + + string UserAgent { get; set; } +} \ No newline at end of file diff --git a/src/SDK/aimp_dotnet/AIMPSDK/AIMP400/apiAlbumArt.h b/src/SDK/aimp_dotnet/AIMPSDK/AIMP400/apiAlbumArt.h index 4225ee6b..ea84456d 100644 --- a/src/SDK/aimp_dotnet/AIMPSDK/AIMP400/apiAlbumArt.h +++ b/src/SDK/aimp_dotnet/AIMPSDK/AIMP400/apiAlbumArt.h @@ -48,7 +48,7 @@ const int AIMP_SERVICE_ALBUMART_FLAGS_ORIGINAL = 2; const int AIMP_SERVICE_ALBUMART_FLAGS_WAITFOR = 4; const int AIMP_SERVICE_ALBUMART_FLAGS_OFFLINE = 8; -typedef void (CALLBACK TAIMPServiceAlbumArtReceiveProc)(IAIMPImage *image, IAIMPImageContainer *imageContainer, void *UserData); +typedef void (CALLBACK TAIMPServiceAlbumArtReceiveProc)(IAIMPImage2 *image, IAIMPImageContainer *imageContainer, void *UserData); /* IAIMPAlbumArtRequest */ diff --git a/src/SDK/aimp_dotnet/Aimp_DotNetPlugin.vcxproj b/src/SDK/aimp_dotnet/Aimp_DotNetPlugin.vcxproj index fe73dd71..4938dab5 100644 --- a/src/SDK/aimp_dotnet/Aimp_DotNetPlugin.vcxproj +++ b/src/SDK/aimp_dotnet/Aimp_DotNetPlugin.vcxproj @@ -61,6 +61,7 @@ + @@ -217,6 +218,7 @@ + @@ -313,6 +315,7 @@ + diff --git a/src/SDK/aimp_dotnet/Aimp_DotNetPlugin.vcxproj.filters b/src/SDK/aimp_dotnet/Aimp_DotNetPlugin.vcxproj.filters index 5527280b..70572fb3 100644 --- a/src/SDK/aimp_dotnet/Aimp_DotNetPlugin.vcxproj.filters +++ b/src/SDK/aimp_dotnet/Aimp_DotNetPlugin.vcxproj.filters @@ -150,6 +150,7 @@ + @@ -342,6 +343,8 @@ + + diff --git a/src/SDK/aimp_dotnet/SDK/AimpObject.h b/src/SDK/aimp_dotnet/SDK/AimpObject.h index 97af0188..ec5e15ab 100644 --- a/src/SDK/aimp_dotnet/SDK/AimpObject.h +++ b/src/SDK/aimp_dotnet/SDK/AimpObject.h @@ -27,6 +27,7 @@ public ref class AimpObject : public IAimpObject { AimpObject(TAimpObject* aimpObject) : _aimpObject(aimpObject) { RegisterAtMemoryManager(); + //ComObject->AddRef(); } !AimpObject() { @@ -55,6 +56,9 @@ public ref class AimpObject : public IAimpObject { virtual void ReleaseFromMemoryManager() { AimpMemoryManager::getInstance().Release(this->GetHashCode()); + if (InternalAimpObject != nullptr) { + InternalAimpObject->Release(); + } } public: diff --git a/src/SDK/aimp_dotnet/SDK/AimpPlayer.cpp b/src/SDK/aimp_dotnet/SDK/AimpPlayer.cpp index 20057527..28955a6f 100644 --- a/src/SDK/aimp_dotnet/SDK/AimpPlayer.cpp +++ b/src/SDK/aimp_dotnet/SDK/AimpPlayer.cpp @@ -18,6 +18,7 @@ #include "FileManager/AimpServiceFileInfoFormatterUtils.h" #include "FileManager/Services/AimpServiceFileURI.h" #include "FileManager/Services/AimpServiceFileURI2.h" +#include "Internet/AimpServiceConnectionSettings.h" #include "MUI/AimpServiceMUI.h" #include "Menu/AimpServiceMenuManager.h" #include "Player/AimpServicePlayer.h" @@ -59,6 +60,14 @@ AimpPlayer::~AimpPlayer() { delete _serviceFileTagEditor; } +Internet::IAimpServiceConnectionSettings^ AimpPlayer::ServiceConnectionSettings::get() { + if (_serviceConnectionSettings == nullptr) { + _serviceConnectionSettings = gcnew AimpServiceConnectionSettings(_managedAimpCore); + } + + return _serviceConnectionSettings; +} + IAimpServiceFileInfoFormatterUtils^ AimpPlayer::ServiceFileInfoFormatterUtils::get() { if (_serviceFileInfoFormatterUtils == nullptr) { _serviceFileInfoFormatterUtils = gcnew AimpServiceFileInfoFormatterUtils(_managedAimpCore); diff --git a/src/SDK/aimp_dotnet/SDK/AimpPlayer.h b/src/SDK/aimp_dotnet/SDK/AimpPlayer.h index 4e0f3878..433d2119 100644 --- a/src/SDK/aimp_dotnet/SDK/AimpPlayer.h +++ b/src/SDK/aimp_dotnet/SDK/AimpPlayer.h @@ -90,6 +90,7 @@ namespace AIMP { IAimpServiceFileInfoFormatterUtils^ _serviceFileInfoFormatterUtils; IAimpServiceFileURI^ _serviceFileURI; IAimpServiceFileURI2^ _serviceFileURI2; + Internet::IAimpServiceConnectionSettings^ _serviceConnectionSettings; public: /// /// Initializes a new instance of the class. @@ -101,6 +102,10 @@ namespace AIMP { AimpPlayer(ManagedAimpCore^ core, int pluginId, int applicationDomainId, bool isCrossDomain); ~AimpPlayer(); + property Internet::IAimpServiceConnectionSettings^ ServiceConnectionSettings + { + virtual Internet::IAimpServiceConnectionSettings^ get(); + } property IAimpServiceFileInfoFormatterUtils^ ServiceFileInfoFormatterUtils { diff --git a/src/SDK/aimp_dotnet/SDK/AlbumArt/AimpServiceAlbumArt.cpp b/src/SDK/aimp_dotnet/SDK/AlbumArt/AimpServiceAlbumArt.cpp index ac5edbfd..dec511a0 100644 --- a/src/SDK/aimp_dotnet/SDK/AlbumArt/AimpServiceAlbumArt.cpp +++ b/src/SDK/aimp_dotnet/SDK/AlbumArt/AimpServiceAlbumArt.cpp @@ -10,6 +10,10 @@ #include "Stdafx.h" #include "AimpServiceAlbumArt.h" +#include "SDK/CustomUserData.h" +#include "SDK/Objects/AimpImage.h" +#include "SDK/Objects/AimpImageContainer.h" + using namespace AIMP::SDK; AimpServiceAlbumArt::AimpServiceAlbumArt(ManagedAimpCore^ core) : BaseAimpService(core) { @@ -219,25 +223,31 @@ void AimpServiceAlbumArt::MaxFileSize::set(int value) { } } -void AimpServiceAlbumArt::OnAlbumArtReceive(IAIMPImage* image, IAIMPImageContainer* image_container, void* user_data) { - AimpGetAlbumArtEventArgs^ args = gcnew AimpGetAlbumArtEventArgs(); - if (image == nullptr && image_container == nullptr) { - Completed(this, args); - return; +void AimpServiceAlbumArt::OnAlbumArtReceive(IAIMPImage2* image, IAIMPImageContainer* image_container, void* user_data) { + IAimpImage^ img = nullptr; + IAimpImageContainer^ container = nullptr; + Object^ userData = nullptr; + + if (image != nullptr) { + img = gcnew AimpImage(image); } - if (image_container != nullptr && image == nullptr) { - args->CoverImage = AimpConverter::ToManagedBitmap(image_container); + if (image_container != nullptr) { + container = gcnew AimpImageContainer(image_container); } - else if (image != nullptr) { - args->CoverImage = AimpConverter::ToManagedBitmap(image); + + if (user_data != nullptr) { + auto customData = static_cast(user_data); + userData = customData->CustomObject(); + customData->Release(); } + AimpGetAlbumArtEventArgs^ args = gcnew AimpGetAlbumArtEventArgs(img, container, userData); + Completed(this, args); } -IntResult AimpServiceAlbumArt::Get(String^ fileUrl, String^ artist, String^ album, AimpFindCovertArtType flags, - Object^ userData) { +IntResult AimpServiceAlbumArt::Get(String^ fileUrl, String^ artist, String^ album, AimpFindCovertArtType flags, Object^ userData) { if (String::IsNullOrEmpty(fileUrl)) { ARGUMENT_NULL("fileUrl", "Parameter fileUrl cannot be empty") } @@ -253,13 +263,20 @@ IntResult AimpServiceAlbumArt::Get(String^ fileUrl, String^ artist, String^ albu IAIMPServiceAlbumArt* service = GetAimpService(); try { if (service != nullptr) { + + CustomUserData* customData = nullptr; + + if (userData != nullptr) { + customData = new CustomUserData(userData); + } + result = CheckResult(service->Get( sFileUrl, sArtist, sAlbum, DWORD(flags), static_cast(thunk.ToPointer()), - reinterpret_cast(&userData), &taskId)); + customData, &taskId)); } } finally { @@ -270,7 +287,6 @@ IntResult AimpServiceAlbumArt::Get(String^ fileUrl, String^ artist, String^ albu } return INT_RESULT(result, reinterpret_cast(taskId)); - //return INT_RESULT(result, IntPtr(taskId).ToInt32()); } IntResult AimpServiceAlbumArt::Get2(IAimpFileInfo^ fileInfo, AimpFindCovertArtType flags, Object^ userData) { diff --git a/src/SDK/aimp_dotnet/SDK/AlbumArt/AimpServiceAlbumArt.h b/src/SDK/aimp_dotnet/SDK/AlbumArt/AimpServiceAlbumArt.h index 7c02c98e..67c68f4e 100644 --- a/src/SDK/aimp_dotnet/SDK/AlbumArt/AimpServiceAlbumArt.h +++ b/src/SDK/aimp_dotnet/SDK/AlbumArt/AimpServiceAlbumArt.h @@ -77,10 +77,9 @@ namespace AIMP { void set(int val); } - void OnAlbumArtReceive(IAIMPImage* image, IAIMPImageContainer* image_container, void* user_data); + void OnAlbumArtReceive(IAIMPImage2* image, IAIMPImageContainer* image_container, void* user_data); - virtual IntResult Get(String^ fileUrl, String^ artist, String^ album, AimpFindCovertArtType flags, - Object^ userData); + virtual IntResult Get(String^ fileUrl, String^ artist, String^ album, AimpFindCovertArtType flags, Object^ userData); virtual IntResult Get2(IAimpFileInfo^ fileInfo, AimpFindCovertArtType flags, Object^ userData); @@ -88,7 +87,7 @@ namespace AIMP { protected: IAIMPServiceAlbumArt* GetAimpService() override; private: - delegate void OnFindCoverCallback(IAIMPImage* image, IAIMPImageContainer* imageContainer, void* UserData); + delegate void OnFindCoverCallback(IAIMPImage2* image, IAIMPImageContainer* imageContainer, void* UserData); OnFindCoverCallback^ _findCallback; EventHandler^ _onComplete; }; diff --git a/src/SDK/aimp_dotnet/SDK/CustomUserData.h b/src/SDK/aimp_dotnet/SDK/CustomUserData.h new file mode 100644 index 00000000..43e96578 --- /dev/null +++ b/src/SDK/aimp_dotnet/SDK/CustomUserData.h @@ -0,0 +1,35 @@ +// ---------------------------------------------------- +// AIMP DotNet SDK +// +// Copyright (c) 2014 - 2023 Evgeniy Bogdan +// https://github.com/martin211/aimp_dotnet +// +// Mail: mail4evgeniy@gmail.com +// ---------------------------------------------------- + +#pragma once + +public class CustomUserData : IUnknownInterfaceImpl { +private: + gcroot _customObjectHandle; +public: + gcroot CustomObject() { + return _customObjectHandle; + } + + explicit CustomUserData(gcroot data) + : _customObjectHandle(data) { + } + + virtual HRESULT WINAPI QueryInterface(REFIID riid, LPVOID* ppvObject) { + return IUnknownInterfaceImpl::QueryInterface(riid, ppvObject); + } + + virtual ULONG WINAPI AddRef(void) { + return IUnknownInterfaceImpl::AddRef(); + } + + virtual ULONG WINAPI Release(void) { + return IUnknownInterfaceImpl::Release(); + } +}; \ No newline at end of file diff --git a/src/SDK/aimp_dotnet/SDK/Internet/AimpServiceConnectionSettings.cpp b/src/SDK/aimp_dotnet/SDK/Internet/AimpServiceConnectionSettings.cpp new file mode 100644 index 00000000..566b5f42 --- /dev/null +++ b/src/SDK/aimp_dotnet/SDK/Internet/AimpServiceConnectionSettings.cpp @@ -0,0 +1,240 @@ +#include "stdafx.h" +#include "AimpServiceConnectionSettings.h" + +using namespace AIMP::SDK; + +AimpServiceConnectionSettings::AimpServiceConnectionSettings(ManagedAimpCore^ core) : BaseAimpService(core) { +} + +AimpServiceConnectionSettings::~AimpServiceConnectionSettings() { +} + +Internet::ConnectionType AimpServiceConnectionSettings::ConnectionType::get() { + IAIMPServiceConnectionSettings* service = GetAimpService(); + IAIMPPropertyList* prop = nullptr; + + try { + if (service != nullptr) { + service->QueryInterface(IID_IAIMPPropertyList, reinterpret_cast(&prop)); + return static_cast(PropertyListExtension::GetInt32(prop, AIMP_SERVICE_CONSET_PROPID_CONNECTION_TYPE)); + } + } + finally { + ReleaseObject(prop); + ReleaseObject(service); + } +} + +void AimpServiceConnectionSettings::ConnectionType::set(Internet::ConnectionType value) { + IAIMPServiceConnectionSettings* service = GetAimpService(); + IAIMPPropertyList* prop = nullptr; + + try { + if (service != nullptr) { + service->QueryInterface(IID_IAIMPPropertyList, reinterpret_cast(&prop)); + PropertyListExtension::SetInt32(prop, AIMP_SERVICE_CONSET_PROPID_CONNECTION_TYPE, static_cast(value)); + } + } + finally { + ReleaseObject(prop); + ReleaseObject(service); + } +} + +String^ AimpServiceConnectionSettings::ProxyServer::get() { + IAIMPServiceConnectionSettings* service = GetAimpService(); + IAIMPPropertyList* prop = nullptr; + + try { + if (service != nullptr) { + service->QueryInterface(IID_IAIMPPropertyList, reinterpret_cast(&prop)); + return PropertyListExtension::GetString(prop, AIMP_SERVICE_CONSET_PROPID_PROXY_SERVER); + } + } + finally { + ReleaseObject(prop); + ReleaseObject(service); + } +} + +void AimpServiceConnectionSettings::ProxyServer::set(String^ value) { + IAIMPServiceConnectionSettings* service = GetAimpService(); + IAIMPPropertyList* prop = nullptr; + + try { + if (service != nullptr) { + service->QueryInterface(IID_IAIMPPropertyList, reinterpret_cast(&prop)); + PropertyListExtension::SetString(prop, AIMP_SERVICE_CONSET_PROPID_PROXY_SERVER, value); + } + } + finally { + ReleaseObject(prop); + ReleaseObject(service); + } +} + +String^ AimpServiceConnectionSettings::ProxyPort::get() { + IAIMPServiceConnectionSettings* service = GetAimpService(); + IAIMPPropertyList* prop = nullptr; + + try { + if (service != nullptr) { + service->QueryInterface(IID_IAIMPPropertyList, reinterpret_cast(&prop)); + return PropertyListExtension::GetString(prop, AIMP_SERVICE_CONSET_PROPID_PROXY_PORT); + } + } + finally { + ReleaseObject(prop); + ReleaseObject(service); + } +} + +void AimpServiceConnectionSettings::ProxyPort::set(String^ value) { + IAIMPServiceConnectionSettings* service = GetAimpService(); + IAIMPPropertyList* prop = nullptr; + + try { + if (service != nullptr) { + service->QueryInterface(IID_IAIMPPropertyList, reinterpret_cast(&prop)); + PropertyListExtension::SetString(prop, AIMP_SERVICE_CONSET_PROPID_PROXY_PORT, value); + } + } + finally { + ReleaseObject(prop); + ReleaseObject(service); + } +} + +String^ AimpServiceConnectionSettings::ProxyUserName::get() { + IAIMPServiceConnectionSettings* service = GetAimpService(); + IAIMPPropertyList* prop = nullptr; + + try { + if (service != nullptr) { + service->QueryInterface(IID_IAIMPPropertyList, reinterpret_cast(&prop)); + return PropertyListExtension::GetString(prop, AIMP_SERVICE_CONSET_PROPID_PROXY_USERNAME); + } + } + finally { + ReleaseObject(prop); + ReleaseObject(service); + } +} + +void AimpServiceConnectionSettings::ProxyUserName::set(String^ value) { + IAIMPServiceConnectionSettings* service = GetAimpService(); + IAIMPPropertyList* prop = nullptr; + + try { + if (service != nullptr) { + service->QueryInterface(IID_IAIMPPropertyList, reinterpret_cast(&prop)); + PropertyListExtension::SetString(prop, AIMP_SERVICE_CONSET_PROPID_PROXY_USERNAME, value); + } + } + finally { + ReleaseObject(prop); + ReleaseObject(service); + } +} + +String^ AimpServiceConnectionSettings::ProxyUserPass::get() { + IAIMPServiceConnectionSettings* service = GetAimpService(); + IAIMPPropertyList* prop = nullptr; + + try { + if (service != nullptr) { + service->QueryInterface(IID_IAIMPPropertyList, reinterpret_cast(&prop)); + return PropertyListExtension::GetString(prop, AIMP_SERVICE_CONSET_PROPID_PROXY_USERPASS); + } + } + finally { + ReleaseObject(prop); + ReleaseObject(service); + } +} + +void AimpServiceConnectionSettings::ProxyUserPass::set(String^ value) { + IAIMPServiceConnectionSettings* service = GetAimpService(); + IAIMPPropertyList* prop = nullptr; + + try { + if (service != nullptr) { + service->QueryInterface(IID_IAIMPPropertyList, reinterpret_cast(&prop)); + PropertyListExtension::SetString(prop, AIMP_SERVICE_CONSET_PROPID_PROXY_USERPASS, value); + } + } + finally { + ReleaseObject(prop); + ReleaseObject(service); + } +} + +int AimpServiceConnectionSettings::TimeOut::get() { + IAIMPServiceConnectionSettings* service = GetAimpService(); + IAIMPPropertyList* prop = nullptr; + + try { + if (service != nullptr) { + service->QueryInterface(IID_IAIMPPropertyList, reinterpret_cast(&prop)); + return PropertyListExtension::GetInt32(prop, AIMP_SERVICE_CONSET_PROPID_TIMEOUT); + } + } + finally { + ReleaseObject(prop); + ReleaseObject(service); + } +} + +void AimpServiceConnectionSettings::TimeOut::set(int value) { + IAIMPServiceConnectionSettings* service = GetAimpService(); + IAIMPPropertyList* prop = nullptr; + + try { + if (service != nullptr) { + service->QueryInterface(IID_IAIMPPropertyList, reinterpret_cast(&prop)); + PropertyListExtension::SetInt32(prop, AIMP_SERVICE_CONSET_PROPID_TIMEOUT, value); + } + } + finally { + ReleaseObject(prop); + ReleaseObject(service); + } +} + +String^ AimpServiceConnectionSettings::UserAgent::get() { + IAIMPServiceConnectionSettings* service = GetAimpService(); + IAIMPPropertyList* prop = nullptr; + + try { + if (service != nullptr) { + service->QueryInterface(IID_IAIMPPropertyList, reinterpret_cast(&prop)); + return PropertyListExtension::GetString(prop, AIMP_SERVICE_CONSET_PROPID_USERAGENT); + } + } + finally { + ReleaseObject(prop); + ReleaseObject(service); + } +} + +void AimpServiceConnectionSettings::UserAgent::set(String^ value) { + IAIMPServiceConnectionSettings* service = GetAimpService(); + IAIMPPropertyList* prop = nullptr; + + try { + if (service != nullptr) { + service->QueryInterface(IID_IAIMPPropertyList, reinterpret_cast(&prop)); + PropertyListExtension::SetString(prop, AIMP_SERVICE_CONSET_PROPID_USERAGENT, value); + } + } + finally { + ReleaseObject(prop); + ReleaseObject(service); + } +} + +IAIMPServiceConnectionSettings* AimpServiceConnectionSettings::GetAimpService() { + IAIMPServiceConnectionSettings* service = nullptr; + GetService(IID_IAIMPServiceConnectionSettings, &service); + return service; +} diff --git a/src/SDK/aimp_dotnet/SDK/Internet/AimpServiceConnectionSettings.h b/src/SDK/aimp_dotnet/SDK/Internet/AimpServiceConnectionSettings.h new file mode 100644 index 00000000..a9ad1bde --- /dev/null +++ b/src/SDK/aimp_dotnet/SDK/Internet/AimpServiceConnectionSettings.h @@ -0,0 +1,65 @@ +// ---------------------------------------------------- +// AIMP DotNet SDK +// +// Copyright (c) 2014 - 2023 Evgeniy Bogdan +// https://github.com/martin211/aimp_dotnet +// +// Mail: mail4evgeniy@gmail.com +// ---------------------------------------------------- + +#pragma once + +#include "SDK/BaseAimpService.h" +#include "AIMPSDK/AIMP400/apiInternet.h" + +namespace AIMP { + namespace SDK { + using namespace Internet; + + public ref class AimpServiceConnectionSettings : + public BaseAimpService, + public IAimpServiceConnectionSettings { + public: + explicit AimpServiceConnectionSettings(ManagedAimpCore^ core); + + ~AimpServiceConnectionSettings(); + + virtual property ConnectionType ConnectionType { + Internet::ConnectionType get(); + void set(Internet::ConnectionType value); + } + + virtual property String^ ProxyServer { + String^ get(); + void set(String^ value); + } + + virtual property String^ ProxyPort { + String^ get(); + void set(String^ value); + } + + virtual property String^ ProxyUserName { + String^ get(); + void set(String^ value); + } + + virtual property String^ ProxyUserPass { + String^ get(); + void set(String^ value); + } + + virtual property int TimeOut { + int get(); + void set(int value); + } + + virtual property String^ UserAgent { + String^ get(); + void set(String^ value); + } + protected: + IAIMPServiceConnectionSettings* GetAimpService() override; + }; + } +} diff --git a/src/SDK/aimp_dotnet/SDK/Objects/AimpImageContainer.cpp b/src/SDK/aimp_dotnet/SDK/Objects/AimpImageContainer.cpp index 69741e35..77b6fcbc 100644 --- a/src/SDK/aimp_dotnet/SDK/Objects/AimpImageContainer.cpp +++ b/src/SDK/aimp_dotnet/SDK/Objects/AimpImageContainer.cpp @@ -11,6 +11,7 @@ #include "AimpImageContainer.h" AimpImageContainer::AimpImageContainer(IAIMPImageContainer* container) : AimpObject(container) { + container->AddRef(); } AimpActionResult^ AimpImageContainer::CreateImage() { diff --git a/src/Tests/IntegrationTests/AimpTestRunner.csproj b/src/Tests/IntegrationTests/AimpTestRunner.csproj index d6cfd094..6ae618e2 100644 --- a/src/Tests/IntegrationTests/AimpTestRunner.csproj +++ b/src/Tests/IntegrationTests/AimpTestRunner.csproj @@ -127,6 +127,7 @@ + diff --git a/src/Tests/IntegrationTests/UnitTests/Internet/IAimpServiceConnectionSettingsUnitTests.cs b/src/Tests/IntegrationTests/UnitTests/Internet/IAimpServiceConnectionSettingsUnitTests.cs new file mode 100644 index 00000000..29147372 --- /dev/null +++ b/src/Tests/IntegrationTests/UnitTests/Internet/IAimpServiceConnectionSettingsUnitTests.cs @@ -0,0 +1,100 @@ +// ---------------------------------------------------- +// AIMP DotNet SDK +// +// Copyright (c) 2014 - 2023 Evgeniy Bogdan +// https://github.com/martin211/aimp_dotnet +// +// Mail: mail4evgeniy@gmail.com +// ---------------------------------------------------- + +using AIMP.SDK.Internet; + +using Aimp.TestRunner.TestFramework; +using NUnit.Framework; + +namespace Aimp.TestRunner.UnitTests.Internet; + +[TestFixture(Category = "ServiceConnectionSettings")] +public class IAimpServiceConnectionSettingsUnitTests : AimpIntegrationTest +{ + [Test] + public void ConnectionType_ShouldChange() + { + Player.ServiceConnectionSettings.ConnectionType = ConnectionType.Proxy; + + var actual = Player.ServiceConnectionSettings.ConnectionType; + AimpAssert.AreEqual(ConnectionType.Proxy, actual); + } + + [Test] + public void ProxyServer_ShouldChange() + { + const string expected = "localhost"; + + Player.ServiceConnectionSettings.ProxyServer = expected; + + var actual = Player.ServiceConnectionSettings.ProxyServer; + + AimpAssert.AreEqual(expected, actual); + } + + [Test] + public void ProxyPort_ShouldChange() + { + const string expected = "8888"; + + Player.ServiceConnectionSettings.ProxyPort = expected; + + var actual = Player.ServiceConnectionSettings.ProxyPort; + + AimpAssert.AreEqual(expected, actual); + } + + [Test] + public void ProxyUserName_ShouldChange() + { + const string expected = "User"; + + Player.ServiceConnectionSettings.ProxyUserName = expected; + + var actual = Player.ServiceConnectionSettings.ProxyUserName; + + AimpAssert.AreEqual(expected, actual); + } + + [Test] + public void ProxyUserPass_ShouldChange() + { + const string expected = "ProxyUserPass"; + + Player.ServiceConnectionSettings.ProxyUserPass = expected; + + var actual = Player.ServiceConnectionSettings.ProxyUserPass; + + AimpAssert.AreEqual(expected, actual); + } + + [Test] + public void UserAgent_ShouldChange() + { + const string expected = "UserAgent"; + + Player.ServiceConnectionSettings.UserAgent = expected; + + var actual = Player.ServiceConnectionSettings.UserAgent; + + AimpAssert.AreEqual(expected, actual); + } + + [Test] + public void TimeOut_ShouldChange() + { + const int expected = 20000; + + Player.ServiceConnectionSettings.TimeOut = expected; + + var actual = Player.ServiceConnectionSettings.TimeOut; + + AimpAssert.AreEqual(expected, actual); + } +} \ No newline at end of file From d2aaf0a56ab5bb4cc8dde925f4aa7d92aad7de0a Mon Sep 17 00:00:00 2001 From: Evgeny Date: Tue, 21 Mar 2023 14:23:44 +0300 Subject: [PATCH 15/36] Fix release objects --- src/SDK/aimp_dotnet/SDK/AimpObject.h | 1 + src/SDK/aimp_dotnet/SDK/FileManager/AimpFileInfo.h | 1 - 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/src/SDK/aimp_dotnet/SDK/AimpObject.h b/src/SDK/aimp_dotnet/SDK/AimpObject.h index ec5e15ab..8d8e8760 100644 --- a/src/SDK/aimp_dotnet/SDK/AimpObject.h +++ b/src/SDK/aimp_dotnet/SDK/AimpObject.h @@ -51,6 +51,7 @@ public ref class AimpObject : public IAimpObject { virtual void RegisterAtMemoryManager() { if (InternalAimpObject != nullptr) { AimpMemoryManager::getInstance().AddObject(this->GetHashCode(), InternalAimpObject, msclr::interop::marshal_as(this->ToString())); + InternalAimpObject->AddRef(); } } diff --git a/src/SDK/aimp_dotnet/SDK/FileManager/AimpFileInfo.h b/src/SDK/aimp_dotnet/SDK/FileManager/AimpFileInfo.h index c2acb2b0..f0bfd36d 100644 --- a/src/SDK/aimp_dotnet/SDK/FileManager/AimpFileInfo.h +++ b/src/SDK/aimp_dotnet/SDK/FileManager/AimpFileInfo.h @@ -9,7 +9,6 @@ #pragma once #include "SDK\AimpObject.h" -#include "SDK\ManagedAimpCore.h" namespace AIMP { namespace SDK { From b0e12eef3562a081cc894fbeb898a585175a04c1 Mon Sep 17 00:00:00 2001 From: Evgeny Date: Tue, 21 Mar 2023 14:29:06 +0300 Subject: [PATCH 16/36] Fix release objects --- src/SDK/aimp_dotnet/SDK/FileManager/AimpFileInfo.h | 1 + 1 file changed, 1 insertion(+) diff --git a/src/SDK/aimp_dotnet/SDK/FileManager/AimpFileInfo.h b/src/SDK/aimp_dotnet/SDK/FileManager/AimpFileInfo.h index f0bfd36d..c2acb2b0 100644 --- a/src/SDK/aimp_dotnet/SDK/FileManager/AimpFileInfo.h +++ b/src/SDK/aimp_dotnet/SDK/FileManager/AimpFileInfo.h @@ -9,6 +9,7 @@ #pragma once #include "SDK\AimpObject.h" +#include "SDK\ManagedAimpCore.h" namespace AIMP { namespace SDK { From 5b432d3e7da97a98f5b77de0e9d548c3eefe6cb9 Mon Sep 17 00:00:00 2001 From: Evgeny Date: Tue, 21 Mar 2023 14:50:39 +0300 Subject: [PATCH 17/36] Release/5.03.2394.4 --- src/SDK/aimp_dotnet/SDK/AimpObject.h | 1 + 1 file changed, 1 insertion(+) diff --git a/src/SDK/aimp_dotnet/SDK/AimpObject.h b/src/SDK/aimp_dotnet/SDK/AimpObject.h index ec5e15ab..8d8e8760 100644 --- a/src/SDK/aimp_dotnet/SDK/AimpObject.h +++ b/src/SDK/aimp_dotnet/SDK/AimpObject.h @@ -51,6 +51,7 @@ public ref class AimpObject : public IAimpObject { virtual void RegisterAtMemoryManager() { if (InternalAimpObject != nullptr) { AimpMemoryManager::getInstance().AddObject(this->GetHashCode(), InternalAimpObject, msclr::interop::marshal_as(this->ToString())); + InternalAimpObject->AddRef(); } } From 9c684ded2c31ae7077e6c1544f2d3ce5673294bb Mon Sep 17 00:00:00 2001 From: Evgeny Date: Wed, 22 Mar 2023 00:20:41 +0300 Subject: [PATCH 18/36] =?UTF-8?q?=D0=A4=D0=B8=D0=BA=D1=81=20=D0=BE=D1=87?= =?UTF-8?q?=D0=B8=D1=81=D1=82=D0=BA=D0=B8=20=D0=BF=D0=B0=D0=BC=D1=8F=D1=82?= =?UTF-8?q?=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/SDK/aimp_dotnet/SDK/AimpObject.h | 1 - .../SDK/MusicLibrary/DataFilter/AimpDataFilterGroup.cpp | 6 ++++++ .../SDK/MusicLibrary/DataFilter/AimpDataFilterGroup.h | 4 ++++ 3 files changed, 10 insertions(+), 1 deletion(-) diff --git a/src/SDK/aimp_dotnet/SDK/AimpObject.h b/src/SDK/aimp_dotnet/SDK/AimpObject.h index 8d8e8760..1f84d5c6 100644 --- a/src/SDK/aimp_dotnet/SDK/AimpObject.h +++ b/src/SDK/aimp_dotnet/SDK/AimpObject.h @@ -27,7 +27,6 @@ public ref class AimpObject : public IAimpObject { AimpObject(TAimpObject* aimpObject) : _aimpObject(aimpObject) { RegisterAtMemoryManager(); - //ComObject->AddRef(); } !AimpObject() { diff --git a/src/SDK/aimp_dotnet/SDK/MusicLibrary/DataFilter/AimpDataFilterGroup.cpp b/src/SDK/aimp_dotnet/SDK/MusicLibrary/DataFilter/AimpDataFilterGroup.cpp index 438357d1..0c2271ec 100644 --- a/src/SDK/aimp_dotnet/SDK/MusicLibrary/DataFilter/AimpDataFilterGroup.cpp +++ b/src/SDK/aimp_dotnet/SDK/MusicLibrary/DataFilter/AimpDataFilterGroup.cpp @@ -124,6 +124,12 @@ void AimpDataFilterGroup::EndUpdate() { InternalAimpObject->EndUpdate(); } +void AimpDataFilterGroup::RegisterAtMemoryManager() { +} + +void AimpDataFilterGroup::ReleaseFromMemoryManager() { +} + generic AimpActionResult^ AimpDataFilterGroup::GetChild(int index) { const auto t = TFilter::typeid; diff --git a/src/SDK/aimp_dotnet/SDK/MusicLibrary/DataFilter/AimpDataFilterGroup.h b/src/SDK/aimp_dotnet/SDK/MusicLibrary/DataFilter/AimpDataFilterGroup.h index 84988f63..9a59eeb3 100644 --- a/src/SDK/aimp_dotnet/SDK/MusicLibrary/DataFilter/AimpDataFilterGroup.h +++ b/src/SDK/aimp_dotnet/SDK/MusicLibrary/DataFilter/AimpDataFilterGroup.h @@ -45,6 +45,10 @@ namespace AIMP { virtual void BeginUpdate(); virtual void EndUpdate(); + + protected: + void RegisterAtMemoryManager() override; + void ReleaseFromMemoryManager() override; }; } } From d7bd00024994e3e6859de2807e126b6e39dc121f Mon Sep 17 00:00:00 2001 From: Evgeny Date: Wed, 22 Mar 2023 00:37:46 +0300 Subject: [PATCH 19/36] =?UTF-8?q?=D0=A4=D0=B8=D0=BA=D1=81=20=D0=BE=D1=87?= =?UTF-8?q?=D0=B8=D1=81=D1=82=D0=BA=D0=B8=20=D0=BF=D0=B0=D0=BC=D1=8F=D1=82?= =?UTF-8?q?=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/SDK/aimp_dotnet/SDK/AimpObject.h | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/SDK/aimp_dotnet/SDK/AimpObject.h b/src/SDK/aimp_dotnet/SDK/AimpObject.h index 8d8e8760..536cc24f 100644 --- a/src/SDK/aimp_dotnet/SDK/AimpObject.h +++ b/src/SDK/aimp_dotnet/SDK/AimpObject.h @@ -27,7 +27,6 @@ public ref class AimpObject : public IAimpObject { AimpObject(TAimpObject* aimpObject) : _aimpObject(aimpObject) { RegisterAtMemoryManager(); - //ComObject->AddRef(); } !AimpObject() { @@ -51,14 +50,14 @@ public ref class AimpObject : public IAimpObject { virtual void RegisterAtMemoryManager() { if (InternalAimpObject != nullptr) { AimpMemoryManager::getInstance().AddObject(this->GetHashCode(), InternalAimpObject, msclr::interop::marshal_as(this->ToString())); - InternalAimpObject->AddRef(); + ComObject->AddRef(); } } virtual void ReleaseFromMemoryManager() { AimpMemoryManager::getInstance().Release(this->GetHashCode()); if (InternalAimpObject != nullptr) { - InternalAimpObject->Release(); + ComObject->Release(); } } From 6dafbd7f90a0f19945761a5c51d8193732a61bcf Mon Sep 17 00:00:00 2001 From: Evgeny Date: Wed, 22 Mar 2023 16:53:50 +0300 Subject: [PATCH 20/36] =?UTF-8?q?=D0=9C=D0=B5=D0=BD=D0=B5=D0=B4=D0=B6?= =?UTF-8?q?=D0=B5=D1=80=20=D0=BF=D0=B0=D0=BC=D1=8F=D1=82=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/SDK/aimp_dotnet/SDK/AimpObject.h | 5 ++++- src/SDK/aimp_dotnet/SDK/FileManager/AimpFileInfo.cpp | 2 ++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/SDK/aimp_dotnet/SDK/AimpObject.h b/src/SDK/aimp_dotnet/SDK/AimpObject.h index 536cc24f..9a09486f 100644 --- a/src/SDK/aimp_dotnet/SDK/AimpObject.h +++ b/src/SDK/aimp_dotnet/SDK/AimpObject.h @@ -12,6 +12,8 @@ template public ref class AimpObject : public IAimpObject { +private: + bool _isDisposable; protected: AimpObject() { } @@ -20,12 +22,13 @@ public ref class AimpObject : public IAimpObject { TAimpObject* _aimpObject; public: AimpObject(TAimpObject* aimpObject, bool registerAtMemoryManager) : _aimpObject(aimpObject) { + _isDisposable = registerAtMemoryManager; if (registerAtMemoryManager) { RegisterAtMemoryManager(); } } - AimpObject(TAimpObject* aimpObject) : _aimpObject(aimpObject) { + AimpObject(TAimpObject* aimpObject) : AimpObject(aimpObject, false) { RegisterAtMemoryManager(); } diff --git a/src/SDK/aimp_dotnet/SDK/FileManager/AimpFileInfo.cpp b/src/SDK/aimp_dotnet/SDK/FileManager/AimpFileInfo.cpp index 4c7c6d07..9afe2cfb 100644 --- a/src/SDK/aimp_dotnet/SDK/FileManager/AimpFileInfo.cpp +++ b/src/SDK/aimp_dotnet/SDK/FileManager/AimpFileInfo.cpp @@ -470,6 +470,7 @@ AimpFileInfo::AimpFileInfo(IAIMPFileInfo* aimpItem) : AimpObject(aimpItem, false AimpFileInfo::AimpFileInfo(IAimpFileInfo^ item) { _aimpObject = static_cast(AimpConverter::MakeObject(IID_IAIMPFileInfo)); + RegisterAtMemoryManager(); this->Album = item->Album; this->AlbumArt = item->AlbumArt; this->AlbumArtist = item->AlbumArtist; @@ -508,5 +509,6 @@ AimpFileInfo::AimpFileInfo(IAimpFileInfo^ item) { AimpFileInfo::AimpFileInfo() { IAIMPFileInfo* fileInfo; ManagedAimpCore::GetAimpCore()->CreateObject(IID_IAIMPFileInfo, reinterpret_cast(&fileInfo)); + RegisterAtMemoryManager(); _aimpObject = fileInfo; } From 62527fd804d616d4ae251d6af54ce36d7dcff985 Mon Sep 17 00:00:00 2001 From: Evgeny Date: Thu, 4 May 2023 18:12:43 +0300 Subject: [PATCH 21/36] Resolve "Fix memory manager" --- GitVersion.yml | 2 +- build/Build.Analyze.cs | 2 +- build/Build.Documentation.cs | 2 +- build/Build.IntegrationTest.cs | 8 ++++---- build/Build.cs | 26 +++++++++++++++++++++----- global.json | 2 +- src/SDK/aimp_dotnet/SDK/AimpObject.h | 14 +++++++------- 7 files changed, 36 insertions(+), 20 deletions(-) diff --git a/GitVersion.yml b/GitVersion.yml index 478ee36e..1e0a1595 100644 --- a/GitVersion.yml +++ b/GitVersion.yml @@ -14,7 +14,7 @@ branches: feature: regex: ^feature?[/] mode: ContinuousDeployment - tag: beta + tag: 'debug' increment: None prevent-increment-of-merged-branch-version: false track-merge-target: false diff --git a/build/Build.Analyze.cs b/build/Build.Analyze.cs index a8d63530..b0bffbf9 100644 --- a/build/Build.Analyze.cs +++ b/build/Build.Analyze.cs @@ -69,7 +69,7 @@ partial class Build }, () => { MSBuild(c => c - .SetConfiguration(Configuration) + .SetConfiguration(GetConfiguration()) .SetProcessToolPath(MsBuildPath) .SetTargets("Rebuild") .SetSolutionFile(Solution) diff --git a/build/Build.Documentation.cs b/build/Build.Documentation.cs index 70882e49..35cdaa47 100644 --- a/build/Build.Documentation.cs +++ b/build/Build.Documentation.cs @@ -55,7 +55,7 @@ partial class Build .Executes(() => { GlobFiles(DocumentationApiDirectory, "**/toc.yml").ForEach(File.Delete); - WriteCustomTocs(DocumentationApiDirectory, DocumentationRoot, GlobFiles(SDKBinFolder / "x86" / Configuration, "AIMP.SDK.dll")); + WriteCustomTocs(DocumentationApiDirectory, DocumentationRoot, GlobFiles(SDKBinFolder / "x86" / GetConfiguration(), "AIMP.SDK.dll")); }); Target BuildDocumentation => _ => _ diff --git a/build/Build.IntegrationTest.cs b/build/Build.IntegrationTest.cs index ff946fc3..255f0664 100644 --- a/build/Build.IntegrationTest.cs +++ b/build/Build.IntegrationTest.cs @@ -40,7 +40,7 @@ partial class Build Target PrepareTestConfiguration => _ => _ .Executes(() => { - var outPath = Configuration == Configuration.Release ? IntegrationTestOutput : TestOutput; + var outPath = GetConfiguration() == Configuration.Release ? IntegrationTestOutput : TestOutput; Log.Debug("Preparing test settings"); DeleteDirectory(outPath); @@ -87,7 +87,7 @@ partial class Build EnsureExistingDirectory(IntegrationTestPluginPath); var testBinPath = IntegrationTestBinPath; - var testPattern = $"**/bin/{IntegrationTestTestPlatform}/{Configuration}"; + var testPattern = $"**/bin/{IntegrationTestTestPlatform}/{GetConfiguration()}"; Log.Information("Test bin files path: '{testBinPath}'", testBinPath); Log.Information($"Test bin files path: '{testBinPath}'"); @@ -128,14 +128,14 @@ void copyFilesFromFolder(string folder) }); } - testBinPath.GlobDirectories($"**/bin/{IntegrationTestTestPlatform}/{Configuration}").ForEach(d => + testBinPath.GlobDirectories($"**/bin/{IntegrationTestTestPlatform}/{GetConfiguration()}").ForEach(d => { copyFilesFromFolder(d); Log.Debug($"Copy {d}/nunit.engine.addins to {IntegrationTestPluginPath}"); CopyFileToDirectory(d / "nunit.engine.addins", IntegrationTestPluginPath); }); - var sdkFolder = new DirectoryInfo(SDKBinFolder / $"{IntegrationTestTestPlatform}/{Configuration}"); + var sdkFolder = new DirectoryInfo(SDKBinFolder / $"{IntegrationTestTestPlatform}/{GetConfiguration()}"); var sdkFiles = sdkFolder.GetFiles("*.dll"); foreach (var file in sdkFiles) { diff --git a/build/Build.cs b/build/Build.cs index 77a9a13e..86ab469b 100644 --- a/build/Build.cs +++ b/build/Build.cs @@ -102,6 +102,8 @@ string BuildNumber readonly string ReleaseBranchPrefix = "release"; readonly string HotfixBranchPrefix = "hotfix"; readonly string MailstoneBranch = "mailstone"; + readonly string FeatureBranchPreffix = "feature"; + string _version = "1.0.0.0"; string _buildNumber = "1.0.0.0"; @@ -187,7 +189,7 @@ string BuildNumber .SetProcessToolPath(MsBuildPath) .SetTargetPath(Solution) .SetTargets("Rebuild") - .SetConfiguration(Configuration) + .SetConfiguration(GetConfiguration()) .SetAssemblyVersion(_version) .SetFileVersion(_version) .SetInformationalVersion($"{_version}-{GitRepository.Commit}") @@ -196,6 +198,21 @@ string BuildNumber .SetTargetPlatform(TargetPlatform)); }); + private Configuration GetConfiguration() + { + if (GitRepository.Branch.StartsWith(FeatureBranchPreffix)) + { + if (IsTeamCity) + { + TeamCity.Instance.SetConfigurationParameter("Configuration", Configuration.Debug); + } + + return Configuration.Debug; + } + + return Configuration; + } + Target Pack => _ => _ .DependsOn(Version) .Executes(() => @@ -208,7 +225,7 @@ string BuildNumber var config = new NuGetPackSettings() .SetBasePath(RootDirectory) - .SetConfiguration(Configuration) + .SetConfiguration(GetConfiguration()) .SetVersion(_version) .SetOutputDirectory(OutputDirectory); @@ -244,7 +261,6 @@ string BuildNumber }); Target Publish => _ => _ - .Requires(() => Configuration.Equals(Configuration.Release)) .Requires(() => NugetApiKey) .Executes(() => { @@ -282,7 +298,7 @@ string BuildNumber Log.Information("Copy plugins to artifacts folder"); - var directories = GlobDirectories(SourceDirectory / "Plugins", $"**/bin/{targetPlatform}/{Configuration}"); + var directories = GlobDirectories(SourceDirectory / "Plugins", $"**/bin/{targetPlatform}/{GetConfiguration()}"); foreach (var directory in directories) { var pluginDirectory = new DirectoryInfo(directory); @@ -315,7 +331,7 @@ string BuildNumber } } - var sdkFolder = new DirectoryInfo(SDKBinFolder / $"{targetPlatform}/{Configuration}"); + var sdkFolder = new DirectoryInfo(SDKBinFolder / $"{targetPlatform}/{GetConfiguration()}"); Log.Information($"Copy SDK files to artifacts folder '{sdkFolder}'"); Directory.CreateDirectory(artifactsFolder / "SDK"); diff --git a/global.json b/global.json index 9cd08e46..2c6a00af 100644 --- a/global.json +++ b/global.json @@ -1,5 +1,5 @@ { "sdk": { - "version": "7.0.102" + "version": "7.0.202" } } \ No newline at end of file diff --git a/src/SDK/aimp_dotnet/SDK/AimpObject.h b/src/SDK/aimp_dotnet/SDK/AimpObject.h index 9a09486f..d333b3b1 100644 --- a/src/SDK/aimp_dotnet/SDK/AimpObject.h +++ b/src/SDK/aimp_dotnet/SDK/AimpObject.h @@ -23,9 +23,7 @@ public ref class AimpObject : public IAimpObject { public: AimpObject(TAimpObject* aimpObject, bool registerAtMemoryManager) : _aimpObject(aimpObject) { _isDisposable = registerAtMemoryManager; - if (registerAtMemoryManager) { - RegisterAtMemoryManager(); - } + RegisterAtMemoryManager(); } AimpObject(TAimpObject* aimpObject) : AimpObject(aimpObject, false) { @@ -51,16 +49,18 @@ public ref class AimpObject : public IAimpObject { } virtual void RegisterAtMemoryManager() { - if (InternalAimpObject != nullptr) { + if (_isDisposable && InternalAimpObject != nullptr) { AimpMemoryManager::getInstance().AddObject(this->GetHashCode(), InternalAimpObject, msclr::interop::marshal_as(this->ToString())); ComObject->AddRef(); } } virtual void ReleaseFromMemoryManager() { - AimpMemoryManager::getInstance().Release(this->GetHashCode()); - if (InternalAimpObject != nullptr) { - ComObject->Release(); + if (_isDisposable) { + AimpMemoryManager::getInstance().Release(this->GetHashCode()); + if (InternalAimpObject != nullptr) { + ComObject->Release(); + } } } From bec0c987c02687e7f8d659794eec88ab3682833e Mon Sep 17 00:00:00 2001 From: Evgeny Date: Sun, 21 May 2023 19:09:08 +0300 Subject: [PATCH 22/36] Update SDK --- global.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/global.json b/global.json index 9cd08e46..481d4874 100644 --- a/global.json +++ b/global.json @@ -1,5 +1,5 @@ { "sdk": { - "version": "7.0.102" + "version": "7.0.302" } } \ No newline at end of file From b836f32a14e23edff3feea0dce98732f05191b17 Mon Sep 17 00:00:00 2001 From: Evgeny Date: Tue, 18 Jul 2023 00:59:17 +0300 Subject: [PATCH 23/36] Update sdk version --- global.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/global.json b/global.json index 481d4874..b7b8a6f3 100644 --- a/global.json +++ b/global.json @@ -1,5 +1,5 @@ { "sdk": { - "version": "7.0.302" + "version": "7.0.304" } } \ No newline at end of file From e58cb8ee16037127e28627554dabc9e5228f83a4 Mon Sep 17 00:00:00 2001 From: Evgeny Date: Sun, 17 Dec 2023 17:47:29 +0300 Subject: [PATCH 24/36] Resolve "Add logging" --- global.json | 2 +- .../dotnet_demo/Directory.Build.targets | 2 +- src/Plugins/dotnet_demo/Plugin.cs | 3 - src/SDK/AIMP.SDK/AIMP.SDK.csproj | 2 + src/SDK/AIMP.SDK/AimpPlugin.cs | 29 +++++- src/SDK/AIMP.SDK/Loader/PluginInformation.cs | 16 ++++ src/SDK/AIMP.SDK/Logger/IAimpLogger.cs | 43 +++++++++ src/SDK/AIMP.SDK/Logger/InternalLogger.cs | 95 +++++++++++++++++++ src/SDK/aimp_dotnet/AimpLogger.h | 14 +++ src/SDK/aimp_dotnet/Aimp_DotNetPlugin.vcxproj | 1 + .../Aimp_DotNetPlugin.vcxproj.filters | 1 + src/SDK/aimp_dotnet/DotNetPlugin.h | 4 + src/SDK/aimp_dotnet/SDK/AimpObject.h | 33 ++++++- src/SDK/aimp_dotnet/SDK/AimpPlayer.h | 3 + .../AlbumArt/AimpExtensionAlbumArtProvider3.h | 1 + src/SDK/aimp_dotnet/SDK/ManagedAimpCore.h | 1 - .../Presets/AimpGroupingPresets.h | 1 - src/SDK/aimp_dotnet/Stdafx.h | 1 + 18 files changed, 240 insertions(+), 12 deletions(-) create mode 100644 src/SDK/AIMP.SDK/Logger/IAimpLogger.cs create mode 100644 src/SDK/AIMP.SDK/Logger/InternalLogger.cs create mode 100644 src/SDK/aimp_dotnet/AimpLogger.h diff --git a/global.json b/global.json index 2c6a00af..b9ddbb89 100644 --- a/global.json +++ b/global.json @@ -1,5 +1,5 @@ { "sdk": { - "version": "7.0.202" + "version": "7.0.306" } } \ No newline at end of file diff --git a/src/Plugins/dotnet_demo/Directory.Build.targets b/src/Plugins/dotnet_demo/Directory.Build.targets index 344f3a5b..ad5055cb 100644 --- a/src/Plugins/dotnet_demo/Directory.Build.targets +++ b/src/Plugins/dotnet_demo/Directory.Build.targets @@ -1,7 +1,7 @@  $(SolutionDir)..\nuget\tools\CopyPlugin.ps1 - AIMP5.03.2398 + aimp5.11.2432 diff --git a/src/Plugins/dotnet_demo/Plugin.cs b/src/Plugins/dotnet_demo/Plugin.cs index b92295b9..5019dc49 100644 --- a/src/Plugins/dotnet_demo/Plugin.cs +++ b/src/Plugins/dotnet_demo/Plugin.cs @@ -86,7 +86,6 @@ public override void Initialize() demoFormItem.OnShow += (sender, args) => { var item = sender as IAimpMenuItem; - Logger.Instance.AddInfoMessage($"Event: [Show] {item.Id}"); }; Player.ServiceMenuManager.Add(ParentMenuType.CommonUtilities, demoFormItem); @@ -111,7 +110,6 @@ private void DemoFormItemOnOnExecute(object sender, EventArgs eventArgs) _demoForm = new PlayerForm(Player, _hook); var item = sender as IAimpMenuItem; - Logger.Instance.AddInfoMessage($"Event: [Execute] {item.Id}"); _demoForm.Show(); } @@ -138,7 +136,6 @@ private void CreateMenuWithAction() action.OnExecute += (sender, args) => { var item = sender as IAimpAction; - Logger.Instance.AddInfoMessage($"Event: [Execute] {item.Id}"); }; Player.ServiceActionManager.Register(action); diff --git a/src/SDK/AIMP.SDK/AIMP.SDK.csproj b/src/SDK/AIMP.SDK/AIMP.SDK.csproj index 493a66ec..edd7f793 100644 --- a/src/SDK/AIMP.SDK/AIMP.SDK.csproj +++ b/src/SDK/AIMP.SDK/AIMP.SDK.csproj @@ -107,6 +107,8 @@ + + diff --git a/src/SDK/AIMP.SDK/AimpPlugin.cs b/src/SDK/AIMP.SDK/AimpPlugin.cs index 2566aa2d..5a3e1d2d 100644 --- a/src/SDK/AIMP.SDK/AimpPlugin.cs +++ b/src/SDK/AIMP.SDK/AimpPlugin.cs @@ -10,6 +10,8 @@ using System; using System.IO; +using AIMP.SDK.Logger; + namespace AIMP.SDK { /// @@ -32,6 +34,11 @@ public interface IAimpPlugin : IDisposable /// public abstract class AimpPlugin : IAimpPlugin { + /// + /// Gets or sets the logger. + /// + public IAimpLogger Logger { get; private set; } + /// /// Gets or sets the aimp player. /// @@ -60,6 +67,15 @@ public abstract class AimpPlugin : IAimpPlugin /// public abstract void Dispose(); + /// + /// Initializes the logger. + /// + /// + public virtual IAimpLogger InitializeLogger() + { + return new InternalLogger(); + } + /// /// Called when [dispose]. /// @@ -73,6 +89,15 @@ public void OnDispose() } } + /// + /// Called when [pre initialize]. + /// + /// The player. + public virtual void OnPreInitialize(IAimpPlayer player) + { + AimpPlayer = player; + } + /// /// Called when [initialize]. /// @@ -81,10 +106,12 @@ public void OnDispose() public void OnInitialize(IAimpPlayer player, int unId) { PluginId = unId; - AimpPlayer = player; var path = Path.GetDirectoryName(GetType().Assembly.Location); AppDomain.CurrentDomain.SetData("APPBASE", path); Environment.CurrentDirectory = path; + + Logger = InitializeLogger(); + Initialize(); } } diff --git a/src/SDK/AIMP.SDK/Loader/PluginInformation.cs b/src/SDK/AIMP.SDK/Loader/PluginInformation.cs index 9d01b8d8..5a48e89f 100644 --- a/src/SDK/AIMP.SDK/Loader/PluginInformation.cs +++ b/src/SDK/AIMP.SDK/Loader/PluginInformation.cs @@ -14,6 +14,7 @@ using System.Reflection; using System.Threading; using AIMP.SDK; +using AIMP.SDK.Logger; namespace AIMP.Loader { @@ -317,6 +318,11 @@ public void ShowSettingDialog(IntPtr parentWindow) plugin?.Show(parentWindow); } + public void OnPreInitialize(IAimpPlayer player) + { + LoadedPlugin.OnPreInitialize(player); + } + /// /// Initializes the specified plugin. /// @@ -328,5 +334,15 @@ public void Initialize(IAimpPlayer player) LoadedPlugin.OnInitialize(player, LoadedPlugin.PluginId); } } + + public IAimpLogger InitializeLogger() + { + if (IsLoaded) + { + return LoadedPlugin.InitializeLogger(); + } + + return new InternalLogger(); + } } } diff --git a/src/SDK/AIMP.SDK/Logger/IAimpLogger.cs b/src/SDK/AIMP.SDK/Logger/IAimpLogger.cs new file mode 100644 index 00000000..7a9967bd --- /dev/null +++ b/src/SDK/AIMP.SDK/Logger/IAimpLogger.cs @@ -0,0 +1,43 @@ +// ---------------------------------------------------- +// AIMP DotNet SDK +// +// Copyright (c) 2014 - 2023 Evgeniy Bogdan +// https://github.com/martin211/aimp_dotnet +// +// Mail: mail4evgeniy@gmail.com +// ---------------------------------------------------- + +using System; + +namespace AIMP.SDK.Logger; + +public interface IAimpLogger +{ + void Verbose(string message); + + void Verbose(string message, params object[] values); + + void Verbose(Exception? exception, string messageTemplate, params object[] values); + + void Information(string message); + + void Information(string message, params object[] values); + + void Information(Exception? exception, string messageTemplate, params object[] values); + + void Error(string message, params object[] values); + + void Error(Exception? exception, string messageTemplate, params object[] values); + + void Fatal(string message); + + void Fatal(string message, params object[] values); + + void Fatal(Exception? exception, string messageTemplate, params object[] values); + + void Debug(string message); + + void Debug(string message, params object[] values); + + void Debug(Exception? exception, string messageTemplate, params object[] values); +} \ No newline at end of file diff --git a/src/SDK/AIMP.SDK/Logger/InternalLogger.cs b/src/SDK/AIMP.SDK/Logger/InternalLogger.cs new file mode 100644 index 00000000..ae9c74de --- /dev/null +++ b/src/SDK/AIMP.SDK/Logger/InternalLogger.cs @@ -0,0 +1,95 @@ +// ---------------------------------------------------- +// AIMP DotNet SDK +// +// Copyright (c) 2014 - 2023 Evgeniy Bogdan +// https://github.com/martin211/aimp_dotnet +// +// Mail: mail4evgeniy@gmail.com +// ---------------------------------------------------- + +using System; + +namespace AIMP.SDK.Logger; + +public class InternalLogger : IAimpLogger +{ + public void Verbose(string message) + { + System.Diagnostics.Debug.WriteLine(message, "Verbose"); + } + + public void Verbose(string message, params object[] values) + { + System.Diagnostics.Debug.WriteLine(message, "Verbose"); + } + + public void Verbose(Exception? exception, string messageTemplate, params object[] values) + { + var msg = $"{messageTemplate}. Error: {exception}"; + System.Diagnostics.Debug.WriteLine(msg, "Verbose"); + } + + public void Information(string message) + { + System.Diagnostics.Debug.WriteLine(message, "Information"); + } + + public void Information(string message, params object[] values) + { + System.Diagnostics.Debug.WriteLine(message, "Information"); + } + + public void Information(Exception? exception, string messageTemplate, params object[] values) + { + var msg = $"{messageTemplate}. Error: {exception}"; + System.Diagnostics.Debug.WriteLine(msg, "Information"); + } + + public void Error(string message) + { + System.Diagnostics.Debug.WriteLine(message, "Error"); + } + + public void Error(string message, params object[] values) + { + System.Diagnostics.Debug.WriteLine(message, "Error"); + } + + public void Error(Exception? exception, string messageTemplate, params object[] values) + { + var msg = $"{messageTemplate}. Error: {exception}"; + System.Diagnostics.Debug.WriteLine(msg, "Error"); + } + + public void Debug(string message) + { + System.Diagnostics.Debug.WriteLine(message, "Debug"); + } + + public void Debug(string message, params object[] values) + { + System.Diagnostics.Debug.WriteLine(message, "Debug"); + } + + public void Debug(Exception? exception, string messageTemplate, params object[] values) + { + var msg = $"{messageTemplate}. Error: {exception}"; + System.Diagnostics.Debug.WriteLine(msg, "Debug"); + } + + public void Fatal(string message) + { + System.Diagnostics.Debug.WriteLine(message, "Fatal"); + } + + public void Fatal(string message, params object[] values) + { + System.Diagnostics.Debug.WriteLine(message, "Fatal"); + } + + public void Fatal(Exception? exception, string messageTemplate, params object[] values) + { + var msg = $"{messageTemplate}. Error: {exception}"; + System.Diagnostics.Debug.WriteLine(msg, "Fatal"); + } +} \ No newline at end of file diff --git a/src/SDK/aimp_dotnet/AimpLogger.h b/src/SDK/aimp_dotnet/AimpLogger.h new file mode 100644 index 00000000..4dfebb9a --- /dev/null +++ b/src/SDK/aimp_dotnet/AimpLogger.h @@ -0,0 +1,14 @@ +// ---------------------------------------------------- +// AIMP DotNet SDK +// +// Copyright (c) 2014 - 2023 Evgeniy Bogdan +// https://github.com/martin211/aimp_dotnet +// +// Mail: mail4evgeniy@gmail.com +// ---------------------------------------------------- + +#pragma once +public ref class AimpLogger { +public: + static Logger::IAimpLogger^ Logger; +}; \ No newline at end of file diff --git a/src/SDK/aimp_dotnet/Aimp_DotNetPlugin.vcxproj b/src/SDK/aimp_dotnet/Aimp_DotNetPlugin.vcxproj index 4938dab5..8e0a013b 100644 --- a/src/SDK/aimp_dotnet/Aimp_DotNetPlugin.vcxproj +++ b/src/SDK/aimp_dotnet/Aimp_DotNetPlugin.vcxproj @@ -173,6 +173,7 @@ + diff --git a/src/SDK/aimp_dotnet/Aimp_DotNetPlugin.vcxproj.filters b/src/SDK/aimp_dotnet/Aimp_DotNetPlugin.vcxproj.filters index 70572fb3..23ec897d 100644 --- a/src/SDK/aimp_dotnet/Aimp_DotNetPlugin.vcxproj.filters +++ b/src/SDK/aimp_dotnet/Aimp_DotNetPlugin.vcxproj.filters @@ -345,6 +345,7 @@ + diff --git a/src/SDK/aimp_dotnet/DotNetPlugin.h b/src/SDK/aimp_dotnet/DotNetPlugin.h index fb74863f..946f8d44 100644 --- a/src/SDK/aimp_dotnet/DotNetPlugin.h +++ b/src/SDK/aimp_dotnet/DotNetPlugin.h @@ -43,6 +43,10 @@ public ref class ManagedFunctionality instance = gcnew AimpPlayer(_managedCore, sender->LoadedPlugin->PluginId, AppDomain::CurrentDomain->Id, false); } + sender->OnPreInitialize(instance); + + AimpLogger::Logger = sender->InitializeLogger(); + sender->Initialize(instance); } diff --git a/src/SDK/aimp_dotnet/SDK/AimpObject.h b/src/SDK/aimp_dotnet/SDK/AimpObject.h index d333b3b1..e7e07979 100644 --- a/src/SDK/aimp_dotnet/SDK/AimpObject.h +++ b/src/SDK/aimp_dotnet/SDK/AimpObject.h @@ -10,6 +10,10 @@ #pragma once #include +#include "AimpLogger.h" +#include +#include + template public ref class AimpObject : public IAimpObject { private: @@ -49,19 +53,40 @@ public ref class AimpObject : public IAimpObject { } virtual void RegisterAtMemoryManager() { + ComObject->AddRef(); if (_isDisposable && InternalAimpObject != nullptr) { AimpMemoryManager::getInstance().AddObject(this->GetHashCode(), InternalAimpObject, msclr::interop::marshal_as(this->ToString())); - ComObject->AddRef(); } + AimpLogger::Logger->Debug(String::Format("Register object: {0}. Type: {1}. Register at MM: {2}", this->GetHashCode(), this->ToString(), _isDisposable)); + AimpLogger::Logger->Verbose(System::Environment::StackTrace); + } + + static int Filter(unsigned int code) { + if (code == EXCEPTION_ACCESS_VIOLATION) { + AimpLogger::Logger->Error("Access violation exception"); + AimpLogger::Logger->Error(System::Environment::StackTrace); + return EXCEPTION_EXECUTE_HANDLER; + } + + return EXCEPTION_CONTINUE_SEARCH; } virtual void ReleaseFromMemoryManager() { + AimpLogger::Logger->Debug(String::Format("Release object: {0}", this->GetHashCode())); + if (InternalAimpObject != nullptr) { + ComObject->Release(); + } + if (_isDisposable) { - AimpMemoryManager::getInstance().Release(this->GetHashCode()); - if (InternalAimpObject != nullptr) { - ComObject->Release(); + __try { + AimpMemoryManager::getInstance().Release(this->GetHashCode()); + } + __except (Filter(GetExceptionCode())) { + AimpLogger::Logger->Error("Error to Release object " + this->GetHashCode()); + AimpLogger::Logger->Error(System::Environment::StackTrace); } } + AimpLogger::Logger->Verbose(System::Environment::StackTrace); } public: diff --git a/src/SDK/aimp_dotnet/SDK/AimpPlayer.h b/src/SDK/aimp_dotnet/SDK/AimpPlayer.h index 433d2119..8e1b25ba 100644 --- a/src/SDK/aimp_dotnet/SDK/AimpPlayer.h +++ b/src/SDK/aimp_dotnet/SDK/AimpPlayer.h @@ -92,6 +92,9 @@ namespace AIMP { IAimpServiceFileURI2^ _serviceFileURI2; Internet::IAimpServiceConnectionSettings^ _serviceConnectionSettings; public: + static Logger::IAimpLogger^ Logger; + + /// /// Initializes a new instance of the class. /// diff --git a/src/SDK/aimp_dotnet/SDK/AlbumArt/AimpExtensionAlbumArtProvider3.h b/src/SDK/aimp_dotnet/SDK/AlbumArt/AimpExtensionAlbumArtProvider3.h index 79e1100a..8cfc59e6 100644 --- a/src/SDK/aimp_dotnet/SDK/AlbumArt/AimpExtensionAlbumArtProvider3.h +++ b/src/SDK/aimp_dotnet/SDK/AlbumArt/AimpExtensionAlbumArtProvider3.h @@ -8,6 +8,7 @@ // ---------------------------------------------------- #pragma once +#include "IUnknownInterfaceImpl.h" using namespace AlbumArt; using namespace AlbumArt::Extensions; diff --git a/src/SDK/aimp_dotnet/SDK/ManagedAimpCore.h b/src/SDK/aimp_dotnet/SDK/ManagedAimpCore.h index 56eb31c2..a597bfc5 100644 --- a/src/SDK/aimp_dotnet/SDK/ManagedAimpCore.h +++ b/src/SDK/aimp_dotnet/SDK/ManagedAimpCore.h @@ -103,7 +103,6 @@ namespace AIMP { virtual void OnPlaylistAdded(IAIMPPlaylist* playlist); virtual void OnPlaylistRemoved(IAIMPPlaylist* playlist); - private: static IAIMPCore* _core = nullptr; IAIMPExtensionPlayerHook* _playerHook = nullptr; diff --git a/src/SDK/aimp_dotnet/SDK/MusicLibrary/Presets/AimpGroupingPresets.h b/src/SDK/aimp_dotnet/SDK/MusicLibrary/Presets/AimpGroupingPresets.h index 61de37de..9178659f 100644 --- a/src/SDK/aimp_dotnet/SDK/MusicLibrary/Presets/AimpGroupingPresets.h +++ b/src/SDK/aimp_dotnet/SDK/MusicLibrary/Presets/AimpGroupingPresets.h @@ -8,7 +8,6 @@ // ---------------------------------------------------- #pragma once -#include "SDK\AimpObject.h" #include "AIMPSDK\AIMPSDK.h" #include "SDK/MusicLibrary/InternalAimpGroupingTreeDataProvider.h" diff --git a/src/SDK/aimp_dotnet/Stdafx.h b/src/SDK/aimp_dotnet/Stdafx.h index 11c40925..90835b22 100644 --- a/src/SDK/aimp_dotnet/Stdafx.h +++ b/src/SDK/aimp_dotnet/Stdafx.h @@ -45,3 +45,4 @@ typedef AimpActionResult^ MenuItemResult; #include #include "AimpSdk.h" #include "vcclr.h" +#include "AimpLogger.h" \ No newline at end of file From 6e1d2b7dec60d629291baee921ec7a325695f740 Mon Sep 17 00:00:00 2001 From: Evgeniy Date: Mon, 18 Dec 2023 23:01:58 +0300 Subject: [PATCH 25/36] Update nunit --- global.json | 2 +- nunit/nunit.framework.dll | Bin 483328 -> 517120 bytes nunit/nunit.framework.xml | 18883 ++++++++++++++++ src/SDK/aimp_dotnet/SDK/AimpObject.h | 3 + .../IntegrationTests/AimpTestRunner.csproj | 38 +- .../IntegrationTests/Directory.Build.targets | 2 +- .../Engine/AimpNUnitFrameworkDriver.cs | 2 +- .../TestFramework/AimpIntegrationTest.cs | 2 +- .../TestFramework/Assert/EqualAssert.cs | 4 +- .../TestFramework/Assert/FalseAssert.cs | 4 +- .../TestFramework/Assert/NotEqualAssert.cs | 4 +- .../TestFramework/Assert/NotNullAssert.cs | 4 +- .../TestFramework/Assert/NullAssert.cs | 4 +- .../TestFramework/Assert/TrueAssert.cs | 4 +- .../AimpServiceAlbumArtTests.cs | 31 +- .../FileManager/AimpFileInfoUnitTests.cs | 2 +- .../IAimpServiceFileURI2UnitTests.cs | 4 +- .../UnitTests/Player/AimpPlayerTests.cs | 12 +- src/Tests/IntegrationTests/packages.config | 3 +- 19 files changed, 18949 insertions(+), 59 deletions(-) create mode 100644 nunit/nunit.framework.xml diff --git a/global.json b/global.json index b9ddbb89..8a1056e1 100644 --- a/global.json +++ b/global.json @@ -1,5 +1,5 @@ { "sdk": { - "version": "7.0.306" + "version": "8.0.100" } } \ No newline at end of file diff --git a/nunit/nunit.framework.dll b/nunit/nunit.framework.dll index 3e4aad92622d1b427cf35cde5a38ec698f5353dd..8bfd7aadfd795fd292c3b66b296e556c0ed4a6e0 100644 GIT binary patch literal 517120 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

FK!3 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 iKy`L+vWkGZNAi%!mtHdP%PxQF zVZ){kYmj7+dbb8w*bwjLc3VB@esb!QR#^}Nn2w|OP*snPD*vFOG4c4?P=92tTQ2}5%TN?jGIs~#CE7JPBC|Gny*5_xKz1mf(PiMBJ>TupN z?PGlZnmp+dxx&D<`E+E<`r$73i9-W^04rrp)gSVr`E@hLJ2_TDFW(lP>^$P4NlG$Tp=$^~`i zkE^W@`o?exCI0Zr-O?Q^y^XBKUSNu$3_C!k=~y#r(@#UyuJ6j~kY$m=$$Ao+r#%d$ zlP^=r!T!qN0GsUn<$=v|KT$|7SM>4#*7+FZm;1HJ4℞z_OhfoW<=x)dTTmH5&tc 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 literal 483328 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≤GuCQnM9oqT`t;^Y;{ zRmppj-%b7^*_)D_(mW-Qa!Jall!+;!l*uVGQ|?Zgn^K;#FlAZFV<}IjRHkf9*^=@? z%Bv~+Q+`SDH%e*Lu2I)U*^P!Zx~b8EMiq??HagMhr$$EO7L5lqp4@mw<3}4m+4!Z# ze>8SBNolgA$*WCjn(S?ItjVb+pEXHr+OlcCropDSHl5RSS<`2lzTNa4{PCKm&AK$} z-RzoXQ=8r2Y-O`e&2}~0*X)O87n*sRCpT}_yiM~C&3iPzrg?GmZOxB0w^}5&Xx}2E z#ef!5vamM^tD z(DIv>R%&``ztpj*rKt;3A4z>IbyMm)slTMAv})0+U8_r4b!(N^>he}IS}$*%+$Ob6 z?>1xGOl?!z=D{}0+H7p|W}A20#M*q*Mzw9$HrRG{+eh23Z2MZmPZ`ZJ+h%5D4#*slIX-hy=2MxcGJneaGqd|8qc17EWd0>jU9#tr_$A+7 z^5-S)jvYG==$PB_ijMO-ZtQrZ<5wLobTm3O>D0bc_f8`^jqfz6(}SHJ@3g+tmQLq8 z{oW~|bF@A62O zm0c>kJk#aHF1x$z>2j#cdtJWo@=F(Y*Zy6Hcl}$}JGws5bxGHXu92>GgQ8XM64F^+vC6d--}d>7Cj;*n52M$-PT^SM*-fdsFY1 zd++XjsQ2;SU-iD&JE>1vpYDA|^|`js#6Gw5S=Z-mpWpj*>N~UVqQ2FAkM{ktZ$iJW z{jThHbH9iBz1;6`zfbz5^zYd}xBtEUm-m0U|J(h)>i=7R?|=mZY6hGd@cV#kvnFQU zlr=SLX4XAf%d@s+?aJDhbu#O8)~8wDW&M(MF)KMcHM>jp(CmWj2eX%DN3wThznWc> zy*K;g?6cY5WS`IeE!&yXI%jOo{W(wMyp$8m`7XyhFmqtnf&B+wI`E2tcMiON;MReE zAGm+u(SfH2wj9)FP;k(QL1PAu8&o#vo54+nWDe;$!DqT77QIZ^shs29XfC5{X-WHeRpW<+%CDjatGvI znOmN_D>s_^X70h!TW*>f=h$Pm7(5K zmU>?~RZM>d%rBZ}DRo~P^7PSN9;M2MlJ54`;?rT@v-2!J`Xne*C8A%la;O&Q+gi0! zmw+8r8`Vj*Ree=J4Nz$+3!g~&DqRgz8R|0BT&{BProny(hVpTsv;Fq)72#W5ZEp1c6?7ZS4~m#5iL-&)C1~H{Lsd1wHWVv zOHi{+h4DiK_v5$pEx=#iUZmFHd7%!q`%t?dKOS)aKgw_jE#5|plW6gcdQAOOtyCBA z_q#8mwP8e5Yok)NHJ(!KjB3^1cv@u|8`UMoCe_K2<8?K~_`8~FyrHHUQFWWK zN8N6`sb(7c@cY;gsk@A~)!oJs{8sj(YL0PS-D8|k<;F?1z<5tRV4PBmjQ7<;#)s;0 zBc|3G->FLDNA;9(UR4?x<683?<2v(NW1M-NalLuHG2WbD+-lxnOfmmvOf`#) zY37Z_ZDxsahdIfZY2IYaGH)?vo0E+><`iSTIn}t&oMwd0+l*54cH@5Y4x`MRX_T9H z8w{IWxcR8D+FWKlVJG z&lumBpBmqppBX=xzZmDuUyXm7e;RmJGJZ1~nZKJY%|FacJUMm5-=6AXT2@y)Lv=IV zR)OiYE;s$wC^ONz+H7QvGn-h~o6W58W^-$TnQGl=wz100cGd%Cd+R|n&01upTPw{B zYn6G4wc6~2Yxw+xA?5$#jd^(}_nF8{`#r|7#w`VWUx3q9o*RbPVl2+bHR@%mV#dlc@R7~WC?gh+Y0c# zOSzKJ(AD4rQ&@gsAbCvlrnxM?U9cX!W6cI|{x+`p!%bVj-S@C|=QtalW34^!5Iws!o%ybs-H)&*{_S#q0N7qx8aQT8tl>jef)-*_IuvKm|Qxjzd`2viRZzx(Z7Mu-GEyyj=l>l z4kv&cn>PkOI@S{Wcw#&7iy{0;z>`C|fLFBb1=`2)`H2Hie(}H{u=&0`u>0Q2!NxmA zgY#PHqSDn%`)?u=WOITHkgP7`o@bSDrj)3NlADPtRt#yDmRd zcst5pwfpZQ{`rBsk!c(t1I1*|8(4dI@LZNlIAisI`@s26@o3t|bmo&Re{^gC@;|j- z3QjGo0ME@|4c<4O?d|jYovj>geM_=$Dw(~J?9iWVa~Jv2>Xz5(+6rAeUT1vXu@9o_3XWLK3|X7U31gT ztgRlf6WjIneXoP(FXwe+Uke`{t3~GMF}As7t9@kmBh#bJ5%54QkHzzv3p6|HbKnnM zo~T(pgMBy7IDwYk_kIl8*NA;A-VO4+x_;(a^Eq;_6j%Kgi9`iq~|D&54q1U7NEx-%6^L*&5 z&x!}{;5J^N@1mcKXp7oGnhS49N4eo0@5KY1k@@k>o}j(GDV6bvo&tgBJ({J=Qy;)?&i9{W$>Hul*^POQEGwFmWj z`e~NxRsHz3m0$vAKUbwz@zrX!T%n4^zW-Nlot=NJEw^I97$0iw^WSbWU4PwEtJ{I0yI6!dx{IxUUkn-h=WyeMhyAPQ!gWdsG;;fmATIx>$%51d1f(YoIQ%~ZdaC)SKLXqeU^M-1Nqk-WZ_n_ z#U}F4b>zC0Wb;*Ivr4kzj17;ho&W5Km6&Vs8q&_RE#g`FpL#Vs;`V6Q%y<%gFRbHU zTDy{Lx{CZ;nAba4Xqj6Zz*la@|U@`6{wm zCD~+P9K9~qaeFUs@a}Anzj`kB%*paE(B|m}zXK!sPGvt`^o{%znTc=md8zRZzK6c6 zpNRGrve&LLh1M1o_`THCo@+7VYiN%6qTi zn(g<^>36YgXYBXi1N%CnWz|l;3)^e!yo+t@vi-T%a9(>Hn+sa^M&HX?@%-GTuW0+d zwPCs8$oBTy&n>%l@#)B(W!x)#YO>4g^xJOh+p@U54ffbS^t;B6JBK1)@lXL+pq~s6 zR*pcq^;6_W`mL?JbnJhX|6Dg7<#j8`BF#V773vIGw32MNy}wpYLZ-9@kLdy zo!lq(y{qA>{^znsEpVGEMLhtT_^#Sg9`&Hxfy_eCR7uK-%nr8;nU_GebtCh#8-Jfs z?F3ELM0t_f=k_79A2d}L!;g&HlYoo|H1X3riC{M)8SHK}0(%%uz}`kPu#eFK>}#Zg z{fyRNmeCf>Hrj(ZMjANKNCyWQnc!ffBRIt93=TEAg1JU_Flh7y^Nil$wMJjC+~^Ok zHL}32GCSb8$(du2%2h>k&E(X&{R8(Jn$bzK3HcALw*lvs`JL> z;LpZzWPSln^{X)w<=;S4{cem#`2uLFKa8tT{u4Bn%e)$8H)tx4ITmFvXeyt1E$BDL zfeGe#~IgKvOj~3sG(YnyRT;gmN>`RL#v|lv{wNYH3bFITbWj zEAwWQTZ5)*V@^i7EoiEC<`k6MgQg0Y(@;(W@$cg1bd=LUQ)QU9qnruic$qW7p5~ok zFY|7&w>by3eLx%|b1upQK^!CVUX%xeI7a4u;83#^%r(o94}v&G<^q&21x=N2K8SJw zXsTi6B9t!!O?A2XFv?ee_}h}^5|l@PrW$E3MR^oxs?p{$l&=I$b(L9x@)*!m*O`xj zjSWx^&!~b`WU>_st2c9XTWLJS@1UN zGjO_f4xC|q3Epmf4c=jW3(mB@2WMG7f_GX!fz{T};0EhgaHI7*_?-0z_`G!y+-@0$ zsa~)w@I}iB?y%h8OO_Y>!t#U4kq8=&WYEM9Nn_g`O+bgE8R&Gh0Gm2e4VvDU^nM_u)DJo?BT2edpb9Oy__4t-pM$lgtHdB!np?=?%WHGaP9|3IuC%OoQJ^C&coo9&ZFQ}&g0-1=R4rl z&Ue9UoTtERogaXcogad?IzI-dIP1Zw&NJXN=UMPJ=V#z_=Q(hO^Gk5H^J{R9^IPy9 z=l59ET+meWoIj#`FKDXy&Y!^hoIfKI22J&l^H=a;=kMTR=O5r^=S9>$1L90@8m6JP zf;h@f3*{XkjnXCgAMgE$kM$tb@8;!JQh zLb(RSnc!@KaxI8YH)k`H_kgB))7b*$y`ZV~Ia5*I51Q&NXKR!XfH;4gZBaf1n(A$5 zdz24@raIzG1CKh>!DG%$)~Rbe}|R-ma`yN09O1~gSC*GRCNYc$y1brsm# zbv2md8jCgqL7d61Yf&By;!JjpLwP8OPd(RoFzA{9=DBVFFLf1y`K}_gDFAUkyNXf1 z48-~Dngm|qx)~hqnhcI`O#w%`rh%he)4|cM+tL0?5a+XNCOF1*Co)%qruvKPZj{G@ zIJaGMP`(z#z0@@q<#8ZB6J7VBJRUUFUtRa1JOMP-L{}*|)l~*gb1eX8xE@69?I7;7 zu0`N%*Tdi(*Anm^*HYBZ1#!;1mVxtK6=2x)7+C6B3EuBo4K8-A0hhR*1Rrs&2ba1k z(f3gh_hDBR%F99Ahg};`UIF3`?Ai#fbZrKst}V#dfH-?y+rV1ab6}loJGjU7BKW53 zC2+56C%Dh`3iy`mHSmDzb?~6;4e*ew2K>fV3x4m~1D<#71%Gz!2QRn|fEQhdK+}B~ zbh?j%9`|w3=Y9ul>V6k&={^Ovc7Fi2aeoN5b$^T%wgd4T<*o-iy3c@}+-Jc-?$5wt z_c^e{{UusX0`bY^{u;c?{Vh1p{XH0V{|GL2{{${^{|r9j{uNy6{vCYO{RgbY$;l^!3J?3_UPr1F|R<|E~#hnPg>P`kPeRo%s zKLD|x-QB?-+&#e`-Mzu{?!Kt~2{hF|-ThJi88q=X+p|EgCkOO-1|jbU@dV`=0w#KL z!6Z)}*vpd-4)P2`o57%|f}YF4kY_kDMIg>V&q%P$Ga6jrxe9#1b2a#&XDqnfb1him z83(TLj0Yd{OaLGE+yJih6oRWfMc`^rG5CaM61c{5Gg#%B3|4!lfEzs1z^6Ua!EK(~ zG5fP1KD#|L!IwREf;&BTgS$L)z*jtT!B;)^g0Fe*19y8$!Ph-y;NLw9z&AV(f>F;R zu*UN+_z%w#u-3B_tn(}b_joG6H$9JmZ+TXN2Ry66gPt|uA)8Ol=h+CJ@@xj*_iO<_@N5H5d!7S7^lS$|^1KLs?0E@{d3J*Jo>#z6JgpTL0kXE4qCE7-yNJDBeM1MK9z2zK`3hl5lX5KlW^3+(1~g5AAtu!q+R_VoI} zq25F=&zlSucpHJ2dz*m6z0JVuy)D2A-c)dsw>5Z^w=H>z;n+8txrh~J*nc$t? zj^JJ1&S0sxD|o-RJ6PuJ2`=>Z1{Znzf{%LpgUh^G;N#vLaHV$;xW+pKjCgawZQeX^ zhc_R5$vX^N^fHKZ&wDwz%R3yIS3sOU-jU!Q?`ZH%?^WPY@73UY-m%~*@3r9j-f`du z-tpjR?*#B8?+swgTL{*Bi@;C3#o!t5B=A%3&EPrjWbg~`6!1&$H1I3$bnt8M?cg`w znc%nHJHhX~cZ1)1=YT(W=Yl_a?*-ky`@n#&6uiV&26pr*7 z_^QCa`8I%szKvjsZ!>taZwq*_X;@I z_Zm3Q_d0m5?+x%iUkw=c)qdPmy82mkIn1OCHz7Tn|e4BYEG2k!HI3GVlO4Zh|3 z7OOn~;;!!d9z5y$5t(;EoC&_4z*D}T!S{W?f*<&P2V=fJz)yS^!LvTYi7VZQ*Ftp; z#Cx&NiSh*yZ>)Yd*xK&}`}qA}mOl~9_9vrF4v24c{Ebi^1masAe-m(szZp2x-vaqu z5Klh-RB)8PH8{rK7Wu0|Jm>h^qdXSGbB;d^yw;x%PV#4hGyEOFnf}h;9Di4EuD?6l z&jWER{5?^g58_z(dxH!8eZj^4{@`+d7WkMy2VCtR1U}&(0#^ES!D@dVxY3^vKI0z- zzU03g+~pq*?)Hxa-|&wHYyDS&b^fctz5cP_0spn&VgESrh<`kI+&=+4;lBZV$6pAZ z^cR8e`isH${FA^_{+q$~{gc5D{8PZw{%PQc{^{Un{@cNy{WHOf{yV{(guB6k33I?f z33IWfgF)=ugnLmQ3gWpm;XaguAkP1UQt;tWrC66FOT&hUiw zC_e~dZzNQL#}cZ*4-z(jA0})B&m?RH&n9dEzf9N$ex2|f_|Jsx;4cX;f)^5A0{=+Z z3I3Vz3V1Q$HBcqK4jPGXfM#M1=t!&uor!xuSK?mKowy(LBpv|0iHAU6;$hIAcoa-X zJPxKLz5_N+d>712JOy@4`~d8l_#xOW@nf)8Vm;V9@eJ5M@hq5?_!)Rp;yLh^#4o`q ziC=?L6TbzgC4LXiN&FFm{i@%CkUxHYKH@d>4p2RZ=>5e^Ms+NK!{|X;NpfBB?95GO0VbDyb*9I;l6f zE~ziLKB+$#Ny-9uB;|lFCk+D4Wt42fA5vygRq3Q%UO1lGv(yn|U1|;(Nxd9=DiuAA>eO8D>D1xirqq0O%y=Fxj~OqZut7v)5*o~IQjK8DhapNCodEBT&%j3qIsiVPtXnEXt3oVZu2UD*C-$u(5 z#xb-!VVpoq{QN6go-p1+%M-@?XnDdojg}{jkI?d@@hMuKG(Jbmlg3x6gTQal@}%({ zTAnn1NX-M!qvdDDO|7!PTUzCSx3(G!PHi;=yscF(zMI~M+Fy*fQ2UE5C1T=4VO6TmN8=c}%!>;I$f?c*fB zsygA@HIqyxlQB+)VG=TvOhSMJk|EQROcK&eQq$ejQ)K!jUDcTcfl77Nue*z>u4<~P zXQmU-!I#CChZRI5SylyIKe~!2i1^W66h&E7&_y1fbwyBCaLt1*3Ih7@xIEwQIp@CA zOHV=we>^jv>fb%*zWnaXx#ymH&bjxu?+*OEWZzx*d+EMc;_qeqUW&ipw(lPN{q}uj z{Jmn|xVt&`Y^1z7cO_EZoO{l`3jXdx%A0f7Amz=u1N*A@dp%N4<^D5LPUU_RDW`J3 zyYFuN{V-Baue#D^!3z4ciS zKCAMqw>@jep6m8}V$TzMjy?OnXTSB?Kk@7jKKu8d{S$kCcJFWR-G1faD`&5K@XC#= z{^+XDUG?(kEI;Qh&-v7I?!5Z-SO4tQzjXDlUH##!|LW@N_T~4zY+rTXJNA8b-yQoO z-e2GUi~Gl~dBZhty5{V);|D%?;P(&w$$^`%o4D@JuKWCT|8(8IUia+luf2Zq`kCur zfBm0c|JCcCeZxC%`1u=t6W+M^7UJO?%=<_^=EGV)UAJW>&T%Khbo6YdFXAUpC0|v=%t7E9xfjKj>FZ%rw{+; z;Vrk#9C_f#tB#yLa_-14ANlnoe{*E_9sBPn+=k3#*y`AsvF{vv!`KgxJvR1^vHv*sp0VE;`<<~r9Q(xBm&U#}_P@v8_0s?R z(htA%rAOa+^cRl4|LBL0e&*;CNB^IrxqB|X=Zbr-yJzg4iF-=-)bHus^VmHyGXJaty2C$kfj5&)MSc9VzU*{_d^rpS#=K|ITea5ARnwp@IZB z&G@tTx@9Qz5%T}udhd5#$#5_3uI3=_NTDD16Zdw9keGtFj z#_xCV`w)J=i{J0z_hJ103w|HL@AvWh1N{CFzmMYgG5r1rmc2iQMeo1j^C2IHjqXqI z`^3lzaMgnQ(~%kQ%$MUJ?TY&|{Qf(Be~#ZL@%xLBru!6rpT_SmN80YM@cYb2$Ndld z{(5A?eHOpZjXdK1X5>+D)<@mnj(o3s0>A$ozt7|McliB1e*bIa``s5te!%?$e*cKy z7f0UczJ%XDjl9`?8NaXK_f`D<8NYuSc?;}?Z-KS&t*{k7220^%uoJ%BeH}js8`Vhe zCtMD{E%_-|%htb^}`ZScLY489k3!S}){_+Hoq-wTW2dtncJuRDO>b@*M6 z-*fT10l(+L-t~O^UVz_?x%au7a=-0fnEO5OdfcOf-z~X6g@y3XU?2P>tb?C|ZSXU& z4F0t{ocpZ1E%!Nhd+rH$B=>oDNAB<3ow>hsielxjyafT*8 zGKb&&ICnFj8y_j+SHf=rzXx#s<`mA~Jc!>zx#^LYdOEoh#!!P8H{IsyL6cJkr7$oHd-ec@2JT{5tq` z@mt6541Q zx!)XlTkeA+kL7-Q8d+oX3p4Zy*dG>sPJ#Vq+i|tvk za_+O|tUd3y=c=XqL4)6B@Z0VAllJ^+d;X=R`;0w5XU{L&^Q-p!7kgg0Mf>f%J>R$G z_G{Um_uKP>hX1HN|Hz*ITb^6pja!+2t9zk6Z*!=6MO!j_B?oz_Qx;T^F8w13Oks#^H=TpYZkxrVog7Jv6f%3=d?ZV zx93?)w_(r2+q9n-wrT#>HqGC$=cC)Sov*X!>+Shwd%nem}O0uiNtt+ZFx+c{;c2QiVTs*)RMU$NN+AbS~Se^S~&gDbnVoT@!9x4AF}70?fEu~f83rwZqJ{z=Py{gU$N(}+w=GA z`H3r(zCLk<($}X9|Ce}@F8=Zg?e~AQ^1fuxuiEop?73sN)^n#l_w3gCzQCS0?Y>{= z_NLvh6uLcZ_}c;VJ+~ts4>xJ~r|dav=@tw=WzTiPpS9+Jbm&(ik2)!@gUrTzB!v$WsdZt*{9&!4vE&)D--+Dr=S%IGx94Bm^UL-)PS_+w(2E-w>?fgjY z#kt?z@jbcH&M%GJl*_h!*RIp}eQBh$^U*E*Rj+veMQ^(z+w!(6-m~QmyMGnG|GDL+ z+*MouV$b5Pg}qy^sNlD}_jfM)-o5X==m+;cyz3*m_h0nAd*6rpZN1{J5%)|IQjH1eW-U)cJhec6`3*z-G=wfDa`_xfx8 zcH8-DAKvu@eqX?^z5n4|U%vLmxjhG7oI7%0ao4Ax`!IfsyB2R)+_iGU!+3sapUh$FKKj8Nj{QeogCocYrJs;S*^X99zmUe!2 z+k3X{$i4mM>rwXgDD$)1-UTYzm;1ohOAcP1`-?p{ZTtMl<)DwxZu{b;`|yq{kmlL= zJx9{sg!Gq;KDOswc;_XfAK!+)!0!v_lTYv6m;3Bql(+XLly$}74{W{m@F%w2aJaks zrrb^2cHZ&OCDV8O{Uuvo^6rbyJ%4HE7cZ^ttld+?^W%75;Zl0cOv9t}owz^Yo$w=l zC%i=83GdN&x=Zoff!}5L-HCe#UV-N;@sodJ2dmX?t9^8_Tt0N9eCSp;cC=b9Pt-eW zjmpM&qtfXpdO7Qs3!PK-X03I$Q_R|DvNjU;V3|3VHVTN*_pfK`S?6f2Tn0wd&yanIJ=w zL&KV0u_3KM{ly7#ytTSkX=g{5%NU4)LTu1$H492QbeKhruTsevB z*=pCD%j1=fG*lDBF*+<6`roG5`Ss>(vzXzP=%vyMI!k)<$nY$Fs77yN2tzgAYIZC2 zX6L?aLr0B0r?CU?lRO-~J0wIRnai3rRQ!0Q-dJyge2`fqW99D(*(7jmz22xDZ?{&N zR-^g|S&*pOb~fxd=zn<2B)Y$4nu#rw zXi!q2xsMx+hk+Lw9&mkwBn(Mfa6(_|9Pszsr|^PC*l8+OnMhPqvgw5$t0ELX6vpux%JnR>g`iR$f{(+Yy%JvR2mSs zChALAX8;xq_6;qCs$qBtF2m3i42I#kObx|@jSs`)wTFh` zQ9kj<*PB&5=4D_a(*uEvMg?ObzQ^8;*rHS@K~ z8feN^)JmJUkbqStn*bunyWnhR>b0zWs$E$Fi$j#PR>N#vqu#~qL|SA#>z6-^Wm{6% z0%-3IuS)6yTz@GswPp7SVubHyOb!$q4AaJmYXXh6N3YIJZakW~R4(~XY0>3X%@ z>a>=+2eBd?9(ASGLZR73V7_wJLZw!~Xkb}3QP}>B#+_5Lc=TYy;=%f0b-=tp=mNY% z6T~{A(!-kqtZ}*GI*5W?3aGk0A?Sky4OlZ`GcaLy$Z>|OX58~UAU0n+5-x^xXar}j z>_S(vEH?60&p07ahBgC^0AdZHaA(T)nyj=I)pBw9wGz~j0O z$#R|nafa27R0}8>>BA{BdN>L#F^D8aMF?G(ih4=|6)|hy+Mrk=8N{|0Urho*2ohel zy4ct_SzpS=H>!@=JsSkF906WH^A0N;HW=>bxafsk_0Z? zH%L#3M7jZC-wg;}XwbBYNR+hhcF3A|UA|d621%Vk(ZU=8KBgMIJ#wPEe0ZkRlLpNM zJfxYxidco`1uCbpwgyvl!qBih3=JN!Du<4w(kl`HK}JeEitlN}Xn)!xM_jp#1-VGEY8gvMVqxkidOWYtc0d~4oTZeWIGHx3arknL{RVFfMlNz0)4g&I| zDs89*L|2#c(hA|mg^nU*W%2-oh`hs}V{Uq(SSlZzEEh}pQeoVkoXt;Y4@|h}N_DpQ z;GA)#!i0P9SnFH@mN^lDUKT!p6@PrvEfgo`%j5Z(@yU}XCnw6&lf`0wYSN9LD4d)q z7p7)r=O_D+r}FbNg_)^hA9`|res(@0!#k!Y-Sq54;dlY17iJ#F&lmDDrSkZ~$tVT7G@^PCnsm7N+(>gIDWF=iW{A7wtDbXws>%%5Su%CpM+-?PM&n9rroK0p;SIT zJI~)ZUQ(KzpDxUxS7&jZZegZ8u`sWIf6=koQfYR&JbRp-KYm|%E?+{PnNX3^?A%}^ zJ7T6X;|d-AwVD-XW33*Xi{ZngMTdbX%oPhoH#c9HoiCIgLfamgJXv(56Z4ak<%!u+ z5u-j;K3+IE$*NE1ORiX&$B>{WrVAxkn$M3TW*VWwvN&J-e0BjrbS4`! zABvdHKj>zQ4@}M%(G7)}&buz+C z^N)(GMg@%&m5+t#+fn z=sJt!3$9#sfU3w>wXRdOj&|M2dJ`HsENC;_&(*6Wj1WR|v)Wv%-s~p0Mhh!KbGZj? zbQJevorAWiL3vy=Jf!Np>Ge+c7=;zb9Z+DkNL{YTgB6&Oa)9ek93u2hNHL$Sw$5bC-u9u| z*}zY=1=?z)VLxP@4nlkjI|M^syiaZKI}~#un4y@>&=hS3WCBbsy7CMnqmVpS@(#0P%v3~BC`VRSHRsev|Oxe`+yQnA>{MrEyoFtvS#VnaGMPk<6W(2FW# zSxA%2Ro0ogDK>?gi{=nl^6Xt-W}V{Zmd=$!OviVRF+*A}1|#QS99-=Ld^z)Falp+& zggV$@N5nA>+XA%vjfk6VYCmwq)V74281Kpw3;+>RuBav}#mzP`Rl3~in53^kzMDUBI|8i&dY z8mlywXNnP5?r7O0IT8tG1>PjAD}qp;(FhO1RDmsB&WfBPVzslG7_4|kISCxiDkzIR zH(eLr3XKf3nUJahirk`;Q@mK6whh)RR4CXM?e)87xlBrUOk-(QJ4e4X?vvIQ`*4(HwF%;n7_91~XBFA0DG!KRix# z`orUl^$osip|EL`ZD9uUpnIUW9v};J&1NxTZP+BTh^2E#VORrHK|b)F(50okScL{N z!_(l&6H!9hB)`wRNpw>DCMmd%>9}u_K=|)q#XWP{BswvY4d$KCu()x}SRc}ztj;Q@ z*Cz2?N#Xv0jmlubg$|8t!(uoqXO{+ZOg5`6IuH%UoTx9a3}PX)W#W=EFxGUEp-P(* zc(y$}4OCXmYJClA-hu3MF#Dk%BCMVnmH@WK3fzLwF+-zIRu;1%#gvdt4ro_mr6QrX!hPq_8YkQ(MY zyrUq_3`QI$QF5oZX^Qbid(*fHP#>&_;srG@@)Ot{icx6D zTZ{0~TN9~>%u@CmaI_j$LA;{cuCEP`^uwhK8%?-_?>d&j&XRGSoT_xdAO};Z3<1xy z)?gf~H#{cH=i$+2xEd^x+iiLV%FN~dX)p;FRH{{m#YsbCXFiw@t%KHN5bxLh!I;_g zuIST-WYTTiU>4dTHj7KG-Y`O$*VF)Im$WzZ%!Sb&PtgLo+7y_mLH686WYag{bU`uQ~|HpJUT_A-Y z|G~PU(HPu8JlSUS=oyT+cg|;PaOzQ~l7V{VSH;<60MEt_mZ;j#;c;FEJ2WG+&{je= z*;*e`GL;yE?<)<(qRrx`I#B78t+Rt=6guJ&uoW~rqrnJH>Eshgpa=y)CO<1$YLl*L{`FwVHvTKQPLd$!)8?}0ns z$SPD1iv~@(Bi7?pVx}wS*vB5^vftw3DoQ4gRieQx?ZX>5m$m(P`5aN=QI6;F`6US1 zOx%m6-l}g=^f_dC^DCuCmb)-Q!TL>&qctNGAQ?QKs$(B6gN>{Qs7^V>N0nAGjDSv7 zkJD*jCc5M`(o}|Tf`zUm<~e`+V9g(uC8@A(xhEdz7=oO??Lejhi@``v^u4h zQMHf6#t(;NEMwK4MI7OPt?6*N%mDK9A%qi5`<((ktHhadcBzy3mPj<|N|hkT)86)H7^W+9 zOa*SZax1Eu4TY%zW^T!P{m?CiHYy~?=+~=ysK_Vany<^hVPI$ggNCyyJXA4DvG0K! zr^QjvG3KR_vMfH4{h*m-~ga{Mhbv{A9w$iGSA}n4eb^>cV5`-i$t5nQ} z`Xy-!bX84YOrY=rn0p2f)QEi%d=tBbcz#GpX;nvUY8_Kh7!Hm?aqqkYO((NO08^+z zB$^DvB|Jjc2tjANz8JwSq^1ZlDFh5toT@1-g4)yw<86>1#1}Wo1Z)Cv5Pfk{HMpFL zR@SvEXEhLYzSM$txw(ZZppLp0*Xl52S`&hTRvL6c6|PkL!YQcJrD6Lxv=gnfvFvi! zTc?~3sy`v)lv)D_>mQoN%7IGJZ&-S&uqyi6p3Ii|QS;Edq__r>l-FW59AR1MLC_wh ze(X{#=(g2>728HEiQ$O}c;7bbQ2C(qUb8OgvFk3r6EK~uRvHOLZJP;#u51ZdkhPMUtpq8`^#lf4B+vqAAqC}_P=Y{e&KFzatY(I! zWMUW?ig@4%#&$@tLjI5pSH{r`LL?kySFXd9$!-P@sR<^Gwm@OP1)>^E6LH(-gybbu z#NniBS7|~JSkJg`lJJA84SAlkr^UhV0cCVo>J|_}5gbHM2#FG$Ypt#Gs3zMh2o565 z-~8L;9}rjBR7-01R5g=>L{D{-#G7VG;(a(%Z4*q0nEXXp5h-red6q*AvansaMZ7Zr ze2>{Jq#PffYk32`$4IYufUBGj>l`@=HD-0gPA>YWSju<*02WYoOnVyo z#;iTN2zr+Tc0L{ifW~E_3-UPBdH@HzFUk<}j4NkU6L^SiR7R|^%7`^wTv_i@sKyv z9~S{xv`@oEN#&8GBb=wtPQWDcijI+%7mt;AF=yS5nb04cvaF_q?g8TKI<)aYo^d>= zDhsu*8m-zA7W=kg{h4LBgR3@4@N6hI3gm}^DA)A3c8JA<#3CXl;D9>@MP(c3ED|&h zj)>=0o!wJWRtb-13t&L#m1B@rzyNN5EXc|P^PNnb2!R_#py6G@#T%qh!z;}%K*H#3 zu6?q_IDyRpq76lkZ3ZdA+zhuBS%C zH-ki?YB&@r0Y!_2dp#RWOi@8}cMs{Io(u!j`r(g#Gi6a@|GAqlYKRLT+%)f9Or zL8+`05-Zc!LWJ*2uuLWy(v;4&PJ%IK?Lu+(BxdV6*j$KY&j^4U_j;kzpm zVCQ)|uXJeu%22viS0bpYFJEe9RYT_I8_HS$%baMfLf{k>Edv!`fCNH67Miu}T#{U_T!@)<4*JCMgybLM%@sPpnD{9Q<%?($ z;$@ZfWEcPu$U_>kE|{bQX7f@Q1@?n_&@07yb|fVrhgUxcTuIDnGAoX^>sUh7zUC;U zP#@v5stv^>mQfpUC2aG$v3flS8MqLgho=o2izhvK7+eAoHW^r#zbp}p3fDX#BOgA# zigr^fVT7?h4>FIe^iZZsJP{|chswj5t|R6tX&ANvIC|;($2a9vOY7}SqWpVEV4=`dG^kji&PlA@0WkFG3FOyBage$yQL_)zs&eBkm2Ax`fl*bFGvVDl5Y%G8Y+Y(k$N`gUb z5Gdijt^<-0q`7U`u0l{ts%w)lyT>20anzN_^(qp@>7c74JCq6i0!jD`4gU59zd^*^ z8H|FHov0Wv1AR=#qGU9(Y6C}Jp|4_M-DBti*g3X=omdj7i{Stoj^at8DJVt2PuqH0!ruH?mxM+E}NZc{%CEm;>Q31iU`30ih~ONwMhbSR}n zh8A)CX|?lh2ytDE7bDo#;9=!x*NPBp;hnGiiS3ABPP3ClBnER3sVT*?Ro-C!TyDMY zLwJ)9nqta>%!_>-D7?}PX-qW=51u7>dJjY=HS@(J_425y9)|E>xvIXmj&_=H9J=?t zWBgFY%!i>z7544nWIyLopg#&dy2S&-PPq6IjH4h7g_h3-{7)`r@Puk4R zBH?;~r&Rb8WhUmUPsW$}a5o7TxOLs|F-ywroe~duy;HU-LFrYjG6LW|UTmYw6L(zH zD@hzRG!l>vj!lwwC`0L_v%JbZPlBf(K#smo|Bntdn5ZF5-*crUe3R7X| zHCGh Gi(43Llj2l1>CCMZuk$?HV5<44eRo_!#c7`PH7ApNoi6-U6K^8%0M4LKpA zYqTM=@;EFSWFPvRTPFlhqeZBPJcCKd?w}HzXhu*t(#*sEi%)U%ciN!~^r?qf0}UDl zNDV^!r!0)TVsl7 z*J2CjzfxqmGYl)f?EMFUd@1m!*C6tS@I35)XAzouWx5ArrUyk=}1kTv0Tg zM=2B+cZG!j&1+Q}2+2)j%DBl%E_I3+4CI*rwS7Vs!82u=O?)dNC?}edS4B5ieOm%! z(P-3kN!APtYow4ALza+S7*=YfkvQqa#a;7Gfq#Hx#KAx@U}JrlN^gR(qle10mtdrQ zpRu=~0|hmswEvviM+G1{+S^LXn=rVF za_1@BRkRP7TuD;nqZ$L{2o*NqP6}(SG>nEp-5K#bPNEQLI701!XKOTt$RZu74kmIX zI6Ps#rw7g=9&1hn%oHal$+84L36*jUr@mrJ_8o+swrpe2=}FWDZAY;L*4cN7D5QF$ z$WV1Z6Y;W%=tr`dYdpBwA7N^L$kNpG$5KLQfkzMm9YxOh*vY6(9juz;9$O*+x2v zl@&C?m}@~~>%p2Z6mcdLMFg{YX(M8jq3%U;kRztcIoX5Z{V3uI;`fuz>>5cf7Vi5Y zD15+KXzq(;+d*30`xKU91hda3Fa$H5)13b?8RoX4d#?|r7DfEKVU4Y2tJM96s+PoJ z6B`1pM#79JNH9bc zmMjosu+46r?M)1E0ZNj7ER+W^mr61b_MY1j13jSJ(h@O)F4{59Pnr{TaGGYsho)fj zl%TB@y~xRPxGs^d+A+HyAa2df6MHZc>hq=gGHfh#ag5PITH^K?alX97aVkdkP+3Gn zzeY`-cLjVWT_;{nToPf&N zr6=ZbxZs?Gl6W?>JA3%(P9#ihAjF=g02D%X(KUowpfcwXY4WdRwg&IbbkVl;E z7-9JP#c01S&^CijV~p^WZd&gcA>x8uKofB~=_x0`_ZRBzjTnU`BV~Rug62KFHZJ0P z@3FO&W>Sheki~@FsV`#0KPv%Mxhw^B>x*^X7Z+o_W+Y zT;fsT&+yZ`La-7r8Y?amO96@fBdS|FI3>tr;e<1-h|av`MFY%5aWF!@jEG4Jh{(PJ zP(h~D6e1>Tu>2a{P|c0d1SBj5C!6}@yJfD4tgIp8yl!1FUgf6{#6oP#FhdlaO8q_* zCDNz{)v^#eT9M^N?7Vms){>dqpGo$eT|OM2(ZVHRRgu; z?m%}=acgGwQK)=|DrePg$wk+xqFHqX4ic01sFQ?XT-;mAqln#|AfeH3K&cB$G#2y@ zLy$Rf<6~o80QR^)m1gM!2(K19uf`kWmMH@0?lZrHn*+de<16Isn$Qs5rvOW)qy+T= z*E>mF?Sq*Hej^%503_`}VS)#PXmSvP3`-}5x!XBdFxe^M4jP6XKQH%jNNadGmaCn` zoi$+PST}i+M{rPh;-X!&hzY#Q092wpb1q&5>?hPq6BL%vuU-!_yTn~o0zp68N?|Ho zk%;f%V||hOC4|H?uY>C@7(^D;BU^;3kz-VV*)1vnO8;6=44OzytDG2E5zaR^@D~pK zjw?C#nX79wgQ0niCAYYaw|d5Rtg_5|D!Hn9MU0Lt=A=`F6zqfq`1X7Ut}OwgP+{Og z>G+-g7^0*MfT@qMm8abggR|PAFV#Uc!Ns>sQxoprgD#PwhgObQkq)&e>vMXL8b)sAb~RB0vzm59$A|afLe=NF<=X)>#%L_4f{?Ln4zqv{9-#o(@T8w%-1jgkSeZaiJGi zNx#t3ZBiC`30R*mz*-CPTWjO5j6N8ngY$;#;=W9?m%wOPfH#+WG4NnW;%#H29b|dnjdQLCf%jSz z=oXzF#vgNZW^Kyt3Wp#%&=j(R_6@Qyk}WY7#^Sqp2krN5g;XCVV)*^u8 z?JV+_urIku^wjHo1>3o%-ER|2eXdhOV)X}W6QP3b> z0x?U&CEZ!cwOAJ9L1Mr6%i}zi?8V%$tFkQ0RQCM|W!>UV09!e`eoQ;O_pS(80Q&Ba z5c@iA81F}~^<`y$!{`=omXN}FF&v=@a4pfdWwpUbyr&mg>nX9esB|J%R5;wdpEc+z z0WRXj=I9*LIXEk)b9uNRiC$fUdsnlo*kl_IRRcSTssa^6{ka*@KRRwDu`J>K3uzW6 zC>aJ{tw@7CQ_ta_X=Mu7y&ehWtGazkUaGGX5&D zEx;NpgDfUmsf31j%11+LvXw+&EAGCm-OL(?M-SEj;Cyxj=-_YoKK>iM~0#$V*}{EUH)b!wju5Jp3v(K3OuKVEm;P1MFcq zE@o{4osHGS7FZaTzGGnb@|^*3dso#wy%pSg1IIrk8+s1M*3~CRgDi}W1{MP)Dtto? z=xCCL%r19UA8S-kNMUTBbh`x3%GVQW5{3(PQ{+O3*n%k5x$<$%5l}7R5yZO4ZFo!& zOtm2m?w_PAl2CMrN@+15$q7A81|$w+=_M}#)2D_Gc=)!!L8~eEh)R{u`nvl?M6jZ3 z6m7VG;N1&2m#5!25)7)*hpDsISmi?J$Za^)t8xiCN>>p#YewquG z;h@;4uR<dwDOE}7-7|}w2 za4E`#upFDFF9IW205)48Qbkk7C@D}8O~s`;?@MwU6T{d>fHEAkW6<_wr$y8jR>NN;bU2I*dF^D8)j#01f?b|gwn0xP727Pj&V}q1yk0i zfHn{67=>#|n9M2tR-_a+Vb(|Kw*ZuD9!+kIRY3|z*Kk)30~u-wei*P=%fMXw@SsLi zV_g%O_^w+H`xu&Eh`mP9t89C6VEsMV8-e7~4oISGF*n`n&S(fKMVLmT1G%8XyKTsu zS=(Z`_H%6!?1Qhdx`iL{u>o&6` z`v6w@-6e;{25n=MLQNJ+5JG$)A+$!{LWCH`aQ||O=QJCJuhJUVmsYoSNukhwB~VZ` zCb(*E4Z_`FN=*JHF)X)OTVv#G(~AIcv+k&RATfvSJ7y7XSy#u@h(zx~MuQR`eJK+F zIv5a|Vb~4fK!XZrn6_|tlJq^XB;+J+s^@H262VNzH@o=EEo~aZd}{YVO*sq!;N<~O zxr!<;Aer1$jUoclR23qj>yh{9W*SQXzTCtGQufv|izAeW2(z+^qdC=xgF8|3xi!*# zjDvU*4vJ<8Ud2bmh8uok9xo^ikELD;F>+@`%rk-OO$U&Zn35ZM&HX@}4u34b)&(k< z)#EBgK~st&Ma?b*_Sq$fWy?IDYrUiG&>YlK#u)WIO<-MkIKR#FDaHlA&xlf;0$F2H zCOE%$CX6Xl<6OjY#KAfsVD{mxF_d&-jJ4kPe2ic*>hXglwlws{T2_;R@yW{2H$8kc zqIE}!85U7~E~?ZW@qBxM$220U$lKXF&}sV-s8-f-M?!=}6BI$|2WxZ0YLmiL5Y8K8 zd$+O?uVW%-u@WQ(ltxRcI-$Oe5wlohm#~6IjMpwjOct8KdeTm2*BUB|OJHT6X^JAu zAxQ!gAW~Ghmc(lxht78uQ6!PkNslFFQ?C>|7(PQPOaOZr9KVr@Sx|;YyzG)VrF%nw znJO%sc|%UY-~?}egWw@6N!(Jfi#rs^ZBElMP`X7eM zFdOpdJr@kZCQRTn4rX(K?wZNK(HGYAYD($*c&(8k$?^w~vb~mKacu!jW)rx&z*%?n zZIijX@Y`G`m(hTp;y#zdoItz>K?>8Y2Kz_m4DUv8Wg2YZV_U@`A-ygE_e-2^GD=o; zPvatgtCTs@Qd5|GvZd4#I}!v23gFNo0wG&v+j{`ieGNt4nAoTCPvv&v3jx%iIuuC1 zK{J(S$k}t06K7PYg5d|s!1Mt?0_Gal_hDeWyom>AkVfP%JVDzcJ<@9cIvN~flu*G` zImD8X6ObdBfG8k=xY$VnKx2*816xk+NQhv8!iJ<`(E(t=0RSsV&II}*Lv%RnB{6mx zfP~FCR>CsuV08j?xHL&9urqHs6fCQ*;;4WTYAfzd?PhcuvmfF7G1Ve5;G zx6DXdHb3xm!LSc{F>Bs6N8)vxgp+$MnAI^hY8+Kw8;ax#CnvE46P$4c^6n7=)L8^} z!pS$X%CwxykiR@@Yd{=11cENh)$r?`p+(L-PEQS>TZAE-*8zoivZfl(zQPM(IQM2^ z_`HAx@-jC2D(XQ#!yy;UvxO!#ey-TavNcyK!nrA)d=W@C9cQ3eM2tw;)Nv6o@eQ;u zpt|QXf{a}+{^&5o5t(VxM8KKBB@$$_x)wj|=tT2H_X=3Z`4?B;NG`B?;f}Bs>8B?# zqg(4p^%}p)ftB?&l61DsU6I|c2cX=>32A8X9PO}pkO|Ro!cB?~g`NgT5Vmy_43v|$ zJrCnt%t$k!5J`}4;IKb71%PpHNE*YoD&exN7Fv~SYoG)WC7zNOqp46*4WHrs9+!GT zN2Y@1kwLwo#DGZelv6=_aCxtZ!JRb_yaH&K ztpu2@)p-(7e4iXy2$(frL#CD? z#ysmz_rve zc!OAMq>%&uV(_sL$3L75BbCF`g`t9X4F;v!xiKl;uNO!{qDa7k@3REQ*Qx|QB(m2! zk>uiRpv7!R9{7&o&0)I0-o}%)U>>lXVYR0K#RUm|G`tB|xe^9}C0UI*CI+5WtT-=$ zQE-z;oxZx2qYJ!KLk~9Q??EFwuKEGv@)mgGP{gSQH$hZ`;t3y$Q+_XA7b=!%wfUWB zp52vh4gkDj=!5|V>!S@rzL{Wkn&WRsM;~GIj#N4z%NZLSKq1Qjl^gyYr?U;5UWSg6 zZNQMCR>Endf3fNj(L>UP3zON?v*Asxp+b{>IoEO6EErgw!G4QtptnUB7(^ML+i#K* zm~+WMT(HOcHL=j(?na3Ata|U7>$G0B0!zhwI1rvkgin@BSD>6Vh{QT(0pQTmrV#F{ z3o$DA>bJElXS$_AL7dUzoHq#_dmF~%kQY;R0Ef(WL03pt0Ab@JpT1&#N{M6;uvpJ{ zktfuIR*UetXIyKZAaxDx#fi2N7jjKPag)ZxOT}UdxImR};+`NP>7^j1(}>be=z;k? z>`)V~>JdsmVI8qp*<^pOH(y7*xLQU~NHi2I*SMx%o!5m+>m%+I$rtH0ZU9@(dN!>X zMBB0=WIG%g)}WOPLK7FvRG{jH+|k8CPfEOs#ZH8Jc~ zEufc(!R-N81u~b{5R~Y0pjJ(FKd><67u&oUMq6zF7X66EU>M-nMFUB$P`Mez1tLN{ zoQH3-RAg4 zwY0E55@Vn^`dSzg9GF=bmn6trM803rFydZVFd!i~YCXrIGgEg#;)a@G?U zri4$dx>pae8-3VU)Wa2PzRLHMim}u|8OUDZ$`m2YwFqDX69JZw?pvn4POm~?7uRaK z7PBN$k~Kg`CB}#>l^hp|G0bC@;30X2$LIzmma*hN;lW!}IchwMUPDWK^Ee0MU0Uci z9$D4;7T|~49KH3>D6|26xLXeo!QE*%?g4RmHF=XY*=~sAZrE!U5a019F(AaraO)7j z@GN-~sN9B()#Amc7!!X{Vaoh@*nvZbhRbVXkVC^g0xz*(RA9M+U>EB-MG>|vNUT_e z;Y+C(8P7qJs2GW(iMTgTFfgy{OL%BQ4KuvDR0dxh@tv9;((myqo~2T|Xx~JU%A~N@ z{aGp0IcO06;_`|jWC978?g|9M%Q5hBFe2E0ls!f)?nLE{Wf4I#)XlBz+{0#Bssfb< zFFzd;qf}Vk=!+_t3?LQoHw}3MW%yX}L7xm#!C2`izF{nG8|pUf6$jD6I6R*$Z_(=6G{vt$BKvxE!QP4=MAbiu(0aL~(pl>VP?{jCSo@9|q(RsF)qlaoL~GJT10 z(@c~|Mc5?uK{-!;hkc671`-8XUc{7}J)l4B@A*bdxBxlo@ThR&UgVM6h9D0e=|id$ za34~&Tm48LJnh4olXV}KY(v>(tda4`h=BOyUGc$xaLNL*g7gKXf(V42SBU1RGF=a_ z+6F8=ZUX?Hmk^HgG@vL^1Youug0>t4SWFG@4!3$?UG1o!Oh8SZg9nA!FaiovQV2t0 zTdJQ6ps4o)q)TD|4^kQE4p!x1`tk`ZiUQkR5&@>)mefX+&RjoI5ZYp1pd(^}x8wn& z;|}PK*YAKQQ~bt>3>u*$fXNk#_gzc7P>n9(tC%mBm*MNvg={9 zl##`j%`?b}dIeTJc=-UeDZ|0iPu((JNdE^c4v*lPd8{HJ4!^d9B%~@BKjBExk)=yM zR^bt={Bnf{n6lLBRD&JDpa)cwxi3XK8l&J5T!ba7 zMAjMG zctHXoj)xjOnL+_X%OlLx<_ln=)j$F%qP4bJG=*3gtJ)zxe8-_9?q4`C5ET$nvJH{C zw;djV-R+Qw$k~QOrl^iwA=C-?bO*H$4+o$EqD{pNSCC^XPN7t(qZe?kSXI6sfC6}o z4>)lP!jnnWGViS!(6>OM7i)fs!k!~t1w}8zjR?O?eHPyvQSApVOuz>vlGRevLBgXR zN8Vo>Xh8Fgfw3^W{Ou+42WM1u@EG5r-nI3>ub zXYDgVMq4fsFm~&0c;=+U9>DCzUodv=suh7EA^=X!?Ja3Q#0gD;^=g$c=~*#Ce4ti^ z&@c_KchHw|ooolnVBGy3_Eef;&FiZalq8v4#~PM1v>pXQNQ22{eIu7o>XX-7uLi7F#X_AGE z?qxhdeY_n3ONzPZ%l$rLtm1g`vLCm|1;PVMg5qnEPhAS@N#SZZIULB%G9VnY&`QsOcL>C5rD4!;C)174=@#2*50(gMC(Ap|6HOP)+ z{^RBN)GG~Fo&x8X}(v{JrN^5A^EF6!BH6}5jDXW+m^4GfD+!78_6UPqa z9og|zPsbnp_4X~~wqrKZ`?R#l)S6xw`$#x_0otiz8I$GPj$t5!D9@5KSXn~kraJ<3 zwH}+qp1?0mQ2k=@siaX+mP)W}bOM@a7q!Jn9HcqWGH<69AJXv7u=plv$yO6kC?xPi zz7vFrrAw|)@NPKa#_<^AsXjZ`#lOO&z7YVi=KnkA3Ecj0yfXI zdlZG~?!BII%Y)+7K?pR#qa2oVsIw31(ZDCFc$0?CDhsN+4{Gfh_yxw*7Hn-B*#^rJ z&g%iyp5oI0pkj}+nV|;g!O|n6?SR#*1y7k4sTBo3lT5k06)}v=}sIJ z>IJ@l5H{o?R!UT)JsKQ-b6NUVN?`1+$c^wn^FX;35iDpdzD5agnltni#Vn?q)Anl6_P8`_u{%L ziCGF}4M%r-UO9-JX~kFCb|fO8A&CH_UXW}8S3=Rc_YCZm3nizJbj}2vAp^jgi4@2M z0M`Ju;Z(ZbF^u}%43fW6GUg+?x(c?d3Q+BK+y97Su;Z3=H)N10hB5Du(T?ZD!2$*Q zgKb8yyi@=eQ{ikXrz@C5a?njR6p9Du(m>cBbzE0+Nb}CYhelt+X|*0CPX?I)3{Y>x zl{LoFXinTy$8{&k7mOB$>l7cU zifBPjR5p~4NPsnmy|IJEkO!3WT{*Xj2Wo-y0S=dTbWJ%yi4OpC=!#&7CB++0kdwIf zStbp01E(Qo#qmrNB%~zKe`740%O@eE;wZG-%p!L~t8vER9ueUxlAIlAAa?`_IHg-( zi)?8YRXw3?;^9q_0DFQmjZQz>85nJx80gCW0{c7#upv4IHIhNBH5$hct6-0)PaPv- zYF$d~yxzvdRoOIRAEuw)VF0@rl;Jw^@fEK%Ohl((EyR8navd5bbyF`N2~zT*Ufob^ zdLN3;#hAE>dr;q}u`FxweKxqYw8ZxPsBQY1XkXT?Fd&tx-a4mP+`{m z+M@<4xIYa5j-Zfd`_Bd@7+8K|bS67vO-fNhL(;?k4N?p->1zdPibRl;X6p#H-_hM~ zG2J{rTI=M>TIx?5t=e*?j++I1NsfCW?;8YP4Edn%DF(#-f}Y&|um!_pCOmi{{Sg3; zLjVf+R%PRv3!*{x@O4AvpmsH9S)%dXlXtn4A zYY}7@6!Z)%)9opV61%mJ>+r5A1E9~qb#Mkup$9M*c+Hq$!pdoIpQr+LHnmSNyM@q| z7UE2^ppdJD*-s{L8HSzNi}AOMSc1q^#2XU(jp!< zU-}D^&CehfViaj(AVOE6@V0^YL=7?!r+Ej^vBA9g5ku2o#WaC(w+kded+fZ`K%!`< z9f-o>fRej7M((8>>pAfswlD{i^k*PHUzdR07!xa80-51TSc<#wqE3OfBDu0IfS>s5 z%NP_33vISwwYX-)na@%EBhaJ*~3VxhE zuk6f*V|%iDAwHDH)tL%g`hN!`x)xW=Q1=YX8ZOh~IgEAmtDnzLOPPz!q z^|tjOy{6HV9qOFwot2@nLir*Bg^S;1q0t>+#DTH)qY@4n(l}v;od@^ z2vI~hpdSmhRaIVUYJ&ynhj?hoOHf!yXA&qf*a5i~x*a$(q>`=^oBPx{KN1?s>ydjM zw5`}P#Mt?4T|OU|pc0qv-aD@BEG*n~#NDhf67oftmtE?Ybd&Oe*xM^)Ln#5Rb{~#I zO239AJC~$B6t^!)3c21rfw9i(S=s~_ePe(WCAn-ElN7x7Jpl*5SD=^mCrMN?hsek) z@Dsd@f|)vEPg6`6>rj#sxH%d>l2j0v`cRNM<@)F}6{WR)Bro#7k+LxGc0MV&eKv_a z3H9~xm`HJC9C{sXl2K1YB?vK5#JA40dUrtB1orHRlB*;rY$XLH^-Zw8q6td+H&!!= z*>s;pdo3gv9&bsK2g<}4O4c+Iay7iMNaUqfl4lloScNX`JHea86sUC0(zJsVm>zdX zvZ^0xihzr+j75SQx?>C<97z)P^pg;N5{WGatiBMQ%_o-1>S(tZh+%T5PrOBLAl~l> z2O|3Suow=1bfACt+7s2kZ%rcOHZ5t-u)QjdN+p|PC+65Bi#i%7h@s<@#H;ghf)H{H zozfqXz`lDD6bycWn9SQIH4XGw23&brZuHiT9F`fe7l^1YOAY-isOII000$_E;KD`4 zPsF6RRarLZfy38jVnX}$hNXe4A-~FD&?=qWVp4JXwWuzghhr35V==UHSn#YV(G={! z)EskAv1ZA5g++|81(TP^`R36UXld6%FcAy%TVI+Y**&G`cD4q`vsk1Fsu7|4>sUq# zL+>Cq-CmsSkW-}D?6j0}7oWG4HsC6Njt^EttMaQ7tmuQy0SQwXi{t$K{tY4C>dw7! zjYg|t1DLX?E%EJ6#}9a_wv``I!*v|AW?*rsiA>|v#zeKsz#DYaQ6k!fxFytC9xpa9!oFTm~M*(Vhde95v ziv%@0KTFOlfk4(;GM{GeTDZomyhoH)Z>LhNc6 zIgz004klq&NC7$BD@8$^Ae~7#Ay9!6$`n{FQtCJ>7q(_Kd?TI}5~>*%A!b|L{D7g8 z3u@qdCgG+JV6!g>S&bzm?hnQEmMKB&y#wld=@lpvVT0+l3WAgK*Ahbc4ZfUh6ZRjz zhr#6q<1-DH5nL{VKSFep5aMvpoe9)BnHv{FW*zP@jEeHX;@K1AX|(9HfMfUdtT*p;Snd4%SUzjHV;5$5gc%e(C^u{I9rY%(VZP1`@`b1ngJmS}u_RkJ4SS*l z@OF9n{Ual_1qhs5ZBR+&;3@7eofEhkBozUfUYvsjQl|+CHkldYZe?P4BrL?_!!Trc ze7?5Q3P1;}9CD2?1=&DIR`ohFhf;1K1Y2%3LO80!d@RIVxY(=wYsu~MZJ&a-E5PnV zLk~Ah9?d5lT{B!t4mRek>UMRkPlQq5Bt~RM-Oz24LTyC8jU2B{5(?v_Nx$#q+8xXo z_S3#zGTjES(#HOCi@of^3h*4mm*<&=hvB|d=Q^h&Aoq(=v(38+Bbt;!d!BV5(k+XZT`gmsvc4<#Tv8}vCZ=b& zqfikX2YyC#85uYPK8(E^Q4(EKkyPV7Q1<~Q@w7l0P|nFo+Cgl>S}dI`P8Qa>U|ybc z(M3?J(0LFauE)n@oIjc`ss@uHWZ?$apxeCSYg9zY7svRV@?Jh|0Fh%zH^M5TPkp(D z)ty4ar{J#;nVod*(ajG-{4%ZjD}zb3IBFbPe3V#2QQ%y3D}}kjVJN~ zij582B4Dj+1|y(q2cyhzJ#6rgu}Yw82a%~Cjio!awq!%fo87`2XIjIs<|@Ncz`-(6 za`ogIWTeAV!9mAfjN#@5_`jKT9-_$ma8Sp%%c z+|A>&_nLBX17|ziorAg~#4TIl{8ijTCpdg`DJEdUIL`2#M-fQ`zo7$#VS9tuJLpGr zg}nV`A<}OF0M`y-cr9hixD}5#46gILYS^Wr@Z-?35xdlnV879uA;|4eD9Tl8y+{s? zGWVE}S=oY!i7l9f^KP6^@|nS7*yVT!841&|#4gqmhm$7e3{J3iH|S@ySkaIFn)of6 z8~;IIV?jK(z|^?P(LQ&I`yVkm1*P|DpW)q@9uYb-v(DuzgL0FOv$tQzewZJN}eGD49t=m-8#1p+hNt~O}%!2{Bxnv ztz-0XpKAp-ykb^_NTHc2xbWZxs(@r!W{Rhv9K!zEHz3ZTvmSBfN1S^!@2alr)?LLl z+yQq+p6f0{_)&MOdmWxN*80D1?EzPJt8NYHGdwe3i7U8qlmZ_@q*--&JhAme z%0*ziNHqtjh4Skt4D6W`xd|X{P*?0nw`!nR#8FHRUNeREw9F@66lN+sDt8Z{s3yR4lMCX z?WAbZ&jCEo;m3G(wRWo3oN3Mhi;i7B;Lb|-9{{|9a$113`#G4z@r{$fafUFyDWt)- z9dt$f1%#W`7NDo&*KbLBGOr0#PH_PQ7sJU0XHp> z+h4&zS7eAivsH57z`FhU3&rlt3t5tNww>GU8TuGl`ysIQqreR^YPV}#1`J;xmwX$} z?Ja|t?gNXTbMqjhJfK-OORgapaDEQ8$K?y`Fs;tGf@xrdN`(z*OBh`AwLtAqNi z;XmucJY?qUh}9)Qrx|$`CmTszYwYfsK@O78)6Bnj0;R$29;K2S`ibhUO*z~G>cNLq#lHfP5*+F+4smO@5SIN|rO>vdrC@2k*y2yygK-~Ga zd^0Z`M=|WknhYcPTznxHuC$5zTJo^EdjwTrHw>@T$ocOfy=7>*u5Mayojar{E)pC; zT`0~9#Qvs8asbr+Qv6-QizuM@S=K~(_{j4G@{RT6bKCh=*1^4W^V%#+!*yP8F0)@b z#s{Q{tbwaO01THl(s>K@^7ZWJ3Y(Xud?HK48f~d>qq~T(+kOBn{vgVCy9arR+fzgh zpi4$g;>>ebDR#lcx+Lb1=OT6Vw^A0=tLB+LhYUCCA%?|~H8W0k69+<*xm2-YgH2bS z)4S}%anc3Q-S0cm_cDo2OXOn19Y-4&b~A~Q-R9XeM^tHGNn*&rF<$5Y*cX{*pFyE) z1`CaR+Y^oUC@IvBq;FO+slu=(M#5z0>3+rY5tc`C;asVs`s96lBb#tDpuv$>ev*zJ z8ua>Kc}Oae((kZF=mh4=^u=l4#TUmB3g|#uH z3yxY7|5Z$29ZpMk56i8M=K}6Wnw>|vn{U<`%jaQ?Jx6=648`eYO4lp4gEY;2-{>Iv z#Xmz0v4SKkJ<%Yt0@Fht(0-;KmSSp;-|A7Mj82=T?zfRgO%j& z?U`5`N6!DuIH*Q9gQPdr|KyEgp9wwYlb4?tYQLavv;O3z%wx2^d3C2d|IP_?f}ehz zP*8+FgWd6Dr9XwvSbnlHo}sSTP30d&$3)*yeX44}{+!={3h6flr6$&f;k_F1$;{|Z`zTclfDbI}>Imt6gM8nH`3Z(PO;W?ivf?*BP{SG$l z&rKB_Ub@v?hi7E&?#8i+_ zj(hAuJsd^yIT@-7O5`GVULfrAw3@{=f;QYu9PF16{rh`TNwic}!iJsl|e^4?tTcE1ji zJ9-NDVv8SI;;X_n_&$_!{u4zspSm%2%QHC(HZQk-CPXEv*1~U2{eGmkR{gmLhuKv& zfA=#qm(Krs6kEBwCU;R&%qbbu)6ntuuTz^(BN|-D$)h03aaVznluqq()LZ#C`)*kk zVF=DM7+Y0}l4=hoFgJUoa~bhn+$@vj&0(gsvm#W-r#O^tZ!Kbo^BtQaXg{caSyN_}ATtK}n zi|_E#tL7uyi|_IByjnZCeCuRTc~{7GyKlJLLx!BH9AAR6+@1qM@NAJTUqYmwyAGhi}~~QJ1n_?IBx5?*sOr`2vgtA0w6B&)Qq`xzZ{X74EO(tz3mBA84MW(7dH}Y8)Kuipz3=~z`e-57`=^NhbcqH#qDG%8h({? zR}mUYcM?O^+e>+EZd#X+mqxTAW)<1w8X%4*nJ?2c z`eMoWRor!~trb=_?f0|2gRC98r=(QVCIiOOJYJAg5$7+!o_^m!mh|GbqKZkaZ zBoz}=_P>eUAshaD(I!7FlU~EE-OtIR1m8p-HK63x^)eH(VJz7-4LLM2Jc6Gpy;PbD4vLgFu1dC!7RF+p`3_0E{^0MC7r~G`gDvaFsWHor|jdI{dnap?W zDy}-=PM}*>@&6_0KCTa(Ww2V^;kha~)Xk{*?c!nf9q5!%z@va(DP43JA?0MZAvA*F zAP><+60QtaRc-#Uo9VmeS1(tHYbWQd=T&Esz75WIFlgroR~|p7GZ7WNcbcwo?jgE7 z97pa`kizK%@d`L-aFV55;uVNxjYy1V(e4A{2Js3pu14>n2hdX#v8?3h(exT)qnJ1Y zJXZv!c87aY(K`QXX;W`$7tX`Fu^%pwXMgW|dQ-Y>N6>?Zox5qU?FWXo-M#p!q`V7s z@M3qDyVJQtPbIzf@?p>mrs`9w%Q!~NZ2{Nc$yF2I_L6aO+iOBQ6;VLwl;^ruGWO^W zQ>05Zrm9ho?9yG5S{aG)HS2Q-apyd7C|B`cXI}`ScHBv*fPUcZ|Yo^;YC7 zqKtV^I{#`JN09yjv_ajhdeh(8oBrCgtlqeJwmW&(A;3NFO7ix{N#5;R_8oAa(va_^ zK@57tQX{mdH}##EiI6UA1Pt2Uo8}OD!uOGct#1B}X}u+W`vRz_;2uP-lQP;13~zrB z)HTb{&S`MJafFKk9dWmThaW@Ak{j8dLbqT<=8=x`u8995J4r7wZ3+#f-Q8Of-!`(l zH;3S!_f+VdV?RlnyIh~FJ^8oW!Fr85w$trkT}u+IlII}9 zW~oTVTd*6Mo{@Lmj8gbcU&hTc0@~7>(RR*vmVPrJLr+1b*fVpxIKfaZs@qv#(=ao z=kCYIkTWfSXPv_AddR&TwIK&Nj9GTOJL2xZ`goTsJ2%PIKkd{0Hf`=QMh`po3wr7_ zDU-fO>@nTLa7U^=&2dnNL5lUdN9`RuY8tpdB8}3ul4UUL_j;aU*{d#_M?7htDcHa4 z;aJP4b6|hQI#H}AHB>;MQK3xfY8}0=@8gQ8CA-2fYh~(nrF+zW>?_h-2uWsnA}Ehdg|3Q)gfD z&i;CrS$jiH(nCmRkg-Z7baA*Ta`ZSWA!uuCBc}aqvlNqey5S9QmvNfo7h8M z9xXXi^6i{^r}0z1L+-)RP3Efve>v?nn$ta|kC z;j2}CdZsI+^g}vg1^8+;O{ktx_y6L1^LlJ)NL+M(QXh5Jv6nfMOufo*cyIWHig{_r z;_{?c9N!OQK>ko3Q*pv`d142!a>QvRxxlh-Yk22D#Ar`*fH^)YW>JApk%>z&Za|kF zCy5hM#ut}tzC+*V+o{V=e~qxjod4m$Q%N_<8b%#IE9Qs)wZL+~36mbD@#Bl=GkgLS zVfC5gwLRpeRnxOh{dNUyrtiR;S$eXT+2?(|xSYq})7 zR{ByWX>3X!{Y){5O#ihI@yIf@qP;Q0oC{uy#h~9#ndY))>>0z<<+9J_aRgt?vprb2 zBF+^kN~C5Pj$n)@BV>oNv)Szw75JB9$@3PBPM_yea!;NiB(eFRs`XxP_|n`#;Zn z`hB}+B*4b^Rw@gl^PY3w^YNVLJYVNI=RF;DY38Gx(_+*mN{aeYUjQr&%K>dWxw?pQ zzUdV8gvCR&dIvqHmsVGT&lXn;P5|#gW-$KfE%#@nQCU0>#LvU=b6@+zykP6#an z+~C)O`U{ZpeYUh_VaicG7w-2^PxBFkd*F4Kd7>%JkPLC>ZBb#`FYZ!8IF||KQqx_uD-rnzHrf$Y%J>rkNQu=y3Oo~wp#ZBs+HN1u-U=$~dJ znd@(Z!xD2anC2RtXi=pzSF5C`Pooxv?}*<-LwXY^RAnP8`!E7Xyxj7}$_De?%66%C z)MXrZT`L^oM!}VW;u@7sIHRTQVZGCQ2SL~JHuq`g>YK&Kt;V~?B@;%uk~Kj>Yhm6x z-slS-y>^(nd(EJ8vrbY%Qb72Nc761=_E?=U6XSv~oG?qZ*6|r+#%FjVE%rI&3-d7W z8T+<7{h}^nqw_(XS zLvxmVigqWsOun3phVQa*c!_=Jik7#0pd(I{EW`zJO>5b-0*h|Ee2=Z=z6y<|&z2-~ znn=>G!9(q|8ZDlWj-rKgDK8odXHUdG8od@-GHHn$y5#8mY9qFl0SG`n&cR+8mPUeNve>SG- zfBn05BrzL2NLodNqlJ!2sSZtgFe-yLLHwo5>QSY|1z72Mp+Ul%zal9XBIlRv_Hv7mPaCzwE#}(Xo@9`|;dGIek`%3cJ45 z!}BHj_76KpAR;MWn2HZ7ldti$3)y_r^;PyfqdQ!91R_h$jncF-mr2*Eye=_5v3=x8z$kTfyL7v6Fw$dUp{ zOTv0U+%0Id24Ts)QCq0)^bLAT(=DmvU;56!W+~ZW(hI_YG~D)EavAd z)2rVR5aG*37t1b&E(cs9K3hwu+g4$!lt2`P`l%{kjQZ|{c*DJ+;!gp&n}0`5C~HFQ zpq_>+?s1cwiT$##)b4fkW z7KlfjSm1FcG?;vWaOT#CZlBLcQTenfVB)y1u<}X{p5J@k;6X_UOywZeK3@JRxSt2MMKheUZpD-F7y>tff znPPdjL_~g=nQzM^tl~2UTFhS zU-~G{T#N-TmuMVObZtAF!F8ke*CXfK-+S-rQqlGEkEErH?YUoWEG;GR&?V-4m}haK zd$ax0jl>lbi@No?SV-c>1$}}=d0&E=m#$@t-W_uVYT#het$0*4rQW3oBn9SgIlB42 zRJkid5iOR3!;RVSt(-iSK>)i?Ir{om_(JqJ0Zj)7g&=X0b$+8zl1hs&QL}TND?wil zCp)%MPQk~$%ODR6l&J5qgo>{Z_!lS21e81rql+=$yz0QQBt;lXXqVPY>7_$boW zWuf@BbqOb_%-3_9L!UlYjX$)Pj7oFizHFVNlDfqPSR7PN=u0%5eD5x0tVNv0A{@!| z6cpl_(4HIyvWeWepnhHc1irE*LiH~~N2;zuZmtEgmGPr(f<$l!g_B-8&GqYwB!uK} zzlm%D`8;)uOhXAopw(b2VPvZRi|9`?7w!~D>y51d<1RSYNUqI-d&JMe1ZPG9LO96i zSQjwDoo1!o(dx#F&yo**kD=ueFgw>7J|8r4dnJobsNjHW*dWIPMT@?D@PP}`X!f}i z2Zs-F0xdZgq!HZwXywNFP&}9SqTwrHIQrZd7=iRjpw(8m0vy5S5RAbjimtySl@i9Z zDAeiP)IP@5&e``fdhx4Tmo*{@u2~T|gymz~`#+YIqTci!wM$2lQdmt$Cd!c_>m)$w zk}u|OPVBUDu1*5A<|HyPTEBxn(hg1WxOTl1YMmo9x1GlPG)1~pbe+SpvME2>r9pK6 zd?n<#ZI?fCXMR-qlexCNRZ&~Agot*@gmx*SPy)b>^?*CkrG$cveLp4Rdwywma*&GA zLhU}@#%#z^5_WLsTrSs-q zB6{@m^yT~_8RC*>E8bgtaP+@*Y) zVnh#;S(;7Jyi-uLQ0Hv%!NAui>ao3-9l$058$FW1 z*V%i#i{NIi#3D2_pePc-D$L&RRQgI!4B zTBQ;%m>uF`$>mOxxw}n4WT60_3{oWuhv2Ts^Ih(@>4Zt$>&(To1m^^>_xxFK*t;yBmH5{J4BB#kpu{qD!> zqO}>>3(_BR{qTvmL`ZA}LkQERo3ybsg4z(k!9x(wg;{&yT_R zK-U0;mgL?1fM*W0&U+e_fzlI1`Lae(2vNz*I?CIT(h5QJcxz9pEjpinObJyazI*Xc zaJhc;smVaEt!DsSjf+6|Oqt&E)u0QJ?*XNpchfYIFuT|!6AyG<>LMh7hakKP<>V&e}@RZ~FuqE>GNl56Nz9i?dqOUs9`DiZe;9DRp# zw4|r#Bca#JAuHGqqD$@Bp%Si@Mv!GE7iZwcWVs*p{9(+YQJ+4wlf#-%?S{6SYDrEi z>WFLFyYbezeKv;$VnjGpQHEU zT1iADUUVDZbs4$c7=2^y)!op$ghnlX_>0k_F%4QF5H zm&A2)oqb-c{(}1|x=va_vmuvHLeGhFP`9$rS0Y{($4A%Y=1ZK+(dLAugSK%yBg~&$ z2BM5s-i767Pu=oy_l(+68(`-!F)BN9_dUufucT*PFk4w zjrzn&nDWa9osW|ZxPZavrrW?rQu1=;fQUQjHSdWUh;EfMX`j0wkV84OEnd+jBu*c0 z5xEN@8V*#G&JAKXg14Pw`MnxO8LYwRT7Ayqv+b=X63Ar7HIhP_G1-xA?-txkzB|9n z^xbnW5V{ji;}iGF@h5stC{j>J{>rH>2cX>Z@-2k*i*HZ3TOZkZ*W5PmH|lk0KXN4oWyj(y1N3um!M(@#rL*tT0I^ zeTtOiG-U|)s!JLRrc_zBE?RS&<#DEq{{t6mF60OgGCpy;3pUBSfK|~>t3wd;fZt)5 zBUSIZat|)MK0@1n{$=J(G@#kL5}mpO(fwQ+XPWZe*zp$Br^Y*1&ifcNLgzn~iH6g- z5oaoQ#Kwy(Vv8riTzKntjkr`jxttA{c5VvzjJWD2(27H+9G^$0Z2I7wuk03wOHxUP zMC8_XnT-7EOU@@piv>~p*rG3PrM%CtbiDKYeB({{z7^v3-lGN5HGTv~ROctI5*ez| zm~4Ff^T4C|a|@z<6_%LKjv2Sw6W^&gy**ES@Ni7$nrU(02(V~XvByTqyzOYGKe-P4 zV&H@VBsYW)Va(-2kT;Gk*+miClsZ2p59todNj^(6Xtvd&>e_bTjX_6_0-bCS!R37H z62;qyu9colmymrKN-~>Ed`+bpHm~}IG*R5BGF^5 zGBLq?+FKC5&4Uxo+1gQ(Fp!R&vHZcKx=q%%xyP!;) z)S7My9*x=i^mBMJ23@?Qm46~iqrR=wlZnL9_^UNZ+nYv{j41!#-?W-r{x({kv=zjx z41AfRB5~h;j)pJS@@@1GEfB{2%&vY8#!JuFo0UGchcPDOQcoJ81g9^Dg$EfxL6`=- z`F?b$sj|XaIJhz&xw%M!J*%@qOWIl5N;2-V3ScCN2%f$$rJ=#!1{56;02J=s((rvn z+uH9(8@|`P-0($oiN*-fUa5%_8m&Y!k!b&^3Uj6v^ zeAVI*wyf!|YcC^-E7k}tM++p{QfUtCr_=Zan!imJ>Szr&w=Z(}%Eos-%=TV;kF}&( zmUWg~L=aYWE_%hZ@?qQc3VnAnBK`OXhaEWhC)+{LY809~`!xT$xq_~(1YfCznr`oW zXpQ@WNN%NT$RVZoE_U3p^k?p zn_7W~+@2KP6WVhnC~4AeS4V&LNwpOCB1ro%E9v#C+s{q8$`_J}d2>Sn4Rsy>Sb;zsCXX5Rb5Z(zrCI4q`|Ly91lY0uj$!}WeR}_Uo42gxe zMc2_|n3wC6cdZN-nOly7Abpx1lO_5H=!hL%3u9a%pLUlSA6;gk>KcgUCpY@(;P7$iIZXhr0LBzvQr_estu1ARV`H2Y;2`xb|?l zk=|4Z2Wv&U?z8c;1Bu^T$CpIAk~?$xD%z?&vh*bu;#*OgjLksD?gNvQpWAoT6W&I* zf4r4(Vw!6e7#(k4-)hcuOx%w?s&_2`(#D`nO6RmN{<-kECcE5-BCZEX{2f}QBVP~Q z!}z61!*Q*&j?t>zKT1msXDv0-?F5f)khk-{y^Y?Wbi9B*cUngW9+3Y-_JzJ_cF91= zC6e`Fgj$V>KSa~+X;&*+TEw}0c848$Z5sButGHvAu_ zF|P%*AdJYz6At4_@5#fQ))jGyg>(Ip(e~YpE&0tW`6xrXK}viCDZczRgMR*YymzpS zm%SZ=v~3f5rX)x8q`{q2w9T6MuWyOx4~g`JcDhc}n;*+oJMt}wzLVvvX0z2ZnOr-a z?4`8MUpVIIlH%iN45#*B_a&`DLpSe%7lM>^e_E?AAmyza(#Id-42?$8I~ta^L#@wO zGx}`u*7q`9yE;eAL$3?vuk`kVtsC|1iSwex`z)q~y5M!+W;B$}Rr~y6Wvh$7{ji{; zPsj{weHRDwJ6eO1a;LYx#1k8)f3YhecD0jil?9}Sp`iS4YDKo24fAbeMoZk4uE9Eb zV{?P=Y17lC!MD3HqpxgbI@(34yLS`v3pgI$-@d#6PFm0`yD`J_% ztaEe9O+v@5AP!1BIy7R_<+%1zj(d@e8;;2hT~|_2nhBqUfZ2o`r4mIr>TRxy6Vdv1 zy0Fl`kO)FIY$wS;(l}i0xMI}!6Sdn^ihnFjx2n4NRgy1!h0|nf76atV?c&3+E_ZCJ z=m{#&g@`cj2SGJvF~dH}Cv2U;jjA&k;Dhbj_KjwVC4Da=NGP$V_2XX&`u43v9sj$F zvNB@4x0SIQ^-Ii%8((5|Em-zqL`7fx?b@8*r)Nhlm+S!lT238{uOy10?-2&YN6~c; zVBqcq5298ZO9DXqMi*6WofY zf=UQ#&Q*=RB^tM{b0iu)FR0DiY}AP4g;EEQ3D% zZoZa8gW_Uwt}8#3ZI7-w(gjD+;;)09-TbfnhIMnWeilAjz5^UN=Cu`@zDj>5t!XQb zuaIxNe5o%R<$DX!+RK;I_flG*h3}?T((Vz=lxT^#Tu1UGzYiNF2%_lv55IUQ!!-ud z8|@boWfto|-<(`7;Bn*MWgAC>xc2ICxFfn+^zYxiOX5hw9;zM zF_{IvsPJQ-%=|)a`?cj=>+p!yy%*ujcPcbzncN9(lidJ3CkWTEv=gN!@*fJ|i)-yX zNJ|{GjqVX*qT29%lJY6XEtlzeGjFiAEVLGjwrcZPx<0c?$Eg! zN_K##EYVRKlk-tRxlrJjf7>2>c_0`hTiv8}J$y(@k!#w&!wmg{g+0G*pVDF4_MfLe zyH`XDM7J~~p+ynNSN!zL_tW7}e*ytNA=IjzgnSW*h9y&IB}}R5lfaT#3FppMB7%3! z`)=-3$(N?-6%sUA8i20^HGNvkyCEb7&=55Y<@w&H%4pZ(5&l8MG2#I~WZMt%=uf1h}LyGyw>TwzqeXtK;x~#@uJQ0xczy($2ri|}@BVwvQ)(Z_S zpusI(HRBeAct(?^eZn0yRE8upG-(Gt{m6_O)OK;0NZF-w4*EpON^3`}TvB0zeF-WH z+8u#GzRA9oOi<6;2qmG^N08OxL8U_}w+31{XhlpSy8wS^Euc)6 zy^~>BMF=Od32AX*nLj^P;Do?|$+fMM7kFx`jUv(IK@x~``4z=b%ndc2c@P@?r{lL8 z+QfOjOQ*p}lnb7$ZgKzYJbv_$+OlRo&hoVX**>0|TdFLX%nqYa(L66Z#2_Wo`-6OX%e6^Y8M z`B1p8zaO}@ypxaQGGnmCw1`^w73v3d#I`c~HAc9b9g0ZAB-&T!HK7Y;-%SRHGIsq7wh0*vA{%igHeGQO|Z5S#%H``RHx7 z_Luag7Sf9FN_PcE)xS&>i6ouWl+g7Ejil9>h$roqPS`JTPKgCS380WRcU>6`^G%r6 zC0e-)eo0-EHg?=ph}~+_c&Cj|gn>2CM#im>Yr`Q?CV?pC>*M30n;Sra-u@)e{ksAL zs;g%{S&;S^8_a)$$B1EGpD})P5(UI1QvY8!rk1fICNgHZdY1_`o#AN}+|k#=8?meZ zMu(egx@|+AD;XN|Go^HzL}vJ9zFS~nQNILhXe;`1D}72lw%^L^szLUCSkvwzE)^m7 zx}IAJ-FFw1onM+cfv$I2mf(4!xq{b+A7hY@E-ww3^fq1PMSZd<;(PXnkD)@JpnYj? zDWntpR)$2a`FPsiioR2Cuen0amUnISu9Z{}EE2)<^g8E#TYaFqLhZJ1H z(0?6N)Tdw1vCYU^(|NlYl`LT?D8C<4hY-|{@;HswQd%2l&Lx*AJ)CZPE)BN6Z5s`n zs9a%7sH<&dF31BXYL5E+sI;_^e3i=6ZE@|ZW3`u9*kg=9ZD>^=4$Qg-eFB=3nJJZS zSK)7!JXDSZbbH$_v?YPURqyI2T+1kKM_zr*7JO!XgmDYpN|rXUKAI0UY98U0fs`CV z9w9EXXdAO@hkE!WSxFXcJo|D~IFVMAF|8GjuP#O0Iq{MFM3Nm&N6`*JEKIld?y!!;um-a}@p31y$dhHTY}`TX zUP7OwX%W!Awdj5fL6j`+qq}rA@?OenZW8~-Lk9UM2B0t@dh}7Kls?M{#|^?!*r?@m z7x9pLtnE{nIiJe3zjqTfEPJ#jlhGblZ4tkPC=>N^?|mhw1Jv=sh#OTh!D#F8uhjm` zO&a?>l-20uj0ige$)U9Pg5B!>99YG@8}d$sNl2zesB%w5Ku>ZSMxu3JS^)pvDTio66w_7|ubzA)>|8{`* zLk1<^e*h$;12CS3g!u3OxcaGwRzLokE#LXqBS-(qH;T*jJDQo!awe1SA{bh%XhA{N z(qFXjE8Tim{R<_E6>4O=7Za(1{>tYkZgcSRH|*?0>bxlE~}HPRSv*vo&1A{azf#ChnSzx$)s^eW@?UqMTOACSI&-A#)$=*vsGrCidAyXdzDrBH za+%`P1*oLZoy!*MJG08D?<7$uR?l=q5%d-@F>0;QZQTz5Z?-eaWC!|av3kb;tdBFQ zT|Lv8%Pfns%c5KaMGj47I(tbI6dx$$I#qne!s;0&r20}O+e153&lRUu#IP0AOzmld zt!&}T3a58k{4I;mSiEZCGZvn+aIb~0S!m^_?QP@ll{5XUg(LRX;#21>K4IZ$g^f2Y ze9OXjEkClb({esgIPJaMV)1bc#}rOIXz{x(e89qk7JB}+eunP@1?k;U2P6QSX0in) z03Od4@_CS3Seff{nyQ~0E;b&3cB-fH*<$V8Vtt$!##}t1(8iPe#ROPCClRnPQj#K` zZ)G5YLbfY{>3`In>lA&^X}$x&FAY1ZLTiLQROO);5%l^t5n3+T{7t^ulN0gjKLE=XpRmfs+OLhq8hZzGT{egU zl=kCNvHBBH!>bvnOhYRy&JDsVE&qXr96c5*NDN48a=2I-%;ig^V*Rz^%-(D%OM$K^ zQy4DLcCmh%Q9CZ`=Ld5=lvZmz^2DIgp`9YU`Z(h~N3vMy&UFX}V1QA*EfOyn8s2V0 z!`tg~W$I~e^7#?~H69R5G+wN}GhE6O=CgUaDiP>E(R_Ve9PlkocPSsKB!EZ&z{XJr zZ1av)>n>5PC)b@vQqc4t<*qKC+{P#*VV-1sR0LTz?~*3fcNh?0sJpCy2aojT!)}s> zM_!_nQ}kcTmva5Z3RLwgT2qU^Dpr3}tiE5YUZRy=#1vVDq1q2MzxL`ks#fwO#omW> zRJgmGEtLS*id`b7yBrM{Yp3#}p>f(?nCmUpKqHXlLCcQ?o=c`eZ!Qxi=a$@HJi?h| zgfk3po*~TyaXa&=T;Jt}VEs2}OH;|C040Jd;p-G5?3P?|8qzGdSc58|EThfpsXiF> z1Ln_#K z0kx2kuDj>j19m)D}J3uRlA8lYvU%3qIQ$X{n~O9CU7x%)l0?Nt;TDR z?F+`JZ#$#HpKlvR8gE>cLrXzaU_`w4J_Chro)_`WgAcD9$4Wf-MB>7f>BTjkCqt3H}U^CVOk^HO7+<@@J8~ z#glubwra!Kf)QB_>Kc|LBLsQ%Er`oJw3+FU>>KV-bU;Bb6exI}EGUqO$8KGV9T z?s7*4@tZ4m>OqoO7%rKT+=+l>?@?{$hdVT`;>rD}Fi>XC&hFyWD|uL8>J|PBob@({ zvw4-R-JU7%@jiyaamKqaBk70HQpVIUBovlKJy8c@tAcdZ?5mK*Tm2Ckn%v1T zQ;cs)F{0NC*#aWTg==kx(ZCMCEkG2*MhiP^`h}t$mL7)eyCfH6Gj<3~1sRgC6$7b# z5qY_AFq3r=xeRd0LTwKqI-!NyMOb*SM2ZQS;NJ;yHPrerT@O{iZ^Pb2M?~7yIB1j z!NWi=W+CilQNfIhPE3+Qp)W^+C#y`4Pmp3V1~DuaMzT=q4;E`*i-E6w&15a<+E+@( z3bl(u^~pxBjh`v;=%}>J$;N_mR+DD$G)o|~fQ|%;j^TXIQ0*=B&~P3)>jP`GLjv(o zwtq0wu`C)CKr!nc5?@XN#F>SRruLWw!f`nD41d`IBtTvP5(I~j6=DG=fgt8NPXFj% zFF%A_sy!A`)JAW2iUOV}h@)dM1BAuew}xspMy;wQdqjnU1tXisEc{l!3}?}AX=Sb- ze4$|gs5Vus%}N2BL0+HHTwy{uprMQj`RbWoc!{i6fv;E8K8aaOtyILTsLr;1Or#W6b}-kADyPHPKFBV}^_a2X zK^}tv9lInqz7D6rxvBJ)h5bC>v7 zV(sL4S6Pi`v5quoHyjjFoDr$r#!gx(NzkyOpjoKWROnCivVH@zTRWr3r=-}wgTZQ+ zVH}DOU&1$~7~t97oUC3f;GQhYojm`T&2B6fvTS8id#P9-fi{sOBaXrPx|l~#zEL!; zgO`b(d;`J2AM3lgdys z%mg7=VpbVaEn^dQ;cD2TalsfhHl-UEB*7aOSVhpBjFB%ziT&5eQV_Jyi_}9y;zP`R}uU_@Vi9RK|_}9sDMXSI8FgTD^tY5HI-$8wL4tM0U zVrztAzTBm$&URguD_~LAke4Kh&?WssDa740sj0Zu5Q>Q8c=Sb9$+DpH9<3*ayM}77 zg4oP(7v{upR}aM1Gu)N8L?4Mh68)m@>Lmmi_N*qZ_Bu876qRTPHDvRtls@=dBCnUO_|l9s+mK}Jik zRIlH%DsjH5Qr~6d`zaauzKg^6LAbhvMleLR3|L%7>6!spocv1@cf&)I&l>@5c8hcK z66sx$R~SG%j;3ATcqZl&^Ob0fjTa@sh9>_?54c}iv9_K+3QnRu8ZSD3*M0)y*u1UJ z`Z|FeTrQu@ErP0t8VItX#%ToHKsHZG8RQG6j+DkTMg3ini83j-3w%-AN+(!m?zyoA zvcU%q8_&cO*jQ>7k-&b{$iSygDx zb%{T^T%wLIxS(mg2zu23|6&Q%cu^p{Ed&&D0g=LDb|}{)Nj_A6fIlFGh0$JlxC|jY zqFPb{BhE=LQIvHaC5cFEss-NWuyN7MS@54_DRD`z2asTlKnb%SU&3%4F37*cOr1et zvsQBCiwoK&0+*3xf)hyq}4kzppH3whLK4-e;ZSwSbM)%`#X(~|1|rx zOZj|+D%Qv~byzaUn2UlKR>l7SQB`utB(o(L9sE(NO19TesCh`FcK~J7o9*t^=!WV~ zYUqupZKz0b64f6mti98P8+S0jFsH^vQRC7=Jfw@9=Es|_WKKf?#d=kfR9&4L5XR}e zUJXx->YkWrE>Ko)OnVW9erU;y2P(P%iZSHDJuDrowV6f5nMJ{pommtYomsRzx7e$b zmp8qeM+f(q_rkarKxP(66|r6c*DSuAEx=>0J49oD5k8w?%>OP%3e_h{vYK+q$gEG=NZ)<5hcc>|sey^BGcu_oAkaTW5%M{9EfGJq3T5$^-Hz53hUfg&C ze?o*<)FPIN$jY*C(Hcb(>a5(ES_~R(`2@%2rCOF|cdzXS)=6IDG3~DTX6>SQy)XOpW#=qM`b7VS8p95&l4778%i@>Fi!=eD#j64Br{fU4>bIy(nEO zI&s$yh(@@Gt@4FMxk1GAW8{>Ki>#+>bHm={Wx~N+znSf3iL1=A+#p?m-`D8|buTlw zg0zk6FBg+&D%!M`=EZS|MrD0$Si~X78dEl(7RGo7X&yT7hM268ILt23p+M4&QmNTk zGom%=4>JW8LfPWXPOpo6lr>rbo>=u&P<;guE(6pgFDQ+GLLM|hKn;jmdS5=R3e;*c zV0e+t6fJ4$i}DPnu~Yx-)$2uxyqOVXY4Zi0S_Zay{Rc|y=B@TlVmm^s7xK(&A)7+R zQ+*K;nUrQ~ko?r3u`H@Gtl;e>`Y)63RV~Vhvg?bqpA=Vfna9g`!A+?OYZqv>zCOFm zv~F7YF3aS+sfya5i0qn6Ly6M>q)J!!mmLN{Sy|w{X^Nru`l4$u2dG!JE-I88gqCGY znWlLSud--GTIV$h>e{Wv%A#DqAbmr)Z2kxSEJt{Z-9&Zvl_E$V5u^#8{2s}k2$g0r z^hREeG*yU~ermxNjkYzlsN7+&sg&FgmMP_co11^Kjb=_~ZN0#3Aj=KURrr}|$f9~x znStZ$+P?Da1sI1~Jm88&{>wdJmRG&HNRsbDEHbFxXpn@LDW-nia45)BrZsE-XA*C9 z#M?5ai2p(t>Ny=}wb}Yo`qOmD0CtQFSgoP~7A?ufgF_96PVQf%hLNKZr992h%U;LI zbMiqtP?3xA^9>197@jdF_20NQ*H@f;6V`VgoV-W{u|OG7R@R%)O01tIFA9x~@)F>h zQ;!@mo>}F+Nt^qDGt0^WT${|8+>cyGljJ%=S_LoxaW1H2c2O=@3IM5c5qCEyF{%Bf`WK1p5BORni*<6ZPx557 z$UbQSzaf-)jyzayvTCW9p|L^h*U^4NY}WBi^yrRRzXy&nq-)!xFTdpfprwPB~TyG5Zy%9CfYT! zTV>%o3pd$pR=Z*!N9HsfMTZ<8S z)Z|HmIKLv%=|nnnkuB!onCSPjEk?dEz<#5?@vD$vA*cB&oBe~_5Zo~|IW7j-A9HGU zzLIjbiS1-}&Rn$8+0U|7$!a!$3QyC<;-UK2n5m2WwZ4$k%&B+3d3Y%%@Z;ioC$!sP z1V#2Xg}PC@i8rldt%ODP+7?s75KS|6axc}@pjgr(BKW<@d$CWdvWjb!24QF_W_}zEmwTpSRv_ix%t2$t9>*==^SanZk!HEJb(YT?f;v>o`Fe^8rRhVN{G zVMHT>kd+1ls)Uv?I)zZ2`31H(ieabgfzb84^az+FO&9(;Yd*4>4?Z1S*^MVLhklIP zhK)!Oq{#0{TW4H_R-j8)I~4jAexhGNhUP*372c6As|xab*3UP|qOL`YdSL3jE1}~o^Q~e?zRm(m3b`sMCJZ6l2n#4D?*)0`sMB%| zo8_D@D~NnHcOCuW+0bUatPe|(qZw}bPm2c=QNp}B0?t=3>z?b9);+L+hM=&Q3$(y0 zLry}`m~Z@J!SkP;K}fCG)XL%O{!_ZG9vD>j#SUL)t1po&Bw>l=>lDhh&=+dW^DK|JT1| z=H)9SL*y0wV2IZz~~`HCD3Q~H(SY*_c*3$BM zAU#eo>k=kYD}Y0ao{0V7nJ!LOjpoP@`!?Rt%phH-_ILNPR>cvCfyY4^#4?A@)Q0>{ zyJ&@^w<4il|4Ss+)C$=F>@Tq=p6%@&ntYqexP`B?9oXkxrU8P`3K>qVkO~xJqQa%J z4`x@WPZnahNVSw>%)fxK<7`_5{=7p-HlLt2R<#I>%L-uXNaj!FZOx&hDN`$aAncE$ zA6OEb7pL)_icPcZVbD{7qGwmh=qWZnz!Rp8Dec0{uHp}*Cg~e;i;XqNOch}l)R3Qmw-VZw-DYS7RyH7HeMo)#Uc z!ed()ut|ErW`^0O5yi!sQ;WP+p0sN9L|1s%Ah#FoZ>i>8@ukx7QzFQ+Wj$A%9g8DV z>q6u?&XdXcD@Pihw&K)#j8zZ*J!h~krT^(w$so=Efn>V8M9g(@dOt;3?M|&=9Qadz z38BIDa^c#Evp8-}-H@*XE(>#gy}j99>Zz>iYt7Z)+goBciyUQGW?Zl(kMV+)31LXv zgcbvvRI@Fu+Ar+{U#U2C8*SXioS7YL0h>?65%=D$D z^K2WT_LvGLPVQpL$Pc3DA_UWH6|;nzvkj>yqH@odN+v*u*!p*#jFSO0hw14#Fl`Y` zp52E;k-igx;*~?~RZVvd;+$Gx+x%usz9SVe`3?>fUtiQ-Wm}FC?C4Q}wHgm?)IpTf z)utnJR%}Z{d;3k&Q);@w&agYO%t2m#2dACfh`nqv_DYyx2+qDIoyenU`_8_{j20=( zK|8556QsjB;o^G~Q~Nch=WM70#x_V97d+&jPKfSQ%uHv=(tN+j^J*Ln)l+cVw^5ot zu@VW44n|R?xaoE&RI<+~+Xl6QqlhfhmkU=ymPj9cmZUjhFf@CPKlWTH;$F|Z<(?m! zJv%z~p0vcJ(S`FM^Oh8TKVQK!0Kp7%!d8$wg?Vn6OH46xc?d9S$k7 zI>ZFY4PZY?q8T-4JmfCREzV;PC|_>a_#G0^g&+$>S-_aI@G(2PbY93VWOe2qT#PRq zwG=HtrS+G14FqhnFEmUqw7ru4BF45R^)V_@o6@nuW0RI1b=;++qr?2}T0v!zQK-Ck z1ePY2Re^ygWU}8+9{Wb}i?VCa-il4Ui5#iK0?xVAe*C57Wrhe#g42+UZv)XA;9$S@mG<@J>D%Q`%GeRnOXv)7JKL+3pVO{FbY7 zMLER9BOM&4=h&+(JKSfSr0xJx9cvz%{Ed+e{kx`d_i9~w28qLlm8n2WFAQ0&0K73xr5-T=zl{JWC=b(M@_jQQ)GlFb<+Vqs{Td7sIcsVhW4ctF9v5NbhJ(`)wzXTOi%Gi3v150=Wcfr6J=M7^ zcU5*^fJnB#U(;!n04YEV?62h!p#x0wQ=I^df-;Yh;Cr6-SH^45#6&4Rh0o0<1MYV* zq?B0ZT3EHpD2;4s!xqVHIPl zSR8P|&rTO;?@Y3`gKR`$N1>AgDYj$sMP`}=)7_it_yd_(c%p63*dLIVb@Vz9^VM5B zCgiOk4O$UB1&p35i>VjSHU~w@fOScyV0GHbwT(|v9Evwk#~sk1&iLxn3=fe59UY?U zUu1@!TB;?FAMMiGHqIQHKHbNjh37Afmc)nQDc&sc)Kce?*VTxe>{vJawe%#@L}m^P zF`X~w592uviYCn`WN8lN%o&`TWLmn&Rnk-JVE44-%90ssaClV*{cp};;y^80eYTV` ziuf_1i3!uuS~m$tInooXFMv1G>CfhtuzKNdxNDft0bb<~Zb+99#bIlph-6&IbgNy5 zlReKFqC69eP_do7qzjDsV*Q8wwKh|H3V%ABjGC^`E@7C=NJ~G;7|tya>}}JNM`?MDkpYq66r$TG%UlGOFH4nRc`A6JZKqW%N9E&^b& zD!@l$+*Yh;;ceOhH=4=SxCL3!a?MP>8@p6kvewUP=ylE*)3jE;F}R$3;M|Dqlta5P zI)Z=*M-<{%Y58CWRy*z^){pLX5bIMcUW{5Ko9jjL*6chZt9UGqj^a}*6q8_nN=6(B z`P223tYzc7_H9Dj$Nrx9p!RKjSJFIdr-JrT9TLhM8KjZeL!27XHXM7sVm)}nj#U4c z1K)Be*hxx`9I1aCKaFvV?N-c{OJiKHJT+p+2#S+9W-uL40PE!;fGo{WH1OFrOR$fh>mgGuN<^+2SOq|YN7-8ZVky}D^v`KI;a}dVy$*Re{5E0A-u5MMSD^v#mT=^UCz@n-#VWw$w8xkWgj0rwI5vA zsWLl2ZmR!&`GM*;6l>q(R1=#q#1WAg3g0f)UeZYx^Op>re2u?szeH+HpSdtMhRvT{ zn_H+6lV!)bikxHB#F+%9v61e`Kop7Bb*PjOTSnuA5=ofI=mC4aU(x0GJoy1nus&2* zhMj=6n52htdZp|v#=v~-if6$OfK;+;b2q^r?*IdKKjyZg*l+_`GhQHvK9V{~(jx-R zc4ZL)xd`#a@Se!`H!a7BD7Gv2zc4j>N+%&OAU&IePMKLq!Xo_$Y#uxF}NIERo00JGwZTO4(<# zU0s9B(n9x#Y4zDG!K%$mk8>8Z;BjwuU|_&24GefjcXzjE zba#7(j6ADG#9Hg^?e&aaTT1`DqqDQqGdgwdhyMEedNCqo|TNdh}YfqfxUlj%S^*%?ry|CyJ?1vBU3)d0|P z%0uSq8CI9Q1Bf-KPPTS^CwVG6D@T+>o|fS{cFdR=t+h7W-#pDVyQnxjh%a7zB$v39 z|tnhhhPL>X(;QG{@%9G6(R-|>5ND!I#5`ChHqg!63{F!l) zDaz_a{KQ9TX>(BmqmCj>y{BoKV(I8f^C-^lx4AoLuhyy832F+OCmkBi?2OV+2k7{E zQC}Qol=+-xs@mxQta*oWa%ZqUM^KbXoR#2D(AhhfS1(oRtV4+hiL}mXp(YKUA6WRB zh5y1r+Z3I(P0?A~6rKGC%m0Oi_Cew7uPy$Dg>PE;mUyL-F+YfATs!w$(9s4#9z&TG zZGB50{uez3mT`tFb~ZS~6{UVw5jMS=V$2EzOx_=y<;M)#s}Hn92wD?a&KT@MDTyM4 zXn(dp|JUDq@Jm;(``K*%+#i4a&xd~8`-j!j(G5}5S&gD+xx}D5OF;U*JzG~tot&NE z|JDEMzZn1Sb6@y3hnD?Udw>2v?XCQ?zyH*yZhYZCU-uvX@jH*7{->Y5rLgGzx6gd* zOS7vUJoM+q?ic@L&kvqHJ($lu|Ih!`zaD-4sqZiS#)%t$+V#KwpN}5-{>tgb;7|U$ zx8FH>y7TY;`G54kz4mXmeBta@mNmZl^#A>}e_6V9_@@r_6S zvwwN^&hOp*qc8uLi?(q|gkORhZihJ*m3DKthF?WD_g>N)boYyHTsg{9H(%)vbY09? z;a2c)ck-vg1--g*%kQqx#VPuMz><2r+_k1{FI(>{Ew|R3d#UMXE)QDz!sdLqGy5|i z?Rw!w_c1=df-t#5_^Lf1Veb8@pKiZ{O_zAI-j{nz>o5Y^b#as~3li>ifte$?6kaR4 z^~#fD(W)!G6y}p_nN<0SXqn&VrhANZZ&i9Z82_=l^iBVMX^HMK3_$Ci9bH=T;TM$(gSwnXaQcsV zgzHb#p56&%8m`}FuAAok_blh$OC%y}z0!1LRQqqfV&m{zV!lBy^N&Hjg(_=ms-BHte;f}`aH{;G% zTUP=359~OO9e28KTsAES=iSv(W_Yrtb6e8UuT>Cv;p@lT<_}yX& z4}3gYp37N&D{AX+)yxOwe00nSbHbFCIH&bmHT8ocl##AAR(#FE{gqLt6jvwS zsOau{BHd^#QKFlIgTmC6;ztpex_;KLz|+mZLZJk;->9X_0Nt?BomsW_{NmbM;;VPp z@^dTc_@0*3J+zyC+j{A3c(XZL-z>G6pFRlryMW{tu7(?l*2d3u@l)lMzk#Q>xrU#U zSVi4E)X|OE3a|9;z7*W5yPEXn>bAdYt^0*$KM!D|wD!5St<5hPfoM8IxsA=3ZlKdm z&Ph&!iSRDT*~FZ!o>R9qcQxY*{e%|g%S(^j-#e|Gp!QB9rQ=XVeefS={{Npde+$1T zso!1}J;*%X$5oYk$XhhuZ^#tC9{qc~*WK_V(O2Mz?NL7b>da>pxsSJB;{7(>+($bj zTugiimqw0|Qfzy4)z``X0!37KJDGc^a!=I1)ufVN*;~?W%94r`P3@+IhxBtL8k7mG z$Rj4-o`|l}(&89^>u$~DCdwOQqP>beCrRwSwI#7ATqKiqGdZ6q^?Ai z<`dgWY##)W&1FC*8Mn9DC4aCq1bjdft z{O5sD6Ln{FS9CWM`vnBTF6QE1koCoQ`tD~szYIBiCHj+CkgnxdYt|#2HzJTXbCY)G z)u^C#VHC2tb**Nw+{2~!ZcpnjX#e3t0i8ef%kQ23fBwgFe^l!YD`%Mox;9wzD-*rd zpgBf$UGVA`j7sBu(@+s^htymp+Dyw9zo=Cxlrf?A>E9|yev~PwWM8Ztqjzsh*VL}0 z<{j3u?xA#i`_-rE3&j0G`|ukKYEQq**lvCVog7Bi4$;b}`hzl45cK(j^J;YEu3!Rv zp&~YUGETWU_#{&%_Bl+xAaDQ4wbq(qt#B=E>l-b_#4WA4bG;ks_c!tTwv6IGEW_Bz zwZjgvxJDN>yBX)R_9TQRf)Q!U_>o;8V@nI3yBUSdZ`F9Rg~uGfYW2fx8i%KIOvcg* z1O?;^ z^U3`V=pStb5?}5mfnpk|dS;zU?7yXTL?a9I3S*E^vUFpZK#atdfrrG+qb|HI_DGHjE$Z z?Kt(hHcR#2))u10&TzD1gctP()XF;wcB!9V+FQGRgyhM0_2M@Q=#ASth&7%jsM}l# zbM>)k20-6`~ zs?OZ#vuqVOuV6O;x3R`O@_{mWTM24REZ-69t;nH1Owc%|;ALwK6ijLcG=+StNo;bz zUiinr&Gr`Qg@!w+u}n@7G?d4ss@;64s@VN%KorzyP|XNZ?eWQ{UX1s4vso&PC+*K% zG!Pij&sd4hQ@WLs^Fu7WtU>4OU;ls)^P zg1z)HC4^2bRRA^UK$D8vA$P09xpJ~+UkP1sl061{_Pr3Benr(+C=f;roi#X&El283 zH;C20Loj__Z~Y7+$;LswSf>}iQ1Gs8$m&EGsmU@`pL&2;V}zh42x}$lQJd*c>cxY~ zqg=73LDZkqTmKlYS#Cz*0H{{P{o;kg8J3Gow+-nT;ryTdiRV1!85r?!A=E2+2k7v8UzjDXj0`S zpCy=ii=h6pk`}0y$=4L<#msw({Zz3J2xdD2%pBnf(Z)m;vCt#5&h`__t6;vbd$@VV zfQ*L5V8^AU35I5GA+N^$Xz>=gQIGANKgWxyb!y@SL47vc-Jk95Q~E-T1wJ!SQh+|C zd;9$CZ5-j;EySbIJ*9Ehzi)KQ#{PHyB@bF(c3LLH@?Cl{ z9?z7YeIZn)%YdJEa0o`p6LA%ez$p1-oa79HlGQlL@fRf}a&(e}!!JtC#7U06DEV}p z{ynf!nF_-uS=Uck8%^eZ)UvEYmiPGOXiVg0Bts<0&GG!jl{~?%)*SrQu~xFVN5Y;xm>ZtSZYT$;$S%dN)xI(ZniZAPtT3Rm zx^143(%mUyc4Sf4b@PdST)9UHjaDu7Dxt9|(Wit)s#*+7&G3ld_UmmtBo1r{bzIj= z$opQ#$Jw#xiE=p1qFuC69I@~L^*<#ADVOwsWa^s|M$wyVg zCC*hMTZ?@B_5dlaq6jI_t7ygYnUgrd`91D|v&@`bC|G=eYiIRR^>Z9>Rg~+&bR&Mc z`H`09N1DwmzuEjq+`Ka5=11b@Ez6r9vF76j?NY**GP=!Nr_~U&)}Yp%YT+{$ayviG?6vSU3#~jqPe49DPoM^$RqIoGHH6~yh&`sB@yE0NIOmV^C3QVD z5qCW`Vad}Wd0NTFn{l%7rX{%&(%@{orI9t>)uA;t0-8JmEuS)AKCu2BjHz4fTi5Av ze~j5<>OoK4?T-iianK(R+J(l`+jOTktjM?h!f1oD*1I_m$ppVj<~ht-UUhM3b6C}6 z)9JyI1rP`Y8W*l`>5k>TX}N^3y^d<~F{^>Px0`uIbn1b~)PqxpdT=UI56&^_fn?N! zV~%=sb=iYckm`o78X6C923IQ=&i!U-Plb^CO7wD-xZ3VjqOVU0B)=ZW5j~Kyd}A1o z>wK~CER4Wu?q>&mTr4UW(9XUx2Mm)@bJLsZ@(F_m);MdUY@DSiXHkKP+w&VcCFQw6 zJ3foeDPmO;@fVsM>W2V!hC%G?j!gWjF^(7~*cMdSZ_P`x8Z&AP9Dk=8we0}+a_mcFsS@q%#5iqMGe8N@DAd?4%3N>*Zxi~qrc7|O=c-MRc1CtShW`*MNt!x>f2WNEvq$S@v4Q- zSa{CDy%xS^;ZB8!GeX3f;?JsMi8FPHI8zF7rU&9o55$=sh%-GT&IA?WOi76|OP*HJ z#F>(aGbJU?EcuqMk#%vVS|-jEF>xkfK2RUi2q`@fQhFeym=y^rYwQiUj%*Y6-I{5> zaw{t==tf{827O1S(~)sP%nh1K{wU-u#f|&0d5ybX<0t1bEp5W8CL$`G_JabJjaOJ8a6R#=PmP7Z(0`R2*N> zae$N2b6TEoYQiSuN!sBXGb85p(o#5Cr5Kh&W|T(h>G&zh|qjxSZE95>Emr1F$Z z7FsR}XZ1mE=^|*#dms8ZA0m`$hfH~JmAyW$A;BGumE0;57}+kKjDT+W#L%wVA` zeK%6%D=3=cp_qnH-=a&DJOTj1)0WOM^gzoH1%%Q~vRhY>v!WxZk2yH5U*@YgMNRjj zfqA2^nEUh#9_V1Ad~3laMqORJ(WfAtog}r+E2Er=qM>=CpZ@6YCyAzpJi!OZhMURJ zcV#j+pwDnoN2&3bo|1G>B|k@D ztcsh=sPqh3-sV#A9Tkm6EMnBH>9+_<#d)NDUTr``P_$L$5z#guF^MKd)PMZ}O1 zs&A7ZX&6*B1THro3+Q(iAO%S1ul5f9SgZe_dgIqVxEI_Hz@2v^c~K z!v+6MD`65I?PUVu>w=ZxMn3TCD|5pJLV@|Ps|KVIz)!Zfj4(Kb80W%Q3D4JP28#!W zp6;KeG%w&*m9AHtc&H#9e%X7>OpWg|hf+IZQhYVrnwH+h3T(&D+_A5U71Nv;{( z?_IyjJBM70!pRA>z&)V~Cm=dD9VqIR_LJ~d{QV}MWL8uSDMg5zSh2ClD!*wZxg}Hd z!WD;J_ADjrMg4wC4NdxjbJDoG(Xgz$7u&_Vh6K%l{uL*0`xJg2-H90sO0K{(fvH!E zOa)MZg3b4Wz50E4hLsT`Fy?7w2cxcL0!ZCn(GO#M-}*Lr&2ESTy`NPsXxPu-@Lqrw zxi*@UJUNj>_c~f898WBn-|&n#jYnB!p9pUnW#%4K@uOS!8(r|pv0>=Vd?+$`@hY$x z#uuK9(@}VWVbTU)GN;=O5=@lG7w{*XY~IW>$U;~d+kK3(G>~8qK(sO*e&xw$gD`p4 z7Rm4}g5yC}uk2qDhbSQq=?<~Q7IM7W7Ju04x6a(|1VkE_Tfy2<7IAAw@wlCH!fXA! ziyhlBI}0v!b0F;z#+0sW7YhZD9~SK_$qi@qbH+eq*T)eZTGe~G817U9(1gSCtrzmg8iZu z7GC{ZG|zq+e+A5?LWiI&PCdsOMAkaLbS46u;>SIov$o$b=-$9jFrX5RH;`suL7FA0 zDN=Ev`fQS|pMn?+Rq*E9wH|pjUZHIpYW39MD$D zl$tlZf51d{Vmaa?$=k4|WTwT#@(eB+2pIyNeM!Uh&!{BjKh=*IB2;gKnvMR@TQjBJ zKm`}t^v5eHig8DwPtFt?ESVfj1@NW@P1;WlLbH5tST%3!lv{aIB}2>9ir9nPqgk6; zA!SL71*Z9xMJ$-abiLI73|PfAeBCGq*>Rtoi9wrS8hOv=a|(l#M47ZAI5Va_C)CDG zD}?Y+IdWfgh?X**GckhYRMOimC2K?8AFH#J5kZ#N_1Hc?vW08wOtQo} zBn1=?t9}bk8F%Uxr_8CxBW?j-qqV?qUwMRA{K=;fkb*qn;>Fr8c@oO=NSC*je7ZL! z(=7&NO_8$)#)rs$YD@B7i)6vfPm2cYo_m(m*xu&k?u{qcm}-htpjyY3UI$vIR!r+E z7t^}BY}R7Ch`G%$$3DotC6<7K;Q}yt77}E@v+#KFmk%kfAgVr}q~s{e53;1EGEw~j zyHUq}fR7{f*}*|Uus^`f)m$LbG7P{ZW#XmzPGi!9xFsbi&x#~W-}-=8geaY zT_ATckAZ<+{d$`z5bpka4pM;RVNTm@z>o3WSW8d6qC7)1vF{oezQSbD;44_3l*Bnf zng~DI!p=KWXg`uux{9|@0hgArO$d(T>(mw~JCzpK3@GSVE38ue@wfiKV~1%8uK4_0 zT>(3O5t+If*{56&5OvzEX*~>zkC|DSC^j$qeAg69IR=QOW+Hg(Pl9 zL5m|!`Gr}KW%I%;v!&$VGeX4Zke$ZmSeESYJ0#QPV^+;EB8)9}?@axSV zuVWvSJ0gE3D(BJ;KQaP%ys=;XHGhM=Nf}+w6uXt6e;kJxKow-9Q!zi6DON|zdi4BN$U6O3HjoluI4Q-+69Wxa%?2(w%pGC@ou7M16ZNTJX#UiMt~ zLnzy*FM(*_#FwY)0E|{=;F3cOSbt)4i)wy2gJtU-p5`LJM?L)|4 z+!BAU!`q>EyHbFDy>IXm$GfcEyJZx z%GQIU7-ahf9Ab|;AX)i-ZYcC>Z2~hw|H{QGhSr|miENU zj#9xrMRv)LUG)RdMSR*)J|bZMvl;Q*dbC`|pG1RoDR$P*`mt;BUN_3Ii?3`lm(q>< z%!>69r^&yYl> zV^cT%55NocO#cJ);gPKDR(!}c9wi=lvEeR47?luFKnRO>tcbGwD|D@3JY|I(P*D6W zi_ciRYT+{$p0jYTg|As?<=N4r7CU-s;aQ7+K&Xv+g>PEU-cI5>35pf^Ea?rK*(=!0 zCW@1*D{nw3w2m7uShZ&?|7C>$r?+oee8%Ec3%$%ai|@7YH4Cjgz)=g})WWkC|DbaP zcb_QA7MsHL>WYmvg*G~VHGD;s&#ypyNSk)9KAj!fLVD%7nmUI*t7*p$%!}==|`KJcUbdYf*d)1eZ zj*j1RuaTe*K#DYuBw_yILhJ zUorlzU0tb+uHCrmq1Br=t$XO<(G6p(E2A4Xtg5WuH@acfhV}a@m36B}SC6jQxOv~` znzidTuU-3aW%I_3qpLP=ShHr$J_@dTcynd_=<1DQ>o;uLymr<4eH+F$KD>I(stu!? z){m}VyKmj5eWU7X)2fY|H;-+oR4NZ|SiNuarqPGSR&Uz4VdJJX8^`voT0b^g8Qt*E zhKC;-TT|JzVbi+RtHw4zRH>||w>6_cJvKJBVe^`?%DznxkFHy_?xE3j>o>2iY+AQ* zbkn|v*RCI{tXaKp&Dh$FYt}xrZ`0Vujq67@Y=5?cEm4`NO*tmY}#*J$>KU`Te zx^5l$05!IL?>Yolm&Cc5R0BjZmTJ@Cl> ziSmklHSh=Nq-;syPyN@0@evIljXQIz|^#jMsqveUC zaND8LqmP!4JX~(?Y6)kH=E4<41Bk}8D_5^wxpw8MDB6*UKBZF4!QAqt%F$y8$lJfc zC=i{6Ma@^+4jdalIQqmrNXL0vMwFT)jaFu&n@08n;GxRI{v%`M#}6DlSbnHdK3X|+ z$-M~_jla=1KJ z89!RtH#$M>(Zln$I9h)A_{8y}>g8Z%^jKwOdAB{w;H^ACUH%7|=!xH3mwP5gk4}8~z{LLYk)vfx9J5q{+=)zdGs28VZ=n+$NPJq;n00D+Q&1|(cjx>ca2W$v)Q#sB~8rZnds5q zTfdrG?>iYNU#n!JXk#W?W1?_nQ*Nys!Hl~Dp|Evg;^={gj!#r>zU}kJ4;&o3^XQR7 ze>C>>uW!IExjhqYx?H_IM~)xeciGyjH%HMQW}@};)xPt<2}z~Pb-Zq46m7{wpSwcU z59u4o{~!}BZ*O3GkaovzzHQH=2gYrbQS|vtbbEWz9fv0>M-Pu4T)E@Wq2m*hf$+?} zNB6G2`L??%6R~8RIC4}?te+oG%_i=vJS^#X^KBzfj90cE9{W5hilU(*60_HSC0E&*PvTJmx(sS9B}9%l-fLsu&K5V zjs7VzGAOSo+Lhs2ESVW8GH#;Th!-_&gG9?#j&2*B7{y5V#(^=7k9kwZojz$;8r6&F z*#FjG*>?oZcJ%l@F#L(>*BcL49xv}Xa;PFiA4AE|1FCIeh4QyQc6{_;Dz9>491^LF z-E`B9QVTcUJ$h`V>aMhcBS%&=3*4B}Q`PS?g1=5<^LNt2BS*?w+hH9XIQ$5f)V?E! z#xc;Cqx}aEXfhba4(t;ljUIiXj4gBc$VB-esCle>4jg;+j+zv*p%IblZnDBVm$&($WG%iUH~W#UC7Ikmma{ z(L?uR!QE4tXo~YDRg`Ze8zR9JKJ?ImM~-77Gf$6${?Q4W12cc`I3la?_~D5Ihbjrh zAFUk5j2$bh2nK8T$T6ElrA#o_JAo<7UT_qBCKELtC4oC(VC%tyM;_mG{NTia@q-mI zdUhN}vap^VQ?Z?kKD^js=$T(qk#izdS-C77=H|+s(Uwa`)fMw~lxc5r3u9=jTs=+g z|3p^z)?>$*P$>QG%E3?8^xg+kNFc>rCZ=)Osxr7AJVDjc>YdXXR}(*MBfsQMf6Rc{Dc=bJEZBFO2E0i z6^+dOhmA-BzxdILb$vK~)EbR_Sf@hcN5HmP+xFqDshGIr|84K=LZdpOIDRgsMoB{A zM?nh08X6kGMDyiCD3!KrnxHXhA|ckR!Oh++k=^XNd#i?8iArk=LcvlBrT9{shnCV1 zP)k7{6jBX>;)5+Bev&@5G?ps*pz;4dvzvQ2yM?9op^!|tdq3vP%spqm&PqcKrgHALMci&B~4MmS58>F&ZR)p;=p{hXT}d-K0uQ!j=B z^c6&wTT=f1)_6A@^TBtkSFah|^MOc-MQSz1EY#@m=TPEPD$z0!bvEvYCO!}2IV;5? zI+DQwY&O6@8pSf{2JTsYBn-X+}Nw2koB+d6YD zfXk(OJM5mAuK0K%dSMC{JY>lM^_&vPI7WDP$eRZL%O6R~_vwpRVX}YkqJ} zomhSG;;-?`t#Z)5F!FKi?XR0#PGA3P(~DOwlzlsWzhvyj_mAHC>fG6<4JS(;Ocsw; z9Impa9`Cq0HhF2gto-ti=^sA{M#n$;{hR&cUmV$d;Ip-CPPgi&u8P&(3DW>}1hcut zvZ$w+Q5ra8EyM8&j(v#R=Zm8NAx8et)gA0UdiQwMhRTlik;*YSwy^qV=J8Im?Zy(e zZot;)R$INDO7`1os2MlLj%4-^?RaRn-DUQz>_NwEY%*zmzlcbLL(<*)dVSM+NtgKK zw{(frYSsCljs@N*-4+Uu+#koAXToh>2Qqir=c_(Bkv_Od!DzG{Zo9-%{qUKb+Hf?Q zPBLAETq*)mskX_^XRhB_+Adb0pJiLZOo3Pi<~*ldD~{gbVp+<8JRO!6HR7rV;K4q8 z8USgV(nb5g8{Hx;xMnz0^ygDLbY(h9E|@uQ&{z>OH>7XUry$N2awVm$1uQY5zR2++ znvCIPO+^YBVP`4ClPPBqhbkbWMM(_G7T(U#@JN8m&1s9u5O-{T8bPds4df-Hv=rtT zQ%oWOY8aa|ye8!{apVyWg3gxtUIGeuI7vbo$#8Q)|1-Qf#wVo;=`-&Vgl4%k)!F&v zVx|K?Qr4oZjUe8U;!jHu=;$FY8xh|maL*CyWwEc!9>|eU>e;ISvUNa1*XltFu+Enw z&1`y_rzw$a84PwLr~Fz4NwP;Clp5r-8D)~D9aXC)U^5cr$WC=3L$F=;GwRomw-4am z*Wswc)tiu}9f^~5aNmhk1_MX-UKg%I`jlLJ!=s}fdoc?5%Qvlt7(24XiR?Bt>#sM1 zlG}yc*n0TA6`nL{eG$a?<@42Zr`nIuSn5fH9<|TZJMUOug6D)KeGV-QKl5H^f!m=`7q}!@C+!} BK2`t# diff --git a/nunit/nunit.framework.xml b/nunit/nunit.framework.xml new file mode 100644 index 00000000..ffefc935 --- /dev/null +++ b/nunit/nunit.framework.xml @@ -0,0 +1,18883 @@ + + + + nunit.framework + + + +

+ Specifies that is allowed as an input even if the + corresponding type disallows it. + + + + + Initializes a new instance of the class. + + + + + Specifies that is disallowed as an input even if the + corresponding type allows it. + + + + + Initializes a new instance of the class. + + + + + Specifies that a method that will never return under any circumstance. + + + + + Initializes a new instance of the class. + + + + + + Specifies that the method will not return if the associated + parameter is passed the specified value. + + + + + Gets the condition parameter value. + Code after the method is considered unreachable by diagnostics if the argument + to the associated parameter matches this value. + + + + + Initializes a new instance of the + class with the specified parameter value. + + + The condition parameter value. + Code after the method is considered unreachable by diagnostics if the argument + to the associated parameter matches this value. + + + + + Specifies that an output may be even if the + corresponding type disallows it. + + + + + Initializes a new instance of the class. + + + + + Specifies that when a method returns , + the parameter may be even if the corresponding type disallows it. + + + + + Gets the return value condition. + If the method returns this value, the associated parameter may be . + + + + + Initializes the attribute with the specified return value condition. + + + The return value condition. + If the method returns this value, the associated parameter may be . + + + + + Specifies that the method or property will ensure that the listed field and property members have + not- values. + + + + + Gets field or property member names. + + + + + Initializes the attribute with a field or property member. + + + The field or property member that is promised to be not-null. + + + + + Initializes the attribute with the list of field and property members. + + + The list of field and property members that are promised to be not-null. + + + + + Specifies that the method or property will ensure that the listed field and property members have + non- values when returning with the specified return value condition. + + + + + Gets the return value condition. + + + + + Gets field or property member names. + + + + + Initializes the attribute with the specified return value condition and a field or property member. + + + The return value condition. If the method returns this value, + the associated parameter will not be . + + + The field or property member that is promised to be not-. + + + + + Initializes the attribute with the specified return value condition and list + of field and property members. + + + The return value condition. If the method returns this value, + the associated parameter will not be . + + + The list of field and property members that are promised to be not-null. + + + + + Specifies that an output is not even if the + corresponding type allows it. + + + + + Initializes a new instance of the class. + + + + + Specifies that the output will be non- if the + named parameter is non-. + + + + + Gets the associated parameter name. + The output will be non- if the argument to the + parameter specified is non-. + + + + + Initializes the attribute with the associated parameter name. + + + The associated parameter name. + The output will be non- if the argument to the + parameter specified is non-. + + + + + Specifies that when a method returns , + the parameter will not be even if the corresponding type allows it. + + + + + Gets the return value condition. + If the method returns this value, the associated parameter will not be . + + + + + Initializes the attribute with the specified return value condition. + + + The return value condition. + If the method returns this value, the associated parameter will not be . + + + + Specifies the syntax used in a string. + + + The syntax identifier for strings containing composite formats for string formatting. + + + The syntax identifier for strings containing date format specifiers. + + + The syntax identifier for strings containing date and time format specifiers. + + + The syntax identifier for strings containing format specifiers. + + + The syntax identifier for strings containing format specifiers. + + + The syntax identifier for strings containing JavaScript Object Notation (JSON). + + + The syntax identifier for strings containing numeric format specifiers. + + + The syntax identifier for strings containing regular expressions. + + + The syntax identifier for strings containing time format specifiers. + + + The syntax identifier for strings containing format specifiers. + + + The syntax identifier for strings containing URIs. + + + The syntax identifier for strings containing XML. + + + + Initializes a new instance of the class with the identifier of the syntax used. + + The syntax identifier. + + + + Initializes a new instance of the class with the identifier of the syntax used. + + The syntax identifier. + Optional arguments associated with the specific syntax employed. + + + Gets the identifier of the syntax used. + + + Gets optional arguments associated with the specific syntax employed. + + + + Reserved to be used by the compiler for tracking metadata. + This class should not be used by developers in source code. + + + This definition is provided by the IsExternalInit NuGet package (https://www.nuget.org/packages/IsExternalInit). + Please see https://github.com/manuelroemer/IsExternalInit for more information. + + + + + Indicates that a parameter captures the expression passed for another parameter as a string. + + + + + Initializes a new instance of the class. + + The name of the parameter whose expression should be captured as a string. + + + + Gets the name of the parameter whose expression should be captured as a string. + + + + + The different targets a test action attribute can be applied to + + + + + Default target, which is determined by where the action attribute is attached + + + + + Target a individual test case + + + + + Target a suite of test cases + + + + + DefaultTestAssemblyBuilder loads a single assembly and builds a TestSuite + containing test fixtures present in the assembly. + + + + + The default suite builder used by the test assembly builder. + + + + + Initializes a new instance of the class. + + + + + Build a suite of tests from a provided assembly + + The assembly from which tests are to be built + A dictionary of options to use in building the suite + + A TestSuite containing the tests found in the assembly + + + + + Build a suite of tests given the name or the location of an assembly + + The name or the location of the assembly. + A dictionary of options to use in building the suite + + A TestSuite containing the tests found in the assembly + + + + + FrameworkController provides a facade for use in loading, browsing + and running tests without requiring a reference to the NUnit + framework. All calls are encapsulated in constructors for + this class and its nested classes, which only require the + types of the Common Type System as arguments. + + The controller supports four actions: Load, Explore, Count and Run. + They are intended to be called by a driver, which should allow for + proper sequencing of calls. Load must be called before any of the + other actions. The driver may support other actions, such as + reload on run, by combining these calls. + + + + + Construct a FrameworkController using the default builder and runner. + + The AssemblyName or path to the test assembly + A prefix used for all test ids created under this controller. + A Dictionary of settings to use in loading and running the tests + + + + Construct a FrameworkController using the default builder and runner. + + The test assembly + A prefix used for all test ids created under this controller. + A Dictionary of settings to use in loading and running the tests + + + + Construct a FrameworkController, specifying the types to be used + for the runner and builder. This constructor is provided for + purposes of development. + + The full AssemblyName or the path to the test assembly + A prefix used for all test ids created under this controller. + A Dictionary of settings to use in loading and running the tests + The Type of the test runner + The Type of the test builder + + + + Construct a FrameworkController, specifying the types to be used + for the runner and builder. This constructor is provided for + purposes of development. + + The test assembly + A prefix used for all test ids created under this controller. + A Dictionary of settings to use in loading and running the tests + The Type of the test runner + The Type of the test builder + + + + Gets the ITestAssemblyBuilder used by this controller instance. + + The builder. + + + + Gets the ITestAssemblyRunner used by this controller instance. + + The runner. + + + + Gets the AssemblyName or the path for which this FrameworkController was created + + + + + Gets a dictionary of settings for the FrameworkController + + + + + Loads the tests in the assembly + + + + + + Returns info about the tests in an assembly + + A string containing the XML representation of the filter to use + The XML result of exploring the tests + + + + Runs the tests in an assembly + + A string containing the XML representation of the filter to use + The XML result of the test run + + + + Runs the tests in an assembly synchronously reporting back the test results through the callback + or through the return value + + The callback that receives the test results + A string containing the XML representation of the filter to use + The XML result of the test run + + + + Runs the tests in an assembly asynchronously reporting back the test results through the callback + + The callback that receives the test results + A string containing the XML representation of the filter to use + + + + Stops the test run + + True to force the stop, false for a cooperative stop + + + + Counts the number of test cases in the loaded TestSuite + + A string containing the XML representation of the filter to use + The number of tests + + + + Inserts the environment and settings elements + + Target node + The updated target node + + + + Inserts environment element + + Target node + The new node + + + + Inserts settings element + + Target node + Settings dictionary + The new node + + + + FrameworkControllerAction is the base class for all actions + performed against a FrameworkController. + + + + + LoadTestsAction loads a test into the FrameworkController + + + + + LoadTestsAction loads the tests in an assembly. + + The controller. + The callback handler. + + + + ExploreTestsAction returns info about the tests in an assembly + + + + + Initializes a new instance of the class. + + The controller for which this action is being performed. + Filter used to control which tests are included (NYI) + The callback handler. + + + + CountTestsAction counts the number of test cases in the loaded TestSuite + held by the FrameworkController. + + + + + Construct a CountsTestAction and perform the count of test cases. + + A FrameworkController holding the TestSuite whose cases are to be counted + A string containing the XML representation of the filter to use + A callback handler used to report results + + + + RunTestsAction runs the loaded TestSuite held by the FrameworkController. + + + + + Construct a RunTestsAction and run all tests in the loaded TestSuite. + + A FrameworkController holding the TestSuite to run + A string containing the XML representation of the filter to use + A callback handler used to report results + + + + RunAsyncAction initiates an asynchronous test run, returning immediately + + + + + Construct a RunAsyncAction and run all tests in the loaded TestSuite. + + A FrameworkController holding the TestSuite to run + A string containing the XML representation of the filter to use + A callback handler used to report results + + + + StopRunAction stops an ongoing run. + + + + + Construct a StopRunAction and stop any ongoing run. If no + run is in process, no error is raised. + + The FrameworkController for which a run is to be stopped. + True the stop should be forced, false for a cooperative stop. + >A callback handler used to report results + A forced stop will cause threads and processes to be killed as needed. + + + + The ITestAssemblyBuilder interface is implemented by a class + that is able to build a suite of tests given an assembly or + an assembly filename. + + + + + Build a suite of tests from a provided assembly + + The assembly from which tests are to be built + A dictionary of options to use in building the suite + A TestSuite containing the tests found in the assembly + + + + Build a suite of tests given the filename of an assembly + + The filename of the assembly from which tests are to be built + A dictionary of options to use in building the suite + A TestSuite containing the tests found in the assembly + + + + The ITestAssemblyRunner interface is implemented by classes + that are able to execute a suite of tests loaded + from an assembly. + + + + + Gets the tree of loaded tests, or null if + no tests have been loaded. + + + + + Gets the tree of test results, if the test + run is completed, otherwise null. + + + + + Indicates whether a test has been loaded + + + + + Indicates whether a test is currently running + + + + + Indicates whether a test run is complete + + + + + Loads the tests found in an Assembly, returning an + indication of whether or not the load succeeded. + + File name of the assembly to load + Dictionary of options to use in loading the test + An ITest representing the loaded tests + + + + Loads the tests found in an Assembly, returning an + indication of whether or not the load succeeded. + + The assembly to load + Dictionary of options to use in loading the test + An ITest representing the loaded tests + + + + Count Test Cases using a filter + + The filter to apply + The number of test cases found + + + + Explore the test cases using a filter + + The filter to apply + Test Assembly with test cases that matches the filter + + + + Run selected tests and return a test result. The test is run synchronously, + and the listener interface is notified as it progresses. + + Interface to receive ITestListener notifications. + A test filter used to select tests to be run + + + + Run selected tests asynchronously, notifying the listener interface as it progresses. + + Interface to receive EventListener notifications. + A test filter used to select tests to be run + + + + Wait for the ongoing run to complete. + + Time to wait in milliseconds + True if the run completed, otherwise false + + + + Signal any test run that is in process to stop. Return without error if no test is running. + + If true, kill any test-running threads + + + + Implementation of ITestAssemblyRunner + + + + + Initializes a new instance of the class. + + The builder. + + + + Gets the default level of parallel execution (worker threads) + + + + + The tree of tests that was loaded by the builder + + + + + The test result, if a run has completed + + + + + Indicates whether a test is loaded + + + + + Indicates whether a test is running + + + + + Indicates whether a test run is complete + + + + + Our settings, specified when loading the assembly + + + + + The top level WorkItem created for the assembly as a whole + + + + + The TestExecutionContext for the top level WorkItem + + + + + Loads the tests found in an Assembly + + File name or path of the assembly to load + Dictionary of option settings for loading the assembly + A Test Assembly containing all loaded tests + + + + Loads the tests found in an Assembly + + The assembly to load + Dictionary of option settings for loading the assembly + A Test Assembly containing all loaded tests + + + + Count Test Cases using a filter + + The filter to apply + The number of test cases found + + + + Explore the test cases using a filter + + The filter to apply + Test Assembly with test cases that matches the filter + + + + Run selected tests and return a test result. The test is run synchronously, + and the listener interface is notified as it progresses. + + Interface to receive EventListener notifications. + A test filter used to select tests to be run + The test results from the run + + + + Run selected tests asynchronously, notifying the listener interface as it progresses. + + Interface to receive EventListener notifications. + A test filter used to select tests to be run + + RunAsync is a template method, calling various abstract and + virtual methods to be overridden by derived classes. + + + + + Wait for the ongoing run to complete. + + Time to wait in milliseconds + True if the run completed, otherwise false + + + + Signal any test run that is in process to stop. Return without error if no test is running. + + If true, kill any tests that are currently running + + + + Initiate the test run. + + + + + Create the initial TestExecutionContext used to run tests + + The test loaded. + The ITestListener specified in the RunAsync call + + + + Handle the Completed event for the top level work item + + + + + Executes the action within an + which ensures the is cleaned up + suitably at the end of the test run. This method only has an effect running + the full .NET Framework. + + + + + Executes the function within an + which ensures the is cleaned up + suitably at the end of the test run. This method only has an effect running + the full .NET Framework. + + + + + Delegate used by tests that execute code and + capture any thrown exception. + + + + + Delegate used by tests that execute async code and + capture any thrown exception. + + + + + The Assert class contains a collection of static methods that + implement the most common assertions used in NUnit. + + + The Assert class contains a collection of static methods that + implement the most common assertions used in NUnit. + + + + + DO NOT USE! Use Assert.That(x,Is.EqualTo) instead. + The Equals method throws an InvalidOperationException. This is done + to make sure there is no mistake by calling this function. + + + + + + + DO NOT USE! + The ReferenceEquals method throws an InvalidOperationException. This is done + to make sure there is no mistake by calling this function. + + + + + + + An alias of the corresponding Assert.Pass() method. Charlie Poole was the lead of NUnit for 21 years, + across at least 207 releases in 37 different repositories, authoring 4,898 commits across them. + He participated in 2,990 issues, 1,305 PRs, and impacted 6,992,983 lines of code. NUnit was downloaded from NuGet 225+ million times during his tenure. + And those are only the numbers ones we can easily find; our numbers are sourced from after NUnit moved the project to GitHub in 2011, + which means there are at least 9 additional years of work not quantified above. + + This assertion attempts to pay homage to Charlie, who by virtue of his contributions has helped untold millions of tests pass. + + + + + Throws a with the message and arguments + that are passed in. This allows a test to be cut short, with a result + of success returned to NUnit. + + The message to initialize the with. + + + + Throws a with the message and arguments + that are passed in. This allows a test to be cut short, with a result + of success returned to NUnit. + + + + + Marks the test as failed with the message and arguments that are passed in. Returns without throwing an + exception when inside a multiple assert block. + + The message to initialize the with. + + + + Marks the test as failed. Returns without throwing an exception when inside a multiple assert block. + + + + + Issues a warning using the message and arguments provided. + + The message to display. + + + + Throws an with the message and arguments + that are passed in. This causes the test to be reported as ignored. + + The message to initialize the with. + + + + Throws an . + This causes the test to be reported as ignored. + + + + + Throws an with the message and arguments + that are passed in. This causes the test to be reported as inconclusive. + + The message to initialize the with. + + + + Throws an . + This causes the test to be reported as Inconclusive. + + + + + Wraps code containing a series of assertions, which should all + be executed, even if they fail. Failed results are saved and + reported at the end of the code block. + + A TestDelegate to be executed in Multiple Assertion mode. + + + + Wraps code containing a series of assertions, which should all + be executed, even if they fail. Failed results are saved and + reported at the end of the code block. + + A TestDelegate to be executed in Multiple Assertion mode. + + + + Wraps code containing a series of assertions, which should all + be executed, even if they fail. Failed results are saved and + reported at the end of the code block. + + An AsyncTestDelegate to be executed in Multiple Assertion mode. + + + + If throws, returns "SomeException was thrown by the + Environment.StackTrace property." See also . + + + + + Verifies that an async delegate throws a particular exception when called. The returned exception may be + when inside a multiple assert block. + + A constraint to be satisfied by the exception + A TestSnippet delegate + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Verifies that an async delegate throws a particular exception when called. The returned exception may be + when inside a multiple assert block. + + A constraint to be satisfied by the exception + A TestSnippet delegate + + + + Verifies that an async delegate throws a particular exception when called. The returned exception may be + when inside a multiple assert block. + + The exception Type expected + A TestDelegate + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Verifies that an async delegate throws a particular exception when called. The returned exception may be + when inside a multiple assert block. + + The exception Type expected + A TestDelegate + + + + Verifies that an async delegate throws a particular exception when called. The returned exception may be + when inside a multiple assert block. + + Type of the expected exception + A TestDelegate + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Verifies that an async delegate throws a particular exception when called. The returned exception may be + when inside a multiple assert block. + + Type of the expected exception + A TestDelegate + + + + Verifies that an async delegate throws an exception when called and returns it. The returned exception may + be when inside a multiple assert block. + + A TestDelegate + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Verifies that an async delegate throws an exception when called and returns it. The returned exception may + be when inside a multiple assert block. + + A TestDelegate + + + + Verifies that an async delegate throws an exception of a certain Type or one derived from it when called and + returns it. The returned exception may be when inside a multiple assert block. + + The expected Exception Type + A TestDelegate + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Verifies that an async delegate throws an exception of a certain Type or one derived from it when called and + returns it. The returned exception may be when inside a multiple assert block. + + The expected Exception Type + A TestDelegate + + + + Verifies that an async delegate throws an exception of a certain Type or one derived from it when called and + returns it. The returned exception may be when inside a multiple assert block. + + A TestDelegate + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Verifies that an async delegate throws an exception of a certain Type or one derived from it when called and + returns it. The returned exception may be when inside a multiple assert block. + + A TestDelegate + + + + Verifies that an async delegate does not throw an exception + + A TestDelegate + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Verifies that an async delegate does not throw an exception. + + A TestDelegate + + + + Verifies that a delegate throws a particular exception when called. The returned exception may be when inside a multiple assert block. + + A constraint to be satisfied by the exception + A TestSnippet delegate + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Verifies that a delegate throws a particular exception when called. The returned exception may be when inside a multiple assert block. + + A constraint to be satisfied by the exception + A TestSnippet delegate + + + + Verifies that a delegate throws a particular exception when called. The returned exception may be when inside a multiple assert block. + + The exception Type expected + A TestDelegate + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Verifies that a delegate throws a particular exception when called. The returned exception may be when inside a multiple assert block. + + The exception Type expected + A TestDelegate + + + + Verifies that a delegate throws a particular exception when called. The returned exception may be when inside a multiple assert block. + + Type of the expected exception + A TestDelegate + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Verifies that a delegate throws a particular exception when called. The returned exception may be when inside a multiple assert block. + + Type of the expected exception + A TestDelegate + + + + Verifies that a delegate throws an exception when called and returns it. The returned exception may be when inside a multiple assert block. + + A TestDelegate + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Verifies that a delegate throws an exception when called and returns it. The returned exception may be when inside a multiple assert block. + + A TestDelegate + + + + Verifies that a delegate throws an exception of a certain Type or one derived from it when called and + returns it. The returned exception may be when inside a multiple assert block. + + The expected Exception Type + A TestDelegate + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Verifies that a delegate throws an exception of a certain Type or one derived from it when called and + returns it. The returned exception may be when inside a multiple assert block. + + The expected Exception Type + A TestDelegate + + + + Verifies that a delegate throws an exception of a certain Type or one derived from it when called and + returns it. The returned exception may be when inside a multiple assert block. + + A TestDelegate + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Verifies that a delegate throws an exception of a certain Type or one derived from it when called and + returns it. The returned exception may be when inside a multiple assert block. + + A TestDelegate + + + + Verifies that a delegate does not throw an exception + + A TestDelegate + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Verifies that a delegate does not throw an exception. + + A TestDelegate + + + + Asserts that a condition is true. Returns without throwing an exception when inside a multiple assert block. + + The evaluated condition + The message to display if the condition is false + + + + + Asserts that a condition is true. Returns without throwing an exception when inside a multiple assert block. + + The evaluated condition + The message to display if the condition is false + + + + Asserts that a condition is true. Returns without throwing an exception when inside a multiple assert block. + + The evaluated condition + A function to build the message included with the Exception + + + + Asserts that a condition is true. Returns without throwing an exception when inside a multiple assert block. + + A lambda that returns a Boolean + The message to display if the condition is false + + + + Asserts that a condition is true. Returns without throwing an exception when inside a multiple assert block. + + A lambda that returns a Boolean + The message to display if the condition is false + + + + Asserts that a condition is true. Returns without throwing an exception when inside a multiple assert block. + + A lambda that returns a Boolean + A function to build the message included with the Exception + + + + Apply a constraint to a delegate. Returns without throwing an exception when inside a multiple assert block. + + The Type being compared. + An ActualValueDelegate returning the value to be tested + A Constraint expression to be applied + The message that will be displayed on failure + + + + Apply a constraint to a delegate. Returns without throwing an exception when inside a multiple assert block. + + The Type being compared. + An ActualValueDelegate returning the value to be tested + A Constraint expression to be applied + The message that will be displayed on failure + + + + Apply a constraint to a delegate. Returns without throwing an exception when inside a multiple assert block. + + The Type being compared. + An ActualValueDelegate returning the value to be tested + A Constraint expression to be applied + A function to build the message included with the Exception + + + + Apply a constraint to a delegate. Returns without throwing an exception when inside a multiple assert block. + + A TestDelegate to be executed + A Constraint expression to be applied + The message that will be displayed on failure + + + + Apply a constraint to a delegate. Returns without throwing an exception when inside a multiple assert block. + + A TestDelegate to be executed + A Constraint expression to be applied + The message that will be displayed on failure + + + + Apply a constraint to a delegate. Returns without throwing an exception when inside a multiple assert block. + + A TestDelegate to be executed + A Constraint expression to be applied + A function to build the message included with the Exception + + + + Apply a constraint to an actual value. Returns without throwing an exception when inside a multiple assert + block. + + The Type being compared. + The actual value to test + A Constraint expression to be applied + The message that will be displayed on failure + + + + Apply a constraint to an actual value. Returns without throwing an exception when inside a multiple assert + block. + + The Type being compared. + The actual value to test + A Constraint expression to be applied + The message that will be displayed on failure + + + + Apply a constraint to an actual value. Returns without throwing an exception when inside a multiple assert + block. + + The Type being compared. + The actual value to test + A Constraint expression to be applied + A function to build the message included with the Exception + + + + Apply a constraint to an actual value. Returns without throwing an exception when inside a multiple assert + block. Used as a synonym for That in rare cases where a private setter causes a Visual Basic compilation + error. + + + This method is provided for use by VB developers needing to test the value of properties with private + setters. + + The actual value to test + A Constraint expression to be applied + The message that will be displayed on failure + + + + Apply a constraint to an async delegate. Returns without throwing an exception when inside a multiple assert block. + + An AsyncTestDelegate to be executed + A Constraint expression to be applied + The message that will be displayed on failure + Awaitable. + + + + Apply a constraint to an async delegate. Returns without throwing an exception when inside a multiple assert block. + + An AsyncTestDelegate to be executed + A Constraint expression to be applied + The message that will be displayed on failure + Awaitable. + + + + Apply a constraint to an async delegate. Returns without throwing an exception when inside a multiple assert block. + + An async method to be executed + A Constraint expression to be applied + The message that will be displayed on failure + Awaitable. + + + + Apply a constraint to an async delegate. Returns without throwing an exception when inside a multiple assert block. + + An async method to be executed + A Constraint expression to be applied + The message that will be displayed on failure + Awaitable. + + + + Base class for different Assert, containing helper functions + + + + + Check if message comes with args, and convert that to a formatted string + + + + + Provides static methods to express the assumptions + that must be met for a test to give a meaningful + result. If an assumption is not met, the test + should produce an inconclusive result. + + + + + DO NOT USE! + The Equals method throws an InvalidOperationException. This is done + to make sure there is no mistake by calling this function. + + The left object. + The right object. + Not applicable + + + + DO NOT USE! + The ReferenceEquals method throws an InvalidOperationException. This is done + to make sure there is no mistake by calling this function. + + The left object. + The right object. + + + + Apply a constraint to an actual value, succeeding if the constraint + is satisfied and throwing an InconclusiveException on failure. + + The Type being compared. + An ActualValueDelegate returning the value to be tested + A Constraint expression to be applied + The message that will be displayed on failure + + + + Apply a constraint to an actual value, succeeding if the constraint + is satisfied and throwing an InconclusiveException on failure. + + The Type being compared. + An ActualValueDelegate returning the value to be tested + A Constraint expression to be applied + The message that will be displayed on failure + + + + Apply a constraint to an actual value, succeeding if the constraint + is satisfied and throwing an InconclusiveException on failure. + + The Type being compared. + An ActualValueDelegate returning the value to be tested + A Constraint expression to be applied + A function to build the message included with the Exception + + + + Asserts that a condition is true. If the condition is false, the method throws + an . + + The evaluated condition + The message to display if the condition is false + + + + Asserts that a condition is true. If the condition is false, the method throws + an . + + The evaluated condition + The message to display if the condition is false + + + + Asserts that a condition is true. If the condition is false, the method throws + an . + + The evaluated condition + A function to build the message included with the Exception + + + + Asserts that a condition is true. If the condition is false, the method throws + an . + + A lambda that returns a Boolean + The message to display if the condition is false + + + + Asserts that a condition is true. If the condition is false, the method throws + an . + + A lambda that returns a Boolean + The message to display if the condition is false + + + + Asserts that a condition is true. If the condition is false, the method throws + an . + + A lambda that returns a Boolean + A function to build the message included with the Exception + + + + Apply a constraint to an actual value, succeeding if the constraint + is satisfied and throwing an InconclusiveException on failure. + + The Type being compared. + The actual value to test + A Constraint expression to be applied + The message that will be displayed on failure + + + + Apply a constraint to an actual value, succeeding if the constraint + is satisfied and throwing an InconclusiveException on failure. + + The Type being compared. + The actual value to test + A Constraint expression to be applied + The message that will be displayed on failure + + + + Apply a constraint to an actual value, succeeding if the constraint + is satisfied and throwing an InconclusiveException on failure. + + The Type being compared. + The actual value to test + A Constraint expression to be applied + A function to build the message included with the Exception + + + + Marks a test as needing to be run in a particular threading apartment state. This will cause it + to run in a separate thread if necessary. + + + + + Construct an ApartmentAttribute + + The apartment state that this test must be run under. You must pass in a valid apartment state. + + + + Provides the author of a test or test fixture. + + + + + Initializes a new instance of the class. + + The name of the author. + + + + Initializes a new instance of the class. + + The name of the author. + The email address of the author. + + + + Applies a timeout in milliseconds to a test. + When applied to a method, the test's canvellation token is cancelled if the timeout is exceeded. + + + The user has to monitor this cancellation token. + + + + + Construct a CancelAfterAttribute given a time in milliseconds + + The timeout value in milliseconds + + + + Applies a category to a test + + + + + The name of the category + + + + + Construct attribute for a given category based on + a name. The name may not contain the characters ',', + '+', '-' or '!'. However, this is not checked in the + constructor since it would cause an error to arise at + as the test was loaded without giving a clear indication + of where the problem is located. The error is handled + in NUnitFramework.cs by marking the test as not + runnable. + + The name of the category + + + + Protected constructor uses the Type name as the name + of the category. + + + + + The name of the category + + + + + Modifies a test by adding a category to it. + + The test to modify + + + + Marks a test to use a combinatorial join of any argument data provided. + Since this is the default, the attribute is optional. + + + + + Default constructor + + + + + Marks a test as using a particular CombiningStrategy to join any supplied parameter data. + Since this is the default, the attribute is optional. + + + + + Construct a CombiningStrategyAttribute incorporating an + ICombiningStrategy and an IParameterDataProvider. + + Combining strategy to be used in combining data + An IParameterDataProvider to supply data + + + + Construct a CombiningStrategyAttribute incorporating an object + that implements ICombiningStrategy and an IParameterDataProvider. + This constructor is provided for CLS compliance. + + Combining strategy to be used in combining data + An IParameterDataProvider to supply data + + + + Builds any number of tests from the specified method and context. + + The MethodInfo for which tests are to be constructed. + The suite to which the tests will be added. + + + + Modify the test by adding the name of the combining strategy + to the properties. + + The test to modify + + + + Marks an assembly, test fixture or test method as applying to a specific Culture. + + + + + Constructor with no cultures specified, for use + with named property syntax. + + + + + Constructor taking one or more cultures + + Comma-delimited list of cultures + + + + Causes a test to be skipped if this CultureAttribute is not satisfied. + + The test to modify + + + + Tests to determine if the current culture is supported + based on the properties of this attribute. + + True, if the current culture is supported + + + + Test to determine if the a particular culture or comma- + delimited set of cultures is in use. + + Name of the culture or comma-separated list of culture ids + True if the culture is in use on the system + + + + Test to determine if one of a collection of cultures + is being used currently. + + + + + + + Marks a field for use as a datapoint when executing a theory within + the same fixture that requires an argument of the field's Type. + + + + + Marks a field, property or method as providing a set of datapoints for use + in executing any theories within the same fixture that require an argument of + the provided Type. The data source may provide an array of the required Type + or an . Synonymous with . + + + + + Marks a field, property or method as providing a set of datapoints for use + in executing any theories within the same fixture that require an argument + of the provided type. The data source may provide an array of the required + Type or an . Synonymous with . + + + + + Sets the tolerance used by default when checking the equality of floating point values + within the test assembly, fixture or method. + + + + + Construct specifying an amount + + + + + + Apply changes to the TestExecutionContext + + The TestExecutionContext + + + + Provides the descriptive text relating to the assembly, test fixture or test method. + + + + + Construct a description Attribute + + The text of the description + + + + Marks an assembly, test fixture or test method such that it will only run if explicitly + executed from the GUI, command line or included within a test filter. + The test will not be run simply because an enclosing suite is run. + + + + + Default constructor + + + + + Constructor with a reason + + The reason test is marked explicit + + + + Modifies a test by marking it as explicit. + + The test to modify + + + + Specify the life cycle of a Fixture + + + + + Construct a FixtureLifeCycleAttribute with a specified . + + + + + Defines the life cycle for this test fixture or assembly. + + + + + Overridden to set a TestFixture's . + + + + + Marks an assembly, test fixture or test method as being ignored. Ignored tests result in a warning message when the tests are run. + + + + + Constructs the attribute giving a reason for ignoring the test + + The reason for ignoring the test + + + + The date in the future to stop ignoring the test as a string in UTC time. + For example for a date and time, "2014-12-25 08:10:00Z" or for just a date, + "2014-12-25". If just a date is given, the Ignore will expire at midnight UTC. + + + Once the ignore until date has passed, the test will be marked + as runnable. Tests with an ignore until date will have an IgnoreUntilDate + property set which will appear in the test results. + + The string does not contain a valid string representation of a date and time. + + + + Modifies a test by marking it as Ignored. + + The test to modify + + + + Abstract base for attributes that are used to include tests in + the test run based on environmental settings. + + + + + Constructor with no included items specified, for use + with named property syntax. + + + + + Constructor taking one or more included items + + Comma-delimited list of included items + + + + Name of the item that is needed in order for + a test to run. Multiple items may be given, + separated by a comma. + + + + + Name of the item to be excluded. Multiple items + may be given, separated by a comma. + + + + + The reason for including or excluding the test + + + + + Sets the number of worker threads that may be allocated by the framework + for running tests. + + + + + Construct a LevelOfParallelismAttribute. + + The number of worker threads to be created by the framework. + + + + Specifies the life cycle for a test fixture. + + + + + A single instance is created and shared for all test cases. + + + + + A new instance is created for each test case. + + + + + Specifies the maximum time (in milliseconds) for a test case to succeed. + + + + + Construct a MaxTimeAttribute, given a time in milliseconds. + + The maximum elapsed time in milliseconds + + + + Marks tests that should NOT be run in parallel. + + + + + Construct a NonParallelizableAttribute. + + + + + Used by third-party frameworks, or other software, that reference + the NUnit framework but do not contain any tests. Applying the + attribute indicates that the assembly is not a test assembly and + may prevent errors if certain runners attempt to load the assembly. + Note that recognition of the attribute depends on each individual runner. + + + + + Abstract base class for all custom attributes defined by NUnit. + + + + + Default constructor + + + + + Identifies a method that is called once to perform setup before any child tests are run. + + + + + Identifies a method to be called once after all the child tests have run. + The method is guaranteed to be called, even if an exception is thrown. + + + + + Defines the order that the test will run in + + + + + Defines the order that the test will run in + + + + + Defines the order that the test will run in + + + + + + Modifies a test as defined for the specific attribute. + + The test to modify + + + + Modifies a test suite as defined for the specific attribute. + + The test suite to modify + + + + Marks an assembly, test fixture or test method as applying to a specific platform. + + + + + Converts one or more .NET 5+ OSPlatformAttributes into a single NUnit PlatformAttribute + + The type we want the attributes from. + All attributes with OSPlatformAttributes translated into PlatformAttributes. + + + + Marks a test as using a pairwise join of any supplied argument data. Arguments will be + combined in such a way that all possible pairs of arguments are used. + + + + + Default constructor + + + + + Marks a test assembly, fixture or method that may be run in parallel. + + + + + Construct a ParallelizableAttribute using default ParallelScope.Self. + + + + + Construct a ParallelizableAttribute with a specified scope. + + The ParallelScope associated with this attribute. + + + + Defines the degree to which this test and its descendants may be run in parallel + + + + + Overridden to check for invalid combinations of settings + + + + + + Modify the context to be used for child tests + + The current TestExecutionContext + + + + Specifies the degree to which a test, and its descendants, + may be run in parallel. + + + + + No ParallelScope was specified on the test + + + + + The test may be run in parallel with others at the same level. + Valid on classes and methods but has no effect on assemblies. + + + + + Test may not be run in parallel with any others. Valid on + classes and methods but not assemblies. + + + + + Mask used to extract the flags that apply to the item on which a + ParallelizableAttribute has been placed, as opposed to descendants. + + + + + Descendants of the test may be run in parallel with one another. + Valid on assemblies and classes but not on non-parameterized methods. + + + + + Descendants of the test down to the level of TestFixtures may be + run in parallel with one another. Valid on assemblies and classes + but not on methods. + + + + + Mask used to extract all the flags that impact descendants of a + test and place them in the TestExecutionContext. + + + + + The test and its descendants may be run in parallel with others at + the same level. Valid on classes and parameterized methods. + For assemblies it is recommended to use + instead, as has no effect on assemblies. + + + + + Marks an assembly, test fixture or test method as applying to a specific platform. + + + + + Constructor with no platforms specified, for use + with named property syntax. + + + + + Constructor taking one or more platforms + + Comma-delimited list of platforms + + + + Causes a test to be skipped if this PlatformAttribute is not satisfied. + + The test to modify + + + + Attaches information to a test assembly, fixture or method as a name/value pair. + + + + + Construct a PropertyAttribute with a name and string value + + The name of the property + The property value + + + + Construct a PropertyAttribute with a name and int value + + The name of the property + The property value + + + + Construct a PropertyAttribute with a name and double value + + The name of the property + The property value + + + + Constructor for derived classes that set the + property dictionary directly. + + + + + Constructor for use by derived classes that use the + name of the type as the property name. Derived classes + must ensure that the Type of the property value is + a standard type supported by the BCL. Any custom + types will cause a serialization Exception when + in the client. + + + + + Gets the property dictionary for this attribute + + + + + Modifies a test by adding properties to it. + + The test to modify + + + + Supplies a set of random values to a single parameter of a parameterized test. + + + + + If true, no value will be repeated. + + + + + Construct a random set of values appropriate for the Type of the + parameter on which the attribute appears, specifying only the count. + + + + + + Generates values within a specified range. + + + + + Generates values within a specified range. + + + + + Generates values within a specified range. + + + + + Generates values within a specified range. + + + + + Generates values within a specified range. + + + + + Generates values within a specified range. + + + + + Generates values within a specified range. + + + + + Generates values within a specified range. + + + + + Generates values within a specified range. + + + + + Generates values within a specified range. + + + + + Retrieves a list of arguments which can be passed to the specified parameter. + + The parameter of a parameterized test. + + + + Supplies a range of values to an individual parameter of a parameterized test. + + + + + Constructs a range of values using the default step of 1. + + + + + Constructs a range of values with the specified step size. + + + + + Constructs a range of values using the default step of 1. + + + + + Constructs a range of values with the specified step size. + + + + + Constructs a range of values using a default step of 1. + + + + + Constructs a range of values with the specified step size. + + + + + Constructs a range of values using the default step of 1. + + + + + Constructs a range of values with the specified step size. + + + + + Constructs a range of values with the specified step size. + + + + + Constructs a range of values with the specified step size. + + + + + Retrieves a list of arguments which can be passed to the specified parameter. + + The parameter of a parameterized test. + + + Returns a string that represents the current object. + + + + Specifies that a test should be run multiple times. + + + + + Construct a RepeatAttribute + + The number of times to run the test + + + + Wrap a command and return the result. + + The command to be wrapped + The wrapped command + + + + The test command for the RepeatAttribute + + + + + Initializes a new instance of the class. + + The inner command. + The number of repetitions + + + + Runs the test, saving a TestResult in the supplied TestExecutionContext. + + The context in which the test should run. + A TestResult + + + + Marks a test that must run on a separate thread. + + + + + Construct a RequiresThreadAttribute + + + + + Construct a RequiresThreadAttribute, specifying the apartment + + + + + Specifies that a test method should be rerun on failure up to the specified + maximum number of times. + + + + + Construct a + + The maximum number of times the test should be run if it fails + + + + Wrap a command and return the result. + + The command to be wrapped + The wrapped command + + + + The test command for the + + + + + Initializes a new instance of the class. + + The inner command. + The maximum number of repetitions + + + + Runs the test, saving a TestResult in the supplied TestExecutionContext. + + The context in which the test should run. + A TestResult + + + + Marks a test to use a sequential join of any provided argument data. + Arguments will be combined into test cases, taking the next value of + each argument until all are used. + + + + + Default constructor + + + + + Sets the current Culture on an assembly, test fixture or test method for + the duration of a test. The culture remains set until the test or fixture + completes and is then reset to its original value. + + + + + + Construct given the name of a culture + + + + + + Sets the current UI Culture on an assembly, test fixture or test method + for the duration of a test. The UI culture remains set until the test or + fixture completes and is then reset to its original value. + + + + + + Construct given the name of a culture + + + + + + Identifies a method to be called immediately before each test is run. + + + + + Identifies a class as containing or + methods for all the test fixtures + under a given namespace. + + + + + Builds a from the specified type. + + The type info of the fixture to be used. + + + + Marks a test fixture as requiring all child tests to be run on the + same thread as the OneTimeSetUp and OneTimeTearDown. A flag in the + is set forcing all child tests + to be run sequentially on the current thread. + Any setting is ignored. + + + + + Apply changes to the TestExecutionContext + + The TestExecutionContext + + + + Identifies a method to be called immediately after each test is run. + The method is guaranteed to be called, even if an exception is thrown. + + + + + Abstract attribute providing actions to execute before and after tests. + + + + + Executed before each test is run + + The test that is going to be run. + + + + Executed after each test is run + + The test that has just been run. + + + + Provides the target for the action attribute + + + + + Marks a test assembly as needing a special assembly resolution hook that will + explicitly search the test assembly's directory for dependent assemblies. + This works around a conflict between mixed-mode assembly initialization and + tests running in their own AppDomain in some cases. + + + + + Marks the method as callable from the NUnit test runner. + + + + [TestFixture] + public class Fixture + { + [Test] + public void MethodToTest() + {} + + [Test(Description = "more detailed description")] + public void TestDescriptionMethod() + {} + } + + + + + + Descriptive text for this test + + + + + The author of this test + + + + + The type that this test is testing + + + + + Gets or sets the expected result. Not valid if the test + method has parameters. + + The result. + + + + Modifies a test by adding a description, if not already set. + + The test to modify + + + + Builds a single test from the specified method and context. + + The method for which a test is to be constructed. + The suite to which the test will be added. + + + + Marks a method as a parameterized test suite and provides arguments for each test case. + + + + + Construct a TestCaseAttribute with a list of arguments. + This constructor is not CLS-Compliant + + + + + + Construct a TestCaseAttribute with a single argument + + + + + + Construct a TestCaseAttribute with a two arguments + + + + + + + Construct a TestCaseAttribute with a three arguments + + + + + + + + Gets or sets the name of the test. + + The name of the test. + + + + Gets or sets the RunState of this test case. + + + + + Gets the list of arguments to a test case + + + + + Gets the properties of the test case + + + + + Gets or sets the expected result. + + The result. + + + + Returns true if the expected result has been set + + + + + Gets or sets the description. + + The description. + + + + The author of this test + + + + + The type that this test is testing + + + + + Gets or sets the reason for ignoring the test + + + + + Gets or sets a value indicating whether this is explicit. + + + if explicit; otherwise, . + + + + + Gets or sets the reason for not running the test. + + The reason. + + + + Gets or sets the ignore reason. When set to a non-null + non-empty value, the test is marked as ignored. + + The ignore reason. + + + + Comma-delimited list of platforms to run the test for + + + + + Comma-delimited list of platforms to not run the test for + + + + + Gets and sets the category for this test case. + May be a comma-separated list of categories. + + + + + Gets and sets the ignore until date for this test case. + + + + + Performs several special conversions allowed by NUnit in order to + permit arguments with types that cannot be used in the constructor + of an Attribute such as TestCaseAttribute or to simplify their use. + + The arguments to be converted + The ParameterInfo array for the method + + + + Builds a single test from the specified method and context. + + The MethodInfo for which tests are to be constructed. + The suite to which the tests will be added. + + + + Indicates the source to be used to provide test fixture instances for a test class. + + The name parameter is a representing the name of the source used to provide test cases. It has the following characteristics: + It must be a static field, property, or method in the same class as the test case. + It must return an or a type that implements , such as an array, a List, or your own iterator. + Each item returned by the enumerator must be compatible with the signature of the method on which the attribute appears. + + + + + + Construct with the name of the method, property or field that will provide data + + The name of a static method, property or field that will provide data. + + + + Construct with a Type and name + + The Type that will provide data + The name of a static method, property or field that will provide data. + A set of parameters passed to the method, works only if the Source Name is a method. + If the source name is a field or property has no effect. + + + + Construct with a Type and name + + The Type that will provide data + The name of a static method, property or field that will provide data. + + + + Construct with a name + + The name of a static method, property or field that will provide data. + A set of parameters passed to the method, works only if the Source Name is a method. + If the source name is a field or property has no effect. + + + + Construct with a Type + + The type that will provide data + + + + A set of parameters passed to the method, works only if the Source Name is a method. + If the source name is a field or property has no effect. + + + + + The name of a the method, property or field to be used as a source + + + + + A Type to be used as a source + + + + + Gets or sets the category associated with every fixture created from + this attribute. May be a single category or a comma-separated list. + + + + + Builds any number of tests from the specified method and context. + + The IMethod for which tests are to be constructed. + The suite to which the tests will be added. + + + + Marks the class as a TestFixture. + + + + + Default constructor + + + + + Construct with a object[] representing a set of arguments. + The arguments may later be separated into type arguments and constructor arguments. + + + + + + Gets or sets the name of the test. + + The name of the test. + + + + Gets or sets the RunState of this test fixture. + + + + + The arguments originally provided to the attribute + + + + + Properties pertaining to this fixture + + + + + Get or set the type arguments. If not set + explicitly, any leading arguments that are + Types are taken as type arguments. + + + + + Descriptive text for this fixture + + + + + The author of this fixture + + + + + The type that this fixture is testing + + + + + Gets or sets the ignore reason. May set RunState as a side effect. + + The ignore reason. + + + + Gets or sets the reason for not running the fixture. + + The reason. + + + + Gets or sets the ignore reason. When set to a non-null + non-empty value, the test is marked as ignored. + + The ignore reason. + + + + Gets or sets a value indicating whether this is explicit. + + + if explicit; otherwise, . + + + + + Gets and sets the category for this fixture. + May be a comma-separated list of categories. + + + + + Builds a single test fixture from the specified type. + + + + + Builds a single test fixture from the specified type. + + The type info of the fixture to be used. + Filter used to select methods as tests. + + + + Identifies the source used to provide test fixture instances for a test class. + + + + + Error message string is public so the tests can use it + + + + + Construct with the name of the method, property or field that will provide data + + The name of a static method, property or field that will provide data. + + + + Construct with a Type and name + + The Type that will provide data + The name of a static method, property or field that will provide data. + + + + Construct with a Type + + The type that will provide data + + + + The name of a the method, property or field to be used as a source + + + + + A Type to be used as a source + + + + + Gets or sets the category associated with every fixture created from + this attribute. May be a single category or a comma-separated list. + + + + + Builds any number of test fixtures from the specified type. + + The TypeInfo for which fixtures are to be constructed. + + + + Builds any number of test fixtures from the specified type. + + The TypeInfo for which fixtures are to be constructed. + PreFilter used to select methods as tests. + + + + Returns a set of ITestFixtureData items for use as arguments + to a parameterized test fixture. + + The type for which data is needed. + + + + + Indicates the method or class the assembly, test fixture or test method is testing. + + + + + Initializes a new instance of the class. + + The type that is being tested. + + + + Initializes a new instance of the class. + + The type that is being tested. + + + + Adding this attribute to a method within a + class makes the method callable from the NUnit test runner. There is a property + called Description which is optional which you can provide a more detailed test + description. This class cannot be inherited. + + + + [TestFixture] + public class Fixture + { + [Test] + public void MethodToTest() + {} + + [Test(Description = "more detailed description")] + public void TestDescriptionMethod() + {} + } + + + + + + Construct the attribute, specifying a combining strategy and source of parameter data. + + + + + Applies a timeout in milliseconds to a test. + When applied to a method, the test is cancelled if the timeout is exceeded. + When applied to a class or assembly, the default timeout is set for all contained test methods. + + + + + Construct a TimeoutAttribute given a time in milliseconds + + The timeout value in milliseconds + + + + Provides literal arguments for an individual parameter of a test. + + + + + The collection of data to be returned. Must + be set by any derived attribute classes. + We use an object[] so that the individual + elements may have their type changed in GetData + if necessary + + + + + Constructs for use with an Enum parameter. Will pass every enum + value in to the test. + + + + + Construct with one argument + + + + + + Construct with two arguments + + + + + + + Construct with three arguments + + + + + + + + Construct with an array of arguments + + + + + + Retrieves a list of arguments which can be passed to the specified parameter. + + The parameter of a parameterized test. + + + + To generate data for Values attribute, in case no data is provided. + + + + + To Check if type is nullable enum. + + + + + Indicates the source used to provide data for one parameter of a test method. + + + + + Construct with the name of the factory - for use with languages + that don't support params arrays. + + The name of a static method, property or field that will provide data. + + + + Construct with a Type and name - for use with languages + that don't support params arrays. + + The Type that will provide data + The name of a static method, property or field that will provide data. + + + + The name of a the method, property or field to be used as a source + + + + + A Type to be used as a source + + + + + Retrieves a list of arguments which can be passed to the specified parameter. + + The parameter of a parameterized test. + + + + AllItemsConstraint applies another constraint to each + item in a collection, succeeding if they all succeed. + + + + + Construct an AllItemsConstraint on top of an existing constraint + + + + + + The display name of this Constraint for use by ToString(). + The default value is the name of the constraint with + trailing "Constraint" removed. Derived classes may set + this to another name in their constructors. + + + + + Apply the item constraint to each item in the collection, + failing if any item fails. + + + + + + + AndConstraint succeeds only if both members succeed. + + + + + Create an AndConstraint from two other constraints + + The first constraint + The second constraint + + + + Gets text describing a constraint + + + + + Apply both member constraints to an actual value, + succeeding only if both of them succeed. + + The actual value + True if the constraints both succeeded + + + + Write the actual value for a failing constraint test to a + MessageWriter. The default implementation simply writes + the raw value of actual, leaving it to the writer to + perform any formatting. + + The writer on which the actual value is displayed + + + + is used to determine whether the value is equal to any of the expected values. + + + + + Construct a + + Collection of expected values + + + + The Description of what this constraint tests, for + use in messages and in the ConstraintResult. + + + + + + + + Test whether item is present in expected collection + + Actual item type + Actual item + + + + Flag the constraint to ignore case and return self. + + + + + Flag the constraint to use the supplied IComparer object. + + The IComparer object to use. + + + + Flag the constraint to use the supplied IComparer object. + + The IComparer object to use. + + + + Flag the constraint to use the supplied Comparison object. + + The Comparison object to use. + + + + Flag the constraint to use the supplied IEqualityComparer object. + + The IEqualityComparer object to use. + + + + Flag the constraint to use the supplied IEqualityComparer object. + + The IComparer object to use. + + + + Flag the constraint to use the supplied boolean-returning delegate. + + The supplied boolean-returning delegate to use. + + + + AssignableFromConstraint is used to test that an object + can be assigned from a given Type. + + + + + Construct an AssignableFromConstraint for the type provided + + + + + + Apply the constraint to an actual value, returning true if it succeeds + + The actual argument + True if the constraint succeeds, otherwise false. + + + + AssignableToConstraint is used to test that an object + can be assigned to a given Type. + + + + + Construct an AssignableToConstraint for the type provided + + + + + + Apply the constraint to an actual value, returning true if it succeeds + + The actual argument + True if the constraint succeeds, otherwise false. + + + + AttributeConstraint tests that a specified attribute is present + on a Type or other provider and that the value of the attribute + satisfies some other constraint. + + + + + Constructs an AttributeConstraint for a specified attribute + Type and base constraint. + + + + + + + Determines whether the Type or other provider has the + expected attribute and if its value matches the + additional constraint specified. + + + + + Returns a string representation of the constraint. + + + + + AttributeExistsConstraint tests for the presence of a + specified attribute on a Type. + + + + + Constructs an AttributeExistsConstraint for a specific attribute Type + + + + + + The Description of what this constraint tests, for + use in messages and in the ConstraintResult. + + + + + Tests whether the object provides the expected attribute. + + A Type, MethodInfo, or other ICustomAttributeProvider + True if the expected attribute is present, otherwise false + + + + BinaryConstraint is the abstract base of all constraints + that combine two other constraints in some fashion. + + + + + The first constraint being combined + + + + + The second constraint being combined + + + + + Construct a BinaryConstraint from two other constraints + + The first constraint + The second constraint + + + + CollectionConstraint is the abstract base class for + constraints that operate on collections. + + + + + Construct an empty CollectionConstraint + + + + + Construct a CollectionConstraint + + + + + + Determines whether the specified enumerable is empty. + + The enumerable. + + if the specified enumerable is empty; otherwise, . + + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + True for success, false for failure + + + + Protected method to be implemented by derived classes + + + + + + + CollectionEquivalentConstraint is used to determine whether two + collections are equivalent. + + + + Construct a CollectionEquivalentConstraint + Expected collection. + + + + The display name of this Constraint for use by ToString(). + The default value is the name of the constraint with + trailing "Constraint" removed. Derived classes may set + this to another name in their constructors. + + + + + The Description of what this constraint tests, for + use in messages and in the ConstraintResult. + + + + + Test whether two collections are equivalent + + + + + + + + Test whether the collection is equivalent to the expected. + + + Actual collection type. + + + Actual collection to compare. + + + A indicating whether or not + the two collections are equivalent. + + + + + Flag the constraint to use the supplied predicate function + + The comparison function to use. + Self. + + + Provides a for the . + + + Result of a of the collections to compare for equivalence. + + + Construct a using a . + Source . + Result of the collection comparison. + Actual collection to compare. + Whether or not the succeeded. + + + Write any additional lines (following Expected: and But was:) for a failing constraint. + The to write the failure message to. + + + + CollectionItemsEqualConstraint is the abstract base class for all + collection constraints that apply some notion of item equality + as a part of their operation. + + + + + The NUnitEqualityComparer in use for this constraint + + + + + Construct an empty CollectionConstraint + + + + + Construct a CollectionConstraint + + + + + + Get a flag indicating whether the user requested us to ignore case. + + + + + Get a flag indicating whether any external comparers are in use. + + + + + Flag the constraint to ignore case and return self. + + + + + Flag the constraint to use the supplied IComparer object. + + The IComparer object to use. + + + + Flag the constraint to use the supplied IComparer object. + + The IComparer object to use. + + + + Flag the constraint to use the supplied Comparison object. + + The Comparison object to use. + + + + Flag the constraint to use the supplied IEqualityComparer object. + + The IComparer object to use. + + + + Flag the constraint to use the supplied IEqualityComparer object. + + The IComparer object to use. + + + + Flag the constraint to use the supplied boolean-returning delegate. + + The supplied boolean-returning delegate to use. + + + + Compares two collection members for equality + + + + + Return a new CollectionTally for use in making tests + + The collection to be included in the tally + + + + CollectionOrderedConstraint is used to test whether a collection is ordered. + + + + + Construct a CollectionOrderedConstraint + + + + + The display name of this Constraint for use by ToString(). + The default value is the name of the constraint with + trailing "Constraint" removed. Derived classes may set + this to another name in their constructors. + + + + + If used performs a default ascending comparison + + + + + If used performs a reverse comparison + + + + + Modifies the constraint to use an and returns self. + + + + + Modifies the constraint to use an and returns self. + + + + + Modifies the constraint to use a and returns self. + + + + + Modifies the constraint to test ordering by the value of + a specified property and returns self. + + + + + Then signals a break between two ordering steps + + + + + The Description of what this constraint tests, for + use in messages and in the ConstraintResult. + + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + True for success, false for failure + + + + Test whether the collection is ordered + + + + + Returns the string representation of the constraint. + + + + + + An OrderingStep represents one stage of the sort + + + + + Constructor for success result. + + The Constraint to which this result applies. + The actual value to which the Constraint was applied. + + + + Constructor for failure result. + + The Constraint to which this result applies. + The actual value to which the Constraint was applied. + Index at which collection order breaks. + Value at which collection order breaks. + + + + CollectionSubsetConstraint is used to determine whether + one collection is a subset of another + + + + + Construct a CollectionSubsetConstraint + + The collection that the actual value is expected to be a subset of + + + + The display name of this Constraint for use by ToString(). + The default value is the name of the constraint with + trailing "Constraint" removed. Derived classes may set + this to another name in their constructors. + + + + + The Description of what this constraint tests, for + use in messages and in the ConstraintResult. + + + + + Test whether the actual collection is a subset of + the expected collection provided. + + + + + + + Test whether the constraint is satisfied by a given value. + + + + + Flag the constraint to use the supplied predicate function + + The comparison function to use. + Self. + + + + CollectionSupersetConstraint is used to determine whether + one collection is a superset of another + + + + + Construct a CollectionSupersetConstraint + + The collection that the actual value is expected to be a superset of + + + + The display name of this Constraint for use by ToString(). + The default value is the name of the constraint with + trailing "Constraint" removed. Derived classes may set + this to another name in their constructors. + + + + + The Description of what this constraint tests, for + use in messages and in the ConstraintResult. + + + + + Test whether the actual collection is a superset of + the expected collection provided. + + + + + + + Test whether the constraint is satisfied by a given value. + + + + + Flag the constraint to use the supplied predicate function + + The comparison function to use. + Self. + + + counts (tallies) the number of occurrences + of each object in one or more enumerations. + + + The result of a . + + + Items that were not in the expected collection. + + + Items that were not accounted for in the expected collection. + + + Initializes a new instance of the class with the given fields. + + + The result of the comparison between the two collections. + + + Construct a CollectionTally object from a comparer and a collection. + The comparer to use for equality. + The expected collection to compare against. + + + Try to remove an object from the tally. + The object to remove. + + + Try to remove a set of objects from the tally. + The objects to remove. + + + + Comparator for two s. + + + + + Comparator for two s. + + + + + Flag indicating whether or not this is the top level comparison. + + + + + A list of tracked comparisons + + + + + Comparator for two s. + + + + + Comparator for two s. + + + + + Comparator for two s. + + + + + Comparator for two s. + + + + + Comparator for two s. + + + + + Comparator for two s. + + + + + Result of the Equal comparison method. + + + + + Method does not support the instances being compared. + + + + + Method is appropriate for the data types, but doesn't support the specified tolerance. + + + + + Method is appropriate and the items are considered equal. + + + + + Method is appropriate and the items are consisdered different. + + + + + Comparator for a type that overrides Equals + + + + + Comparator for two types related by . + + + + + Comparator for two s. + + + + + Comparator for two s. + + + + + Comparator for two instances of the same type, comparing each property. + + + + + Comparator for two s. + + + + + Comparator for two s. + + + + + Comparator for two types related by . + + + + + Comparator for two s or s. + + + + + Comparator for two Tuples. + + + + + Base class for comparators for tuples (both regular Tuples and ValueTuples). + + + + + Comparator for two ValueTuples. + + + + + ComparisonAdapter class centralizes all comparisons of + values in NUnit, adapting to the use of any provided + , + or . + + + + + Gets the default ComparisonAdapter, which wraps an + NUnitComparer object. + + + + + Returns a ComparisonAdapter that wraps an + + + + + Returns a ComparisonAdapter that wraps an + + + + + Returns a ComparisonAdapter that wraps a + + + + + Compares two objects + + + + + Construct a default ComparisonAdapter + + + + + Construct a ComparisonAdapter for an + + + + + Compares two objects + + + + + + + + ComparerAdapter extends and + allows use of an or + to actually perform the comparison. + + + + + Construct a ComparisonAdapter for an + + + + + Compare a Type T to an object + + + + + Construct a ComparisonAdapter for a + + + + + Compare a Type T to an object + + + + + Abstract base class for constraints that compare values to + determine if one is greater than, equal to or less than + the other. + + + + + The value against which a comparison is to be made + + + + + Tolerance used in making the comparison + + + + + ComparisonAdapter to be used in making the comparison + + + + + Initializes a new instance of the class. + + The value against which to make a comparison. + The text indicating the type of comparison. + + + + The Description of what this constraint tests, for + use in messages and in the ConstraintResult. + + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + A ConstraintResult + + + + Protected function overridden by derived class to actually perform the comparison + + + + + Modifies the constraint to use an and returns self + + The comparer used for comparison tests + A constraint modified to use the given comparer + + + + Modifies the constraint to use an and returns self + + The comparer used for comparison tests + A constraint modified to use the given comparer + + + + Modifies the constraint to use a and returns self + + The comparer used for comparison tests + A constraint modified to use the given comparer + + + + Set the tolerance for use in this comparison + + + + + Switches the .Within() modifier to interpret its tolerance as + a percentage that the actual values is allowed to deviate from + the expected value. + + Self + + + + Provides standard description of what the constraint tests + based on comparison text. + + Describes the comparison being tested, throws + if null + Is thrown when null passed to a method + + + + Delegate used to delay evaluation of the actual value + to be used in evaluating a constraint + + + + + The Constraint class is the base of all built-in constraints + within NUnit. It provides the operator overloads used to combine + constraints. + + + + + Construct a constraint with optional arguments + + Arguments to be saved + + + + The display name of this Constraint for use by ToString(). + The default value is the name of the constraint with + trailing "Constraint" removed. Derived classes may set + this to another name in their constructors. + + + + + + + + Arguments provided to this Constraint, for use in + formatting the description. + + + + + The ConstraintBuilder holding this constraint + + + + + Applies the constraint to an actual value, returning a ConstraintResult. + + The value to be tested + A ConstraintResult + + + + Applies the constraint to an ActualValueDelegate that returns + the value to be tested. The default implementation simply evaluates + the delegate but derived classes may override it to provide for + delayed processing. + + An ActualValueDelegate + A ConstraintResult + + + + Test whether the constraint is satisfied by a given reference. + The default implementation simply dereferences the value but + derived classes may override it to provide for delayed processing. + + A reference to the value to be tested + A ConstraintResult + + + + Retrieves the value to be tested from an ActualValueDelegate. + The default implementation simply evaluates the delegate but derived + classes may override it to provide for delayed processing. + + An ActualValueDelegate + Delegate evaluation result + + + + Default override of ToString returns the constraint DisplayName + followed by any arguments within angle brackets. + + + + + + Returns the string representation of this constraint and the passed in arguments + + + + + Returns the string representation of this constraint + + + + + This operator creates a constraint that is satisfied only if both + argument constraints are satisfied. + + + + + This operator creates a constraint that is satisfied if either + of the argument constraints is satisfied. + + + + + This operator creates a constraint that is satisfied if the + argument constraint is not satisfied. + + + + + Returns a ConstraintExpression by appending And + to the current constraint. + + + + + Returns a ConstraintExpression by appending And + to the current constraint. + + + + + Returns a ConstraintExpression by appending Or + to the current constraint. + + + + + Returns a DelayedConstraint.WithRawDelayInterval with the specified delay time. + + The delay, which defaults to milliseconds. + + + + + Returns a DelayedConstraint with the specified delay time + and polling interval. + + The delay in milliseconds. + The interval at which to test the constraint. + + + + + Resolves any pending operators and returns the resolved constraint. + + + + + ConstraintBuilder maintains the stacks that are used in + processing a ConstraintExpression. An OperatorStack + is used to hold operators that are waiting for their + operands to be reorganized. a ConstraintStack holds + input constraints as well as the results of each + operator applied. + + + + + OperatorStack is a type-safe stack for holding ConstraintOperators + + + + + Initializes a new instance of the class. + + + + + Gets a value indicating whether this is empty. + + if empty; otherwise, . + + + + Gets the topmost operator without modifying the stack. + + + + + Pushes the specified operator onto the stack. + + The operator to put onto the stack. + + + + Pops the topmost operator from the stack. + + The topmost operator on the stack + + + + ConstraintStack is a type-safe stack for holding Constraints + + + + + Initializes a new instance of the class. + + The ConstraintBuilder using this stack. + + + + Gets a value indicating whether this is empty. + + if empty; otherwise, . + + + + Pushes the specified constraint. As a side effect, + the constraint's Builder field is set to the + ConstraintBuilder owning this stack. + + The constraint to put onto the stack + + + + Pops this topmost constraint from the stack. + As a side effect, the constraint's Builder + field is set to null. + + The topmost constraint on the stack + + + + Initializes a new instance of the class. + + + + + Appends the specified operator to the expression by first + reducing the operator stack and then pushing the new + operator on the stack. + + The operator to push. + + + + Appends the specified constraint to the expression by pushing + it on the constraint stack. + + The constraint to push. + + + + Sets the top operator right context. + + The right context. + + + + Reduces the operator stack until the topmost item + precedence is greater than or equal to the target precedence. + + The target precedence. + + + + Resolves this instance, returning a Constraint. If the Builder + is not currently in a resolvable state, an exception is thrown. + + The resolved constraint + + + + Gets a value indicating whether this instance is resolvable. + + + if this instance is resolvable; otherwise, . + + + + + ConstraintExpression represents a compound constraint in the + process of being constructed from a series of syntactic elements. + + Individual elements are appended to the expression as they are + reorganized. When a constraint is appended, it is returned as the + value of the operation so that modifiers may be applied. However, + any partially built expression is attached to the constraint for + later resolution. When an operator is appended, the partial + expression is returned. If it's a self-resolving operator, then + a ResolvableConstraintExpression is returned. + + + + + The ConstraintBuilder holding the elements recognized so far + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the + class passing in a ConstraintBuilder, which may be pre-populated. + + The builder. + + + + Returns a string representation of the expression as it + currently stands. This should only be used for testing, + since it has the side-effect of resolving the expression. + + + + + + Appends an operator to the expression and returns the + resulting expression itself. + + + + + Appends a self-resolving operator to the expression and + returns a new ResolvableConstraintExpression. + + + + + Appends a constraint to the expression and returns that + constraint, which is associated with the current state + of the expression being built. Note that the constraint + is not reduced at this time. For example, if there + is a NotOperator on the stack we don't reduce and + return a NotConstraint. The original constraint must + be returned because it may support modifiers that + are yet to be applied. + + + + + Returns a ConstraintExpression that negates any + following constraint. + + + + + Returns a ConstraintExpression that negates any + following constraint. + + + + + Returns a ConstraintExpression, which will apply + the following constraint to all members of a collection, + succeeding if all of them succeed. + + + + + Returns a ConstraintExpression, which will apply + the following constraint to all members of a collection, + succeeding if at least one of them succeeds. + + + + + Returns a ConstraintExpression, which will apply + the following constraint to all members of a collection, + succeeding if all of them fail. + + + + + Returns a ConstraintExpression, which will apply + the following constraint to all members of a collection, + succeeding only if a specified number of them succeed. + + + + + Returns a , which will + apply the following constraint to a collection of length one, succeeding + only if exactly one of them succeeds. + + + + + Returns a new PropertyConstraintExpression, which will either + test for the existence of the named property on the object + being tested or apply any following constraint to that property. + + + + + Returns a new ConstraintExpression, which will apply the following + constraint to the Length property of the object being tested. + + + + + Returns a new ConstraintExpression, which will apply the following + constraint to the Count property of the object being tested. + + + + + Returns a new ConstraintExpression, which will apply the following + constraint to the Message property of the object being tested. + + + + + Returns a new ConstraintExpression, which will apply the following + constraint to the InnerException property of the object being tested. + + + + + Returns a new AttributeConstraint checking for the + presence of a particular attribute on an object. + + + + + Returns a new AttributeConstraint checking for the + presence of a particular attribute on an object. + + + + + With is currently a NOP - reserved for future use. + + + + + Returns the constraint provided as an argument - used to allow custom + custom constraints to easily participate in the syntax. + + + + + Returns the constraint provided as an argument - used to allow custom + custom constraints to easily participate in the syntax. + + + + + Returns a constraint that tests for null + + + + + Returns a constraint that tests for default value + + + + + Returns a constraint that tests for True + + + + + Returns a constraint that tests for False + + + + + Returns a constraint that tests for a positive value + + + + + Returns a constraint that tests for a negative value + + + + + Returns a constraint that tests if item is equal to zero + + + + + Returns a constraint that tests for NaN + + + + + Returns a constraint that tests for empty + + + + + Returns a constraint that tests whether a collection + contains all unique items. + + + + + Returns a constraint that tests whether an object graph is serializable in XML format. + + + + + Returns a constraint that tests two items for equality + + + + + Returns a constraint that tests that two references are the same object + + + + + Returns a constraint that tests whether the + actual value is greater than the supplied argument + + + + + Returns a constraint that tests whether the + actual value is greater than or equal to the supplied argument + + + + + Returns a constraint that tests whether the + actual value is greater than or equal to the supplied argument + + + + + Returns a constraint that tests whether the + actual value is less than the supplied argument + + + + + Returns a constraint that tests whether the + actual value is less than or equal to the supplied argument + + + + + Returns a constraint that tests whether the + actual value is less than or equal to the supplied argument + + + + + Returns a constraint that tests whether the actual + value is of the exact type supplied as an argument. + + + + + Returns a constraint that tests whether the actual + value is of the exact type supplied as an argument. + + + + + Returns a constraint that tests whether the actual value + is of the type supplied as an argument or a derived type. + + + + + Returns a constraint that tests whether the actual value + is of the type supplied as an argument or a derived type. + + + + + Returns a constraint that tests whether the actual value + is assignable from the type supplied as an argument. + + + + + Returns a constraint that tests whether the actual value + is assignable from the type supplied as an argument. + + + + + Returns a constraint that tests whether the actual value + is assignable from the type supplied as an argument. + + + + + Returns a constraint that tests whether the actual value + is assignable from the type supplied as an argument. + + + + + Returns a constraint that tests whether the actual value + is a collection containing the same elements as the + collection supplied as an argument. + + + + + Returns a constraint that tests whether the actual value + is a subset of the collection supplied as an argument. + + + + + Returns a constraint that tests whether the actual value + is a superset of the collection supplied as an argument. + + + + + Returns a constraint that tests whether a collection is ordered + + + + + Returns a new checking for the + presence of a particular object in the collection. + + + + + + Returns a new checking for the + presence of a particular object in the collection. + + + To search for a substring instead of a collection element, use the + overload. + + + + + + + Returns a new ContainsConstraint. This constraint + will, in turn, make use of the appropriate second-level + constraint, depending on the type of the actual argument. + + + To search for a collection element instead of a substring, use the + overload. + + + + + + Returns a new checking for the + presence of a particular object in the collection. + + + + + Returns a new ContainsConstraint. This constraint + will, in turn, make use of the appropriate second-level + constraint, depending on the type of the actual argument. + This overload is only used if the item sought is a string, + since any other type implies that we are looking for a + collection member. + + + + + Returns a new DictionaryContainsKeyConstraint checking for the + presence of a particular key in the Dictionary key collection. + + The key to be matched in the Dictionary key collection + + + + Returns a new DictionaryContainsValueConstraint checking for the + presence of a particular value in the Dictionary value collection. + + The value to be matched in the Dictionary value collection + + + + Returns a constraint that succeeds if the actual + value starts with the substring supplied as an argument. + + + + + Returns a constraint that succeeds if the actual + value starts with the substring supplied as an argument. + + + + + Returns a constraint that succeeds if the actual + value ends with the substring supplied as an argument. + + + + + Returns a constraint that succeeds if the actual + value ends with the substring supplied as an argument. + + + + + Returns a constraint that succeeds if the actual + value matches the regular expression supplied as an argument. + + + + + Returns a constraint that succeeds if the actual + value matches the regular expression supplied as an argument. + + + + + Returns a constraint that succeeds if the actual + value matches the regular expression supplied as an argument. + + + + + Returns a constraint that succeeds if the actual + value matches the regular expression supplied as an argument. + + + + + Returns a constraint that tests whether the path provided + is the same as an expected path after canonicalization. + + + + + Returns a constraint that tests whether the path provided + is the a subpath of the expected path after canonicalization. + + + + + Returns a constraint that tests whether the path provided + is the same path or under an expected path after canonicalization. + + + + + Returns a constraint that tests whether the actual value falls + inclusively within a specified range. + + Inclusive beginning of the range. + Inclusive end of the range. + + + + Returns a constraint that succeeds if the value + is a file or directory and it exists. + + + + + Returns a constraint that tests if an item is equal to any of parameters + + Expected values + + + + Returns a constraint that tests if an item is equal to any of expected values + + Expected values + + + + Returns a new IndexerConstraintExpression, which will + apply any following constraint to that indexer value. + + Index accessor values. + + + + ConstraintStatus represents the status of a ConstraintResult + returned by a Constraint being applied to an actual value. + + + + + The status has not yet been set + + + + + The constraint succeeded + + + + + The constraint failed + + + + + An error occurred in applying the constraint (reserved for future use) + + + + + Contains the result of matching a against an actual value. + + + + + Constructs a for a particular . + + The Constraint to which this result applies. + The actual value to which the Constraint was applied. + + + + Constructs a for a particular . + + The Constraint to which this result applies. + The actual value to which the Constraint was applied. + The status of the new ConstraintResult. + + + + Constructs a for a particular . + + The Constraint to which this result applies. + The actual value to which the Constraint was applied. + If true, applies a status of Success to the result, otherwise Failure. + + + + The actual value that was passed to the method. + + + + + Gets and sets the ResultStatus for this result. + + + + + True if actual value meets the Constraint criteria otherwise false. + + + + + Display friendly name of the constraint. + + + + + Description of the constraint may be affected by the state the constraint had + when was performed against the actual value. + + + + + Write the failure message to the MessageWriter provided + as an argument. The default implementation simply passes + the result and the actual value to the writer, which + then displays the constraint description and the value. + + Constraints that need to provide additional details, + such as where the error occurred, can override this. + + The MessageWriter on which to display the message + + + + Write some additional failure message. + + The MessageWriter on which to display the message + + + + Write the actual value for a failing constraint test to a + MessageWriter. The default implementation simply writes + the raw value of actual, leaving it to the writer to + perform any formatting. + + The writer on which the actual value is displayed + + + + ContainsConstraint tests a whether a string contains a substring + or a collection contains an object. It postpones the decision of + which test to use until the type of the actual argument is known. + This allows testing whether a string is contained in a collection + or as a substring of another string using the same syntax. + + + + + Initializes a new instance of the class. + + The expected value contained within the string/collection. + + + + The Description of what this constraint tests, for + use in messages and in the ConstraintResult. + + + + + Flag the constraint to ignore case and return self. + + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + True for success, false for failure + + + + CountZeroConstraint tests whether an instance has a property .Count with value zero. + + + + + The Description of what this constraint tests, for + use in messages and in the ConstraintResult. + + + + + Checks if the specified has a int Count property. + + Type to check. + when has a 'int Count' property, otherwise. + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + True for success, false for failure + + + + The DateTimes class contains common operations on Date and Time values. + + + + + Tests that the actual value is default value for type. + + + + + + + + Applies the constraint to an actual value, returning a ConstraintResult. + + + + + Applies a delay to the match so that a match can be evaluated in the future. + + + + + Allows only changing the time dimension of delay interval and setting a polling interval of a DelayedConstraint + + + + + Creates a new DelayedConstraint.WithRawDelayInterval + + Parent DelayedConstraint on which delay interval dimension is required to be set + + + + Changes delay interval dimension to minutes + + + + + Changes delay interval dimension to seconds + + + + + Changes delay interval dimension to milliseconds + + + + + Set polling interval, in milliseconds + + A time interval, in milliseconds + + + + + Allows only setting the polling interval of a DelayedConstraint + + + + + Creates a new DelayedConstraint.WithDimensionedDelayInterval + + Parent DelayedConstraint on which polling interval is required to be set + + + + Set polling interval, in milliseconds + + A time interval, in milliseconds + + + + + Allows only changing the time dimension of the polling interval of a DelayedConstraint + + + + + Creates a new DelayedConstraint.WithRawPollingInterval + + Parent DelayedConstraint on which polling dimension is required to be set + + + + Changes polling interval dimension to minutes + + + + + Changes polling interval dimension to seconds + + + + + Changes polling interval dimension to milliseconds + + + + + Delay value store as an Interval object + + + + + Polling value stored as an Interval object + + + + + Creates a new DelayedConstraint + + The inner constraint to decorate + The time interval after which the match is performed + If the value of is less than 0 + + + + Creates a new DelayedConstraint + + The inner constraint to decorate + The time interval after which the match is performed, in milliseconds + The time interval used for polling, in milliseconds + If the value of is less than 0 + + + + Gets text describing a constraint + + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + True for if the base constraint fails, false if it succeeds + + + + Test whether the constraint is satisfied by a delegate + + The delegate whose value is to be tested + A ConstraintResult + + + + Test whether the constraint is satisfied by a given reference. + Overridden to wait for the specified delay period before + calling the base constraint with the dereferenced value. + + A reference to the value to be tested + True for success, false for failure + + + + Returns the string representation of the constraint. + + + + + Adjusts a Timestamp by a given TimeSpan + + + + + + + + Returns the difference between two Timestamps as a TimeSpan + + + + + + + + DictionaryContainsKeyConstraint is used to test whether a dictionary + contains an expected object as a key. + + + + + Construct a DictionaryContainsKeyConstraint + + + + + + The display name of this Constraint for use by ToString(). + The default value is the name of the constraint with + trailing "Constraint" removed. Derived classes may set + this to another name in their constructors. + + + + + The Description of what this constraint tests, for + use in messages and in the ConstraintResult. + + + + + Gets the expected object + + + + + Returns a new DictionaryContainsKeyValuePairConstraint checking for the + presence of a particular key-value-pair in the dictionary. + + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + + + + Test whether the expected key is contained in the dictionary + + + + + DictionaryContainsKeyValuePairConstraint is used to test whether a dictionary + contains an expected object as a key-value-pair. + + + + + Construct a DictionaryContainsKeyValuePairConstraint + + + + + The display name of this Constraint for use by ToString(). + The default value is the name of the constraint with + trailing "Constraint" removed. Derived classes may set + this to another name in their constructors. + + + + + The Description of what this constraint tests, for + use in messages and in the ConstraintResult. + + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + + + + Test whether the expected key is contained in the dictionary + + + + + DictionaryContainsValueConstraint is used to test whether a dictionary + contains an expected object as a value. + + + + + Construct a DictionaryContainsValueConstraint + + + + + + The display name of this Constraint for use by ToString(). + The default value is the name of the constraint with + trailing "Constraint" removed. Derived classes may set + this to another name in their constructors. + + + + + The Description of what this constraint tests, for + use in messages and in the ConstraintResult. + + + + + Gets the expected object + + + + + Test whether the expected value is contained in the dictionary + + + + + Flag the constraint to use the supplied predicate function + + The comparison function to use. + Self. + + + + Provides a for the constraints + that are applied to each item in the collection + + + + + Constructs a for a particular + Only used for Failure + + The Constraint to which this result applies + The actual value to which the Constraint was applied + Actual item that does not match expected condition + Non matching item index + + + + Write constraint description, actual items, and non-matching item + + The MessageWriter on which to display the message + + + + EmptyCollectionConstraint tests whether a collection is empty. + + + + + + + + Check that the collection is empty + + + + + + + EmptyConstraint tests a whether a string or collection is empty, + postponing the decision about which test is applied until the + type of the actual argument is known. + + + + + The Description of what this constraint tests, for + use in messages and in the ConstraintResult. + + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + True for success, false for failure + + + + EmptyDirectoryConstraint is used to test that a directory is empty + + + + + The Description of what this constraint tests, for + use in messages and in the ConstraintResult. + + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + True for success, false for failure + + + + EmptyGuidConstraint tests whether a Guid is empty. + + + + + The Description of what this constraint tests, for + use in messages and in the ConstraintResult. + + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + True for success, false for failure + + + + EmptyStringConstraint tests whether a string is empty. + + + + + The Description of what this constraint tests, for + use in messages and in the ConstraintResult. + + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + True for success, false for failure + + + + EndsWithConstraint can test whether a string ends + with an expected substring. + + + + + Initializes a new instance of the class. + + The expected string + + + + Test whether the constraint is matched by the actual value. + This is a template method, which calls the IsMatch method + of the derived class. + + + + + + + EqualConstraint is able to compare an actual value with the + expected value provided in its constructor. Two objects are + considered equal if both are null, or if both have the same + value. NUnit has special semantics for some object types. + + + + + NUnitEqualityComparer used to test equality. + + + + + Initializes a new instance of the class. + + The expected value. + + + + Gets the tolerance for this comparison. + + + The tolerance. + + + + + Gets a value indicating whether to compare case insensitive. + + + if comparing case insensitive; otherwise, . + + + + + Gets a value indicating whether or not to clip strings. + + + if set to clip strings otherwise, . + + + + + Gets the failure points. + + + The failure points. + + + + + Flag the constraint to ignore case and return self. + + + + + Flag the constraint to suppress string clipping + and return self. + + + + + Flag the constraint to compare arrays as collections + and return self. + + + + + Flag the constraint to use a tolerance when determining equality. + + Tolerance value to be used + Self. + + + + Flags the constraint to include + property in comparison of two values. + + + Using this modifier does not allow to use the + constraint modifier. + + + + + Switches the .Within() modifier to interpret its tolerance as + a distance in representable values (see remarks). + + Self. + + Ulp stands for "unit in the last place" and describes the minimum + amount a given value can change. For any integers, an ulp is 1 whole + digit. For floating point values, the accuracy of which is better + for smaller numbers and worse for larger numbers, an ulp depends + on the size of the number. Using ulps for comparison of floating + point results instead of fixed tolerances is safer because it will + automatically compensate for the added inaccuracy of larger numbers. + + + + + Switches the .Within() modifier to interpret its tolerance as + a percentage that the actual values is allowed to deviate from + the expected value. + + Self + + + + Causes the tolerance to be interpreted as a TimeSpan in days. + + Self + + + + Causes the tolerance to be interpreted as a TimeSpan in hours. + + Self + + + + Causes the tolerance to be interpreted as a TimeSpan in minutes. + + Self + + + + Causes the tolerance to be interpreted as a TimeSpan in seconds. + + Self + + + + Causes the tolerance to be interpreted as a TimeSpan in milliseconds. + + Self + + + + Causes the tolerance to be interpreted as a TimeSpan in clock ticks. + + Self + + + + Flag the constraint to use the supplied IComparer object. + + The IComparer object to use. + Self. + + + + Flag the constraint to use the supplied IComparer object. + + The IComparer object to use. + Self. + + + + Flag the constraint to use the supplied boolean-returning delegate. + + The boolean-returning delegate to use. + Self. + + + + Flag the constraint to use the supplied Comparison object. + + The IComparer object to use. + Self. + + + + Flag the constraint to use the supplied IEqualityComparer object. + + The IComparer object to use. + Self. + + + + Flag the constraint to use the supplied IEqualityComparer object. + + The IComparer object to use. + Self. + + + + Flag the constraint to use the supplied predicate function + + The comparison function to use. + Self. + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + True for success, false for failure + + + + The Description of what this constraint tests, for + use in messages and in the ConstraintResult. + + + + + The EqualConstraintResult class is tailored for formatting + and displaying the result of an EqualConstraint. + + + + + Construct an EqualConstraintResult + + + + + Write a failure message. Overridden to provide custom + failure messages for EqualConstraint. + + The MessageWriter to write to + + + + Display the failure information for two collections that did not match. + + The MessageWriter on which to display + The expected collection. + The actual collection + The depth of this failure in a set of nested collections + + + + Display the failure information for two collections with failure point + + + + + + + + + + Displays a single line showing the types and sizes of the expected + and actual collections or arrays. If both are identical, the value is + only shown once. + + The MessageWriter on which to display + The expected collection or array + The actual collection or array + The indentation level for the message line + + + + Displays a single line showing the point in the expected and actual + arrays at which the comparison failed. If the arrays have different + structures or dimensions, both values are shown. + + The MessageWriter on which to display + The expected array + The actual array + Index of the failure point in the underlying collections + The indentation level for the message line + + + + Display the failure information for two IEnumerables that did not match. + + The MessageWriter on which to display + The expected enumeration. + The actual enumeration + The depth of this failure in a set of nested collections + + + + EqualityAdapter class handles all equality comparisons + that use an , + or a . + + + + + Compares two objects, returning true if they are equal + + + + + Compares two objects, within a tolerance returning true if they are equal + + + + + Returns true if the two objects can be compared by this adapter. + The base adapter cannot handle IEnumerables except for strings. + + + + + Returns an that wraps an . + + + + + that wraps an . + + + + + Returns an that wraps an . + + + + + Returns an EqualityAdapter that uses a predicate function for items comparison. + + + + + + + + + Returns true if the two objects can be compared by this adapter. + The base adapter cannot handle IEnumerables except for strings. + + + + + Compares two objects, returning true if they are equal + + + + + Returns true if the two objects can be compared by this adapter. + Generic adapter requires objects of the specified type. + + + + + Returns an that wraps an . + + + + + Returns an that wraps an . + + + + + that wraps an . + + + + + Returns an that wraps a . + + + + + ExactCountConstraint applies another constraint to each + item in a collection, succeeding only if a specified + number of items succeed. + + + + + Construct a standalone ExactCountConstraint + + + + + + Construct an ExactCountConstraint on top of an existing constraint + + + + + + + Apply the item constraint to each item in the collection, + succeeding only if the expected number of items pass. + + The value to be tested + A ConstraintResult + + + + The Description of what this constraint tests, for + use in messages and in the ConstraintResult. + + + + + Contain the result of matching a against an actual value. + + + + + The count of matched items of the + + + + + A list with maximum count (+1) of items of the + + + + + Constructs a for a . + + The Constraint to which this result applies. + The actual value to which the Constraint was applied. + If true, applies a status of Success to the result, otherwise Failure. + Count of matched items of the + A list with maximum count (+1) of items of the + + + + Write the actual value for a failing constraint test to a MessageWriter. + + The writer on which the actual value is displayed + + + + ExactTypeConstraint is used to test that an object + is of the exact type provided in the constructor + + + + + Construct an ExactTypeConstraint for a given Type + + The expected Type. + + + + The display name of this Constraint for use by ToString(). + The default value is the name of the constraint with + trailing "Constraint" removed. Derived classes may set + this to another name in their constructors. + + + + + Apply the constraint to an actual value, returning true if it succeeds + + The actual argument + True if the constraint succeeds, otherwise false. + + + + The Description of what this constraint tests, for + use in messages and in the ConstraintResult. + + + + + Applies the constraint to an actual value, returning a ConstraintResult. + + The value to be tested + A ConstraintResult + + + + ExceptionTypeConstraint is a special version of ExactTypeConstraint + used to provided detailed info about the exception thrown in + an error message. + + + + + Constructs an ExceptionTypeConstraint + + + + + Applies the constraint to an actual value, returning a ConstraintResult. + + The value to be tested + A ConstraintResult + + + + FalseConstraint tests that the actual value is false + + + + + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + True for success, false for failure + + + + FileOrDirectoryExistsConstraint is used to determine if a file or directory exists + + + + + If true, the constraint will only check if files exist, not directories + + + + + If true, the constraint will only check if directories exist, not files + + + + + Initializes a new instance of the class that + will check files and directories. + + + + + Initializes a new instance of the class that + will only check files if ignoreDirectories is true. + + if set to [ignore directories]. + + + + The Description of what this constraint tests, for + use in messages and in the ConstraintResult. + + + + + Applies the constraint to an actual value, returning a ConstraintResult. + + The value to be tested + A ConstraintResult + + + Helper routines for working with floating point numbers + + + The floating point comparison code is based on this excellent article: + https://randomascii.wordpress.com/2012/02/25/comparing-floating-point-numbers-2012-edition/ + + + "ULP" means Unit in the Last Place and in the context of this library refers to + the distance between two adjacent floating point numbers. IEEE floating point + numbers can only represent a finite subset of natural numbers, with greater + accuracy for smaller numbers and lower accuracy for very large numbers. + + + If a comparison is allowed "2 ulps" of deviation, that means the values are + allowed to deviate by up to 2 adjacent floating point values, which might be + as low as 0.0000001 for small numbers or as high as 10.0 for large numbers. + + + + + Union of a floating point variable and an integer + + + The union's value as a floating point variable + + + The union's value as an integer + + + The union's value as an unsigned integer + + + Union of a double precision floating point variable and a long + + + The union's value as a double precision floating point variable + + + The union's value as a long + + + The union's value as an unsigned long + + + Compares two floating point values for equality + First floating point value to be compared + Second floating point value t be compared + + Maximum number of representable floating point values that are allowed to + be between the left and the right floating point values + + True if both numbers are equal or close to being equal + + + Floating point values can only represent a finite subset of natural numbers. + For example, the values 2.00000000 and 2.00000024 can be stored in a float, + but nothing between them. + + + This comparison will count how many possible floating point values are between + the left and the right number. If the number of possible values between both + numbers is less than or equal to maxUlps, then the numbers are considered as + being equal. + + + Implementation partially follows the code outlined here: + http://www.anttirt.net/2007/08/19/proper-floating-point-comparisons/ + + + + + Compares two double precision floating point values for equality + First double precision floating point value to be compared + Second double precision floating point value t be compared + + Maximum number of representable double precision floating point values that are + allowed to be between the left and the right double precision floating point values + + True if both numbers are equal or close to being equal + + + Double precision floating point values can only represent a limited series of + natural numbers. For example, the values 2.0000000000000000 and 2.0000000000000004 + can be stored in a double, but nothing between them. + + + This comparison will count how many possible double precision floating point + values are between the left and the right number. If the number of possible + values between both numbers is less than or equal to maxUlps, then the numbers + are considered as being equal. + + + Implementation partially follows the code outlined here: + http://www.anttirt.net/2007/08/19/proper-floating-point-comparisons/ + + + + + + Tests whether a value is greater than the value supplied to its constructor + + + + + Initializes a new instance of the class. + + The expected value. + + + + Perform the comparison + + + + + Tests whether a value is greater than or equal to the value supplied to its constructor + + + + + Initializes a new instance of the class. + + The expected value. + + + + Perform the comparison + + + + + Interface for all constraints + + + + + The display name of this Constraint for use by ToString(). + + + + + The Description of what this constraint tests, for + use in messages and in the ConstraintResult. + + + + + Arguments provided to this Constraint, for use in + formatting the description. + + + + + The ConstraintBuilder holding this constraint + + + + + Applies the constraint to an actual value, returning a ConstraintResult. + + The value to be tested + A ConstraintResult + + + + Applies the constraint to an ActualValueDelegate that returns + the value to be tested. The default implementation simply evaluates + the delegate but derived classes may override it to provide for + delayed processing. + + An ActualValueDelegate + A ConstraintResult + + + + Test whether the constraint is satisfied by a given reference. + The default implementation simply dereferences the value but + derived classes may override it to provide for delayed processing. + + A reference to the value to be tested + A ConstraintResult + + + + IndexerConstraint extracts a named property and uses + its value as the actual value for a chained constraint. + + + + + Initializes a new instance of the class. + + The argument list for the indexer. + The constraint to apply to the indexer. + + + + Initializes a new instance of the class. + + The argument list for the indexer. + The constraint to apply to the indexer. + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + + + + Returns the string representation of the constraint. + + + + + InstanceOfTypeConstraint is used to test that an object + is of the same type provided or derived from it. + + + + + Construct an InstanceOfTypeConstraint for the type provided + + The expected Type + + + + The display name of this Constraint for use by ToString(). + The default value is the name of the constraint with + trailing "Constraint" removed. Derived classes may set + this to another name in their constructors. + + + + + Apply the constraint to an actual value, returning true if it succeeds + + The actual argument + True if the constraint succeeds, otherwise false. + + + + Keeps track of an interval time which can be represented in + Minutes, Seconds or Milliseconds + + + + + Constructs a interval given an value in milliseconds + + + + + Gets Interval value represented as a TimeSpan object + + + + + Returns the interval with the current value as a number of minutes. + + + + + Returns the interval with the current value as a number of seconds. + + + + + Returns the interval with the current value as a number of milliseconds. + + + + + Is true for intervals created with a non-zero value + + + + + Returns a string that represents the current object. + + + A string that represents the current object. + + + + + IntervalUnit provides the semantics to the value stored in Interval class. + + + + + Unit representing an Interval in minutes + + + + + Unit representing an Interval in seconds + + + + + Unit representing an Interval in milliseconds + + + + + The IResolveConstraint interface is implemented by all + complete and resolvable constraints and expressions. + + + + + Return the top-level constraint for this expression + + + + + + An extension of ResolvableConstraintExpression that adds a no-op Items property for readability. + + + + + Create a new instance of ItemsConstraintExpression + + + + + Create a new instance of ResolvableConstraintExpression, + passing in a pre-populated ConstraintBuilder. + + + + + + No-op property for readability. + + + + + Tests whether a value is less than the value supplied to its constructor + + + + + Initializes a new instance of the class. + + The expected value. + + + + Perform the comparison + + + + + Tests whether a value is less than or equal to the value supplied to its constructor + + + + + Initializes a new instance of the class. + + The expected value. + + + + Perform the comparison + + + + + MessageWriter is the abstract base for classes that write + constraint descriptions and messages in some form. The + class has separate methods for writing various components + of a message, allowing implementations to tailor the + presentation as needed. + + + + + Construct a MessageWriter given a culture + + + + + Abstract method to get the max line length + + + + + Method to write single line message with optional args, usually + written to precede the general failure message. + + The message to be written + Any arguments used in formatting the message + + + + Method to write single line message with optional args, usually + written to precede the general failure message, at a given + indentation level. + + The indentation level of the message + The message to be written + Any arguments used in formatting the message + + + + Display Expected and Actual lines for a constraint. This + is called by MessageWriter's default implementation of + WriteMessageTo and provides the generic two-line display. + + The failing constraint result + + + + Display Expected and Actual lines for given values. This + method may be called by constraints that need more control over + the display of actual and expected values than is provided + by the default implementation. + + The expected value + The actual value causing the failure + + + + Display Expected and Actual lines for given values, including + a tolerance value on the Expected line. + + The expected value + The actual value causing the failure + The tolerance within which the test was made + + + + Display the expected and actual string values on separate lines. + If the mismatch parameter is >=0, an additional line is displayed + line containing a caret that points to the mismatch point. + + The expected string value + The actual string value + The point at which the strings don't match or -1 + If true, case is ignored in locating the point where the strings differ + If true, the strings should be clipped to fit the line + + + + Writes the text for an actual value. + + The actual value. + + + + Writes the text for a generalized value. + + The value. + + + + Writes the text for a collection value, + starting at a particular point, to a max length + + The collection containing elements to write. + The starting point of the elements to write + The maximum number of elements to write + + + + Custom value formatter function + + The value + + + + + Custom value formatter factory function + + The next formatter function + ValueFormatter + If the given formatter is unable to handle a certain format, it must call the next formatter in the chain + + + + Static methods used in creating messages + + + + + Default amount of items used by method. + + + + + Static string used when strings are clipped + + + + + Formatting strings used for expected and actual values + + + + + Current head of chain of value formatters. Public for testing. + + + + + Add a formatter to the chain of responsibility. + + + + + + Formats text to represent a generalized value. + + The value + The formatted text + + + + Formats text for a collection value, + starting at a particular point, to a max length + + The collection containing elements to write. + The starting point of the elements to write + The maximum number of elements to write + + + + Returns the representation of a type as used in NUnitLite. + This is the same as Type.ToString() except for arrays, + which are displayed with their declared sizes. + + + + + + + Converts any control characters in a string + to their escaped representation. + + The string to be converted + The converted string + + + + Converts any null characters in a string + to their escaped representation. + + The string to be converted + The converted string + + + + Return the a string representation for a set of indices into an array + + Array of indices for which a string is needed + + + + Get an array of indices representing the point in a collection or + array corresponding to a single int index into the collection. + + The collection to which the indices apply + Index in the collection + Array of indices + + + + Clip a string to a given length, starting at a particular offset, returning the clipped + string with ellipses representing the removed parts + + The string to be clipped + The maximum permitted length of the result string + The point at which to start clipping + The clipped string + + + + Clip the expected and actual strings in a coordinated fashion, + so that they may be displayed together. + + + + + + + + + Shows the position two strings start to differ. Comparison + starts at the start index. + + The expected string + The actual string + The index in the strings at which comparison should start + Boolean indicating whether case should be ignored + -1 if no mismatch found, or the index where mismatch found + + + + NaNConstraint tests that the actual value is a double or float NaN + + + + + The Description of what this constraint tests, for + use in messages and in the ConstraintResult. + + + + + Test that the actual value is an NaN + + + + + + + NoItemConstraint applies another constraint to each + item in a collection, failing if any of them succeeds. + + + + + Construct a SomeItemsConstraint on top of an existing constraint + + + + + + The display name of this Constraint for use by ToString(). + The default value is the name of the constraint with + trailing "Constraint" removed. Derived classes may set + this to another name in their constructors. + + + + + Apply the item constraint to each item in the collection, + failing if any item fails. + + + + + + + NotConstraint negates the effect of some other constraint + + + + + Initializes a new instance of the class. + + The base constraint to be negated. + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + True for if the base constraint fails, false if it succeeds + + + + NullConstraint tests that the actual value is null + + + + + + + + Applies the constraint to an actual value, returning a ConstraintResult. + + The value to be tested + A ConstraintResult + + + + The Numerics class contains common operations on numeric values. + + + + + Checks the type of the object, returning true if + the object is a numeric type. + + The object to check + true if the object is a numeric type + + + + Checks the type of the object, returning true if + the object is a floating point numeric type. + + The object to check + true if the object is a floating point numeric type + + + + Checks the type of the object, returning true if + the object is a fixed point numeric type. + + The object to check + true if the object is a fixed point numeric type + + + + Test two numeric values for equality, performing the usual numeric + conversions and using a provided or default tolerance. If the tolerance + provided is Empty, this method may set it to a default tolerance. + + The expected value + The actual value + A reference to the tolerance in effect + True if the values are equal + + + + Compare two numeric values, performing the usual numeric conversions. + + The expected value + The actual value + The relationship of the values to each other + + + + Calculates the difference between 2 values in absolute/percent mode. + + The expected value + The actual value + Tolerance mode to specify difference representation + The difference between the values + + + + NUnitComparer encapsulates NUnit's default behavior + in comparing two objects. + + + + + Returns the default NUnitComparer. + + + + + Compares two objects + + + + + + + + NUnitEqualityComparer encapsulates NUnit's handling of + equality tests between objects. + + + + + Method for comparing two objects with a tolerance. + + The first object to compare. + The second object to compare. + The tolerance to use when comparing the objects. + The evaluation state of the comparison. + The for parameters. + + if the objects cannot be compared using the method. + Otherwise the result of the comparison is returned. + + + + + List of comparers used to compare pairs of objects. + + + + + If true, all string comparisons will ignore case + + + + + If true, arrays will be treated as collections, allowing + those of different dimensions to be compared + + + + + Comparison objects used in comparisons for some constraints. + + + + + List of points at which a failure occurred. + + + + + Initializes a new instance of the class. + + + + + Gets and sets a flag indicating whether case should + be ignored in determining equality. + + + + + Gets and sets a flag indicating that arrays should be + compared as collections, without regard to their shape. + + + + + Gets the list of external comparers to be used to + test for equality. They are applied to members of + collections, in place of NUnit's own logic. + + + + + Gets the list of failure points for the last Match performed. + The list consists of objects to be interpreted by the caller. + This generally means that the caller may only make use of + objects it has placed on the list at a particular depth. + + + + + Flags the comparer to include + property in comparison of two values. + + + Using this modifier does not allow to use the + modifier. + + + + + Compares two objects for equality within a tolerance. + + + + + FailurePoint class represents one point of failure + in an equality test. + + + + + The location of the failure + + + + + The expected value + + + + + The actual value + + + + + Indicates whether the expected value is valid + + + + + Indicates whether the actual value is valid + + + + + Represents a constraint that succeeds if all the + members of a collection match a base constraint. + + + + + Returns a constraint that will apply the argument + to the members of a collection, succeeding if + they all succeed. + + + + + Operator that requires both its arguments to succeed + + + + + Construct an AndOperator + + + + + Apply the operator to produce an AndConstraint + + + + + Operator that tests for the presence of a particular attribute + on a type and optionally applies further tests to the attribute. + + + + + Construct an AttributeOperator for a particular Type + + The Type of attribute tested + + + + Reduce produces a constraint from the operator and + any arguments. It takes the arguments from the constraint + stack and pushes the resulting constraint on it. + + + + + Abstract base class for all binary operators + + + + + Reduce produces a constraint from the operator and + any arguments. It takes the arguments from the constraint + stack and pushes the resulting constraint on it. + + + + + + Gets the left precedence of the operator + + + + + Gets the right precedence of the operator + + + + + Abstract method that produces a constraint by applying + the operator to its left and right constraint arguments. + + + + + Abstract base for operators that indicate how to + apply a constraint to items in a collection. + + + + + Constructs a CollectionOperator + + + + + The ConstraintOperator class is used internally by a + ConstraintBuilder to represent an operator that + modifies or combines constraints. + + Constraint operators use left and right precedence + values to determine whether the top operator on the + stack should be reduced before pushing a new operator. + + + + + The precedence value used when the operator + is about to be pushed to the stack. + + + + + The precedence value used when the operator + is on the top of the stack. + + + + + The syntax element preceding this operator + + + + + The syntax element following this operator + + + + + The precedence value used when the operator + is about to be pushed to the stack. + + + + + The precedence value used when the operator + is on the top of the stack. + + + + + Reduce produces a constraint from the operator and + any arguments. It takes the arguments from the constraint + stack and pushes the resulting constraint on it. + + + + + + Represents a constraint that succeeds if the specified + count of members of a collection match a base constraint. + + + + + Construct an ExactCountOperator for a specified count + + The expected count + + + + Reduce produces a constraint from the operator and + any arguments. It takes the arguments from the constraint + stack and pushes the resulting constraint on it. + + + + + + Operator used to test for the presence of a Indexer + on an object and optionally apply further tests to the + value of that indexer. + + + + + Constructs a IndexerOperator for a particular set of indexer + parameters + + + + + Returns a IndexerConstraint applied to its argument. + + + + + Represents a constraint that succeeds if none of the + members of a collection match a base constraint. + + + + + Returns a constraint that will apply the argument + to the members of a collection, succeeding if + none of them succeed. + + + + + Negates the test of the constraint it wraps. + + + + + Constructs a new NotOperator + + + + + Returns a NotConstraint applied to its argument. + + + + + Operator that requires at least one of its arguments to succeed + + + + + Construct an OrOperator + + + + + Apply the operator to produce an OrConstraint + + + + + PrefixOperator takes a single constraint and modifies + its action in some way. + + + + + Reduce produces a constraint from the operator and + any arguments. It takes the arguments from the constraint + stack and pushes the resulting constraint on it. + + + + + + Returns the constraint created by applying this + prefix to another constraint. + + + + + + + Operator used to test for the presence of a named Property + on an object and optionally apply further tests to the + value of that property. + + + + + Gets the name of the property to which the operator applies + + + + + Constructs a PropOperator for a particular named property + + + + + Reduce produces a constraint from the operator and + any arguments. It takes the arguments from the constraint + stack and pushes the resulting constraint on it. + + + + + + Abstract base class for operators that are able to reduce to a + constraint whether or not another syntactic element follows. + + + + + Represents a constraint that succeeds if any of the + members of a collection match a base constraint. + + + + + Returns a constraint that will apply the argument + to the members of a collection, succeeding if + any of them succeed. + + + + + Operator that tests that an exception is thrown and + optionally applies further tests to the exception. + + + + + Construct a ThrowsOperator + + + + + Reduce produces a constraint from the operator and + any arguments. It takes the arguments from the constraint + stack and pushes the resulting constraint on it. + + + + + Represents a constraint that simply wraps the + constraint provided as an argument, without any + further functionality, but which modifies the + order of evaluation because of its precedence. + + + + + Constructor for the WithOperator + + + + + Returns a constraint that wraps its argument + + + + + OrConstraint succeeds if either member succeeds + + + + + Create an OrConstraint from two other constraints + + The first constraint + The second constraint + + + + Gets text describing a constraint + + + + + Apply the member constraints to an actual value, succeeding + succeeding as soon as one of them succeeds. + + The actual value + True if either constraint succeeded + + + + PathConstraint serves as the abstract base of constraints + that operate on paths and provides several helper methods. + + + + + Construct a PathConstraint for a give expected path + + The expected path + + + + Modifies the current instance to be case-sensitive + and returns it. + + + + + Returns the string representation of this constraint + + + + + Canonicalize the provided path + + + The path in standardized form + + + + Test whether one path in canonical form is a subpath of another path + + The first path - supposed to be the parent path + The second path - supposed to be the child path + + + + + Predicate constraint wraps a Predicate in a constraint, + returning success if the predicate is true. + + + + + Construct a PredicateConstraint from a predicate + + + + + Gets text describing a constraint + + + + + Determines whether the predicate succeeds when applied + to the actual value. + + + + + Abstract base class used for prefixes + + + + + The base constraint + + + + + Prefix used in forming the constraint description + + + + + Construct given a base constraint + + + Prefix used in forming the constraint description + + + + The Description of what this constraint tests, for + use in messages and in the ConstraintResult. + + + + + Formats a prefix constraint's description. + + + + + PropertyConstraint extracts a named property and uses + its value as the actual value for a chained constraint. + + + + + Initializes a new instance of the class. + + The name. + The constraint to apply to the property. + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + + + + Returns the string representation of the constraint. + + + + + Contains the result of matching a against an actual value. + + + + + Constructs a for a particular . + + The Constraint to which this result applies. + The base result with actual value to which the Constraint was applied. + + + + Write the additional failure message for a failing constraint to a + MessageWriter. + + The writer on which the actual value is displayed + + + + PropertyExistsConstraint tests that a named property + exists on the object provided through Match. + + Originally, PropertyConstraint provided this feature + in addition to making optional tests on the value + of the property. The two constraints are now separate. + + + + + Initializes a new instance of the class. + + The name of the property. + + + + The Description of what this constraint tests, for + use in messages and in the ConstraintResult. + + + + + Test whether the property exists for a given object + + The object to be tested + True for success, false for failure + + + + Returns the string representation of the constraint. + + + + + + RangeConstraint tests whether two values are within a + specified range. + + + + + Initializes a new instance of the class. + + Inclusive beginning of the range. + Inclusive end of the range. + + + + Gets text describing a constraint + + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + True for success, false for failure + + + + Modifies the constraint to use an and returns self. + + + + + Modifies the constraint to use an and returns self. + + + + + Modifies the constraint to use a and returns self. + + + + + RegexConstraint can test whether a string matches + the pattern provided. + + + + + The Description of what this constraint tests, for + use in messages and in the ConstraintResult. + + + + + Initializes a new instance of the class. + + The pattern. + + + + Initializes a new instance of the class. + + The Regex pattern object. + + + + Modify the constraint to ignore case in matching. + + + + + Applies the regex constraint to an actual value, returning a ConstraintResult. + + The string to be tested. + True for success, false for failure. + + + + ResolvableConstraintExpression is used to represent a compound + constraint being constructed at a point where the last operator + may either terminate the expression or may have additional + qualifying constraints added to it. + + It is used, for example, for a Property element or for + an Exception element, either of which may be optionally + followed by constraints that apply to the property or + exception. + + + + + Create a new instance of ResolvableConstraintExpression + + + + + Create a new instance of ResolvableConstraintExpression, + passing in a pre-populated ConstraintBuilder. + + + + + Appends an And Operator to the expression + + + + + Appends an Or operator to the expression. + + + + + Resolve the current expression to a Constraint + + + + + ReusableConstraint wraps a constraint expression after + resolving it so that it can be reused consistently. + + + + + Construct a ReusableConstraint from a constraint expression + + The expression to be resolved and reused + + + + Converts a constraint to a ReusableConstraint + + The constraint to be converted + A ReusableConstraint + + + + Returns a that represents this instance. + + + A that represents this instance. + + + + + Return the top-level constraint for this expression + + + + + + SameAsConstraint tests whether an object is identical to + the object passed to its constructor + + + + + Initializes a new instance of the class. + + The expected object. + + + + The Description of what this constraint tests, for + use in messages and in the ConstraintResult. + + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + True for success, false for failure + + + + Summary description for SamePathConstraint. + + + + + Initializes a new instance of the class. + + The expected path + + + + The Description of what this constraint tests, for + use in messages and in the ConstraintResult. + + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + True for success, false for failure + + + + SamePathOrUnderConstraint tests that one path is under another + + + + + Initializes a new instance of the class. + + The expected path + + + + The Description of what this constraint tests, for + use in messages and in the ConstraintResult. + + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + True for success, false for failure + + + + SomeItemsConstraint applies another constraint to each + item in a collection, succeeding if any of them succeeds. + + + + + Construct a SomeItemsConstraint on top of an existing constraint + + + + + + The display name of this Constraint for use by ToString(). + The default value is the name of the constraint with + trailing "Constraint" removed. Derived classes may set + this to another name in their constructors. + + + + + Apply the item constraint to each item in the collection, + succeeding if any item succeeds. + + + + + + + Flag the constraint to use the supplied object. + + The type of the elements in the collection. + The type of the member. + The comparison function to use. + Self. + + + + Flag the constraint to use the supplied object. + + The IComparer object to use. + Self. + + + + Flag the constraint to use the supplied object. + + The IComparer object to use. + Self. + + + + Flag the constraint to use the supplied object. + + The IComparer object to use. + Self. + + + + Flag the constraint to use the supplied object. + + The IComparer object to use. + Self. + + + + Flag the constraint to use the supplied object. + + The IComparer object to use. + Self. + + + + StartsWithConstraint can test whether a string starts + with an expected substring. + + + + + Initializes a new instance of the class. + + The expected string + + + + Test whether the constraint is matched by the actual value. + This is a template method, which calls the IsMatch method + of the derived class. + + + + + + + StringConstraint is the abstract base for constraints + that operate on strings. It supports the IgnoreCase + modifier for string operations. + + + + + The expected value + + + + + Indicates whether tests should be case-insensitive + + + + + Description of this constraint + + + + + The Description of what this constraint tests, for + use in messages and in the ConstraintResult. + + + + + Constructs a StringConstraint without an expected value + + + + + Constructs a StringConstraint given an expected value + + The expected value + + + + Modify the constraint to ignore case in matching. + + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + True for success, false for failure + + + + Test whether the constraint is satisfied by a given string + + The string to be tested + True for success, false for failure + + + + SubPathConstraint tests that the actual path is under the expected path + + + + + Initializes a new instance of the class. + + The expected path + + + + The Description of what this constraint tests, for + use in messages and in the ConstraintResult. + + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + True for success, false for failure + + + + SubstringConstraint can test whether a string contains + the expected substring. + + + + + Initializes a new instance of the class. + + The expected. + + + + Modify the constraint to ignore case in matching. + This will call Using(StringComparison.CurrentCultureIgnoreCase). + + Thrown when a comparison type different + than was already set. + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + True for success, false for failure + + + + Modify the constraint to the specified comparison. + + Thrown when a comparison type different + than was already set. + + + + ThrowsConstraint is used to test the exception thrown by + a delegate by applying a constraint to it. + + + + + Initializes a new instance of the class, + using a constraint to be applied to the exception. + + A constraint to apply to the caught exception. + + + + Get the actual exception thrown - used by Assert.Throws. + + + + + Gets text describing a constraint + + + + + Executes the code of the delegate and captures any exception. + If a non-null base constraint was provided, it applies that + constraint to the exception. + + A delegate representing the code to be tested + True if an exception is thrown and the constraint succeeds, otherwise false + + + + Converts an ActualValueDelegate to a TestDelegate + before calling the primary overload. + + + + + + + Write the actual value for a failing constraint test to a + MessageWriter. This override only handles the special message + used when an exception is expected but none is thrown. + + The writer on which the actual value is displayed + + + + ThrowsExceptionConstraint tests that an exception has + been thrown, without any further tests. + + + + + The Description of what this constraint tests, for + use in messages and in the ConstraintResult. + + + + + Executes the code and returns success if an exception is thrown. + + A delegate representing the code to be tested + True if an exception is thrown, otherwise false + + + + Applies the constraint to an ActualValueDelegate that returns + the value to be tested. The default implementation simply evaluates + the delegate but derived classes may override it to provide for + delayed processing. + + + + + ThrowsNothingConstraint tests that a delegate does not + throw an exception. + + + + + Gets text describing a constraint + + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + True if no exception is thrown, otherwise false + + + + Applies the constraint to an ActualValueDelegate that returns + the value to be tested. The default implementation simply evaluates + the delegate but derived classes may override it to provide for + delayed processing. + + An ActualValueDelegate + A ConstraintResult + + + + The Tolerance class generalizes the notion of a tolerance + within which an equality test succeeds. Normally, it is + used with numeric types, but it can be used with any + type that supports taking a difference between two + objects and comparing that difference to a value. + + + + + Returns a default Tolerance object, equivalent to a default matching rules. + + + + + Returns an empty Tolerance object, equivalent to an exact match. + + + + + Constructs a linear tolerance of a specified amount + + + + + Constructs a tolerance given an amount and + + + + + Returns a new tolerance, using the current amount as a percentage. + + + + + Returns a new tolerance, using the current amount in Ulps + + + + + Returns a new tolerance with a as the amount, using + the current amount as a number of days. + + + + + Returns a new tolerance with a as the amount, using + the current amount as a number of hours. + + + + + Returns a new tolerance with a as the amount, using + the current amount as a number of minutes. + + + + + Returns a new tolerance with a as the amount, using + the current amount as a number of seconds. + + + + + Returns a new tolerance with a as the amount, using + the current amount as a number of milliseconds. + + + + + Returns a new tolerance with a as the amount, using + the current amount as a number of clock ticks. + + + + + Gets the for the current Tolerance + + + + + Gets the magnitude of the current Tolerance instance. + + + + + Returns true if the current tolerance has not been set or is using the default. + + + + + Returns true if the current tolerance varies from exact and default. Indicating tolerance needs processing. + + + + + Apply the tolerance to an expected value and return + a Tolerance.Range that represents the acceptable values. + + + + + Tests that the current Tolerance is linear with a + numeric value, throwing an exception if it is not. + + + + + Tolerance.Range represents the range of values that match + a specific tolerance, when applied to a specific value. + + + + + The lower bound of the range + + + + + The upper bound of the range + + + + + Constructs a range + + + + + Returns a string that represents the current object. + + + A string that represents the current object. + + + + + Modes in which the tolerance value for a comparison can be interpreted. + + + + + The tolerance was created with a value, without specifying + how the value would be used. This is used to prevent setting + the mode more than once and is generally changed to Linear + upon execution of the test. + + + + + The tolerance is used as a numeric range within which + two compared values are considered to be equal. + + + + + Interprets the tolerance as the percentage by which + the two compared values my deviate from each other. + + + + + Compares two values based in their distance in + representable numbers. + + + + + TrueConstraint tests that the actual value is true + + + + + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + True for success, false for failure + + + + TypeConstraint is the abstract base for constraints + that take a Type as their expected value. + + + + + The expected Type used by the constraint + + + + + The type of the actual argument to which the constraint was applied + + + + + Construct a TypeConstraint for a given Type + + The expected type for the constraint + Prefix used in forming the constraint description + + + + + + + Applies the constraint to an actual value, returning a ConstraintResult. + + The value to be tested + A ConstraintResult + + + + Apply the constraint to an actual value, returning true if it succeeds + + The actual argument + True if the constraint succeeds, otherwise false. + + + + UniqueItemsConstraint tests whether all the items in a + collection are unique. + + + + + The Description of what this constraint tests, for + use in messages and in the ConstraintResult. + + + + + Check that all items are unique. + + + + + + + + + + XmlSerializableConstraint tests whether + an object is serializable in XML format. + + + + + Gets text describing a constraint + + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + True for success, false for failure + + + + Returns the string representation of this constraint + + + + + Helper class with properties and methods that supply + a number of constraints used in Asserts. + + + + + Returns a new checking for the + presence of a particular object in the collection. + + + + + Returns a new DictionaryContainsKeyConstraint checking for the + presence of a particular key in the dictionary. + + + + + Returns a new DictionaryContainsValueConstraint checking for the + presence of a particular value in the dictionary. + + + + + Returns a constraint that succeeds if the actual + value contains the substring supplied as an argument. + + + + + Helper class with properties and methods that supply + a number of constraints used in Asserts. + + + + + Returns a ConstraintExpression that negates any + following constraint. + + + + + Returns a constraint that succeeds if the value + is a file or directory and it exists. + + + + + Returns a new checking for the + presence of a particular object in the collection. + + + + + Returns a new . This constraint + will, in turn, make use of the appropriate second-level + constraint, depending on the type of the actual argument. + This overload is only used if the item sought is a string, + since any other type implies that we are looking for a + collection member. + + + + + Returns a new DictionaryContainsKeyConstraint checking for the + presence of a particular key in the Dictionary key collection. + + The key to be matched in the Dictionary key collection + + + + Returns a new DictionaryContainsValueConstraint checking for the + presence of a particular value in the Dictionary value collection. + + The value to be matched in the Dictionary value collection + + + + Returns a constraint that succeeds if the actual + value starts with the substring supplied as an argument. + + + + + Returns a constraint that succeeds if the actual + value ends with the substring supplied as an argument. + + + + + Returns a constraint that succeeds if the actual + value matches the regular expression supplied as an argument. + + + + + Returns a constraint that succeeds if the actual + value matches the regular expression supplied as an argument. + + + + + If throws, returns "SomeException was thrown by the Exception.StackTrace + property." See also . + + + + + If throws, returns "SomeException was thrown by the Exception.Message + property." + + + + + If throws, returns "SomeException was thrown by the Exception.Data property." + + + + + Thrown when an assertion failed. + + + + The error message that explains + the reason for the exception + + + The error message that explains + the reason for the exception + The exception that caused the + current exception + + + + Serialization Constructor + + + + + Gets the ResultState provided by this exception + + + + + Thrown when an assertion failed. + + + + + + + The error message that explains + the reason for the exception + The exception that caused the + current exception + + + + Serialization Constructor + + + + + Gets the ResultState provided by this exception + + + + + Thrown when a test executes inconclusively. + + + + The error message that explains + the reason for the exception + + + The error message that explains + the reason for the exception + The exception that caused the + current exception + + + + Serialization Constructor + + + + + Gets the ResultState provided by this exception + + + + + Thrown when an assertion failed. + + + + + Construct based on the TestResult so far. This is the constructor + used normally, when exiting the multiple assert block with failures. + Not used internally but provided to facilitate debugging. + + + The current result, up to this point. The result is not used + internally by NUnit but is provided to facilitate debugging. + + + + + Serialization Constructor + + + + + Gets the provided by this exception. + + + + + Gets the of this test at the point the exception was thrown, + + + + + Abstract base for Exceptions that terminate a test and provide a ResultState. + + + + The error message that explains + the reason for the exception + + + The error message that explains + the reason for the exception + The exception that caused the + current exception + + + + Serialization Constructor + + + + + Gets the ResultState provided by this exception + + + + + Thrown when an assertion failed. + + + + + + + The error message that explains + the reason for the exception + The exception that caused the + current exception + + + + Serialization Constructor + + + + + Gets the ResultState provided by this exception + + + + + Contains extension methods that do not require a special using directive. + + + + + Class used to guard against unexpected argument values + or operations by throwing an appropriate exception. + + + + + Throws an exception if an argument is null + + The value to be tested + The name of the argument + + + + Throws an exception if a string argument is null or empty + + The value to be tested + The name of the argument + + + + Throws an ArgumentOutOfRangeException if the specified condition is not met. + + The condition that must be met + The exception message to be used + The name of the argument + + + + Throws an ArgumentException if the specified condition is not met. + + The condition that must be met + The exception message to be used + The name of the argument + + + + Throws an InvalidOperationException if the specified condition is not met. + + The condition that must be met + The exception message to be used + + + + Throws an if the specified delegate is async void. + + + + + Throws an if the specified delegate is async void. + + + + + Helper class with properties and methods that supply + a number of constraints used in Asserts. + + + + + Returns a ConstraintExpression that negates any + following constraint. + + + + + Returns a ConstraintExpression, which will apply + the following constraint to all members of a collection, + succeeding if all of them succeed. + + + + + Returns a ConstraintExpression, which will apply + the following constraint to all members of a collection, + succeeding if at least one of them succeeds. + + + + + Returns a ConstraintExpression, which will apply + the following constraint to all members of a collection, + succeeding if all of them fail. + + + + + Returns a ConstraintExpression, which will apply + the following constraint to all members of a collection, + succeeding only if a specified number of them succeed. + + + + + Returns a which will apply + the following constraint to only one member of the collection, + and fail if none or more than one match occurs. + + + + + Returns a new PropertyConstraintExpression, which will either + test for the existence of the named property on the object + being tested or apply any following constraint to that property. + + + + + Returns a new ConstraintExpression, which will apply the following + constraint to the Length property of the object being tested. + + + + + Returns a new ConstraintExpression, which will apply the following + constraint to the Count property of the object being tested. + + + + + Returns a new ConstraintExpression, which will apply the following + constraint to the Message property of the object being tested. + + + + + Returns a new ConstraintExpression, which will apply the following + constraint to the InnerException property of the object being tested. + + + + + Returns a new AttributeConstraint checking for the + presence of a particular attribute on an object. + + + + + Returns a new AttributeConstraint checking for the + presence of a particular attribute on an object. + + + + + Returns a new checking for the + presence of a particular object in the collection. + + + + + Returns a new IndexerConstraintExpression, which will + apply any following constraint to that indexer value. + + Index accessor values. + + + + The AssertionResult class represents the result of a single assertion. + + + + + Construct an AssertionResult + + + + The pass/fail status of the assertion + + + The message produced by the assertion, or null + + + The stack trace associated with the assertion, or null + + + Determines whether the specified object is equal to the current object. + The object to compare with the current object. + + + Indicates whether the current object is equal to another object of the same type. + An object to compare with this object. + + + Serves as the default hash function. + + + + ToString Override + + + + + AssertionStatus enumeration represents the possible outcomes of an assertion. + The order of definition is significant, higher level values override lower + ones in determining the overall result of a test. + + + + + An assumption failed + + + + + The assertion succeeded + + + + + A warning message was issued + + + + + The assertion failed + + + + + An unexpected exception was thrown + + + + + The IApplyToContext interface is implemented by attributes + that want to make changes to the execution context before + a test is run. + + + + + Apply changes to the execution context + + The execution context + + + + The IApplyToTest interface is implemented by self-applying + attributes that modify the state of a test in some way. + + + + + Modifies a test as defined for the specific attribute. + + The test to modify + + + + The IApplyToTestSuite interface is implemented by self-applying + attributes that modify the state of a test suite in some way. + + + + + Modifies a test suite as defined for the specific attribute. + + The test to modify + + + + CombiningStrategy is the abstract base for classes that + know how to combine values provided for individual test + parameters to create a set of test cases. + + + + + Gets the test cases generated by the CombiningStrategy. + + The test cases. + + + + ICommandWrapper is implemented by attributes and other + objects able to wrap a TestCommand with another command. + + + Attributes or other objects should implement one of the + derived interfaces, rather than this one, since they + indicate in which part of the command chain the wrapper + should be applied. + + + + + Wrap a command and return the result. + + The command to be wrapped + The wrapped command + + + + Objects implementing this interface are used to wrap + the TestMethodCommand itself. They apply after SetUp + has been run and before TearDown. + + + + + Objects implementing this interface are used to wrap + the entire test, including SetUp and TearDown. + + + + + Objects implementing this interface are used to wrap + tests that can repeat. The implementing command is run once, + invoking the chained commands any number of times. + + + + + Any ITest that implements this interface is at a level that the implementing + class should be disposed at the end of the test run + + + + + The IFixtureBuilder interface is exposed by a class that knows how to + build test fixtures from a specified type. In general, it is exposed + by an attribute, but it may be implemented in a helper class used by the + attribute in some cases. + + + + + Builds any number of test fixtures from the specified type. + + The type info of the fixture to be used. + + + + The IFixtureBuilder2 interface extends IFixtureBuilder by allowing + use of a PreFilter, which is used to select methods as test cases. + + + + + Builds any number of test fixtures from the specified type. + + The type info of the fixture to be used. + PreFilter to be used to select methods. + + + + IImplyFixture is an empty marker interface used by attributes like + TestAttribute that cause the class where they are used to be treated + as a TestFixture even without a TestFixtureAttribute. + + Marker interfaces are not usually considered a good practice, but + we use it here to avoid cluttering the attribute hierarchy with + classes that don't contain any extra implementation. + + + + + The IMethodInfo class is used to encapsulate information + about a method in a platform-independent manner. + + + + + Gets the Type from which this method was reflected. + + + + + Gets the MethodInfo for this method. + + + + + Gets the name of the method. + + + + + Gets a value indicating whether the method is abstract. + + + + + Gets a value indicating whether the method is public. + + + + + Gets a value indicating whether the method is static. + + + + + Gets a value indicating whether the method contains unassigned generic type parameters. + + + + + Gets a value indicating whether the method is a generic method. + + + + + Gets a value indicating whether the MethodInfo represents the definition of a generic method. + + + + + Gets the return Type of the method. + + + + + Gets the parameters of the method. + + + + + + Returns the Type arguments of a generic method or the Type parameters of a generic method definition. + + + + + Replaces the type parameters of the method with the array of types provided and returns a new IMethodInfo. + + The type arguments to be used + A new IMethodInfo with the type arguments replaced + + + + Invokes the method, converting any TargetInvocationException to an NUnitException. + + The object on which to invoke the method + The argument list for the method + The return value from the invoked method + + + + Provides data for a single test parameter. + + + + + Determines whether any data is available for a parameter. + + The parameter of a parameterized test. + + + + Retrieves a list of arguments which can be passed to the specified parameter. + + The parameter of a parameterized test. + + + + Provides data for a single test parameter. + + + + + Retrieves a list of arguments which can be passed to the specified parameter. + + The parameter of a parameterized test. + + + + The IParameterInfo interface is an abstraction of a .NET parameter. + + + + + Gets a value indicating whether the parameter is optional + + + + + Gets an IMethodInfo representing the method for which this is a parameter + + + + + Gets the underlying .NET ParameterInfo + + + + + Gets the Type of the parameter + + + + + Implemented by filters for use in deciding which + Types and Methods should be used to generate tests. + + + + + Use the filter on a Type, returning true if the type matches the filter + and should therefore be included in the discovery process. + + + + + Use the filter on a Type, returning true if the type matches the filter + and should therefore be included in the discovery process. + + + + + A PropertyBag represents a collection of name/value pairs + that allows duplicate entries with the same key. Methods + are provided for adding a new pair as well as for setting + a key to a single value. All keys are strings but values + may be of any type. Null values are not permitted, since + a null entry represents the absence of the key. + + The entries in a PropertyBag are of two kinds: those that + take a single value and those that take multiple values. + However, the PropertyBag has no knowledge of which entries + fall into each category and the distinction is entirely + up to the code using the PropertyBag. + + When working with multi-valued properties, client code + should use the Add method to add name/value pairs and + indexing to retrieve a list of all values for a given + key. For example: + + bag.Add("Tag", "one"); + bag.Add("Tag", "two"); + Assert.That(bag["Tag"], + Is.EqualTo(new string[] { "one", "two" })); + + When working with single-valued properties, client code + should use the Set method to set the value and Get to + retrieve the value. The GetSetting methods may also be + used to retrieve the value in a type-safe manner while + also providing default. For example: + + bag.Set("Priority", "low"); + bag.Set("Priority", "high"); // replaces value + Assert.That(bag.Get("Priority"), + Is.EqualTo("high")); + Assert.That(bag.GetSetting("Priority", "low"), + Is.EqualTo("high")); + + + + + Adds a key/value pair to the property bag + + The key + The value + + + + Sets the value for a key, removing any other + values that are already in the property set. + + + + + + + Gets a single value for a key, using the first + one if multiple values are present and returning + null if the value is not found. + + + + + Gets a flag indicating whether the specified key has + any entries in the property set. + + The key to be checked + True if their are values present, otherwise false + + + + Tries to retrieve list of values. + + The key for which the values are to be retrieved + Values, if found + true if found + + + + Gets or sets the list of values for a particular key, initializes new list behind the key if not found. + + The key for which the values are to be retrieved or set + + + + Gets a collection containing all the keys in the property set + + + + + The IReflectionInfo interface is implemented by NUnit wrapper objects that perform reflection. + + + + + Returns an array of custom attributes of the specified type applied to this object + + + + + Returns a value indicating whether an attribute of the specified type is defined on this object. + + + + + The ISimpleTestBuilder interface is exposed by a class that knows how to + build a single tests from a specified method. In general, + it is exposed by an attribute, but it may be implemented in a helper class + used by the attribute in some cases. + + + + + Builds a single test from the specified method and context. + + The method to be used as a test + The TestSuite to which the method will be added + + + + The ISuiteBuilder interface is exposed by a class that knows how to + build a single test suite from a specified type. + + + + + Examine the type and determine if it is suitable for + this builder to use in building a TestSuite. + + Note that returning false will cause the type to be ignored + in loading the tests. If it is desired to load the suite + but label it as non-runnable, ignored, etc., then this + method must return true. + + The type of the fixture to be used + + + + Builds a single test suite from the specified type. + + The type of the fixture to be used + + + + Builds a single test suite from the specified type, subject + to a filter that decides which methods are included. + + The type of the fixture to be used + A PreFilter for selecting methods. + + + + Common interface supported by all representations + of a test. Only includes informational fields. + The Run method is specifically excluded to allow + for data-only representations of a test. + + + + + Gets the id of the test + + + + + Gets the name of the test + + + + + Gets the type of the test + + + + + Gets the fully qualified name of the test + + + + + Gets the name of the class containing this test. Returns + null if the test is not associated with a class. + + + + + Gets the name of the method implementing this test. + Returns null if the test is not implemented as a method. + + + + + Gets the Type of the test fixture, if applicable, or + null if no fixture type is associated with this test. + + + + + Gets the method which declares the test, or + if no method is associated with this test. + + + + + Gets the RunState of the test, indicating whether it can be run. + + + + + Count of the test cases ( 1 if this is a test case ) + + + + + Gets the properties of the test + + + + + Gets the parent test, if any. + + The parent test or null if none exists. + + + + Returns true if this is a test suite + + + + + Gets a bool indicating whether the current test + has any descendant tests. + + + + + Gets this test's child tests + + A list of child tests + + + + Gets a fixture object for running this test. + + + + + The arguments to use in creating the test or empty array if none are required. + + + + + The ITestBuilder interface is exposed by a class that knows how to + build tests from a specified method. In general, it is exposed + by an attribute which has additional information available to provide + the necessary test parameters to distinguish the test cases built. + + + + + Builds any number of tests from the specified method and context. + + The method to be used as a test + The TestSuite to which the method will be added + + + + The ITestCaseBuilder interface is exposed by a class that knows how to + build a test from a specified method, possibly containing child test cases. + + + + + Examine the method and determine if it is suitable for + this builder to use in building a TestCase to be + included in the suite being populated. + + Note that returning false will cause the method to be ignored + in loading the tests. If it is desired to load the method + but label it as non-runnable, ignored, etc., then this + method must return true. + + The test method to examine + The suite being populated + + + + Builds a single test from the specified method and context, + possibly containing child test cases. + + The method to be used as a test case + The test suite being populated, or null + + + + The ITestCaseData interface is implemented by a class + that is able to return complete test cases for use by + a parameterized test method. + + + + + Gets the expected result of the test case + + + + + Returns true if an expected result has been set + + + + + The ITestData interface is implemented by a class that + represents a single instance of a parameterized test. + + + + + Gets the name to be used for the test + + + + + Gets the RunState for this test case. + + + + + Gets the argument list to be provided to the test + + + + + Gets the property dictionary for the test case + + + + + Interface to be implemented by filters applied to tests. + The filter applies when running the test, after it has been + loaded, since this is the only time an ITest exists. + + + + + Determine if a particular test passes the filter criteria. Pass + may examine the parents and/or descendants of a test, depending + on the semantics of the particular filter + + The test to which the filter is applied + True if the test passes the filter, otherwise false + + + + Determine if a test matches the filter explicitly. That is, it must + be a direct match of the test itself or one of its children. + + The test to which the filter is applied + True if the test matches the filter explicitly, otherwise false + + + + The ITestCaseData interface is implemented by a class + that is able to return the data required to create an + instance of a parameterized test fixture. + + + + + Get the TypeArgs if separately set + + + + + The ITestListener interface is used internally to receive + notifications of significant events while a test is being + run. The events are propagated to clients by means of an + AsyncCallback. NUnit extensions may also monitor these events. + + + + + Called when a test has just started + + The test that is starting + + + + Called when a test has finished + + The result of the test + + + + Called when a test produces output for immediate display + + A TestOutput object containing the text to display + + + + Called when a test produces a message to be sent to listeners + + A object containing the text to send + + + + The ITestResult interface represents the result of a test. + + + + + Gets the ResultState of the test result, which + indicates the success or failure of the test. + + + + + Gets the name of the test result + + + + + Gets the full name of the test result + + + + + Gets the elapsed time for running the test in seconds + + + + + Gets or sets the time the test started running. + + + + + Gets or sets the time the test finished running. + + + + + Gets the message associated with a test + failure or with not running the test + + + + + Gets any stack trace associated with an + error or failure. + + + + Gets the total number of tests executed + when running the test and all its children. + + + + + Gets the number of asserts executed + when running the test and all its children. + + + + + Gets the number of test cases that failed + when running the test and all its children. + + + + + Gets the number of test cases that had warnings + when running the test and all its children. + + + + + Gets the number of test cases that passed + when running the test and all its children. + + + + + Gets the number of test cases that were skipped + when running the test and all its children. + + + + + Gets the number of test cases that were inconclusive + when running the test and all its children. + + + + + Indicates whether this result has any child results. + Accessing HasChildren should not force creation of the + Children collection in classes implementing this interface. + + + + + Gets the collection of child results. + + + + + Gets the Test to which this result applies. + + + + + Gets any text output written to this result. + + + + + Gets a list of AssertionResults associated with the test + + + + + Gets the collection of files attached to the test + + + + + The ITypeInfo interface is an abstraction of a .NET Type + + + + + Gets the underlying Type on which this ITypeInfo is based + + + + + Gets the base type of this type as an ITypeInfo + + + + + Returns true if the Type wrapped is equal to the argument + + + + + Gets the name of the Type + + + + + Gets the full name of the Type + + + + + Gets the assembly in which the type is declared + + + + + Gets the namespace of the Type + + + + + Gets a value indicating whether the type is abstract. + + + + + Gets a value indicating whether the Type is a generic Type + + + + + Gets a value indicating whether the Type has generic parameters that have not been replaced by specific Types. + + + + + Gets a value indicating whether the Type is a generic Type definition + + + + + Gets a value indicating whether the type is sealed. + + + + + Gets a value indicating whether this type is a static class. + + + + + Get the display name for this typeInfo. + + + + + Get the display name for an object of this type, constructed with specific arguments + + + + + Returns a Type representing a generic type definition from which this Type can be constructed. + + + + + Returns a new ITypeInfo representing an instance of this generic Type using the supplied Type arguments + + + + + Returns a value indicating whether this type has a method with a specified public attribute + + + + + Returns an array of IMethodInfos for methods of this Type + that match the specified flags. + + + + + Gets the public constructor taking the specified argument Types + + + + + Returns a value indicating whether this Type has a public constructor taking the specified argument Types. + + + + + Construct an object of this Type, using the specified arguments. + + + + + Returns all methods declared by this type that have the specified attribute, optionally + including base classes. Methods from a base class are always returned before methods from a class that + inherits from it. + + Specifies whether to search the fixture type inheritance chain. + + + + An object implementing IXmlNodeBuilder is able to build + an XML representation of itself and any children. + + + + + Returns a TNode representing the current object. + + If true, children are included where applicable + A TNode representing the result + + + + Returns a TNode representing the current object after + adding it as a child of the supplied parent node. + + The parent node. + If true, children are included, where applicable + + + + + The ResultState class represents the outcome of running a test. + It contains two pieces of information. The Status of the test + is an enum indicating whether the test passed, failed, was + skipped or was inconclusive. The Label provides a more + detailed breakdown for use by client runners. + + + + + Initializes a new instance of the class. + + The TestStatus. + + + + Initializes a new instance of the class. + + The TestStatus. + The label. + + + + Initializes a new instance of the class. + + The TestStatus. + The stage at which the result was produced + + + + Initializes a new instance of the class. + + The TestStatus. + The label. + The stage at which the result was produced + + + + The result is inconclusive + + + + + The test has been skipped. + + + + + The test has been ignored. + + + + + The test was skipped because it is explicit + + + + + The test succeeded + + + + + The test issued a warning + + + + + The test failed + + + + + The test encountered an unexpected exception + + + + + The test was cancelled by the user + + + + + The test was not runnable. + + + + + A suite failed because one or more child tests failed or had errors + + + + + A suite failed because one or more child tests had warnings + + + + + A suite is marked ignored because one or more child tests were ignored + + + + + A suite failed in its OneTimeSetUp + + + + + A suite had an unexpected exception in its OneTimeSetUp + + + + + A suite had an unexpected exception in its OneTimeDown + + + + + Gets the TestStatus for the test. + + The status. + + + + Gets the label under which this test result is + categorized, or if none. + + + + + Gets the stage of test execution in which + the failure or other result took place. + + + + + Get a new ResultState, which is the same as the current + one but with the FailureSite set to the specified value. + + The FailureSite to use + A new ResultState + + + + Test whether this ResultState has the same Status and Label + as another one. In other words, the whether two are equal + ignoring the Site. + + + + + + Determines whether the specified object is equal to the current object. + The object to compare with the current object. + + + Indicates whether the current object is equal to another object of the same type. + An object to compare with this object. + + + Serves as the default hash function. + + + + Overload == operator for ResultStates + + + + + Overload != operator for ResultStates + + + + + Returns a that represents this instance. + + + A that represents this instance. + + + + + The FailureSite enum indicates the stage of a test + in which an error or failure occurred. + + + + + Failure in the test itself + + + + + Failure in the SetUp method + + + + + Failure in the TearDown method + + + + + Failure of a parent test + + + + + Failure of a child test + + + + + The RunState enum indicates whether a test can be executed. + + + + + The test is not runnable. + + + + + The test is runnable. + + + + + The test can only be run explicitly + + + + + The test has been skipped. This value may + appear on a Test when certain attributes + are used to skip the test. + + + + + The test has been ignored. May appear on + a Test, when the IgnoreAttribute is used. + + + + + The TestAttachment class represents a file attached to a TestResult, + with an optional description. + + + + + Absolute file path to attachment file + + + + + User specified description of attachment. May be null. + + + + + Creates a TestAttachment class to represent a file attached to a test result. + + Absolute file path to attachment file + User specified description of attachment. May be null. + + + + The class holds a message sent by a test to all listeners + + + + + Construct with text, destination type and + the name of the test that produced the message. + + Destination of the message + Text to be sent + ID of the test that produced the message + + + + Converts object to string + + + + + The message to send to listeners + + + + + The Destination of the message. + + + + + The ID of the test that sent the message + + + + + Returns the XML representation of the object. + + + + + The TestOutput class holds a unit of output from + a test to a specific output stream + + + + + Construct with text, output destination type and + the name of the test that produced the output. + + Text to be output + Name of the stream or channel to which the text should be written + Id of the test that produced the output + FullName of test that produced the output + + + + Return string representation of the object for debugging + + + + + + Get the text + + + + + Get the output type + + + + + Get the name of the test that created the output + + + + + Get the id of the test that created the output + + + + + Convert the TestOutput object to an XML string + + + + + The TestStatus enum indicates the result of running a test + + + + + The test was inconclusive + + + + + The test has been skipped + + + + + The test succeeded + + + + + There was a warning + + + + + The test failed + + + + + TNode represents a single node in the XML representation + of a Test or TestResult. It replaces System.Xml.XmlNode and + System.Xml.Linq.XElement, providing a minimal set of methods + for operating on the XML in a platform-independent manner. + + + + + Constructs a new instance of TNode + + The name of the node + + + + Constructs a new instance of TNode with a value + + The name of the node + The text content of the node + + + + Constructs a new instance of TNode with a value + + The name of the node + The text content of the node + Flag indicating whether to use CDATA when writing the text + + + + Gets the name of the node + + + + + Gets the value of the node + + + + + Gets a flag indicating whether the value should be output using CDATA. + + + + + Gets the dictionary of attributes + + + + + Gets a list of child nodes + + + + + Gets the first ChildNode + + + + + Gets the XML representation of this node. + + + + + Create a TNode from its XML text representation + + The XML text to be parsed + A TNode + + + + Adds a new element as a child of the current node and returns it. + + The element name. + The newly created child element + + + + Adds a new element with a value as a child of the current node and returns it. + + The element name + The text content of the new element + The newly created child element + + + + Adds a new element with a value as a child of the current node and returns it. + The value will be output using a CDATA section. + + The element name + The text content of the new element + The newly created child element + + + + Adds a child node to this node. + + The child node to add. + + + + Inserts a child nodeat the specified index. + + The zero-based index at which should be inserted. + The node to insert. + + + + Adds an attribute with a specified name and value to the XmlNode. + + The name of the attribute. + The value of the attribute. + + + + Finds a single descendant of this node matching an XPath + specification. The format of the specification is + limited to what is needed by NUnit and its tests. + + + + + + + Finds all descendants of this node matching an XPath + specification. The format of the specification is + limited to what is needed by NUnit and its tests. + + + + + Writes the XML representation of the node to an XmlWriter + + + + + + Class used to represent a list of XmlResults + + + + + Gets or sets the element at the specified index. + + + + + Gets the number of elements contained in the collection. + + + + + Returns an enumerator that iterates through the collection. + + + + + Class used to represent the attributes of a node + + + + + Gets or sets the value associated with the specified key. + Overridden to return null if attribute is not found. + + The key. + Value of the attribute or null + + + + Returns an enumerator that iterates through the collection. + + + + + Gets the number of key/value pairs contained in the . + + + + + A production implementation that delegates directly to .NET's . + + + + + Returns whether a debugger is currently attached to the process + + + + + A layer of abstraction around to facilitate testing. + + + + + Whether a debugger is currently attached to the process. + + + + + AssemblyHelper provides static methods for working + with assemblies. + + + + + Gets the path from which an assembly was loaded. + For builds where this is not possible, returns + the name of the assembly. + + The assembly. + The path. + + + + Gets the path to the directory from which an assembly was loaded. + + The assembly. + The path. + + + + Gets the AssemblyName of an assembly. + + The assembly + An AssemblyName + + + + Loads an assembly given a string, which may be the + path to the assembly or the AssemblyName + + + + + Gets the assembly path from code base. + + Public for testing purposes + The code base. + + + + + Adapts various styles of asynchronous waiting to a common API. + + + + + CombinatorialStrategy creates test cases by using all possible + combinations of the parameter data. + + + + + Gets the test cases generated by the CombiningStrategy. + + The test cases. + + + + Provides data from fields marked with the DatapointAttribute or the + DatapointsAttribute. + + + + + Creates a new DatapointProvider. + + Determines whether when searching for theory data members of declaring types will also be searched. + + + + Determines whether any data is available for a parameter. + + The parameter of a parameterized test. + + + + Retrieves data for use with the supplied parameter. + + The parameter of a parameterized test. + + + + Built-in SuiteBuilder for all types of test classes. + + + + + Examine the type and determine if it is suitable for + this builder to use in building a TestSuite. + + Note that returning false will cause the type to be ignored + in loading the tests. If it is desired to load the suite + but label it as non-runnable, ignored, etc., then this + method must return true. + + The fixture type to check + + + + Builds a single test suite from the specified type. + + The fixture type to build + + + + Builds a single test suite from the specified type, subject + to a filter that decides which methods are included. + + The fixture type to build + A PreFilter for selecting methods. + + + + We look for attributes implementing IFixtureBuilder at one level + of inheritance at a time. Attributes on base classes are not used + unless there are no fixture builder attributes at all on the derived + class. This is by design. + + The type being examined for attributes + + + + Class to build ether a parameterized or a normal NUnitTestMethod. + There are four cases that the builder must deal with: + 1. The method needs no params and none are provided + 2. The method needs params and they are provided + 3. The method needs no params but they are provided in error + 4. The method needs params but they are not provided + This could have been done using two different builders, but it + turned out to be simpler to have just one. The BuildFrom method + takes a different branch depending on whether any parameters are + provided, but all four cases are dealt with in lower-level methods + + + + + Determines if the method can be used to build an NUnit test + test method of some kind. The method must normally be marked + with an identifying attribute for this to be true. + + Note that this method does not check that the signature + of the method for validity. If we did that here, any + test methods with invalid signatures would be passed + over in silence in the test run. Since we want such + methods to be reported, the check for validity is made + in BuildFrom rather than here. + + An IMethodInfo for the method being used as a test method + + + + Builds a single test from the specified method and context, + possibly containing child test cases. + + The method for which a test is to be built + + + + Determines if the method can be used to build an NUnit test + test method of some kind. The method must normally be marked + with an identifying attribute for this to be true. + + Note that this method does not check that the signature + of the method for validity. If we did that here, any + test methods with invalid signatures would be passed + over in silence in the test run. Since we want such + methods to be reported, the check for validity is made + in BuildFrom rather than here. + + An IMethodInfo for the method being used as a test method + The test suite being built, to which the new test would be added + + + + Builds a single test from the specified method and context, + possibly containing child test cases. + + The method for which a test is to be built + The test fixture being populated, or null + + + + Builds a ParameterizedMethodSuite containing individual test cases. + + The method for which a test is to be built. + The list of test cases to include. + + + + Build a simple, non-parameterized TestMethod for this method. + + The MethodInfo for which a test is to be built + The test suite for which the method is being built + + + + Caches static information for IMethodInfo to reduce re-calculations and memory allocations from reflection. + + + + + Returns cached metadata for method instance. + + + + + Memoization of TestMethod information to reduce subsequent allocations from parameter and attribute information. + + + + + Class that can build a tree of automatic namespace + suites from a group of fixtures. + + + + + NamespaceDictionary of all test suites we have created to represent + namespaces. Used to locate namespace parent suites for fixtures. + + + + + Point in the tree where items in the global namespace are added + + + + + Initializes a new instance of the class. + + The root suite. + + + + Gets the root entry in the tree created by the NamespaceTreeBuilder. + + The root suite. + + + + Adds the specified fixtures to the tree. + + The fixtures to be added. + + + + Adds the specified fixture to the tree. + + The fixture to be added. + + + + NUnitTestCaseBuilder is a utility class used by attributes + that build test cases. + + + + + Constructs an + + + + + Builds a single NUnitTestMethod, either as a child of the fixture + or as one of a set of test cases under a ParameterizedTestMethodSuite. + + The MethodInfo from which to construct the TestMethod + The suite or fixture to which the new test will be added + The ParameterSet to be used, or null + + + + Checks to see if we have valid combinations of attributes. + + The TestMethod to be checked. If it + is found to be non-runnable, it will be modified. + Metadata for this TestMethod. + True if the method signature is valid, false if not + + + + Helper method that checks the signature of a TestMethod and + any supplied parameters to determine if the test is valid. + + Currently, NUnitTestMethods are required to be public, + non-abstract methods, either static or instance, + returning void. They may take arguments but the values must + be provided or the TestMethod is not considered runnable. + + Methods not meeting these criteria will be marked as + non-runnable and the method will return false in that case. + + The TestMethod to be checked. If it + is found to be non-runnable, it will be modified. + Metadata for this TestMethod. + Parameters to be used for this test, or null + True if the method signature is valid, false if not + + The return value is no longer used internally, but is retained + for testing purposes. + + + + + NUnitTestFixtureBuilder is able to build a fixture given + a class marked with a TestFixtureAttribute or an unmarked + class containing test methods. In the first case, it is + called by the attribute and in the second directly by + NUnitSuiteBuilder. + + + + + Build a TestFixture from type provided. A non-null TestSuite + must always be returned, since the method is generally called + because the user has marked the target class as a fixture. + If something prevents the fixture from being used, it should + be returned nonetheless, labeled as non-runnable. + + An ITypeInfo for the fixture to be used. + Filter used to select methods as tests. + A TestSuite object or one derived from TestSuite. + + + + Overload of BuildFrom called by tests that have arguments. + Builds a fixture using the provided type and information + in the ITestFixtureData object. + + The TypeInfo for which to construct a fixture. + Filter used to select methods as tests. + An object implementing ITestFixtureData or null. + + + + + Method to add test cases to the newly constructed fixture. + + + + + Method to create a test case from a MethodInfo and add + it to the fixture being built. It first checks to see if + any global TestCaseBuilder addin wants to build the + test case. If not, it uses the internal builder + collection maintained by this fixture builder. + + The default implementation has no test case builders. + Derived classes should add builders to the collection + in their constructor. + + The method for which a test is to be created + The test suite being built. + A newly constructed Test + + + + PairwiseStrategy creates test cases by combining the parameter + data so that all possible pairs of data items are used. + + + + The number of test cases that cover all possible pairs of test function + parameters values is significantly less than the number of test cases + that cover all possible combination of test function parameters values. + And because different studies show that most of software failures are + caused by combination of no more than two parameters, pairwise testing + can be an effective ways to test the system when it's impossible to test + all combinations of parameters. + + + The PairwiseStrategy code is based on "jenny" tool by Bob Jenkins: + https://burtleburtle.net/bob/math/jenny.html + + + + + + FleaRand is a pseudo-random number generator developed by Bob Jenkins: + https://burtleburtle.net/bob/rand/talksmall.html#flea + + + + + Initializes a new instance of the FleaRand class. + + The seed. + + + + FeatureInfo represents coverage of a single value of test function + parameter, represented as a pair of indices, Dimension and Feature. In + terms of unit testing, Dimension is the index of the test parameter and + Feature is the index of the supplied value in that parameter's list of + sources. + + + + + Initializes a new instance of FeatureInfo class. + + Index of a dimension. + Index of a feature. + + + + A FeatureTuple represents a combination of features, one per test + parameter, which should be covered by a test case. In the + PairwiseStrategy, we are only trying to cover pairs of features, so the + tuples actually may contain only single feature or pair of features, but + the algorithm itself works with triplets, quadruples and so on. + + + + + Initializes a new instance of FeatureTuple class for a single feature. + + Single feature. + + + + Initializes a new instance of FeatureTuple class for a pair of features. + + First feature. + Second feature. + + + + TestCase represents a single test case covering a list of features. + + + + + Initializes a new instance of TestCaseInfo class. + + A number of features in the test case. + + + + PairwiseTestCaseGenerator class implements an algorithm which generates + a set of test cases which covers all pairs of possible values of test + function. + + + + The algorithm starts with creating a set of all feature tuples which we + will try to cover (see method). This set + includes every single feature and all possible pairs of features. We + store feature tuples in the 3-D collection (where axes are "dimension", + "feature", and "all combinations which includes this feature"), and for + every two feature (e.g. "A" and "B") we generate both ("A", "B") and + ("B", "A") pairs. This data structure extremely reduces the amount of + time needed to calculate coverage for a single test case (this + calculation is the most time-consuming part of the algorithm). + + + Then the algorithm picks one tuple from the uncovered tuple, creates a + test case that covers this tuple, and then removes this tuple and all + other tuples covered by this test case from the collection of uncovered + tuples. + + + Picking a tuple to cover + + + There are no any special rules defined for picking tuples to cover. We + just pick them one by one, in the order they were generated. + + + Test generation + + + Test generation starts from creating a completely random test case which + covers, nevertheless, previously selected tuple. Then the algorithm + tries to maximize number of tuples which this test covers. + + + Test generation and maximization process repeats seven times for every + selected tuple and then the algorithm picks the best test case ("seven" + is a magic number which provides good results in acceptable time). + + Maximizing test coverage + + To maximize tests coverage, the algorithm walks through the list of mutable + dimensions (mutable dimension is a dimension that are not included in + the previously selected tuple). Then for every dimension, the algorithm + walks through the list of features and checks if this feature provides + better coverage than randomly selected feature, and if yes keeps this + feature. + + + This process repeats while it shows progress. If the last iteration + doesn't improve coverage, the process ends. + + + In addition, for better results, before start every iteration, the + algorithm "scrambles" dimensions - so for every iteration dimension + probes in a different order. + + + + + + Creates a set of test cases for specified dimensions. + + + An array which contains information about dimensions. Each element of + this array represents a number of features in the specific dimension. + + + A set of test cases. + + + + + Gets the test cases generated by this strategy instance. + + A set of test cases. + + + + The ParameterDataProvider class implements IParameterDataProvider + and hosts one or more individual providers. + + + + + Construct with a collection of individual providers + + + + + Determines whether any data is available for a parameter. + + The parameter of a parameterized test + + + + Retrieves data for use with the supplied parameter. + + The parameter of a parameterized test + + + + ParameterDataSourceProvider supplies individual argument values for + single parameters using attributes implementing IParameterDataSource. + + + + + Determines whether any data is available for a parameter. + + The parameter of a parameterized test + + + + Retrieves data for use with the supplied parameter. + + The parameter of a parameterized test + + + + SequentialStrategy creates test cases by using all of the + parameter data sources in parallel, substituting + when any of them run out of data. + + + + + Gets the test cases generated by the CombiningStrategy. + + The test cases. + + + + Caches static information for ITestAction to reduce re-calculations and memory allocations from reflection. + + + + + Returns cached metadata for method instance. + + + + + Memoization of Test information to reduce subsequent allocations from parameter and attribute information. + + + + + TestActionAfterCommand handles the AfterTest method of a single + TestActionItem, provided the items BeforeTest has been run. + + + + + Initializes a new instance of the class. + + The inner command. + The TestActionItem to run before the inner command. + + + + AfterCommand is a DelegatingTestCommand that performs some + specific action after the inner command is run. + + + + + Construct an AfterCommand + + + + + Execute the command + + + + + Set this to perform action after the inner command. + + + + + ContextSettingsCommand applies specified changes to the + TestExecutionContext prior to running a test. No special + action is needed after the test runs, since the prior + context will be restored automatically. + + + + + TestActionCommand handles a single ITestAction applied + to a test. It runs the BeforeTest method, then runs the + test and finally runs the AfterTest method. + + + + + Initializes a new instance of the class. + + The inner command. + + + + Runs the test, saving a TestResult in the supplied TestExecutionContext. + + The context in which the test should run. + A TestResult + + + + Perform the before test action + + + + + Perform the after test action + + + + + TestActionBeforeCommand handles the BeforeTest method of a single + TestActionItem, relying on the item to remember it has been run. + + + + + Initializes a new instance of the class. + + The inner command. + The TestActionItem to run before the inner command. + + + + BeforeTestCommand is a DelegatingTestCommand that performs some + specific action before the inner command is run. + + + + + Construct a BeforeCommand + + + + + Execute the command + + + + + Action to perform before the inner command. + + + + + creates a timer in order to cancel + a test if it exceeds a specified time and adjusts + the test result if it did time out. + + + + + Initializes a new instance of the class. + + The inner command + Timeout value + An instance + + + + Runs the test, saving a TestResult in the supplied TestExecutionContext. + + The context in which the test should run. + A TestResult + + + + ConstructFixtureCommand constructs the user test object if necessary. + + + + + Constructs a OneTimeSetUpCommand for a suite + + The inner command to which the command applies + + + + DelegatingTestCommand wraps an inner TestCommand. + Derived classes may do what they like before or + after running the inner command. + + + + TODO: Documentation needed for field + + + + Initializes a new instance of the class. + + The inner command. + + + + Runs the test with exception handling. + + + + + OneTimeTearDownCommand performs any teardown actions + specified for a suite and calls Dispose on the user + test object, if any. + + + + + Construct a OneTimeTearDownCommand + + The command wrapped by this command + + + + EmptyTestCommand is a TestCommand that does nothing. It simply + returns the current result from the context when executed. We + use it to avoid testing for null when executing a chain of + DelegatingTestCommands. + + + + + Construct a NullCommand for a test + + + + + Execute the command + + + + + ConstructFixtureCommand constructs the user test object if necessary. + + + + + Handles the construction and disposement of a fixture per test case + + The inner command to which the command applies + + + + adjusts the result of a successful test + to a failure if the elapsed time has exceeded the specified maximum + time allowed. + + + + + Initializes a new instance of the class. + + The inner command. + The max time allowed in milliseconds + + + + OneTimeSetUpCommand runs any one-time setup methods for a suite, + constructing the user test object if necessary. + + + + + Constructs a OneTimeSetUpCommand for a suite + + The inner command to which the command applies + A SetUpTearDownList for use by the command + + + + OneTimeTearDownCommand performs any teardown actions + specified for a suite and calls Dispose on the user + test object, if any. + + + + + Construct a OneTimeTearDownCommand + + The command wrapped by this command + A SetUpTearDownList for use by the command + + + + SetUpTearDownCommand runs SetUp methods for a suite, + runs the test and then runs TearDown methods. + + + + + Initializes a new instance of the class. + + The inner command. + List of setup/teardown items + + + + SetUpTearDownItem holds the setup and teardown methods + for a single level of the inheritance hierarchy. + + + + + Construct a SetUpTearDownNode + + A list of setup methods for this level + A list teardown methods for this level + A method validator to validate each method before calling. + + + + Returns true if this level has any methods at all. + This flag is used to discard levels that do nothing. + + + + + Run SetUp on this level. + + The execution context to use for running. + + + + Run TearDown for this level. + + + + + + TODO: Documentation needed for class + + + + + Initializes a new instance of the class. + + The test being skipped. + + + + Overridden to simply set the CurrentResult to the + appropriate Skipped state. + + The execution context for the test + A TestResult + + + + TestActionCommand handles a single ITestAction applied + to a test. It runs the BeforeTest method, then runs the + test and finally runs the AfterTest method. + + + + + Initializes a new instance of the class. + + The inner command. + The TestAction with which to wrap the inner command. + + + + TestActionItem wraps a single execution of an ITestAction. + Its primary purpose is to track whether the BeforeTest + method has been called and suppress calling the + AfterTest method if it has not. This is necessary when + ITestActions are used before and after a CompositeWorkItem, + since the OneTimeSetUpCommand and OneTimeTearDownCommand + are separate command chains. By sharing a TestActionItem + between the setup and teardown chains, the two calls can + be coordinated. + + + + + Construct a TestActionItem + + The ITestAction to be included + + + + Get flag indicating if the BeforeTest entry was already called. + + + + + Run the BeforeTest method of the action and remember that it has been run. + + The test to which the action applies + + + + Run the AfterTest action, but only if the BeforeTest + action was actually run. + + The test to which the action applies + + + + TestCommand is the abstract base class for all test commands + in the framework. A TestCommand represents a single stage in + the execution of a test, e.g.: SetUp/TearDown, checking for + Timeout, verifying the returned result from a method, etc. + + TestCommands may decorate other test commands so that the + execution of a lower-level command is nested within that + of a higher level command. All nested commands are executed + synchronously, as a single unit. Scheduling test execution + on separate threads is handled at a higher level, using the + task dispatcher. + + + + + Construct a TestCommand for a test. + + The test to be executed + + + + Gets the test associated with this command. + + + + + Runs the test in a specified context, returning a TestResult. + + The TestExecutionContext to be used for running the test. + A TestResult + + + + TestMethodCommand is the lowest level concrete command + used to run actual test cases. + + + + + Initializes a new instance of the class. + + The test. + + + + Runs the test, saving a TestResult in the execution context, as + well as returning it. If the test has an expected result, it + is asserts on that value. Since failed tests and errors throw + an exception, this command must be wrapped in an outer command, + will handle that exception and records the failure. This role + is usually played by the SetUpTearDown command. + + The execution context + + + + TheoryResultCommand adjusts the result of a Theory so that + it fails if all the results were inconclusive. + + + + + Constructs a TheoryResultCommand + + The command to be wrapped by this one + + + + creates a timer in order to cancel + a test if it exceeds a specified time and adjusts + the test result if it did time out. + + + + + Initializes a new instance of the class. + + The inner command + Timeout value + An instance + + + + Provides methods to support consistent checking in constraints. + + + + + Requires that the provided object is actually of the type required. + + The object to verify. + Name of the parameter as passed into the checking method. + + If and can be null, returns null rather than throwing when is null. + If cannot be null, this parameter is ignored. + The type to require. + + + + CultureDetector is a helper class used by NUnit to determine + whether a test should be run based on the current culture. + + + + + Default constructor uses the current culture. + + + + + Construct a CultureDetector for a particular culture for testing. + + The culture to be used + + + + Test to determine if one of a collection of cultures + is being used currently. + + + + + + + Tests to determine if the current culture is supported + based on a culture attribute. + + The attribute to examine + + + + + Test to determine if the a particular culture or comma- + delimited set of cultures is in use. + + Name of the culture or comma-separated list of culture ids + True if the culture is in use on the system + + + + Return the last failure reason. Results are not + defined if called before IsSupported( Attribute ) + is called. + + + + + Useful when wrapping awaiters whose GetResult method does not block until complete. + Contains a default mechanism to implement + via and . + + + + + Checks if string contains any character that might need escaping. + + + + + Checks whether given char *might* need escaping. + + False when absolutely no escaping is needed, otherwise true. + + + + ExceptionHelper provides static methods for working with exceptions + + + + + Rethrows an exception, preserving its stack trace + + The exception to rethrow + + + + Builds up a message, using the Message field of the specified exception + as well as any InnerExceptions. Optionally excludes exception names, + creating a more readable message. + + The exception. + Flag indicating whether exception names should be excluded. + A combined message string. + + + + Builds up a message, using the Message field of the specified exception + as well as any InnerExceptions. + + The exception. + A combined stack trace. + + + + Executes a parameterless synchronous or async delegate and returns the exception it throws, if any. + + + + + Unwraps the exception of type to its InnerException. + + The exception to unwrap. + The InnerException is available, otherwise the . + + + + A CompositeWorkItem represents a test suite and + encapsulates the execution of the suite as well + as all its child tests. + + + + + List of Child WorkItems + + + + + Indicates whether this work item should use a separate dispatcher. + + + + + Construct a CompositeWorkItem for executing a test suite + using a filter to select child tests. + + The TestSuite to be executed + A filter used to select child tests + + + + Method that actually performs the work. Overridden + in CompositeWorkItem to do one-time setup, run all child + items and then dispatch the one-time teardown work item. + + + + + + + + + + Cancel (abort or stop) a CompositeWorkItem and all of its children + + true if the CompositeWorkItem and all of its children should be aborted, false if it should allow all currently running tests to complete + + + + OneTimeTearDownWorkItem represents the cleanup + and one-time teardown phase of a CompositeWorkItem + + + + + Construct a OneTimeTearDownWOrkItem wrapping a CompositeWorkItem + + The CompositeWorkItem being wrapped + + + + The WorkItem name, overridden to indicate this is the teardown. + + + + + The ExecutionStrategy for use in running this work item + + + + + + + + + + PerformWork is not used in CompositeWorkItem + + + + + WorkItemCancelled is called directly by the parallel dispatcher + when a test suite is left hanging after a forced StopRun. We + simulate WorkItemComplete() but without the ripple effect to + higher level suites, since we are controlling it all directly. + + + + + EventListenerTextWriter sends text output to the currently active + ITestEventListener in the form of a TestOutput object. If no event + listener is active in the context, or if there is no context, + the output is forwarded to the supplied default writer. + + + + + Construct an EventListenerTextWriter + + The name of the stream to use for events + The default writer to use if no listener is available + + + + Get the Encoding for this TextWriter + + + + + Write formatted string + + + + + Write formatted string + + + + + Write formatted string + + + + + Write an object + + + + + Write a string + + + + + Write a decimal + + + + + Write a double + + + + + Write formatted string + + + + + Write a ulong + + + + + Write a long + + + + + Write a uint + + + + + Write an int + + + + + Write a char + + + + + Write a boolean + + + + + Write chars + + + + + Write chars + + + + + Write a float + + + + + Write a string with newline + + + + + Write an object with newline + + + + + Write formatted string with newline + + + + + Write formatted string with newline + + + + + Write formatted string with newline + + + + + Write a decimal with newline + + + + + Write a formatted string with newline + + + + + Write a double with newline + + + + + Write a uint with newline + + + + + Write a ulong with newline + + + + + Write a long with newline + + + + + Write an int with newline + + + + + Write a bool with newline + + + + + Write chars with newline + + + + + Write chars with newline + + + + + Write a char with newline + + + + + Write a float with newline + + + + + Write newline + + + + + The EventPumpState enum represents the state of an + EventPump. + + + + + The pump is stopped + + + + + The pump is pumping events with no stop requested + + + + + The pump is pumping events but a stop has been requested + + + + + EventPump pulls events out of an EventQueue and sends + them to a listener. It is used to send events back to + the client without using the CallContext of the test + runner thread. + + + + + The downstream listener to which we send events + + + + + The queue that holds our events + + + + + Thread to do the pumping + + + + + The current state of the event pump + + + + + Constructor + + The EventListener to receive events + The event queue to pull events from + + + + Gets or sets the current state of the pump + + + + + Gets or sets the name of this EventPump + (used only internally and for testing). + + + + + Dispose stops the pump + Disposes the used WaitHandle, too. + + + + + Start the pump + + + + + Tell the pump to stop after emptying the queue. + + + + + Our thread proc for removing items from the event + queue and sending them on. Note that this would + need to do more locking if any other thread were + removing events from the queue. + + + + + NUnit.Core.Event is the abstract base for all stored events. + An Event is the stored representation of a call to the + ITestListener interface and is used to record such calls + or to queue them for forwarding on another thread or at + a later time. + + + + + The Send method is implemented by derived classes to send the event to the specified listener. + + The listener. + + + + TestStartedEvent holds information needed to call the TestStarted method. + + + + + Initializes a new instance of the class. + + The test. + + + + Calls TestStarted on the specified listener. + + The listener. + + + + TestFinishedEvent holds information needed to call the TestFinished method. + + + + + Initializes a new instance of the class. + + The result. + + + + Calls TestFinished on the specified listener. + + The listener. + + + + TestOutputEvent holds information needed to call the TestOutput method. + + + + + Initializes a new instance of the class. + + The output object. + + + + Calls TestOutput on the specified listener. + + The listener. + + + + TestMessageEvent holds information needed to call the SendMessage method. + + + + + Initializes a new instance of the class. + + The test message object. + + + + Calls on the specified listener. + + The listener. + + + + Holds object for sending to all listeners + + + + + Implements a queue of work items each of which + is queued as a WaitCallback. + + + + + Gets the count of items in the queue. + + + + + Enqueues the specified event + + The event to enqueue. + + + + Removes the first element from the queue and returns it (or ). + + + If and the queue is empty, the calling thread is blocked until + either an element is enqueued, or is called. + + + + + If the queue not empty + the first element. + + + otherwise, if == + or has been called + . + + + + + + + Stop processing of the queue + + + + + Validates method to execute. + + + + + Determines whether a method is allowed to execute and throws an exception otherwise. + + The method to validate. + + + + An IWorkItemDispatcher handles execution of work items. + + + + + The level of parallelism supported. Zero if not supported. + + + + + Start execution, performing any initialization. Sets + the top level work item and dispatches it. + + + + + Dispatch a single work item for execution. The first + work item dispatched is saved as the top-level + work item and used when stopping the run. + + The item to dispatch + + + + Cancel the ongoing run completely. + If no run is in process, the call has no effect. + + true if the IWorkItemDispatcher should abort all currently running WorkItems, false if it should allow all currently running WorkItems to complete + + + + MainThreadWorkItemDispatcher handles execution of WorkItems by + directly executing them on the main thread. This is different + from the SimpleWorkItemDispatcher where the work item is dispatched + onto its own thread. + + + + + The level of parallelism supported + + + + + Start execution, dispatching the top level + work into the main thread. + + + + + Dispatch a single work item for execution by + executing it directly. + + The item to dispatch + + + + This method is not supported for + this dispatcher. Using it will throw a + NotSupportedException. + + Not used + If used, it will always throw this. + + + + Enumeration representing the strategy to follow in executing a work item. + The value is only relevant when running under the parallel dispatcher. + + + + + Run directly on same thread + + + + + Enqueue for parallel execution + + + + + Enqueue for non-parallel execution + + + + + ParallelWorkItemDispatcher handles execution of work items by + queuing them for worker threads to process. + + + + + Event raised whenever a shift is starting. + + + + + Event raised whenever a shift has ended. + + + + + Construct a ParallelWorkItemDispatcher + + Number of workers to use + + + + Number of parallel worker threads + + + + + Enumerates all the shifts supported by the dispatcher + + + + + Enumerates all the Queues supported by the dispatcher + + + + + Start execution, setting the top level work, + enqueuing it and starting a shift to execute it. + + + + + Dispatch a single work item for execution. The first + work item dispatched is saved as the top-level + work item and used when stopping the run. + + The item to dispatch + + + + Cancel the ongoing run completely. + If no run is in process, the call has no effect. + + + + + Save the state of the queues and create a new isolated set + + + + + Try to remove isolated queues and restore old ones + + + + + QueuingEventListener uses an EventQueue to store any + events received on its EventListener interface. + + + + + The EventQueue created and filled by this listener + + + + + Construct a QueuingEventListener + + + + + A test has started + + The test that is starting + + + + A test case finished + + Result of the test case + + + + Called when a test produces output for immediate display + + A TestOutput object containing the text to display + + + + Called when a test produces a message to be sent to listeners + + A object containing the text to send + + + + A SimpleWorkItem represents a single test case and is + marked as completed immediately upon execution. This + class is also used for skipped or ignored test suites. + + + + + Construct a simple work item for a test. + + The test to be executed + The filter used to select this test + An instance + + + + Method that performs actually performs the work. + + + + + Creates a test command for use in running this test. + + A TestCommand + + + + SimpleWorkItemDispatcher handles execution of WorkItems by + directly executing them. It is provided so that a dispatcher + is always available in the context, thereby simplifying the + code needed to run child tests. + + + + + The level of parallelism supported + + + + + Start execution, creating the execution thread, + setting the top level work and dispatching it. + + + + + Dispatch a single work item for execution by + executing it directly. + + The item to dispatch + + + + Cancel (abort or stop) the ongoing run. + If no run is in process, the call has no effect. + + true if the run should be aborted, false if it should allow its currently running test to complete + + + + Checks whether the method to execute is static. + + + + + Construct a StaticMethodValidator. + + The error message to output in case the validation fails. + + + + Determines whether a method to execute is static and throws an InvalidOperationException otherwise. + + The method to validate. + + + + A TestWorker pulls work items from a queue + and executes them. + + + + + Event handler for TestWorker events + + The TestWorker sending the event + The WorkItem that caused the event + + + + Event signaled immediately before executing a WorkItem + + + + + Event signaled immediately after executing a WorkItem + + + + + Construct a new TestWorker. + + The queue from which to pull work items + The name of this worker + + + + The WorkItemQueue from which this worker pulls WorkItems + + + + + The name of this worker - also used for the thread + + + + + Indicates whether the worker thread is running + + + + + Our ThreadProc, which pulls and runs tests in a loop + + + + + Create thread and start processing work items. + + + + + Stop the thread, either immediately or after finishing the current WorkItem + + true if the thread should be aborted, false if it should allow the currently running test to complete + + + + The TextCapture class intercepts console output and writes it + to the current execution context, if one is present on the thread. + If no execution context is found, the output is written to a + default destination, normally the original destination of the + intercepted output. + + + + + Construct a TextCapture object + + The default destination for non-intercepted output + + + + Gets the Encoding in use by this TextWriter + + + + + Writes a single character + + The char to write + + + + Writes a string + + The string to write + + + + Writes a string followed by a line terminator + + The string to write + + + + A WorkItem may be an individual test case, a fixture or + a higher level grouping of tests. All WorkItems inherit + from the abstract WorkItem class, which uses the template + pattern to allow derived classes to perform work in + whatever way is needed. + + A WorkItem is created with a particular TestExecutionContext + and is responsible for re-establishing that context in the + current thread before it begins or resumes execution. + + + + + Construct a WorkItem for a particular test. + + The test that the WorkItem will run + Filter used to include or exclude child items + + + + Construct a work Item that wraps another work Item. + Wrapper items are used to represent independently + dispatched tasks, which form part of the execution + of a single test, such as OneTimeTearDown. + + The WorkItem being wrapped + + + + Initialize the TestExecutionContext. This must be done + before executing the WorkItem. + + + Originally, the context was provided in the constructor + but delaying initialization of the context until the item + is about to be dispatched allows changes in the parent + context during OneTimeSetUp to be reflected in the child. + + The TestExecutionContext to use + + + + Event triggered when the item is complete + + + + + Gets the current state of the WorkItem + + + + + The test being executed by the work item + + + + + The name of the work item - defaults to the Test name. + + + + + Filter used to include or exclude child tests + + + + + The execution context + + + + + The worker executing this item. + + + + + The ParallelExecutionStrategy to use for this work item + + + + + Indicates whether this work item should use a separate dispatcher. + + + + + The test result + + + + + Gets the ParallelScope associated with the test, if any, + otherwise returning ParallelScope.Default; + + + + + Execute the current work item, including any + child work items. + + + + + Wait until the execution of this item is complete + + + + + Marks the WorkItem as NotRunnable. + + Reason for test being NotRunnable. + + + + Cancel (abort or stop) a WorkItem + + true if the WorkItem should be aborted, false if it should run to completion + + + + Standard Dispose + + + + + Method that performs actually performs the work. It should + set the State to WorkItemState.Complete when done. + + + + + Method called by the derived class when all work is complete + + + + + Builds the set up tear down list. + + Unsorted array of setup MethodInfos. + Unsorted array of teardown MethodInfos. + Method validator used before each method execution. + A list of SetUpTearDownItems + + + + Changes the result of the test, logging the old and new states + + The new ResultState + The new message + + + + Recursively walks up the test hierarchy to see if the + has been set on any of the parent tests. + + + + + WorkItemBuilder class knows how to build a tree of work items from a tree of tests + + + + + Creates a work item. + + The test for which this WorkItem is being created. + The filter to be used in selecting any child Tests. + True if child work items should be created and added. + + + + + Creates a work item. + + The test for which this WorkItem is being created. + The filter to be used in selecting any child Tests. + An instance. + True if child work items should be created and added. + if work item needs to be created unconditionally, if will be returned for tests that don't match the filter. + + + + + Compares two objects and returns a value indicating whether one is less than, equal to, or greater than the other. + + + A signed integer that indicates the relative values of and , as shown in the following table.Value Meaning Less than zero is less than .Zero equals .Greater than zero is greater than . + + The first object to compare.The second object to compare. + + + + WorkItemQueueState indicates the current state of a WorkItemQueue + + + + + The queue is paused + + + + + The queue is running + + + + + The queue is stopped + + + + + A WorkItemQueue holds work items that are ready to + be run, either initially or after some dependency + has been satisfied. + + + + + Initializes a new instance of the class. + + The name of the queue. + Flag indicating whether this is a parallel queue + ApartmentState to use for items on this queue + + + + Gets the name of the work item queue. + + + + + Gets a flag indicating whether this queue is used for parallel execution + + + + + Gets the target ApartmentState for work items on this queue + + + + + Gets the total number of items processed so far + + + + + Gets the current state of the queue + + + + + Get a bool indicating whether the queue is empty. + + + + + Enqueue a WorkItem to be processed + + The WorkItem to process + + + + Enqueue a WorkItem to be processed - internal for testing + + The WorkItem to process + The priority at which to process the item + + + + Dequeue a WorkItem for processing + + A WorkItem or null if the queue has stopped + + + + Start or restart processing of items from the queue + + + + + Signal the queue to stop + + + + + Pause the queue for restarting later + + + + + Save the current inner queue and create new ones for use by + a non-parallel fixture with parallel children. + + + + + Restore the inner queue that was previously saved + + + + + The current state of a work item + + + + + Ready to run or continue + + + + + Work Item is executing + + + + + Complete + + + + + Handler for ShiftChange events. + + The shift that is starting or ending. + + + + The dispatcher needs to do different things at different, + non-overlapped times. For example, non-parallel tests may + not be run at the same time as parallel tests. We model + this using the metaphor of a working shift. The WorkShift + class associates one or more WorkItemQueues with one or + more TestWorkers. + + Work in the queues is processed until all queues are empty + and all workers are idle. Both tests are needed because a + worker that is busy may end up adding more work to one of + the queues. At that point, the shift is over and another + shift may begin. This cycle continues until all the tests + have been run. + + + + + Construct a WorkShift + + + + + Event that fires when the shift has ended + + + + + The Name of this shift + + + + + Gets a flag indicating whether the shift is currently active + + + + + Gets a bool indicating whether this shift has any work to do + + + + + Gets a list of the queues associated with this shift. + + Internal for testing - immutable once initialized + + + + Gets the list of workers associated with this shift. + + Internal for testing - immutable once initialized + + + + Add a WorkItemQueue to the shift, starting it if the + shift is currently active. + + + + + Assign a worker to the shift. + + + + + + Start or restart processing for the shift + + + + + End the shift, pausing all queues and raising + the EndOfShift event. + + + + + Shut down the shift. + + + + + Cancel (abort or stop) the shift without completing all work + + true if the WorkShift should be aborted, false if it should allow its currently running tests to complete + + + + TextMessageWriter writes constraint descriptions and messages + in displayable form as a text stream. It tailors the display + of individual message components to form the standard message + format of NUnit assertion failure messages. + + + + + Prefix used for the expected value line of a message + + + + + Prefix used for the actual value line of a message + + + + + Prefix used for the actual difference between actual and expected values if compared with a tolerance + + + + + Length of a message prefix + + + + + Construct a TextMessageWriter + + + + + Construct a TextMessageWriter, specifying a user message + and optional formatting arguments. + + + + + + + Gets or sets the maximum line length for this writer + + + + + Method to write single line message with optional args, usually + written to precede the general failure message, at a given + indentation level. + + The indentation level of the message + The message to be written + Any arguments used in formatting the message + + + + Display Expected and Actual lines for a constraint. This + is called by MessageWriter's default implementation of + WriteMessageTo and provides the generic two-line display. + + The result of the constraint that failed + + + + Gets the unique type name between expected and actual. + + The expected value + The actual value causing the failure + Output of the unique type name for expected + Output of the unique type name for actual + + + + Display Expected and Actual lines for given values. This + method may be called by constraints that need more control over + the display of actual and expected values than is provided + by the default implementation. + + The expected value + The actual value causing the failure + + + + Display Expected and Actual lines for given values, including + a tolerance value on the expected line. + + The expected value + The actual value causing the failure + The tolerance within which the test was made + + + + Display the expected and actual string values on separate lines. + If the mismatch parameter is >=0, an additional line is displayed + line containing a caret that points to the mismatch point. + + The expected string value + The actual string value + The point at which the strings don't match or -1 + If true, case is ignored in string comparisons + If true, clip the strings to fit the max line length + + + + Writes the text for an actual value. + + The actual value. + + + + Writes the text for a generalized value. + + The value. + + + + Writes the text for a collection value, + starting at a particular point, to a max length + + The collection containing elements to write. + The starting point of the elements to write + The maximum number of elements to write + + + + Write the generic 'Expected' line for a constraint + + The constraint that failed + + + + Write the generic 'Expected' line for a given value + and tolerance. + + The expected value + The tolerance within which the test was made + + + + Write the generic 'Actual' line for a constraint + + The ConstraintResult for which the actual value is to be written + + + + Write the generic 'Actual' line for a given value + + The actual value causing a failure + + + + Checks if the last element of an argument list is a + + + + + Checks if the last type of a parameter list has a type + + + + + Extensions to . + + + + + Adds the skip reason to tests that are ignored until a specific date. + + The test properties to add the skip reason to + The date that the test is being ignored until + The reason the test is being ignored until that date + + + + Gets the single value for a key or + returns if the key is not found. + + The type of the value to return. + The propertybag to search the value for. + The key to get the value for. + The value to return if does not contain an entry for . + The value for or . + + + + Combines multiple filters so that a test must pass all + of them in order to pass this filter. + + + + + Constructs an empty AndFilter + + + + + Constructs an AndFilter from an array of filters + + + + + + Checks whether the AndFilter is matched by a test + + The test to be matched + If set to we are carrying a negation through + True if all the component filters pass, otherwise false + + + + Checks whether the AndFilter is matched by a test + + The test to be matched + True if all the component filters match, otherwise false + + + + Checks whether the AndFilter is explicit matched by a test. + + The test to be matched + True if all the component filters explicit match, otherwise false + + + + Gets the element name + + Element name + + + + CategoryFilter is able to select or exclude tests + based on their categories. + + + + + Construct a CategoryFilter using a single category name + + A category name + Indicated that the value in is a regular expression. + + + + Check whether the filter matches a test + + The test to be matched + + + + + Gets the element name + + Element name + + + + ClassName filter selects tests based on the class FullName + + + + + Construct a FullNameFilter for a single name + + The name the filter will recognize. + Indicated that the value in is a regular expression. + + + + Match a test against a single value. + + + + + Gets the element name + + Element name + + + + A base class for multi-part filters + + + + + Constructs an empty CompositeFilter + + + + + Constructs a CompositeFilter from an array of filters + + + + + + Return a list of the composing filters. + + + + + Checks whether the CompositeFilter is matched by a test. + + The test to be matched + If set to we are carrying a negation through + + + + Checks whether the CompositeFilter is matched by a test. + + The test to be matched + + + + Checks whether the CompositeFilter is explicit matched by a test. + + The test to be matched + + + + Adds an XML node + + Parent node + True if recursive + The added XML node + + + + Gets the element name + + Element name + + + + FullName filter selects tests based on their FullName + + + + + Construct a FullNameFilter for a single name + + The name the filter will recognize. + Indicated that the value in is a regular expression. + + + + Match a test against a single value. + + + + + Gets the element name + + Element name + + + + IdFilter selects tests based on their id + + + + + Construct an IdFilter for a single value + + The id the filter will recognize. + + + + Match a test against a single value. + + + + + Gets the element name + + Element name + + + + Optimized filter to check in condition using HashSet. + + + + + Constructs new InFilter. + + Selector to get value to check. + Valid values for the filter. + The XML element name the original filter used. + + + + Tries to optimize OrFilter into InFilter if contained filters are all same and non-regex. + + + + + FullName filter selects tests based on their FullName + + + + + Construct a MethodNameFilter for a single name + + The name the filter will recognize. + Indicated that the value in is a regular expression. + + + + Match a test against a single value. + + + + + Gets the element name + + Element name + + + + ClassName filter selects tests based on the class FullName + + + + + Construct a NamespaceFilter for a single namespace + + The namespace the filter will recognize. + Indicated that the value in is a regular expression. + + + + Match a test against a single value. + + + + + Gets the element name + + Element name + + + + NotFilter negates the operation of another filter + + + + + Construct a not filter on another filter + + The filter to be negated + + + + Gets the base filter + + + + + Determine if a particular test passes the filter criteria. + + The test to which the filter is applied + If set to we are carrying a negation through + True if the test passes the filter, otherwise false + + + + Check whether the filter matches a test + + The test to be matched + True if it matches, otherwise false + + + + Determine if a test matches the filter explicitly. That is, it must + be a direct match of the test itself or one of its children. + + The test to which the filter is applied + True if the test matches the filter explicitly, otherwise false + + + + Adds an XML node + + Parent node + True if recursive + The added XML node + + + + Combines multiple filters so that a test must pass one + of them in order to pass this filter. + + + + + Constructs an empty OrFilter + + + + + Constructs an OrFilter from an array of filters + + + + + + Checks whether the OrFilter is matched by a test + + The test to be matched + If set to we are carrying a negation through + True if any of the component filters pass, otherwise false + + + + Checks whether the OrFilter is matched by a test + + The test to be matched + True if any of the component filters match, otherwise false + + + + Checks whether the OrFilter is explicit matched by a test + + The test to be matched + True if any of the component filters explicit match, otherwise false + + + + Gets the element name + + Element name + + + + PartitionFilter filter matches a subset of tests based upon a chosen partition number and partition count + + This is helpful when you may want to run a subset of tests (eg, across 3 machines - or partitions), each with a separately assigned partition number and fixed partition count + + + + + The matching partition number (between 1 and Partition Count, inclusive) this filter should match on + + + + + The number of partitions available to use when assigning a matching partition number for each test this filter should match on + + + + + Construct a PartitionFilter that matches tests that have the assigned partition number from the total partition count + + The partition number this filter will recognize and match on. + The total number of partitions that should be configured when assigning each test to a partition number. + + + + Create a new PartitionFilter from the provided string value, or return false if the value could not be parsed + + The partition value (eg, 1/10 to indicate partition 1 of 10) + The created PartitionFilter if the parsing succeeded + True on successful parsing, or False if there is an error + + + + Match a test against a single value. + + + + + Adds a PartitionFilter XML node to the provided parentNode + + Parent node + True if recursive + The added XML node + + + + Computes the Partition Number that has been assigned to the provided ITest value (based upon the configured Partition Count) + + A partition value between 1 and PartitionCount, inclusive + A partition value between 1 and PartitionCount, inclusive + + + + Computes an unsigned integer hash value based upon the provided string + + + + + PropertyFilter is able to select or exclude tests + based on their properties. + + + + + Construct a PropertyFilter using a property name and expected value + + A property name + The expected value of the property + Indicated that the value in is a regular expression. + + + + Check whether the filter matches a test + + The test to be matched + + + + Adds an XML node + + Parent node + True if recursive + The added XML node + + + + Gets the element name + + Element name + + + + TestName filter selects tests based on their Name + + + + + Construct a TestNameFilter for a single name + + The name the filter will recognize. + Indicated that the value in is a regular expression. + + + + Match a test against a single value. + + + + + Gets the element name + + Element name + + + + ValueMatchFilter selects tests based on some value, which + is expected to be contained in the test. + + + + + Returns the value matched by the filter - used for testing + + + + + Indicates whether the value is a regular expression + + + + + Construct a ValueMatchFilter for a single value. + + The value to be included. + Indicated that the value in is a regular expression. + + + + Match the input provided by the derived class + + The value to be matched + True for a match, false otherwise. + + + + Adds an XML node + + Parent node + True if recursive + The added XML node + + + + Gets the element name + + Element name + + + + GenericMethodHelper is able to deduce the Type arguments for + a generic method from the actual arguments provided. + + + + + A special value, which is used to indicate that BestCommonType() method + was unable to find a common type for the specified arguments. + + + + + Construct a GenericMethodHelper for a method + + MethodInfo for the method to examine + + + + Return the type arguments for the method, deducing them + from the arguments actually provided. + + The arguments to the method + If successful, an array of type arguments. + + + + A minimalistic implementation of an immutable stack. Add members as needed. + + + + + Represents an empty stack. may be used instead. + + + + + Returns a new immutable stack which begins with the specified value and continues with the values in the + current stack. + + The beginning value of the new stack. + + + + InvalidTestFixtureException is thrown when an appropriate test + fixture constructor using the provided arguments cannot be found. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The message. + + + + Initializes a new instance of the class. + + The message. + The inner. + + + + Serialization Constructor + + + + + InvalidPlatformException is thrown when the platform name supplied + to a test is not recognized. + + + + + Instantiates a new instance of the class. + + + + + Instantiates a new instance of the class + + The message. + + + + Instantiates a new instance of the class + + The message. + The inner. + + + + Serialization constructor for the class + + + + + InvalidTestFixtureException is thrown when an appropriate test + fixture constructor using the provided arguments cannot be found. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The message. + + + + Initializes a new instance of the class. + + The message. + The inner. + + + + Serialization Constructor + + + + + Interface for logging within the engine + + + + + Logs the specified message at the error level. + + The message. + + + + Logs the specified message at the error level. + + The message. + The arguments. + + + + Logs the specified message at the warning level. + + The message. + + + + Logs the specified message at the warning level. + + The message. + The arguments. + + + + Logs the specified message at the info level. + + The message. + + + + Logs the specified message at the info level. + + The message. + The arguments. + + + + Logs the specified message at the debug level. + + The message. + + + + Logs the specified message at the debug level. + + The message. + The arguments. + + + + InternalTrace provides facilities for tracing the execution + of the NUnit framework. Tests and classes under test may make use + of Console writes, System.Diagnostics.Trace or various loggers and + NUnit itself traps and processes each of them. For that reason, a + separate internal trace is needed. + + Note: + InternalTrace uses a global lock to allow multiple threads to write + trace messages. This can easily make it a bottleneck so it must be + used sparingly. Keep the trace Level as low as possible and only + insert InternalTrace writes where they are needed. + TODO: add some buffering and a separate writer thread as an option. + TODO: figure out a way to turn on trace in specific classes only. + + + + + Gets a flag indicating whether the InternalTrace is initialized + + + + + Initialize the internal trace facility using the name of the log + to be written to and the trace level. + + The log name + The trace level + + + + Initialize the internal trace using a provided TextWriter and level + + A TextWriter + The InternalTraceLevel + + + + Get a named Logger + + + + + + Get a logger named for a particular Type. + + + + + InternalTraceLevel is an enumeration controlling the + level of detailed presented in the internal log. + + + + + Use the default settings as specified by the user. + + + + + Do not display any trace messages + + + + + Display Error messages only + + + + + Display Warning level and higher messages + + + + + Display informational and higher messages + + + + + Display debug messages and higher - i.e. all messages + + + + + Display debug messages and higher - i.e. all messages + + + + + A trace listener that writes to a separate file per domain + and process using it. + + + + + Construct an InternalTraceWriter that writes to a file. + + Path to the file to use + + + + Construct an InternalTraceWriter that writes to a + TextWriter provided by the caller. + + + + + + Returns the character encoding in which the output is written. + + The character encoding in which the output is written. + + + + Writes a character to the text string or stream. + + The character to write to the text stream. + + + + Writes a string to the text string or stream. + + The string to write. + + + + Writes a string followed by a line terminator to the text string or stream. + + The string to write. If is null, only the line terminator is written. + + + + Releases the unmanaged resources used by the and optionally releases the managed resources. + + true to release both managed and unmanaged resources; false to release only unmanaged resources. + + + + Clears all buffers for the current writer and causes any buffered data to be written to the underlying device. + + + + + Provides internal logging to the NUnit framework + + + + + Initializes a new instance of the class. + + The name. + The log level. + The writer where logs are sent. + + + + Logs the message at error level. + + The message. + + + + Logs the message at error level. + + The message. + The message arguments. + + + + Logs the message at warm level. + + The message. + + + + Logs the message at warning level. + + The message. + The message arguments. + + + + Logs the message at info level. + + The message. + + + + Logs the message at info level. + + The message. + The message arguments. + + + + Logs the message at debug level. + + The message. + + + + Logs the message at debug level. + + The message. + The message arguments. + + + + The MethodWrapper class wraps a MethodInfo so that it may + be used in a platform-independent manner. + + + + + Construct a MethodWrapper for a Type and a MethodInfo. + + + + + Construct a MethodInfo for a given Type and method name. + + + + + Gets the Type from which this method was reflected. + + + + + Gets the MethodInfo for this method. + + + + + Gets the name of the method. + + + + + Gets a value indicating whether the method is abstract. + + + + + Gets a value indicating whether the method is public. + + + + + Gets a value indicating whether the method is static. + + + + + Gets a value indicating whether the method contains unassigned generic type parameters. + + + + + Gets a value indicating whether the method is a generic method. + + + + + Gets a value indicating whether the MethodInfo represents the definition of a generic method. + + + + + Gets the return Type of the method. + + + + + Gets the parameters of the method. + + + + + + Returns the Type arguments of a generic method or the Type parameters of a generic method definition. + + + + + Replaces the type parameters of the method with the array of types provided and returns a new IMethodInfo. + + The type arguments to be used + A new IMethodInfo with the type arguments replaced + + + + Returns an array of custom attributes of the specified type applied to this method + + + + + Gets a value indicating whether one or more attributes of the specified type are defined on the method. + + + + + Invokes the method, converting any TargetInvocationException to an NUnitException. + + The object on which to invoke the method + The argument list for the method + The return value from the invoked method + + + + Override ToString() so that error messages in NUnit's own tests make sense + + + + + + + + + + + + + + This class ensures the is correctly cleared + or restored around framework actions. This is important if running multiple assemblies within the same + process, to ensure no leakage from one assembly to the next. See https://github.com/nunit/nunit-console/issues/325 + + + + + Thrown when an assertion failed. Here to preserve the inner + exception and hence its stack trace. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The error message that explains + the reason for the exception + + + + Initializes a new instance of the class. + + The error message that explains + the reason for the exception + The exception that caused the + current exception + + + + Serialization Constructor + + + + + Enables the syntax. + + + + + Wraps an action so that it is executed when the returned object is disposed. + This disposal is thread-safe and the action will be executed at most once. + + + + + OSPlatform represents a particular operating system platform + + + + + Platform ID for Unix as defined by .NET + + + + + Platform ID for Unix as defined by Mono + + + + + Platform ID for XBox as defined by .NET and Mono + + + + + Platform ID for MacOSX as defined by .NET and Mono + + + + + Get the OSPlatform under which we are currently running + + + + + Gets the actual OS Version, not the incorrect value that might be + returned for Win 8.1 and Win 10 + + + If an application is not manifested as Windows 8.1 or Windows 10, + the version returned from Environment.OSVersion will not be 6.3 and 10.0 + respectively, but will be 6.2 and 6.3. The correct value can be found in + the registry. + + The original version + The correct OS version + + + + Product Type Enumeration used for Windows + + + + + Product type is unknown or unspecified + + + + + Product type is Workstation + + + + + Product type is Domain Controller + + + + + Product type is Server + + + + + Construct from a platform ID and version + + + + + Construct from a platform ID, version and product type + + + + + Get the platform ID of this instance + + + + + Implemented to use in place of Environment.OSVersion.ToString() + + A representation of the platform ID and version in an approximation of the format used by Environment.OSVersion.ToString() + + + + Get the Version of this instance + + + + + Get the Product Type of this instance + + + + + Return true if this is a windows platform + + + + + Return true if this is a Unix or Linux platform + + + + + Return true if the platform is Win32S + + + + + Return true if the platform is Win32Windows + + + + + Return true if the platform is Win32NT + + + + + Return true if the platform is Windows CE + + + + + Return true if the platform is Xbox + + + + + Return true if the platform is MacOSX + + + + + Return true if the platform is Windows 95 + + + + + Return true if the platform is Windows 98 + + + + + Return true if the platform is Windows ME + + + + + Return true if the platform is NT 3 + + + + + Return true if the platform is NT 4 + + + + + Return true if the platform is NT 5 + + + + + Return true if the platform is Windows 2000 + + + + + Return true if the platform is Windows XP + + + + + Return true if the platform is Windows 2003 Server + + + + + Return true if the platform is NT 6 + + + + + Return true if the platform is NT 6.0 + + + + + Return true if the platform is NT 6.1 + + + + + Return true if the platform is NT 6.2 + + + + + Return true if the platform is NT 6.3 + + + + + Return true if the platform is Vista + + + + + Return true if the platform is Windows 2008 Server (original or R2) + + + + + Return true if the platform is Windows 2008 Server (original) + + + + + Return true if the platform is Windows 2008 Server R2 + + + + + Return true if the platform is Windows 2012 Server (original or R2) + + + + + Return true if the platform is Windows 2012 Server (original) + + + + + Return true if the platform is Windows 2012 Server R2 + + + + + Return true if the platform is Windows 7 + + + + + Return true if the platform is Windows 8 + + + + + Return true if the platform is Windows 8.1 + + + + + Return true if the platform is Windows 10 + + + + + Return true if the platform is Windows 11 + + + + + Return true if the platform is Windows Server. This is named Windows + Server 10 to distinguish it from previous versions of Windows Server. + + + + + Gets a description for the current OS. + + + + + + Examines an attribute argument and tries to simulate what that value would have been if the literal syntax + which might have defined the value in C# had instead been used as an argument to a given method parameter in a direct call. + + + For example, since you can’t apply attributes using arguments, we allow the C# syntax + 10 ( value) or 0.1 ( value) to be specified. + NUnit then converts it to match the method’s parameters, just as if you were actually + using the syntax TestMethod(10) or TestMethod(0.1). + + + For another example, you might have written the syntax 10 and picked up the attribute + constructor overload; however, the test method for which this value is intended only has a + signature. Again, NUnit simulates what would have happened if the inferred C# syntax was transplanted + and you were actually using the syntax TestMethod(10). + + + + + + Converts an array of objects to the , if it is supported. + + + + + Converts a single value to the , if it is supported. + + + + + Performs several special conversions allowed by NUnit in order to + permit arguments with types that cannot be used in the constructor + of an Attribute such as TestCaseAttribute or to simplify their use. + + The value to be converted + The target in which the should be converted + If conversion was successfully applied, the converted into + + if was converted and should be used; + is no conversion was applied and should be ignored + + + + + The ParameterWrapper class wraps a ParameterInfo so that it may + be used in a platform-independent manner. + + + + + Construct a ParameterWrapper for a given method and parameter + + + + + + + Gets a value indicating whether the parameter is optional + + + + + Gets an IMethodInfo representing the method for which this is a parameter. + + + + + Gets the underlying ParameterInfo + + + + + Gets the Type of the parameter + + + + + Returns an array of custom attributes of the specified type applied to this method + + + + + Gets a value indicating whether one or more attributes of the specified type are defined on the parameter. + + + + + PlatformHelper class is used by the PlatformAttribute class to + determine whether a platform is supported. + + + + + Comma-delimited list of all supported OS platform constants + + + + + Comma-delimited list of all supported Runtime platform constants + + + + + Default constructor uses the operating system and + common language runtime of the system. + + + + + Construct a PlatformHelper for a particular operating + system and common language runtime. Used in testing. + + RuntimeFramework to be used + OperatingSystem to be used + + + + Test to determine if one of a collection of platforms + is being used currently. + + + + + + + Tests to determine if the current platform is supported + based on a platform attribute. + + The attribute to examine + + + + + Tests to determine if the current platform is supported + based on a platform attribute. + + The attribute to examine + + + + + Test to determine if a particular platform or comma-delimited set of platforms is in use. + + Name of the platform or comma-separated list of platform ids + True if the platform is in use on the system + + + + Return the last failure reason. Results are not + defined if called before IsSupported( Attribute ) + is called. + + + + + Implements a simplified filter for use in deciding which + Types and Methods should be used to generate tests. It is constructed with a + list of strings, each of which may end up being interpreted in various ways. + + + + + Return a new PreFilter, without elements, which is considered + empty and always matches. + + + + + Return true if the filter is empty, in which case it + always succeeds. Technically, this is just a filter and + you can add elements but it's best to use Empty when + you need an empty filter and new when you plan to add. + + + + + Add a new filter element to the filter + + + + + + Use the filter on a Type, returning true if the type matches the filter + and should therefore be included in the discovery process. + + + + + Use the filter on a Type, returning true if the type matches the filter + and should therefore be included in the discovery process. + + + + + A PropertyBag represents a collection of name value pairs + that allows duplicate entries with the same key. Methods + are provided for adding a new pair as well as for setting + a key to a single value. All keys are strings but values + may be of any type. Null values are not permitted, since + a null entry represents the absence of the key. + + + + + Adds a key/value pair to the property set + + The key + The value + + + + Sets the value for a key, removing any other + values that are already in the property set. + + + + + + + Gets a single value for a key, using the first + one if multiple values are present and returning + null if the value is not found. + + + + + + + Gets a flag indicating whether the specified key has + any entries in the property set. + + The key to be checked + + True if their are values present, otherwise false + + + + + Tries to retrieve list of values. + + The key for which the values are to be retrieved + Values, if found + true if found + + + + Gets a collection containing all the keys in the property set + + + + + + Gets or sets the list of values for a particular key + + + + + Returns an XmlNode representing the current PropertyBag. + + Not used + An XmlNode representing the PropertyBag + + + + Returns an XmlNode representing the PropertyBag after + adding it as a child of the supplied parent node. + + The parent node. + Not used + + + + + The PropertyNames class provides static constants for the + standard property ids that NUnit uses on tests. + + + + + The FriendlyName of the AppDomain in which the assembly is running + + + + + The selected strategy for joining parameter data into test cases + + + + + The process ID of the executing assembly + + + + + The stack trace from any data provider that threw + an exception. + + + + + The reason a test was not run + + + + + The author of the tests + + + + + The ApartmentState required for running the test + + + + + The categories applying to a test + + + + + The Description of a test + + + + + The number of threads to be used in running tests + + + + + The maximum time in ms, above which the test is considered to have failed + + + + + The ParallelScope associated with a test + + + + + The number of times the test should be repeated + + + + + Indicates that the test should be run on a separate thread + + + + + The culture to be set for a test + + + + + The UI culture to be set for a test + + + + + The type that is under test + + + + + The timeout value for the test + + + + + The timeout value for the test + + + + + The test will be ignored until the given date + + + + + The optional Order the test will run in + + + + + Randomizer returns a set of random values in a repeatable + way, to allow re-running of tests if necessary. It extends + the .NET Random class, providing random values for a much + wider range of types. + + The class is used internally by the framework to generate + test case data and is also exposed for use by users through + the TestContext.Random property. + + + For consistency with the underlying Random Type, methods + returning a single value use the prefix "Next..." Those + without an argument return a non-negative value up to + the full positive range of the Type. Overloads are provided + for specifying a maximum or a range. Methods that return + arrays or strings use the prefix "Get..." to avoid + confusion with the single-value methods. + + + + + Initial seed used to create randomizers for this run + + + + + Get a Randomizer for a particular member, returning + one that has already been created if it exists. + This ensures that the same values are generated + each time the tests are reloaded. + + + + + Get a randomizer for a particular parameter, returning + one that has already been created if it exists. + This ensures that the same values are generated + each time the tests are reloaded. + + + + + Create a new Randomizer using the next seed + available to ensure that each randomizer gives + a unique sequence of values. + + + + + + Default constructor + + + + + Construct based on seed value + + + + + + Returns a random unsigned int. + + + + + Returns a random unsigned int less than the specified maximum. + + + + + Returns a random unsigned int within a specified range. + + + + + Returns a non-negative random short. + + + + + Returns a non-negative random short less than the specified maximum. + + + + + Returns a non-negative random short within a specified range. + + + + + Returns a random unsigned short. + + + + + Returns a random unsigned short less than the specified maximum. + + + + + Returns a random unsigned short within a specified range. + + + + + Returns a random long. + + + + + Returns a random long less than the specified maximum. + + + + + Returns a non-negative random long within a specified range. + + + + + Returns a random ulong. + + + + + Returns a random ulong less than the specified maximum. + + + + + Returns a non-negative random long within a specified range. + + + + + Returns a random Byte + + + + + Returns a random Byte less than the specified maximum. + + + + + Returns a random Byte within a specified range + + + + + Returns a random SByte + + + + + Returns a random sbyte less than the specified maximum. + + + + + Returns a random sbyte within a specified range + + + + + Returns a random bool + + + + + Returns a random bool based on the probability a true result + + + + + Returns a random double between 0.0 and the specified maximum. + + + + + Returns a random double within a specified range. + + + + + Returns a random float. + + + + + Returns a random float between 0.0 and the specified maximum. + + + + + Returns a random float within a specified range. + + + + + Returns a random enum value of the specified Type as an object. + + + + + Returns a random enum value of the specified Type. + + + + + Default characters for random functions. + + Default characters are the English alphabet (uppercase & lowercase), Arabic numerals, and underscore + + + + Generate a random string based on the characters from the input string. + + desired length of output string. + string representing the set of characters from which to construct the resulting string + A random string of arbitrary length + + + + Generate a random string based on the characters from the input string. + + desired length of output string. + A random string of arbitrary length + Uses DefaultStringChars as the input character set + + + + Generate a random string based on the characters from the input string. + + A random string of the default length + Uses DefaultStringChars as the input character set + + + + Returns a random decimal. + + + + + Returns a random decimal between positive zero and the specified maximum. + + + + + Returns a random decimal within a specified range, which is not + permitted to exceed decimal.MaxVal in the current implementation. + + + A limitation of this implementation is that the range from min + to max must not exceed decimal.MaxVal. + + + + + Generates a valid version 4 . + + + + + Helper methods for inspecting a type by reflection. + + Many of these methods take ICustomAttributeProvider as an + argument to avoid duplication, even though certain attributes can + only appear on specific types of members, like MethodInfo or Type. + + In the case where a type is being examined for the presence of + an attribute, interface or named member, the Reflect methods + operate with the full name of the member being sought. This + removes the necessity of the caller having a reference to the + assembly that defines the item being sought and allows the + NUnit core to inspect assemblies that reference an older + version of the NUnit framework. + + + + + Examine a fixture type and return true if it has a method with + a particular attribute. + + The type to examine + The attribute Type to look for + True if found, otherwise false + + + + Invoke the default constructor on a Type + + The Type to be constructed + An instance of the Type + + + + Invoke a constructor on a Type with arguments + + The Type to be constructed + Arguments to the constructor + An instance of the Type + + + + Returns an array of types from an array of objects. + Differs from by returning + for null elements rather than throwing . + + + + + Gets the constructors to which the specified argument types can be coerced. + + + + + Determines if the given types can be coerced to match the given parameters. + + + + + Determines whether the current type can be implicitly converted to the specified type. + + + + + Invoke a parameterless method returning void on an object. + + A MethodInfo for the method to be invoked + The object on which to invoke the method + + + + Invoke a method, converting any TargetInvocationException to an NUnitException. + + A MethodInfo for the method to be invoked + The object on which to invoke the method + The argument list for the method + The return value from the invoked method + + + + + Selects the ultimate shadowing property just like dynamic would, + rather than throwing + for properties that shadow properties of a different property type + which is what does. + + + If you request both public and nonpublic properties, every public property is preferred + over every nonpublic property. It would violate the principle of least surprise for a + derived class’s implementation detail to be chosen over the public API for a type. + + + See . + See . + See . + + + + Same as GetMethod(, | + , , , + ) except that it also chooses only non-generic methods. + Useful for avoiding the you can have with GetMethod. + + + + + Returns the get accessor for the indexer. + + Type to reflect on for the indexer. + List of indexer types that matches the indexer type order. + The Get accessor + + + + Searches for the specified members, using the specified binding constraints. + + + Similar to but also finds private static members from the base class. + + The type to find the members from. + The string containing the name of the members to get. + A bitwise combination of the enumeration values that specify how the search is conducted. + + + + + Represents the result of running a single test case. + + + + + Construct a TestCaseResult based on a TestMethod + + A TestMethod to which the result applies. + + + + Gets the number of test cases that failed + when running the test and all its children. + + + + + Gets the number of test cases that executed + when running the test and all its children. + + + + + Gets the number of test cases that had warnings + when running the test and all its children. + + + + + Gets the number of test cases that passed + when running the test and all its children. + + + + + Gets the number of test cases that were skipped + when running the test and all its children. + + + + + Gets the number of test cases that were inconclusive + when running the test and all its children. + + + + + Indicates whether this result has any child results. + + + + + Gets the collection of child results. + + + + + The TestResult class represents the result of a test. + + + + + Error message for when child tests have errors + + + + + Error message for when child tests have warnings + + + + + Error message for when child tests are ignored + + + + + Error message for when user has cancelled the test run + + + + + The minimum duration for tests + + + + + Aggregate assertion count + + + + + ReaderWriterLock + + + + + Construct a test result given a Test + + The test to be used + + + + Gets the test with which this result is associated. + + + + + Gets the ResultState of the test result, which + indicates the success or failure of the test. + + + + + Gets the name of the test result + + + + + Gets the full name of the test result + + + + + Gets or sets the elapsed time for running the test in seconds + + + + + Gets or sets the time the test started running. + + + + + Gets or sets the time the test finished running. + + + + + Adds a test attachment to the test result + + The TestAttachment object to attach + + + + Gets the collection of files attached to the test + + + + + Gets the message associated with a test + failure or with not running the test + + + + + Gets any stack trace associated with an + error or failure. + + + + + Gets or sets the count of asserts executed + when running the test. + + + + + Gets the number of test cases executed + when running the test and all its children. + + + + + Gets the number of test cases that failed + when running the test and all its children. + + + + + Gets the number of test cases that had warnings + when running the test and all its children. + + + + + Gets the number of test cases that passed + when running the test and all its children. + + + + + Gets the number of test cases that were skipped + when running the test and all its children. + + + + + Gets the number of test cases that were inconclusive + when running the test and all its children. + + + + + Indicates whether this result has any child results. + + + + + Gets the collection of child results. + + + + + Gets a TextWriter, which will write output to be included in the result. + + + + + Gets any text output written to this result. + + + + + Gets a list of assertion results associated with the test. + + + + + Returns the XML representation of the result. + + If true, descendant results are included + An XmlNode representing the result + + + + Adds the XML representation of the result as a child of the + supplied parent node.. + + The parent node. + If true, descendant results are included + + + + + Gets a count of pending failures (from Multiple Assert) + + + + + Gets the worst assertion status (highest enum) in all the assertion results + + + + + Set the result of the test + + The ResultState to use in the result + + + + Set the result of the test + + The ResultState to use in the result + A message associated with the result state + + + + Set the result of the test + + The ResultState to use in the result + A message associated with the result state + Stack trace giving the location of the command + + + + Set the test result based on the type of exception thrown + + The exception that was thrown + + + + Set the test result based on the type of exception thrown + + The exception that was thrown + The FailureSite to use in the result + + + + RecordTearDownException appends the message and stack trace + from an exception arising during teardown of the test + to any previously recorded information, so that any + earlier failure information is not lost. Note that + calling Assert.Ignore, Assert.Inconclusive, etc. during + teardown is treated as an error. If the current result + represents a suite, it may show a teardown error even + though all contained tests passed. + + The Exception to be recorded + + + + Update overall test result, including legacy Message, based + on AssertionResults that have been saved to this point. + + + + + Record an assertion result + + + + + Record an assertion result + + + + + Record an assertion result + + + + + Creates a failure message incorporating failures + from a Multiple Assert block for use by runners + that don't know about AssertionResults. + + Message as a string + + + + Adds a failure element to a node and returns it. + + The target node. + The new failure element. + + + + Adds an attachments element to a node and returns it. + + The target node. + The new attachments element. + + + + Represents the result of running a test suite + + + + + Construct a TestSuiteResult base on a TestSuite + + The TestSuite to which the result applies + + + + Gets the number of test cases that executed + when running the test and all its children. + + + + + Gets the number of test cases that failed + when running the test and all its children. + + + + + Gets the number of test cases that passed + when running the test and all its children. + + + + + Gets the number of test cases that passed + when running the test and all its children. + + + + + Gets the number of test cases that were skipped + when running the test and all its children. + + + + + Gets the number of test cases that were inconclusive + when running the test and all its children. + + + + + Indicates whether this result has any child results. + + + + + Gets the collection of child results. + + + + + Adds a child result to this result, setting this result's + ResultState to Failure if the child result failed. + + The result to be added + + + + RuntimeFramework represents a particular version + of a common language runtime implementation. + + + + + DefaultVersion is an empty Version, used to indicate that + NUnit should select the CLR version to use for the test. + + + + + Construct from a runtime type and version. If the version has + two parts, it is taken as a framework version. If it has three + or more, it is taken as a CLR version. In either case, the other + version is deduced based on the runtime type and provided version. + + The runtime type of the framework + The version of the framework + + + + Static method to return a RuntimeFramework object + for the framework that is currently in use. + + + + + The type of this runtime framework + + + + + The framework version for this runtime framework + + + + + The CLR version for this runtime framework + + + + + Return true if any CLR version may be used in + matching this RuntimeFramework object. + + + + + Returns the Display name for this framework + + + + + Parses a string representing a RuntimeFramework. + The string may be just a RuntimeType name or just + a Version or a hyphenated RuntimeType-Version or + a Version prefixed by 'versionString'. + + + + + + + Overridden to return the short name of the framework + + + + + + Returns true if the current framework matches the + one supplied as an argument. Two frameworks match + if their runtime types are the same or either one + is RuntimeType.Any and all specified version components + are equal. Negative (i.e. unspecified) version + components are ignored. + + The RuntimeFramework to be matched. + True on match, otherwise false + + + + Enumeration identifying a common language + runtime implementation. + + + + Any supported runtime framework + + + Microsoft .NET Framework + + + Microsoft Shared Source CLI + + + Mono + + + MonoTouch + + + Microsoft .NET Core, including .NET 5+ + + + + Holds thread state which is captured and restored in order to sandbox user code. + + + + + Thread principal. + This will be null on platforms that don't support . + + + + + Captures a snapshot of the tracked state of the current thread to be restored later. + + + + + Restores the tracked state of the current thread to the previously captured state. + + + + + Returns a copy with the specified culture. + + + + + Returns a copy with the specified UI culture. + + + + + Returns a copy with the specified principal. + + + + + May be called from any thread. + + + + + May be called from any thread. + + + + + May be called from any thread. + + + + + May be called from any thread, but may only be called once. + + + + + StackFilter class is used to remove internal NUnit + entries from a stack trace so that the resulting + trace provides better information about the test. + + + + + Single instance of our default filter + + + + + Construct a stack filter instance + + Regex pattern used to delete lines from the top of the stack + Regex pattern used to delete lines from the bottom of the stack + + + + Construct a stack filter instance + + Regex pattern used to delete lines from the top of the stack + + + + Construct a stack filter instance + + + + + Filters a raw stack trace and returns the result. + + The original stack trace + A filtered stack trace + + + + Allows enumerating sub-strings from a string based on separator char. + Basically a less allocating version of string.Split. + + + + + Constructs a new enumerator against given target with given separator. + + Target string to enumerate. + Separator between tokens to return. + Whether empty tokens should be returned + + + + + + + + + + + + + + + + Return unboxed enumerator when type is well known, do not remove. + + + + + Tokenizes given string with given separator. + + Input string. + Separator to use. + Whether to return empty token (length 0), defaults to false. + + + + + Provides methods to support legacy string comparison methods. + + + + + Compares two strings for equality, ignoring case if requested. + + The first string. + The second string.. + if set to , the case of the letters in the strings is ignored. + Zero if the strings are equivalent, a negative number if strA is sorted first, a positive number if + strB is sorted first + + + + Compares two strings for equality, ignoring case if requested. + + The first string. + The second string.. + if set to , the case of the letters in the strings is ignored. + True if the strings are equivalent, false if not. + + + + The TestCaseParameters class encapsulates method arguments and + other selected parameters needed for constructing + a parameterized test case. + + + + + The expected result to be returned + + + + + Default Constructor creates an empty parameter set + + + + + Construct a non-runnable ParameterSet, specifying + the provider exception that made it invalid. + + + + + Construct a parameter set with a list of arguments + + + + + + Construct a ParameterSet from an object implementing ITestCaseData + + + + + + The expected result of the test, which + must match the method return type. + + + + + Gets a value indicating whether an expected result was specified. + + + + + TestCaseTimeoutException is thrown when a test running directly + on a TestWorker thread is cancelled due to timeout. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The message. + + + + Initializes a new instance of the class. + + The message. + The inner. + + + + Serialization Constructor + + + + + Helper class used to save and restore certain static or + singleton settings in the environment that affect tests + or which might be changed by the user tests. + + + + + Link to a prior saved context + + + + + Indicates that a stop has been requested + + + + + The event listener currently receiving notifications + + + + + The number of assertions for the current test + + + + + The current test result + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + An existing instance of TestExecutionContext. + + + + Gets and sets the current context. + + + + + Gets or sets the current test + + + + + The time the current test started execution + + + + + The time the current test started in Ticks + + + + + Gets the elapsed time for running the test in seconds + + + + + Gets or sets the current test result + + + + + Gets a TextWriter that will send output to the current test result. + + + + + The current test object - that is the user fixture + object on which tests are being executed. + + + + + Get or set indicator that run should stop on the first error + + + + + Gets an enum indicating whether a stop has been requested. + + + + + The current test event listener + + + + + The current WorkItemDispatcher. Made public for + use by nunitlite.tests + + + + + The ParallelScope to be used by tests running in this context. + For builds with out the parallel feature, it has no effect. + + + + + Default tolerance value used for floating point equality + when no other tolerance is specified. + + + + + The worker that spawned the context. + For builds without the parallel feature, it is null. + + + + + Gets the RandomGenerator specific to this Test + + + + + Gets the assert count. + + The assert count. + + + + The current nesting level of multiple assert blocks + + + + + Gets or sets the test case timeout value + + + + + Gets or sets whether the test case should use a . + + + + + Gets or sets the for the test case. + + + + + Gets a list of ITestActions set by upstream tests + + + + + Saves or restores the CurrentCulture + + + + + Saves or restores the CurrentUICulture + + + + + Gets or sets the current for the Thread. + + + + + The current head of the ValueFormatter chain, copied from MsgUtils.ValueFormatter + + + + + If true, all tests must run on the same thread. No new thread may be spawned. + + + + + The number of times the current test has been scheduled for execution. + Currently only being executed in a test using the + + + + + Record any changes in the environment made by + the test code in the execution context so it + will be passed on to lower level tests. + + + + + Set up the execution environment to match a context. + Note that we may be running on the same thread where the + context was initially created or on a different thread. + + + + + Increments the assert count by one. + + + + + Increments the assert count by a specified amount. + + + + + Adds a new ValueFormatterFactory to the chain of formatters + + The new factory + + + + Sends a message from test to listeners. This message is not kind of test output and doesn't go to test result. + + A name recognized by the intended listeners. + A message to be sent + + + + An IsolatedContext is used when running code + that may effect the current result in ways that + should not impact the final result of the test. + A new TestExecutionContext is created with an + initially clear result, which is discarded on + exiting the context. + + + using (new TestExecutionContext.IsolatedContext()) + { + // Code that should not impact the result + } + + + + + Save the original current TestExecutionContext and + make a new isolated context current. + + + + + Restore the original TestExecutionContext. + + + + + An AdhocTestExecutionContext is created whenever a context is needed + but not available in CurrentContext. This happens when tests are run + on an ad-hoc basis or Asserts are used outside of tests. + + + + + Construct an AdhocTestExecutionContext, which is used + whenever the current TestExecutionContext is found to be null. + + + + + Enumeration indicating whether the tests are + running normally or being cancelled. + + + + + Running normally with no stop requested + + + + + A graceful stop has been requested + + + + + A forced stop has been requested + + + + + Interface to be implemented by filters applied to tests. + The filter applies when running the test, after it has been + loaded, since this is the only time an ITest exists. + + + + + Unique Empty filter. + + + + + Indicates whether this is the EmptyFilter + + + + + Determine if a particular test passes the filter criteria. The default + implementation checks the test itself, its parents and any descendants. + + Derived classes may override this method or any of the Match methods + to change the behavior of the filter. + + The test to which the filter is applied + True if the test passes the filter, otherwise false + + + + Determine if a particular test passes the filter criteria. The default + implementation checks the test itself, its parents and any descendants. + + Derived classes may override this method or any of the Match methods + to change the behavior of the filter. + + The test to which the filter is applied + If set to we are carrying a negation through + True if the test passes the filter, otherwise false + + + + Determine if a test matches the filter explicitly. That is, it must + be a direct match of the test itself or one of its children. + + The test to which the filter is applied + True if the test matches the filter explicitly, otherwise false + + + + Determine whether the test itself matches the filter criteria, without + examining either parents or descendants. This is overridden by each + different type of filter to perform the necessary tests. + + The test to which the filter is applied + True if the filter matches the any parent of the test + + + + Determine whether any ancestor of the test matches the filter criteria + + The test to which the filter is applied + True if the filter matches the an ancestor of the test + + + + Determine whether any descendant of the test matches the filter criteria. + + The test to be matched + True if at least one descendant matches the filter criteria + + + + Create a TestFilter instance from an XML representation. + + + + + Create a TestFilter from its TNode representation + + + + + Nested class provides an empty filter - one that always + returns true when called. It never matches explicitly. + + + + + Adds an XML node + + True if recursive + The added XML node + + + + Adds an XML node + + Parent node + True if recursive + The added XML node + + + + The TestCaseParameters class encapsulates method arguments and + other selected parameters needed for constructing + a parameterized test case. + + + + + Default Constructor creates an empty parameter set + + + + + Construct a non-runnable ParameterSet, specifying + the provider exception that made it invalid. + + + + + Construct a parameter set with a list of arguments + + + + + + Construct a ParameterSet from an object implementing ITestCaseData + + + + + + Type arguments used to create a generic fixture instance + + + + + TestListener provides an implementation of ITestListener that + does nothing. It is used only through its NULL property. + + + + + Called when a test has just started + + The test that is starting + + + + Called when a test case has finished + + The result of the test + + + + Called when a test produces output for immediate display + + A TestOutput object containing the text to display + + + + Called when a test produces a message to be sent to listeners + + A object containing the message to send + + + + Construct a new TestListener - private so it may not be used. + + + + + Get a listener that does nothing + + + + + TestNameGenerator is able to create test names according to + a coded pattern. + + + + + Default pattern used to generate names + + + + + Construct a TestNameGenerator + + + + + Construct a TestNameGenerator + + The pattern used by this generator. + + + + Get the display name for a TestMethod and its arguments + + A TestMethod + The display name + + + + Get the display name for a TestMethod and its arguments + + A TestMethod + Arguments to be used + The display name + + + + TestParameters is the abstract base class for all classes + that know how to provide data for constructing a test. + + + + + Default Constructor creates an empty parameter set + + + + + Construct a parameter set with a list of arguments + + + + + + Construct a non-runnable ParameterSet, specifying + the provider exception that made it invalid. + + + + + Construct a ParameterSet from an object implementing ITestData + + + + + + The RunState for this set of parameters. + + + + + The arguments to be used in running the test, + which must match the method signature. + + + + + A name to be used for this test case in lieu + of the standard generated name containing + the argument list. + + + + + Gets the property dictionary for this test + + + + + Applies ParameterSet values to the test itself. + + A test. + + + + The original arguments provided by the user, + used for display purposes. + + + + + The list of display names to use as the parameters in the test name. + + + + + TestProgressReporter translates ITestListener events into + the async callbacks that are used to inform the client + software about the progress of a test run. + + + + + Initializes a new instance of the class. + + The callback handler to be used for reporting progress. + + + + Called when a test has just started + + The test that is starting + + + + Called when a test has finished. Sends a result summary to the callback. + + The result of the test + + + + Called when a test produces output for immediate display + + A TestOutput object containing the text to display + + + + Called when a test produces a message to be sent to listeners + + A object containing the text to send + + + + Returns the parent test item for the target test item if it exists + + + parent test item + + + + ParameterizedFixtureSuite serves as a container for the set of test + fixtures created from a given Type using various parameters. + + + + + Initializes a new instance of the class. + + The ITypeInfo for the type that represents the suite. + + + + Creates a copy of the given suite with only the descendants that pass the specified filter. + + The to copy. + Determines which descendants are copied. + + + + Gets a string representing the type of test + + + + + Creates a filtered copy of the test suite. + + Determines which descendants are copied. + + + + ParameterizedMethodSuite holds a collection of individual + TestMethods with their arguments applied. + + + + + Initializes a new instance of the class. + + + + + Creates a copy of the given suite with only the descendants that pass the specified filter. + + The to copy. + Determines which descendants are copied. + + + + Gets a MethodInfo for the method implementing this test. + + + + + Gets a string representing the type of test + + + + + Creates a filtered copy of the test suite. + + Determines which descendants are copied. + + + + SetUpFixture extends TestSuite and supports + Setup and TearDown methods. + + + + + Initializes a new instance of the class. + + + + + Creates a copy of the given suite with only the descendants that pass the specified filter. + + The to copy. + Determines which descendants are copied. + + + + Gets the TypeInfo of the fixture used in running this test. + + + + + Creates a filtered copy of the test suite. + + Determines which descendants are copied. + + + + The Test abstract class represents a test within the framework. + + + + + Static value to seed ids. It's started at 1000 so any + uninitialized ids will stand out. + + + + + Used to cache the declaring type for this MethodInfo + + + + + Method property backing field + + + + + Constructs a test given its name + + The name of the test + + + + Constructs a test given the path through the + test hierarchy to its parent and a name. + + The parent tests full name + The name of the test + + + + Constructs a test for a specific type. + + + + + Constructs a test for a specific method. + + + + + Gets or sets the id of the test + + + + + + Gets or sets the name of the test + + + + + Gets or sets the fully qualified name of the test + + + + + + Gets the name of the class where this test was declared. + Returns null if the test is not associated with a class. + + + + + Gets the name of the method implementing this test. + Returns null if the test is not implemented as a method. + + + + + The arguments to use in creating the test or empty array if none required. + + + + + Gets the TypeInfo of the fixture used in running this test + or null if no fixture type is associated with it. + + + + + Gets a MethodInfo for the method implementing this test. + Returns null if the test is not implemented as a method. + + + + + Whether or not the test should be run + + + + + Gets the name used for the top-level element in the + XML representation of this test + + + + + Gets a string representing the type of test. Used as an attribute + value in the XML representation of a test and has no other + function in the framework. + + + + + Gets a count of test cases represented by + or contained under this test. + + + + + Gets the properties for this test + + + + + Returns true if this is a TestSuite + + + + + Gets a bool indicating whether the current test + has any descendant tests. + + + + + Gets the parent as a Test object. + Used by the core to set the parent. + + + + + Gets this test's child tests + + A list of child tests + + + + Gets or sets a fixture object for running this test. + + + + + Static prefix used for ids in this AppDomain. + Set by FrameworkController. + + + + + Gets or Sets the Int value representing the seed for the RandomGenerator + + + + + + The SetUp methods. + + + + + The teardown methods + + + + + Creates a TestResult for this test. + + A TestResult suitable for this type of test. + + + + Modify a newly constructed test by applying any of NUnit's common + attributes, based on a supplied , which is + usually the reflection element from which the test was constructed, + but may not be in some instances. The attributes retrieved are + saved for use in subsequent operations. + + + + + Recursively apply the attributes on to this test, + including attributes on nesting types. + + The + + + + Mark the test as Invalid (not runnable) specifying a reason + + The reason the test is not runnable + + + + Mark the test as Invalid (not runnable) specifying a reason and an exception. + + The exception that was the cause. + The reason the test is not runnable + + + + Get custom attributes applied to a test + + + + + Add standard attributes and members to a test node. + + + + + + + Returns all nested types, inner first. + + + + + Returns the XML representation of the test + + If true, include child tests recursively + + + + + Returns an XmlNode representing the current result after + adding it as a child of the supplied parent node. + + The parent node. + If true, descendant results are included + + + + Compares the current instance with another object of the same type and returns an integer that indicates whether the current instance precedes, follows, or occurs in the same position in the sort order as the other object. + An object to compare with this instance. + + + Compares the current instance with another object of the same type and returns an integer that indicates whether the current instance precedes, follows, or occurs in the same position in the sort order as the other object. + An object to compare with this instance. + + + + TestAssembly is a TestSuite that represents the execution + of tests in a managed assembly. + + + + + Initializes a new instance of the class + specifying the Assembly and the suite name. + + The assembly this test represents. + + This becomes the full name of the suite and the filename part is used as the suite name. + + + + + Initializes a new instance of the class + specifying the suite name for an assembly that could not be loaded. + + + This becomes the full name of the suite and the filename part is used as the suite name. + + + + + Creates a copy of the given assembly with only the descendants that pass the specified filter. + + The to copy. + Determines which descendants are copied. + + + + Gets the Assembly represented by this instance. + + + + + Gets the name used for the top-level element in the + XML representation of this test + + + + + Get custom attributes specified on the assembly + + + + + Creates a filtered copy of the test suite. + + Determines which descendants are copied. + + + + TestFixture is a surrogate for a user test fixture class, + containing one or more tests. + + + + + The life cycle specified for the current test fixture. + + + + + Initializes a new instance of the class. + + Type of the fixture. + Arguments used to instantiate the test fixture, or null if none used + + + + Creates a copy of the given suite with only the descendants that pass the specified filter. + + The to copy. + Determines which descendants are copied. + + + + Initializes a new instance of the class that failed to load. + + Type of the fixture. + Exception that was thrown during test discovery. + + + + Gets the TypeInfo of the fixture used in running this test. + + + + + Creates a filtered copy of the test suite. + + Determines which descendants are copied. + + + + The TestMethod class represents a Test implemented as a method. + + + + + The ParameterSet used to create this test method + + + + + Initializes a new instance of the class. + + The method to be used as a test. + + + + Initializes a new instance of the class. + + The method to be used as a test. + The suite or fixture to which the new test will be added + + + + Gets a MethodInfo for the method implementing this test. + + + + + The arguments to use in executing the test method, or empty array if none are provided. + + + + + Overridden to return a TestCaseResult. + + A TestResult for this test. + + + + Gets a bool indicating whether the current test + has any descendant tests. + + + + + Returns a TNode representing the current result after + adding it as a child of the supplied parent node. + + The parent node. + If true, descendant results are included + + + + + Gets this test's child tests + + A list of child tests + + + + Gets the name used for the top-level element in the + XML representation of this test + + + + + Returns the name of the method + + + + + TestSuite represents a composite test, which contains other tests. + + + + + Our collection of child tests + + + + + Initializes a new instance of the class. + + The name of the suite. + + + + Initializes a new instance of the class. + + Name of the parent suite. + The name of the suite. + + + + Initializes a new instance of the class. + + Type of the fixture. + Arguments used to instantiate the test fixture, or null if none used. + + + + Initializes a new instance of the class. + + Type of the fixture. + + + + Creates a copy of the given suite with only the descendants that pass the specified filter. + + The to copy. + Determines which descendants are copied. + + + + Sorts tests under this suite. + + + + + Adds a test to the suite. + + The test. + + + + Creates a filtered copy of the test suite. + + Determines which descendants are copied. + + + + Recursively apply the attributes on to this test suite, + including attributes on nesting types. + + The + + + + Modify a newly constructed testSuite by applying any of NUnit's common + attributes, based on a supplied , which is + usually the reflection element from which the test was constructed, + but may not be in some instances. The attributes retrieved are + saved for use in subsequent operations. + + + + + Gets this test's child tests + + The list of child tests + + + + Gets a count of test cases represented by + or contained under this test. + + + + + + The arguments to use in creating the fixture, or empty array if none are provided. + + + + + Set to true to suppress sorting this suite's contents + + + + + OneTimeSetUp methods for this suite + + + + + OneTimeTearDown methods for this suite + + + + + Overridden to return a TestSuiteResult. + + A TestResult for this test. + + + + Gets a bool indicating whether the current test + has any descendant tests. + + + + + Gets the name used for the top-level element in the + XML representation of this test + + + + + Returns an XmlNode representing the current result after + adding it as a child of the supplied parent node. + + The parent node. + If true, descendant results are included + + + + + Check that setup and teardown methods marked by certain attributes + meet NUnit's requirements and mark the tests not runnable otherwise. + + + + + ThreadUtility provides a set of static methods convenient + for working with threads. + + + + + Pre-Task compatibility + + + + + Abort a thread, helping to dislodging it if it is blocked in native code + + The thread to abort + The native thread id (if known), otherwise 0. + If provided, allows the thread to be killed if it's in a message pump native blocking wait. + This must have previously been captured by calling from the running thread itself. + + + + Do our best to kill a thread + + The thread to kill + The native thread id (if known), otherwise 0. + If provided, allows the thread to be killed if it's in a message pump native blocking wait. + This must have previously been captured by calling from the running thread itself. + + + + Do our best to kill a thread, passing state info + + The thread to kill + Info for the ThreadAbortException handler + The native thread id (if known), otherwise 0. + If provided, allows the thread to be killed if it's in a message pump native blocking wait. + This must have previously been captured by calling from the running thread itself. + + + + Schedule a thread pool thread to check on the aborting thread in case it's in a message pump native blocking wait + + + + + Captures the current thread's native id. If provided to later, allows the thread to be killed if it's in a message pump native blocking wait. + + + + + Sends a message to the thread to dislodge it from native code and allow a return to managed code, where a ThreadAbortException can be generated. + The message is meaningless (WM_CLOSE without a window handle) but it will end any blocking message wait. + + + + Gets or if the current platform does not support it. + + + Sets if current platform supports it. + Value to set. If the current platform does not support then the only allowed value is . + + + + TypeHelper provides static methods that operate on Types. + + + + + Gets the display name for a Type as used by NUnit. + + The Type for which a display name is needed. + The display name for the Type + + + + Gets the display name for a Type as used by NUnit. + + The Type for which a display name is needed. + The arglist provided. + The display name for the Type + + + + Returns the best fit for a common type to be used in + matching actual arguments to a methods Type parameters. + + + + + Determines whether the specified type is numeric. + + The type to be examined. + + if the specified type is numeric; otherwise, . + + + + + Convert an argument list to the required parameter types. + Currently, only widening numeric conversions are performed. + + An array of args to be converted + A ParameterInfo[] whose types will be used as targets + + + + Determines whether this instance can deduce type args for a generic type from the supplied arguments. + + The type to be examined. + The arglist. + The type args to be used. + + if this the provided args give sufficient information to determine the type args to be used; otherwise, . + + + + + Return the interfaces implemented by a Type. + + The Type to be examined. + An array of Types for the interfaces. + + + + Return whether or not the given type is a ValueTuple. + + Type. + Whether or not the given type is a ValueTuple. + + + + Return whether or not the given type is a Tuple. + + Type. + Whether or not the given type is a Tuple. + + + + Determines whether the cast to the given type would succeed. + If is and + can be , the cast succeeds just like the C# language feature. + + The object to cast. + + + + Casts to a value of the given type if possible. + If is and + can be , the cast succeeds just like the C# language feature. + + The object to cast. + The value of the object, if the cast succeeded. + + + + Gets the if available. + + The type to get the for. + if available, throws otherwise. + If returns . + + + + Used for resolving the type difference between objects. + + + + + Gets the shortened type name difference between and . + + The expected object. + The actual object. + Output of the unique type name for the expected object. + Output of the unique type name for actual object. + + + + Gets the shortened type name difference between and . + + The expected object . + The actual object . + Output of the unique type name for the expected object. + Output of the unique type name for actual object. + + + + Obtain the shortened generic template parameters of the given and , + if they are generic. + + The expected . + The actual . + Shortened generic parameters of the expected . + Shortened generic parameters of the actual . + + + + Obtain a shortened name of the given . + + + + + Shorten the given names by only including the relevant differing namespaces/types, if they differ. + + The expected . + The actual . + The shortened expected name. + The shortened actual name. + + + + Returns whether or not the is generic. + + + + + Returns the fully qualified generic name of a given . + + + + + Reconstruct a generic type name using the provided generic type name, and a + of the template parameters. + + The name of the generic type, including the number of template parameters expected. + A of names of the template parameters of the provided generic type. + + + + Obtain the shortened generic names of the given expected and actual s. + + The expected . + The actual . + The shortened expected generic name. + The shortened actual generic name. + + + + The TypeWrapper class wraps a Type so it may be used in + a platform-independent manner. + + + + + Construct a TypeWrapper for a specified Type. + + + + + Gets the underlying Type on which this TypeWrapper is based. + + + + + Gets the base type of this type as an ITypeInfo + + + + + Gets the Name of the Type + + + + + Gets the FullName of the Type + + + + + Gets the assembly in which the type is declared + + + + + Gets the namespace of the Type + + + + + Gets a value indicating whether the type is abstract. + + + + + Gets a value indicating whether the Type is a generic Type + + + + + Returns true if the Type wrapped is T + + + + + Gets a value indicating whether the Type has generic parameters that have not been replaced by specific Types. + + + + + Gets a value indicating whether the Type is a generic Type definition + + + + + Gets a value indicating whether the type is sealed. + + + + + Gets a value indicating whether this type represents a static class. + + + + + Get the display name for this type + + + + + Get the display name for an object of this type, constructed with the specified args. + + + + + Returns a new ITypeInfo representing an instance of this generic Type using the supplied Type arguments + + + + + Returns a Type representing a generic type definition from which this Type can be constructed. + + + + + Returns an array of custom attributes of the specified type applied to this type + + + + + Returns a value indicating whether the type has an attribute of the specified type. + + + + + + + + Returns a flag indicating whether this type has a method with an attribute of the specified type. + + + + + + + Returns an array of IMethodInfos for methods of this Type + that match the specified flags. + + + + + Gets the public constructor taking the specified argument Types + + + + + Returns a value indicating whether this Type has a public constructor taking the specified argument Types. + + + + + Construct an object of this Type, using the specified arguments. + + + + + Override ToString() so that error messages in NUnit's own tests make sense + + + + + Returns all methods declared by this type that have the specified attribute, optionally + including base classes. Methods from a base class are always returned before methods from a class that + inherits from it. + + Specifies whether to search the fixture type inheritance chain. + + + + Encapsulates the ability to increment a value by an amount which may be of a different type. + + + + + Creates a from the specified value if the current instance is able to + use it to increment the on values which it operates. If the creation fails, + is thrown. + + + + + + Creates a from the specified value if the current instance is able to + use it to increment values on which it operates. A return value indicates + whether the creation succeeded. + + + + + Provides a convenient shorthand when is + and the default value of represents zero. + + + + + Initializes a new instance of the class. + + The amount by which to increment each time this step is applied. + + Must increment the given value and return the result. + If the result is outside the range representable by , + must throw . If the result does not change due to lack + of precision representable by , must throw . + + + + + Increments the given value and returns the result. + If the result is outside the range representable by , + throws . If the result does not change due to lack + of precision representable by , throws . + + + + + + + Encapsulates the ability to increment a value by an amount + which may be of a different type. + + + + + Increments the given value and returns the result. + If the result is outside the range representable by , + throws . If the result does not change due to lack + of precision representable by , throws . + + + + + + + Creates a from the specified value if the current instance is able to + use it to increment values of type . If the creation fails, + is thrown. + + + + + + Creates a from the specified value if the current instance is able to + use it to increment values of type . A return value indicates + whether the creation succeeded. + + + + + The IgnoredTestCaseData class represents a ignored TestCaseData. It adds + the ability to set a date until which the test will be ignored. + + + + + The previous RunState + + + + + Set the date that the test is being ignored until + + The date that the test is being ignored until + A modified TestCaseData. + + + + Helper class with properties and methods that supply + a number of constraints used in Asserts. + + + + + Returns a ConstraintExpression that negates any + following constraint. + + + + + Returns a ConstraintExpression, which will apply + the following constraint to all members of a collection, + succeeding if all of them succeed. + + + + + Returns a constraint that tests for null + + + + + Returns a constraint that tests for default value + + + + + Returns a constraint that tests for True + + + + + Returns a constraint that tests for False + + + + + Returns a constraint that tests for a positive value + + + + + Returns a constraint that tests for a negative value + + + + + Returns a constraint that tests for equality with zero + + + + + Returns a constraint that tests for NaN + + + + + Returns a constraint that tests for empty + + + + + Returns a constraint that tests whether a collection + contains all unique items. + + + + + Returns a constraint that tests whether an object graph is serializable in XML format. + + + + + Returns a constraint that tests two items for equality + + + + + Returns a constraint that tests that two references are the same object + + + + + Returns a constraint that tests whether the + actual value is greater than the supplied argument + + + + + Returns a constraint that tests whether the + actual value is greater than or equal to the supplied argument + + + + + Returns a constraint that tests whether the + actual value is greater than or equal to the supplied argument + + + + + Returns a constraint that tests whether the + actual value is less than the supplied argument + + + + + Returns a constraint that tests whether the + actual value is less than or equal to the supplied argument + + + + + Returns a constraint that tests whether the + actual value is less than or equal to the supplied argument + + + + + Returns a constraint that tests whether the actual + value is of the exact type supplied as an argument. + + + + + Returns a constraint that tests whether the actual + value is of the exact type supplied as an argument. + + + + + Returns a constraint that tests whether the actual value + is of the type supplied as an argument or a derived type. + + + + + Returns a constraint that tests whether the actual value + is of the type supplied as an argument or a derived type. + + + + + Returns a constraint that tests whether the actual value + is assignable from the type supplied as an argument. + + + + + Returns a constraint that tests whether the actual value + is assignable from the type supplied as an argument. + + + + + Returns a constraint that tests whether the actual value + is assignable to the type supplied as an argument. + + + + + Returns a constraint that tests whether the actual value + is assignable to the type supplied as an argument. + + + + + Returns a constraint that tests whether the actual value + is a collection containing the same elements as the + collection supplied as an argument. + + + + + Returns a constraint that tests whether the actual value + is a subset of the collection supplied as an argument. + + + + + Returns a constraint that tests whether the actual value + is a superset of the collection supplied as an argument. + + + + + Returns a constraint that tests whether a collection is ordered + + + + + Returns a constraint that tests whether the path provided + is the same as an expected path after canonicalization. + + + + + Returns a constraint that tests whether the path provided + is a subpath of the expected path after canonicalization. + + + + + Returns a constraint that tests whether the path provided + is the same path or under an expected path after canonicalization. + + + + + Returns a constraint that tests whether the actual value falls + inclusively within a specified range. + + Inclusive beginning of the range. + Inclusive end of the range. + + + + + Returns a constraint that tests if an item is equal to any of parameters + + Expected values + + + + Returns a constraint that tests if an item is equal to any of parameters + + Expected values + + + + When implemented by an attribute, this interface implemented to provide actions to execute before and after tests. + + + + + Executed before each test is run + + The test that is going to be run. + + + + Executed after each test is run + + The test that has just been run. + + + + Provides the target for the action attribute + + The target for the action attribute + + + + The Iz class is a synonym for Is intended for use in VB, + which regards Is as a keyword. + + + + + A class to allow postponing the actual formatting of interpolated strings. + + + This class is needed as the compiler prefers to call a overload + vs a overload. + https://www.damirscorner.com/blog/posts/20180921-FormattableStringAsMethodParameter.html + + + + + Initializes a new instance of the class. + + The message formattable to hold. + + + + Implicit conversion from a to a . + + + Should never be called. It only exists for the compiler. + + The message formattable to hold. + + + + Implicit conversion from a to a . + + The message formattable to hold. + + + + + + + The TestCaseData class represents a set of arguments + and other parameter info to be used for a parameterized + test case. It is derived from TestCaseParameters and adds a + fluent syntax for use in initializing the test case. + + + + + Initializes a new instance of the class. + + The arguments. + + + + Initializes a new instance of the class. + + The argument. + + + + Initializes a new instance of the class. + + The first argument. + The second argument. + + + + Initializes a new instance of the class. + + The first argument. + The second argument. + The third argument. + + + + Sets the expected result for the test + + The expected result + A modified TestCaseData + + + + Sets the name of the test case + + The modified TestCaseData instance + + + + Sets the list of display names to use as the parameters in the test name. + + + + + Sets the description for the test case + being constructed. + + The description. + The modified TestCaseData instance. + + + + Applies a category to the test + + + + + + + Applies a named property to the test + + + + + + + + Applies a named property to the test + + + + + + + + Applies a named property to the test + + + + + + + + Marks the test case as explicit. + + + + + Marks the test case as explicit, specifying the reason. + + + + + Ignores this TestCase, specifying the reason. + + The reason. + + + + + Provide the context information of the current test. + This is an adapter for the internal ExecutionContext + class, hiding the internals from the user test. + + + + + Construct a TestContext for an ExecutionContext + + The ExecutionContext to adapt + + + + Get the current test context. This is created + as needed. The user may save the context for + use within a test, but it should not be used + outside the test for which it is created. + + + + + Gets a TextWriter that will send output to the current test result. + + + + + Gets a TextWriter that will send output directly to Console.Error + + + + + Gets a TextWriter for use in displaying immediate progress messages + + + + + TestParameters object holds parameters for the test run, if any are specified + + + + + Static DefaultWorkDirectory is now used as the source + of the public instance property WorkDirectory. This is + a bit odd but necessary to avoid breaking user tests. + + + + + Get a representation of the current test. + + + + + Gets a Representation of the TestResult for the current test. + + + + + Gets the unique name of the Worker that is executing this test. + + + + + Gets the directory containing the current test assembly. + + + + + Gets the directory to be used for outputting files created + by this test run. + + + + + Gets the random generator. + + + The random generator. + + + + + Gets the number of assertions executed + up to this point in the test. + + + + + Get the number of times the current Test has been repeated + when using the or . + + + + + Gets the for the test case. + + + + Write the string representation of a boolean value to the current result + + + Write a char to the current result + + + Write a char array to the current result + + + Write the string representation of a double to the current result + + + Write the string representation of an Int32 value to the current result + + + Write the string representation of an Int64 value to the current result + + + Write the string representation of a decimal value to the current result + + + Write the string representation of an object to the current result + + + Write the string representation of a Single value to the current result + + + Write a string to the current result + + + Write the string representation of a UInt32 value to the current result + + + Write the string representation of a UInt64 value to the current result + + + Write a formatted string to the current result + + + Write a formatted string to the current result + + + Write a formatted string to the current result + + + Write a formatted string to the current result + + + Write a line terminator to the current result + + + Write the string representation of a boolean value to the current result followed by a line terminator + + + Write a char to the current result followed by a line terminator + + + Write a char array to the current result followed by a line terminator + + + Write the string representation of a double to the current result followed by a line terminator + + + Write the string representation of an Int32 value to the current result followed by a line terminator + + + Write the string representation of an Int64 value to the current result followed by a line terminator + + + Write the string representation of a decimal value to the current result followed by a line terminator + + + Write the string representation of an object to the current result followed by a line terminator + + + Write the string representation of a Single value to the current result followed by a line terminator + + + Write a string to the current result followed by a line terminator + + + Write the string representation of a UInt32 value to the current result followed by a line terminator + + + Write the string representation of a UInt64 value to the current result followed by a line terminator + + + Write a formatted string to the current result followed by a line terminator + + + Write a formatted string to the current result followed by a line terminator + + + Write a formatted string to the current result followed by a line terminator + + + Write a formatted string to the current result followed by a line terminator + + + + This method adds the a new ValueFormatterFactory to the + chain of responsibility used for formatting values in messages. + The scope of the change is the current TestContext. + + The factory delegate + + + + Attach a file to the current test result + + Relative or absolute file path to attachment + Optional description of attachment + + + + This method provides a simplified way to add a ValueFormatter + delegate to the chain of responsibility, creating the factory + delegate internally. It is useful when the Type of the object + is the only criterion for selection of the formatter, since + it can be used without getting involved with a compound function. + + The type supported by this formatter + The ValueFormatter delegate + + + + TestAdapter adapts a Test for consumption by + the user test code. + + + + + Construct a TestAdapter for a Test + + The Test to be adapted + + + + Gets the unique Id of a test + + + + + The name of the test, which may or may not be + the same as the method name. + + + + + Get the Namespace of the test. + + + + + Get the display name of the test. + + + + + The name of the method representing the test. + + + + + The method representing the test. + + + + + Gets the underlying Type. + + + + + The FullName of the test + + + + + The ClassName of the test + + + + + A shallow copy of the properties of the test. + + + + + The arguments to use in creating the test or empty array if none are required. + + + + + The expected result if there is one for the test + + + + + ResultAdapter adapts a TestResult for consumption by + the user test code. + + + + + Construct a ResultAdapter for a TestResult + + The TestResult to be adapted + + + + Gets a ResultState representing the outcome of the test + up to this point in its execution. + + + + + Gets a list of the assertion results generated + up to this point in the test. + + + + + Gets the message associated with a test + failure or with not running the test + + + + + Gets any stack trace associated with an + error or failure. + + + + + Gets the number of test cases that failed + when running the test and all its children. + + + + + Gets the number of test cases that had warnings + when running the test and all its children. + + + + + Gets the number of test cases that passed + when running the test and all its children. + + + + + Gets the number of test cases that were skipped + when running the test and all its children. + + + + + Gets the number of test cases that were inconclusive + when running the test and all its children. + + + + + adapts an + for consumption by the user. + + + + + Construct a from a source + . + + + + + Get the first property with the given , if it can be found, otherwise + returns null. + + + + + Indicates whether is found in this + . + + + + + Returns a collection of properties + with the given . + + + + + Returns the count of elements with the given . + + + + + Returns a collection of the property keys. + + + + + The TestFixtureData class represents a set of arguments + and other parameter info to be used for a parameterized + fixture. It is derived from TestFixtureParameters and adds a + fluent syntax for use in initializing the fixture. + + + + + Initializes a new instance of the class. + + The arguments. + + + + Initializes a new instance of the class. + + The argument. + + + + Initializes a new instance of the class. + + The first argument. + The second argument. + + + + Initializes a new instance of the class. + + The first argument. + The second argument. + The third argument. + + + + Sets the name of the test fixture + + The modified TestFixtureData instance + + + + Sets the list of display names to use as the parameters in the test name. + + + + + Marks the test fixture as explicit. + + + + + Marks the test fixture as explicit, specifying the reason. + + + + + Ignores this TestFixture, specifying the reason. + + The reason. + + + + + TestParameters class holds any named parameters supplied to the test run + + + + + Gets the number of test parameters + + + + + Gets a collection of the test parameter names + + + + + Gets a flag indicating whether a parameter with the specified name exists. + + Name of the parameter + True if it exists, otherwise false + + + + Indexer provides access to the internal dictionary + + Name of the parameter + Value of the parameter or null if not present + + + + Get method is a simple alternative to the indexer + + Name of the parameter + Value of the parameter or null if not present + + + + Get the value of a parameter or a default string + + Name of the parameter + Default value of the parameter + Value of the parameter or default value if not present + + + + Get the value of a parameter or return a default + + The return Type + Name of the parameter + Default value of the parameter + Value of the parameter or default value if not present + + + + Adds a parameter to the list + + Name of the parameter + Value of the parameter + + + + Helper class with properties and methods that supply + constraints that operate on exceptions. + + + + + Creates a constraint specifying an expected exception + + + + + Creates a constraint specifying an exception with a given InnerException + + + + + Creates a constraint specifying an expected TargetInvocationException + + + + + Creates a constraint specifying an expected ArgumentException + + + + + Creates a constraint specifying an expected ArgumentNullException + + + + + Creates a constraint specifying an expected InvalidOperationException + + + + + Creates a constraint specifying that no exception is thrown + + + + + Creates a constraint specifying the exact type of exception expected + + + + + Creates a constraint specifying the exact type of exception expected + + + + + Creates a constraint specifying the type of exception expected + + + + + Creates a constraint specifying the type of exception expected + + + + + Provides static methods to express conditions + that must be met for the test to succeed. If + any test fails, a warning is issued. + + + + + DO NOT USE! + The Equals method throws an InvalidOperationException. This is done + to make sure there is no mistake by calling this function. + + The left object. + The right object. + Not applicable + + + + DO NOT USE! + The ReferenceEquals method throws an InvalidOperationException. This is done + to make sure there is no mistake by calling this function. + + The left object. + The right object. + + + + Apply a constraint to an actual value, succeeding if the constraint + is satisfied and issuing a warning on failure. + + The Type being compared. + An ActualValueDelegate returning the value to be tested + A Constraint expression to be applied + The message that will be displayed on failure + + + + Apply a constraint to an actual value, succeeding if the constraint + is satisfied and issuing a warning on failure. + + The Type being compared. + An ActualValueDelegate returning the value to be tested + A Constraint expression to be applied + The message that will be displayed on failure + + + + Apply a constraint to an actual value, succeeding if the constraint + is satisfied and issuing a warning on failure. + + The Type being compared. + An ActualValueDelegate returning the value to be tested + A Constraint expression to be applied + A function to build the message included with the Exception + + + + Asserts that a condition is true. If the condition is false, a warning is issued. + + The evaluated condition + The message to display if the condition is false + + + + Asserts that a condition is true. If the condition is false, a warning is issued. + + The evaluated condition + The message to display if the condition is false + + + + Asserts that a condition is true. If the condition is false, a warning is issued. + + The evaluated condition + A function to build the message included with the Exception + + + + Asserts that a condition is true. If the condition is false, a warning is issued. + + A lambda that returns a Boolean + The message to display if the condition is false + + + + Asserts that a condition is true. If the condition is false, a warning is issued. + + A lambda that returns a Boolean + The message to display if the condition is false + + + + Asserts that a condition is true. If the condition is false, a warning is issued. + + A lambda that returns a Boolean + A function to build the message included with the Exception + + + + Apply a constraint to an actual value, succeeding if the constraint + is satisfied and issuing a warning on failure. + + The Type being compared. + The actual value to test + A Constraint expression to be applied + The message that will be displayed on failure + + + + Apply a constraint to an actual value, succeeding if the constraint + is satisfied and issuing a warning on failure. + + The Type being compared. + The actual value to test + A Constraint expression to be applied + The message that will be displayed on failure + + + + Apply a constraint to an actual value, succeeding if the constraint + is satisfied and issuing a warning on failure. + + The Type being compared. + The actual value to test + A Constraint expression to be applied + A function to build the message included with the Exception + + + + Apply a constraint to an actual value, succeeding if the constraint + fails and issuing a warning on success. + + The Type being compared. + An ActualValueDelegate returning the value to be tested + A Constraint expression to be applied + The message that will be displayed on failure + + + + Apply a constraint to an actual value, succeeding if the constraint + fails and issuing a warning on success. + + The Type being compared. + An ActualValueDelegate returning the value to be tested + A Constraint expression to be applied + The message that will be displayed on failure + + + + Apply a constraint to an actual value, succeeding if the constraint + fails and issuing a warning on failure. + + The Type being compared. + An ActualValueDelegate returning the value to be tested + A Constraint expression to be applied + A function to build the message included with the Exception + + + + Asserts that a condition is false. If the condition is true, a warning is issued. + + The evaluated condition + The message to display if the condition is false + + + + Asserts that a condition is false. If the condition is true, a warning is issued. + + The evaluated condition + The message to display if the condition is false + + + + Asserts that a condition is false. If the condition is true, a warning is issued. + + The evaluated condition + A function to build the message included with the Exception + + + + Asserts that a condition is false. If the condition is true a warning is issued. + + A lambda that returns a Boolean + The message to display if the condition is true + + + + Asserts that a condition is false. If the condition is true a warning is issued. + + A lambda that returns a Boolean + The message to display if the condition is true + + + + Asserts that a condition is false. If the condition is true a warning is issued. + + A lambda that returns a Boolean + A function to build the message included with the Exception + + + + Apply a constraint to an actual value, succeeding if the constraint + fails and issuing a warning if it succeeds. + + The Type being compared. + The actual value to test + A Constraint expression to be applied + The message that will be displayed on failure + + + + Apply a constraint to an actual value, succeeding if the constraint + fails and issuing a warning if it succeeds. + + The Type being compared. + The actual value to test + A Constraint expression to be applied + The message that will be displayed on failure + + + + Apply a constraint to an actual value, succeeding if the constraint + is satisfied and issuing a warning on failure. + + The Type being compared. + The actual value to test + A Constraint expression to be applied + A function to build the message included with the Exception + + + + Contains extension methods that do not require a special using directive. + + + + + Checks that attribute value contains safe content and if not, escapes it. + + + + + Checks that CDATA section contains safe content and if not, escapes it. + + + + + FrameworkPackageSettings is a static class containing constant values that + are used as keys in setting up a TestPackage. These values are used in + the framework, and set in the runner. Setting values may be a string, int or bool. + + + + + Flag (bool) indicating whether tests are being debugged. + + + + + Flag (bool) indicating whether to pause execution of tests to allow + the user to attach a debugger. + + + + + The InternalTraceLevel for this run. Values are: "Default", + "Off", "Error", "Warning", "Info", "Debug", "Verbose". + Default is "Off". "Debug" and "Verbose" are synonyms. + + + + + Full path of the directory to be used for work and result files. + This path is provided to tests by the framework TestContext. + + + + + Integer value in milliseconds for the default timeout value + for test cases. If not specified, there is no timeout except + as specified by attributes on the tests themselves. + + + + + A string representing the default thread culture to be used for + running tests. String should be a valid BCP-47 culture name. If + culture is unset, tests run on the machine's default culture. + + + + + A string representing the default thread UI culture to be used for + running tests. String should be a valid BCP-47 culture name. If + culture is unset, tests run on the machine's default culture. + + + + + A TextWriter to which the internal trace will be sent. + + + + + A list of tests to be loaded. + + + + + The number of test threads to run for the assembly. If set to + 1, a single queue is used. If set to 0, tests are executed + directly, without queuing. + + + + + The random seed to be used for this assembly. If specified + as the value reported from a prior run, the framework should + generate identical random values for tests as were used for + that run, provided that no change has been made to the test + assembly. Default is a random value itself. + + + + + If true, execution stops after the first error or failure. + + + + + If true, use of the event queue is suppressed and test events are synchronous. + + + + + The default naming pattern used in generating test names + + + + + Parameters to be passed on to the tests, serialized to a single string which needs parsing. Obsoleted by ; kept for backward compatibility. + + + + + Parameters to be passed on to the tests, already parsed into an IDictionary<string, string>. Replaces . + + + + + If true, the tests will run on the same thread as the NUnit runner itself + + + + + Provides a platform-independent methods for getting attributes + for use by AttributeConstraint and AttributeExistsConstraint. + + + + + Gets the custom attributes from the given object. + + The actual. + Type of the attribute. + if set to [inherit]. + A list of the given attribute on the given object. + + + + A MarshalByRefObject that lives forever + + + + + Obtains a lifetime service object to control the lifetime policy for this instance. + + + + diff --git a/src/SDK/aimp_dotnet/SDK/AimpObject.h b/src/SDK/aimp_dotnet/SDK/AimpObject.h index e7e07979..01c0d9bd 100644 --- a/src/SDK/aimp_dotnet/SDK/AimpObject.h +++ b/src/SDK/aimp_dotnet/SDK/AimpObject.h @@ -53,6 +53,9 @@ public ref class AimpObject : public IAimpObject { } virtual void RegisterAtMemoryManager() { + if (ComObject == nullptr) + return; + ComObject->AddRef(); if (_isDisposable && InternalAimpObject != nullptr) { AimpMemoryManager::getInstance().AddObject(this->GetHashCode(), InternalAimpObject, msclr::interop::marshal_as(this->ToString())); diff --git a/src/Tests/IntegrationTests/AimpTestRunner.csproj b/src/Tests/IntegrationTests/AimpTestRunner.csproj index 6ae618e2..4969f11d 100644 --- a/src/Tests/IntegrationTests/AimpTestRunner.csproj +++ b/src/Tests/IntegrationTests/AimpTestRunner.csproj @@ -1,6 +1,5 @@  - @@ -79,18 +78,18 @@ prompt - - ..\..\packages\NUnit.Engine.3.16.2\lib\net462\nunit.engine.dll + + ..\..\packages\NUnit.Engine.3.16.3\lib\net462\nunit.engine.dll - ..\..\packages\NUnit.Engine.3.16.2\lib\net462\nunit.engine.api.dll + ..\..\packages\NUnit.Engine.3.16.3\lib\net462\nunit.engine.api.dll - - ..\..\packages\NUnit.Engine.3.16.2\lib\net462\nunit.engine.core.dll + + ..\..\packages\NUnit.Engine.3.16.3\lib\net462\nunit.engine.core.dll - + False - ..\nunit\nunit.framework.dll + ..\..\..\nunit\nunit.framework.dll @@ -98,7 +97,7 @@ - ..\..\packages\NUnit.Engine.3.16.2\lib\net462\testcentric.engine.metadata.dll + ..\..\packages\NUnit.Engine.3.16.3\lib\net462\testcentric.engine.metadata.dll @@ -122,18 +121,13 @@ + + + - - - - - - - - @@ -142,6 +136,9 @@ + + + @@ -149,6 +146,7 @@ + @@ -190,10 +188,4 @@ - - - This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. - - - \ No newline at end of file diff --git a/src/Tests/IntegrationTests/Directory.Build.targets b/src/Tests/IntegrationTests/Directory.Build.targets index 08813f77..4de63d57 100644 --- a/src/Tests/IntegrationTests/Directory.Build.targets +++ b/src/Tests/IntegrationTests/Directory.Build.targets @@ -1,7 +1,7 @@  $(SolutionDir)..\nuget\tools\CopyPlugin.ps1 - AIMP5.10.2414 + AIMP5.11.2432 diff --git a/src/Tests/IntegrationTests/Engine/AimpNUnitFrameworkDriver.cs b/src/Tests/IntegrationTests/Engine/AimpNUnitFrameworkDriver.cs index 658d1233..b10a1c3a 100644 --- a/src/Tests/IntegrationTests/Engine/AimpNUnitFrameworkDriver.cs +++ b/src/Tests/IntegrationTests/Engine/AimpNUnitFrameworkDriver.cs @@ -26,7 +26,7 @@ public class AimpNUnitFrameworkDriver : IDriverFactory public bool IsSupportedTestFramework(AssemblyName reference) { return NUNIT_FRAMEWORK.Equals(reference.Name, StringComparison.OrdinalIgnoreCase) && - reference.Version.Major == 3; + reference.Version.Major == 4; } public IFrameworkDriver GetDriver(AppDomain domain, AssemblyName reference) diff --git a/src/Tests/IntegrationTests/TestFramework/AimpIntegrationTest.cs b/src/Tests/IntegrationTests/TestFramework/AimpIntegrationTest.cs index 22d4a6e6..518c5893 100644 --- a/src/Tests/IntegrationTests/TestFramework/AimpIntegrationTest.cs +++ b/src/Tests/IntegrationTests/TestFramework/AimpIntegrationTest.cs @@ -27,7 +27,7 @@ public abstract class AimpIntegrationTest [OneTimeSetUp] public virtual void RunBeforeAnyTests() { - NUnit.Framework.Assert.NotNull(Player); + NUnit.Framework.Assert.That(Player, Is.Not.Null); Asserts = new List(); ClearAimpBeforeTests(); } diff --git a/src/Tests/IntegrationTests/TestFramework/Assert/EqualAssert.cs b/src/Tests/IntegrationTests/TestFramework/Assert/EqualAssert.cs index 3aacae82..facbe083 100644 --- a/src/Tests/IntegrationTests/TestFramework/Assert/EqualAssert.cs +++ b/src/Tests/IntegrationTests/TestFramework/Assert/EqualAssert.cs @@ -7,6 +7,8 @@ // Mail: mail4evgeniy@gmail.com // ---------------------------------------------------- +using NUnit.Framework; + namespace Aimp.TestRunner.TestFramework.Assert; public class EqualAssert : MemberAssert @@ -22,7 +24,7 @@ public EqualAssert(string name, object value, object expected, string message) public override void Validate() { Validate(() => - NUnit.Framework.Assert.AreEqual(Expected, Value, + NUnit.Framework.Assert.That(Value, Is.EqualTo(Expected), Message ?? $"Expected '{Expected}' but was '{Value}'")); } } diff --git a/src/Tests/IntegrationTests/TestFramework/Assert/FalseAssert.cs b/src/Tests/IntegrationTests/TestFramework/Assert/FalseAssert.cs index 72717642..21e81f4c 100644 --- a/src/Tests/IntegrationTests/TestFramework/Assert/FalseAssert.cs +++ b/src/Tests/IntegrationTests/TestFramework/Assert/FalseAssert.cs @@ -7,6 +7,8 @@ // Mail: mail4evgeniy@gmail.com // ---------------------------------------------------- +using NUnit.Framework; + namespace Aimp.TestRunner.TestFramework.Assert; public class FalseAssert : MemberAssert @@ -18,6 +20,6 @@ public FalseAssert(string name, bool value, string message) public override void Validate() { - Validate(() => NUnit.Framework.Assert.IsFalse(Value.ToString().Equals(true.ToString()))); + Validate(() => NUnit.Framework.Assert.That(Value, Is.False)); } } diff --git a/src/Tests/IntegrationTests/TestFramework/Assert/NotEqualAssert.cs b/src/Tests/IntegrationTests/TestFramework/Assert/NotEqualAssert.cs index 3350f7eb..6e350f88 100644 --- a/src/Tests/IntegrationTests/TestFramework/Assert/NotEqualAssert.cs +++ b/src/Tests/IntegrationTests/TestFramework/Assert/NotEqualAssert.cs @@ -7,6 +7,8 @@ // Mail: mail4evgeniy@gmail.com // ---------------------------------------------------- +using NUnit.Framework; + namespace Aimp.TestRunner.TestFramework.Assert; public class NotEqualAssert : MemberAssert @@ -22,6 +24,6 @@ public NotEqualAssert(string name, object value, object expected, string message public override void Validate() { Validate(() => - NUnit.Framework.Assert.AreNotEqual(Expected, Value, Message ?? $"Expected '{Expected}' but was '{Value}'")); + NUnit.Framework.Assert.That(Value, Is.Not.EqualTo(Expected), Message ?? $"Expected '{Expected}' but was '{Value}'")); } } diff --git a/src/Tests/IntegrationTests/TestFramework/Assert/NotNullAssert.cs b/src/Tests/IntegrationTests/TestFramework/Assert/NotNullAssert.cs index d68b3a2a..54897ba3 100644 --- a/src/Tests/IntegrationTests/TestFramework/Assert/NotNullAssert.cs +++ b/src/Tests/IntegrationTests/TestFramework/Assert/NotNullAssert.cs @@ -7,6 +7,8 @@ // Mail: mail4evgeniy@gmail.com // ---------------------------------------------------- +using NUnit.Framework; + namespace Aimp.TestRunner.TestFramework.Assert; public class NotNullAssert : MemberAssert @@ -17,6 +19,6 @@ public NotNullAssert(string name, object value, string message) : base(name, val public override void Validate() { - Validate(() => NUnit.Framework.Assert.NotNull(Value, FieldName)); + Validate(() => NUnit.Framework.Assert.That(Value, Is.Not.Null)); } } diff --git a/src/Tests/IntegrationTests/TestFramework/Assert/NullAssert.cs b/src/Tests/IntegrationTests/TestFramework/Assert/NullAssert.cs index cd36e3a7..28d18838 100644 --- a/src/Tests/IntegrationTests/TestFramework/Assert/NullAssert.cs +++ b/src/Tests/IntegrationTests/TestFramework/Assert/NullAssert.cs @@ -7,6 +7,8 @@ // Mail: mail4evgeniy@gmail.com // ---------------------------------------------------- +using NUnit.Framework; + namespace Aimp.TestRunner.TestFramework.Assert; public class NullAssert : MemberAssert @@ -17,6 +19,6 @@ public NullAssert(string name, object value, string message) : base(name, value, public override void Validate() { - Validate(() => NUnit.Framework.Assert.Null(Value, FieldName)); + Validate(() => NUnit.Framework.Assert.That(Value, Is.Null)); } } diff --git a/src/Tests/IntegrationTests/TestFramework/Assert/TrueAssert.cs b/src/Tests/IntegrationTests/TestFramework/Assert/TrueAssert.cs index 92cedd61..7de50abb 100644 --- a/src/Tests/IntegrationTests/TestFramework/Assert/TrueAssert.cs +++ b/src/Tests/IntegrationTests/TestFramework/Assert/TrueAssert.cs @@ -7,6 +7,8 @@ // Mail: mail4evgeniy@gmail.com // ---------------------------------------------------- +using NUnit.Framework; + namespace Aimp.TestRunner.TestFramework.Assert; public class TrueAssert : MemberAssert @@ -20,6 +22,6 @@ public TrueAssert(string name, bool value, string message) public override void Validate() { - Validate(() => NUnit.Framework.Assert.IsTrue(Value.ToString().Equals(true.ToString()))); + Validate(() => NUnit.Framework.Assert.That(Value, Is.True)); } } diff --git a/src/Tests/IntegrationTests/UnitTests/AlbumArtManager/AimpServiceAlbumArtTests.cs b/src/Tests/IntegrationTests/UnitTests/AlbumArtManager/AimpServiceAlbumArtTests.cs index 4d3ca0c3..08e8a254 100644 --- a/src/Tests/IntegrationTests/UnitTests/AlbumArtManager/AimpServiceAlbumArtTests.cs +++ b/src/Tests/IntegrationTests/UnitTests/AlbumArtManager/AimpServiceAlbumArtTests.cs @@ -28,7 +28,8 @@ public void Get_EmptyFileUri_ShouldThrowException() AimpFindCovertArtType.AIMP_SERVICE_ALBUMART_FLAGS_IGNORECACHE | AimpFindCovertArtType.AIMP_SERVICE_ALBUMART_FLAGS_WAITFOR, "userData"); }); - Assert.IsTrue(ex.Message.Contains("Parameter fileUrl cannot be empty")); + + AimpAssert.IsTrue(ex.Message.Contains("Parameter fileUrl cannot be empty")); } [Test] @@ -39,10 +40,9 @@ public void Get_ShouldReturnTaskId() var result = Player.ServiceAlbumArt.Get("url", string.Empty, string.Empty, AimpFindCovertArtType.AIMP_SERVICE_ALBUMART_FLAGS_IGNORECACHE, "userData"); - Assert.AreEqual(ActionResultType.OK, result.ResultType); - Assert.IsTrue(result.Result > 0); + AimpAssert.AreEqual(ActionResultType.OK, result.ResultType); + AimpAssert.IsTrue(result.Result > 0); Thread.Sleep(1000); - //Assert.IsTrue(completed); } [Test] @@ -60,26 +60,27 @@ public void Get2_ShouldReturnTaskId() var fi = Player.ServicePlayer.CurrentFileInfo; - Assert.NotNull(fi); - var result = Player.ServiceAlbumArt.Get2(fi, AimpFindCovertArtType.AIMP_SERVICE_ALBUMART_FLAGS_IGNORECACHE, - "userData"); - Assert.AreEqual(ActionResultType.OK, result.ResultType); - Assert.IsTrue(result.Result > 0); + AimpAssert.NotNull(fi); + + var result = Player.ServiceAlbumArt.Get2(fi, AimpFindCovertArtType.AIMP_SERVICE_ALBUMART_FLAGS_IGNORECACHE, "userData"); + + AimpAssert.AreEqual(ActionResultType.OK, result.ResultType); + AimpAssert.IsTrue(result.Result > 0); + Thread.Sleep(1000); - Assert.IsTrue(completed); + AimpAssert.IsTrue(completed); } [Test] public void Cancel_ShouldCancelGetTask() { - var result = Player.ServiceAlbumArt.Get("url", string.Empty, string.Empty, - AimpFindCovertArtType.AIMP_SERVICE_ALBUMART_FLAGS_IGNORECACHE, "userData"); + var result = Player.ServiceAlbumArt.Get("url", string.Empty, string.Empty, AimpFindCovertArtType.AIMP_SERVICE_ALBUMART_FLAGS_IGNORECACHE, "userData"); - Assert.AreEqual(ActionResultType.OK, result.ResultType); - Assert.IsTrue(result.Result > 0); + AimpAssert.AreEqual(ActionResultType.OK, result.ResultType); + AimpAssert.IsTrue(result.Result > 0); var result2 = Player.ServiceAlbumArt.Cancel(result.Result, AimpFindCovertArtType.AIMP_SERVICE_ALBUMART_FLAGS_IGNORECACHE); - Assert.AreEqual(ActionResultType.OK, result2.ResultType); + AimpAssert.AreEqual(ActionResultType.OK, result2.ResultType); } } diff --git a/src/Tests/IntegrationTests/UnitTests/FileManager/AimpFileInfoUnitTests.cs b/src/Tests/IntegrationTests/UnitTests/FileManager/AimpFileInfoUnitTests.cs index 28543b3d..f136e1e5 100644 --- a/src/Tests/IntegrationTests/UnitTests/FileManager/AimpFileInfoUnitTests.cs +++ b/src/Tests/IntegrationTests/UnitTests/FileManager/AimpFileInfoUnitTests.cs @@ -115,7 +115,7 @@ public void Assign_ShouldAssignDataToNewObject() var newFileInfo = Player.Core.CreateAimpObject(); - Assert.AreEqual(ActionResultType.OK, newFileInfo.ResultType); + AimpAssert.AreEqual(ActionResultType.OK, newFileInfo.ResultType); var clone = newFileInfo.Result; clone.Assign(original); diff --git a/src/Tests/IntegrationTests/UnitTests/FileManager/IAimpServiceFileURI2UnitTests.cs b/src/Tests/IntegrationTests/UnitTests/FileManager/IAimpServiceFileURI2UnitTests.cs index bcd80db1..b8369b83 100644 --- a/src/Tests/IntegrationTests/UnitTests/FileManager/IAimpServiceFileURI2UnitTests.cs +++ b/src/Tests/IntegrationTests/UnitTests/FileManager/IAimpServiceFileURI2UnitTests.cs @@ -22,8 +22,8 @@ public void GetScheme_OK() ExecuteInMainThread(() => { var result = Player.ServiceFileUri2.GetScheme("test://file.mp3"); - Assert.AreEqual(ActionResultType.OK, result.ResultType); - Assert.AreEqual("test", result.Result); + AimpAssert.AreEqual(ActionResultType.OK, result.ResultType); + AimpAssert.AreEqual("test", result.Result); }); } } \ No newline at end of file diff --git a/src/Tests/IntegrationTests/UnitTests/Player/AimpPlayerTests.cs b/src/Tests/IntegrationTests/UnitTests/Player/AimpPlayerTests.cs index 53dd87a5..58e700e0 100644 --- a/src/Tests/IntegrationTests/UnitTests/Player/AimpPlayerTests.cs +++ b/src/Tests/IntegrationTests/UnitTests/Player/AimpPlayerTests.cs @@ -30,7 +30,7 @@ public void Play_PlayList_ShouldReturnOK() AimpAssert.AreEqual(ActionResultType.OK, result.ResultType); }); - Assert.AreEqual(AimpPlayerState.Playing, Player.ServicePlayer.State); + AimpAssert.AreEqual(AimpPlayerState.Playing, Player.ServicePlayer.State); } //[Test, Order(2)] @@ -51,11 +51,11 @@ public void Resume_ShouldReturnOK() ExecuteInThread(() => { var result = Player.ServicePlayer.Resume(); - Assert.AreEqual(ActionResultType.OK, result.ResultType); + AimpAssert.AreEqual(ActionResultType.OK, result.ResultType); return new AimpActionResult(result.ResultType); }); - Assert.AreEqual(AimpPlayerState.Playing, Player.ServicePlayer.State); + AimpAssert.AreEqual(AimpPlayerState.Playing, Player.ServicePlayer.State); } //[Test, Order(4)] @@ -64,17 +64,17 @@ public void Stop_ShouldReturnOK() ExecuteInThread(() => { var result = Player.ServicePlayer.Stop(); - Assert.AreEqual(ActionResultType.OK, result.ResultType); + AimpAssert.AreEqual(ActionResultType.OK, result.ResultType); return new AimpActionResult(result.ResultType); }); - Assert.AreEqual(AimpPlayerState.Stopped, Player.ServicePlayer.State); + AimpAssert.AreEqual(AimpPlayerState.Stopped, Player.ServicePlayer.State); } //[Test] public void StopAfterTrack_ShouldReturnOK() { var result = Player.ServicePlayer.StopAfterTrack(); - Assert.AreEqual(ActionResultType.OK, result.ResultType); + AimpAssert.AreEqual(ActionResultType.OK, result.ResultType); } } diff --git a/src/Tests/IntegrationTests/packages.config b/src/Tests/IntegrationTests/packages.config index 0651b7b6..39244b4f 100644 --- a/src/Tests/IntegrationTests/packages.config +++ b/src/Tests/IntegrationTests/packages.config @@ -1,6 +1,5 @@  - - + \ No newline at end of file From 80d1c85448fcab1fde8191db44f2a88332d4ada8 Mon Sep 17 00:00:00 2001 From: Evgeniy Date: Tue, 19 Dec 2023 00:19:22 +0300 Subject: [PATCH 26/36] Stack overflow exception --- build/Build.IntegrationTest.cs | 20 +++++++++- .../IntegrationTests/AimpTestRunner.csproj | 39 ------------------- 2 files changed, 18 insertions(+), 41 deletions(-) diff --git a/build/Build.IntegrationTest.cs b/build/Build.IntegrationTest.cs index 255f0664..51808d37 100644 --- a/build/Build.IntegrationTest.cs +++ b/build/Build.IntegrationTest.cs @@ -8,6 +8,7 @@ // ---------------------------------------------------- using System.Collections.Generic; +using System.Diagnostics; using System.IO; using System.Text; using System.Text.RegularExpressions; @@ -171,9 +172,24 @@ void copyFilesFromFolder(string folder) return; } + Log.Information("Start AIMP process"); - var p = ProcessTasks.StartProcess(aimpExe, "/DEBUG", IntegrationTestAimpPath, timeout: IntegrationTestTimeout * 60000); - var res = p.WaitForExit(); + var stopWatch = new Stopwatch(); + bool res = false; + + try + { + var p = ProcessTasks.StartProcess(aimpExe, "/DEBUG", IntegrationTestAimpPath, timeout: IntegrationTestTimeout * 60000); + stopWatch.Start(); + res = p.WaitForExit(); + } + catch (System.Exception ex) + { + Log.Error(ex, string.Empty); + } + stopWatch.Stop(); + + Log.Information($"Execution time: {stopWatch.Elapsed}"); if (res) { diff --git a/src/Tests/IntegrationTests/AimpTestRunner.csproj b/src/Tests/IntegrationTests/AimpTestRunner.csproj index 4969f11d..4adc0254 100644 --- a/src/Tests/IntegrationTests/AimpTestRunner.csproj +++ b/src/Tests/IntegrationTests/AimpTestRunner.csproj @@ -124,47 +124,8 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
From 3b729c8ea30497fd1ac583244a3542bb25e35ca4 Mon Sep 17 00:00:00 2001 From: Evgeniy Date: Tue, 19 Dec 2023 00:28:09 +0300 Subject: [PATCH 27/36] Stack overflow exception --- build/Build.IntegrationTest.cs | 2 +- build/_build.csproj | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/build/Build.IntegrationTest.cs b/build/Build.IntegrationTest.cs index 51808d37..b89cf8f2 100644 --- a/build/Build.IntegrationTest.cs +++ b/build/Build.IntegrationTest.cs @@ -189,7 +189,7 @@ void copyFilesFromFolder(string folder) } stopWatch.Stop(); - Log.Information($"Execution time: {stopWatch.Elapsed}"); + Log.Information($"Execution time: {stopWatch.Elapsed}. Result: {res}"); if (res) { diff --git a/build/_build.csproj b/build/_build.csproj index 1fadb64c..c25b6f2e 100644 --- a/build/_build.csproj +++ b/build/_build.csproj @@ -17,12 +17,12 @@ all runtime; build; native; contentfiles; analyzers; buildtransitive - + all runtime; build; native; contentfiles; analyzers; buildtransitive - + From a1669ab3ee900adc7ae1489d95ad3de11a485b6b Mon Sep 17 00:00:00 2001 From: Evgeniy Date: Tue, 19 Dec 2023 00:30:48 +0300 Subject: [PATCH 28/36] Stack overflow exception --- build/_build.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/_build.csproj b/build/_build.csproj index c25b6f2e..5712e98a 100644 --- a/build/_build.csproj +++ b/build/_build.csproj @@ -18,7 +18,7 @@ runtime; build; native; contentfiles; analyzers; buildtransitive - + all runtime; build; native; contentfiles; analyzers; buildtransitive From 76c5d969f528bd6750341db5b6b4f958032b3e22 Mon Sep 17 00:00:00 2001 From: Evgeniy Date: Tue, 19 Dec 2023 00:47:01 +0300 Subject: [PATCH 29/36] Stack overflow exception --- build/Build.Analyze.cs | 4 ++-- build/Build.Documentation.cs | 9 +++++++-- build/Build.cs | 7 +++---- 3 files changed, 12 insertions(+), 8 deletions(-) diff --git a/build/Build.Analyze.cs b/build/Build.Analyze.cs index b0bffbf9..63b26913 100644 --- a/build/Build.Analyze.cs +++ b/build/Build.Analyze.cs @@ -56,7 +56,7 @@ partial class Build .SetPullRequestKey(RequestId); } - var path = ToolPathResolver.GetPackageExecutable( + var path = NuGetToolPathResolver.GetPackageExecutable( packageId: "dotnet-sonarscanner", packageExecutable: "SonarScanner.MSBuild.dll", framework: framework); @@ -78,7 +78,7 @@ partial class Build () => { var framework = "net5.0"; - var path = ToolPathResolver.GetPackageExecutable( + var path = NuGetToolPathResolver.GetPackageExecutable( packageId: "dotnet-sonarscanner", packageExecutable: "SonarScanner.MSBuild.dll", framework: framework); diff --git a/build/Build.Documentation.cs b/build/Build.Documentation.cs index 35cdaa47..3b8dd408 100644 --- a/build/Build.Documentation.cs +++ b/build/Build.Documentation.cs @@ -9,6 +9,8 @@ using System.Collections.Generic; using System.IO; +using System.Linq; + using Nuke.Common; using Nuke.Common.IO; using Nuke.Common.Tooling; @@ -54,8 +56,11 @@ partial class Build .After(Metadata) .Executes(() => { - GlobFiles(DocumentationApiDirectory, "**/toc.yml").ForEach(File.Delete); - WriteCustomTocs(DocumentationApiDirectory, DocumentationRoot, GlobFiles(SDKBinFolder / "x86" / GetConfiguration(), "AIMP.SDK.dll")); + DocumentationApiDirectory.GlobFiles("**/toc.yml").ForEach(c => File.Delete(c)); + + var f = SDKBinFolder / "x86" / GetConfiguration(); + + WriteCustomTocs(DocumentationApiDirectory, DocumentationRoot, f.GlobFiles("AIMP.SDK.dll").Cast()); }); Target BuildDocumentation => _ => _ diff --git a/build/Build.cs b/build/Build.cs index 86ab469b..b8cebccb 100644 --- a/build/Build.cs +++ b/build/Build.cs @@ -34,7 +34,6 @@ using static Nuke.Common.IO.PathConstruction; using static Nuke.Common.Tools.MSBuild.MSBuildTasks; -[CheckBuildProjectConfigurations] partial class Build : NukeBuild { [Parameter("Configuration to build - Default is 'Debug' (local) or 'Release' (server)")] @@ -267,8 +266,8 @@ private Configuration GetConfiguration() PrintParameters("Nuget"); Log.Information("Deploying Nuget packages"); - var packages = GlobFiles(OutputDirectory, "*.nupkg") - .Where(c => !c.EndsWith("symbols.nupkg")).ToList(); + var packages = OutputDirectory.GlobFiles("*.nupkg") + .Where(c => !c.Name.EndsWith("symbols.nupkg")).ToList(); Assert.NotEmpty(packages); @@ -298,7 +297,7 @@ private Configuration GetConfiguration() Log.Information("Copy plugins to artifacts folder"); - var directories = GlobDirectories(SourceDirectory / "Plugins", $"**/bin/{targetPlatform}/{GetConfiguration()}"); + var directories = SourceDirectory.GlobDirectories("Plugins", $"**/bin/{targetPlatform}/{GetConfiguration()}"); foreach (var directory in directories) { var pluginDirectory = new DirectoryInfo(directory); From 4c050f90a58e3b4e38dd4747c439517b3a48f13a Mon Sep 17 00:00:00 2001 From: Evgeniy Date: Tue, 19 Dec 2023 23:48:17 +0300 Subject: [PATCH 30/36] Stack overflow exception --- build/Build.IntegrationTest.cs | 80 +++++++++++-------- src/Tests/IntegrationTests/AimpTestRunner.cs | 4 + .../IntegrationTests/AimpTestRunner.csproj | 40 ++++++++++ src/aimp_dotnet.sln | 1 + 4 files changed, 91 insertions(+), 34 deletions(-) diff --git a/build/Build.IntegrationTest.cs b/build/Build.IntegrationTest.cs index b89cf8f2..28c0bd3c 100644 --- a/build/Build.IntegrationTest.cs +++ b/build/Build.IntegrationTest.cs @@ -155,14 +155,15 @@ void copyFilesFromFolder(string folder) .Executes(() => { var testResultFile = IntegrationTestPluginPath / "integration.tests.xml"; +#if DEBUG var testResultLogFile = IntegrationTestPluginPath / "integration.tests.log"; + if (File.Exists(testResultLogFile)) + File.Delete(testResultLogFile); +#endif if (File.Exists(testResultFile)) File.Delete(testResultFile); - if (File.Exists(testResultLogFile)) - File.Delete(testResultLogFile); - var aimpExe = Path.Combine(IntegrationTestAimpPath, "AIMP.exe"); if (!File.Exists(aimpExe)) { @@ -172,7 +173,6 @@ void copyFilesFromFolder(string folder) return; } - Log.Information("Start AIMP process"); var stopWatch = new Stopwatch(); bool res = false; @@ -193,54 +193,66 @@ void copyFilesFromFolder(string folder) if (res) { - if (!File.Exists(testResultFile) || !File.Exists(testResultLogFile) || new FileInfo(testResultLogFile).Length == 0) + if (!File.Exists(testResultFile)) { LogError("Unable to run integration tests."); TeamCity.Instance?.WriteFailure($"Unable to run integration tests. {testResultFile} NOT FOUND"); Assert.Fail("Unable to run test."); + + return; } - else + + var isValid = true; + +#if DEBUG + if (!File.Exists(testResultLogFile) || new FileInfo(testResultLogFile).Length == 0) { - var isValid = true; + LogError("Result file is empty"); + TeamCity.Instance?.WriteFailure($"Result file {testResultLogFile} is empty"); + Assert.Fail("Unable to run test."); + + return; + } - CopyFileToDirectory(testResultFile, OutputDirectory, FileExistsPolicy.Overwrite); - CopyFileToDirectory(testResultLogFile, OutputDirectory, FileExistsPolicy.Overwrite); + CopyFileToDirectory(testResultLogFile, OutputDirectory, FileExistsPolicy.Overwrite); - var content = File.ReadAllText(testResultLogFile); - var r = new Regex(@"Failed:\s(\d*)"); - var matches = r.Matches(content); + var content = File.ReadAllText(testResultLogFile); + var r = new Regex(@"Failed:\s(\d*)"); + var matches = r.Matches(content); - if (matches.Count > 0 && matches[0].Groups.Count >= 1) + if (matches.Count > 0 && matches[0].Groups.Count >= 1) + { + if (int.TryParse(matches[0].Groups[1].Value, out var failed)) { - if (int.TryParse(matches[0].Groups[1].Value, out var failed)) + if (failed > 0) { - if (failed > 0) - { - isValid = false; - } + isValid = false; } } + } - Log.Debug(content); + Log.Debug(content); +#endif - if (IntegrationTestIsJUnit) - { - var junitReport = OutputDirectory / "junit-integration.tests.xml"; + CopyFileToDirectory(testResultFile, OutputDirectory, FileExistsPolicy.Overwrite); - var xslt = new XslTransform(); - xslt.Load(RootDirectory / "nunit3-junit.xslt"); - var doc = new XPathDocument(testResultFile); - using var writer = new XmlTextWriter(junitReport, Encoding.UTF8) - { - Formatting = Formatting.Indented - }; - xslt.Transform(doc, null, writer, null); - } + if (IntegrationTestIsJUnit) + { + var junitReport = OutputDirectory / "junit-integration.tests.xml"; - if (!isValid) + var xslt = new XslTransform(); + xslt.Load(RootDirectory / "nunit3-junit.xslt"); + var doc = new XPathDocument(testResultFile); + using var writer = new XmlTextWriter(junitReport, Encoding.UTF8) { - Assert.Fail("Test is failed."); - } + Formatting = Formatting.Indented + }; + xslt.Transform(doc, null, writer, null); + } + + if (!isValid) + { + Assert.Fail("Test is failed."); } } else diff --git a/src/Tests/IntegrationTests/AimpTestRunner.cs b/src/Tests/IntegrationTests/AimpTestRunner.cs index 02a2005f..60274d3a 100644 --- a/src/Tests/IntegrationTests/AimpTestRunner.cs +++ b/src/Tests/IntegrationTests/AimpTestRunner.cs @@ -80,8 +80,12 @@ public override void Initialize() var testResult = runner.Run(this, TestFilter.Empty); _resultWriter.WriteResultFile(testResult, _testResultFile); + +#if DEBUG +// here is a stackoverflow exception in release mode. Need to rewrite the report generator. var reporter = new ResultReporter(testResult, new ExtendedTextWrapper(_logWriter)); reporter.ReportResults(); +#endif } catch (Exception e) { diff --git a/src/Tests/IntegrationTests/AimpTestRunner.csproj b/src/Tests/IntegrationTests/AimpTestRunner.csproj index 4adc0254..a3ac6df6 100644 --- a/src/Tests/IntegrationTests/AimpTestRunner.csproj +++ b/src/Tests/IntegrationTests/AimpTestRunner.csproj @@ -124,8 +124,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/aimp_dotnet.sln b/src/aimp_dotnet.sln index d74c3ecf..2142d014 100644 --- a/src/aimp_dotnet.sln +++ b/src/aimp_dotnet.sln @@ -22,6 +22,7 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "SolutionItems", "SolutionIt ..\Nuget\AimpSDK.nuspec = ..\Nuget\AimpSDK.nuspec AssemblyInfo.cs = AssemblyInfo.cs ..\tools\CopyPlugin.ps1 = ..\tools\CopyPlugin.ps1 + Tests\IntegrationTests\Directory.Build.targets = Tests\IntegrationTests\Directory.Build.targets ..\GitVersion.yml = ..\GitVersion.yml EndProjectSection EndProject From 56e82dbfb10bf4f1e7c2c21f334c9d5e2e296cae Mon Sep 17 00:00:00 2001 From: Evgeniy Date: Wed, 20 Dec 2023 17:23:50 +0300 Subject: [PATCH 31/36] Unit tests --- .../UnitTests/MusicLibrary/AimpServiceMusicLibraryTests.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Tests/IntegrationTests/UnitTests/MusicLibrary/AimpServiceMusicLibraryTests.cs b/src/Tests/IntegrationTests/UnitTests/MusicLibrary/AimpServiceMusicLibraryTests.cs index ec676e5f..b8f2dc70 100644 --- a/src/Tests/IntegrationTests/UnitTests/MusicLibrary/AimpServiceMusicLibraryTests.cs +++ b/src/Tests/IntegrationTests/UnitTests/MusicLibrary/AimpServiceMusicLibraryTests.cs @@ -25,7 +25,7 @@ public void GetStorageById_LocalDataStorage_OK() var storageResult = Player.ServiceMusicLibrary.GetStorageById(); AssertOKResult(storageResult); AimpAssert.AreEqual("Local files", storageResult.Result.Caption); - AimpAssert.AreEqual(string.Empty, storageResult.Result.Id); + AimpAssert.AreEqual("TAIMPMLLocalDataStorage", storageResult.Result.Id); AimpAssert.Null(() => storageResult.Result.GroupingPreset); }); } From 03fbad71559d3bfefb179dd78b8aec53c62622b4 Mon Sep 17 00:00:00 2001 From: Evgeniy Date: Wed, 20 Dec 2023 22:29:11 +0300 Subject: [PATCH 32/36] Fix build --- build/Build.cs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/build/Build.cs b/build/Build.cs index b8cebccb..737b714b 100644 --- a/build/Build.cs +++ b/build/Build.cs @@ -275,7 +275,8 @@ private Configuration GetConfiguration() .ForEach(c => NuGetTasks.NuGetPush(s => s .SetTargetPath(c) .SetApiKey(NugetApiKey) - .SetSource(NugetSource))); + .SetSource(NugetSource) + .SetVerbosity(NuGetVerbosity.Detailed))); }); Target Artifacts => _ => _ @@ -361,7 +362,7 @@ bool validatePluginFolder(string plugin, IEnumerable files) var files = di.GetFiles("*.dll"); if (!validatePluginFolder(plugin, files)) { - Log.Error($"Plugin {plugin} not valid."); + Log.Error($"Plugin '{plugin}' not valid. '{di}'"); isValid = false; } } From 699bf1630900e85b734126a79d39ce5c14d243a4 Mon Sep 17 00:00:00 2001 From: Evgeniy Date: Wed, 20 Dec 2023 22:43:16 +0300 Subject: [PATCH 33/36] Fix build --- build/Build.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/Build.cs b/build/Build.cs index 737b714b..519731dd 100644 --- a/build/Build.cs +++ b/build/Build.cs @@ -298,7 +298,7 @@ private Configuration GetConfiguration() Log.Information("Copy plugins to artifacts folder"); - var directories = SourceDirectory.GlobDirectories("Plugins", $"**/bin/{targetPlatform}/{GetConfiguration()}"); + var directories = SourceDirectory.GlobDirectories($"Plugins/**/bin/{targetPlatform}/{GetConfiguration()}"); foreach (var directory in directories) { var pluginDirectory = new DirectoryInfo(directory); From 6e9dad010a54c59eabbf691e7f09d3e5a061092f Mon Sep 17 00:00:00 2001 From: Evgeniy Date: Thu, 21 Dec 2023 00:01:36 +0300 Subject: [PATCH 34/36] Update build --- LICENSE.md | 202 --------------------------------------- build/Build.cs | 4 +- nuget/AimpSDK-x64.nuspec | 4 +- nuget/AimpSDK.nuspec | 6 +- 4 files changed, 7 insertions(+), 209 deletions(-) delete mode 100644 LICENSE.md diff --git a/LICENSE.md b/LICENSE.md deleted file mode 100644 index e06d2081..00000000 --- a/LICENSE.md +++ /dev/null @@ -1,202 +0,0 @@ -Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "{}" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright {yyyy} {name of copyright owner} - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - diff --git a/build/Build.cs b/build/Build.cs index 519731dd..38d5fd5c 100644 --- a/build/Build.cs +++ b/build/Build.cs @@ -326,7 +326,7 @@ private Configuration GetConfiguration() outFile = artifactsFolder / "Plugins" / pluginName / $"{pluginName}.dll"; } - Log.Information($"Copy '{file.FullName}' to '{outFile}'"); + Log.Information("Copy '{targetFile}' to '{outFile}'", file.FullName, outFile); file.CopyTo(outFile, true); } } @@ -371,7 +371,7 @@ bool validatePluginFolder(string plugin, IEnumerable files) var outputSkdFile = $"aimp.sdk-{targetPlatform}.zip"; - Log.Information($"Compress artifacts to '{outputSkdFile}'"); + Log.Information("Compress artifacts to '{outputSkdFile}'", outputSkdFile); if (File.Exists(OutputDirectory / outputSkdFile)) { diff --git a/nuget/AimpSDK-x64.nuspec b/nuget/AimpSDK-x64.nuspec index be6e81e2..54771c1c 100644 --- a/nuget/AimpSDK-x64.nuspec +++ b/nuget/AimpSDK-x64.nuspec @@ -10,10 +10,10 @@ https://github.com/martin211/aimp_dotnet Aimp DotNet allows you to create a plugin for AIMP media player on .Net. Use this package to develop x64 plugins. AIMP SDK DotNet - LICENSE.md + MIT + - diff --git a/nuget/AimpSDK.nuspec b/nuget/AimpSDK.nuspec index fd7e3e69..eb92ddaf 100644 --- a/nuget/AimpSDK.nuspec +++ b/nuget/AimpSDK.nuspec @@ -10,16 +10,16 @@ https://github.com/martin211/aimp_dotnet Aimp DotNet allows you to create a plugin for AIMP media player on .Net. To develop plugins for AIMP x64 use AimpSDK-x64 package instead. AIMP SDK DotNet - LICENSE.md + MIT + - - + \ No newline at end of file From f2824a46da48c0827d063280352730352c42a352 Mon Sep 17 00:00:00 2001 From: Evgeniy Date: Thu, 21 Dec 2023 00:10:58 +0300 Subject: [PATCH 35/36] Update build --- nuget/AimpSDK.sources.nuspec | 4 ++-- nuget/AimpSDK.symbols.nuspec | 4 ++-- src/aimp_dotnet.sln | 2 ++ 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/nuget/AimpSDK.sources.nuspec b/nuget/AimpSDK.sources.nuspec index 8e703884..8dd17f6a 100644 --- a/nuget/AimpSDK.sources.nuspec +++ b/nuget/AimpSDK.sources.nuspec @@ -10,7 +10,8 @@ https://github.com/martin211/aimp_dotnet Aimp DotNet allows you to create a plugin for AIMP media player on .Net. To develop plugins for AIMP x64 use AimpSDK-x64 package instead. AIMP SDK DotNet - LICENSE.md + MIT + @@ -20,6 +21,5 @@ - \ No newline at end of file diff --git a/nuget/AimpSDK.symbols.nuspec b/nuget/AimpSDK.symbols.nuspec index ee53516f..97c0dc38 100644 --- a/nuget/AimpSDK.symbols.nuspec +++ b/nuget/AimpSDK.symbols.nuspec @@ -10,10 +10,10 @@ https://github.com/martin211/aimp_dotnet Aimp DotNet allows you to create a plugin for AIMP media player on .Net. To develop plugins for AIMP x64 use AimpSDK-x64 package instead. AIMP SDK DotNet - LICENSE.md + MIT + - diff --git a/src/aimp_dotnet.sln b/src/aimp_dotnet.sln index 2142d014..73e27bd7 100644 --- a/src/aimp_dotnet.sln +++ b/src/aimp_dotnet.sln @@ -20,6 +20,8 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "SolutionItems", "SolutionIt ..\.gitlab-ci.yml = ..\.gitlab-ci.yml ..\Nuget\AimpSDK-x64.nuspec = ..\Nuget\AimpSDK-x64.nuspec ..\Nuget\AimpSDK.nuspec = ..\Nuget\AimpSDK.nuspec + ..\nuget\AimpSDK.sources.nuspec = ..\nuget\AimpSDK.sources.nuspec + ..\nuget\AimpSDK.symbols.nuspec = ..\nuget\AimpSDK.symbols.nuspec AssemblyInfo.cs = AssemblyInfo.cs ..\tools\CopyPlugin.ps1 = ..\tools\CopyPlugin.ps1 Tests\IntegrationTests\Directory.Build.targets = Tests\IntegrationTests\Directory.Build.targets From c2071f05546c45c114b46fcf2382635c99208920 Mon Sep 17 00:00:00 2001 From: Evgeniy Date: Sat, 10 Feb 2024 23:46:27 +0300 Subject: [PATCH 36/36] Release 5.03.2394.5 --- .nuke/build.schema.json | 4 +- GitVersion.yml | 4 +- build/Build.cs | 25 +++- build_publish.cmd | 7 + .../Extension/ExtensionPlaybackQueue.cs | 50 +++++++ src/Plugins/dotnet_demo/PlayerForm.cs | 2 +- src/Plugins/dotnet_demo/Plugin.cs | 17 ++- src/Plugins/dotnet_demo/dotnet_demo.csproj | 2 + src/SDK/AIMP.SDK/AIMP.SDK.csproj | 2 + .../Extensions/IAimpExtensionFileExpander.cs | 2 +- .../FileManager/Objects/IAimpVirtualFile.cs | 4 +- .../SDK/MessageDispatcher/AimpMessages.cs | 3 + .../IAimpServiceMessageDispatcher.cs | 15 ++ .../Extensions/IAimpExtensionPlaybackQueue.cs | 21 --- .../IAimpExtensionPlaybackQueue2.cs | 7 - .../Player/Extensions/PlaybackQueueFlags.cs | 22 +++ .../Player/Extensions/PlaybackQueueInfo.cs | 8 + .../Player/Objects/IAimpPlaybackQueueItem.cs | 2 + .../AIMPSDK/AIMP400/apiFileManager.h | 2 +- src/SDK/aimp_dotnet/Aimp_DotNetPlugin.vcxproj | 2 + .../Aimp_DotNetPlugin.vcxproj.filters | 2 + src/SDK/aimp_dotnet/SDK/AimpCore.h | 14 ++ .../SDK/FileManager/AimpFileInfo.h | 8 + .../SDK/FileManager/AimpVirtualFile.cpp | 44 ++++-- .../SDK/FileManager/AimpVirtualFile.h | 13 +- .../InternalAimpExtensionFileExpander.cpp | 13 +- .../InternalAimpExtensionFileExpander.h | 5 +- .../InternalAimpExtensionFileFormat.h | 3 +- .../FileManager/InternalAimpVirtualFile.cpp | 138 ++++++++++++++++++ .../SDK/FileManager/InternalAimpVirtualFile.h | 32 ++++ src/SDK/aimp_dotnet/SDK/ManagedAimpCore.cpp | 51 +++---- .../AimpServiceMessageDispatcher.cpp | 38 ++++- .../AimpServiceMessageDispatcher.h | 2 + .../aimp_dotnet/SDK/PlayList/AimpPlayList.cpp | 10 +- .../SDK/Playback/AimpPlaybackQueueItem.cpp | 38 ++++- .../SDK/Playback/AimpPlaybackQueueItem.h | 5 + .../Extensions/AimpExtensionPlaybackQueue.cpp | 30 ++-- .../Extensions/AimpExtensionPlaybackQueue.h | 5 +- .../AimpExtensionPlaybackQueue2.cpp | 6 +- .../Extensions/AimpExtensionPlaybackQueue2.h | 20 +-- .../InternalAimpExtensionWaveFormProvider.cpp | 2 +- .../aimp_dotnet/SDK/PropertyListHelper.cpp | 10 +- .../TestFramework/AimpIntegrationTest.cs | 11 +- .../AimpExtensionFileExpanderUnitTests.cs | 4 +- .../AimpExtensionPlaybackQueue2Tests.cs | 13 +- 45 files changed, 567 insertions(+), 151 deletions(-) create mode 100644 build_publish.cmd create mode 100644 src/Plugins/dotnet_demo/Extension/ExtensionPlaybackQueue.cs create mode 100644 src/SDK/AIMP.SDK/SDK/Player/Extensions/PlaybackQueueFlags.cs create mode 100644 src/SDK/AIMP.SDK/SDK/Player/Extensions/PlaybackQueueInfo.cs create mode 100644 src/SDK/aimp_dotnet/SDK/FileManager/InternalAimpVirtualFile.cpp create mode 100644 src/SDK/aimp_dotnet/SDK/FileManager/InternalAimpVirtualFile.h diff --git a/.nuke/build.schema.json b/.nuke/build.schema.json index 010232d4..93913ec8 100644 --- a/.nuke/build.schema.json +++ b/.nuke/build.schema.json @@ -1,7 +1,7 @@ { "$schema": "http://json-schema.org/draft-04/schema#", - "title": "Build Schema", "$ref": "#/definitions/build", + "title": "Build Schema", "definitions": { "build": { "type": "object", @@ -207,4 +207,4 @@ } } } -} \ No newline at end of file +} diff --git a/GitVersion.yml b/GitVersion.yml index 1e0a1595..d5b51bb5 100644 --- a/GitVersion.yml +++ b/GitVersion.yml @@ -5,7 +5,7 @@ branches: develop: regex: ^develop mode: ContinuousDeployment - tag: 'preview' + tag: 'alpha' increment: None prevent-increment-of-merged-branch-version: true track-merge-target: false @@ -28,4 +28,4 @@ branches: prevent-increment-of-merged-branch-version: true track-merge-target: false tracks-release-branches: false - is-release-branch: false + is-release-branch: true diff --git a/build/Build.cs b/build/Build.cs index 38d5fd5c..07072379 100644 --- a/build/Build.cs +++ b/build/Build.cs @@ -147,10 +147,16 @@ string BuildNumber .Executes(() => { NuGetTasks.NuGetRestore(c => c.SetTargetPath(Solution)); - MSBuild(s => s - .SetProcessToolPath(MsBuildPath) + + var settings = new MSBuildSettings(); + if (!string.IsNullOrWhiteSpace(MsBuildPath)) + settings = settings.SetProcessToolPath(MsBuildPath); + + settings = settings .SetTargetPath(Solution) - .SetTargets("Restore")); + .SetTargets("Restore"); + + MSBuild(settings); }); Target Version => _ => _ @@ -160,6 +166,7 @@ string BuildNumber GetVersion(); Log.Information("Version: {_version}", _version); + Log.Information("Build number: {ver}", _buildNumber); var assemblyInfo = SourceDirectory / "AssemblyInfo.cs"; if (File.Exists(assemblyInfo)) { @@ -184,8 +191,12 @@ string BuildNumber .Triggers(UpdateBuildNumber) .Executes(() => { - MSBuild(s => s - .SetProcessToolPath(MsBuildPath) + var settings = new MSBuildSettings(); + + if (!string.IsNullOrWhiteSpace(MsBuildPath)) + settings = settings.SetProcessToolPath(MsBuildPath); + + settings = settings .SetTargetPath(Solution) .SetTargets("Rebuild") .SetConfiguration(GetConfiguration()) @@ -194,7 +205,9 @@ string BuildNumber .SetInformationalVersion($"{_version}-{GitRepository.Commit}") .SetMaxCpuCount(Environment.ProcessorCount) .SetNodeReuse(IsLocalBuild) - .SetTargetPlatform(TargetPlatform)); + .SetTargetPlatform(TargetPlatform); + + MSBuild(settings); }); private Configuration GetConfiguration() diff --git a/build_publish.cmd b/build_publish.cmd new file mode 100644 index 00000000..d9a18dac --- /dev/null +++ b/build_publish.cmd @@ -0,0 +1,7 @@ +:; set -eo pipefail +:; SCRIPT_DIR=$(cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd) +:; ${SCRIPT_DIR}/build.sh "$@" +:; exit $? + +@ECHO OFF +powershell -ExecutionPolicy ByPass -NoProfile -File "%~dp0build.ps1" %* Compile --MsBuildPath '' diff --git a/src/Plugins/dotnet_demo/Extension/ExtensionPlaybackQueue.cs b/src/Plugins/dotnet_demo/Extension/ExtensionPlaybackQueue.cs new file mode 100644 index 00000000..74ddb67c --- /dev/null +++ b/src/Plugins/dotnet_demo/Extension/ExtensionPlaybackQueue.cs @@ -0,0 +1,50 @@ +using AIMP.SDK; +using AIMP.SDK.Player.Extensions; +using AIMP.SDK.Player.Objects; +using AIMP.SDK.Playlist.Objects; + +namespace DemoPlugin.Extension +{ + public class ExtensionPlaybackQueue : IAimpExtensionPlaybackQueue + { + private readonly IAimpPlayer _player; + + public ExtensionPlaybackQueue(IAimpPlayer player) + { + _player = player; + } + + public AimpActionResult GetNext(object current, PlaybackQueueFlags flags, IAimpPlaybackQueueItem queueItem) + { + if (queueItem.PlaylistItem != null) + { + System.Diagnostics.Debugger.Break(); + } + + return new AimpActionResult(ActionResultType.OK); + } + + public AimpActionResult GetPrev(object current, PlaybackQueueFlags flags, IAimpPlaybackQueueItem queueItem) + { + if (queueItem.PlaylistItem != null) + { + System.Diagnostics.Debugger.Break(); + } + + return new AimpActionResult(ActionResultType.OK); + } + + public void OnSelect(IAimpPlaylistItem item, IAimpPlaybackQueueItem queueItem) + { + if (queueItem.PlaylistItem != null) + { + System.Diagnostics.Debugger.Break(); + } + } + + public AimpActionResult GetInfo(IAimpPlaylistItem item) + { + return new AimpActionResult(ActionResultType.OK); + } + } +} \ No newline at end of file diff --git a/src/Plugins/dotnet_demo/PlayerForm.cs b/src/Plugins/dotnet_demo/PlayerForm.cs index e004d6e6..23ef2c5f 100644 --- a/src/Plugins/dotnet_demo/PlayerForm.cs +++ b/src/Plugins/dotnet_demo/PlayerForm.cs @@ -40,7 +40,7 @@ public PlayerForm(IAimpPlayer player, MessageHook coreMessage) coreMessage.OnCoreMessage += (message, param1, param2) => { - System.Diagnostics.Debug.WriteLine($"message: {message}, param1: {(AimpCoreMessageType)param1}, param2: {param2}"); + //System.Diagnostics.Debug.WriteLine($"message: {message}, param1: {(AimpCoreMessageType)param1}, param2: {param2}"); if (message == AimpCoreMessageType.EventPlayingFileInfo) { diff --git a/src/Plugins/dotnet_demo/Plugin.cs b/src/Plugins/dotnet_demo/Plugin.cs index 5019dc49..21246ea9 100644 --- a/src/Plugins/dotnet_demo/Plugin.cs +++ b/src/Plugins/dotnet_demo/Plugin.cs @@ -22,6 +22,7 @@ namespace TestPlugin using AIMP.SDK; using AIMP.SDK.MenuManager; using AIMP.SDK.Options; + using DemoPlugin.Extension; public delegate ActionResultType HookMessage(AimpCoreMessageType message, int param1, IntPtr param2); @@ -70,7 +71,11 @@ public override void Initialize() TestWriteConfig(); var listner = new ExtensionPlaylistManagerListener(); - Player.Core.RegisterExtension(listner); + var ext = new ExtensionPlaybackQueue(Player); + + RegisterExtension(listner); + RegisterExtension(ext); + var result = Player.Core.CreateObject(); @@ -189,5 +194,15 @@ private void TestReadConfig() var strData = System.Text.Encoding.Default.GetString(buf); } } + + private void RegisterExtension(IAimpExtension extension) + { + var res = Player.Core.RegisterExtension(extension); + + if (res.ResultType != ActionResultType.OK) + { + System.Diagnostics.Debugger.Break(); + } + } } } diff --git a/src/Plugins/dotnet_demo/dotnet_demo.csproj b/src/Plugins/dotnet_demo/dotnet_demo.csproj index 83fbd74c..21898f50 100644 --- a/src/Plugins/dotnet_demo/dotnet_demo.csproj +++ b/src/Plugins/dotnet_demo/dotnet_demo.csproj @@ -96,6 +96,7 @@ Properties\AssemblyInfo.cs + Form @@ -193,6 +194,7 @@ aimp_dotnet + diff --git a/src/SDK/AIMP.SDK/AIMP.SDK.csproj b/src/SDK/AIMP.SDK/AIMP.SDK.csproj index edd7f793..04e0dc73 100644 --- a/src/SDK/AIMP.SDK/AIMP.SDK.csproj +++ b/src/SDK/AIMP.SDK/AIMP.SDK.csproj @@ -219,6 +219,8 @@ + + diff --git a/src/SDK/AIMP.SDK/SDK/FileManager/Extensions/IAimpExtensionFileExpander.cs b/src/SDK/AIMP.SDK/SDK/FileManager/Extensions/IAimpExtensionFileExpander.cs index 6010f665..3d7b4e91 100644 --- a/src/SDK/AIMP.SDK/SDK/FileManager/Extensions/IAimpExtensionFileExpander.cs +++ b/src/SDK/AIMP.SDK/SDK/FileManager/Extensions/IAimpExtensionFileExpander.cs @@ -29,6 +29,6 @@ public interface IAimpExtensionFileExpander : IAimpExtension /// The real file name /// Progress callback . /// AimpActionResult<IList<IAimpVirtualFile>>. - AimpActionResult> Expand(string fileName, IAimpProgressCallback progressCallback); + AimpActionResult> Expand(string fileName, IAimpProgressCallback progressCallback); } } diff --git a/src/SDK/AIMP.SDK/SDK/FileManager/Objects/IAimpVirtualFile.cs b/src/SDK/AIMP.SDK/SDK/FileManager/Objects/IAimpVirtualFile.cs index 988e2169..2586c26f 100644 --- a/src/SDK/AIMP.SDK/SDK/FileManager/Objects/IAimpVirtualFile.cs +++ b/src/SDK/AIMP.SDK/SDK/FileManager/Objects/IAimpVirtualFile.cs @@ -14,7 +14,7 @@ namespace AIMP.SDK.FileManager.Objects /// /// Interface provides information about virtual file. /// - public interface IAimpVirtualFile + public interface IAimpVirtualFile : IAimpObject { /// /// Gets or sets the index of virtual track in the set (if presented). @@ -65,7 +65,7 @@ public interface IAimpVirtualFile /// Gets the file info. /// /// AimpActionResult<IAimpFileInfo>. - AimpActionResult GetFileInfo(); + AimpActionResult GetFileInfo(IAimpFileInfo fileInfo); /// /// Check is the source exists. diff --git a/src/SDK/AIMP.SDK/SDK/MessageDispatcher/AimpMessages.cs b/src/SDK/AIMP.SDK/SDK/MessageDispatcher/AimpMessages.cs index 37661779..a49b6f0a 100644 --- a/src/SDK/AIMP.SDK/SDK/MessageDispatcher/AimpMessages.cs +++ b/src/SDK/AIMP.SDK/SDK/MessageDispatcher/AimpMessages.cs @@ -10,6 +10,8 @@ // ReSharper disable InconsistentNaming // ReSharper disable UnusedMember.Global +using System; + namespace AIMP.SDK.MessageDispatcher { /// @@ -929,6 +931,7 @@ public enum AimpCoreMessageType #endregion } + [Flags] public enum AimpMessage { EndOfQueue = 1, diff --git a/src/SDK/AIMP.SDK/SDK/MessageDispatcher/IAimpServiceMessageDispatcher.cs b/src/SDK/AIMP.SDK/SDK/MessageDispatcher/IAimpServiceMessageDispatcher.cs index 64cd8fea..67fd50be 100644 --- a/src/SDK/AIMP.SDK/SDK/MessageDispatcher/IAimpServiceMessageDispatcher.cs +++ b/src/SDK/AIMP.SDK/SDK/MessageDispatcher/IAimpServiceMessageDispatcher.cs @@ -43,6 +43,21 @@ public interface IAimpServiceMessageDispatcher : IAimpService /// AimpActionResult. AimpActionResult Send(AimpCoreMessageType message, int param1, ref IntPtr param2); + /// + /// Sends the specified message. + /// + /// The message . + /// AimpActionResult. + AimpActionResult Send(AimpCoreMessageType message); + + /// + /// Sends the specified message. + /// + /// The message . + /// The message direction . + /// AimpActionResult. + AimpActionResult Send(AimpCoreMessageType message, int param1); + /// /// Registers the specified message. /// diff --git a/src/SDK/AIMP.SDK/SDK/Player/Extensions/IAimpExtensionPlaybackQueue.cs b/src/SDK/AIMP.SDK/SDK/Player/Extensions/IAimpExtensionPlaybackQueue.cs index ac339e01..47698097 100644 --- a/src/SDK/AIMP.SDK/SDK/Player/Extensions/IAimpExtensionPlaybackQueue.cs +++ b/src/SDK/AIMP.SDK/SDK/Player/Extensions/IAimpExtensionPlaybackQueue.cs @@ -12,27 +12,6 @@ namespace AIMP.SDK.Player.Extensions { - /// - /// Enum PlaybackQueueFlags - /// - public enum PlaybackQueueFlags - { - /// - /// The start from beginning - /// - StartFromBeginning = 1, - - /// - /// The start from cursor - /// - StartFromCursor = 2, - - /// - /// The start from item - /// - StartFromItem = 3 - } - /// /// Interface IAimpExtensionPlaybackQueue /// Implements the diff --git a/src/SDK/AIMP.SDK/SDK/Player/Extensions/IAimpExtensionPlaybackQueue2.cs b/src/SDK/AIMP.SDK/SDK/Player/Extensions/IAimpExtensionPlaybackQueue2.cs index 8c71878a..38890c53 100644 --- a/src/SDK/AIMP.SDK/SDK/Player/Extensions/IAimpExtensionPlaybackQueue2.cs +++ b/src/SDK/AIMP.SDK/SDK/Player/Extensions/IAimpExtensionPlaybackQueue2.cs @@ -11,13 +11,6 @@ namespace AIMP.SDK.Player.Extensions; -public class PlaybackQueueInfo -{ - public int Position { get; } - - public int Size { get; } -} - /// /// Extends an abilities of the . /// diff --git a/src/SDK/AIMP.SDK/SDK/Player/Extensions/PlaybackQueueFlags.cs b/src/SDK/AIMP.SDK/SDK/Player/Extensions/PlaybackQueueFlags.cs new file mode 100644 index 00000000..374c4775 --- /dev/null +++ b/src/SDK/AIMP.SDK/SDK/Player/Extensions/PlaybackQueueFlags.cs @@ -0,0 +1,22 @@ +namespace AIMP.SDK.Player.Extensions; + +/// +/// Enum PlaybackQueueFlags +/// +public enum PlaybackQueueFlags +{ + /// + /// The start from beginning + /// + StartFromBeginning = 1, + + /// + /// The start from cursor + /// + StartFromCursor = 2, + + /// + /// The start from item + /// + StartFromItem = 3 +} \ No newline at end of file diff --git a/src/SDK/AIMP.SDK/SDK/Player/Extensions/PlaybackQueueInfo.cs b/src/SDK/AIMP.SDK/SDK/Player/Extensions/PlaybackQueueInfo.cs new file mode 100644 index 00000000..9d5c1f1a --- /dev/null +++ b/src/SDK/AIMP.SDK/SDK/Player/Extensions/PlaybackQueueInfo.cs @@ -0,0 +1,8 @@ +namespace AIMP.SDK.Player.Extensions; + +public class PlaybackQueueInfo +{ + public int Position { get; } + + public int Size { get; } +} \ No newline at end of file diff --git a/src/SDK/AIMP.SDK/SDK/Player/Objects/IAimpPlaybackQueueItem.cs b/src/SDK/AIMP.SDK/SDK/Player/Objects/IAimpPlaybackQueueItem.cs index 49fc79e3..906da75e 100644 --- a/src/SDK/AIMP.SDK/SDK/Player/Objects/IAimpPlaybackQueueItem.cs +++ b/src/SDK/AIMP.SDK/SDK/Player/Objects/IAimpPlaybackQueueItem.cs @@ -27,5 +27,7 @@ public interface IAimpPlaybackQueueItem /// /// The playlist item. IAimpPlaylistItem PlaylistItem { get; set; } + + double Offset { get; set; } } } diff --git a/src/SDK/aimp_dotnet/AIMPSDK/AIMP400/apiFileManager.h b/src/SDK/aimp_dotnet/AIMPSDK/AIMP400/apiFileManager.h index 79382567..b36a1836 100644 --- a/src/SDK/aimp_dotnet/AIMPSDK/AIMP400/apiFileManager.h +++ b/src/SDK/aimp_dotnet/AIMPSDK/AIMP400/apiFileManager.h @@ -139,7 +139,7 @@ class IAIMPVirtualFile: public IAIMPPropertyList public: virtual HRESULT WINAPI CreateStream(IAIMPStream **Stream) = 0; virtual HRESULT WINAPI GetFileInfo(IAIMPFileInfo *Info) = 0; - virtual HRESULT WINAPI IsExists() = 0; + virtual boolean WINAPI IsExists() = 0; virtual HRESULT WINAPI IsInSameStream(IAIMPVirtualFile *VirtualFile) = 0; virtual HRESULT WINAPI Synchronize() = 0; }; diff --git a/src/SDK/aimp_dotnet/Aimp_DotNetPlugin.vcxproj b/src/SDK/aimp_dotnet/Aimp_DotNetPlugin.vcxproj index 8e0a013b..ff633372 100644 --- a/src/SDK/aimp_dotnet/Aimp_DotNetPlugin.vcxproj +++ b/src/SDK/aimp_dotnet/Aimp_DotNetPlugin.vcxproj @@ -59,6 +59,7 @@ + @@ -198,6 +199,7 @@ + diff --git a/src/SDK/aimp_dotnet/Aimp_DotNetPlugin.vcxproj.filters b/src/SDK/aimp_dotnet/Aimp_DotNetPlugin.vcxproj.filters index 23ec897d..64a316ac 100644 --- a/src/SDK/aimp_dotnet/Aimp_DotNetPlugin.vcxproj.filters +++ b/src/SDK/aimp_dotnet/Aimp_DotNetPlugin.vcxproj.filters @@ -151,6 +151,7 @@ + @@ -346,6 +347,7 @@ + diff --git a/src/SDK/aimp_dotnet/SDK/AimpCore.h b/src/SDK/aimp_dotnet/SDK/AimpCore.h index e1c0c68e..aa98350c 100644 --- a/src/SDK/aimp_dotnet/SDK/AimpCore.h +++ b/src/SDK/aimp_dotnet/SDK/AimpCore.h @@ -9,8 +9,10 @@ #pragma once #include "AimpErrorInfo.h" +#include "AimpObjectList.h" #include "Action/AimpAction.h" #include "AlbumArt/AimpAlbumArtRequest.h" +#include "FileManager/AimpVirtualFile.h" #include "Lyrics/AimpLyrics.h" #include "Menu/AimpMenuItem.h" #include "Objects/AimpImage.h" @@ -88,6 +90,18 @@ namespace AIMP { const auto core = _aimpCore->GetAimpCore(); + if (t == IAimpObjectList::typeid) { + IAIMPObjectList* obj = nullptr; + IAimpObjectList^ managed = nullptr; + + const auto result = Utils::CheckResult(core->CreateObject(IID_IAIMPObjectList, reinterpret_cast(&obj))); + if (result == ActionResultType::OK) { + managed = gcnew AimpObjectList2(obj); + } + + return gcnew AimpActionResult(result, managed); + } + if (t == IAimpStream::typeid) { IAIMPStream* obj = nullptr; IAimpStream^ managed = nullptr; diff --git a/src/SDK/aimp_dotnet/SDK/FileManager/AimpFileInfo.h b/src/SDK/aimp_dotnet/SDK/FileManager/AimpFileInfo.h index c2acb2b0..8760a15b 100644 --- a/src/SDK/aimp_dotnet/SDK/FileManager/AimpFileInfo.h +++ b/src/SDK/aimp_dotnet/SDK/FileManager/AimpFileInfo.h @@ -296,6 +296,14 @@ namespace AIMP { { double get(); } + + protected: + void RegisterAtMemoryManager() override { + + } + void ReleaseFromMemoryManager() override { + + } }; } } diff --git a/src/SDK/aimp_dotnet/SDK/FileManager/AimpVirtualFile.cpp b/src/SDK/aimp_dotnet/SDK/FileManager/AimpVirtualFile.cpp index 3965beab..5304b7c6 100644 --- a/src/SDK/aimp_dotnet/SDK/FileManager/AimpVirtualFile.cpp +++ b/src/SDK/aimp_dotnet/SDK/FileManager/AimpVirtualFile.cpp @@ -16,6 +16,10 @@ using namespace AIMP::SDK; AimpVirtualFile::AimpVirtualFile(IAIMPVirtualFile* aimpObject) : AimpObject(aimpObject) { } +AimpVirtualFile::AimpVirtualFile() { + +} + int AimpVirtualFile::IndexInSet::get() { return PropertyListExtension::GetInt32(InternalAimpObject, AIMP_VIRTUALFILE_PROPID_INDEXINSET); } @@ -25,19 +29,31 @@ void AimpVirtualFile::IndexInSet::set(int value) { } double AimpVirtualFile::ClipStart::get() { + if (_isEndless) + return E_NOTIMPL; + return PropertyListExtension::GetFloat(InternalAimpObject, AIMP_VIRTUALFILE_PROPID_CLIPSTART); } void AimpVirtualFile::ClipStart::set(double value) { - PropertyListExtension::SetFloat(InternalAimpObject, AIMP_VIRTUALFILE_PROPID_CLIPSTART, value); + if (value > 0) { + PropertyListExtension::SetFloat(InternalAimpObject, AIMP_VIRTUALFILE_PROPID_CLIPSTART, value); + _isEndless = false; + } } double AimpVirtualFile::ClipFinish::get() { + if (_isEndless) + return E_NOTIMPL; + return PropertyListExtension::GetFloat(InternalAimpObject, AIMP_VIRTUALFILE_PROPID_CLIPFINISH); } void AimpVirtualFile::ClipFinish::set(double value) { - PropertyListExtension::SetFloat(InternalAimpObject, AIMP_VIRTUALFILE_PROPID_CLIPFINISH, value); + if (value > 0) { + PropertyListExtension::SetFloat(InternalAimpObject, AIMP_VIRTUALFILE_PROPID_CLIPFINISH, value); + _isEndless = false; + } } String^ AimpVirtualFile::AudioSourceFile::get() { @@ -76,18 +92,6 @@ StreamResult AimpVirtualFile::CreateStream() { return gcnew AimpActionResult(result, stream); } -FileInfoResult AimpVirtualFile::GetFileInfo() { - IAIMPFileInfo* fi = nullptr; - IAimpFileInfo^ fileInfo = nullptr; - const auto result = CheckResult(InternalAimpObject->GetFileInfo(fi)); - - if (result == ActionResultType::OK && fi != nullptr) { - fileInfo = gcnew AimpFileInfo(fi); - } - - return gcnew AimpActionResult(result, fileInfo); -} - bool AimpVirtualFile::IsExists() { return InternalAimpObject->IsExists(); } @@ -101,3 +105,15 @@ ActionResult AimpVirtualFile::IsInSameStream(IAimpVirtualFile^ virtualFile) { ActionResult AimpVirtualFile::Synchronize() { return ACTION_RESULT(CheckResult(InternalAimpObject->Synchronize())); } + +AimpActionResult^ AimpVirtualFile::GetFileInfo(IAimpFileInfo^ fileInfo) { + IAIMPFileInfo* fi = nullptr; + IAimpFileInfo^ mfi = nullptr; + const auto result = CheckResult(InternalAimpObject->GetFileInfo(fi)); + + if (result == ActionResultType::OK && fi != nullptr) { + mfi = gcnew AimpFileInfo(fi); + } + + return gcnew AimpActionResult(result, mfi); +} diff --git a/src/SDK/aimp_dotnet/SDK/FileManager/AimpVirtualFile.h b/src/SDK/aimp_dotnet/SDK/FileManager/AimpVirtualFile.h index 7285f664..8ecc483d 100644 --- a/src/SDK/aimp_dotnet/SDK/FileManager/AimpVirtualFile.h +++ b/src/SDK/aimp_dotnet/SDK/FileManager/AimpVirtualFile.h @@ -17,9 +17,14 @@ namespace AIMP { using namespace FileManager; public ref class AimpVirtualFile : public AimpObject, public IAimpVirtualFile { - public: + private: + bool _isEndless = true; + + public: AimpVirtualFile(IAIMPVirtualFile* aimpObject); + AimpVirtualFile(); + virtual property int IndexInSet { int get(); @@ -57,14 +62,10 @@ namespace AIMP { } virtual StreamResult CreateStream(); - - virtual FileInfoResult GetFileInfo(); - virtual bool IsExists(); - virtual ActionResult IsInSameStream(IAimpVirtualFile^ virtualFile); - virtual ActionResult Synchronize(); + virtual AimpActionResult^ GetFileInfo(IAimpFileInfo^ fileInfo); }; } } diff --git a/src/SDK/aimp_dotnet/SDK/FileManager/Extensions/InternalAimpExtensionFileExpander.cpp b/src/SDK/aimp_dotnet/SDK/FileManager/Extensions/InternalAimpExtensionFileExpander.cpp index 77a89ff2..62737793 100644 --- a/src/SDK/aimp_dotnet/SDK/FileManager/Extensions/InternalAimpExtensionFileExpander.cpp +++ b/src/SDK/aimp_dotnet/SDK/FileManager/Extensions/InternalAimpExtensionFileExpander.cpp @@ -12,9 +12,11 @@ #include "SDK/AimpObjectList.h" #include "SDK/AimpProgressCallback.h" +#include "SDK/FileManager/InternalAimpVirtualFile.h" -InternalAimpExtensionFileExpander::InternalAimpExtensionFileExpander(gcroot managedInstance) { +InternalAimpExtensionFileExpander::InternalAimpExtensionFileExpander(gcroot managedInstance, IAIMPCore* core) { _managedInstance = managedInstance; + _core = core; } HRESULT InternalAimpExtensionFileExpander::Expand(IAIMPString* fileName, IAIMPObjectList** list, IAIMPProgressCallback* progressCallback) { @@ -22,7 +24,14 @@ HRESULT InternalAimpExtensionFileExpander::Expand(IAIMPString* fileName, IAIMPOb AimpProgressCallback^ callBack = gcnew AimpProgressCallback(progressCallback); const auto result = _managedInstance->Expand(fn, callBack); if (result->ResultType == ActionResultType::OK) { - *list = safe_cast^>(result->Result)->AimpObject; + IAIMPObjectList* objectList = nullptr; + _core->CreateObject(IID_IAIMPObjectList, reinterpret_cast(&objectList)); + for (int i = 0; i < result->Result->Count - 1; ++i) { + const auto virtualFile = new InternalAimpVirtualFile(result->Result[i]); + objectList->Add(reinterpret_cast(virtualFile)); + } + + *list = objectList; } return static_cast(result->ResultType); diff --git a/src/SDK/aimp_dotnet/SDK/FileManager/Extensions/InternalAimpExtensionFileExpander.h b/src/SDK/aimp_dotnet/SDK/FileManager/Extensions/InternalAimpExtensionFileExpander.h index c321a067..eea0a41d 100644 --- a/src/SDK/aimp_dotnet/SDK/FileManager/Extensions/InternalAimpExtensionFileExpander.h +++ b/src/SDK/aimp_dotnet/SDK/FileManager/Extensions/InternalAimpExtensionFileExpander.h @@ -9,14 +9,15 @@ #pragma once -class InternalAimpExtensionFileExpander : public IUnknownInterfaceImpl, IAIMPExtensionFileExpander { +class InternalAimpExtensionFileExpander : public IUnknownInterfaceImpl { private: gcroot _managedInstance; + IAIMPCore* _core; public: typedef IUnknownInterfaceImpl Base; - InternalAimpExtensionFileExpander(gcroot managedInstance); + InternalAimpExtensionFileExpander(gcroot managedInstance, IAIMPCore* core); virtual HRESULT WINAPI Expand(IAIMPString* fileName, IAIMPObjectList** list, IAIMPProgressCallback* progressCallback); virtual HRESULT WINAPI QueryInterface(REFIID riid, LPVOID* ppvObject); diff --git a/src/SDK/aimp_dotnet/SDK/FileManager/Extensions/InternalAimpExtensionFileFormat.h b/src/SDK/aimp_dotnet/SDK/FileManager/Extensions/InternalAimpExtensionFileFormat.h index 9eaeb9a7..68dcbc99 100644 --- a/src/SDK/aimp_dotnet/SDK/FileManager/Extensions/InternalAimpExtensionFileFormat.h +++ b/src/SDK/aimp_dotnet/SDK/FileManager/Extensions/InternalAimpExtensionFileFormat.h @@ -10,8 +10,7 @@ #pragma once class InternalAimpExtensionFileFormat : - public IUnknownInterfaceImpl, - IAIMPExtensionFileFormat { + public IUnknownInterfaceImpl { private: gcroot _managedInstance; diff --git a/src/SDK/aimp_dotnet/SDK/FileManager/InternalAimpVirtualFile.cpp b/src/SDK/aimp_dotnet/SDK/FileManager/InternalAimpVirtualFile.cpp new file mode 100644 index 00000000..8317cacf --- /dev/null +++ b/src/SDK/aimp_dotnet/SDK/FileManager/InternalAimpVirtualFile.cpp @@ -0,0 +1,138 @@ +#include "stdafx.h" +#include "InternalAimpVirtualFile.h" + +#include "AimpFileInfo.h" +#include "AimpVirtualFile.h" + +InternalAimpVirtualFile::InternalAimpVirtualFile(gcroot managed) { + _managed = managed; +} + +HRESULT WINAPI InternalAimpVirtualFile::GetValueAsInt32(int PropertyID, int* Value) { + if (PropertyID == AIMP_VIRTUALFILE_PROPID_INDEXINSET) + *Value = _managed->IndexInSet; + + return S_OK; +} + +HRESULT WINAPI InternalAimpVirtualFile::SetValueAsInt32(int PropertyID, int Value) { + if (PropertyID == AIMP_VIRTUALFILE_PROPID_INDEXINSET) + _managed->IndexInSet = Value; + + return S_OK; +} + +HRESULT InternalAimpVirtualFile::SetValueAsFloat(int PropertyID, const double Value) { + if (Value == 0) + return E_NOTIMPL; + + if (PropertyID == AIMP_VIRTUALFILE_PROPID_CLIPSTART) + _managed->ClipStart = Value; + + if (PropertyID == AIMP_VIRTUALFILE_PROPID_CLIPFINISH) + _managed->ClipFinish = Value; + + return S_OK; +} + +HRESULT InternalAimpVirtualFile::GetValueAsFloat(int PropertyID, double* Value) { + *Value = 0; + + if (PropertyID == AIMP_VIRTUALFILE_PROPID_CLIPSTART) { + double val = _managed->ClipStart; + if (val == 0) + return E_NOTIMPL; + + *Value = val; + } + + if (PropertyID == AIMP_VIRTUALFILE_PROPID_CLIPFINISH) { + double val = _managed->ClipFinish; + if (val == 0) + return E_NOTIMPL; + + *Value = val; + } + + return S_OK; +} + +HRESULT InternalAimpVirtualFile::SetValueAsObject(int PropertyID, IUnknown* Value) { + if (PropertyID == AIMP_VIRTUALFILE_PROPID_AUDIOSOURCEFILE) + _managed->AudioSourceFile = AimpConverter::ToManagedString(reinterpret_cast(Value)); + + if (PropertyID == AIMP_VIRTUALFILE_PROPID_FILEURI) + _managed->FileUri = AimpConverter::ToManagedString(reinterpret_cast(Value)); + + return S_OK; +} + +HRESULT InternalAimpVirtualFile::GetValueAsObject(int PropertyID, const IID& IID, void** Value) { + if (PropertyID == AIMP_VIRTUALFILE_PROPID_AUDIOSOURCEFILE) { + if (String::IsNullOrWhiteSpace(_managed->AudioSourceFile)) { + return E_NOTIMPL; + } + + *Value = AimpConverter::ToAimpString(_managed->AudioSourceFile); + } + + if (PropertyID == AIMP_VIRTUALFILE_PROPID_FILEURI) + *Value = AimpConverter::ToAimpString(_managed->FileUri); + + if (PropertyID == AIMP_VIRTUALFILE_PROPID_FILEFORMAT) + *Value = AimpConverter::ToAimpString(_managed->FileFormat); + + return S_OK; +} + +HRESULT InternalAimpVirtualFile::CreateStream(IAIMPStream** Stream) { + const auto str = _managed->CreateStream(); + + if (str->ResultType == ActionResultType::OK) { + *Stream = safe_cast(str->Result)->InternalAimpObject; + return S_OK; + } + + return E_NOTIMPL; +} + +HRESULT InternalAimpVirtualFile::GetFileInfo(IAIMPFileInfo* Info) { + const auto fi = gcnew AimpFileInfo(Info); + const auto res = _managed->GetFileInfo(fi); + + return static_cast(res->ResultType); +} + +boolean InternalAimpVirtualFile::IsExists() { + return _managed->IsExists(); +} + +HRESULT InternalAimpVirtualFile::IsInSameStream(IAIMPVirtualFile* VirtualFile) { + return static_cast(_managed->IsInSameStream(gcnew AimpVirtualFile(VirtualFile))->ResultType); +} + +HRESULT InternalAimpVirtualFile::Synchronize() { + return static_cast(_managed->Synchronize()->ResultType); +} + + +HRESULT WINAPI InternalAimpVirtualFile::QueryInterface(REFIID riid, LPVOID* ppvObject) { + const HRESULT res = Base::QueryInterface(riid, ppvObject); + + if (riid == IID_IAIMPVirtualFile) { + *ppvObject = this; + AddRef(); + return S_OK; + } + + *ppvObject = nullptr; + return res; +} + +ULONG WINAPI InternalAimpVirtualFile::AddRef(void) { + return Base::AddRef(); +} + +ULONG WINAPI InternalAimpVirtualFile::Release(void) { + return Base::Release(); +} diff --git a/src/SDK/aimp_dotnet/SDK/FileManager/InternalAimpVirtualFile.h b/src/SDK/aimp_dotnet/SDK/FileManager/InternalAimpVirtualFile.h new file mode 100644 index 00000000..bc8609d0 --- /dev/null +++ b/src/SDK/aimp_dotnet/SDK/FileManager/InternalAimpVirtualFile.h @@ -0,0 +1,32 @@ +#pragma once +#include "SDK/AimpPropertyList.h" + +class InternalAimpVirtualFile : public IUnknownInterfaceImpl, public AimpPropertyList +{ +private: + gcroot _managed; + IAIMPCore* _core; +public: + typedef IUnknownInterfaceImpl Base; + + InternalAimpVirtualFile(gcroot managed); + + ULONG WINAPI AddRef(void) override; + ULONG WINAPI Release(void) override; + HRESULT WINAPI QueryInterface(REFIID riid, LPVOID* ppvObject) override; + + HRESULT WINAPI GetValueAsInt32(int PropertyID, int* Value) override; + HRESULT WINAPI SetValueAsInt32(int PropertyID, int Value) override; + + HRESULT WINAPI SetValueAsFloat(int PropertyID, const double Value) override; + HRESULT WINAPI GetValueAsFloat(int PropertyID, double* Value) override; + + HRESULT WINAPI SetValueAsObject(int PropertyID, IUnknown* Value) override; + HRESULT WINAPI GetValueAsObject(int PropertyID, const IID& IID, void** Value) override; + + HRESULT WINAPI CreateStream(IAIMPStream** Stream) override; + HRESULT WINAPI GetFileInfo(IAIMPFileInfo* Info) override; + boolean WINAPI IsExists() override; + HRESULT WINAPI IsInSameStream(IAIMPVirtualFile* VirtualFile) override; + HRESULT WINAPI Synchronize() override; +}; diff --git a/src/SDK/aimp_dotnet/SDK/ManagedAimpCore.cpp b/src/SDK/aimp_dotnet/SDK/ManagedAimpCore.cpp index bea27b0b..12d00c7b 100644 --- a/src/SDK/aimp_dotnet/SDK/ManagedAimpCore.cpp +++ b/src/SDK/aimp_dotnet/SDK/ManagedAimpCore.cpp @@ -15,6 +15,7 @@ #include "FileManager/Extensions/InternalAimpExtensionFileFormat.h" #include "FileManager/Extensions/InternalAimpExtensionFileInfoProvider.h" #include "FileManager/Extensions/InternalAimpExtensionFileSystem.h" +#include "Player/Extensions/AimpExtensionPlaybackQueue.h" #include "SDK\Options\OptionsDialogFrameExtension.h" #include "SDK\AlbumArt\AimpExtensionAlbumArtCatalog.h" #include "SDK\PlayList\AimpExtensionPlaylistManagerListener.h" @@ -121,15 +122,13 @@ namespace AIMP { } if (_extensionPlaybackQueue != nullptr) { - _core->UnregisterExtension(static_cast(_extensionPlaybackQueue) - ); + _core->UnregisterExtension(_extensionPlaybackQueue); _extensionPlaybackQueue->Release(); delete _extensionPlaybackQueue; } if (_extensionPlaybackQueue2 != nullptr) { - _core->UnregisterExtension(static_cast(_extensionPlaybackQueue2) - ); + _core->UnregisterExtension(static_cast(_extensionPlaybackQueue2)); _extensionPlaybackQueue2->Release(); delete _extensionPlaybackQueue2; } @@ -296,31 +295,29 @@ namespace AIMP { AimpExtensionLyricsProvider* ext = new AimpExtensionLyricsProvider(lyricsProviderExtension); _extensionLyricsProvider = ext; - return _core->RegisterExtension(IID_IAIMPExtensionLyricsProvider, static_cast(ext)); + return _core->RegisterExtension(IID_IAIMPExtensionLyricsProvider, ext); } - IAimpExtensionPlaybackQueue^ extensionPlaybackQueue = dynamic_cast(extension); - if (extensionPlaybackQueue != nullptr) { + IAimpExtensionPlaybackQueue2^ extensionPlaybackQueue2 = dynamic_cast(extension); + if (extensionPlaybackQueue2 != nullptr) { if (_extensionPlaybackQueue != nullptr) { return E_FAIL; } - AimpExtensionPlaybackQueue* ext = new AimpExtensionPlaybackQueue(extensionPlaybackQueue); - _extensionPlaybackQueue = ext; - return _core->RegisterExtension(IID_IAIMPServicePlaybackQueue, static_cast(ext) - ); + AimpExtensionPlaybackQueue2* ext = new AimpExtensionPlaybackQueue2(extensionPlaybackQueue2); + _extensionPlaybackQueue2 = ext; + return _core->RegisterExtension(IID_IAIMPServicePlaybackQueue2, static_cast(ext)); } - IAimpExtensionPlaybackQueue2^ extensionPlaybackQueue2 = dynamic_cast(extension); - if (extensionPlaybackQueue2 != nullptr) { + IAimpExtensionPlaybackQueue^ extensionPlaybackQueue = dynamic_cast(extension); + if (extensionPlaybackQueue != nullptr) { if (_extensionPlaybackQueue != nullptr) { return E_FAIL; } - AimpExtensionPlaybackQueue2* ext = new AimpExtensionPlaybackQueue2(extensionPlaybackQueue2); - _extensionPlaybackQueue2 = ext; - return _core->RegisterExtension(IID_IAIMPServicePlaybackQueue2, static_cast(ext) - ); + AimpExtensionPlaybackQueue* ext = new AimpExtensionPlaybackQueue(extensionPlaybackQueue); + _extensionPlaybackQueue = ext; + return _core->RegisterExtension(IID_IAIMPServicePlaybackQueue, ext); } auto extensionPlayerHook = dynamic_cast(extension); @@ -442,22 +439,22 @@ namespace AIMP { return r; } - const auto extensionPlaybackQueue = dynamic_cast(extension); - if (extensionPlaybackQueue != nullptr) { - HRESULT r = _core->UnregisterExtension(static_cast(_extensionPlaybackQueue)); - _extensionPlaybackQueue->Release(); - _extensionPlaybackQueue = nullptr; - return r; - } - const auto extensionPlaybackQueue2 = dynamic_cast(extension); if (extensionPlaybackQueue2 != nullptr) { - HRESULT r = _core->UnregisterExtension(static_cast(_extensionPlaybackQueue2)); + HRESULT r = _core->UnregisterExtension(static_cast(_extensionPlaybackQueue2)); _extensionPlaybackQueue2->Release(); _extensionPlaybackQueue2 = nullptr; return r; } + const auto extensionPlaybackQueue = dynamic_cast(extension); + if (extensionPlaybackQueue != nullptr) { + HRESULT r = _core->UnregisterExtension(_extensionPlaybackQueue); + _extensionPlaybackQueue->Release(); + _extensionPlaybackQueue = nullptr; + return r; + } + const auto extensionPlayerHook = dynamic_cast(extension); if (extensionPlayerHook != nullptr) { HRESULT r = _core->UnregisterExtension( @@ -647,7 +644,7 @@ namespace AIMP { return E_FAIL; } - const auto ext = new InternalAimpExtensionFileExpander(extensionFileExpander); + const auto ext = new InternalAimpExtensionFileExpander(extensionFileExpander, _core); _extensionFileExpander = ext; return _core->RegisterExtension(IID_IAIMPServiceFileManager, static_cast(ext)); } diff --git a/src/SDK/aimp_dotnet/SDK/MessageDispatcher/AimpServiceMessageDispatcher.cpp b/src/SDK/aimp_dotnet/SDK/MessageDispatcher/AimpServiceMessageDispatcher.cpp index 523a5c97..12dfa448 100644 --- a/src/SDK/aimp_dotnet/SDK/MessageDispatcher/AimpServiceMessageDispatcher.cpp +++ b/src/SDK/aimp_dotnet/SDK/MessageDispatcher/AimpServiceMessageDispatcher.cpp @@ -28,13 +28,45 @@ ActionResult AimpServiceMessageDispatcher::Send(AimpCoreMessageType message, int IAIMPServiceMessageDispatcher* service = GetAimpService(); ActionResultType result = ActionResultType::Fail; + try { + if (service != nullptr) { + result = CheckResult(service->Send(static_cast(message), param1, param2.ToPointer())); + } + } + finally { + ReleaseObject(service); + } + + return ACTION_RESULT(result); +} + +AimpActionResult^ AimpServiceMessageDispatcher::Send(AimpCoreMessageType message) { + IAIMPServiceMessageDispatcher* service = GetAimpService(); + ActionResultType result = ActionResultType::Fail; + + int pointer = 0; + + try { + if (service != nullptr) { + result = CheckResult(service->Send(static_cast(message), 0, &pointer)); + } + } + finally { + ReleaseObject(service); + } + + return ACTION_RESULT(result); +} + +AimpActionResult^ AimpServiceMessageDispatcher::Send(AimpCoreMessageType message, int param1) { + IAIMPServiceMessageDispatcher* service = GetAimpService(); + ActionResultType result = ActionResultType::Fail; + int pointer = 0; try { if (service != nullptr) { - //result = CheckResult(service->Send(static_cast(message), static_cast(param1), param2.ToPointer())); - result = CheckResult(service->Send(static_cast(message), static_cast(param1), &pointer)); - param2 = IntPtr(pointer); + result = CheckResult(service->Send(static_cast(message), param1, &pointer)); } } finally { diff --git a/src/SDK/aimp_dotnet/SDK/MessageDispatcher/AimpServiceMessageDispatcher.h b/src/SDK/aimp_dotnet/SDK/MessageDispatcher/AimpServiceMessageDispatcher.h index 7028d141..bbc40899 100644 --- a/src/SDK/aimp_dotnet/SDK/MessageDispatcher/AimpServiceMessageDispatcher.h +++ b/src/SDK/aimp_dotnet/SDK/MessageDispatcher/AimpServiceMessageDispatcher.h @@ -25,6 +25,8 @@ namespace AIMP { ~AimpServiceMessageDispatcher(); virtual ActionResult Send(AimpCoreMessageType message, int param1, IntPtr% param2); + virtual AimpActionResult^ Send(AimpCoreMessageType message); + virtual AimpActionResult^ Send(AimpCoreMessageType message, int param1); virtual int Register(String^ message); virtual ActionResult Hook(IAimpMessageHook^ hook); virtual ActionResult Unhook(IAimpMessageHook^ hook); diff --git a/src/SDK/aimp_dotnet/SDK/PlayList/AimpPlayList.cpp b/src/SDK/aimp_dotnet/SDK/PlayList/AimpPlayList.cpp index 64b3cb6c..b3389e5f 100644 --- a/src/SDK/aimp_dotnet/SDK/PlayList/AimpPlayList.cpp +++ b/src/SDK/aimp_dotnet/SDK/PlayList/AimpPlayList.cpp @@ -148,9 +148,8 @@ IAimpPlaylistItem^ AimpPlayList::FocusedItem::get() { try { IAIMPPlaylistItem* group = nullptr; GetProperties(&properties); - PropertyListExtension::GetObject(properties, AIMP_PLAYLIST_PROPID_FOCUSED_OBJECT, IID_IAIMPPlaylistItem, - reinterpret_cast(&group)); - if (group != nullptr) { + const auto res = PropertyListExtension::GetObject(properties, AIMP_PLAYLIST_PROPID_FOCUSED_OBJECT, IID_IAIMPPlaylistItem, reinterpret_cast(&group)); + if (res == ActionResultType::OK && group != nullptr) { item = gcnew AimpPlaylistItem(group); } } @@ -191,9 +190,8 @@ IAimpPlaylistGroup^ AimpPlayList::FocusedGroup::get() { try { IAIMPPlaylistGroup* group = nullptr; GetProperties(&properties); - PropertyListExtension::GetObject(properties, AIMP_PLAYLIST_PROPID_FOCUSED_OBJECT, IID_IAIMPPlaylistGroup, - reinterpret_cast(&group)); - if (group != nullptr) { + const auto res = PropertyListExtension::GetObject(properties, AIMP_PLAYLIST_PROPID_FOCUSED_OBJECT, IID_IAIMPPlaylistGroup, reinterpret_cast(&group)); + if (res == ActionResultType::OK && group != nullptr) { item = gcnew AimpPlayListGroup(group); } } diff --git a/src/SDK/aimp_dotnet/SDK/Playback/AimpPlaybackQueueItem.cpp b/src/SDK/aimp_dotnet/SDK/Playback/AimpPlaybackQueueItem.cpp index fa220c63..8ac5fb0b 100644 --- a/src/SDK/aimp_dotnet/SDK/Playback/AimpPlaybackQueueItem.cpp +++ b/src/SDK/aimp_dotnet/SDK/Playback/AimpPlaybackQueueItem.cpp @@ -16,10 +16,30 @@ using namespace AIMP::SDK; AimpPlaybackQueueItem::AimpPlaybackQueueItem(IAIMPPlaybackQueueItem* aimpItem) : AimpObject(aimpItem) { } +double AimpPlaybackQueueItem::Offset::get() { + double val = 0; + const auto res = Utils::CheckResult(InternalAimpObject->GetValueAsFloat(AIMP_PLAYBACKQUEUEITEM_PROPID_OFFSET, &val)); + + if (res == ActionResultType::OK) + return val; + + return val; +} + +void AimpPlaybackQueueItem::Offset::set(double offset) { + const auto res = Utils::CheckResult(InternalAimpObject->SetValueAsFloat(AIMP_PLAYBACKQUEUEITEM_PROPID_OFFSET, offset)); + + if (res != ActionResultType::OK) + throw gcnew AimpActionException(res, "Unable to set Offset value"); +} + Object^ AimpPlaybackQueueItem::UserData::get() { IUnknown* item = nullptr; - InternalAimpObject->GetValueAsObject(AIMP_PLAYBACKQUEUEITEM_PROPID_CUSTOM, IID_IUnknown, - reinterpret_cast(&item)); + const auto res = Utils::CheckResult(InternalAimpObject->GetValueAsObject(AIMP_PLAYBACKQUEUEITEM_PROPID_CUSTOM, IID_IUnknown, reinterpret_cast(&item))); + + if (res != ActionResultType::OK) + return nullptr; + return Runtime::InteropServices::Marshal::GetObjectForIUnknown(IntPtr(item)); } @@ -30,12 +50,18 @@ void AimpPlaybackQueueItem::UserData::set(Object^ value) { IAimpPlaylistItem^ AimpPlaybackQueueItem::PlaylistItem::get() { IAIMPPlaylistItem* item = nullptr; - InternalAimpObject->GetValueAsObject(AIMP_PLAYBACKQUEUEITEM_PROPID_PLAYLISTITEM, IID_IAIMPPlaylistItem, - reinterpret_cast(&item)); + IAIMPPropertyList* prop = nullptr; + const auto res = Utils::CheckResult(InternalAimpObject->GetValueAsObject(AIMP_PLAYBACKQUEUEITEM_PROPID_PLAYLISTITEM, IID_IAIMPPlaylistItem, reinterpret_cast(&item))); + + if (res != ActionResultType::OK) + return nullptr; + return gcnew AimpPlaylistItem(item); } void AimpPlaybackQueueItem::PlaylistItem::set(IAimpPlaylistItem^ value) { - InternalAimpObject->SetValueAsObject(AIMP_PLAYBACKQUEUEITEM_PROPID_PLAYLISTITEM, - static_cast(value)->InternalAimpObject); + const auto res = Utils::CheckResult(InternalAimpObject->SetValueAsObject(AIMP_PLAYBACKQUEUEITEM_PROPID_PLAYLISTITEM, static_cast(value)->InternalAimpObject)); + + if (res != ActionResultType::OK) + throw gcnew AimpActionException(res, "Unable to set PlaylistItem"); } diff --git a/src/SDK/aimp_dotnet/SDK/Playback/AimpPlaybackQueueItem.h b/src/SDK/aimp_dotnet/SDK/Playback/AimpPlaybackQueueItem.h index 7ccff6f5..16a76804 100644 --- a/src/SDK/aimp_dotnet/SDK/Playback/AimpPlaybackQueueItem.h +++ b/src/SDK/aimp_dotnet/SDK/Playback/AimpPlaybackQueueItem.h @@ -20,6 +20,11 @@ namespace AIMP { public: explicit AimpPlaybackQueueItem(IAIMPPlaybackQueueItem* aimpItem); + property double Offset { + virtual double get(); + virtual void set(double offset); + } + virtual property Object^ UserData { Object^ get(); diff --git a/src/SDK/aimp_dotnet/SDK/Player/Extensions/AimpExtensionPlaybackQueue.cpp b/src/SDK/aimp_dotnet/SDK/Player/Extensions/AimpExtensionPlaybackQueue.cpp index 507a0f20..f072297c 100644 --- a/src/SDK/aimp_dotnet/SDK/Player/Extensions/AimpExtensionPlaybackQueue.cpp +++ b/src/SDK/aimp_dotnet/SDK/Player/Extensions/AimpExtensionPlaybackQueue.cpp @@ -21,7 +21,7 @@ AimpExtensionPlaybackQueue::AimpExtensionPlaybackQueue(gcroot(_managed->GetNext(gcnew AimpPlayList(static_cast(current)), - static_cast(flags), - nullptr)->ResultType); + static_cast(flags), + gcnew AimpPlaybackQueueItem(queueItem))->ResultType); case AIMP_PLAYBACKQUEUE_FLAGS_START_FROM_ITEM: return static_cast(_managed->GetNext(gcnew AimpPlaylistItem(static_cast(current)), - static_cast(flags), - gcnew AimpPlaybackQueueItem(queueItem))->ResultType); + static_cast(flags), + gcnew AimpPlaybackQueueItem(queueItem))->ResultType); } return false; @@ -59,13 +59,21 @@ HRESULT AimpExtensionPlaybackQueue::GetPrev(IUnknown* current, DWORD flags, IAIM switch (flags) { case AIMP_PLAYBACKQUEUE_FLAGS_START_FROM_BEGINNING: case AIMP_PLAYBACKQUEUE_FLAGS_START_FROM_CURSOR: - return static_cast(_managed->GetPrev(gcnew AimpPlayList(static_cast(current)), - static_cast(flags), - nullptr)->ResultType); + { + const auto res = _managed->GetPrev( + gcnew AimpPlayList(static_cast(current)), + static_cast(flags), + gcnew AimpPlaybackQueueItem(queueItem)); + + return static_cast(res->ResultType); + } case AIMP_PLAYBACKQUEUE_FLAGS_START_FROM_ITEM: - return static_cast(_managed->GetPrev(gcnew AimpPlaylistItem(static_cast(current)), - static_cast(flags), - gcnew AimpPlaybackQueueItem(queueItem))->ResultType); + const auto res = _managed->GetPrev(gcnew AimpPlaylistItem( + static_cast(current)), + static_cast(flags), + gcnew AimpPlaybackQueueItem(queueItem)); + + return static_cast(res->ResultType); } return false; diff --git a/src/SDK/aimp_dotnet/SDK/Player/Extensions/AimpExtensionPlaybackQueue.h b/src/SDK/aimp_dotnet/SDK/Player/Extensions/AimpExtensionPlaybackQueue.h index afe09e17..35c29db1 100644 --- a/src/SDK/aimp_dotnet/SDK/Player/Extensions/AimpExtensionPlaybackQueue.h +++ b/src/SDK/aimp_dotnet/SDK/Player/Extensions/AimpExtensionPlaybackQueue.h @@ -14,13 +14,10 @@ using namespace Player::Extensions; class AimpExtensionPlaybackQueue : public IUnknownInterfaceImpl { private: - gcroot _managed; + gcroot _managed = nullptr; public: typedef IUnknownInterfaceImpl Base; - explicit AimpExtensionPlaybackQueue() { - } - explicit AimpExtensionPlaybackQueue(gcroot extension); virtual HRESULT WINAPI GetNext(IUnknown* current, DWORD flags, IAIMPPlaybackQueueItem* queueItem); diff --git a/src/SDK/aimp_dotnet/SDK/Player/Extensions/AimpExtensionPlaybackQueue2.cpp b/src/SDK/aimp_dotnet/SDK/Player/Extensions/AimpExtensionPlaybackQueue2.cpp index b0eee982..23ba5302 100644 --- a/src/SDK/aimp_dotnet/SDK/Player/Extensions/AimpExtensionPlaybackQueue2.cpp +++ b/src/SDK/aimp_dotnet/SDK/Player/Extensions/AimpExtensionPlaybackQueue2.cpp @@ -13,10 +13,6 @@ #include "SDK/PlayList/AimpPlayListItem.h" -AimpExtensionPlaybackQueue2::AimpExtensionPlaybackQueue2(gcroot extension) { - _managed = extension; -} - HRESULT AimpExtensionPlaybackQueue2::GetInfo(IUnknown* Current, int* position, int* size) { const auto item = gcnew AimpPlaylistItem(dynamic_cast(Current)); const auto result = _managed->GetInfo(item); @@ -32,7 +28,7 @@ HRESULT AimpExtensionPlaybackQueue2::GetInfo(IUnknown* Current, int* position, i HRESULT AimpExtensionPlaybackQueue2::QueryInterface(const IID& riid, LPVOID* ppvObject) { HRESULT res = Base::QueryInterface(riid, ppvObject); - if (riid == IID_IAIMPServicePlaybackQueue2) { + if (riid == IID_IAIMPExtensionPlaybackQueue) { *ppvObject = this; AddRef(); return S_OK; diff --git a/src/SDK/aimp_dotnet/SDK/Player/Extensions/AimpExtensionPlaybackQueue2.h b/src/SDK/aimp_dotnet/SDK/Player/Extensions/AimpExtensionPlaybackQueue2.h index 910859b8..27f6000c 100644 --- a/src/SDK/aimp_dotnet/SDK/Player/Extensions/AimpExtensionPlaybackQueue2.h +++ b/src/SDK/aimp_dotnet/SDK/Player/Extensions/AimpExtensionPlaybackQueue2.h @@ -12,15 +12,17 @@ using namespace Player::Extensions; -class AimpExtensionPlaybackQueue2 : - public AimpExtensionPlaybackQueue, - public IUnknownInterfaceImpl { +class AimpExtensionPlaybackQueue2 :public IUnknownInterfaceImpl, AimpExtensionPlaybackQueue { private: gcroot _managed; public: - typedef AimpExtensionPlaybackQueue Base; - typedef IUnknownInterfaceImpl Base2; - explicit AimpExtensionPlaybackQueue2(gcroot extension); + typedef IUnknownInterfaceImpl Base; + typedef AimpExtensionPlaybackQueue BaseType; + + explicit AimpExtensionPlaybackQueue2(const gcroot extension) + : AimpExtensionPlaybackQueue(static_cast(extension)) { + _managed = extension; + } HRESULT WINAPI GetInfo(IUnknown* Current, int* position, int* size) override; @@ -31,14 +33,14 @@ class AimpExtensionPlaybackQueue2 : ULONG WINAPI Release(void) override; HRESULT WINAPI GetNext(IUnknown* Current, DWORD Flags, IAIMPPlaybackQueueItem* QueueItem) override { - return Base::GetNext(Current, Flags, QueueItem); + return BaseType::GetNext(Current, Flags, QueueItem); } HRESULT WINAPI GetPrev(IUnknown* Current, DWORD Flags, IAIMPPlaybackQueueItem* QueueItem) override { - return Base::GetPrev(Current, Flags, QueueItem); + return BaseType::GetPrev(Current, Flags, QueueItem); } void WINAPI OnSelect(IAIMPPlaylistItem* Item, IAIMPPlaybackQueueItem* QueueItem) override { - return Base::OnSelect(Item, QueueItem); + return BaseType::OnSelect(Item, QueueItem); } }; \ No newline at end of file diff --git a/src/SDK/aimp_dotnet/SDK/Player/Extensions/InternalAimpExtensionWaveFormProvider.cpp b/src/SDK/aimp_dotnet/SDK/Player/Extensions/InternalAimpExtensionWaveFormProvider.cpp index 18ea417d..2dbab411 100644 --- a/src/SDK/aimp_dotnet/SDK/Player/Extensions/InternalAimpExtensionWaveFormProvider.cpp +++ b/src/SDK/aimp_dotnet/SDK/Player/Extensions/InternalAimpExtensionWaveFormProvider.cpp @@ -42,7 +42,7 @@ HRESULT InternalAimpExtensionWaveFormProvider::Calculate(IAIMPString* fileURI, I peakList->Add(gcnew AimpWaveformPeakInfo(p)); } - const auto res = _managed->Calculate(AimpConverter::ToManagedString(fileURI), gcnew AimpTaskOwner(taskOwner), nullptr); + const auto res = _managed->Calculate(AimpConverter::ToManagedString(fileURI), gcnew AimpTaskOwner(taskOwner), peakList); return static_cast(res->ResultType); } diff --git a/src/SDK/aimp_dotnet/SDK/PropertyListHelper.cpp b/src/SDK/aimp_dotnet/SDK/PropertyListHelper.cpp index fca96159..246a4a1f 100644 --- a/src/SDK/aimp_dotnet/SDK/PropertyListHelper.cpp +++ b/src/SDK/aimp_dotnet/SDK/PropertyListHelper.cpp @@ -87,14 +87,14 @@ void PropertyListExtension::GetString(IAIMPString* aimpString, String^% value) { ActionResultType PropertyListExtension::GetObject(IAIMPPropertyList* propertyList, int propertyId, REFIID objectId, void** value) { const auto result = Utils::CheckResult(propertyList->GetValueAsObject(propertyId, objectId, value)); - VALIDATE_RESULT(result, "Unable to get a object property.") + //VALIDATE_RESULT(result, "Unable to get a object property.") return result; } ActionResultType PropertyListExtension::GetInt32(IAIMPPropertyList* propertyList, int propertyId, int% value) { int val = 0; const auto result = Utils::CheckResult(propertyList->GetValueAsInt32(propertyId, &val)); - VALIDATE_RESULT(result, "Unable to get a Int32 property.") + //VALIDATE_RESULT(result, "Unable to get a Int32 property.") value = val; return result; } @@ -102,7 +102,7 @@ ActionResultType PropertyListExtension::GetInt32(IAIMPPropertyList* propertyList ActionResultType PropertyListExtension::GetInt64(IAIMPPropertyList* propertyList, int propertyId, Int64% value) { Int64 val = 0; const auto result = Utils::CheckResult(propertyList->GetValueAsInt64(propertyId, &val)); - VALIDATE_RESULT(result, "Unable to get a Int64 property.") + //VALIDATE_RESULT(result, "Unable to get a Int64 property.") value = val; return result; } @@ -118,7 +118,7 @@ ActionResultType PropertyListExtension::GetFloat(IAIMPPropertyList* propertyList ActionResultType PropertyListExtension::GetBool(IAIMPPropertyList* propertyList, int propertyId, bool% value) { int val = 0; const auto result = Utils::CheckResult(propertyList->GetValueAsInt32(propertyId, &val)); - VALIDATE_RESULT(result, "Unable to get a Bool property.") + //VALIDATE_RESULT(result, "Unable to get a Bool property.") value = val != 0; return result; } @@ -156,7 +156,7 @@ bool PropertyListExtension::GetBool(IAIMPPropertyList* propertyList, int propert ActionResultType PropertyListExtension::GetVariant(IAIMPPropertyList2* propertyList, int propertyId, Object^% value) { VARIANT* val = nullptr; const auto result = Utils::CheckResult(propertyList->GetValueAsVariant(propertyId, val)); - VALIDATE_RESULT(result, "Unable to get a Variant property.") + //VALIDATE_RESULT(result, "Unable to get a Variant property.") value = AimpConverter::FromVariant(val); return result; } diff --git a/src/Tests/IntegrationTests/TestFramework/AimpIntegrationTest.cs b/src/Tests/IntegrationTests/TestFramework/AimpIntegrationTest.cs index 518c5893..0e76397b 100644 --- a/src/Tests/IntegrationTests/TestFramework/AimpIntegrationTest.cs +++ b/src/Tests/IntegrationTests/TestFramework/AimpIntegrationTest.cs @@ -30,11 +30,14 @@ public virtual void RunBeforeAnyTests() NUnit.Framework.Assert.That(Player, Is.Not.Null); Asserts = new List(); ClearAimpBeforeTests(); + + OneTimeSetUp(); } [OneTimeTearDown] public virtual void AfterAllTests() { + OneTimeTearDown(); } [SetUp] @@ -202,6 +205,12 @@ protected void AssertOKResult(AimpActionResult result) AimpAssert.IsTrue(result.Result is TResult); } + protected virtual void OneTimeSetUp() + {} + + protected virtual void OneTimeTearDown() + {} + private void ClearAimpBeforeTests() { TestContext.WriteLine("Clear existing playlist"); @@ -216,7 +225,7 @@ private static void AddFailedResult(string message = null, Exception exception = result.RecordAssertion(AssertionStatus.Failed, msg, exception?.StackTrace ?? Environment.StackTrace); result.RecordTestCompletion(); } - + private class AimpTask : IAimpTask { private readonly Action _action; diff --git a/src/Tests/IntegrationTests/UnitTests/FileManager/Extensions/AimpExtensionFileExpanderUnitTests.cs b/src/Tests/IntegrationTests/UnitTests/FileManager/Extensions/AimpExtensionFileExpanderUnitTests.cs index ff7f5dc4..d47e743b 100644 --- a/src/Tests/IntegrationTests/UnitTests/FileManager/Extensions/AimpExtensionFileExpanderUnitTests.cs +++ b/src/Tests/IntegrationTests/UnitTests/FileManager/Extensions/AimpExtensionFileExpanderUnitTests.cs @@ -8,6 +8,8 @@ // ---------------------------------------------------- using System; +using System.Collections.Generic; + using AIMP.SDK; using AIMP.SDK.FileManager.Extensions; using AIMP.SDK.FileManager.Objects; @@ -18,7 +20,7 @@ namespace Aimp.TestRunner.UnitTests.FileManager.Extensions; public class AimpExtensionFileExpander : IAimpExtensionFileExpander { - public AimpActionResult> Expand(string fileName, + public AimpActionResult> Expand(string fileName, IAimpProgressCallback progressCallback) { throw new NotImplementedException(); diff --git a/src/Tests/IntegrationTests/UnitTests/Player/AimpExtensionPlaybackQueue2Tests.cs b/src/Tests/IntegrationTests/UnitTests/Player/AimpExtensionPlaybackQueue2Tests.cs index df8911ab..40889f77 100644 --- a/src/Tests/IntegrationTests/UnitTests/Player/AimpExtensionPlaybackQueue2Tests.cs +++ b/src/Tests/IntegrationTests/UnitTests/Player/AimpExtensionPlaybackQueue2Tests.cs @@ -43,15 +43,24 @@ public AimpActionResult GetInfo(IAimpPlaylistItem item) private AimpExtensionPlaybackQueue2 _target; + + protected override void OneTimeSetUp() + { + _target = new AimpExtensionPlaybackQueue2(); + } + + protected override void OneTimeTearDown() + { + _target = null; + } + [Test] [Order(1)] public void ShouldRegisterExtension() { ExecuteInMainThread(() => { - _target = new AimpExtensionPlaybackQueue2(); var res = Player.Core.RegisterExtension(_target); - AimpAssert.AreEqual(ActionResultType.OK, res.ResultType); }); }