mirror of
https://github.com/ICDSystems/ICD.Common.Utils.git
synced 2026-01-11 19:44:55 +00:00
Compare commits
18 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
0490ffd572 | ||
|
|
3bf0aff0a0 | ||
|
|
e5b10a96f7 | ||
|
|
0c3c87308c | ||
|
|
68d1f1033a | ||
|
|
af66147648 | ||
|
|
16067bca20 | ||
|
|
57e64788c4 | ||
|
|
bc605bf8ae | ||
|
|
be50aa3314 | ||
|
|
1b79bd21df | ||
|
|
df42a6674f | ||
|
|
ae53812a98 | ||
|
|
74ff651798 | ||
|
|
29013a2bf5 | ||
|
|
baa00f7b00 | ||
|
|
67a2b11ee6 | ||
|
|
8f5fee2401 |
@@ -6,6 +6,14 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
|
||||
|
||||
## [Unreleased]
|
||||
|
||||
## [16.0.2] 2022-05-23
|
||||
### Changed
|
||||
- Fixed an issue in IcdUriBuilder where relative pathes were not being built into a valid URI.
|
||||
|
||||
## [16.0.1] 2021-10-28
|
||||
### Changed
|
||||
- Changed sqlite connection strings in IcdCultureInfo & IcdTimeZoneInfo to work with SimplSharp.
|
||||
|
||||
## [16.0.0] 2021-10-04
|
||||
### Added
|
||||
- Added IcdAutoResetEvent and IcdManaualResetEvent
|
||||
|
||||
@@ -1,10 +1,15 @@
|
||||
using System.Collections.Generic;
|
||||
#if NETFRAMEWORK
|
||||
extern alias RealNewtonsoft;
|
||||
using RealNewtonsoft.Newtonsoft.Json;
|
||||
#else
|
||||
using Newtonsoft.Json;
|
||||
#endif
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using ICD.Common.Utils.Extensions;
|
||||
using ICD.Common.Utils.IO;
|
||||
using Newtonsoft.Json;
|
||||
using NUnit.Framework;
|
||||
|
||||
namespace ICD.Common.Utils.Tests.Extensions
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
|
||||
<PropertyGroup>
|
||||
<OutputType>Library</OutputType>
|
||||
<TargetFramework>netcoreapp3.1</TargetFramework>
|
||||
<TargetFrameworks>netcoreapp3.1;net472</TargetFrameworks>
|
||||
<RootNamespace>ICD.Common.Utils.Tests</RootNamespace>
|
||||
<AssemblyName>ICD.Common.Utils.Tests</AssemblyName>
|
||||
<GenerateAssemblyInfo>false</GenerateAssemblyInfo>
|
||||
@@ -11,21 +11,22 @@
|
||||
</PropertyGroup>
|
||||
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
|
||||
<DefineConstants>TRACE;DEBUG;STANDARD</DefineConstants>
|
||||
<DefineConstants>TRACE;DEBUG</DefineConstants>
|
||||
</PropertyGroup>
|
||||
|
||||
<PropertyGroup>
|
||||
<OutputPath>binNetCoreApp\$(Configuration)\</OutputPath>
|
||||
<DefineConstants>TRACE;STANDARD</DefineConstants>
|
||||
<OutputPath>bin\$(Configuration)\</OutputPath>
|
||||
<DefineConstants>TRACE</DefineConstants>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<Compile Remove="binNetCoreApp\**" />
|
||||
<EmbeddedResource Remove="binNetCoreApp\**" />
|
||||
<None Remove="binNetCoreApp\**" />
|
||||
<Compile Remove="bin\**" />
|
||||
<EmbeddedResource Remove="bin\**" />
|
||||
<None Remove="bin\**" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Condition="'$(TargetFramework)' == 'net472'" Include="Newtonsoft.Json" Version="13.0.1" Aliases="RealNewtonsoft"/>
|
||||
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.9.1" />
|
||||
<PackageReference Include="NUnit" Version="3.13.1" />
|
||||
<PackageReference Include="NUnit3TestAdapter" Version="3.17.0" />
|
||||
|
||||
@@ -1,6 +1,11 @@
|
||||
using System;
|
||||
using ICD.Common.Utils.Json;
|
||||
#if NETFRAMEWORK
|
||||
extern alias RealNewtonsoft;
|
||||
using RealNewtonsoft.Newtonsoft.Json;
|
||||
#else
|
||||
using Newtonsoft.Json;
|
||||
#endif
|
||||
using System;
|
||||
using ICD.Common.Utils.Json;
|
||||
using NUnit.Framework;
|
||||
|
||||
namespace ICD.Common.Utils.Tests.Json
|
||||
|
||||
@@ -1,7 +1,12 @@
|
||||
using ICD.Common.Utils.Extensions;
|
||||
#if NETFRAMEWORK
|
||||
extern alias RealNewtonsoft;
|
||||
using RealNewtonsoft.Newtonsoft.Json;
|
||||
#else
|
||||
using Newtonsoft.Json;
|
||||
#endif
|
||||
using ICD.Common.Utils.Extensions;
|
||||
using ICD.Common.Utils.IO;
|
||||
using ICD.Common.Utils.Json;
|
||||
using Newtonsoft.Json;
|
||||
using NUnit.Framework;
|
||||
|
||||
namespace ICD.Common.Utils.Tests.Json
|
||||
|
||||
@@ -1,9 +1,8 @@
|
||||
using System;
|
||||
#if STANDARD
|
||||
using System.Net.Mail;
|
||||
#endif
|
||||
#if SIMPLSHARP
|
||||
using Crestron.SimplSharp;
|
||||
#else
|
||||
using System.Net.Mail;
|
||||
#endif
|
||||
|
||||
namespace ICD.Common.Utils.Email
|
||||
@@ -126,7 +125,7 @@ namespace ICD.Common.Utils.Email
|
||||
|
||||
public static class MailErrorCodeUtils
|
||||
{
|
||||
#if STANDARD
|
||||
#if !SIMPLSHARP
|
||||
public static eMailErrorCode FromNetStandardMailCode(SmtpStatusCode code)
|
||||
{
|
||||
switch (code)
|
||||
@@ -185,8 +184,7 @@ namespace ICD.Common.Utils.Email
|
||||
throw new ArgumentOutOfRangeException(nameof(code), code, null);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
#if SIMPLSHARP
|
||||
#else
|
||||
public static eMailErrorCode FromSimplMailCode(CrestronMailFunctions.SendMailErrorCodes code)
|
||||
{
|
||||
switch (code)
|
||||
|
||||
@@ -29,7 +29,7 @@ namespace ICD.Common.Utils.Extensions
|
||||
#endif
|
||||
.CodeBase;
|
||||
|
||||
#if STANDARD
|
||||
#if !SIMPLSHARP
|
||||
if (string.IsNullOrEmpty(path))
|
||||
path = extends.Location;
|
||||
#endif
|
||||
|
||||
@@ -1,7 +1,12 @@
|
||||
using System;
|
||||
#if NETFRAMEWORK
|
||||
extern alias RealNewtonsoft;
|
||||
using RealNewtonsoft.Newtonsoft.Json;
|
||||
#else
|
||||
using Newtonsoft.Json;
|
||||
#endif
|
||||
using System;
|
||||
using System.Text.RegularExpressions;
|
||||
using ICD.Common.Properties;
|
||||
using Newtonsoft.Json;
|
||||
|
||||
namespace ICD.Common.Utils.Extensions
|
||||
{
|
||||
@@ -27,24 +32,6 @@ namespace ICD.Common.Utils.Extensions
|
||||
#else
|
||||
JsonSerializer.CreateDefault();
|
||||
#endif
|
||||
return extends.ReadAsObject<T>(serializer);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Reads the current token in the reader and deserializes to the given type.
|
||||
/// </summary>
|
||||
/// <typeparam name="T"></typeparam>
|
||||
/// <param name="extends"></param>
|
||||
/// <param name="serializer"></param>
|
||||
/// <returns></returns>
|
||||
public static T ReadAsObject<T>([NotNull] this JsonReader extends, [NotNull] JsonSerializer serializer)
|
||||
{
|
||||
if (extends == null)
|
||||
throw new ArgumentNullException("extends");
|
||||
|
||||
if (serializer == null)
|
||||
throw new ArgumentNullException("serializer");
|
||||
|
||||
return serializer.Deserialize<T>(extends);
|
||||
}
|
||||
|
||||
|
||||
@@ -1,8 +1,13 @@
|
||||
using System;
|
||||
#if NETFRAMEWORK
|
||||
extern alias RealNewtonsoft;
|
||||
using RealNewtonsoft.Newtonsoft.Json;
|
||||
#else
|
||||
using Newtonsoft.Json;
|
||||
#endif
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using ICD.Common.Properties;
|
||||
using Newtonsoft.Json;
|
||||
|
||||
namespace ICD.Common.Utils.Extensions
|
||||
{
|
||||
|
||||
@@ -1,5 +1,10 @@
|
||||
using System;
|
||||
#if NETFRAMEWORK
|
||||
extern alias RealNewtonsoft;
|
||||
using RealNewtonsoft.Newtonsoft.Json;
|
||||
#else
|
||||
using Newtonsoft.Json;
|
||||
#endif
|
||||
using System;
|
||||
|
||||
namespace ICD.Common.Utils.Extensions
|
||||
{
|
||||
|
||||
@@ -1,6 +1,11 @@
|
||||
using System;
|
||||
using ICD.Common.Properties;
|
||||
#if NETFRAMEWORK
|
||||
extern alias RealNewtonsoft;
|
||||
using RealNewtonsoft.Newtonsoft.Json;
|
||||
#else
|
||||
using Newtonsoft.Json;
|
||||
#endif
|
||||
using System;
|
||||
using ICD.Common.Properties;
|
||||
|
||||
namespace ICD.Common.Utils.Extensions
|
||||
{
|
||||
|
||||
@@ -96,11 +96,8 @@ namespace ICD.Common.Utils.Globalization
|
||||
{
|
||||
private const string SQL_LOCAL_DATABASE_FILE = "CultureInfo.sqlite";
|
||||
private const string SQL_CONNECTION_STRING_FORMAT =
|
||||
#if SIMPLSHARP
|
||||
"Data Source={0};Version=3;ReadOnly=True";
|
||||
#else
|
||||
"Data Source={0}";
|
||||
#endif
|
||||
|
||||
private const string SQL_CMD_SELECT_BY_NAME = "select * from cultureinfo where name = @name collate nocase";
|
||||
private const string SQL_CMD_SELECT_BY_LCID = "select * from cultureinfo where lcid = @lcid";
|
||||
private const string SQL_CMD_SELECT_BY_ID = "select * from cultureinfo where id = @id";
|
||||
@@ -466,8 +463,9 @@ namespace ICD.Common.Utils.Globalization
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (Exception)
|
||||
catch (Exception e)
|
||||
{
|
||||
IcdErrorLog.Exception(e, "Error populating IcdCultureInfo cache - {0}", e.Message);
|
||||
s_IsDatabasePresent = false;
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -3,33 +3,28 @@
|
||||
<Import Condition=" '$(EAZFUSCATOR_NET_HOME)' != '' and Exists('$(EAZFUSCATOR_NET_HOME)\Integration\MSBuild\Eazfuscator.NET.targets') " Project="$(EAZFUSCATOR_NET_HOME)\Integration\MSBuild\Eazfuscator.NET.targets" />
|
||||
<PropertyGroup>
|
||||
<OutputType>Library</OutputType>
|
||||
<TargetFramework>netstandard2.0</TargetFramework>
|
||||
<TargetFrameworks>netstandard2.0;net472</TargetFrameworks>
|
||||
<AssemblyName>ICD.Common.Utils</AssemblyName>
|
||||
<RootNamespace>$(AssemblyName)</RootNamespace>
|
||||
<RootNamespace>ICD.Common.Utils</RootNamespace>
|
||||
<GenerateAssemblyInfo>false</GenerateAssemblyInfo>
|
||||
<Deterministic>true</Deterministic>
|
||||
<Authors>Chris Cameron, Jeff Thompson</Authors>
|
||||
<PackageId>ICD.Common.Utils</PackageId>
|
||||
<PackageProjectUrl></PackageProjectUrl>
|
||||
<RepositoryUrl>https://cs-gogs.icdpf.net/Common/Utils</RepositoryUrl>
|
||||
<RepositoryType>git</RepositoryType>
|
||||
<EazfuscatorIntegration>MSBuild</EazfuscatorIntegration>
|
||||
<EazfuscatorActiveConfiguration>Release</EazfuscatorActiveConfiguration>
|
||||
<EazfuscatorCompatibilityVersion>2018.2</EazfuscatorCompatibilityVersion>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
|
||||
<DefineConstants>TRACE;DEBUG;STANDARD</DefineConstants>
|
||||
<DefineConstants>TRACE;DEBUG</DefineConstants>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup>
|
||||
<OutputPath>binNetCoreApp\$(Configuration)\</OutputPath>
|
||||
<DefineConstants>TRACE;STANDARD</DefineConstants>
|
||||
<OutputPath>bin\$(Configuration)\</OutputPath>
|
||||
<DefineConstants>TRACE</DefineConstants>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<Compile Remove="binNetCoreApp\**" />
|
||||
<Compile Remove="bin\**" />
|
||||
<Compile Remove="SIMPLSharpLogs\**" />
|
||||
<EmbeddedResource Remove="binNetCoreApp\**" />
|
||||
<EmbeddedResource Remove="bin\**" />
|
||||
<EmbeddedResource Remove="SIMPLSharpLogs\**" />
|
||||
<None Remove="binNetCoreApp\**" />
|
||||
<None Remove="bin\**" />
|
||||
<None Remove="SIMPLSharpLogs\**" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
@@ -39,10 +34,12 @@
|
||||
<None Remove="Properties\ControlSystem.cfg" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<PackageReference Condition="'$(TargetFramework)' == 'net472'" Include="Crestron.SimplSharp.SDK.Library" Version="2.17.69" />
|
||||
<PackageReference Condition="'$(TargetFramework)' == 'net472'" Include="Newtonsoft.Json" Version="13.0.1" Aliases="RealNewtonsoft"/>
|
||||
<PackageReference Condition="'$(TargetFramework)' == 'netstandard2.0'" Include="Newtonsoft.Json" Version="13.0.1"/>
|
||||
<PackageReference Include="Microsoft.Data.SQLite" Version="5.0.4" />
|
||||
<PackageReference Include="Microsoft.Extensions.DependencyModel" Version="5.0.0" />
|
||||
<PackageReference Include="Microsoft.Win32.Registry" Version="5.0.0" />
|
||||
<PackageReference Include="Newtonsoft.Json" Version="12.0.3" />
|
||||
<PackageReference Include="Pastel" Version="2.1.0" />
|
||||
<PackageReference Include="System.Management" Version="5.0.0" />
|
||||
<PackageReference Include="System.Net.NetworkInformation" Version="4.3.0" />
|
||||
@@ -57,5 +54,4 @@
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</None>
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
@@ -25,7 +25,7 @@
|
||||
<DebugSymbols>true</DebugSymbols>
|
||||
<DebugType>full</DebugType>
|
||||
<Optimize>false</Optimize>
|
||||
<OutputPath>bin\Debug\</OutputPath>
|
||||
<OutputPath>bin\Debug\net3.5\</OutputPath>
|
||||
<DefineConstants>DEBUG;TRACE;SIMPLSHARP</DefineConstants>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
@@ -38,7 +38,7 @@
|
||||
<AllowedReferenceRelatedFileExtensions>.allowedReferenceRelatedFileExtensions</AllowedReferenceRelatedFileExtensions>
|
||||
<DebugType>none</DebugType>
|
||||
<Optimize>true</Optimize>
|
||||
<OutputPath>bin\Release\</OutputPath>
|
||||
<OutputPath>bin\Release\net3.5\</OutputPath>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
<FileAlignment>512</FileAlignment>
|
||||
@@ -120,10 +120,11 @@
|
||||
<Compile Include="Extensions\CollectionExtensions.cs" />
|
||||
<Compile Include="Extensions\RegistryExtensions.cs" />
|
||||
<Compile Include="Extensions\VersionExtensions.cs" />
|
||||
<Compile Include="AbstractIcdResetEvent.cs" />
|
||||
<Compile Include="IcdAutoResetEvent.cs" />
|
||||
<Compile Include="Threading\AbstractIcdResetEvent.cs" />
|
||||
<Compile Include="Threading\IcdAutoResetEvent.cs" />
|
||||
<Compile Include="IcdManualResetEvent.cs" />
|
||||
<Compile Include="ThreadedWorkerQueue.cs" />
|
||||
<Compile Include="Threading\KeyedLock.cs" />
|
||||
<Compile Include="Threading\ThreadedWorkerQueue.cs" />
|
||||
<Compile Include="TimeZoneInfo\IcdTimeZoneInfo.cs" />
|
||||
<Compile Include="ObfuscationSettings.cs" />
|
||||
<Compile Include="Extensions\BoolExtensions.cs" />
|
||||
@@ -216,10 +217,10 @@
|
||||
<Compile Include="PrettyPrint.cs" />
|
||||
<Compile Include="ProgramUtils.cs" />
|
||||
<Compile Include="ReflectionUtils.cs" />
|
||||
<Compile Include="SafeCriticalSection.cs" />
|
||||
<Compile Include="SafeCriticalSection.SimplSharp.cs" />
|
||||
<Compile Include="SafeCriticalSection.Standard.cs" />
|
||||
<Compile Include="SafeMutex.cs" />
|
||||
<Compile Include="Threading\SafeCriticalSection.cs" />
|
||||
<Compile Include="Threading\SafeCriticalSection.SimplSharp.cs" />
|
||||
<Compile Include="Threading\SafeCriticalSection.Standard.cs" />
|
||||
<Compile Include="Threading\SafeMutex.cs" />
|
||||
<Compile Include="SPlusUtils.cs" />
|
||||
<Compile Include="Sqlite\eDbType.cs" />
|
||||
<Compile Include="Sqlite\IcdDbDataReader.cs" />
|
||||
@@ -232,7 +233,7 @@
|
||||
<Compile Include="Sqlite\IIcdDataRecord.cs" />
|
||||
<Compile Include="StringUtils.cs" />
|
||||
<Compile Include="TableBuilder.cs" />
|
||||
<Compile Include="ThreadingUtils.cs" />
|
||||
<Compile Include="Threading\ThreadingUtils.cs" />
|
||||
<Compile Include="Timers\IcdStopwatch.cs" />
|
||||
<Compile Include="Timers\IcdTimer.cs" />
|
||||
<Compile Include="Timers\Repeater.cs" />
|
||||
|
||||
@@ -299,7 +299,6 @@ namespace ICD.Common.Utils.IO.Compression
|
||||
|
||||
private Entry GetEntry(string fileName)
|
||||
{
|
||||
fileName = fileName.Replace("\\", "/").Trim().TrimStart('/');
|
||||
var entry = Entries.FirstOrDefault(e => e.Name == fileName);
|
||||
|
||||
if (entry == null)
|
||||
|
||||
@@ -30,7 +30,7 @@ namespace ICD.Common.Utils.IO
|
||||
#if SIMPLSHARP
|
||||
return Directory.GetApplicationRootDirectory();
|
||||
#else
|
||||
return Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().GetPath());
|
||||
return Path.GetDirectoryName(Assembly.GetExecutingAssembly().GetPath());
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
@@ -127,7 +127,7 @@ namespace ICD.Common.Utils.IO
|
||||
File.Move(sourceFileName, destFileName);
|
||||
}
|
||||
|
||||
#if STANDARD
|
||||
#if !SIMPLSHARP
|
||||
public static void SetAttributes(string path, FileAttributes attributes, bool recursive)
|
||||
{
|
||||
File.SetAttributes(path, attributes);
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
using System;
|
||||
#if SIMPLSHARP
|
||||
using Crestron.SimplSharp.CrestronIO;
|
||||
#elif STANDARD
|
||||
#else
|
||||
using System.IO;
|
||||
#endif
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
#if SIMPLSHARP
|
||||
using Crestron.SimplSharp.CrestronIO;
|
||||
#elif STANDARD
|
||||
#else
|
||||
using System.IO;
|
||||
#endif
|
||||
|
||||
|
||||
@@ -4,7 +4,7 @@ using System.Text.RegularExpressions;
|
||||
using ICD.Common.Properties;
|
||||
using ICD.Common.Utils.EventArguments;
|
||||
using ICD.Common.Utils.Extensions;
|
||||
#if SIMPLSHARP
|
||||
#if !NETSTANDARD
|
||||
using Crestron.SimplSharp;
|
||||
#else
|
||||
using System.Diagnostics;
|
||||
@@ -99,7 +99,7 @@ namespace ICD.Common.Utils
|
||||
|
||||
message = FixLineEndings(message);
|
||||
|
||||
#if SIMPLSHARP
|
||||
#if !NETSTANDARD
|
||||
if (IcdEnvironment.CrestronRuntimeEnvironment == IcdEnvironment.eCrestronRuntimeEnvironment.Appliance)
|
||||
{
|
||||
try
|
||||
@@ -125,7 +125,7 @@ namespace ICD.Common.Utils
|
||||
|
||||
try
|
||||
{
|
||||
#if SIMPLSHARP
|
||||
#if !NETSTANDARD
|
||||
if (IcdEnvironment.CrestronRuntimeEnvironment != IcdEnvironment.eCrestronRuntimeEnvironment.Server)
|
||||
CrestronConsole.PrintLine(fixedMessage);
|
||||
#else
|
||||
@@ -169,7 +169,7 @@ namespace ICD.Common.Utils
|
||||
|
||||
try
|
||||
{
|
||||
#if SIMPLSHARP
|
||||
#if !NETSTANDARD
|
||||
if (IcdEnvironment.CrestronRuntimeEnvironment != IcdEnvironment.eCrestronRuntimeEnvironment.Server)
|
||||
CrestronConsole.Print(fixedMessage);
|
||||
#else
|
||||
@@ -207,7 +207,7 @@ namespace ICD.Common.Utils
|
||||
|
||||
public static bool SendControlSystemCommand(string command, ref string result)
|
||||
{
|
||||
#if SIMPLSHARP
|
||||
#if !NETSTANDARD
|
||||
// No console on VC4
|
||||
if (IcdEnvironment.CrestronRuntimeEnvironment == IcdEnvironment.eCrestronRuntimeEnvironment.Server)
|
||||
return false;
|
||||
@@ -220,7 +220,7 @@ namespace ICD.Common.Utils
|
||||
|
||||
public static bool AddNewConsoleCommand(Action<string> callback, string command, string help, eAccessLevel accessLevel)
|
||||
{
|
||||
#if SIMPLSHARP
|
||||
#if !NETSTANDARD
|
||||
// Avoid crashing Simpl applications
|
||||
if (IcdEnvironment.CrestronRuntimeEnvironment != IcdEnvironment.eCrestronRuntimeEnvironment.Appliance)
|
||||
return false;
|
||||
|
||||
@@ -1,14 +1,17 @@
|
||||
#if STANDARD
|
||||
#if !SIMPLSHARP
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Net;
|
||||
using System.Net.NetworkInformation;
|
||||
using System.Net.Sockets;
|
||||
using System.Text.RegularExpressions;
|
||||
using ICD.Common.Properties;
|
||||
using ICD.Common.Utils.EventArguments;
|
||||
using ICD.Common.Utils.Timers;
|
||||
using AddressFamily = System.Net.Sockets.AddressFamily;
|
||||
using Dns = System.Net.Dns;
|
||||
#if !NETSTANDARD
|
||||
using Crestron.SimplSharp;
|
||||
#endif
|
||||
|
||||
namespace ICD.Common.Utils
|
||||
{
|
||||
@@ -106,9 +109,20 @@ namespace ICD.Common.Utils
|
||||
|
||||
static IcdEnvironment()
|
||||
{
|
||||
#if NETFRAMEWORK
|
||||
s_Framework = eFramework.Framework;
|
||||
s_CrestronSeries = eCrestronSeries.FourSeries;
|
||||
if (CrestronEnvironment.RuntimeEnvironment == eRuntimeEnvironment.SIMPL)
|
||||
s_CrestronRuntimeEnvironment = eCrestronRuntimeEnvironment.Simpl;
|
||||
else if (CrestronEnvironment.DevicePlatform == eDevicePlatform.Appliance)
|
||||
s_CrestronRuntimeEnvironment = eCrestronRuntimeEnvironment.Appliance;
|
||||
else
|
||||
s_CrestronRuntimeEnvironment = eCrestronRuntimeEnvironment.Server;
|
||||
#else
|
||||
s_Framework = eFramework.Standard;
|
||||
s_CrestronSeries = eCrestronSeries.Na;
|
||||
s_CrestronRuntimeEnvironment = eCrestronRuntimeEnvironment.Na;
|
||||
#endif
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -172,6 +186,7 @@ namespace ICD.Common.Utils
|
||||
handler(sessionId, reasonCode);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Call this method to raise the device added/removed event for an added device
|
||||
/// Uses a timer to attempt to compress multiple events into a single event
|
||||
/// </summary>
|
||||
|
||||
@@ -12,6 +12,7 @@ namespace ICD.Common.Utils
|
||||
public enum eFramework
|
||||
{
|
||||
Crestron,
|
||||
Framework,
|
||||
Standard
|
||||
}
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using ICD.Common.Properties;
|
||||
#if SIMPLSHARP
|
||||
#if !NETSTANDARD
|
||||
using Crestron.SimplSharp;
|
||||
#else
|
||||
using System.Diagnostics;
|
||||
@@ -32,7 +32,7 @@ namespace ICD.Common.Utils
|
||||
private static readonly Dictionary<string, Action<string, Exception>> s_LogMethods =
|
||||
new Dictionary<string, Action<string, Exception>>
|
||||
{
|
||||
#if SIMPLSHARP
|
||||
#if !NETSTANDARD
|
||||
{ERROR, (m, e) => ErrorLog.Error(m)},
|
||||
{WARN, (m, e) => ErrorLog.Warn(m)},
|
||||
{NOTICE, (m, e) => ErrorLog.Notice(m)},
|
||||
|
||||
@@ -92,7 +92,7 @@ namespace ICD.Common.Utils
|
||||
throw new ArgumentNullException("uri");
|
||||
|
||||
if (!uri.IsAbsoluteUri)
|
||||
uri = new Uri(Uri.UriSchemeHttp + Uri.SchemeDelimiter + uri);
|
||||
uri = new Uri(Uri.UriSchemeHttp + Uri.SchemeDelimiter + "localhost" + uri);
|
||||
|
||||
Fragment = uri.Fragment;
|
||||
Host = uri.Host;
|
||||
|
||||
@@ -1,7 +1,12 @@
|
||||
using System;
|
||||
#if NETFRAMEWORK
|
||||
extern alias RealNewtonsoft;
|
||||
using RealNewtonsoft.Newtonsoft.Json;
|
||||
#else
|
||||
using Newtonsoft.Json;
|
||||
#endif
|
||||
using System;
|
||||
using ICD.Common.Properties;
|
||||
using ICD.Common.Utils.Extensions;
|
||||
using Newtonsoft.Json;
|
||||
|
||||
namespace ICD.Common.Utils.Json
|
||||
{
|
||||
@@ -128,23 +133,28 @@ namespace ICD.Common.Utils.Json
|
||||
throw new ArgumentNullException("serializer");
|
||||
|
||||
if (reader.TokenType == JsonToken.Null)
|
||||
return default(T);
|
||||
return existingValue;
|
||||
|
||||
if (reader.TokenType != JsonToken.StartObject)
|
||||
throw new FormatException(string.Format("Expected {0} got {1}", JsonToken.StartObject, reader.TokenType));
|
||||
|
||||
return ReadObject(reader, serializer);
|
||||
return ReadObject(reader, existingValue, serializer);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Override to handle deserialization of the current StartObject token.
|
||||
/// </summary>
|
||||
/// <param name="reader"></param>
|
||||
/// <param name="existingValue"></param>
|
||||
/// <param name="serializer"></param>
|
||||
/// <returns></returns>
|
||||
protected virtual T ReadObject(JsonReader reader, JsonSerializer serializer)
|
||||
protected virtual T ReadObject(JsonReader reader, T existingValue, JsonSerializer serializer)
|
||||
{
|
||||
T output = Instantiate();
|
||||
// ReSharper disable CompareNonConstrainedGenericWithNull
|
||||
// ReSharper disable ConvertConditionalTernaryToNullCoalescing
|
||||
T output = existingValue == null ? Instantiate() : existingValue;
|
||||
// ReSharper restore ConvertConditionalTernaryToNullCoalescing
|
||||
// ReSharper restore CompareNonConstrainedGenericWithNull
|
||||
|
||||
reader.ReadObject(serializer, (p, r, s) => ReadProperty(p, r, output, s));
|
||||
|
||||
|
||||
@@ -1,6 +1,11 @@
|
||||
using System;
|
||||
using ICD.Common.Utils.Extensions;
|
||||
#if NETFRAMEWORK
|
||||
extern alias RealNewtonsoft;
|
||||
using RealNewtonsoft.Newtonsoft.Json;
|
||||
#else
|
||||
using Newtonsoft.Json;
|
||||
#endif
|
||||
using System;
|
||||
using ICD.Common.Utils.Extensions;
|
||||
|
||||
namespace ICD.Common.Utils.Json
|
||||
{
|
||||
|
||||
@@ -1,7 +1,12 @@
|
||||
using System;
|
||||
#if NETFRAMEWORK
|
||||
extern alias RealNewtonsoft;
|
||||
using RealNewtonsoft.Newtonsoft.Json;
|
||||
#else
|
||||
using Newtonsoft.Json;
|
||||
#endif
|
||||
using System;
|
||||
using ICD.Common.Properties;
|
||||
using ICD.Common.Utils.Extensions;
|
||||
using Newtonsoft.Json;
|
||||
|
||||
namespace ICD.Common.Utils.Json
|
||||
{
|
||||
|
||||
@@ -1,10 +1,15 @@
|
||||
using System;
|
||||
#if NETFRAMEWORK
|
||||
extern alias RealNewtonsoft;
|
||||
using RealNewtonsoft.Newtonsoft.Json;
|
||||
#else
|
||||
using Newtonsoft.Json;
|
||||
#endif
|
||||
using System;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using ICD.Common.Properties;
|
||||
using ICD.Common.Utils.Extensions;
|
||||
using ICD.Common.Utils.IO;
|
||||
using Newtonsoft.Json;
|
||||
|
||||
namespace ICD.Common.Utils.Json
|
||||
{
|
||||
|
||||
@@ -1,6 +1,11 @@
|
||||
using System;
|
||||
using ICD.Common.Utils.Extensions;
|
||||
#if NETFRAMEWORK
|
||||
extern alias RealNewtonsoft;
|
||||
using RealNewtonsoft.Newtonsoft.Json;
|
||||
#else
|
||||
using Newtonsoft.Json;
|
||||
#endif
|
||||
using System;
|
||||
using ICD.Common.Utils.Extensions;
|
||||
|
||||
namespace ICD.Common.Utils.Json
|
||||
{
|
||||
|
||||
@@ -1,4 +1,10 @@
|
||||
using System;
|
||||
#if NETFRAMEWORK
|
||||
extern alias RealNewtonsoft;
|
||||
using RealNewtonsoft.Newtonsoft.Json;
|
||||
#else
|
||||
using Newtonsoft.Json;
|
||||
#endif
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
#if SIMPLSHARP
|
||||
using Crestron.SimplSharp.Reflection;
|
||||
@@ -7,7 +13,6 @@ using System.Reflection;
|
||||
using System.Runtime.ExceptionServices;
|
||||
#endif
|
||||
using ICD.Common.Properties;
|
||||
using Newtonsoft.Json;
|
||||
|
||||
namespace ICD.Common.Utils.Json
|
||||
{
|
||||
|
||||
@@ -62,7 +62,7 @@ namespace ICD.Common.Utils
|
||||
{
|
||||
get
|
||||
{
|
||||
#if SIMPLSHARP
|
||||
#if !NETSTANDARD
|
||||
switch (IcdEnvironment.CrestronSeries)
|
||||
{
|
||||
case IcdEnvironment.eCrestronSeries.FourSeries:
|
||||
@@ -175,7 +175,7 @@ namespace ICD.Common.Utils
|
||||
{
|
||||
get
|
||||
{
|
||||
if (IcdEnvironment.Framework == IcdEnvironment.eFramework.Crestron)
|
||||
if (IcdEnvironment.Framework != IcdEnvironment.eFramework.Standard)
|
||||
{
|
||||
// 3-series
|
||||
if (IcdEnvironment.CrestronSeries == IcdEnvironment.eCrestronSeries.ThreeSeries)
|
||||
@@ -190,9 +190,9 @@ namespace ICD.Common.Utils
|
||||
}
|
||||
|
||||
#if LINUX
|
||||
return Join(RootPath, "var", "www", "html");
|
||||
return Join(RootPath, "var", "www", "html");
|
||||
#else
|
||||
return "C:\\INetPub";
|
||||
return "C:\\INetPub";
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
@@ -41,6 +41,7 @@ namespace ICD.Common.Utils
|
||||
throw new ArgumentOutOfRangeException();
|
||||
}
|
||||
break;
|
||||
case IcdEnvironment.eFramework.Framework:
|
||||
case IcdEnvironment.eFramework.Standard:
|
||||
name += ' ';
|
||||
break;
|
||||
|
||||
@@ -3,5 +3,5 @@ using System.Reflection;
|
||||
[assembly: AssemblyTitle("ICD.Common.Utils")]
|
||||
[assembly: AssemblyCompany("ICD Systems")]
|
||||
[assembly: AssemblyProduct("ICD.Common.Utils")]
|
||||
[assembly: AssemblyCopyright("Copyright © ICD Systems 2021")]
|
||||
[assembly: AssemblyVersion("16.0.0.0")]
|
||||
[assembly: AssemblyCopyright("Copyright © ICD Systems 2022")]
|
||||
[assembly: AssemblyVersion("16.0.2.0")]
|
||||
|
||||
@@ -274,17 +274,12 @@ namespace ICD.Common.Utils
|
||||
|
||||
string fileNameWithOutExtension = IcdPath.GetFileNameWithoutExtension(path);
|
||||
|
||||
#if SIMPLSHARP
|
||||
|
||||
#if !NETSTANDARD
|
||||
try
|
||||
{
|
||||
return Assembly.Load(new AssemblyName {Name = fileNameWithOutExtension});
|
||||
}
|
||||
catch (IOException)
|
||||
{
|
||||
return Assembly.LoadFrom(path);
|
||||
}
|
||||
catch (FileNotFoundException)
|
||||
catch (Exception)
|
||||
{
|
||||
return Assembly.LoadFrom(path);
|
||||
}
|
||||
|
||||
@@ -37,7 +37,7 @@ namespace ICD.Common.Utils
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Adds the property with the given name and value to the builder without any additonal formatting.
|
||||
/// Adds the property with the given name and value to the builder without any additional formatting.
|
||||
/// </summary>
|
||||
/// <param name="name"></param>
|
||||
/// <param name="value"></param>
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
#if STANDARD
|
||||
#if !SIMPLSHARP
|
||||
using System.Text;
|
||||
#endif
|
||||
using ICD.Common.Properties;
|
||||
@@ -106,7 +106,7 @@ namespace ICD.Common.Utils.Services.Logging
|
||||
if (e == null)
|
||||
throw new ArgumentNullException("e");
|
||||
|
||||
#if STANDARD
|
||||
#if !SIMPLSHARP
|
||||
if (e is AggregateException)
|
||||
{
|
||||
extends.AddEntry(severity, e as AggregateException, message);
|
||||
@@ -117,7 +117,7 @@ namespace ICD.Common.Utils.Services.Logging
|
||||
IcdEnvironment.NewLine, e.Message, e.StackTrace));
|
||||
}
|
||||
|
||||
#if STANDARD
|
||||
#if !SIMPLSHARP
|
||||
/// <summary>
|
||||
/// Logs an aggregate exception as a formatted list of inner exceptions.
|
||||
/// </summary>
|
||||
|
||||
@@ -1,6 +1,12 @@
|
||||
using System;
|
||||
#if NETFRAMEWORK
|
||||
extern alias RealNewtonsoft;
|
||||
using RealNewtonsoft.Newtonsoft.Json;
|
||||
using RealNewtonsoft.Newtonsoft.Json.Converters;
|
||||
#else
|
||||
using Newtonsoft.Json;
|
||||
using Newtonsoft.Json.Converters;
|
||||
#endif
|
||||
using System;
|
||||
|
||||
namespace ICD.Common.Utils.Services.Logging
|
||||
{
|
||||
|
||||
139
ICD.Common.Utils/Threading/KeyedLock.cs
Normal file
139
ICD.Common.Utils/Threading/KeyedLock.cs
Normal file
@@ -0,0 +1,139 @@
|
||||
#if !SIMPLSHARP
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
using ICD.Common.Properties;
|
||||
|
||||
namespace ICD.Common.Utils.Threading
|
||||
{
|
||||
public sealed class KeyedLock<TKey>
|
||||
{
|
||||
private readonly Dictionary<TKey, (SemaphoreSlim, int)> m_PerKey;
|
||||
private readonly Queue<SemaphoreSlim> m_Pool;
|
||||
private readonly int m_PoolCapacity;
|
||||
|
||||
public KeyedLock(IEqualityComparer<TKey> keyComparer = null, int poolCapacity = 10)
|
||||
{
|
||||
m_PerKey = new Dictionary<TKey, (SemaphoreSlim, int)>(keyComparer);
|
||||
m_Pool = new Queue<SemaphoreSlim>(poolCapacity);
|
||||
m_PoolCapacity = poolCapacity;
|
||||
}
|
||||
|
||||
#region Methods
|
||||
|
||||
[PublicAPI]
|
||||
public async Task<bool> WaitAsync(TKey key, int millisecondsTimeout,
|
||||
CancellationToken cancellationToken = default)
|
||||
{
|
||||
var semaphore = GetSemaphore(key);
|
||||
bool entered = false;
|
||||
try
|
||||
{
|
||||
entered = await semaphore.WaitAsync(millisecondsTimeout,
|
||||
cancellationToken).ConfigureAwait(false);
|
||||
}
|
||||
finally
|
||||
{
|
||||
if (!entered) ReleaseSemaphore(key, entered: false);
|
||||
}
|
||||
|
||||
return entered;
|
||||
}
|
||||
|
||||
[PublicAPI]
|
||||
public Task WaitAsync(TKey key, CancellationToken cancellationToken = default)
|
||||
=> WaitAsync(key, Timeout.Infinite, cancellationToken);
|
||||
|
||||
[PublicAPI]
|
||||
public bool Wait(TKey key, int millisecondsTimeout,
|
||||
CancellationToken cancellationToken = default)
|
||||
{
|
||||
var semaphore = GetSemaphore(key);
|
||||
bool entered = false;
|
||||
try
|
||||
{
|
||||
entered = semaphore.Wait(millisecondsTimeout, cancellationToken);
|
||||
}
|
||||
finally
|
||||
{
|
||||
if (!entered)
|
||||
ReleaseSemaphore(key, entered: false);
|
||||
}
|
||||
|
||||
return entered;
|
||||
}
|
||||
|
||||
[PublicAPI]
|
||||
public void Wait(TKey key, CancellationToken cancellationToken = default)
|
||||
=> Wait(key, Timeout.Infinite, cancellationToken);
|
||||
|
||||
[PublicAPI]
|
||||
public void Release(TKey key) => ReleaseSemaphore(key, entered: true);
|
||||
|
||||
#endregion
|
||||
|
||||
#region Private Methods
|
||||
|
||||
private SemaphoreSlim GetSemaphore(TKey key)
|
||||
{
|
||||
SemaphoreSlim semaphore;
|
||||
lock (m_PerKey)
|
||||
{
|
||||
if (m_PerKey.TryGetValue(key, out var entry))
|
||||
{
|
||||
int counter;
|
||||
(semaphore, counter) = entry;
|
||||
m_PerKey[key] = (semaphore, ++counter);
|
||||
}
|
||||
else
|
||||
{
|
||||
lock (m_Pool) semaphore = m_Pool.Count > 0 ? m_Pool.Dequeue() : null;
|
||||
if (semaphore == null) semaphore = new SemaphoreSlim(1, 1);
|
||||
m_PerKey[key] = (semaphore, 1);
|
||||
}
|
||||
}
|
||||
|
||||
return semaphore;
|
||||
}
|
||||
|
||||
private void ReleaseSemaphore(TKey key, bool entered)
|
||||
{
|
||||
SemaphoreSlim semaphore;
|
||||
int counter;
|
||||
lock (m_PerKey)
|
||||
{
|
||||
if (m_PerKey.TryGetValue(key, out var entry))
|
||||
{
|
||||
(semaphore, counter) = entry;
|
||||
counter--;
|
||||
if (counter == 0)
|
||||
m_PerKey.Remove(key);
|
||||
else
|
||||
m_PerKey[key] = (semaphore, counter);
|
||||
}
|
||||
else
|
||||
{
|
||||
throw new InvalidOperationException("Key not found.");
|
||||
}
|
||||
}
|
||||
|
||||
if (entered)
|
||||
semaphore.Release();
|
||||
|
||||
if (counter == 0)
|
||||
{
|
||||
Debug.Assert(semaphore.CurrentCount == 1);
|
||||
lock (m_Pool)
|
||||
{
|
||||
if (m_Pool.Count < m_PoolCapacity)
|
||||
m_Pool.Enqueue(semaphore);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
#endif
|
||||
@@ -18,11 +18,7 @@ namespace ICD.Common.Utils.TimeZoneInfo
|
||||
|
||||
private const string SQL_LOCAL_DATABASE_FILE = "TimeZones.sqlite";
|
||||
private const string SQL_CONNECTION_STRING_FORMAT =
|
||||
#if SIMPLSHARP
|
||||
"Data Source={0};Version=3;ReadOnly=True";
|
||||
#else
|
||||
"Data Source={0}";
|
||||
#endif
|
||||
|
||||
private static readonly Dictionary<string, IcdTimeZoneInfo> s_Cache;
|
||||
|
||||
|
||||
@@ -3,7 +3,6 @@ using System.Text;
|
||||
using ICD.Common.Utils.IO;
|
||||
#if SIMPLSHARP
|
||||
using Crestron.SimplSharp.CrestronXml;
|
||||
|
||||
#else
|
||||
using System.Xml;
|
||||
#endif
|
||||
@@ -147,7 +146,7 @@ namespace ICD.Common.Utils.Xml
|
||||
|
||||
#region Private Methods
|
||||
|
||||
#if STANDARD
|
||||
#if !SIMPLSHARP
|
||||
private static XmlWriterSettings GetSettings(Encoding encoding)
|
||||
{
|
||||
XmlWriterSettings output = GetSettings();
|
||||
|
||||
Reference in New Issue
Block a user