/* ======================================================================== * 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.Threading; using System.Threading.Tasks; namespace Opc.Ua.Client { /// /// Service method delegations for . /// All async methods are gated with a reader lock so that service /// calls block during reconnection. Obsolete sync and APM methods /// delegate directly to the inner session without gating. /// public partial class ManagedSession { /// public async ValueTask ReadAsync( RequestHeader? requestHeader, double maxAge, TimestampsToReturn timestampsToReturn, ArrayOf nodesToRead, CancellationToken ct) { using (await m_serviceLock.ReaderLockAsync(ct).ConfigureAwait(false)) { return await InnerSession.ReadAsync( requestHeader, maxAge, timestampsToReturn, nodesToRead, ct).ConfigureAwait(false); } } /// public async ValueTask HistoryReadAsync( RequestHeader? requestHeader, ExtensionObject historyReadDetails, TimestampsToReturn timestampsToReturn, bool releaseContinuationPoints, ArrayOf nodesToRead, CancellationToken ct) { using (await m_serviceLock.ReaderLockAsync(ct).ConfigureAwait(false)) { return await InnerSession.HistoryReadAsync( requestHeader, historyReadDetails, timestampsToReturn, releaseContinuationPoints, nodesToRead, ct).ConfigureAwait(false); } } /// public async ValueTask WriteAsync( RequestHeader? requestHeader, ArrayOf nodesToWrite, CancellationToken ct) { using (await m_serviceLock.ReaderLockAsync(ct).ConfigureAwait(false)) { return await InnerSession.WriteAsync( requestHeader, nodesToWrite, ct).ConfigureAwait(false); } } /// public async ValueTask HistoryUpdateAsync( RequestHeader? requestHeader, ArrayOf historyUpdateDetails, CancellationToken ct) { using (await m_serviceLock.ReaderLockAsync(ct).ConfigureAwait(false)) { return await InnerSession.HistoryUpdateAsync( requestHeader, historyUpdateDetails, ct).ConfigureAwait(false); } } /// public async ValueTask BrowseAsync( RequestHeader? requestHeader, ViewDescription? view, uint requestedMaxReferencesPerNode, ArrayOf nodesToBrowse, CancellationToken ct) { using (await m_serviceLock.ReaderLockAsync(ct).ConfigureAwait(false)) { return await InnerSession.BrowseAsync( requestHeader, view, requestedMaxReferencesPerNode, nodesToBrowse, ct).ConfigureAwait(false); } } /// public async ValueTask BrowseNextAsync( RequestHeader? requestHeader, bool releaseContinuationPoints, ArrayOf continuationPoints, CancellationToken ct) { using (await m_serviceLock.ReaderLockAsync(ct).ConfigureAwait(false)) { return await InnerSession.BrowseNextAsync( requestHeader, releaseContinuationPoints, continuationPoints, ct).ConfigureAwait(false); } } /// public async ValueTask TranslateBrowsePathsToNodeIdsAsync( RequestHeader? requestHeader, ArrayOf browsePaths, CancellationToken ct) { using (await m_serviceLock.ReaderLockAsync(ct).ConfigureAwait(false)) { return await InnerSession.TranslateBrowsePathsToNodeIdsAsync( requestHeader, browsePaths, ct).ConfigureAwait(false); } } /// public async ValueTask RegisterNodesAsync( RequestHeader? requestHeader, ArrayOf nodesToRegister, CancellationToken ct) { using (await m_serviceLock.ReaderLockAsync(ct).ConfigureAwait(false)) { return await InnerSession.RegisterNodesAsync( requestHeader, nodesToRegister, ct).ConfigureAwait(false); } } /// public async ValueTask UnregisterNodesAsync( RequestHeader? requestHeader, ArrayOf nodesToUnregister, CancellationToken ct) { using (await m_serviceLock.ReaderLockAsync(ct).ConfigureAwait(false)) { return await InnerSession.UnregisterNodesAsync( requestHeader, nodesToUnregister, ct).ConfigureAwait(false); } } /// public async ValueTask CallAsync( RequestHeader? requestHeader, ArrayOf methodsToCall, CancellationToken ct) { using (await m_serviceLock.ReaderLockAsync(ct).ConfigureAwait(false)) { return await InnerSession.CallAsync( requestHeader, methodsToCall, ct).ConfigureAwait(false); } } /// public async ValueTask CreateMonitoredItemsAsync( RequestHeader? requestHeader, uint subscriptionId, TimestampsToReturn timestampsToReturn, ArrayOf itemsToCreate, CancellationToken ct) { using (await m_serviceLock.ReaderLockAsync(ct).ConfigureAwait(false)) { return await InnerSession.CreateMonitoredItemsAsync( requestHeader, subscriptionId, timestampsToReturn, itemsToCreate, ct).ConfigureAwait(false); } } /// public async ValueTask ModifyMonitoredItemsAsync( RequestHeader? requestHeader, uint subscriptionId, TimestampsToReturn timestampsToReturn, ArrayOf itemsToModify, CancellationToken ct) { using (await m_serviceLock.ReaderLockAsync(ct).ConfigureAwait(false)) { return await InnerSession.ModifyMonitoredItemsAsync( requestHeader, subscriptionId, timestampsToReturn, itemsToModify, ct).ConfigureAwait(false); } } /// public async ValueTask SetMonitoringModeAsync( RequestHeader? requestHeader, uint subscriptionId, MonitoringMode monitoringMode, ArrayOf monitoredItemIds, CancellationToken ct) { using (await m_serviceLock.ReaderLockAsync(ct).ConfigureAwait(false)) { return await InnerSession.SetMonitoringModeAsync( requestHeader, subscriptionId, monitoringMode, monitoredItemIds, ct).ConfigureAwait(false); } } /// public async ValueTask SetTriggeringAsync( RequestHeader? requestHeader, uint subscriptionId, uint triggeringItemId, ArrayOf linksToAdd, ArrayOf linksToRemove, CancellationToken ct) { using (await m_serviceLock.ReaderLockAsync(ct).ConfigureAwait(false)) { return await InnerSession.SetTriggeringAsync( requestHeader, subscriptionId, triggeringItemId, linksToAdd, linksToRemove, ct).ConfigureAwait(false); } } /// public async ValueTask DeleteMonitoredItemsAsync( RequestHeader? requestHeader, uint subscriptionId, ArrayOf monitoredItemIds, CancellationToken ct) { using (await m_serviceLock.ReaderLockAsync(ct).ConfigureAwait(false)) { return await InnerSession.DeleteMonitoredItemsAsync( requestHeader, subscriptionId, monitoredItemIds, ct).ConfigureAwait(false); } } /// public async ValueTask CreateSubscriptionAsync( RequestHeader? requestHeader, double requestedPublishingInterval, uint requestedLifetimeCount, uint requestedMaxKeepAliveCount, uint maxNotificationsPerPublish, bool publishingEnabled, byte priority, CancellationToken ct) { using (await m_serviceLock.ReaderLockAsync(ct).ConfigureAwait(false)) { return await InnerSession.CreateSubscriptionAsync( requestHeader, requestedPublishingInterval, requestedLifetimeCount, requestedMaxKeepAliveCount, maxNotificationsPerPublish, publishingEnabled, priority, ct).ConfigureAwait(false); } } /// public async ValueTask ModifySubscriptionAsync( RequestHeader? requestHeader, uint subscriptionId, double requestedPublishingInterval, uint requestedLifetimeCount, uint requestedMaxKeepAliveCount, uint maxNotificationsPerPublish, byte priority, CancellationToken ct) { using (await m_serviceLock.ReaderLockAsync(ct).ConfigureAwait(false)) { return await InnerSession.ModifySubscriptionAsync( requestHeader, subscriptionId, requestedPublishingInterval, requestedLifetimeCount, requestedMaxKeepAliveCount, maxNotificationsPerPublish, priority, ct).ConfigureAwait(false); } } /// public async ValueTask SetPublishingModeAsync( RequestHeader? requestHeader, bool publishingEnabled, ArrayOf subscriptionIds, CancellationToken ct) { using (await m_serviceLock.ReaderLockAsync(ct).ConfigureAwait(false)) { return await InnerSession.SetPublishingModeAsync( requestHeader, publishingEnabled, subscriptionIds, ct).ConfigureAwait(false); } } /// public async ValueTask PublishAsync( RequestHeader? requestHeader, ArrayOf subscriptionAcknowledgements, CancellationToken ct) { using (await m_serviceLock.ReaderLockAsync(ct).ConfigureAwait(false)) { return await InnerSession.PublishAsync( requestHeader, subscriptionAcknowledgements, ct).ConfigureAwait(false); } } /// public async ValueTask RepublishAsync( RequestHeader? requestHeader, uint subscriptionId, uint retransmitSequenceNumber, CancellationToken ct) { using (await m_serviceLock.ReaderLockAsync(ct).ConfigureAwait(false)) { return await InnerSession.RepublishAsync( requestHeader, subscriptionId, retransmitSequenceNumber, ct).ConfigureAwait(false); } } /// public async ValueTask TransferSubscriptionsAsync( RequestHeader? requestHeader, ArrayOf subscriptionIds, bool sendInitialValues, CancellationToken ct) { using (await m_serviceLock.ReaderLockAsync(ct).ConfigureAwait(false)) { return await InnerSession.TransferSubscriptionsAsync( requestHeader, subscriptionIds, sendInitialValues, ct).ConfigureAwait(false); } } /// public async ValueTask DeleteSubscriptionsAsync( RequestHeader? requestHeader, ArrayOf subscriptionIds, CancellationToken ct) { using (await m_serviceLock.ReaderLockAsync(ct).ConfigureAwait(false)) { return await InnerSession.DeleteSubscriptionsAsync( requestHeader, subscriptionIds, ct).ConfigureAwait(false); } } /// public async ValueTask AddNodesAsync( RequestHeader? requestHeader, ArrayOf nodesToAdd, CancellationToken ct) { using (await m_serviceLock.ReaderLockAsync(ct).ConfigureAwait(false)) { return await InnerSession.AddNodesAsync( requestHeader, nodesToAdd, ct).ConfigureAwait(false); } } /// public async ValueTask AddReferencesAsync( RequestHeader? requestHeader, ArrayOf referencesToAdd, CancellationToken ct) { using (await m_serviceLock.ReaderLockAsync(ct).ConfigureAwait(false)) { return await InnerSession.AddReferencesAsync( requestHeader, referencesToAdd, ct).ConfigureAwait(false); } } /// public async ValueTask DeleteNodesAsync( RequestHeader? requestHeader, ArrayOf nodesToDelete, CancellationToken ct) { using (await m_serviceLock.ReaderLockAsync(ct).ConfigureAwait(false)) { return await InnerSession.DeleteNodesAsync( requestHeader, nodesToDelete, ct).ConfigureAwait(false); } } /// public async ValueTask DeleteReferencesAsync( RequestHeader? requestHeader, ArrayOf referencesToDelete, CancellationToken ct) { using (await m_serviceLock.ReaderLockAsync(ct).ConfigureAwait(false)) { return await InnerSession.DeleteReferencesAsync( requestHeader, referencesToDelete, ct).ConfigureAwait(false); } } /// public async ValueTask QueryFirstAsync( RequestHeader? requestHeader, ViewDescription? view, ArrayOf nodeTypes, ContentFilter? filter, uint maxDataSetsToReturn, uint maxReferencesToReturn, CancellationToken ct) { using (await m_serviceLock.ReaderLockAsync(ct).ConfigureAwait(false)) { return await InnerSession.QueryFirstAsync( requestHeader, view, nodeTypes, filter, maxDataSetsToReturn, maxReferencesToReturn, ct).ConfigureAwait(false); } } /// public async ValueTask QueryNextAsync( RequestHeader? requestHeader, bool releaseContinuationPoint, ByteString continuationPoint, CancellationToken ct) { using (await m_serviceLock.ReaderLockAsync(ct).ConfigureAwait(false)) { return await InnerSession.QueryNextAsync( requestHeader, releaseContinuationPoint, continuationPoint, ct).ConfigureAwait(false); } } /// public async ValueTask CreateSessionAsync( RequestHeader? requestHeader, ApplicationDescription? clientDescription, string? serverUri, string? endpointUrl, string? sessionName, ByteString clientNonce, ByteString clientCertificate, double requestedSessionTimeout, uint maxResponseMessageSize, CancellationToken ct) { using (await m_serviceLock.ReaderLockAsync(ct).ConfigureAwait(false)) { return await InnerSession.CreateSessionAsync( requestHeader, clientDescription, serverUri, endpointUrl, sessionName, clientNonce, clientCertificate, requestedSessionTimeout, maxResponseMessageSize, ct).ConfigureAwait(false); } } /// public async ValueTask ActivateSessionAsync( RequestHeader? requestHeader, SignatureData? clientSignature, ArrayOf clientSoftwareCertificates, ArrayOf localeIds, ExtensionObject userIdentityToken, SignatureData? userTokenSignature, CancellationToken ct) { using (await m_serviceLock.ReaderLockAsync(ct).ConfigureAwait(false)) { return await InnerSession.ActivateSessionAsync( requestHeader, clientSignature, clientSoftwareCertificates, localeIds, userIdentityToken, userTokenSignature, ct).ConfigureAwait(false); } } /// public async ValueTask CloseSessionAsync( RequestHeader? requestHeader, bool deleteSubscriptions, CancellationToken ct) { using (await m_serviceLock.ReaderLockAsync(ct).ConfigureAwait(false)) { return await InnerSession.CloseSessionAsync( requestHeader, deleteSubscriptions, ct).ConfigureAwait(false); } } /// public async ValueTask CancelAsync( RequestHeader? requestHeader, uint requestHandle, CancellationToken ct) { using (await m_serviceLock.ReaderLockAsync(ct).ConfigureAwait(false)) { return await InnerSession.CancelAsync( requestHeader, requestHandle, ct).ConfigureAwait(false); } } } }