Add bulk MXAccess subscription commands
This commit is contained in:
@@ -189,6 +189,202 @@ public sealed class MxAccessSession : IDisposable
|
||||
MxAccessAdviceKind.Supervisory);
|
||||
}
|
||||
|
||||
public IReadOnlyList<SubscribeResult> AddItemBulk(
|
||||
int serverHandle,
|
||||
IEnumerable<string> tagAddresses)
|
||||
{
|
||||
ThrowIfDisposed();
|
||||
if (tagAddresses is null)
|
||||
{
|
||||
throw new ArgumentNullException(nameof(tagAddresses));
|
||||
}
|
||||
|
||||
List<SubscribeResult> results = new();
|
||||
foreach (string? tagAddress in tagAddresses)
|
||||
{
|
||||
if (string.IsNullOrWhiteSpace(tagAddress))
|
||||
{
|
||||
results.Add(Failed(serverHandle, tagAddress ?? string.Empty, itemHandle: 0, "Tag address is required."));
|
||||
continue;
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
int itemHandle = AddItem(serverHandle, tagAddress);
|
||||
results.Add(Succeeded(serverHandle, tagAddress, itemHandle));
|
||||
}
|
||||
catch (Exception exception)
|
||||
{
|
||||
results.Add(Failed(serverHandle, tagAddress, itemHandle: 0, exception.Message));
|
||||
}
|
||||
}
|
||||
|
||||
return results;
|
||||
}
|
||||
|
||||
public IReadOnlyList<SubscribeResult> AdviseItemBulk(
|
||||
int serverHandle,
|
||||
IEnumerable<int> itemHandles)
|
||||
{
|
||||
ThrowIfDisposed();
|
||||
if (itemHandles is null)
|
||||
{
|
||||
throw new ArgumentNullException(nameof(itemHandles));
|
||||
}
|
||||
|
||||
List<SubscribeResult> results = new();
|
||||
foreach (int itemHandle in itemHandles)
|
||||
{
|
||||
try
|
||||
{
|
||||
Advise(serverHandle, itemHandle);
|
||||
results.Add(Succeeded(serverHandle, string.Empty, itemHandle));
|
||||
}
|
||||
catch (Exception exception)
|
||||
{
|
||||
results.Add(Failed(serverHandle, string.Empty, itemHandle, exception.Message));
|
||||
}
|
||||
}
|
||||
|
||||
return results;
|
||||
}
|
||||
|
||||
public IReadOnlyList<SubscribeResult> RemoveItemBulk(
|
||||
int serverHandle,
|
||||
IEnumerable<int> itemHandles)
|
||||
{
|
||||
ThrowIfDisposed();
|
||||
if (itemHandles is null)
|
||||
{
|
||||
throw new ArgumentNullException(nameof(itemHandles));
|
||||
}
|
||||
|
||||
List<SubscribeResult> results = new();
|
||||
foreach (int itemHandle in itemHandles)
|
||||
{
|
||||
try
|
||||
{
|
||||
RemoveItem(serverHandle, itemHandle);
|
||||
results.Add(Succeeded(serverHandle, string.Empty, itemHandle));
|
||||
}
|
||||
catch (Exception exception)
|
||||
{
|
||||
results.Add(Failed(serverHandle, string.Empty, itemHandle, exception.Message));
|
||||
}
|
||||
}
|
||||
|
||||
return results;
|
||||
}
|
||||
|
||||
public IReadOnlyList<SubscribeResult> UnAdviseItemBulk(
|
||||
int serverHandle,
|
||||
IEnumerable<int> itemHandles)
|
||||
{
|
||||
ThrowIfDisposed();
|
||||
if (itemHandles is null)
|
||||
{
|
||||
throw new ArgumentNullException(nameof(itemHandles));
|
||||
}
|
||||
|
||||
List<SubscribeResult> results = new();
|
||||
foreach (int itemHandle in itemHandles)
|
||||
{
|
||||
try
|
||||
{
|
||||
UnAdvise(serverHandle, itemHandle);
|
||||
results.Add(Succeeded(serverHandle, string.Empty, itemHandle));
|
||||
}
|
||||
catch (Exception exception)
|
||||
{
|
||||
results.Add(Failed(serverHandle, string.Empty, itemHandle, exception.Message));
|
||||
}
|
||||
}
|
||||
|
||||
return results;
|
||||
}
|
||||
|
||||
public IReadOnlyList<SubscribeResult> SubscribeBulk(
|
||||
int serverHandle,
|
||||
IEnumerable<string> tagAddresses)
|
||||
{
|
||||
ThrowIfDisposed();
|
||||
if (tagAddresses is null)
|
||||
{
|
||||
throw new ArgumentNullException(nameof(tagAddresses));
|
||||
}
|
||||
|
||||
List<SubscribeResult> results = new();
|
||||
foreach (string? tagAddress in tagAddresses)
|
||||
{
|
||||
if (string.IsNullOrWhiteSpace(tagAddress))
|
||||
{
|
||||
results.Add(Failed(serverHandle, tagAddress ?? string.Empty, itemHandle: 0, "Tag address is required."));
|
||||
continue;
|
||||
}
|
||||
|
||||
int itemHandle = 0;
|
||||
try
|
||||
{
|
||||
itemHandle = AddItem(serverHandle, tagAddress);
|
||||
Advise(serverHandle, itemHandle);
|
||||
results.Add(Succeeded(serverHandle, tagAddress, itemHandle));
|
||||
}
|
||||
catch (Exception exception)
|
||||
{
|
||||
string errorMessage = exception.Message;
|
||||
if (itemHandle != 0)
|
||||
{
|
||||
errorMessage = AppendRemoveItemCleanup(serverHandle, itemHandle, errorMessage);
|
||||
}
|
||||
|
||||
results.Add(Failed(serverHandle, tagAddress, itemHandle, errorMessage));
|
||||
}
|
||||
}
|
||||
|
||||
return results;
|
||||
}
|
||||
|
||||
public IReadOnlyList<SubscribeResult> UnsubscribeBulk(
|
||||
int serverHandle,
|
||||
IEnumerable<int> itemHandles)
|
||||
{
|
||||
ThrowIfDisposed();
|
||||
if (itemHandles is null)
|
||||
{
|
||||
throw new ArgumentNullException(nameof(itemHandles));
|
||||
}
|
||||
|
||||
List<SubscribeResult> results = new();
|
||||
foreach (int itemHandle in itemHandles)
|
||||
{
|
||||
List<string> errors = new();
|
||||
|
||||
try
|
||||
{
|
||||
UnAdvise(serverHandle, itemHandle);
|
||||
}
|
||||
catch (Exception exception)
|
||||
{
|
||||
errors.Add($"UnAdvise failed: {exception.Message}");
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
RemoveItem(serverHandle, itemHandle);
|
||||
}
|
||||
catch (Exception exception)
|
||||
{
|
||||
errors.Add($"RemoveItem failed: {exception.Message}");
|
||||
}
|
||||
|
||||
results.Add(errors.Count == 0
|
||||
? Succeeded(serverHandle, string.Empty, itemHandle)
|
||||
: Failed(serverHandle, string.Empty, itemHandle, string.Join("; ", errors)));
|
||||
}
|
||||
|
||||
return results;
|
||||
}
|
||||
|
||||
public MxAccessShutdownResult ShutdownGracefully()
|
||||
{
|
||||
if (disposed)
|
||||
@@ -290,6 +486,53 @@ public sealed class MxAccessSession : IDisposable
|
||||
return ((long)serverHandle << 32) | (uint)itemHandle;
|
||||
}
|
||||
|
||||
private string AppendRemoveItemCleanup(
|
||||
int serverHandle,
|
||||
int itemHandle,
|
||||
string errorMessage)
|
||||
{
|
||||
try
|
||||
{
|
||||
RemoveItem(serverHandle, itemHandle);
|
||||
return $"{errorMessage}; cleanup RemoveItem succeeded.";
|
||||
}
|
||||
catch (Exception cleanupException)
|
||||
{
|
||||
return $"{errorMessage}; cleanup RemoveItem failed: {cleanupException.Message}";
|
||||
}
|
||||
}
|
||||
|
||||
private static SubscribeResult Succeeded(
|
||||
int serverHandle,
|
||||
string tagAddress,
|
||||
int itemHandle)
|
||||
{
|
||||
return new SubscribeResult
|
||||
{
|
||||
ServerHandle = serverHandle,
|
||||
TagAddress = tagAddress,
|
||||
ItemHandle = itemHandle,
|
||||
WasSuccessful = true,
|
||||
ErrorMessage = string.Empty,
|
||||
};
|
||||
}
|
||||
|
||||
private static SubscribeResult Failed(
|
||||
int serverHandle,
|
||||
string tagAddress,
|
||||
int itemHandle,
|
||||
string errorMessage)
|
||||
{
|
||||
return new SubscribeResult
|
||||
{
|
||||
ServerHandle = serverHandle,
|
||||
TagAddress = tagAddress,
|
||||
ItemHandle = itemHandle,
|
||||
WasSuccessful = false,
|
||||
ErrorMessage = errorMessage,
|
||||
};
|
||||
}
|
||||
|
||||
private void DisposeCore(ICollection<MxAccessShutdownFailure>? failures)
|
||||
{
|
||||
try
|
||||
|
||||
Reference in New Issue
Block a user