/* ========================================================================
* Copyright (c) 2005-2025 The OPC Foundation, Inc. All rights reserved.
*
* OPC Foundation MIT License 1.00
*
* Permission is hereby granted, free of charge, to any person
* obtaining a copy of this software and associated documentation
* files (the "Software"), to deal in the Software without
* restriction, including without limitation the rights to use,
* copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following
* conditions:
*
* The above copyright notice and this permission notice shall be
* included in all copies or substantial portions of the Software.
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
* OTHER DEALINGS IN THE SOFTWARE.
*
* The complete license agreement can be found here:
* http://opcfoundation.org/License/MIT/1.00/
* ======================================================================*/
using System;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
namespace Opc.Ua.Client.ModelChange
{
///
/// Describes a single address-space model change reported by the server.
///
/// The change verb.
/// NodeId of the node affected.
/// Optional type definition NodeId.
public record struct ModelChange(
ModelChangeVerb Verb,
NodeId AffectedNode,
NodeId? TypeDefinition);
///
/// The kind of address-space change reported.
///
[Flags]
public enum ModelChangeVerb : byte
{
///
/// No change.
///
None = 0,
///
/// A new node was added.
///
NodeAdded = 1,
///
/// An existing node was deleted.
///
NodeDeleted = 2,
///
/// A reference was added.
///
ReferenceAdded = 4,
///
/// A reference was deleted.
///
ReferenceDeleted = 8,
///
/// The DataType attribute changed.
///
DataTypeChanged = 16,
}
///
/// Event arguments raised when the server reports address-space model changes.
///
public sealed class ModelChangedEventArgs : EventArgs
{
///
/// The reported changes.
///
public IReadOnlyList Changes { get; }
///
/// True when the change indicates that the entire cache
/// should be invalidated.
///
public bool RequiresFullCacheInvalidation { get; }
///
/// Constructs new args.
///
public ModelChangedEventArgs(
IReadOnlyList changes,
bool requiresFullCacheInvalidation)
{
Changes = changes ?? Array.Empty();
RequiresFullCacheInvalidation = requiresFullCacheInvalidation;
}
}
///
/// Tracks server-reported address-space model changes via an
/// event subscription on the Server object's
/// GeneralModelChangeEventType notifier.
///
public interface IModelChangeTracker : IAsyncDisposable
{
///
/// Raised when model changes are observed.
///
event EventHandler? ModelChanged;
///
/// True once tracking has been started.
///
bool IsTracking { get; }
///
/// Starts tracking model changes.
///
ValueTask StartTrackingAsync(CancellationToken ct = default);
///
/// Stops tracking model changes.
///
ValueTask StopTrackingAsync(CancellationToken ct = default);
}
}