/// <summary> /// Called when a session is closed. /// </summary> public override void SessionClosing(OperationContext context, NodeId sessionId, bool deleteSubscriptions) { lock (Lock) { List <NodeId> locks = null; if (!m_sessionLocks.TryGetValue(sessionId, out locks)) { return; } m_sessionLocks.Remove(sessionId); for (int ii = 0; ii < locks.Count; ii++) { DsatsDemo.LockConditionState node = (DsatsDemo.LockConditionState)FindPredefinedNode(locks[ii], typeof(DsatsDemo.LockConditionState)); if (node != null) { node.SessionId.Value = null; node.ClientUserId.Value = null; node.SubjectName.Value = null; node.Unlock(SystemContext); node.ReportEvent(SystemContext, node); } } } }
private ServiceResult OnReleaseLock( ISystemContext context, MethodState method, NodeId objectId, IList <object> inputArguments, IList <object> outputArguments) { DsatsDemo.LockConditionState node = (DsatsDemo.LockConditionState)FindPredefinedNode(objectId, typeof(DsatsDemo.LockConditionState)); if (!node.EnabledState.Id.Value) { return(StatusCodes.BadConditionDisabled); } if (node.LockState.CurrentState.Id.Value == new NodeId(DsatsDemo.Objects.LockStateMachineType_Unlocked, NamespaceIndex)) { return(StatusCodes.BadConditionNotShelved); } // non-admins can only release their own locks. if (!CheckAdminAccess(context)) { if (!SessionHasLock(context, objectId)) { return(StatusCodes.BadUserAccessDenied); } } // revoke the lock. RevokeLockForSession(context, node.SessionId.Value, objectId); node.SessionId.Value = null; node.ClientUserId.Value = null; node.SubjectName.Value = null; node.Unlock(context); node.ReportEvent(context, node); node.ClearChangeMasks(context, true); return(ServiceResult.Good); }